IRQ func pointers param change
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 27 Mar 2014 23:29:50 +0000 (16:29 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 29 Mar 2014 01:17:05 +0000 (18:17 -0700)
MSI will need more info than just the vector.

kern/arch/x86/apic.c
kern/arch/x86/apic.h
kern/arch/x86/ioapic.c
kern/arch/x86/pic.c
kern/arch/x86/pic.h
kern/arch/x86/time.c
kern/arch/x86/trap.c
kern/arch/x86/trap.h
kern/src/testing.c

index b830ffe..31602f3 100644 (file)
@@ -83,7 +83,7 @@ bool lapic_get_irr_bit(uint8_t vector)
        return __lapic_get_isrr_bit(LAPIC_IRR, vector);
 }
 
-void lapic_mask_irq(int apic_vector)
+void lapic_mask_irq(struct irq_handler *unused, int apic_vector)
 {
        uintptr_t mm_reg;
        if (apic_vector < IdtLAPIC || IdtLAPIC + 4 < apic_vector) {
@@ -94,7 +94,7 @@ void lapic_mask_irq(int apic_vector)
        write_mmreg32(mm_reg, read_mmreg32(mm_reg) | LAPIC_LVT_MASK);
 }
 
-void lapic_unmask_irq(int apic_vector)
+void lapic_unmask_irq(struct irq_handler *unused, int apic_vector)
 {
        uintptr_t mm_reg;
        if (apic_vector < IdtLAPIC || IdtLAPIC + 4 < apic_vector) {
index b3a8bf3..2d53568 100644 (file)
  * Note that core_id() will return 0 (or possibly another wrong answer) on cores
  * other than core 0 when it is called before smp_boot completes. */
 extern bool core_id_ready;
+struct irq_handler;    /* include loops */
 
 bool lapic_check_spurious(int trap_nr);
 bool lapic_get_isr_bit(uint8_t vector);
 bool lapic_get_irr_bit(uint8_t vector);
 void lapic_print_isr(void);
-void lapic_mask_irq(int apic_vector);
-void lapic_unmask_irq(int apic_vector);
+void lapic_mask_irq(struct irq_handler *unused, int apic_vector);
+void lapic_unmask_irq(struct irq_handler *unused, int apic_vector);
 bool ipi_is_pending(uint8_t vector);
 void __lapic_set_timer(uint32_t ticks, uint8_t vec, bool periodic, uint8_t div);
 void lapic_set_timer(uint32_t usec, bool periodic);
index a5e7e9a..9c1e521 100644 (file)
@@ -442,7 +442,8 @@ static struct Rdt *ioapic_vector2rdt(int apic_vector)
 
 /* Routes the IRQ to the os_coreid.  Will take effect immediately.  Route
  * masking from rdt->lo will take effect. */
-static int ioapic_route_irq(int apic_vector, int os_coreid)
+static int ioapic_route_irq(struct irq_handler *unused, int apic_vector,
+                            int os_coreid)
 {
        int hw_coreid;
        struct Rdt *rdt = ioapic_vector2rdt(apic_vector);
@@ -472,8 +473,9 @@ static int ioapic_route_irq(int apic_vector, int os_coreid)
        return 0;
 }
 
-static void ioapic_mask_irq(int apic_vector)
+static void ioapic_mask_irq(struct irq_handler *unused, int apic_vector)
 {
+       /* could store the rdt in the irq_h */
        struct Rdt *rdt = ioapic_vector2rdt(apic_vector);
        if (!rdt)
                return;
@@ -488,7 +490,7 @@ static void ioapic_mask_irq(int apic_vector)
        spin_unlock(&rdt->apic->lock);
 }
 
-static void ioapic_unmask_irq(int apic_vector)
+static void ioapic_unmask_irq(struct irq_handler *unused, int apic_vector)
 {
        struct Rdt *rdt = ioapic_vector2rdt(apic_vector);
        if (!rdt)
index 4a6dbc3..b52e3e7 100644 (file)
@@ -38,7 +38,7 @@ void pic_remap(void)
        spin_unlock_irqsave(&piclock);
 }
 
-void pic_mask_irq(int trap_nr)
+void pic_mask_irq(struct irq_handler *unused, int trap_nr)
 {
        int irq = trap_nr - PIC1_OFFSET;
        spin_lock_irqsave(&piclock);
@@ -49,7 +49,7 @@ void pic_mask_irq(int trap_nr)
        spin_unlock_irqsave(&piclock);
 }
 
-void pic_unmask_irq(int trap_nr)
+void pic_unmask_irq(struct irq_handler *unused, int trap_nr)
 {
        int irq = trap_nr - PIC1_OFFSET;
        printd("PIC unmask for TRAP %d, IRQ %d\n", trap_nr, irq);
@@ -65,7 +65,7 @@ void pic_unmask_irq(int trap_nr)
 void pic_mask_all(void)
 {
        for (int i = 0 + PIC1_OFFSET; i < 16 + PIC1_OFFSET; i++)
-               pic_mask_irq(i);
+               pic_mask_irq(0, i);
 }
 
 /* Aka, the IMR.  Simply reading the data port are OCW1s. */
index 18bd78b..324fd7b 100644 (file)
 #define PIC_READ_IRR                           0x0a    /* OCW3 irq ready next CMD read */
 #define PIC_READ_ISR                           0x0b    /* OCW3 irq service next CMD read */
 
+struct irq_handler;    /* include loops */
+
 void pic_remap(void);
-void pic_mask_irq(int trap_nr);
-void pic_unmask_irq(int trap_nr);
+void pic_mask_irq(struct irq_handler *unused, int trap_nr);
+void pic_unmask_irq(struct irq_handler *unused, int trap_nr);
 void pic_mask_all(void);
 uint16_t pic_get_mask(void);
 uint16_t pic_get_irr(void);
index e363ae9..7174db1 100644 (file)
@@ -18,7 +18,7 @@ system_timing_t system_timing = {0, 0, 0xffff, 0};
 // 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 + PIC1_OFFSET);
+       pic_mask_irq(0, 0 + PIC1_OFFSET);
        uint64_t tscval[2];
        long timercount[2];
        pit_set_timer(0xffff, TIMER_RATEGEN);
index 625f171..e2074f2 100644 (file)
@@ -527,7 +527,7 @@ int register_irq(int irq, isr_t handler, void *irq_arg, uint32_t tbdf)
         * Might need to pass the irq_h, in case unmask needs more info.
         * The lapic IRQs need to be unmasked on a per-core basis */
        if (irq_h->unmask && strcmp(irq_h->type, "lapic"))
-               irq_h->unmask(vector);
+               irq_h->unmask(irq_h, vector);
        return 0;
 }
 
index c154ba2..30a2318 100644 (file)
@@ -135,9 +135,9 @@ struct irq_handler {
         * won't be doing a lot of IRQ line sharing */
        bool (*check_spurious)(int);
        void (*eoi)(int);
-       void (*mask)(int);
-       void (*unmask)(int);
-       int (*route_irq)(int, int);
+       void (*mask)(struct irq_handler *irq_h, int vec);
+       void (*unmask)(struct irq_handler *irq_h, int vec);
+       int (*route_irq)(struct irq_handler *irq_h, int vec, int dest);
 
        int tbdf;
        int dev_irq;
index 2851961..147f554 100644 (file)
@@ -91,7 +91,7 @@ void test_pic_reception(void)
        register_irq(IdtPIC + IrqCLOCK, test_hello_world_handler, NULL,
                     MKBUS(BusISA, 0, 0, 0));
        pit_set_timer(100,TIMER_RATEGEN); // totally arbitrary time
-       pic_unmask_irq(0);
+       pic_unmask_irq(0, 0);
        cprintf("PIC1 Mask = 0x%04x\n", inb(PIC1_DATA));
        cprintf("PIC2 Mask = 0x%04x\n", inb(PIC2_DATA));
        unmask_lapic_lvt(LAPIC_LVT_LINT0);