Add some comments to apic.c
authorJack Miller <jack@codezen.org>
Sat, 19 Mar 2016 20:27:45 +0000 (15:27 -0500)
committerJack Miller <jack@codezen.org>
Sat, 19 Mar 2016 20:27:45 +0000 (15:27 -0500)
kernel/apic.c

index dfa0420..6039713 100644 (file)
@@ -1,5 +1,16 @@
 /* vim: set ts=4 sw=4 sts=4 noet : */
 
+/* Support for the built-in xAPIC, or x2APIC. We don't bother with the old 386
+ * PIC except to disable it because xAPIC is a foundation technology of the
+ * AMD64 technology.
+ *
+ * While I'm reticent to implement too much "old" hardware, QEMU implements
+ * xapic, whereas if you turn on KVM you get x2apic. This is too fundamental to
+ * break either environment.  Fortunately, programming either is very similar,
+ * pretty much only differing in interface xapic is done via MMIO, x2apic via
+ * MSR.
+ */
+
 #include <console.h>
 #include <cpuid.h>
 #include <memmap.h>
@@ -42,26 +53,35 @@ static void xapic_init(void)
        u64 msr;
        u32 lvt;
 
+       /* Make sure the APIC is actually enabled */
        msr = rdmsr(MSR_IA32_APIC_BASE);
        wrmsr(MSR_IA32_APIC_BASE, msr | XAPIC_ENABLE);
 
+       /* Get a nocache virtual memory of the base memory */
        mmio_mem = vmalloc("APIC", VMALLOC_HEAP_VIRTUAL, PAGE_SIZE);
 
        map_page_nocache((u64) mmio_mem, msr & ~(0xFFFUL));
 
+       /* Divide by 1 */
        mmio_write(mmio_mem, MMIO_XAPIC_TIMER_DIVIDE, 0x11);
 
+       /* Setup a periodic timer interrupt */
        lvt = mmio_read(mmio_mem, MMIO_XAPIC_LVT_TIMER);
 
        lvt &= ~LVT_MASKED;
        lvt |= LVT_TIMER_VECTOR(32) | LVT_TIMER_PERIODIC;
 
        mmio_write(mmio_mem, MMIO_XAPIC_LVT_TIMER, lvt);
+
+       /* Set the initial count, which will start the timer */
        mmio_write(mmio_mem, MMIO_XAPIC_TIMER_INIT_CT, 0x1000);
 }
 
 static void xapic_eoi(void)
 {
+       /* Allow another interrupt to come through when we re-enable
+        * them (exiting through exception)
+        */
        mmio_write(mmio_mem, MMIO_XAPIC_EOI, 0);
 }
 
@@ -70,6 +90,8 @@ struct apic xapic = {
        .eoi = xapic_eoi,
 };
 
+/* Virtually the same as above */
+
 static void x2apic_init(void)
 {
        u64 msr = rdmsr(MSR_IA32_APIC_BASE);
@@ -77,7 +99,7 @@ static void x2apic_init(void)
        /* 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_DIVIDE, 0x11);
 
        msr = rdmsr(MSR_X2APIC_LVT_TIMER);