EOI interrupts, init CT *after* setting up timer ISR
authorJack Miller <jack@codezen.org>
Sat, 19 Mar 2016 19:41:05 +0000 (14:41 -0500)
committerJack Miller <jack@codezen.org>
Sat, 19 Mar 2016 20:20:13 +0000 (15:20 -0500)
This gets both xapic and x2apic generating periodic IRQ 32s

kernel/apic.c
kernel/irq.c

index 276e486..dfa0420 100644 (file)
 #define CPUID_X2APIC   (1 << 21)
 #define CPUID_LAPIC            (1 << 9)
 
-#define MSR_IA32_APIC_BASE     0x1B
+#define MSR_IA32_APIC_BASE                     0x1B
+#define                XAPIC_ENABLE                    (1 << 11)
+#define                XAPIC_EXTD                              (1 << 10)
 
 #define MSR_X2APIC_BASE                                0x800
-#define MSR_X2APIC_VERSION                     (MSR_X2APIC_BASE | 0x3)
 
 #define MSR_X2APIC_LVT_TIMER           (MSR_X2APIC_BASE | 0x32)
 #define MMIO_XAPIC_LVT_TIMER           0x320
-
 #define                LVT_TIMER_PERIODIC              (1 << 17)
 #define                LVT_TIMER_VECTOR(x)             (x & 0xff)
 #define                LVT_MASKED                              (1 << 16)
 #define MSR_X2APIC_TIMER_DIVIDE                (MSR_X2APIC_BASE | 0x3e)
 #define MMIO_XAPIC_TIMER_DIVIDE                0x3e0
 
+#define MSR_X2APIC_EOI                         (MSR_X2APIC_BASE | 0xb)
+#define MMIO_XAPIC_EOI                         0xb0
 
-#define XAPIC_ENABLE           (1 << 11)
-#define XAPIC_EXTD                     (1 << 10)
+static volatile u64 *mmio_mem = NULL;
 
 static void xapic_init(void)
 {
-       volatile u64 *mmio_mem;
        u64 msr;
        u32 lvt;
 
@@ -50,7 +50,6 @@ static void xapic_init(void)
        map_page_nocache((u64) mmio_mem, msr & ~(0xFFFUL));
 
        mmio_write(mmio_mem, MMIO_XAPIC_TIMER_DIVIDE, 0x11);
-       mmio_write(mmio_mem, MMIO_XAPIC_TIMER_INIT_CT, 0x1000);
 
        lvt = mmio_read(mmio_mem, MMIO_XAPIC_LVT_TIMER);
 
@@ -58,11 +57,12 @@ static void xapic_init(void)
        lvt |= LVT_TIMER_VECTOR(32) | LVT_TIMER_PERIODIC;
 
        mmio_write(mmio_mem, MMIO_XAPIC_LVT_TIMER, lvt);
+       mmio_write(mmio_mem, MMIO_XAPIC_TIMER_INIT_CT, 0x1000);
 }
 
 static void xapic_eoi(void)
 {
-
+       mmio_write(mmio_mem, MMIO_XAPIC_EOI, 0);
 }
 
 struct apic xapic = {
@@ -74,26 +74,24 @@ static void x2apic_init(void)
 {
        u64 msr = rdmsr(MSR_IA32_APIC_BASE);
 
+       /* Need EXTD flag to use MSR interface */
        wrmsr(MSR_IA32_APIC_BASE, msr | XAPIC_ENABLE | XAPIC_EXTD);
 
        wrmsr(MSR_X2APIC_TIMER_DIVIDE, 0x11); // divide by 1
 
-       wrmsr(MSR_X2APIC_TIMER_INIT_CT, 0x1000);
-
        msr = rdmsr(MSR_X2APIC_LVT_TIMER);
 
        msr &= ~LVT_MASKED;
+       msr |= LVT_TIMER_PERIODIC | LVT_TIMER_VECTOR(32);
 
-       wrmsr(MSR_X2APIC_LVT_TIMER, msr | LVT_TIMER_PERIODIC | LVT_TIMER_VECTOR(32));
-
-       msr = rdmsr(MSR_X2APIC_LVT_TIMER);
+       wrmsr(MSR_X2APIC_LVT_TIMER, msr);
 
-       printk("timer reg: %x\n", msr);
+       wrmsr(MSR_X2APIC_TIMER_INIT_CT, 0x1000);
 }
 
 static void x2apic_eoi(void)
 {
-
+       wrmsr(MSR_X2APIC_EOI, 0);
 }
 
 struct apic x2apic = {
index 8659ddb..2c3d7cc 100644 (file)
@@ -3,6 +3,7 @@
 #include <console.h>
 #include <regs.h>
 #include <asm/misc.h>
+#include <apic.h>
 
 #define NAMED_EXCEPTIONS 20
 
@@ -50,4 +51,6 @@ void dump_exception(struct regs *regs)
 
        if (regs->vector < 32)
                while(1) {}
+       else
+               apic->eoi();
 }