@@ -2496,12 +2496,12 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
2496
2496
canUsePerf = false ;
2497
2497
if (!silent) std::cerr << " Can not use Linux perf because your Linux kernel does not support PERF_COUNT_HW_REF_CPU_CYCLES event. Falling-back to direct PMU programming.\n " ;
2498
2498
}
2499
- else if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg && pExtDesc->fixedCfg ->value != 0x333 )
2499
+ else if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg && ( pExtDesc->fixedCfg ->value & 0x444 ) )
2500
2500
{
2501
2501
canUsePerf = false ;
2502
2502
if (!silent)
2503
2503
{
2504
- std::cerr << " Can not use Linux perf because non-standard fixed counter configuration requested (0x" << std::hex << pExtDesc->fixedCfg ->value
2504
+ std::cerr << " Can not use Linux perf because \" any_thread \" fixed counter configuration requested (0x" << std::hex << pExtDesc->fixedCfg ->value
2505
2505
<< std::dec << " ) =\n " << *(pExtDesc->fixedCfg ) << " \n Falling-back to direct PMU programming.\n\n " ;
2506
2506
}
2507
2507
}
@@ -2978,6 +2978,31 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
2978
2978
2979
2979
result.clear ();
2980
2980
FixedEventControlRegister ctrl_reg;
2981
+ auto initFixedCtrl = [&](const bool & enableCtr3)
2982
+ {
2983
+ if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg )
2984
+ {
2985
+ ctrl_reg = *(pExtDesc->fixedCfg );
2986
+ }
2987
+ else
2988
+ {
2989
+ ctrl_reg.value = 0 ;
2990
+ ctrl_reg.fields .os0 = 1 ;
2991
+ ctrl_reg.fields .usr0 = 1 ;
2992
+
2993
+ ctrl_reg.fields .os1 = 1 ;
2994
+ ctrl_reg.fields .usr1 = 1 ;
2995
+
2996
+ ctrl_reg.fields .os2 = 1 ;
2997
+ ctrl_reg.fields .usr2 = 1 ;
2998
+
2999
+ if (enableCtr3 && isFixedCounterSupported (3 ))
3000
+ {
3001
+ ctrl_reg.fields .os3 = 1 ;
3002
+ ctrl_reg.fields .usr3 = 1 ;
3003
+ }
3004
+ }
3005
+ };
2981
3006
#ifdef PCM_USE_PERF
2982
3007
int leader_counter = -1 ;
2983
3008
auto programPerfEvent = [this , &leader_counter, &i](perf_event_attr & e, const int eventPos, const std::string & eventName) -> bool
@@ -3004,20 +3029,30 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
3004
3029
};
3005
3030
if (canUsePerf)
3006
3031
{
3032
+ initFixedCtrl (false );
3007
3033
perf_event_attr e = PCM_init_perf_event_attr ();
3008
3034
e.type = PERF_TYPE_HARDWARE;
3009
3035
e.config = PERF_COUNT_HW_INSTRUCTIONS;
3036
+ e.exclude_kernel = 1 - ctrl_reg.fields .os0 ;
3037
+ e.exclude_hv = e.exclude_kernel ;
3038
+ e.exclude_user = 1 - ctrl_reg.fields .usr0 ;
3010
3039
if (programPerfEvent (e, PERF_INST_RETIRED_POS, " INST_RETIRED" ) == false )
3011
3040
{
3012
3041
return PCM::UnknownError;
3013
3042
}
3014
3043
leader_counter = perfEventHandle[i][PERF_INST_RETIRED_POS];
3015
3044
e.config = PERF_COUNT_HW_CPU_CYCLES;
3045
+ e.exclude_kernel = 1 - ctrl_reg.fields .os1 ;
3046
+ e.exclude_hv = e.exclude_kernel ;
3047
+ e.exclude_user = 1 - ctrl_reg.fields .usr1 ;
3016
3048
if (programPerfEvent (e, PERF_CPU_CLK_UNHALTED_THREAD_POS, " CPU_CLK_UNHALTED_THREAD" ) == false )
3017
3049
{
3018
3050
return PCM::UnknownError;
3019
3051
}
3020
3052
e.config = PCM_PERF_COUNT_HW_REF_CPU_CYCLES;
3053
+ e.exclude_kernel = 1 - ctrl_reg.fields .os2 ;
3054
+ e.exclude_hv = e.exclude_kernel ;
3055
+ e.exclude_user = 1 - ctrl_reg.fields .usr2 ;
3021
3056
if (programPerfEvent (e, PERF_CPU_CLK_UNHALTED_REF_POS, " CPU_CLK_UNHALTED_REF" ) == false )
3022
3057
{
3023
3058
return PCM::UnknownError;
@@ -3030,30 +3065,7 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
3030
3065
MSR[i]->write (IA32_CR_PERF_GLOBAL_CTRL, 0 );
3031
3066
MSR[i]->read (IA32_CR_FIXED_CTR_CTRL, &ctrl_reg.value );
3032
3067
3033
-
3034
- if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg )
3035
- {
3036
- ctrl_reg = *(pExtDesc->fixedCfg );
3037
- }
3038
- else
3039
- {
3040
- ctrl_reg.value = 0 ;
3041
-
3042
- ctrl_reg.fields .os0 = 1 ;
3043
- ctrl_reg.fields .usr0 = 1 ;
3044
-
3045
- ctrl_reg.fields .os1 = 1 ;
3046
- ctrl_reg.fields .usr1 = 1 ;
3047
-
3048
- ctrl_reg.fields .os2 = 1 ;
3049
- ctrl_reg.fields .usr2 = 1 ;
3050
-
3051
- if (isFixedCounterSupported (3 ))
3052
- {
3053
- ctrl_reg.fields .os3 = 1 ;
3054
- ctrl_reg.fields .usr3 = 1 ;
3055
- }
3056
- }
3068
+ initFixedCtrl (true );
3057
3069
3058
3070
MSR[i]->write (INST_RETIRED_ADDR, 0 );
3059
3071
MSR[i]->write (CPU_CLK_UNHALTED_THREAD_ADDR, 0 );
0 commit comments