MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_bootstrap_dmap

Function pmap_bootstrap_dmap

freebsd/arm64/arm64/pmap.c:776–883  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

774}
775
776static vm_offset_t
777pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa,
778 vm_offset_t freemempos)
779{
780 pt_entry_t *l2;
781 vm_offset_t va;
782 vm_paddr_t l2_pa, pa;
783 u_int l1_slot, l2_slot, prev_l1_slot;
784 int i;
785
786 dmap_phys_base = min_pa & ~L1_OFFSET;
787 dmap_phys_max = 0;
788 dmap_max_addr = 0;
789 l2 = NULL;
790 prev_l1_slot = -1;
791
792#define DMAP_TABLES ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT)
793 memset(pagetable_dmap, 0, PAGE_SIZE * DMAP_TABLES);
794
795 for (i = 0; i < (physmap_idx * 2); i += 2) {
796 pa = physmap[i] & ~L2_OFFSET;
797 va = pa - dmap_phys_base + DMAP_MIN_ADDRESS;
798
799 /* Create L2 mappings at the start of the region */
800 if ((pa & L1_OFFSET) != 0) {
801 l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT);
802 if (l1_slot != prev_l1_slot) {
803 prev_l1_slot = l1_slot;
804 l2 = (pt_entry_t *)freemempos;
805 l2_pa = pmap_early_vtophys(kern_l1,
806 (vm_offset_t)l2);
807 freemempos += PAGE_SIZE;
808
809 pmap_store(&pagetable_dmap[l1_slot],
810 (l2_pa & ~Ln_TABLE_MASK) | L1_TABLE);
811
812 memset(l2, 0, PAGE_SIZE);
813 }
814 KASSERT(l2 != NULL,
815 ("pmap_bootstrap_dmap: NULL l2 map"));
816 for (; va < DMAP_MAX_ADDRESS && pa < physmap[i + 1];
817 pa += L2_SIZE, va += L2_SIZE) {
818 /*
819 * We are on a boundary, stop to
820 * create a level 1 block
821 */
822 if ((pa & L1_OFFSET) == 0)
823 break;
824
825 l2_slot = pmap_l2_index(va);
826 KASSERT(l2_slot != 0, ("..."));
827 pmap_store(&l2[l2_slot],
828 (pa & ~L2_OFFSET) | ATTR_DEFAULT |
829 ATTR_S1_XN |
830 ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) |
831 L2_BLOCK);
832 }
833 KASSERT(va == (pa - dmap_phys_base + DMAP_MIN_ADDRESS),

Callers 1

pmap_bootstrapFunction · 0.85

Calls 2

memsetFunction · 0.85
pmap_early_vtophysFunction · 0.85

Tested by

no test coverage detected