Index: sys/arm64/arm64/pmap.c =================================================================== --- sys/arm64/arm64/pmap.c +++ sys/arm64/arm64/pmap.c @@ -127,6 +127,7 @@ #include #include #include +#include #include #include @@ -1152,6 +1153,27 @@ * Low level mapping routines..... ***************************************************/ +static inline int +pmap_correct_attr(vm_paddr_t pa, int mode_req) +{ + uint64_t attr; + int mode; + + /* From UEFI spec 2.8 table 7 in 2.3.6.1 */ + attr = efi_memory_attribute(pa); + if ((attr & EFI_MD_ATTR_WB) != 0) + mode = VM_MEMATTR_WRITE_BACK; + else if ((attr & EFI_MD_ATTR_WT) != 0) + mode = VM_MEMATTR_WRITE_THROUGH; + else if ((attr & EFI_MD_ATTR_WC) != 0) + mode = VM_MEMATTR_WRITE_COMBINING; + else + mode = VM_MEMATTR_DEVICE; + if (mode_req < mode) + mode = mode_req; + return (mode); +} + void pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode) { @@ -1167,6 +1189,7 @@ KASSERT((size & PAGE_MASK) == 0, ("pmap_kenter: Mapping is not page-sized")); + mode = pmap_correct_attr(pa, mode); attr = ATTR_DEFAULT | ATTR_IDX(mode) | L3_PAGE; if (mode == DEVICE_MEMORY) attr |= ATTR_XN; @@ -4723,7 +4746,13 @@ /* L3 table is linked */ va = trunc_page(va); pa = trunc_page(pa); - pmap_kenter(va, size, pa, CACHED_MEMORY); + + /* + * Call pmap_kenter with the highest mode + * it will call pmap_correct_attr to get the + * correct one based on the EFI map + */ + pmap_kenter(va, size, pa, VM_MEMATTR_WRITE_BACK); } return ((void *)(va + offset)); Index: sys/arm64/include/vm.h =================================================================== --- sys/arm64/include/vm.h +++ sys/arm64/include/vm.h @@ -37,7 +37,7 @@ #ifdef _KERNEL /* If defined vmstat will try to use both of these in a switch statement */ -#define VM_MEMATTR_WRITE_COMBINING VM_MEMATTR_WRITE_THROUGH +#define VM_MEMATTR_WRITE_COMBINING VM_MEMATTR_UNCACHEABLE #endif #define VM_MEMATTR_DEFAULT VM_MEMATTR_WRITE_BACK