| 4883 | } |
| 4884 | |
| 4885 | void |
| 4886 | vm_page_bits_set(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t set) |
| 4887 | { |
| 4888 | |
| 4889 | #if PAGE_SIZE == 32768 |
| 4890 | atomic_set_64((uint64_t *)bits, set); |
| 4891 | #elif PAGE_SIZE == 16384 |
| 4892 | atomic_set_32((uint32_t *)bits, set); |
| 4893 | #elif (PAGE_SIZE == 8192) && defined(atomic_set_16) |
| 4894 | atomic_set_16((uint16_t *)bits, set); |
| 4895 | #elif (PAGE_SIZE == 4096) && defined(atomic_set_8) |
| 4896 | atomic_set_8((uint8_t *)bits, set); |
| 4897 | #else /* PAGE_SIZE <= 8192 */ |
| 4898 | uintptr_t addr; |
| 4899 | int shift; |
| 4900 | |
| 4901 | addr = (uintptr_t)bits; |
| 4902 | /* |
| 4903 | * Use a trick to perform a 32-bit atomic on the |
| 4904 | * containing aligned word, to not depend on the existence |
| 4905 | * of atomic_{set, clear}_{8, 16}. |
| 4906 | */ |
| 4907 | shift = addr & (sizeof(uint32_t) - 1); |
| 4908 | #if BYTE_ORDER == BIG_ENDIAN |
| 4909 | shift = (sizeof(uint32_t) - sizeof(vm_page_bits_t) - shift) * NBBY; |
| 4910 | #else |
| 4911 | shift *= NBBY; |
| 4912 | #endif |
| 4913 | addr &= ~(sizeof(uint32_t) - 1); |
| 4914 | atomic_set_32((uint32_t *)addr, set << shift); |
| 4915 | #endif /* PAGE_SIZE */ |
| 4916 | } |
| 4917 | |
| 4918 | static inline void |
| 4919 | vm_page_bits_clear(vm_page_t m, vm_page_bits_t *bits, vm_page_bits_t clear) |
no test coverage detected