14 #define PDPTE_PRES (1ULL << 0)
15 #define PDPTE_ADDR_MASK (~((1ULL << 12) - 1))
17 #define PDE_PRES (1ULL << 0)
18 #define PDE_RW (1ULL << 1)
19 #define PDE_US (1ULL << 2)
20 #define PDE_PWT (1ULL << 3)
21 #define PDE_PCD (1ULL << 4)
22 #define PDE_A (1ULL << 5)
23 #define PDE_D (1ULL << 6)
24 #define PDE_PS (1ULL << 7)
25 #define PDE_G (1ULL << 8)
26 #define PDE_PAT (1ULL << 12)
27 #define PDE_XD (1ULL << 63)
28 #define PDE_ADDR_MASK (~((1ULL << 12) - 1))
30 #define PTE_PRES (1ULL << 0)
31 #define PTE_RW (1ULL << 1)
32 #define PTE_US (1ULL << 2)
33 #define PTE_PWT (1ULL << 3)
34 #define PTE_PCD (1ULL << 4)
35 #define PTE_A (1ULL << 5)
36 #define PTE_D (1ULL << 6)
37 #define PTE_PAT (1ULL << 7)
38 #define PTE_G (1ULL << 8)
39 #define PTE_XD (1ULL << 63)
41 #define PDPTE_IDX_SHIFT 30
42 #define PDPTE_IDX_MASK 0x3
44 #define PDE_IDX_SHIFT 21
45 #define PDE_IDX_MASK 0x1ff
47 #define PTE_IDX_SHIFT 12
48 #define PTE_IDX_MASK 0x1ff
50 #define OVERLAP(a, b, s, e) ((b) > (s) && (a) < (e))
137 __func__, vmem_addr);
139 __func__, pgtbl_buf);
165 struct pde *pd = pgtbl_buf->
pd, *pdp = pgtbl_buf->
pdp;
178 for (
size_t i = 0; i < 2048; i++) {
199 asm volatile (
"invlpg (%0)" ::
"b"(vmem_addr) :
"memory");
228 static struct pg_table pgtbl[CONFIG_MAX_CPUS]
229 __attribute__((aligned(4096)));
230 static unsigned long mapped_window[CONFIG_MAX_CPUS];
232 unsigned long window;
239 if (window != mapped_window[index]) {
242 struct pde *pd, *pdp;
246 memset(&pgtbl[index].pdp, 0,
sizeof(pgtbl[index].pdp));
247 pd = pgtbl[index].pd;
248 pdp = pgtbl[index].pdp;
250 pdp[1].addr_lo = ((
uintptr_t)&pd[512*1])|1;
251 pdp[2].addr_lo = ((
uintptr_t)&pd[512*2])|1;
252 pdp[3].addr_lo = ((
uintptr_t)&pd[512*3])|1;
255 for (i = 0; i < 1024; i++) {
256 pd[i].
addr_lo = ((i & 0x3ff) << 21) | 0xE3;
262 for (i = 1024; i < 2048; i++) {
263 pd[i].
addr_lo = ((window & 1) << 31)
264 | ((i & 0x3ff) << 21) | 0xE3;
269 mapped_window[index] = window;
272 result = (
void *)(page << 21);
274 result = (
void *)(0x80000000 | ((page & 0x3ff) << 21));
477 map_size =
MIN(size, map_size);
void * memset(void *dstpp, int c, size_t len)
static size_t cbfs_load(const char *name, void *buf, size_t size)
#define printk(level,...)
static __always_inline void write_cr3(CRx_TYPE data)
static __always_inline CRx_TYPE read_cr3(void)
static __always_inline void write_cr4(CRx_TYPE data)
static __always_inline CRx_TYPE read_cr4(void)
static __always_inline void write_cr0(CRx_TYPE data)
static __always_inline CRx_TYPE read_cr0(void)
static __always_inline msr_t rdmsr(unsigned int index)
static __always_inline void wrmsr(unsigned int index, msr_t msr)
static int preram_symbols_available(void)
#define REGION_SIZE(name)
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
#define PAT_ENCODE(type, idx)
void * map_2M_page(unsigned long page)
static int _paging_identity_map_addr(uintptr_t base, size_t size, int pat, int commit)
void paging_set_default_pat(void)
static void * get_pdpt_addr(void)
static uint64_t pde_pat_flags(int pat)
static uint64_t pte_pat_flags(int pat)
static const size_t s4KiB
void paging_enable_pae_cr3(uintptr_t cr3)
#define OVERLAP(a, b, s, e)
void paging_set_nxe(int enable)
static uint64_t pte_page_flags(int pat)
void paging_set_pat(uint64_t pat)
int memset_pae(uint64_t dest, unsigned char pat, uint64_t length, void *pgtbl, void *vmem_addr)
int paging_identity_map_addr(uintptr_t base, size_t size, int pat)
static int paging_is_enabled(void)
static uint64_t pde_page_flags(int pat)
static const size_t s2MiB
void paging_disable_pae(void)
int paging_enable_for_car(const char *pdpt_name, const char *pt_name)
void paging_enable_pae(void)
static int identity_map_one_page(uintptr_t base, size_t size, int pat, int commit)
unsigned long long uint64_t