/* * Initialize all main data structures. * * The code to initialize simple, allocman, vka, and vspace is modeled * after the "sel4test-driver" app: * https://github.com/seL4/sel4test/blob/master/apps/sel4test-driver/src/main.c */ static void setup_system() { /* initialize boot information */ bootinfo = seL4_GetBootInfo(); bootinfo2 = seL4_IA32_GetBootInfo(); assert(bootinfo2); // boot kernel in graphics mode /* initialize simple interface */ simple_stable_init_bootinfo(&simple, bootinfo); //simple_default_init_bootinfo(simple, bootinfo); /* create an allocator */ allocman_t *allocman; allocman = bootstrap_use_current_simple(&simple, POOL_SIZE, memPool); assert(allocman); /* create a VKA */ allocman_make_vka(&vka, allocman); /* create a vspace */ UNUSED int err; err = sel4utils_bootstrap_vspace_with_bootinfo_leaky(&vspace, &allocData, seL4_CapInitThreadPD, &vka, bootinfo); assert(err == 0); /* fill allocator with virtual memory */ void *vaddr; UNUSED reservation_t vres; vres = vspace_reserve_range(&vspace, VIRT_POOL_SIZE, seL4_AllRights, 1, &vaddr); assert(vres.res); bootstrap_configure_virtual_pool(allocman, vaddr, VIRT_POOL_SIZE, seL4_CapInitThreadPD); /* initialize platsupport IO: virt memory */ err = sel4platsupport_new_io_mapper(simple, vspace, vka, &io_ops.io_mapper); assert(err == 0); /* initialize platsupport IO: ports */ err = sel4platsupport_get_io_port_ops(&io_ops.io_port_ops, &simple); assert(err == 0); }
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; }