From 3f60fdbb72ca7ce535db4603916ef3c93f563dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=A4r?= Date: Wed, 23 Mar 2022 10:31:13 +0100 Subject: [PATCH] spawn: Map dispatcher into child --- errors/errno.fugu | 1 + lib/spawn/spawn.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/errors/errno.fugu b/errors/errno.fugu index eb4a145..5afd45b 100755 --- a/errors/errno.fugu +++ b/errors/errno.fugu @@ -577,6 +577,7 @@ errors spawn SPAWN_ERR_ { failure UNKNOWN_TARGET_ARCH "Unknown target architecture type", failure UNSUPPORTED_TARGET_ARCH "Unsupported target architecture type", failure OUT_OF_PIDS "Failure allocating a pid", + failure PAGING_INIT "Failure initializing child paging state", failure SETUP_CSPACE "Failure in spawn_setup_cspace", failure DETERMINE_CPUTYPE "Failure in spawn_determine_cputype", diff --git a/lib/spawn/spawn.c b/lib/spawn/spawn.c index b3dc3e3..d0d46be 100644 --- a/lib/spawn/spawn.c +++ b/lib/spawn/spawn.c @@ -212,7 +212,8 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, // rueegges: initialize the foreign paging state struct paging_state child_paging_state; // 64 * 1024 is enough to catch null pointers and also enough to not conflict with child starting paging_alloc at VADDR_OFFSET - paging_init_state_foreign(&child_paging_state, 64 * 1024, si->vspace_cap_l0_pagetable, get_default_slot_allocator()); + err = paging_init_state_foreign(&child_paging_state, 64 * 1024, si->vspace_cap_l0_pagetable, get_default_slot_allocator()); + if (err_is_fail(err)) return err_push(err, SPAWN_ERR_PAGING_INIT); // - Load the ELF binary struct allocate_state st = { @@ -240,7 +241,15 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, get_current_paging_state(), (void **)&handle, DISPATCHER_FRAME_SIZE, si->cspace_cap_dispframe, VREGION_FLAGS_READ_WRITE ); - if (err_is_fail(err)) return err; + if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_DISPATCHER_TO_SELF); + + dispatcher_handle_t handle_child; + err = paging_map_frame_attr( + &child_paging_state, (void **)&handle_child, + DISPATCHER_FRAME_SIZE, si->cspace_cap_dispframe, VREGION_FLAGS_READ_WRITE + ); + if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_DISPATCHER_TO_NEW); + struct dispatcher_shared_generic *disp = get_dispatcher_shared_generic(handle); @@ -256,7 +265,7 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, // core id of the process disp_gen->core_id = disp_get_core_id(); // Virtual address of the dispatcher frame in child's VSpace - disp->udisp = 0; // TODO + disp->udisp = handle_child; // Start in disabled mode disp->disabled = 1; // A name (for debugging) @@ -274,8 +283,6 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si, disp_gen->eh_frame_hdr = 0; disp_gen->eh_frame_hdr_size = 0; - // TODO: Map dispatcher frame into child address space - // - Setup the environment // TODO