Page MenuHomeFreeBSD

D20386.id57788.diff
No OneTemporary

D20386.id57788.diff

Index: sys/amd64/amd64/pmap.c
===================================================================
--- sys/amd64/amd64/pmap.c
+++ sys/amd64/amd64/pmap.c
@@ -1060,6 +1060,7 @@
pd_entry_t pde);
static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
static vm_page_t pmap_large_map_getptp_unlocked(void);
+static vm_paddr_t pmap_large_map_kextract(vm_offset_t va);
static void pmap_pde_attr(pd_entry_t *pde, int cache_bits, int mask);
#if VM_NRESERVLEVEL > 0
static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
@@ -2961,6 +2962,9 @@
if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
pa = DMAP_TO_PHYS(va);
+ } else if (LARGEMAP_MIN_ADDRESS <= va && va < LARGEMAP_MAX_ADDRESS +
+ NBPML4 * (u_long)lm_ents) {
+ pa = pmap_large_map_kextract(va);
} else {
pde = *vtopde(va);
if (pde & PG_PS) {
@@ -8773,6 +8777,40 @@
return ((pt_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pte_index(va));
}
+static vm_paddr_t
+pmap_large_map_kextract(vm_offset_t va)
+{
+ pdp_entry_t *pdpe, pdp;
+ pd_entry_t *pde, pd;
+ pt_entry_t *pte, pt;
+
+ KASSERT(LARGEMAP_MIN_ADDRESS <= va && va < LARGEMAP_MAX_ADDRESS +
+ NBPML4 * (u_long)lm_ents,
+ ("not largemap range %#lx", (u_long)va));
+ pdpe = pmap_large_map_pdpe(va);
+ pdp = *pdpe;
+ KASSERT((pdp & X86_PG_V) != 0,
+ ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va,
+ (u_long)pdpe, pdp));
+ if ((pdp & X86_PG_PS) != 0) {
+ KASSERT((amd_feature & AMDID_PAGE1GB) != 0,
+ ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va,
+ (u_long)pdpe, pdp));
+ return ((pdp & 0x000fffffc0000000ul) | (va & PDPMASK));
+ }
+ pde = pmap_pdpe_to_pde(pdpe, va);
+ pd = *pde;
+ KASSERT((pd & X86_PG_V) != 0,
+ ("invalid pd va %#lx pde %#lx pd %#lx", va, (u_long)pde, pd));
+ if ((pd & X86_PG_PS) != 0)
+ return ((pd & PG_PS_FRAME) | (va & PDRMASK));
+ pte = pmap_pde_to_pte(pde, va);
+ pt = *pte;
+ KASSERT((pt & X86_PG_V) != 0,
+ ("invalid pte va %#lx pte %#lx pt %#lx", va, (u_long)pte, pt));
+ return ((pt & PG_FRAME) | (va & PAGE_MASK));
+}
+
static int
pmap_large_map_getva(vm_size_t len, vm_offset_t align, vm_offset_t phase,
vmem_addr_t *vmem_res)

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 26, 4:55 AM (1 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24213517
Default Alt Text
D20386.id57788.diff (2 KB)

Event Timeline