Kernel static mappings grow down, APICs remapped
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 11 Jun 2011 00:51:03 +0000 (17:51 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:04 +0000 (17:36 -0700)
The KERNBASE physical memory mapping still grows up from KERNBASE to the
top of virtual memory.  This top is now KERN_VMAP_TOP, instead of the
old IOAPIC_BASE.  If you arch needs the kernel to never map above a
certain VA, then set this.  RISCV needs it due to its crazy static
kernel aliasing.

RISCV side note: I moved the "max vaddr" stuff (formerly IOAPIC) to the
size dependent code in mmu.h, since I think the old version was wrong
for 32 bit versions.  Feel free to move it back.

All non-KERNBASE mappings will now grow down from KERNBASE, such as VPT,
and the APICs (L and IO).  Any static ones your arch needs should be
defined, and set the value KERN_DYN_TOP at the bottom of the last one.
From this point, all dynamic mappings will occur (in future patches,
when we have dynamic mappings), down to ULIM.

While the LAPIC and IOAPIC don't need to be a part of the kernel
interface (in ros/mmu.h or memlayout.h), the VPT symbol does for now, so until
we figure out how to use the UVPT, I'm leaving it there.

Also, the LAPIC and IOAPIC are now mapped in their new locations, which
are still called LAPIC_BASE nand IOAPIC_BASE.  Previously that name was
overloaded for both VA and PA, and now the PAs have are *_PBASE.

kern/arch/i686/apic.h
kern/arch/i686/arch.h
kern/arch/i686/ioapic.h
kern/arch/i686/pmap.c
kern/arch/i686/ros/mmu.h
kern/arch/riscv/arch.h
kern/arch/riscv/ros/mmu.h
kern/arch/sparc/arch.h
kern/arch/sparc/ros/mmu.h
kern/include/ros/memlayout.h
kern/src/multiboot.c

index 4ee3ac1..b1d5bad 100644 (file)
@@ -27,7 +27,8 @@
 #define PIC_EOI                                                0x20
 
 // Local APIC
-#define LAPIC_BASE                                     0xfee00000 // this is the default, can be changed
+/* PBASE is the physical address.  It is mapped in at the VADDR LAPIC_BASE */
+#define LAPIC_PBASE                                    0xfee00000 /* default *physical* address */
 #define LAPIC_EOI                                      (LAPIC_BASE + 0x0b0)
 #define LAPIC_SPURIOUS                         (LAPIC_BASE + 0x0f0)
 #define LAPIC_VERSION                          (LAPIC_BASE + 0x030)
index 2266e54..75bf445 100644 (file)
@@ -9,6 +9,9 @@
 
 /* Arch Constants */
 #define HW_CACHE_ALIGN                          64
+/* Top of the kernel virtual mapping area (KERNBASE) */
+/* For sanity reasons, I don't plan to map the top page */
+#define KERN_VMAP_TOP                          0xfffff000
 
 static __inline void breakpoint(void) __attribute__((always_inline));
 static __inline void invlpg(void *SNT addr) __attribute__((always_inline));
index 157407f..39d0226 100644 (file)
@@ -8,12 +8,9 @@
 
 #include <ros/common.h>
 
-/* IOAPIC_BASE really go away. This is NOT required by the spec as far as I know.
- * This was originally in apic.h, but Paul moved it here. This is NOT used by
- * anything in the IOAPIC, just some other kernel stuff which uses it for
- * size calculations. It should be called something else and moved.
- */
-#define IOAPIC_BASE                                    0xfec00000 // this is the default, can be changed
+/* Physical address of the IOAPIC, can be changed.  Currently, it's mapped at
+ * the VADDR IOAPIC_BASE */
+#define IOAPIC_PBASE                           0xfec00000 /* default *physical* address */
 
 /* These are things like level sensitive, edge triggered, fixed, nmi, extint, etc
  * This is based on the x58 chipset spec. There are only 2 combinations so
index 1b78d2e..4b8d19d 100644 (file)
@@ -29,8 +29,8 @@ physaddr_t RO boot_cr3;               // Physical address of boot time page directory
 // Global variables
 page_t *RO pages = NULL;          // Virtual address of physical page array
 
-// Base of unalloced MMIO space
-void* mmio_base = (void*)LAPIC_BASE + PGSIZE;
+/* Base of unalloced MMIO space (TODO: have a facility for MMIO paddr alloc) */
+void *mmio_base = (void*)LAPIC_PBASE + PGSIZE;
 
 // Global descriptor table.
 //
@@ -348,10 +348,10 @@ vm_init(void)
 
        // APIC mapping: using PAT (but not *the* PAT flag) to make these type UC
        // IOAPIC
-       boot_map_segment(pgdir, (uintptr_t)IOAPIC_BASE, PGSIZE, IOAPIC_BASE, 
+       boot_map_segment(pgdir, IOAPIC_BASE, PGSIZE, IOAPIC_PBASE, 
                         PTE_PCD | PTE_PWT | PTE_W | PTE_G);
        // Local APIC
-       boot_map_segment(pgdir, (uintptr_t)LAPIC_BASE, PGSIZE, LAPIC_BASE,
+       boot_map_segment(pgdir, LAPIC_BASE, PGSIZE, LAPIC_PBASE,
                         PTE_PCD | PTE_PWT | PTE_W | PTE_G);
 
        // Check that the initial page directory has been set up correctly.
index 36155a4..c026a6d 100644 (file)
@@ -9,6 +9,20 @@ typedef unsigned long pde_t;
 // All physical memory mapped at this address
 #define KERNBASE        0xC0000000
 #define KERN_LOAD_ADDR  KERNBASE
+
+/* Static kernel mappings */
+/* Virtual page table.  Entry PDX(VPT) in the PD contains a pointer to
+ * the page directory itself, thereby turning the PD into a page table,
+ * which maps all the PTEs containing the page mappings for the entire
+ * virtual address space into that 4 Meg region starting at VPT. */
+#define VPT                            (KERNBASE - PTSIZE)
+#define LAPIC_BASE             (VPT - PGSIZE)
+#define IOAPIC_BASE            (LAPIC_BASE - PGSIZE)
+
+/* All arches must define this, which is the lower limit of their static
+ * mappings, and where the dynamic mappings will start. */
+#define KERN_DYN_TOP   IOAPIC_BASE
+
 #define ULIM            0x80000000
 
 // Use this if needed in annotations
index 48578aa..7c0412a 100644 (file)
@@ -11,7 +11,6 @@
 
 /* Arch Constants */
 #define HW_CACHE_ALIGN 64
-#define IOAPIC_BASE    KERN_LOAD_ADDR // upper 2GB reserved (see mmu_init)
 
 #ifdef __riscv64
 # define KERN64
index 7dfad1a..56c97a2 100644 (file)
@@ -6,6 +6,7 @@
 # define KERNBASE       0xFFFF800000000000
 # define ULIM           0x0000800000000000
 # define KERN_LOAD_ADDR 0xFFFFFFFF80000000
+# define KERN_VMAP_TOP         KERN_LOAD_ADDR // upper 2GB reserved (see mmu_init)
 # define NPTLEVELS                       4
 # define L1PGSHIFT              (12+9+9+9)
 # define L1PGSIZE        (1L << L1PGSHIFT)
@@ -21,6 +22,7 @@
 # define KERNBASE               0x80000000
 # define ULIM                   0x7F000000
 # define KERN_LOAD_ADDR           KERNBASE
+# define KERN_VMAP_TOP                 0xfec00000 /* using sparc's upper limit */
 # define NPTLEVELS                       2
 # define L1PGSHIFT                 (12+10)
 # define L1PGSIZE         (1 << L1PGSHIFT)
 # define PTSIZE                   L1PGSIZE
 #endif
 
+/* All arches must define this, which is the lower limit of their static
+ * mappings, and where the dynamic mappings will start. */
+#define KERN_DYN_TOP    KERNBASE
+
 #define PGSIZE (1 << PGSHIFT)
 
 #define NOVPT
index a2395fa..02bdef3 100644 (file)
@@ -5,7 +5,7 @@
 
 /* Arch Constants */
 #define HW_CACHE_ALIGN         64
-#define IOAPIC_BASE            0xFEC00000 // max virtual address
+#define KERN_VMAP_TOP          0xFEC00000 // max virtual address
 
 #include <arch/mmu.h>
 #include <arch/sparc.h>
index 430e3fb..b01ea02 100644 (file)
@@ -6,6 +6,10 @@
 #define KERN_LOAD_ADDR  KERNBASE
 #define ULIM            0x70000000
 
+/* All arches must define this, which is the lower limit of their static
+ * mappings, and where the dynamic mappings will start. */
+#define KERN_DYN_TOP    KERNBASE
+
 // Use this if needed in annotations
 #define IVY_KERNBASE (0x8000U << 16)
 
index eeba100..2717608 100644 (file)
  * which are relevant to both the kernel and user-mode software.
  */
 
-/* Note: this map is out of date, esp for the 64 bit layout */
-/*
+/* x86's 32 bit Virtual Memory Map.  Symbols are similar on other archs
+ *
  * Virtual memory map:                                Permissions
  *                                                    kernel/user
  *
  *    4 Gig -------->  +------------------------------+
- *                     |                              | RW/--
- *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *                     :              .               :
+ *  KERN_VMAP_TOP      +------------------------------+ 0xfffff000
+ *                     |                              |
+ *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
  *                     :              .               :
  *                     :              .               :
  *                     :              .               :
  *                     |                              | RW/--
  *    KERNBASE ----->  +------------------------------+ 0xc0000000
  *                     |  Cur. Page Table (Kern. RW)  | RW/--  PTSIZE
- *    VPT          --> +------------------------------+ 0xbfc00000      --+
- *                     |                              |                   |
- *                     |                              |                 PTSIZE
- *                     |      Invalid Memory (*)      | --/--             |
- *    ULIM      ---->  +------------------------------+ 0xbf800000      --+
- *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE
- *    UVPT      ---->  +------------------------------+ 0xbf400000      --+
+ *    VPT          --> +------------------------------+ 0xbfc00000
+ *                     |          Local APIC          | RW/--  PGSIZE
+ *    LAPIC        --> +------------------------------+ 0xbfbff000
+ *                     |            IOAPIC            | RW/--  PGSIZE
+ *    IOAPIC,      --> +------------------------------+ 0xbfbfe000
+ *  KERN_DYN_TOP       |   Kernel Dynamic Mappings    |
+ *                     |              .               |
+ *                     :              .               :
+ *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RW/--
+ *                     :                              :
+ *                     |      Invalid Memory (*)      | --/--
+ *    ULIM      ---->  +------------------------------+ 0x80000000      --+
+ *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE     |
+ *    UVPT      ---->  +------------------------------+ 0x7fc00000      --+
  *                     | Unmapped (expandable region) |                   |
  *                     |                              | R-/R-            PTSIZE
  *                     |     Per-Process R/O Info     |                   |
- * UWLIM, UINFO ---->  +------------------------------+ 0xbf000000      --+
+ * UWLIM, UINFO ---->  +------------------------------+ 0x7f800000      --+
  *                     | Unmapped (expandable region) |                   |
  *                     |                              | RW/RW            PTSIZE
  *                     |     Per-Process R/W Data     |                   |
- *    UDATA     ---->  +------------------------------+ 0xbec00000      --+
+ *    UDATA     ---->  +------------------------------+ 0x7f400000      --+
  *    UMAPTOP,         |    Global Shared R/W Data    | RW/RW  PGSIZE
- * UXSTACKTOP,UGDATA ->+------------------------------+ 0xbebff000
+ * UXSTACKTOP,UGDATA ->+------------------------------+ 0x7f3ff000
  *                     |     User Exception Stack     | RW/RW  PGSIZE
- *                     +------------------------------+ 0xbebfe000
+ *                     +------------------------------+ 0x7f3fe000
  *                     |       Empty Memory (*)       | --/--  PGSIZE
- *    USTACKTOP  --->  +------------------------------+ 0xbebfd000
+ *    USTACKTOP  --->  +------------------------------+ 0x7f3fd000
  *                     |      Normal User Stack       | RW/RW  256*PGSIZE (1MB)
- *                     +------------------------------+ 0xbeafd000
+ *                     +------------------------------+ 0x7f2fd000
  *                     |       Empty Memory (*)       | --/--  PGSIZE
- *    USTACKBOT  --->  +------------------------------+ 0xbeafc000
+ *    USTACKBOT  --->  +------------------------------+ 0x7f2fc000
  *                     |                              |
  *                     |                              |
  *                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #define BIOSPHYSMEM    0x0F0000
 #define EXTPHYSMEM     0x100000
 
-// Virtual page table.  Entry PDX(VPT) in the PD contains a pointer to
-// the page directory itself, thereby turning the PD into a page table,
-// which maps all the PTEs containing the page mappings for the entire
-// virtual address space into that 4 Meg region starting at VPT.
-#define VPT            (KERNBASE - PTSIZE)
 #define KSTKSHIFT      (PGSHIFT)                       /* KSTKSIZE == PGSIZE */
 #define KSTKSIZE       (1 << KSTKSHIFT)        /* size of a static kernel stack */
 
index 5c548d6..df6d337 100644 (file)
@@ -42,9 +42,9 @@ multiboot_detect_memory(multiboot_info_t *mbi)
 
        npages = SINIT(maxpa / PGSIZE);
 
-       // IOAPIC - KERNBASE is the max amount of virtual addresses we can use
-       // for the physical memory mapping (aka - the KERNBASE mapping)
-       maxaddrpa = SINIT(MIN(maxpa, IOAPIC_BASE - KERNBASE));
+       /* KERN_VMAP_TOP - KERNBASE is the max amount of virtual addresses we can
+        * use for the physical memory mapping (aka - the KERNBASE mapping) */
+       maxaddrpa = SINIT(MIN(maxpa, KERN_VMAP_TOP - KERNBASE));
        maxaddrpa_ptr = SINIT((void *SNT)maxaddrpa);
 
        naddrpages = SINIT(maxaddrpa / PGSIZE);