diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -178,6 +178,12 @@ #define PMAP_MEMDOM 1 #endif +size_t +pmap_size_addend(void) +{ + return ((mp_maxid + 1) * sizeof(struct pmap_pcids)); +} + static __inline boolean_t pmap_type_guest(pmap_t pmap) { @@ -384,7 +390,10 @@ #define VM_PAGE_TO_PV_LIST_LOCK(m) \ PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m)) -struct pmap kernel_pmap_store; +struct kpmap_tag { + void *kpmap[howmany(sizeof(struct pmap), sizeof(void *))]; + struct pmap_pcids kpmap_pcids[MAXCPU]; +} kernel_pmap_store; vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */ diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h --- a/sys/amd64/include/pmap.h +++ b/sys/amd64/include/pmap.h @@ -394,8 +394,8 @@ long pm_eptgen; /* EPT pmap generation id */ smr_t pm_eptsmr; int pm_flags; - struct pmap_pcids pm_pcids[MAXCPU]; struct rangeset pm_pkru; + struct pmap_pcids pm_pcids[]; }; /* flags */ @@ -407,8 +407,8 @@ typedef struct pmap *pmap_t; #ifdef _KERNEL -extern struct pmap kernel_pmap_store; -#define kernel_pmap (&kernel_pmap_store) +extern struct kpmap_tag kernel_pmap_store; +#define kernel_pmap ((struct pmap *)&kernel_pmap_store) #define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) #define PMAP_LOCK_ASSERT(pmap, type) \ diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c --- a/sys/arm/arm/pmap-v6.c +++ b/sys/arm/arm/pmap-v6.c @@ -347,6 +347,12 @@ } #endif /* PMAP_DEBUG */ +size_t +pmap_size_addend(void) +{ + return (0); +} + /* * This table must corespond with memory attribute configuration in vm.h. * First entry is used for normal system mapping. diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -195,6 +195,12 @@ #define PMAP_SAN_PTE_BITS (ATTR_DEFAULT | ATTR_S1_XN | \ ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | ATTR_S1_AP(ATTR_S1_AP_RW)) +size_t +pmap_size_addend(void) +{ + return (0); +} + struct pmap_large_md_page { struct rwlock pv_lock; struct md_page pv_page; diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -390,6 +390,12 @@ extern u_long KPTphys; /* phys addr of kernel page tables */ extern u_long tramp_idleptd; +size_t +pmap_size_addend(void) +{ + return (0); +} + static u_long allocpages(u_int cnt, u_long *physfree) { diff --git a/sys/powerpc/powerpc/pmap_dispatch.c b/sys/powerpc/powerpc/pmap_dispatch.c --- a/sys/powerpc/powerpc/pmap_dispatch.c +++ b/sys/powerpc/powerpc/pmap_dispatch.c @@ -255,3 +255,9 @@ return (FALSE); } } + +size_t +pmap_size_addend(void) +{ + return (0); +} diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c --- a/sys/riscv/riscv/pmap.c +++ b/sys/riscv/riscv/pmap.c @@ -338,6 +338,12 @@ #define pmap_store(pte, entry) atomic_store_64(pte, entry) #define pmap_store_bits(pte, bits) atomic_set_64(pte, bits) +size_t +pmap_size_addend(void) +{ + return (0); +} + /********************/ /* Inline functions */ /********************/ diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -163,6 +163,7 @@ void pmap_remove_all(vm_page_t m); void pmap_remove_pages(pmap_t); void pmap_remove_write(vm_page_t m); +size_t pmap_size_addend(void); void pmap_sync_icache(pmap_t, vm_offset_t, vm_size_t); int pmap_ts_referenced(vm_page_t m); void pmap_unwire(pmap_t pmap, vm_offset_t start, vm_offset_t end); diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -277,7 +277,8 @@ mapentzone = uma_zcreate("MAP ENTRY", sizeof(struct vm_map_entry), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); - vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace), NULL, + vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace) + + pmap_size_addend(), NULL, #ifdef INVARIANTS vmspace_zdtor, #else