Index: sys/i386/i386/pmap.c =================================================================== --- sys/i386/i386/pmap.c +++ sys/i386/i386/pmap.c @@ -3801,7 +3801,7 @@ if ((origpte & PG_A) != 0) pmap_invalidate_page_int(pmap, va); } else - pte_store(pte, newpte); + pte_store_z(pte, newpte); unchanged: @@ -4102,9 +4102,12 @@ if ((prot & VM_PROT_EXECUTE) == 0 && !i386_read_exec) newpte |= pg_nx; #endif - if (pmap != kernel_pmap) + if (pmap != kernel_pmap) { newpte |= PG_U; - pte_store(pte, newpte); + pte_store_z(pte, newpte); + } else { + pte_store(pte, newpte); + } sched_unpin(); return (mpte); } Index: sys/i386/include/pmap_nopae.h =================================================================== --- sys/i386/include/pmap_nopae.h +++ sys/i386/include/pmap_nopae.h @@ -86,6 +86,7 @@ #define pte_store(ptep, pte) do { \ *(u_int *)(ptep) = (u_int)(pte); \ } while (0) +#define pte_store_z(ptep, pte) pte_store(ptep, pte) #define pte_load(ptep) atomic_load_int(ptep) extern pt_entry_t PTmap[]; Index: sys/i386/include/pmap_pae.h =================================================================== --- sys/i386/include/pmap_pae.h +++ sys/i386/include/pmap_pae.h @@ -101,6 +101,16 @@ #define pte_load_store(ptep, pte) atomic_swap_64_i586(ptep, pte) #define pte_load_clear(ptep) atomic_swap_64_i586(ptep, 0) #define pte_store(ptep, pte) atomic_store_rel_64_i586(ptep, pte) +static inline void +pte_store_z(pt_entry_t *ptep, pt_entry_t pte) +{ + uint32_t *p; + + p = (void *)ptep; + *(p + 1) = (uint32_t)(pte >> 32); + __compiler_membar(); + *p = (uint32_t)pte; +} #define pte_load(ptep) atomic_load_acq_64_i586(ptep) extern pdpt_entry_t *IdlePDPT;