Invariant TSC check and SMP timeouts tweaked.
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 25 Apr 2009 06:22:41 +0000 (23:22 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 25 Apr 2009 06:22:41 +0000 (23:22 -0700)
Had a case in KVM where core1 was lagging long enough to not even get to
increment the semaphore before everyone was done and the udelay was
done.  Adjusted up the timings more in accordance with some things
mentioned in the SDM.  We'll see if it works.

The invariant TSC is fairly new.  Supposedly it means it will always be
as good as wall-clock time.  That's probably true.

kern/init.c
kern/smp.c

index f1498f4..e3d980e 100644 (file)
@@ -211,6 +211,11 @@ static void print_cpuinfo(void) {
                cprintf("I am the Boot Strap Processor\n");
        else
                cprintf("I am an Application Processor\n");
                cprintf("I am the Boot Strap Processor\n");
        else
                cprintf("I am an Application Processor\n");
+       cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
+       if (edx & 0x00000100)
+               printk("Invariant TSC present\n");
+       else
+               printk("Invariant TSC not present\n");
 }
 
 #endif //Everything For Free
 }
 
 #endif //Everything For Free
index c038c6a..15c0093 100644 (file)
@@ -51,13 +51,13 @@ static void init_smp_call_function(void)
        INIT_HANDLER_WRAPPER(4);
 }
 
        INIT_HANDLER_WRAPPER(4);
 }
 
+/******************************************************************************/
+
 static void smp_mtrr_handler(trapframe_t *tf)
 {
        setup_default_mtrrs(&generic_barrier);
 }
 
 static void smp_mtrr_handler(trapframe_t *tf)
 {
        setup_default_mtrrs(&generic_barrier);
 }
 
-/******************************************************************************/
-
 void smp_boot(void)
 {
        #define boot_vector 0xeb
 void smp_boot(void)
 {
        #define boot_vector 0xeb
@@ -82,20 +82,16 @@ void smp_boot(void)
 
        // Start the IPI process (INIT, wait, SIPI, wait, SIPI, wait)
        send_init_ipi();
 
        // Start the IPI process (INIT, wait, SIPI, wait, SIPI, wait)
        send_init_ipi();
-       enable_irq(); // LAPIC timer will fire, extINTs are blocked at LINT0 now
-       udelay(50);
+       // SDM 3A is a little wonky wrt the proper delays.  These are my best guess.
+       udelay(10000);
        // first SIPI
        send_startup_ipi(0x01);
        // first SIPI
        send_startup_ipi(0x01);
-       udelay(200);
-       /* //BOCHS does not like this second SIPI.
+       /* BOCHS does not like this second SIPI.
        // second SIPI
        // second SIPI
-       waiting = 1;
+       udelay(200);
        send_startup_ipi(0x01);
        send_startup_ipi(0x01);
-       lapic_set_timer(0x000fffff, boot_vector, 0); // TODO - fix timing
-       while(waiting) // wait for the second SIPI to take effect
-               cpu_relax();
        */
        */
-       disable_irq();
+       udelay(100000);
 
        // Each core will also increment smp_semaphore, and decrement when it is done,
        // all in smp_entry.  It's purpose is to keep Core0 from competing for the
 
        // Each core will also increment smp_semaphore, and decrement when it is done,
        // all in smp_entry.  It's purpose is to keep Core0 from competing for the