summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2013-08-21 22:40:29 +0000
committerjkim <jkim@FreeBSD.org>2013-08-21 22:40:29 +0000
commitf4e86b0a9fd4200d38de9fd26806c1c04125456d (patch)
tree20a93887963c9940dd0c1500e9a4819eec01a10f /sys/amd64
parentbef38f5afd547a1595d017e79820aa9d3fe41282 (diff)
downloadFreeBSD-src-f4e86b0a9fd4200d38de9fd26806c1c04125456d.zip
FreeBSD-src-f4e86b0a9fd4200d38de9fd26806c1c04125456d.tar.gz
Reimplement atomic operations on PDEs and PTEs in pmap.h. This change
significantly reduces duplicate code and make it easier to read. Reviewed by: alc, bde
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/include/pmap.h43
1 files changed, 8 insertions, 35 deletions
diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h
index 46d126d..aacb9ba 100644
--- a/sys/amd64/include/pmap.h
+++ b/sys/amd64/include/pmap.h
@@ -206,41 +206,14 @@ extern u_int64_t KPML4phys; /* physical address of kernel level 4 */
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)
-{
-
- *ptep = pte;
-}
-
-#define pte_clear(ptep) pte_store((ptep), (pt_entry_t)0ULL)
-
-#define pde_store(pdep, pde) pte_store((pdep), (pde))
+#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)
+
+#define pde_store(pdep, pde) pte_store(pdep, pde)
extern pt_entry_t pg_nx;
OpenPOWER on IntegriCloud