Page MenuHomeFreeBSD

D19226.id54047.diff
No OneTemporary

D19226.id54047.diff

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;

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 22, 1:59 PM (6 m, 44 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30088642
Default Alt Text
D19226.id54047.diff (1 KB)

Event Timeline