Fix bug in child spawning causing incomplete paging state passing

This commit is contained in:
Sparchatus 2022-03-31 15:42:56 +00:00
parent 04803f06f8
commit c060cb8498

View File

@ -458,14 +458,15 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
if (err_is_fail(err)) return err; if (err_is_fail(err)) return err;
// rueegges: initialize the foreign paging state // rueegges: initialize the foreign paging state
struct paging_state child_paging_state; struct paging_state _child_paging_state;
struct paging_state *child_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 // 64 * 1024 is enough to catch null pointers and also enough to not conflict with child starting paging_alloc at VADDR_OFFSET
err = 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); if (err_is_fail(err)) return err_push(err, SPAWN_ERR_PAGING_INIT);
// - Load the ELF binary // - Load the ELF binary
struct allocate_state st = { struct allocate_state st = {
.paging_state = &child_paging_state, .paging_state = child_paging_state,
.temp_mapping_head = NULL, .temp_mapping_head = NULL,
}; };
genvaddr_t entry; genvaddr_t entry;
@ -510,7 +511,7 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
dispatcher_handle_t handle_child; dispatcher_handle_t handle_child;
err = paging_map_frame_attr( err = paging_map_frame_attr(
&child_paging_state, (void **)&handle_child, child_paging_state, (void **)&handle_child,
DISPATCHER_FRAME_SIZE, si->cspace_cap_dispframe, VREGION_FLAGS_READ_WRITE 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); if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_DISPATCHER_TO_NEW);
@ -565,18 +566,13 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
// afeer: map frame to new process // afeer: map frame to new process
lvaddr_t arguments_page_in_child; lvaddr_t arguments_page_in_child;
err = paging_map_frame_attr( err = paging_map_frame_attr(
&child_paging_state, (void **) &arguments_page_in_child, child_paging_state, (void **) &arguments_page_in_child,
ARGS_SIZE, si->cspace_cap_argspage, VREGION_FLAGS_READ_WRITE); ARGS_SIZE, si->cspace_cap_argspage, VREGION_FLAGS_READ_WRITE);
if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_ARGSPG_TO_NEW); if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_ARGSPG_TO_NEW);
// afeer: put the arguments into the argspage // afeer: put the arguments into the argspage
struct spawn_domain_params * domain_params = (struct spawn_domain_params *) arguments_page_in_self; struct spawn_domain_params * domain_params = (struct spawn_domain_params *) arguments_page_in_self;
err = spawn_serialize_vspace(si, &child_paging_state, domain_params);
if (err_is_fail(err)) {
return err_push(err, SPAWN_ERR_SERIALISE_VSPACE);
}
// Create shared memory for RPC // Create shared memory for RPC
err = frame_alloc(&si->rpc_shared_frame, RPC_SHARED_SIZE, NULL); err = frame_alloc(&si->rpc_shared_frame, RPC_SHARED_SIZE, NULL);
if (err_is_fail(err)) return err_push(err, LIB_ERR_FRAME_ALLOC); if (err_is_fail(err)) return err_push(err, LIB_ERR_FRAME_ALLOC);
@ -588,10 +584,16 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
if (err_is_fail(err)) return err; if (err_is_fail(err)) return err;
err = paging_map_frame_attr( err = paging_map_frame_attr(
&child_paging_state, &domain_params->rpc_shared_memory, child_paging_state, &domain_params->rpc_shared_memory,
RPC_SHARED_SIZE, si->rpc_shared_frame, VREGION_FLAGS_READ_WRITE); RPC_SHARED_SIZE, si->rpc_shared_frame, VREGION_FLAGS_READ_WRITE);
if (err_is_fail(err)) return err; if (err_is_fail(err)) return err;
err = spawn_serialize_vspace(si, child_paging_state, domain_params);
if (err_is_fail(err)) {
return err_push(err, SPAWN_ERR_SERIALISE_VSPACE);
}
// so we don't use it after serializing
child_paging_state = NULL;
// afeer: TODO: what do i put here? do we need to set these fields to some value? // afeer: TODO: what do i put here? do we need to set these fields to some value?
// domain_params->tls_init_base = NULL; // domain_params->tls_init_base = NULL;