Author: kib
Date: Fri Jan 11 02:08:06 2019
New Revision: 342926
URL: https://svnweb.freebsd.org/changeset/base/342926

Log:
  MFC r342769, r342775:
  i386: Use atomic 64bit load to read PDE value from PAE pagetables in
  pmap_kextract().

Modified:
  stable/12/sys/i386/include/pmap.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/i386/include/pmap.h
==============================================================================
--- stable/12/sys/i386/include/pmap.h   Fri Jan 11 01:54:15 2019        
(r342925)
+++ stable/12/sys/i386/include/pmap.h   Fri Jan 11 02:08:06 2019        
(r342926)
@@ -194,6 +194,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[];
@@ -234,6 +236,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".
@@ -245,7 +273,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 {
                /*
@@ -260,30 +288,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 */
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to