|
@@ -394,6 +394,49 @@ static __init int setup_noclflush(char *arg)
|
|
|
}
|
|
|
__setup("noclflush", setup_noclflush);
|
|
|
|
|
|
+struct msr_range {
|
|
|
+ unsigned min;
|
|
|
+ unsigned max;
|
|
|
+};
|
|
|
+
|
|
|
+static struct msr_range msr_range_array[] __cpuinitdata = {
|
|
|
+ { 0x00000000, 0x00000418},
|
|
|
+ { 0xc0000000, 0xc000040b},
|
|
|
+ { 0xc0010000, 0xc0010142},
|
|
|
+ { 0xc0011000, 0xc001103b},
|
|
|
+};
|
|
|
+
|
|
|
+static void __cpuinit print_cpu_msr(void)
|
|
|
+{
|
|
|
+ unsigned index;
|
|
|
+ u64 val;
|
|
|
+ int i;
|
|
|
+ unsigned index_min, index_max;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(msr_range_array); i++) {
|
|
|
+ index_min = msr_range_array[i].min;
|
|
|
+ index_max = msr_range_array[i].max;
|
|
|
+ for (index = index_min; index < index_max; index++) {
|
|
|
+ if (rdmsrl_amd_safe(index, &val))
|
|
|
+ continue;
|
|
|
+ printk(KERN_INFO " MSR%08x: %016llx\n", index, val);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static int show_msr __cpuinitdata;
|
|
|
+static __init int setup_show_msr(char *arg)
|
|
|
+{
|
|
|
+ int num;
|
|
|
+
|
|
|
+ get_option(&arg, &num);
|
|
|
+
|
|
|
+ if (num > 0)
|
|
|
+ show_msr = num;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+__setup("show_msr=", setup_show_msr);
|
|
|
+
|
|
|
void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
|
|
|
{
|
|
|
if (c->x86_model_id[0])
|
|
@@ -403,6 +446,14 @@ void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
|
|
|
printk(KERN_CONT " stepping %02x\n", c->x86_mask);
|
|
|
else
|
|
|
printk(KERN_CONT "\n");
|
|
|
+
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ if (c->cpu_index < show_msr)
|
|
|
+ print_cpu_msr();
|
|
|
+#else
|
|
|
+ if (show_msr)
|
|
|
+ print_cpu_msr();
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static __init int setup_disablecpuid(char *arg)
|