Page MenuHomeFreeBSD

D19226.diff
No OneTemporary

D19226.diff

Index: head/sys/i386/i386/pmap.c
===================================================================
--- head/sys/i386/i386/pmap.c
+++ head/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_zero(pte, newpte);
unchanged:
@@ -4104,7 +4104,7 @@
#endif
if (pmap != kernel_pmap)
newpte |= PG_U;
- pte_store(pte, newpte);
+ pte_store_zero(pte, newpte);
sched_unpin();
return (mpte);
}
Index: head/sys/i386/include/pmap_nopae.h
===================================================================
--- head/sys/i386/include/pmap_nopae.h
+++ head/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_zero(ptep, pte) pte_store(ptep, pte)
#define pte_load(ptep) atomic_load_int(ptep)
extern pt_entry_t PTmap[];
Index: head/sys/i386/include/pmap_pae.h
===================================================================
--- head/sys/i386/include/pmap_pae.h
+++ head/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)
+#define pte_store_zero(ptep, pte) \
+do { \
+ uint32_t *p; \
+ \
+ MPASS((*ptep & PG_V) == 0); \
+ p = (void *)ptep; \
+ *(p + 1) = (uint32_t)(pte >> 32); \
+ __compiler_membar(); \
+ *p = (uint32_t)pte; \
+} while (0)
#define pte_load(ptep) atomic_load_acq_64_i586(ptep)
extern pdpt_entry_t *IdlePDPT;

File Metadata

Mime Type
text/plain
Expires
Wed, Jul 1, 10:43 PM (19 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34579645
Default Alt Text
D19226.diff (1 KB)

Event Timeline