Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/pmap.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
| Show First 20 Lines • Show All 1,731 Lines • ▼ Show 20 Lines | |||||
| extern const char la57_trampoline[]; | extern const char la57_trampoline[]; | ||||
| static void | static void | ||||
| pmap_bootstrap_la57(vm_paddr_t *firstaddr) | pmap_bootstrap_la57(vm_paddr_t *firstaddr) | ||||
| { | { | ||||
| void (*la57_tramp)(uint64_t pml5); | void (*la57_tramp)(uint64_t pml5); | ||||
| pml5_entry_t *pt; | pml5_entry_t *pt; | ||||
| uint64_t cr4; | |||||
| if ((cpu_stdext_feature2 & CPUID_STDEXT2_LA57) == 0) | if ((cpu_stdext_feature2 & CPUID_STDEXT2_LA57) == 0) | ||||
| return; | return; | ||||
| la57 = 1; | la57 = 1; | ||||
| TUNABLE_INT_FETCH("vm.pmap.la57", &la57); | TUNABLE_INT_FETCH("vm.pmap.la57", &la57); | ||||
| if (!la57) | if (!la57) | ||||
| return; | return; | ||||
| KPML5phys = allocpages(firstaddr, 1); | KPML5phys = allocpages(firstaddr, 1); | ||||
| KPML4phys = rcr3() & 0xfffff000; /* pml4 from loader must be < 4G */ | KPML4phys = rcr3() & 0xfffff000; /* pml4 from loader must be < 4G */ | ||||
| pt = (pml5_entry_t *)KPML5phys; | pt = (pml5_entry_t *)KPML5phys; | ||||
| pt[0] = KPML4phys | X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M; | pt[0] = KPML4phys | X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M; | ||||
| pt[NPML4EPG - 1] = KPML4phys | X86_PG_V | X86_PG_RW | X86_PG_A | | pt[NPML4EPG - 1] = KPML4phys | X86_PG_V | X86_PG_RW | X86_PG_A | | ||||
| X86_PG_M; | X86_PG_M; | ||||
| la57_tramp = (void (*)(uint64_t))((uintptr_t)la57_trampoline - | la57_tramp = (void (*)(uint64_t))((uintptr_t)la57_trampoline - | ||||
| KERNSTART + amd64_loadaddr()); | KERNSTART + amd64_loadaddr()); | ||||
| printf("Calling la57 trampoline at %p, KPML5phys %#lx ...", | printf("Calling la57 trampoline at %p, KPML5phys %#lx ...", | ||||
| la57_tramp, KPML5phys); | la57_tramp, KPML5phys); | ||||
| if (lass_enabled) { | |||||
| cr4 = rcr4(); | |||||
| load_cr4(cr4 & ~CR4_LASS); | |||||
| } | |||||
| la57_tramp(KPML5phys); | la57_tramp(KPML5phys); | ||||
| printf(" alive in la57 mode\n"); | printf(" alive in la57 mode\n"); | ||||
| if (lass_enabled) { | |||||
| cr4 = rcr4(); | |||||
| load_cr4(cr4 | CR4_LASS); | |||||
| } | |||||
| } | } | ||||
| static void | static void | ||||
| create_pagetables(vm_paddr_t *firstaddr) | create_pagetables(vm_paddr_t *firstaddr) | ||||
| { | { | ||||
| pd_entry_t *pd_p; | pd_entry_t *pd_p; | ||||
| pdp_entry_t *pdp_p; | pdp_entry_t *pdp_p; | ||||
| pml4_entry_t *p4_p, *p4d_p; | pml4_entry_t *p4_p, *p4d_p; | ||||
| ▲ Show 20 Lines • Show All 10,553 Lines • Show Last 20 Lines | |||||