| 2001 | la57_trampoline_gdt[], la57_trampoline_end[]; |
| 2002 | |
| 2003 | static void |
| 2004 | pmap_bootstrap_la57(void *arg __unused) |
| 2005 | { |
| 2006 | char *v_code; |
| 2007 | pml5_entry_t *v_pml5; |
| 2008 | pml4_entry_t *v_pml4; |
| 2009 | pdp_entry_t *v_pdp; |
| 2010 | pd_entry_t *v_pd; |
| 2011 | pt_entry_t *v_pt; |
| 2012 | vm_page_t m_code, m_pml4, m_pdp, m_pd, m_pt, m_pml5; |
| 2013 | void (*la57_tramp)(uint64_t pml5); |
| 2014 | struct region_descriptor r_gdt; |
| 2015 | |
| 2016 | if ((cpu_stdext_feature2 & CPUID_STDEXT2_LA57) == 0) |
| 2017 | return; |
| 2018 | if (!TUNABLE_INT_FETCH("vm.pmap.la57", &la57)) |
| 2019 | la57 = 1; |
| 2020 | if (!la57) |
| 2021 | return; |
| 2022 | |
| 2023 | r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1; |
| 2024 | r_gdt.rd_base = (long)__pcpu[0].pc_gdt; |
| 2025 | |
| 2026 | m_code = vm_page_alloc_contig(NULL, 0, |
| 2027 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2028 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2029 | if ((m_code->flags & PG_ZERO) == 0) |
| 2030 | pmap_zero_page(m_code); |
| 2031 | v_code = (char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_code)); |
| 2032 | m_pml5 = vm_page_alloc_contig(NULL, 0, |
| 2033 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2034 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2035 | if ((m_pml5->flags & PG_ZERO) == 0) |
| 2036 | pmap_zero_page(m_pml5); |
| 2037 | KPML5phys = VM_PAGE_TO_PHYS(m_pml5); |
| 2038 | v_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(KPML5phys); |
| 2039 | m_pml4 = vm_page_alloc_contig(NULL, 0, |
| 2040 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2041 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2042 | if ((m_pml4->flags & PG_ZERO) == 0) |
| 2043 | pmap_zero_page(m_pml4); |
| 2044 | v_pml4 = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pml4)); |
| 2045 | m_pdp = vm_page_alloc_contig(NULL, 0, |
| 2046 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2047 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2048 | if ((m_pdp->flags & PG_ZERO) == 0) |
| 2049 | pmap_zero_page(m_pdp); |
| 2050 | v_pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pdp)); |
| 2051 | m_pd = vm_page_alloc_contig(NULL, 0, |
| 2052 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2053 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2054 | if ((m_pd->flags & PG_ZERO) == 0) |
| 2055 | pmap_zero_page(m_pd); |
| 2056 | v_pd = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pd)); |
| 2057 | m_pt = vm_page_alloc_contig(NULL, 0, |
| 2058 | VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ, |
| 2059 | 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 2060 | if ((m_pt->flags & PG_ZERO) == 0) |
nothing calls this directly
no test coverage detected