* Pre-bootstrap epoch page mapping(s) with attributes. */
| 1048 | * Pre-bootstrap epoch page mapping(s) with attributes. |
| 1049 | */ |
| 1050 | void |
| 1051 | pmap_preboot_map_attr(vm_paddr_t pa, vm_offset_t va, vm_size_t size, |
| 1052 | vm_prot_t prot, vm_memattr_t attr) |
| 1053 | { |
| 1054 | u_int num; |
| 1055 | u_int l1_attr, l1_prot, l2_prot, l2_attr; |
| 1056 | pt1_entry_t *pte1p; |
| 1057 | pt2_entry_t *pte2p; |
| 1058 | |
| 1059 | l2_prot = prot & VM_PROT_WRITE ? PTE2_AP_KRW : PTE2_AP_KR; |
| 1060 | l2_prot |= (prot & VM_PROT_EXECUTE) ? PTE2_X : PTE2_NX; |
| 1061 | l2_attr = vm_memattr_to_pte2(attr); |
| 1062 | l1_prot = ATTR_TO_L1(l2_prot); |
| 1063 | l1_attr = ATTR_TO_L1(l2_attr); |
| 1064 | |
| 1065 | /* Map all the pages. */ |
| 1066 | num = round_page(size); |
| 1067 | while (num > 0) { |
| 1068 | if ((((va | pa) & PTE1_OFFSET) == 0) && (num >= PTE1_SIZE)) { |
| 1069 | pte1p = kern_pte1(va); |
| 1070 | pte1_store(pte1p, PTE1_KERN(pa, l1_prot, l1_attr)); |
| 1071 | va += PTE1_SIZE; |
| 1072 | pa += PTE1_SIZE; |
| 1073 | num -= PTE1_SIZE; |
| 1074 | } else { |
| 1075 | pte2p = pmap_preboot_vtopte2(va); |
| 1076 | pte2_store(pte2p, PTE2_KERN(pa, l2_prot, l2_attr)); |
| 1077 | va += PAGE_SIZE; |
| 1078 | pa += PAGE_SIZE; |
| 1079 | num -= PAGE_SIZE; |
| 1080 | } |
| 1081 | } |
| 1082 | } |
| 1083 | |
| 1084 | /* |
| 1085 | * Extract from the kernel page table the physical address |
no test coverage detected