static void init_allocator(env_t env, test_init_data_t *init_data) { UNUSED int error; UNUSED reservation_t virtual_reservation; /* initialise allocator */ allocman_t *allocator = bootstrap_use_current_1level(init_data->root_cnode, init_data->cspace_size_bits, init_data->free_slots.start, init_data->free_slots.end, ALLOCATOR_STATIC_POOL_SIZE, allocator_mem_pool); if (allocator == NULL) { ZF_LOGF("Failed to bootstrap allocator"); } allocman_make_vka(&env->vka, allocator); /* fill the allocator with untypeds */ seL4_CPtr slot; unsigned int size_bits_index; for (slot = init_data->untypeds.start, size_bits_index = 0; slot <= init_data->untypeds.end; slot++, size_bits_index++) { cspacepath_t path; vka_cspace_make_path(&env->vka, slot, &path); /* allocman doesn't require the paddr unless we need to ask for phys addresses, * which we don't. */ uintptr_t fake_paddr = 0; size_t size_bits = init_data->untyped_size_bits_list[size_bits_index]; error = allocman_utspace_add_uts(allocator, 1, &path, &size_bits, &fake_paddr); if (error) { ZF_LOGF("Failed to add untyped objects to allocator"); } } /* create a vspace */ void *existing_frames[init_data->stack_pages + 2]; existing_frames[0] = (void *) init_data; existing_frames[1] = seL4_GetIPCBuffer(); assert(init_data->stack_pages > 0); for (int i = 0; i < init_data->stack_pages; i++) { existing_frames[i + 2] = init_data->stack + (i * PAGE_SIZE_4K); } error = sel4utils_bootstrap_vspace(&env->vspace, &alloc_data, init_data->page_directory, &env->vka, NULL, NULL, existing_frames); /* switch the allocator to a virtual memory pool */ void *vaddr; virtual_reservation = vspace_reserve_range(&env->vspace, ALLOCATOR_VIRTUAL_POOL_SIZE, seL4_AllRights, 1, &vaddr); if (virtual_reservation.res == 0) { ZF_LOGF("Failed to switch allocator to virtual memory pool"); } bootstrap_configure_virtual_pool(allocator, vaddr, ALLOCATOR_VIRTUAL_POOL_SIZE, env->page_directory); }
void pre_init(void) { int error; set_putchar(putchar_putchar); /* Camkes adds nothing to our address space, so this array is empty */ void *existing_frames[] = { NULL }; camkes_make_simple(&camkes_simple); camkes_simple.IOPort_cap = simple_ioport_wrapper; camkes_simple.frame_cap = simple_frame_cap_wrapper; /* Initialize allocator */ allocman = bootstrap_use_current_1level( simple_get_cnode(&camkes_simple), simple_get_cnode_size_bits(&camkes_simple), simple_last_valid_cap(&camkes_simple) + 1, BIT(simple_get_cnode_size_bits(&camkes_simple)), sizeof(allocator_mempool), allocator_mempool ); assert(allocman); error = allocman_add_simple_untypeds(allocman, &camkes_simple); make_proxy_vka(&vka, allocman); /* Initialize the vspace */ error = sel4utils_bootstrap_vspace(&vspace, &vspace_data, simple_get_init_cap(&camkes_simple, seL4_CapInitThreadPD), &vka, NULL, NULL, existing_frames); assert(!error); /* Create temporary mapping reservation, and map in a frame to * create any book keeping */ reservation_t reservation; reservation.res = allocman_mspace_alloc(allocman, sizeof(sel4utils_res_t), &error); assert(reservation.res); void *reservation_vaddr; error = sel4utils_reserve_range_no_alloc(&vspace, reservation.res, PAGE_SIZE_4K, seL4_AllRights, 1, &reservation_vaddr); assert(!error); error = vspace_new_pages_at_vaddr(&vspace, reservation_vaddr, 1, seL4_PageBits, reservation); assert(!error); vspace_unmap_pages(&vspace, reservation_vaddr, 1, seL4_PageBits, VSPACE_FREE); proxy_give_vspace(&vka, &vspace, reservation_vaddr, reservation); sel4utils_reserve_range_no_alloc(&vspace, &muslc_brk_reservation_memory, BRK_VIRTUAL_SIZE, seL4_AllRights, 1, &muslc_brk_reservation_start); muslc_this_vspace = &vspace; muslc_brk_reservation = (reservation_t){.res = &muslc_brk_reservation_memory}; }
void test_use_current_1level_cspace() { int error; seL4_CPtr i; allocman_t *allocman; seL4_BootInfo *bi = seL4_GetBootInfo(); allocman = bootstrap_use_current_1level(seL4_CapInitThreadCNode, bi->initThreadCNodeSizeBits, bi->empty.start, bi->empty.end, sizeof(initial_mem_pool), initial_mem_pool); assert(allocman); /* have to add all our resources manually */ for (i = bi->untyped.start; i < bi->untyped.end; i++) { cspacepath_t slot = allocman_cspace_make_path(allocman, i); uint32_t size_bits = bi->untypedSizeBitsList[i - bi->untyped.start]; uint32_t paddr = bi->untypedPaddrList[i - bi->untyped.start]; error = allocman_utspace_add_uts(allocman, 1, &slot, &size_bits, &paddr); assert(!error); } error = allocman_fill_reserves(allocman); assert(!error); }
static int vmm_init(void) { vka_object_t fault_ep_obj; vka_t* vka; simple_t* simple; vspace_t* vspace; int err; vka = &_vka; vspace = &_vspace; simple = &_simple; fault_ep_obj.cptr = 0; /* Camkes adds nothing to our address space, so this array is empty */ void *existing_frames[] = { NULL }; camkes_make_simple(simple); start_extra_frame_caps = simple_last_valid_cap(simple) + 1; /* Initialize allocator */ allocman = bootstrap_use_current_1level( simple_get_cnode(simple), simple_get_cnode_size_bits(simple), simple_last_valid_cap(simple) + 1 + num_extra_frame_caps, BIT(simple_get_cnode_size_bits(simple)), sizeof(allocator_mempool), allocator_mempool ); assert(allocman); err = allocman_add_simple_untypeds(allocman, simple); assert(!err); allocman_make_vka(vka, allocman); /* Initialize the vspace */ err = sel4utils_bootstrap_vspace(vspace, &_alloc_data, simple_get_init_cap(simple, seL4_CapInitThreadPD), vka, NULL, NULL, existing_frames); assert(!err); /* Initialise device support */ err = sel4platsupport_new_io_mapper(*simple, *vspace, *vka, &_io_ops.io_mapper); assert(!err); /* Initialise MUX subsystem */ err = mux_sys_init(&_io_ops, &_io_ops.mux_sys); assert(!err); /* Initialise DMA */ err = dma_dmaman_init(&_dma_morecore, NULL, &_io_ops.dma_manager); assert(!err); /* Allocate an endpoint for listening to events */ err = vka_alloc_endpoint(vka, &fault_ep_obj); assert(!err); _fault_endpoint = fault_ep_obj.cptr; /* Create an IRQ server */ err = irq_server_new(vspace, vka, simple_get_cnode(simple), IRQSERVER_PRIO, simple, fault_ep_obj.cptr, IRQ_MESSAGE_LABEL, 256, &_irq_server); assert(!err); return 0; }