MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_bootstrap_la57

Function pmap_bootstrap_la57

freebsd/amd64/amd64/pmap.c:2003–2139  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2001 la57_trampoline_gdt[], la57_trampoline_end[];
2002
2003static void
2004pmap_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)

Callers

nothing calls this directly

Calls 15

vm_page_alloc_contigFunction · 0.85
pmap_pml4e_indexFunction · 0.85
pmap_pdpe_indexFunction · 0.85
pmap_pde_indexFunction · 0.85
pmap_pte_indexFunction · 0.85
pmap_pml5e_indexFunction · 0.85
load_dsFunction · 0.85
load_esFunction · 0.85
ssdtosyssdFunction · 0.85
vm_page_freeFunction · 0.85
pmap_zero_pageFunction · 0.70
wrmsrFunction · 0.50

Tested by

no test coverage detected