From bd1b3bed8dc775eb2bbfe3fc3950e37449c93b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=A4r?= Date: Wed, 23 Mar 2022 14:19:49 +0100 Subject: [PATCH] spawn: Start process --- lib/spawn/spawn.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/spawn/spawn.c b/lib/spawn/spawn.c index 08ce23c..1cba7b5 100644 --- a/lib/spawn/spawn.c +++ b/lib/spawn/spawn.c @@ -65,13 +65,16 @@ static errval_t elf_allocate( errval_t err; struct allocate_state *st = state; + lvaddr_t sv = ROUND_DOWN((lvaddr_t)base, BASE_PAGE_SIZE); + lvaddr_t lv = ROUND_UP((lvaddr_t)base + size, BASE_PAGE_SIZE); + // Allocate a frame struct capref frame; err = slot_alloc(&frame); if (err_is_fail(err)) return err_push(err, LIB_ERR_SLOT_ALLOC); size_t alloc_bytes; - err = frame_create(frame, size, &alloc_bytes); + err = frame_create(frame, lv - sv, &alloc_bytes); if (err_is_fail(err)) { slot_free(frame); return err_push(err, LIB_ERR_FRAME_ALLOC); @@ -83,6 +86,7 @@ static errval_t elf_allocate( alloc_bytes, frame, VREGION_FLAGS_READ_WRITE ); if (err_is_fail(err)) return err; + *ret += base - sv; // translate elf flags to paging flags uint32_t paging_flags = 0; @@ -91,8 +95,10 @@ static errval_t elf_allocate( if (flags & PF_R) paging_flags |= KPI_PAGING_FLAGS_READ; // Map into child address space + // debug_printf("SPAWN: allocate base:%"PRIxPTR", size: %"PRIxPTR", flags: %"PRIu32"\n", + // base, size, paging_flags); err = paging_map_fixed_attr( - st->paging_state, base, frame, + st->paging_state, sv, frame, alloc_bytes, paging_flags ); if (err_is_fail(err)) return err; @@ -201,8 +207,16 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, if (err_is_fail(err)) return err; // afeer: populate some capabilities - err = dispatcher_create(si->cspace_cap_dispatcher); + struct capref dispatcher; + err = slot_alloc(&dispatcher); + if (err_is_fail(err)) return err_push(err, LIB_ERR_SLOT_ALLOC); + + err = dispatcher_create(dispatcher); if (err_is_fail(err)) return err; + + err = cap_copy(si->cspace_cap_dispatcher, dispatcher); + if (err_is_fail(err)) return err_push(err, LIB_ERR_CAP_COPY_FAIL); + err = cap_retype(si->cspace_cap_selfep, si->cspace_cap_dispatcher, 0, ObjType_EndPointLMP, 0, 1); if (err_is_fail(err)) return err; @@ -341,11 +355,14 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, registers_set_param(enabled_area, (uint64_t) arguments_page_in_child); // - Make the new dispatcher runnable - // TODO + err = invoke_dispatcher( + dispatcher, cap_dispatcher, + si->cspace_l1_cnode_cap, si->vspace_cap_l0_pagetable, + si->cspace_cap_dispframe, true + ); + if (err_is_fail(err)) return err_push(err, SPAWN_ERR_RUN); - - - return LIB_ERR_NOT_IMPLEMENTED; + return SYS_ERR_OK; } /**