spawn: Start process

This commit is contained in:
Jan Schär 2022-03-23 14:19:49 +01:00
parent 86907b831d
commit bd1b3bed8d

View File

@ -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;
}
/**