spawn: Start process
This commit is contained in:
parent
86907b831d
commit
bd1b3bed8d
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user