BOOT_CODE create_frames_of_region_ret_t create_frames_of_region( cap_t root_cnode_cap, cap_t pd_cap, region_t reg, bool_t do_map, int32_t pv_offset ) { pptr_t f; cap_t frame_cap; slot_pos_t slot_pos_before; slot_pos_t slot_pos_after; slot_pos_before = ndks_boot.slot_pos_cur; for (f = reg.start; f < reg.end; f += BIT(PAGE_BITS)) { if (do_map) { frame_cap = create_mapped_it_frame_cap(pd_cap, f, f - BASE_OFFSET - pv_offset, false, false); } else { frame_cap = create_unmapped_it_frame_cap(f, false); } if (!provide_cap(root_cnode_cap, frame_cap)) return (create_frames_of_region_ret_t) { S_REG_EMPTY, false }; } slot_pos_after = ndks_boot.slot_pos_cur; return (create_frames_of_region_ret_t) { (slot_region_t) { slot_pos_before, slot_pos_after }, true }; }
BOOT_CODE static bool_t create_device_frames( cap_t root_cnode_cap, dev_p_regs_t* dev_p_regs ) { seL4_SlotPos slot_pos_before; seL4_SlotPos slot_pos_after; vm_page_size_t frame_size; region_t dev_reg; seL4_DeviceRegion bi_dev_reg; cap_t frame_cap; uint32_t i; pptr_t f; for (i = 0; i < dev_p_regs->count; i++) { /* write the frame caps of this device region into the root CNode and update the bootinfo */ dev_reg = paddr_to_pptr_reg(dev_p_regs->list[i]); /* use large frames if possible, otherwise use 4K frames */ if (IS_ALIGNED(dev_reg.start, LARGE_PAGE_BITS) && IS_ALIGNED(dev_reg.end, LARGE_PAGE_BITS)) { frame_size = X86_LargePage; } else { frame_size = X86_SmallPage; } slot_pos_before = ndks_boot.slot_pos_cur; /* create/provide frame caps covering the region */ for (f = dev_reg.start; f < dev_reg.end; f += BIT(pageBitsForSize(frame_size))) { frame_cap = create_unmapped_it_frame_cap(f, frame_size == X86_LargePage); if (!provide_cap(root_cnode_cap, frame_cap)) { return false; } } slot_pos_after = ndks_boot.slot_pos_cur; /* add device-region entry to bootinfo */ bi_dev_reg.basePaddr = pptr_to_paddr((void*)dev_reg.start); bi_dev_reg.frameSizeBits = pageBitsForSize(frame_size); bi_dev_reg.frames = (seL4_SlotRegion) { slot_pos_before, slot_pos_after }; ndks_boot.bi_frame->deviceRegions[i] = bi_dev_reg; } ndks_boot.bi_frame->numDeviceRegions = dev_p_regs->count; return true; }