updated smpboot to use udelay
authorDavid Zhu <yuzhu@cs.berkeley.edu>
Sat, 25 Apr 2009 02:12:51 +0000 (19:12 -0700)
committerDavid Zhu <yuzhu@cs.berkeley.edu>
Sat, 25 Apr 2009 02:47:32 +0000 (19:47 -0700)
also fixed printing of debug message in udelay, bochs specific stuff

GNUmakefile
kern/apic.c
kern/apic.h
kern/smp.c
kern/testing.c

index 25c32c0..66b2182 100644 (file)
@@ -117,9 +117,6 @@ include user/Makefrag
 
 IMAGES = $(OBJDIR)/kern/bochs.img
 
-bochs: $(IMAGES)
-       bochs 'display_library: nogui'
-
 # For deleting the build
 clean:
        rm -rf $(OBJDIR)
index d5f4d28..6873d9b 100644 (file)
@@ -85,7 +85,7 @@ uint32_t lapic_get_default_id(void)
 
 void timer_init(void){
        uint64_t tscval[2];
-       pit_set_timer(0xffff, TIMER_RATEGEN, 1);
+       pit_set_timer(0xffff, TIMER_RATEGEN);
        // assume tsc exist
        tscval[0] = read_tsc();
        udelay_pit(1000000);
@@ -94,16 +94,15 @@ void timer_init(void){
        cprintf("tsc_freq %lu\n", tsc_freq);
 }
 
-void pit_set_timer(uint32_t divisor, uint32_t mode, bool periodic)
+void pit_set_timer(uint32_t divisor, uint32_t mode)
 {
        if (divisor & 0xffff0000)
                warn("Divisor too large!");
-       // TODO: review periodic
        mode = TIMER_SEL0|TIMER_16BIT|mode;
-       outb(TIMER_MODE, mode | (periodic << 2));
+       outb(TIMER_MODE, mode); 
        outb(TIMER_CNTR0, divisor & 0xff);
        outb(TIMER_CNTR0, (divisor >> 8) );
-       cprintf("timer mode set to %d, divisor %d\n",mode|(periodic << 2), divisor);
+       // cprintf("timer mode set to %d, divisor %d\n",mode, divisor);
 }
 
 static int getpit()
@@ -123,6 +122,7 @@ static int getpit()
 // forces cpu to relax for usec miliseconds
 void udelay(uint64_t usec)
 {
+       #if !defined(__BOCHS__)
        if (tsc_freq != 0)
        {
                uint64_t start, end, now;
@@ -139,6 +139,7 @@ void udelay(uint64_t usec)
         return;
 
        } else
+       #endif
        {
                udelay_pit(usec);
        }
@@ -168,7 +169,6 @@ void udelay_pit(uint64_t usec)
                // round up the ticks left
                ticks_left = ((uint64_t)usec * (long long)PIT_FREQ+ 999999)
                             / 1000000; 
-       cprintf("ticks left %llu \n" , ticks_left);
        while (ticks_left > 0) {
                tick = getpit();
                delta = prev_tick - tick;
index 5699efc..a727f65 100644 (file)
@@ -87,12 +87,12 @@ void pic_unmask_irq(uint8_t irq);
 void lapic_set_timer(uint32_t ticks, uint8_t vector, bool periodic);
 uint32_t lapic_get_default_id(void);
 // PIT related
-void pit_set_timer(uint32_t freq, uint32_t mode, bool periodic); // consider adding callback func
+void pit_set_timer(uint32_t freq, uint32_t mode);
 void timer_init(void);
 void udelay(uint64_t usec);
 
 static int getpit(void);
-void udelay_pit(uint64_t usec);
+static inline void udelay_pit(uint64_t usec);
 
 
 static inline void pic_send_eoi(uint32_t irq);
index 2e9c253..3104329 100644 (file)
@@ -14,7 +14,6 @@
 #include <kern/apic.h>
 #include <kern/atomic.h>
 
-volatile uint32_t waiting = 1;
 volatile uint8_t num_cpus = 0xee;
 uintptr_t smp_stack_top;
 barrier_t generic_barrier;
@@ -52,19 +51,13 @@ static void init_smp_call_function(void)
        INIT_HANDLER_WRAPPER(4);
 }
 
-/******************************************************************************/
-
-/* Breaks us out of the waiting loop in smp_boot */
-static void smp_boot_handler(trapframe_t *tf)
-{
-       {HANDLER_ATOMIC atomic_dec(&waiting); }
-}
-
 static void smp_mtrr_handler(trapframe_t *tf)
 {
        setup_default_mtrrs(&generic_barrier);
 }
 
+/******************************************************************************/
+
 void smp_boot(void)
 {
        #define boot_vector 0xeb
@@ -87,23 +80,13 @@ void smp_boot(void)
                panic("No memory for SMP boot stack!");
        smp_stack_top = (uintptr_t)(page2kva(smp_stack) + PGSIZE);
 
-       // set up the local APIC timer to fire boot_vector once.  hardcoded to break
-       // out of the spinloop on waiting.  really just want to wait a little
-       lapic_set_timer(0x0000ffff, boot_vector, 0); // TODO - fix timing
-       // set the function handler to respond to this
-       register_interrupt_handler(interrupt_handlers, boot_vector, smp_boot_handler);
-
        // 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
-       while (waiting) // gets released in smp_boot_handler
-               cpu_relax();
+       udelay(50);
        // first SIPI
-       waiting = 1;
        send_startup_ipi(0x01);
-       lapic_set_timer(SMP_BOOT_TIMEOUT, boot_vector, 0); // TODO - fix timing
-       while(waiting) // wait for the first SIPI to take effect
-               cpu_relax();
+       udelay(200);
        /* //BOCHS does not like this second SIPI.
        // second SIPI
        waiting = 1;
index aaf4ab8..efcecc5 100644 (file)
@@ -75,7 +75,7 @@ void test_ipi_sending(void)
 void test_pic_reception(void)
 {
        register_interrupt_handler(interrupt_handlers, 0x20, test_hello_world_handler);
-       pit_set_timer(100,TIMER_RATEGEN,1); // totally arbitrary time
+       pit_set_timer(100,TIMER_RATEGEN); // totally arbitrary time
        pic_unmask_irq(0);
        cprintf("PIC1 Mask = 0x%04x\n", inb(PIC1_DATA));
        cprintf("PIC2 Mask = 0x%04x\n", inb(PIC2_DATA));