Author: dumbbell
Date: Thu Mar  6 07:42:27 2014
New Revision: 262823
URL: http://svnweb.freebsd.org/changeset/base/262823

Log:
  MFC r254623:
  
  Reimplement atomic operations on PDEs and PTEs in pmap.h.  This change
  significantly reduces duplicate code and make it easier to read.
  
  Note: This merge fixes the build of i386's PAE kernel, broken in r262807.

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

Modified: stable/9/sys/amd64/include/pmap.h
==============================================================================
--- stable/9/sys/amd64/include/pmap.h   Thu Mar  6 06:39:55 2014        
(r262822)
+++ stable/9/sys/amd64/include/pmap.h   Thu Mar  6 07:42:27 2014        
(r262823)
@@ -193,41 +193,14 @@ extern u_int64_t KPML4phys;       /* physical 
 pt_entry_t *vtopte(vm_offset_t);
 #define        vtophys(va)     pmap_kextract(((vm_offset_t) (va)))
 
-static __inline pt_entry_t
-pte_load(pt_entry_t *ptep)
-{
-       pt_entry_t r;
-
-       r = *ptep;
-       return (r);
-}
-
-static __inline pt_entry_t
-pte_load_store(pt_entry_t *ptep, pt_entry_t pte)
-{
-       pt_entry_t r;
-
-       __asm __volatile(
-           "xchgq %0,%1"
-           : "=m" (*ptep),
-             "=r" (r)
-           : "1" (pte),
-             "m" (*ptep));
-       return (r);
-}
-
-#define        pte_load_clear(pte)     atomic_readandclear_long(pte)
-
-static __inline void
-pte_store(pt_entry_t *ptep, pt_entry_t pte)
-{
+#define        pte_load_store(ptep, pte)       atomic_swap_long(ptep, pte)
+#define        pte_load_clear(ptep)            atomic_swap_long(ptep, 0)
+#define        pte_store(ptep, pte) do { \
+       *(u_long *)(ptep) = (u_long)(pte); \
+} while (0)
+#define        pte_clear(ptep)                 pte_store(ptep, 0)
 
-       *ptep = pte;
-}
-
-#define        pte_clear(ptep)         pte_store((ptep), (pt_entry_t)0ULL)
-
-#define        pde_store(pdep, pde)    pte_store((pdep), (pde))
+#define        pde_store(pdep, pde)            pte_store(pdep, pde)
 
 extern pt_entry_t pg_nx;
 

Modified: stable/9/sys/i386/include/pmap.h
==============================================================================
--- stable/9/sys/i386/include/pmap.h    Thu Mar  6 06:39:55 2014        
(r262822)
+++ stable/9/sys/i386/include/pmap.h    Thu Mar  6 07:42:27 2014        
(r262823)
@@ -324,98 +324,27 @@ pmap_kextract(vm_offset_t va)
 
 #if defined(PAE) && !defined(XEN)
 
-#define        pde_cmpset(pdep, old, new) \
-                               atomic_cmpset_64((pdep), (old), (new))
-
-static __inline pt_entry_t
-pte_load(pt_entry_t *ptep)
-{
-       pt_entry_t r;
-
-       __asm __volatile(
-           "lock; cmpxchg8b %1"
-           : "=A" (r)
-           : "m" (*ptep), "a" (0), "d" (0), "b" (0), "c" (0));
-       return (r);
-}
-
-static __inline pt_entry_t
-pte_load_store(pt_entry_t *ptep, pt_entry_t v)
-{
-       pt_entry_t r;
-
-       r = *ptep;
-       __asm __volatile(
-           "1:\n"
-           "\tlock; cmpxchg8b %1\n"
-           "\tjnz 1b"
-           : "+A" (r)
-           : "m" (*ptep), "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32)));
-       return (r);
-}
-
-/* XXXRU move to atomic.h? */
-static __inline int
-atomic_cmpset_64(volatile uint64_t *dst, uint64_t exp, uint64_t src)
-{
-       int64_t res = exp;
-
-       __asm __volatile (
-       "       lock ;                  "
-       "       cmpxchg8b %2 ;          "
-       "       setz    %%al ;          "
-       "       movzbl  %%al,%0 ;       "
-       "# atomic_cmpset_64"
-       : "+A" (res),                   /* 0 (result) */
-         "=m" (*dst)                   /* 1 */
-       : "m" (*dst),                   /* 2 */
-         "b" ((uint32_t)src),
-         "c" ((uint32_t)(src >> 32)));
-
-       return (res);
-}
-
-#define        pte_load_clear(ptep)    pte_load_store((ptep), (pt_entry_t)0ULL)
-
-#define        pte_store(ptep, pte)    pte_load_store((ptep), (pt_entry_t)pte)
+#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;
 
-#elif !defined(PAE) && !defined (XEN)
-
-#define        pde_cmpset(pdep, old, new) \
-                               atomic_cmpset_int((pdep), (old), (new))
-
-static __inline pt_entry_t
-pte_load(pt_entry_t *ptep)
-{
-       pt_entry_t r;
-
-       r = *ptep;
-       return (r);
-}
-
-static __inline pt_entry_t
-pte_load_store(pt_entry_t *ptep, pt_entry_t pte)
-{
-       __asm volatile("xchgl %0, %1" : "+m" (*ptep), "+r" (pte));
-       return (pte);
-}
-
-#define        pte_load_clear(pte)     atomic_readandclear_int(pte)
-
-static __inline void
-pte_store(pt_entry_t *ptep, pt_entry_t pte)
-{
+#elif !defined(PAE) && !defined(XEN)
 
-       *ptep = pte;
-}
+#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 */
 
-#define        pte_clear(ptep)         pte_store((ptep), (pt_entry_t)0ULL)
+#define        pte_clear(ptep)                 pte_store(ptep, 0)
 
-#define        pde_store(pdep, pde)    pte_store((pdep), (pde))
+#define        pde_store(pdep, pde)            pte_store(pdep, pde)
 
 #endif /* _KERNEL */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to