| 10599 | } |
| 10600 | |
| 10601 | static void |
| 10602 | pmap_pti_init(void) |
| 10603 | { |
| 10604 | vm_page_t pml4_pg; |
| 10605 | pdp_entry_t *pdpe; |
| 10606 | vm_offset_t va; |
| 10607 | int i; |
| 10608 | |
| 10609 | if (!pti) |
| 10610 | return; |
| 10611 | pti_obj = vm_pager_allocate(OBJT_PHYS, NULL, 0, VM_PROT_ALL, 0, NULL); |
| 10612 | VM_OBJECT_WLOCK(pti_obj); |
| 10613 | pml4_pg = pmap_pti_alloc_page(); |
| 10614 | pti_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4_pg)); |
| 10615 | for (va = VM_MIN_KERNEL_ADDRESS; va <= VM_MAX_KERNEL_ADDRESS && |
| 10616 | va >= VM_MIN_KERNEL_ADDRESS && va > NBPML4; va += NBPML4) { |
| 10617 | pdpe = pmap_pti_pdpe(va); |
| 10618 | pmap_pti_wire_pte(pdpe); |
| 10619 | } |
| 10620 | pmap_pti_add_kva_locked((vm_offset_t)&__pcpu[0], |
| 10621 | (vm_offset_t)&__pcpu[0] + sizeof(__pcpu[0]) * MAXCPU, false); |
| 10622 | pmap_pti_add_kva_locked((vm_offset_t)idt, (vm_offset_t)idt + |
| 10623 | sizeof(struct gate_descriptor) * NIDT, false); |
| 10624 | CPU_FOREACH(i) { |
| 10625 | /* Doublefault stack IST 1 */ |
| 10626 | va = __pcpu[i].pc_common_tss.tss_ist1 + sizeof(struct nmi_pcpu); |
| 10627 | pmap_pti_add_kva_locked(va - DBLFAULT_STACK_SIZE, va, false); |
| 10628 | /* NMI stack IST 2 */ |
| 10629 | va = __pcpu[i].pc_common_tss.tss_ist2 + sizeof(struct nmi_pcpu); |
| 10630 | pmap_pti_add_kva_locked(va - NMI_STACK_SIZE, va, false); |
| 10631 | /* MC# stack IST 3 */ |
| 10632 | va = __pcpu[i].pc_common_tss.tss_ist3 + |
| 10633 | sizeof(struct nmi_pcpu); |
| 10634 | pmap_pti_add_kva_locked(va - MCE_STACK_SIZE, va, false); |
| 10635 | /* DB# stack IST 4 */ |
| 10636 | va = __pcpu[i].pc_common_tss.tss_ist4 + sizeof(struct nmi_pcpu); |
| 10637 | pmap_pti_add_kva_locked(va - DBG_STACK_SIZE, va, false); |
| 10638 | } |
| 10639 | pmap_pti_add_kva_locked((vm_offset_t)kernphys + KERNBASE, |
| 10640 | (vm_offset_t)etext, true); |
| 10641 | pti_finalized = true; |
| 10642 | VM_OBJECT_WUNLOCK(pti_obj); |
| 10643 | } |
| 10644 | SYSINIT(pmap_pti, SI_SUB_CPU + 1, SI_ORDER_ANY, pmap_pti_init, NULL); |
| 10645 | |
| 10646 | static pdp_entry_t * |
nothing calls this directly
no test coverage detected