svn commit: r342927 - stable/11/sys/i386/include
Konstantin Belousov
kib at FreeBSD.org
Fri Jan 11 02:09:50 UTC 2019
Author: kib
Date: Fri Jan 11 02:09:48 2019
New Revision: 342927
URL: https://svnweb.freebsd.org/changeset/base/342927
Log:
MFC r342769, r342775:
i386: Use atomic 64bit load to read PDE value from PAE pagetables in
pmap_kextract().
Modified:
stable/11/sys/i386/include/pmap.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/i386/include/pmap.h
==============================================================================
--- stable/11/sys/i386/include/pmap.h Fri Jan 11 02:08:06 2019 (r342926)
+++ stable/11/sys/i386/include/pmap.h Fri Jan 11 02:09:48 2019 (r342927)
@@ -193,6 +193,8 @@ typedef uint32_t pt_entry_t;
* Address of current address space page table maps and directories.
*/
#ifdef _KERNEL
+#include <machine/atomic.h>
+
extern pt_entry_t PTmap[];
extern pd_entry_t PTD[];
extern pd_entry_t PTDpde[];
@@ -233,6 +235,32 @@ extern pd_entry_t *IdlePTD; /* physical address of "Id
*/
extern pt_entry_t *KPTmap;
+#if (defined(PAE) || defined(PAE_TABLES))
+
+#define pde_cmpset(pdep, old, new) atomic_cmpset_64_i586(pdep, old, new)
+#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_load(ptep) atomic_load_acq_64_i586(ptep)
+
+extern pt_entry_t pg_nx;
+
+#else /* !(PAE || PAE_TABLES) */
+
+#define pde_cmpset(pdep, old, new) atomic_cmpset_int(pdep, old, new)
+#define pte_load_store(ptep, pte) atomic_swap_int(ptep, pte)
+#define pte_load_clear(ptep) atomic_swap_int(ptep, 0)
+#define pte_store(ptep, pte) do { \
+ *(u_int *)(ptep) = (u_int)(pte); \
+} while (0)
+#define pte_load(ptep) atomic_load_acq_int(ptep)
+
+#endif /* !(PAE || PAE_TABLES) */
+
+#define pte_clear(ptep) pte_store(ptep, 0)
+
+#define pde_store(pdep, pde) pte_store(pdep, pde)
+
/*
* Extract from the kernel page table the physical address that is mapped by
* the given virtual address "va".
@@ -244,7 +272,7 @@ pmap_kextract(vm_offset_t va)
{
vm_paddr_t pa;
- if ((pa = PTD[va >> PDRSHIFT]) & PG_PS) {
+ if ((pa = pte_load(&PTD[va >> PDRSHIFT])) & PG_PS) {
pa = (pa & PG_PS_FRAME) | (va & PDRMASK);
} else {
/*
@@ -259,30 +287,6 @@ pmap_kextract(vm_offset_t va)
}
return (pa);
}
-
-#if (defined(PAE) || defined(PAE_TABLES))
-
-#define pde_cmpset(pdep, old, new) atomic_cmpset_64_i586(pdep, old, new)
-#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)
-
-extern pt_entry_t pg_nx;
-
-#else /* !(PAE || PAE_TABLES) */
-
-#define pde_cmpset(pdep, old, new) atomic_cmpset_int(pdep, old, new)
-#define pte_load_store(ptep, pte) atomic_swap_int(ptep, pte)
-#define pte_load_clear(ptep) atomic_swap_int(ptep, 0)
-#define pte_store(ptep, pte) do { \
- *(u_int *)(ptep) = (u_int)(pte); \
-} while (0)
-
-#endif /* !(PAE || PAE_TABLES) */
-
-#define pte_clear(ptep) pte_store(ptep, 0)
-
-#define pde_store(pdep, pde) pte_store(pdep, pde)
#endif /* _KERNEL */
More information about the svn-src-all
mailing list