void paging_map_kernel_l1_block(union armv8_ttable_entry *ttbase, lvaddr_t va, lpaddr_t pa) { union armv8_ttable_entry l1; l1.raw = 0; l1.block_l1.valid = 1; l1.block_l1.mb0 = 0; l1.block_l1.af = 1; l1.block_l1.base = pa >> 30u; paging_write_l1_entry(ttbase, va, l1); }
void paging_map_user_pages_l1(lvaddr_t table_base, lvaddr_t va, lpaddr_t pa) { assert(aligned(table_base, ARM_L1_ALIGN)); assert(aligned(pa, BYTES_PER_SMALL_PAGE)); union arm_l1_entry e; e.raw = 0; e.page_table.type = L1_TYPE_PAGE_TABLE_ENTRY; e.page_table.domain = 0; e.page_table.base_address = (pa >> 10); paging_write_l1_entry(table_base, va, e); }
void paging_map_table_l1(union armv8_ttable_entry *table_base, lvaddr_t va, lpaddr_t pa) { assert(aligned((uintptr_t)table_base, VMSAv8_64_PTABLE_SIZE)); assert(aligned(pa, VMSAv8_64_PTABLE_SIZE)); union armv8_ttable_entry e; e.raw = 0; e.d.valid = 1; e.d.mb1 = 1; e.d.base = (pa >> BASE_PAGE_BITS); paging_write_l1_entry(table_base, va, e); }
void paging_map_kernel_section(uintptr_t ttbase, lvaddr_t va, lpaddr_t pa) { union arm_l1_entry l1; l1.raw = 0; l1.section.type = L1_TYPE_SECTION_ENTRY; l1.section.bufferable = 1; l1.section.cacheable = 1; l1.section.ap10 = 1; // RW/NA l1.section.ap2 = 0; l1.section.base_address = pa >> 20u; paging_write_l1_entry(ttbase, va, l1); }
void paging_map_block_l1(union armv8_ttable_entry *table_base, lvaddr_t va, lpaddr_t pa, uintptr_t flags) { assert(aligned((uintptr_t)table_base, VMSAv8_64_PTABLE_SIZE)); assert(aligned(pa, VMSAv8_64_PTABLE_SIZE)); union armv8_ttable_entry e; e.raw = flags; e.block_l1.valid = 1; e.block_l1.mb0 = 0; e.block_l1.af = 1; e.block_l1.base = (pa >> BASE_PAGE_BITS); paging_write_l1_entry(table_base, va, e); }