diff options
author | jkim <jkim@FreeBSD.org> | 2013-08-21 22:40:29 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2013-08-21 22:40:29 +0000 |
commit | f4e86b0a9fd4200d38de9fd26806c1c04125456d (patch) | |
tree | 20a93887963c9940dd0c1500e9a4819eec01a10f /sys/amd64/include | |
parent | bef38f5afd547a1595d017e79820aa9d3fe41282 (diff) | |
download | FreeBSD-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/include')
-rw-r--r-- | sys/amd64/include/pmap.h | 43 |
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; |