x86: catches buggy rdtscp
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Jul 2013 00:20:30 +0000 (17:20 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Jul 2013 18:31:13 +0000 (11:31 -0700)
Not sure if this is a "bug in qemu" or something I'm doing wrong.  But rdtscp
should drop the value of MSR_TSC_AUX in ecx.  If this fails, it busts our
FAST_COREID.  If this happens to you in a VM, just change your CONFIG.

If it happens on hardware, let me know.

kern/arch/x86/smp_boot.c

index 103f601..54935c5 100644 (file)
@@ -66,6 +66,18 @@ void smp_final_core_init(void)
        /* Need to bootstrap the rdtscp MSR with our OS coreid */
        int coreid = get_os_coreid(hw_core_id());
        write_msr(MSR_TSC_AUX, coreid);
+
+       /* Busted versions of qemu bug out here (32 bit) */
+       int rdtscp_ecx;
+       asm volatile ("rdtscp" : "=c"(rdtscp_ecx) : : "eax", "edx");
+       if (read_msr(MSR_TSC_AUX) != rdtscp_ecx) {
+               printk("Broken rdtscp detected!  Rebuild without CONFIG_FAST_COREID\n");
+               if (coreid)
+                       while(1);
+               /* note this panic may think it is not core 0, and core 0 might not have
+                * an issue (seems random) */
+               panic("");
+       }
 #endif
        setup_default_mtrrs(&generic_barrier);
        smp_percpu_init();