LAPIC memory mapping
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 8 Mar 2009 21:45:17 +0000 (14:45 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 8 Mar 2009 21:45:17 +0000 (14:45 -0700)
Creates page table mapping for the APIC area (0xfee00000), which should
be removed when we have MTRR support, I think.

inc/x86.h
kern/pmap.c
kern/pmap.h

index 7c53625..689ef7a 100644 (file)
--- a/inc/x86.h
+++ b/inc/x86.h
@@ -4,12 +4,14 @@
 #include <inc/types.h>
 
 /* Model Specific Registers */
-#define IA32_APIC_BASE         0x1b
+#define IA32_APIC_BASE                         0x1b
+#define IA32_MTRR_DEF_TYPE                     0x2ff
 
-#define MSR_APIC_ENABLE        0x00000800
+#define MSR_APIC_ENABLE                                0x00000800
+#define MSR_APIC_BASE_ADDRESS          0x0000000FFFFFF000
 
 /* CPUID */
-#define CPUID_PSE_SUPPORT 0x00000008
+#define CPUID_PSE_SUPPORT                      0x00000008
 
 static __inline void breakpoint(void) __attribute__((always_inline));
 static __inline uint8_t inb(int port) __attribute__((always_inline));
@@ -284,6 +286,7 @@ read_tsc(void)
         return tsc;
 }
 
+// Might need to mfence rdmsr.  supposedly wrmsr serializes, but not for x2APIC
 static __inline uint64_t 
 read_msr(uint32_t reg)
 {
index 683591d..b2874af 100644 (file)
@@ -248,6 +248,13 @@ i386_vm_init(void)
        size_t n;
        bool pse;
 
+       // set up MTRRs
+       // default type is normally 06 (WB), but once we have regions
+       // set up, we can set it to 00 (UC)
+       //write_msr(IA32_MTRR_DEF_TYPE, 0x00000c00);
+       write_msr(IA32_MTRR_DEF_TYPE, 0x00000c06);
+       // might need to set up MTRRS for the IO holes
+
        // check for PSE support
        cpuid(1, 0, 0, 0, &edx);
        pse = edx & CPUID_PSE_SUPPORT;
@@ -334,6 +341,9 @@ i386_vm_init(void)
        else
                boot_map_segment(pgdir, KERNBASE, maxpa, 0, PTE_W );
 
+       // LAPIC mapping, in lieu of MTRRs for now.  TODO: remove when MTRRs are up
+       boot_map_segment(pgdir, (uintptr_t)0xfee00000, PGSIZE, 0xfee00000, PTE_W);
+
        //////////////////////////////////////////////////////////////////////
        // Make 'pages' point to an array of size 'npage' of 'struct Page'.
        // The kernel uses this structure to keep track of physical pages;
@@ -488,6 +498,7 @@ check_boot_pgdir(bool pse)
                case PDX(KSTACKTOP-1):
                case PDX(UPAGES):
                case PDX(UENVS):
+               case PDX(0xfee00000): // LAPIC mapping.  TODO: remove when MTRRs are up
                        assert(pgdir[i]);
                        break;
                default:
index fe5ea47..dab44e3 100644 (file)
@@ -84,7 +84,7 @@ static inline struct Page*
 pa2page(physaddr_t pa)
 {
        if (PPN(pa) >= npage)
-               panic("pa2page called with invalid pa");
+               warn("pa2page called with pa larger than npage");
        return &pages[PPN(pa)];
 }