File tree Expand file tree Collapse file tree 1 file changed +8
-0
lines changed Expand file tree Collapse file tree 1 file changed +8
-0
lines changed Original file line number Diff line number Diff line change @@ -90,6 +90,7 @@ struct perf_ibs {
90
90
unsigned long offset_mask [1 ];
91
91
int offset_max ;
92
92
unsigned int fetch_count_reset_broken : 1 ;
93
+ unsigned int fetch_ignore_if_zero_rip : 1 ;
93
94
struct cpu_perf_ibs __percpu * pcpu ;
94
95
95
96
struct attribute * * format_attrs ;
@@ -672,6 +673,10 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
672
673
if (check_rip && (ibs_data .regs [2 ] & IBS_RIP_INVALID )) {
673
674
regs .flags &= ~PERF_EFLAGS_EXACT ;
674
675
} else {
676
+ /* Workaround for erratum #1197 */
677
+ if (perf_ibs -> fetch_ignore_if_zero_rip && !(ibs_data .regs [1 ]))
678
+ goto out ;
679
+
675
680
set_linear_ip (& regs , ibs_data .regs [1 ]);
676
681
regs .flags |= PERF_EFLAGS_EXACT ;
677
682
}
@@ -769,6 +774,9 @@ static __init void perf_event_ibs_init(void)
769
774
if (boot_cpu_data .x86 >= 0x16 && boot_cpu_data .x86 <= 0x18 )
770
775
perf_ibs_fetch .fetch_count_reset_broken = 1 ;
771
776
777
+ if (boot_cpu_data .x86 == 0x19 && boot_cpu_data .x86_model < 0x10 )
778
+ perf_ibs_fetch .fetch_ignore_if_zero_rip = 1 ;
779
+
772
780
perf_ibs_pmu_init (& perf_ibs_fetch , "ibs_fetch" );
773
781
774
782
if (ibs_caps & IBS_CAPS_OPCNT ) {
You can’t perform that action at this time.
0 commit comments