spawn: Start process
This commit is contained in:
parent
86907b831d
commit
bd1b3bed8d
@ -65,13 +65,16 @@ static errval_t elf_allocate(
|
|||||||
errval_t err;
|
errval_t err;
|
||||||
struct allocate_state *st = state;
|
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
|
// Allocate a frame
|
||||||
struct capref frame;
|
struct capref frame;
|
||||||
err = slot_alloc(&frame);
|
err = slot_alloc(&frame);
|
||||||
if (err_is_fail(err)) return err_push(err, LIB_ERR_SLOT_ALLOC);
|
if (err_is_fail(err)) return err_push(err, LIB_ERR_SLOT_ALLOC);
|
||||||
|
|
||||||
size_t alloc_bytes;
|
size_t alloc_bytes;
|
||||||
err = frame_create(frame, size, &alloc_bytes);
|
err = frame_create(frame, lv - sv, &alloc_bytes);
|
||||||
if (err_is_fail(err)) {
|
if (err_is_fail(err)) {
|
||||||
slot_free(frame);
|
slot_free(frame);
|
||||||
return err_push(err, LIB_ERR_FRAME_ALLOC);
|
return err_push(err, LIB_ERR_FRAME_ALLOC);
|
||||||
@ -83,6 +86,7 @@ static errval_t elf_allocate(
|
|||||||
alloc_bytes, frame, VREGION_FLAGS_READ_WRITE
|
alloc_bytes, frame, VREGION_FLAGS_READ_WRITE
|
||||||
);
|
);
|
||||||
if (err_is_fail(err)) return err;
|
if (err_is_fail(err)) return err;
|
||||||
|
*ret += base - sv;
|
||||||
|
|
||||||
// translate elf flags to paging flags
|
// translate elf flags to paging flags
|
||||||
uint32_t paging_flags = 0;
|
uint32_t paging_flags = 0;
|
||||||
@ -91,8 +95,10 @@ static errval_t elf_allocate(
|
|||||||
if (flags & PF_R) paging_flags |= KPI_PAGING_FLAGS_READ;
|
if (flags & PF_R) paging_flags |= KPI_PAGING_FLAGS_READ;
|
||||||
|
|
||||||
// Map into child address space
|
// 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(
|
err = paging_map_fixed_attr(
|
||||||
st->paging_state, base, frame,
|
st->paging_state, sv, frame,
|
||||||
alloc_bytes, paging_flags
|
alloc_bytes, paging_flags
|
||||||
);
|
);
|
||||||
if (err_is_fail(err)) return err;
|
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;
|
if (err_is_fail(err)) return err;
|
||||||
|
|
||||||
// afeer: populate some capabilities
|
// 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;
|
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);
|
err = cap_retype(si->cspace_cap_selfep, si->cspace_cap_dispatcher, 0, ObjType_EndPointLMP, 0, 1);
|
||||||
if (err_is_fail(err)) return err;
|
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);
|
registers_set_param(enabled_area, (uint64_t) arguments_page_in_child);
|
||||||
|
|
||||||
// - Make the new dispatcher runnable
|
// - 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 SYS_ERR_OK;
|
||||||
|
|
||||||
return LIB_ERR_NOT_IMPLEMENTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user