set up arguments
This commit is contained in:
parent
dac5b0a7de
commit
86907b831d
@ -5,6 +5,6 @@
|
|||||||
bootdriver /armv8/sbin/boot_armv8_generic
|
bootdriver /armv8/sbin/boot_armv8_generic
|
||||||
cpudriver /armv8/sbin/cpu_a57_qemu loglevel=3 serial=0x9000000 logmask=128
|
cpudriver /armv8/sbin/cpu_a57_qemu loglevel=3 serial=0x9000000 logmask=128
|
||||||
module /armv8/sbin/init
|
module /armv8/sbin/init
|
||||||
module /armv8/sbin/hello
|
module /armv8/sbin/hello argument1 argument2 argument3
|
||||||
|
|
||||||
# End of file, this needs to have a certain length...
|
# End of file, this needs to have a certain length...
|
||||||
|
|||||||
@ -130,7 +130,14 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
|
|||||||
// - Get the module from the multiboot image
|
// - Get the module from the multiboot image
|
||||||
// and map it (take a look at multiboot.c)
|
// and map it (take a look at multiboot.c)
|
||||||
|
|
||||||
|
debug_printf("[spawn_load_argv]: argc: %d, argv: ", argc);
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
printf("\"%s\", ", argv[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
assert(argc > 0);
|
assert(argc > 0);
|
||||||
|
assert(argc < MAX_CMDLINE_ARGS);
|
||||||
struct mem_region *module = multiboot_find_module(bi, argv[0]);
|
struct mem_region *module = multiboot_find_module(bi, argv[0]);
|
||||||
if (module == NULL) return SPAWN_ERR_FIND_MODULE;
|
if (module == NULL) return SPAWN_ERR_FIND_MODULE;
|
||||||
size_t elf_bytes = module->mrmod_size;
|
size_t elf_bytes = module->mrmod_size;
|
||||||
@ -201,7 +208,7 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
|
|||||||
|
|
||||||
// - Setup the child's vspace
|
// - Setup the child's vspace
|
||||||
// afeer: create level 0 page table
|
// afeer: create level 0 page table
|
||||||
// the l0 page table is in the first slot of the pagecn cnode.
|
// the l0 page table is in the first slot (PAGECN_SLOT_VROOT) of the pagecn cnode.
|
||||||
// lower-level pagetables and mappings are stored on different slots of the pagecn cnode.
|
// lower-level pagetables and mappings are stored on different slots of the pagecn cnode.
|
||||||
si->vspace_cap_l0_pagetable.cnode = si->cspace_l2_cnode_pagecn;
|
si->vspace_cap_l0_pagetable.cnode = si->cspace_l2_cnode_pagecn;
|
||||||
si->vspace_cap_l0_pagetable.slot = PAGECN_SLOT_VROOT;
|
si->vspace_cap_l0_pagetable.slot = PAGECN_SLOT_VROOT;
|
||||||
@ -284,7 +291,54 @@ errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
|
|||||||
disp_gen->eh_frame_hdr_size = 0;
|
disp_gen->eh_frame_hdr_size = 0;
|
||||||
|
|
||||||
// - Setup the environment
|
// - Setup the environment
|
||||||
// TODO
|
// afeer: create a frame (=?= page) for the arguments
|
||||||
|
err = frame_create(si->cspace_cap_argspage, ARGS_SIZE, NULL);
|
||||||
|
if (err_is_fail(err)) return err_push(err, SPAWN_ERR_CREATE_ARGSPG);
|
||||||
|
|
||||||
|
// afeer: map frame to self
|
||||||
|
char * arguments_page_in_self;
|
||||||
|
err = paging_map_frame_attr(
|
||||||
|
get_current_paging_state(), (void **) &arguments_page_in_self,
|
||||||
|
ARGS_SIZE, si->cspace_cap_argspage, VREGION_FLAGS_READ_WRITE);
|
||||||
|
if (err_is_fail(err)) return err_push(err, SPAWN_ERR_MAP_ARGSPG_TO_SELF);
|
||||||
|
// afeer: zero the page content
|
||||||
|
memset(arguments_page_in_self, 0, ARGS_SIZE);
|
||||||
|
|
||||||
|
// afeer: map frame to new process
|
||||||
|
lvaddr_t arguments_page_in_child;
|
||||||
|
err = paging_map_frame_attr(
|
||||||
|
&child_paging_state, (void **) &arguments_page_in_child,
|
||||||
|
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);
|
||||||
|
|
||||||
|
// afeer: put the arguments into the argspage
|
||||||
|
struct spawn_domain_params * domain_params = (struct spawn_domain_params *) arguments_page_in_self;
|
||||||
|
domain_params->argc = argc;
|
||||||
|
|
||||||
|
// afeer: TODO: what do i put here? do we need to set these fields to some value?
|
||||||
|
// domain_params->vspace_buf = NULL;
|
||||||
|
// domain_params->vspace_buf_len = 0;
|
||||||
|
// domain_params->tls_init_base = NULL;
|
||||||
|
// domain_params->tls_init_len = 0;
|
||||||
|
// domain_params->tls_total_len = 0;
|
||||||
|
// domain_params->pagesize = BASE_PAGE_SIZE;
|
||||||
|
|
||||||
|
size_t offset = sizeof(struct spawn_domain_params);
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
// afeer: put the argument into page in self
|
||||||
|
size_t argument_length = strlen(argv[i]);
|
||||||
|
strncpy(argv[i], arguments_page_in_self + offset, argument_length);
|
||||||
|
// afeer: specify the child-space address of the argument
|
||||||
|
domain_params->argv[i] = (char *) arguments_page_in_child + offset;
|
||||||
|
offset += argument_length + 1;
|
||||||
|
}
|
||||||
|
assert(offset <= ARGS_SIZE);
|
||||||
|
// afeer: null-terminate the arg list
|
||||||
|
domain_params->argv[argc] = NULL;
|
||||||
|
domain_params->envp[0] = NULL;
|
||||||
|
|
||||||
|
// afeer: script page 104: set the first register using registers_set_param(arch_registers_state_t)
|
||||||
|
registers_set_param(enabled_area, (uint64_t) arguments_page_in_child);
|
||||||
|
|
||||||
// - Make the new dispatcher runnable
|
// - Make the new dispatcher runnable
|
||||||
// TODO
|
// TODO
|
||||||
@ -312,13 +366,25 @@ errval_t spawn_load_by_name(char *binary_name, struct spawninfo * si,
|
|||||||
errval_t err;
|
errval_t err;
|
||||||
|
|
||||||
// - Get the mem_region from the multiboot image
|
// - Get the mem_region from the multiboot image
|
||||||
// TODO
|
struct mem_region * module = multiboot_find_module(bi, binary_name);
|
||||||
|
if (module == NULL) return SPAWN_ERR_FIND_MODULE;
|
||||||
|
|
||||||
// - Fill in argc/argv from the multiboot command line
|
// - Fill in argc/argv from the multiboot command line
|
||||||
// TODO
|
const char * c_arguments_str = multiboot_module_opts(module);
|
||||||
int argc = 1;
|
// printf("c_arguments_str: %s\n", c_arguments_str);
|
||||||
char *argv[1];
|
char raw_arguments_str[strlen(c_arguments_str)];
|
||||||
argv[0] = binary_name;
|
strcpy(raw_arguments_str, c_arguments_str);
|
||||||
|
// printf("raw_arguments_str: %s\n", raw_arguments_str);
|
||||||
|
|
||||||
|
// afeer: explode the raw_arguments_str into argv
|
||||||
|
char * argv[MAX_CMDLINE_ARGS];
|
||||||
|
int argc = 0;
|
||||||
|
char * token = strtok(raw_arguments_str, " ");
|
||||||
|
while (token != NULL) {
|
||||||
|
argv[argc] = token;
|
||||||
|
token = strtok(NULL, " ");
|
||||||
|
argc += 1;
|
||||||
|
}
|
||||||
|
|
||||||
// - Call spawn_load_argv
|
// - Call spawn_load_argv
|
||||||
err = spawn_load_argv(argc, argv, si, pid);
|
err = spawn_load_argv(argc, argv, si, pid);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user