x86: PICs for everyone!
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 12 Mar 2014 02:48:46 +0000 (19:48 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 29 Mar 2014 01:16:10 +0000 (18:16 -0700)
Turns on the PIC all the time, but masks it.  And cleans up the PIC
initialization a bit, with the goal of removing ENABLE_MPTABLES.

kern/arch/x86/apic.c
kern/arch/x86/apic.h
kern/arch/x86/trap.c

index 865ae6f..51c9374 100644 (file)
@@ -49,8 +49,9 @@ void pic_remap(void)
        spin_unlock_irqsave(&piclock);
 }
 
-void pic_mask_irq(int irq)
+void pic_mask_irq(int trap_nr)
 {
+       int irq = trap_nr - PIC1_OFFSET;
        spin_lock_irqsave(&piclock);
        if (irq > 7)
                outb(PIC2_DATA, inb(PIC2_DATA) | (1 << (irq - 8)));
@@ -59,8 +60,9 @@ void pic_mask_irq(int irq)
        spin_unlock_irqsave(&piclock);
 }
 
-void pic_unmask_irq(int irq)
+void pic_unmask_irq(int trap_nr)
 {
+       int irq = trap_nr - PIC1_OFFSET;
        spin_lock_irqsave(&piclock);
        if (irq > 7) {
                outb(PIC2_DATA, inb(PIC2_DATA) & ~(1 << (irq - 8)));
@@ -70,6 +72,12 @@ void pic_unmask_irq(int irq)
        spin_unlock_irqsave(&piclock);
 }
 
+void pic_mask_all(void)
+{
+       for (int i = 0 + PIC1_OFFSET; i < 16 + PIC1_OFFSET; i++)
+               pic_mask_irq(i);
+}
+
 /* Aka, the IMR.  Simply reading the data port are OCW1s. */
 uint16_t pic_get_mask(void)
 {
@@ -260,7 +268,7 @@ uint32_t lapic_get_default_id(void)
 // timer init calibrates both tsc timer and lapic timer using PIT
 void timer_init(void){
        /* some boards have this unmasked early on. */
-       pic_mask_irq(0);
+       pic_mask_irq(0 + PIC1_OFFSET);
        uint64_t tscval[2];
        long timercount[2];
        pit_set_timer(0xffff, TIMER_RATEGEN);
index 48ca1dd..b0fbaa2 100644 (file)
@@ -138,8 +138,9 @@ extern system_timing_t system_timing;
 extern bool core_id_ready;
 
 void pic_remap(void);
-void pic_mask_irq(int irq);
-void pic_unmask_irq(int irq);
+void pic_mask_irq(int trap_nr);
+void pic_unmask_irq(int trap_nr);
+void pic_mask_all(void);
 uint16_t pic_get_mask(void);
 uint16_t pic_get_irr(void);
 uint16_t pic_get_isr(void);
index 624d7ff..e5732e8 100644 (file)
@@ -160,6 +160,9 @@ void idt_init(void)
 
        asm volatile("lidt %0" : : "m"(idt_pd));
 
+       pic_remap();
+       pic_mask_all();
+
 #ifdef CONFIG_ENABLE_MPTABLES
        int ncleft;
        int mpsinit(int maxcores);
@@ -173,14 +176,10 @@ void idt_init(void)
        apiconline(); /* TODO: do this this for all cores*/
        ioapiconline();
 #else
-       // This will go away when we start using the IOAPIC properly
-       pic_remap();
        // set LINT0 to receive ExtINTs (KVM's default).  At reset they are 0x1000.
        write_mmreg32(LAPIC_LVT_LINT0, 0x700);
-       // mask it to shut it up for now
-       mask_lapic_lvt(LAPIC_LVT_LINT0);
-       // and turn it on
        lapic_enable();
+       unmask_lapic_lvt(LAPIC_LVT_LINT0);
 #endif
 
        /* register the generic timer_interrupt() handler for the per-core timers */
@@ -576,9 +575,7 @@ int x =     intrenable(irq, handler, irq_arg, tbdf);
 #else
        // only need the ghetto one up above
        //register_raw_irq(KERNEL_IRQ_OFFSET + irq, handler, irq_arg);
-       pic_unmask_irq(irq);
-       unmask_lapic_lvt(LAPIC_LVT_LINT0);
-       enable_irq();
+       pic_unmask_irq(irq + PIC1_OFFSET);
 #endif
        return 0;
 }