Fix bug in child spawning causing incomplete paging state passing
This commit is contained in:
parent
04803f06f8
commit
c060cb8498
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user