#include <inc/mmu.h>
#include <inc/memlayout.h>
pte_t entry_pgtable[NPTENTRIES];
// The entry.S page directory maps the first 4MB of physical memory
// starting at virtual address KERNBASE (that is, it maps virtual
// addresses [KERNBASE, KERNBASE+4MB) to physical addresses [0, 4MB)).
// We choose 4MB because that's how much we can map with one page
// table and it's enough to get us through early boot. We also map
// virtual addresses [0, 4MB) to physical addresses [0, 4MB); this
// region is critical for a few instructions in entry.S and then we
// never use it again.
//
// Page directories (and page tables), must start on a page boundary,
// hence the "__aligned__" attribute. Also, because of restrictions
// related to linking and static initializers, we use "x + PTE_P"
// here, rather than the more standard "x | PTE_P". Everywhere else
// you should use "|" to combine flags.
__attribute__((__aligned__(PGSIZE)))
pde_t entry_pgdir[NPDENTRIES] = {
// Map VA's [0, 4MB) to PA's [0, 4MB)
[0]
= ((uintptr_t)entry_pgtable - KERNBASE) + PTE_P,
// Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB)
[KERNBASE>>PDXSHIFT]
= ((uintptr_t)entry_pgtable - KERNBASE) + PTE_P + PTE_W
};
// Entry 0 of the page table maps to physical page 0, entry 1 to
// physical page 1, etc.
__attribute__((__aligned__(PGSIZE)))
pte_t entry_pgtable[NPTENTRIES] = {
0x000000 | PTE_P | PTE_W,
0x001000 | PTE_P | PTE_W,
0x002000 | PTE_P | PTE_W,
0x003000 | PTE_P | PTE_W,
0x004000 | PTE_P | PTE_W,
0x005000 | PTE_P | PTE_W,
0x006000 | PTE_P | PTE_W,
0x007000 | PTE_P | PTE_W,
0x008000 | PTE_P | PTE_W,
0x009000 | PTE_P | PTE_W,
0x00a000 | PTE_P | PTE_W,
0x00b000 | PTE_P | PTE_W,
0x00c000 | PTE_P | PTE_W,
0x00d000 | PTE_P | PTE_W,
0x00e000 | PTE_P | PTE_W,
0x00f000 | PTE_P | PTE_W,
0x010000 | PTE_P | PTE_W,
0x011000 | PTE_P | PTE_W,
0x012000 | PTE_P | PTE_W,
0x013000 | PTE_P | PTE_W,
0x014000 | PTE_P | PTE_W,
0x015000 | PTE_P | PTE_W,
0x016000 | PTE_P | PTE_W,
0x017000 | PTE_P | PTE_W,
0x018000 | PTE_P | PTE_W,
0x019000 | PTE_P | PTE_W,
0x01a000 | PTE_P | PTE_W,
0x01b000 | PTE_P | PTE_W,
0x01c000 | PTE_P | PTE_W,
0x01d000 | PTE_P | PTE_W,
0x01e000 | PTE_P | PTE_W,
0x01f000 | PTE_P | PTE_W,
0x020000 | PTE_P | PTE_W,
0x021000 | PTE_P | PTE_W,
0x022000 | PTE_P | PTE_W,
0x023000 | PTE_P | PTE_W,
0x024000 | PTE_P | PTE_W,
0x025000 | PTE_P | PTE_W,
0x026000 | PTE_P | PTE_W,
0x027000 | PTE_P | PTE_W,
0x028000 | PTE_P | PTE_W,
0x029000 | PTE_P | PTE_W,
0x02a000 | PTE_P | PTE_W,
0x02b000 | PTE_P | PTE_W,
0x02c000 | PTE_P | PTE_W,
0x02d000 | PTE_P | PTE_W,
0x02e000 | PTE_P | PTE_W,
0x02f000 | PTE_P | PTE_W,
0x030000 | PTE_P | PTE_W,
0x031000 | PTE_P | PTE_W,
0x032000 | PTE_P | PTE_W,
0x033000 | PTE_P | PTE_W,
0x034000 | PTE_P | PTE_W,
0x035000 | PTE_P | PTE_W,
0x036000 | PTE_P | PTE_W,
0x037000 | PTE_P | PTE_W,
0x038000 | PTE_P | PTE_W,
0x039000 | PTE_P | PTE_W,
0x03a000 | PTE_P | PTE_W,
0x03b000 | PTE_P | PTE_W,
0x03c000 | PTE_P | PTE_W,
0x03d000 | PTE_P | PTE_W,
0x03e000 | PTE_P | PTE_W,
0x03f000 | PTE_P | PTE_W,
0x040000 | PTE_P | PTE_W,
0x041000 | PTE_P | PTE_W,
0x042000 | PTE_P | PTE_W,
0x043000 | PTE_P | PTE_W,
0x044000 | PTE_P | PTE_W,
0x045000 | PTE_P | PTE_W,
0x046000 | PTE_P | PTE_W,
0x047000 | PTE_P | PTE_W,
0x048000 | PTE_P | PTE_W,
0x049000 | PTE_P | PTE_W,
0x04a000 | PTE_P | PTE_W,
0x04b000 | PTE_P | PTE_W,
0x04c000 | PTE_P | PTE_W,
0x04d000 | PTE_P | PTE_W,
0x04e000 | PTE_P | PTE_W,
0x04f000 | PTE_P | PTE_W,
0x050000 | PTE_P | PTE_W,
0x051000 | PTE_P | PTE_W,
0x052000 | PTE_P | PTE_W,
0x053000 | PTE_P | PTE_W,
0x054000 | PTE_P | PTE_W,
0x055000 | PTE_P | PTE_W,
0x056000 | PTE_P | PTE_W,
0x057000 | PTE_P | PTE_W,
0x058000 | PTE_P | PTE_W,
0x059000 | PTE_P | PTE_W,
0x05a000 | PTE_P | PTE_W,
0x05b000 | PTE_P | PTE_W,
0x05c000 | PTE_P | PTE_W,
0x05d000 | PTE_P | PTE_W,
0x05e000 | PTE_P | PTE_W,
0x05f000 | PTE_P | PTE_W,
0x060000 | PTE_P | PTE_W,
0x061000 | PTE_P | PTE_W,
0x062000 | PTE_P | PTE_W,
0x063000 | PTE_P | PTE_W,
0x064000 | PTE_P | PTE_W,
0x065000 | PTE_P | PTE_W,
0x066000 | PTE_P | PTE_W,
0x067000 | PTE_P | PTE_W,
0x068000 | PTE_P | PTE_W,
0x069000 | PTE_P | PTE_W,
0x06a000 | PTE_P | PTE_W,
0x06b000 | PTE_P | PTE_W,
0x06c000 | PTE_P | PTE_W,
0x06d000 | PTE_P | PTE_W,
0x06e000 | PTE_P | PTE_W,
0x06f000 | PTE_P | PTE_W,
0x070000 | PTE_P | PTE_W,
0x071000 | PTE_P | PTE_W,
0x072000 | PTE_P | PTE_W,
0x073000 | PTE_P | PTE_W,
0x074000 | PTE_P | PTE_W,
0x075000 | PTE_P | PTE_W,
0x076000 | PTE_P | PTE_W,
0x077000 | PTE_P | PTE_W,
0x078000 | PTE_P | PTE_W,
0x079000 | PTE_P | PTE_W,
0x07a000 | PTE_P | PTE_W,
0x07b000 | PTE_P | PTE_W,
0x07c000 | PTE_P | PTE_W,
0x07d000 | PTE_P | PTE_W,
0x07e000 | PTE_P | PTE_W,
0x07f000 | PTE_P | PTE_W,
0x080000 | PTE_P | PTE_W,
0x081000 | PTE_P | PTE_W,
0x082000 | PTE_P | PTE_W,
0x083000 | PTE_P | PTE_W,
0x084000 | PTE_P | PTE_W,
0x085000 | PTE_P | PTE_W,
0x086000 | PTE_P | PTE_W,
0x087000 | PTE_P | PTE_W,
0x088000 | PTE_P | PTE_W,
0x089000 | PTE_P | PTE_W,
0x08a000 | PTE_P | PTE_W,
0x08b000 | PTE_P | PTE_W,
0x08c000 | PTE_P | PTE_W,
0x08d000 | PTE_P | PTE_W,
0x08e000 | PTE_P | PTE_W,
0x08f000 | PTE_P | PTE_W,
0x090000 | PTE_P | PTE_W,
0x091000 | PTE_P | PTE_W,
0x092000 | PTE_P | PTE_W,
0x093000 | PTE_P | PTE_W,
0x094000 | PTE_P | PTE_W,
0x095000 | PTE_P | PTE_W,
0x096000 | PTE_P | PTE_W,
0x097000 | PTE_P | PTE_W,
0x098000 | PTE_P | PTE_W,
0x099000 | PTE_P | PTE_W,
0x09a000 | PTE_P | PTE_W,
0x09b000 | PTE_P | PTE_W,
0x09c000 | PTE_P | PTE_W,
0x09d000 | PTE_P | PTE_W,
0x09e000 | PTE_P | PTE_W,
0x09f000 | PTE_P | PTE_W,
0x0a0000 | PTE_P | PTE_W,
0x0a1000 | PTE_P | PTE_W,
0x0a2000 | PTE_P | PTE_W,
0x0a3000 | PTE_P | PTE_W,
0x0a4000 | PTE_P | PTE_W,
0x0a5000 | PTE_P | PTE_W,
0x0a6000 | PTE_P | PTE_W,
0x0a7000 | PTE_P | PTE_W,
0x0a8000 | PTE_P | PTE_W,
0x0a9000 | PTE_P | PTE_W,
0x0aa000 | PTE_P | PTE_W,
0x0ab000 | PTE_P | PTE_W,
0x0ac000 | PTE_P | PTE_W,
0x0ad000 | PTE_P | PTE_W,
0x0ae000 | PTE_P | PTE_W,
0x0af000 | PTE_P | PTE_W,
0x0b0000 | PTE_P | PTE_W,
0x0b1000 | PTE_P | PTE_W,
0x0b2000 | PTE_P | PTE_W,
0x0b3000 | PTE_P | PTE_W,
0x0b4000 | PTE_P | PTE_W,
0x0b5000 | PTE_P | PTE_W,
0x0b6000 | PTE_P | PTE_W,
0x0b7000 | PTE_P | PTE_W,
0x0b8000 | PTE_P | PTE_W,
0x0b9000 | PTE_P | PTE_W,
0x0ba000 | PTE_P | PTE_W,
0x0bb000 | PTE_P | PTE_W,
0x0bc000 | PTE_P | PTE_W,
0x0bd000 | PTE_P | PTE_W,
0x0be000 | PTE_P | PTE_W,
0x0bf000 | PTE_P | PTE_W,
0x0c0000 | PTE_P | PTE_W,
0x0c1000 | PTE_P | PTE_W,
0x0c2000 | PTE_P | PTE_W,
0x0c3000 | PTE_P | PTE_W,
0x0c4000 | PTE_P | PTE_W,
0x0c5000 | PTE_P | PTE_W,
0x0c6000 | PTE_P | PTE_W,
0x0c7000 | PTE_P | PTE_W,
0x0c8000 | PTE_P | PTE_W,
0x0c9000 | PTE_P | PTE_W,
0x0ca000 | PTE_P | PTE_W,
0x0cb000 | PTE_P | PTE_W,
0x0cc000 | PTE_P | PTE_W,
0x0cd000 | PTE_P | PTE_W,
0x0ce000 | PTE_P | PTE_W,
0x0cf000 | PTE_P | PTE_W,
0x0d0000 | PTE_P | PTE_W,
0x0d1000 | PTE_P | PTE_W,
0x0d2000 | PTE_P | PTE_W,
0x0d3000 | PTE_P | PTE_W,
0x0d4000 | PTE_P | PTE_W,
0x0d5000 | PTE_P | PTE_W,
0x0d6000 | PTE_P | PTE_W,
0x0d7000 | PTE_P | PTE_W,
0x0d8000 | PTE_P | PTE_W,
0x0d9000 | PTE_P | PTE_W,
0x0da000 | PTE_P | PTE_W,
0x0db000 | PTE_P | PTE_W,
0x0dc000 | PTE_P | PTE_W,
0x0dd000 | PTE_P | PTE_W,
0x0de000 | PTE_P | PTE_W,
0x0df000 | PTE_P | PTE_W,
0x0e0000 | PTE_P | PTE_W,
0x0e1000 | PTE_P | PTE_W,
0x0e2000 | PTE_P | PTE_W,
0x0e3000 | PTE_P | PTE_W,
0x0e4000 | PTE_P | PTE_W,
0x0e5000 | PTE_P | PTE_W,
0x0e6000 | PTE_P | PTE_W,
0x0e7000 | PTE_P | PTE_W,
0x0e8000 | PTE_P | PTE_W,
0x0e9000 | PTE_P | PTE_W,
0x0ea000 | PTE_P | PTE_W,
0x0eb000 | PTE_P | PTE_W,
0x0ec000 | PTE_P | PTE_W,
0x0ed000 | PTE_P | PTE_W,
0x0ee000 | PTE_P | PTE_W,
0x0ef000 | PTE_P | PTE_W,
0x0f0000 | PTE_P | PTE_W,
0x0f1000 | PTE_P | PTE_W,
0x0f2000 | PTE_P | PTE_W,
0x0f3000 | PTE_P | PTE_W,
0x0f4000 | PTE_P | PTE_W,
0x0f5000 | PTE_P | P