git: 6ba778918946 - stable/13 - amd64: add pmap_alloc_page_below_4g()
Konstantin Belousov
kib at FreeBSD.org
Tue Aug 3 09:53:01 UTC 2021
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=6ba778918946fcdfd15146bf1a47fb19d3262115
commit 6ba778918946fcdfd15146bf1a47fb19d3262115
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-07-13 15:00:54 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-08-03 09:52:37 +0000
amd64: add pmap_alloc_page_below_4g()
(cherry picked from commit c8bae074d9e1d766bcbc2e631ce0c2e9d248881c)
---
sys/amd64/amd64/pmap.c | 49 +++++++++++++++++++-----------------------------
sys/amd64/include/pmap.h | 1 +
2 files changed, 20 insertions(+), 30 deletions(-)
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 73850cbb376f..e5d46449c275 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -1997,6 +1997,19 @@ pmap_init_pat(void)
load_cr4(cr4);
}
+vm_page_t
+pmap_page_alloc_below_4g(bool zeroed)
+{
+ vm_page_t m;
+
+ m = vm_page_alloc_contig(NULL, 0, (zeroed ? VM_ALLOC_ZERO : 0) |
+ VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ,
+ 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
+ if (m != NULL && zeroed && (m->flags & PG_ZERO) == 0)
+ pmap_zero_page(m);
+ return (m);
+}
+
extern const char la57_trampoline[], la57_trampoline_gdt_desc[],
la57_trampoline_gdt[], la57_trampoline_end[];
@@ -2022,42 +2035,18 @@ pmap_bootstrap_la57(void *arg __unused)
r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1;
r_gdt.rd_base = (long)__pcpu[0].pc_gdt;
- m_code = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_code->flags & PG_ZERO) == 0)
- pmap_zero_page(m_code);
+ m_code = pmap_page_alloc_below_4g(true);
v_code = (char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_code));
- m_pml5 = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_pml5->flags & PG_ZERO) == 0)
- pmap_zero_page(m_pml5);
+ m_pml5 = pmap_page_alloc_below_4g(true);
KPML5phys = VM_PAGE_TO_PHYS(m_pml5);
v_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(KPML5phys);
- m_pml4 = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_pml4->flags & PG_ZERO) == 0)
- pmap_zero_page(m_pml4);
+ m_pml4 = pmap_page_alloc_below_4g(true);
v_pml4 = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pml4));
- m_pdp = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_pdp->flags & PG_ZERO) == 0)
- pmap_zero_page(m_pdp);
+ m_pdp = pmap_page_alloc_below_4g(true);
v_pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pdp));
- m_pd = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_pd->flags & PG_ZERO) == 0)
- pmap_zero_page(m_pd);
+ m_pd = pmap_page_alloc_below_4g(true);
v_pd = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pd));
- m_pt = vm_page_alloc_contig(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_NOOBJ,
- 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT);
- if ((m_pt->flags & PG_ZERO) == 0)
- pmap_zero_page(m_pt);
+ m_pt = pmap_page_alloc_below_4g(true);
v_pt = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pt));
/*
diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h
index 8ba654cb2e7c..d06a618a08b6 100644
--- a/sys/amd64/include/pmap.h
+++ b/sys/amd64/include/pmap.h
@@ -501,6 +501,7 @@ int pmap_pkru_set(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
void pmap_thread_init_invl_gen(struct thread *td);
int pmap_vmspace_copy(pmap_t dst_pmap, pmap_t src_pmap);
void pmap_page_array_startup(long count);
+vm_page_t pmap_page_alloc_below_4g(bool zeroed);
#endif /* _KERNEL */
/* Return various clipped indexes for a given VA */
More information about the dev-commits-src-all
mailing list