spawn: Setup dispatcher
This commit is contained in:
parent
fdf72890f1
commit
2dbebcd684
@ -210,7 +210,51 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// - Setup the dispatcher
|
// - Setup the dispatcher
|
||||||
// TODO
|
err = frame_create(si->cspace_cap_dispframe, DISPATCHER_FRAME_SIZE, NULL);
|
||||||
|
if (err_is_fail(err)) {
|
||||||
|
return err_push(err, SPAWN_ERR_CREATE_DISPATCHER_FRAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatcher_handle_t handle;
|
||||||
|
err = paging_map_frame_attr(
|
||||||
|
get_current_paging_state(), (void **)&handle,
|
||||||
|
DISPATCHER_FRAME_SIZE, si->cspace_cap_dispframe, VREGION_FLAGS_READ_WRITE
|
||||||
|
);
|
||||||
|
if (err_is_fail(err)) return err;
|
||||||
|
|
||||||
|
struct dispatcher_shared_generic *disp =
|
||||||
|
get_dispatcher_shared_generic(handle);
|
||||||
|
|
||||||
|
struct dispatcher_generic *disp_gen = get_dispatcher_generic(handle);
|
||||||
|
|
||||||
|
arch_registers_state_t *enabled_area =
|
||||||
|
dispatcher_get_enabled_save_area(handle);
|
||||||
|
|
||||||
|
arch_registers_state_t *disabled_area =
|
||||||
|
dispatcher_get_disabled_save_area(handle);
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// Start in disabled mode
|
||||||
|
disp->disabled = 1;
|
||||||
|
// A name (for debugging)
|
||||||
|
strncpy(disp->name, argv[0], DISP_NAME_LEN);
|
||||||
|
// Set program counter (where it should start to execute)
|
||||||
|
disabled_area->named.pc = entry;
|
||||||
|
|
||||||
|
// Initialize offset registers
|
||||||
|
// got_addr is the address of the .got in the child's VSpace
|
||||||
|
armv8_set_registers((void *)got_addr, handle, enabled_area, disabled_area);
|
||||||
|
|
||||||
|
// we won't use error handling frames
|
||||||
|
disp_gen->eh_frame = 0;
|
||||||
|
disp_gen->eh_frame_size = 0;
|
||||||
|
disp_gen->eh_frame_hdr = 0;
|
||||||
|
disp_gen->eh_frame_hdr_size = 0;
|
||||||
|
|
||||||
|
// TODO: Map dispatcher frame into child address space
|
||||||
|
|
||||||
// - Setup the environment
|
// - Setup the environment
|
||||||
// TODO
|
// TODO
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user