|
@@ -58,6 +58,7 @@ unsigned int extra_msr_offset32;
|
|
|
unsigned int extra_msr_offset64;
|
|
|
unsigned int extra_delta_offset32;
|
|
|
unsigned int extra_delta_offset64;
|
|
|
+int do_smi;
|
|
|
double bclk;
|
|
|
unsigned int show_pkg;
|
|
|
unsigned int show_core;
|
|
@@ -99,6 +100,7 @@ struct thread_data {
|
|
|
unsigned long long extra_delta64;
|
|
|
unsigned long long extra_msr32;
|
|
|
unsigned long long extra_delta32;
|
|
|
+ unsigned int smi_count;
|
|
|
unsigned int cpu_id;
|
|
|
unsigned int flags;
|
|
|
#define CPU_IS_FIRST_THREAD_IN_CORE 0x2
|
|
@@ -248,6 +250,8 @@ void print_header(void)
|
|
|
if (has_aperf)
|
|
|
outp += sprintf(outp, " GHz");
|
|
|
outp += sprintf(outp, " TSC");
|
|
|
+ if (do_smi)
|
|
|
+ outp += sprintf(outp, " SMI");
|
|
|
if (extra_delta_offset32)
|
|
|
outp += sprintf(outp, " count 0x%03X", extra_delta_offset32);
|
|
|
if (extra_delta_offset64)
|
|
@@ -314,6 +318,8 @@ int dump_counters(struct thread_data *t, struct core_data *c,
|
|
|
extra_msr_offset32, t->extra_msr32);
|
|
|
fprintf(stderr, "msr0x%x: %016llX\n",
|
|
|
extra_msr_offset64, t->extra_msr64);
|
|
|
+ if (do_smi)
|
|
|
+ fprintf(stderr, "SMI: %08X\n", t->smi_count);
|
|
|
}
|
|
|
|
|
|
if (c) {
|
|
@@ -352,6 +358,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
|
|
|
* RAM_W: %5.2
|
|
|
* GHz: "GHz" 3 columns %3.2
|
|
|
* TSC: "TSC" 3 columns %3.2
|
|
|
+ * SMI: "SMI" 4 columns %4d
|
|
|
* percentage " %pc3" %6.2
|
|
|
* Perf Status percentage: %5.2
|
|
|
* "CTMP" 4 columns %4d
|
|
@@ -431,6 +438,10 @@ int format_counters(struct thread_data *t, struct core_data *c,
|
|
|
/* TSC */
|
|
|
outp += sprintf(outp, "%5.2f", 1.0 * t->tsc/units/interval_float);
|
|
|
|
|
|
+ /* SMI */
|
|
|
+ if (do_smi)
|
|
|
+ outp += sprintf(outp, "%4d", t->smi_count);
|
|
|
+
|
|
|
/* delta */
|
|
|
if (extra_delta_offset32)
|
|
|
outp += sprintf(outp, " %11llu", t->extra_delta32);
|
|
@@ -645,6 +656,9 @@ delta_thread(struct thread_data *new, struct thread_data *old,
|
|
|
*/
|
|
|
old->extra_msr32 = new->extra_msr32;
|
|
|
old->extra_msr64 = new->extra_msr64;
|
|
|
+
|
|
|
+ if (do_smi)
|
|
|
+ old->smi_count = new->smi_count - old->smi_count;
|
|
|
}
|
|
|
|
|
|
int delta_cpu(struct thread_data *t, struct core_data *c,
|
|
@@ -672,6 +686,7 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data
|
|
|
t->mperf = 0;
|
|
|
t->c1 = 0;
|
|
|
|
|
|
+ t->smi_count = 0;
|
|
|
t->extra_delta32 = 0;
|
|
|
t->extra_delta64 = 0;
|
|
|
|
|
@@ -802,6 +817,11 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
|
|
|
return -4;
|
|
|
}
|
|
|
|
|
|
+ if (do_smi) {
|
|
|
+ if (get_msr(cpu, MSR_SMI_COUNT, &msr))
|
|
|
+ return -5;
|
|
|
+ t->smi_count = msr & 0xFFFFFFFF;
|
|
|
+ }
|
|
|
if (extra_delta_offset32) {
|
|
|
if (get_msr(cpu, extra_delta_offset32, &msr))
|
|
|
return -5;
|
|
@@ -1893,6 +1913,7 @@ void check_cpuid()
|
|
|
|
|
|
do_nehalem_platform_info = genuine_intel && has_invariant_tsc;
|
|
|
do_nhm_cstates = genuine_intel; /* all Intel w/ non-stop TSC have NHM counters */
|
|
|
+ do_smi = do_nhm_cstates;
|
|
|
do_snb_cstates = is_snb(family, model);
|
|
|
bclk = discover_bclk(family, model);
|
|
|
|
|
@@ -2229,9 +2250,6 @@ void cmdline(int argc, char **argv)
|
|
|
case 'c':
|
|
|
sscanf(optarg, "%x", &extra_delta_offset32);
|
|
|
break;
|
|
|
- case 's':
|
|
|
- extra_delta_offset32 = 0x34; /* SMI counter */
|
|
|
- break;
|
|
|
case 'C':
|
|
|
sscanf(optarg, "%x", &extra_delta_offset64);
|
|
|
break;
|
|
@@ -2258,7 +2276,7 @@ int main(int argc, char **argv)
|
|
|
cmdline(argc, argv);
|
|
|
|
|
|
if (verbose)
|
|
|
- fprintf(stderr, "turbostat v3.1 January 8, 2013"
|
|
|
+ fprintf(stderr, "turbostat v3.2 February 11, 2013"
|
|
|
" - Len Brown <lenb@kernel.org>\n");
|
|
|
|
|
|
turbostat_init();
|