# HG changeset patch # User Paul Boddie # Date 1651531880 -7200 # Node ID 98fe32380aed32f6b3003a674db3e161300b2d99 # Parent 8d9befa7772993163ef81e54833125f787802495 Moved stack population to a separate function. diff -r 8d9befa77729 -r 98fe32380aed tests/dstest_exec.cc --- a/tests/dstest_exec.cc Mon May 02 23:45:37 2022 +0200 +++ b/tests/dstest_exec.cc Tue May 03 00:51:20 2022 +0200 @@ -395,6 +395,125 @@ +static l4_addr_t populate_stack(Segment &stack, int argc, char *argv[], l4_fpage_t utcb_fpage) +{ + /* Populate stack with additional capabilities. */ + + l4re_env_cap_entry_t *stack_env_cap = (l4re_env_cap_entry_t *) (stack.buf + stack.size); + + /* Special invalid/terminating environment capability entry. */ + + *(--stack_env_cap) = l4re_env_cap_entry_t(); + + printf("Stack region end: %p\n", stack_env_cap); + + l4_addr_t caps_start = (l4_addr_t) stack_env_cap; + l4_umword_t *stack_element = (l4_umword_t *) stack_env_cap; + + /* Populate stack with argument values. */ + + char *stack_arg = (char *) stack_element; + + stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[0]) - 1, sizeof(l4_umword_t)); + + memset(stack_arg, 0, (char *) stack_element - stack_arg); + memcpy(stack_arg, argv[0], strlen(argv[0])); + + printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg)); + + stack_element = (l4_umword_t *) stack_arg; + + /* Loader flags, debugging flags, and the KIP capability index. + See: generate_l4aux in Remote_app_model */ + + *(--stack_element) = 0; + *(--stack_element) = 0; + *(--stack_element) = 0x14 << L4_CAP_SHIFT; + + printf("Stack L4 aux elements: %p / %lx\n", stack_element, stack.region_address((char *) stack_element)); + + /* Populate stack with standard capabilities. */ + + l4re_env_t *env = (l4re_env_t *) stack_element; + + env--; + env->factory = L4_BASE_FACTORY_CAP; + env->main_thread = L4_BASE_THREAD_CAP; + env->log = L4_BASE_LOG_CAP; + env->scheduler = L4_BASE_SCHEDULER_CAP; + env->rm = 0x11 << L4_CAP_SHIFT; + env->mem_alloc = 0x12 << L4_CAP_SHIFT; + env->first_free_cap = 0x15; + env->caps = (l4re_env_cap_entry_t *) (stack.region_address(caps_start)); + env->utcb_area = utcb_fpage; + env->first_free_utcb = l4_fpage_memaddr(utcb_fpage) + L4_UTCB_OFFSET; + + stack_element = (l4_umword_t *) env; + + /* Populate stack with AUXV. */ + + /* AUXV NULL. */ + + *(--stack_element) = 0; + *(--stack_element) = 0; + + /* L4Re global environment pointer. */ + + *(--stack_element) = stack.region_address((char *) env); + *(--stack_element) = 0xf1; + + /* Apparently required entries. */ + + *(--stack_element) = L4_PAGESIZE; + *(--stack_element) = AT_PAGESZ; + + *(--stack_element) = 0; + *(--stack_element) = AT_UID; + + *(--stack_element) = 0; + *(--stack_element) = AT_EUID; + + *(--stack_element) = 0; + *(--stack_element) = AT_GID; + + *(--stack_element) = 0; + *(--stack_element) = AT_EGID; + + l4_addr_t stack_data_end = (l4_addr_t) stack_element; + + printf("Stack L4 data: %lx / %lx\n", stack_data_end, stack.region_address(stack_data_end)); + + /* No environment pointers. */ + + *(--stack_element) = 0; + + /* Populate stack with argument pointers and count. */ + /* NOTE: Just one argument currently. */ + + *(--stack_element) = 0; + *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg)); + *(--stack_element) = argc; + + char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL); + + /* Adjust the stack alignment. */ + + if (stack_adjusted != (char *) stack_element) + memmove(stack_adjusted, (const void *) stack_element, stack_data_end - (l4_addr_t) stack_element); + + l4_umword_t *stack_adjusted_element = (l4_umword_t *) stack_adjusted; + + printf("%ld %lx %lx\n", stack_adjusted_element[0], stack_adjusted_element[1], stack_adjusted_element[2]); + + l4_addr_t stack_start = stack.region_address(stack_adjusted); + + printf("Stack L4 start: %p / %lx\n", stack_adjusted, stack.region_address(stack_adjusted)); + + return stack_start; +} + + + static ExecPager exec_pager; static void init_pager(ipc_server_config_type *config) @@ -548,117 +667,9 @@ printf("KIP at %lx.\n", kip_start); - /* Populate stack with additional capabilities. */ - - l4re_env_cap_entry_t *stack_env_cap = (l4re_env_cap_entry_t *) (stack.buf + stack.size); - - /* Special invalid/terminating environment capability entry. */ - - *(--stack_env_cap) = l4re_env_cap_entry_t(); - - printf("Stack region end: %p\n", stack_env_cap); - - l4_addr_t caps_start = (l4_addr_t) stack_env_cap; - l4_umword_t *stack_element = (l4_umword_t *) stack_env_cap; - - /* Populate stack with argument values. */ - - char *stack_arg = (char *) stack_element; - - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[1]) - 1, sizeof(l4_umword_t)); - - memset(stack_arg, 0, (char *) stack_element - stack_arg); - memcpy(stack_arg, argv[1], strlen(argv[1])); - - printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg)); - - stack_element = (l4_umword_t *) stack_arg; - - /* Loader flags, debugging flags, and the KIP capability index. - See: generate_l4aux in Remote_app_model */ - - *(--stack_element) = 0; - *(--stack_element) = 0; - *(--stack_element) = 0x14 << L4_CAP_SHIFT; - - printf("Stack L4 aux elements: %p / %lx\n", stack_element, stack.region_address((char *) stack_element)); - - /* Populate stack with standard capabilities. */ - - l4re_env_t *env = (l4re_env_t *) stack_element; - - env--; - env->factory = L4_BASE_FACTORY_CAP; - env->main_thread = L4_BASE_THREAD_CAP; - env->log = L4_BASE_LOG_CAP; - env->scheduler = L4_BASE_SCHEDULER_CAP; - env->rm = 0x11 << L4_CAP_SHIFT; - env->mem_alloc = 0x12 << L4_CAP_SHIFT; - env->first_free_cap = 0x15; - env->caps = (l4re_env_cap_entry_t *) (stack.region_address(caps_start)); - env->utcb_area = utcb_fpage; - env->first_free_utcb = utcb_start + L4_UTCB_OFFSET; - - stack_element = (l4_umword_t *) env; - - /* Populate stack with AUXV. */ + /* Populate the stack with argument and environment details. */ - /* AUXV NULL. */ - - *(--stack_element) = 0; - *(--stack_element) = 0; - - /* L4Re global environment pointer. */ - - *(--stack_element) = stack.region_address((char *) env); - *(--stack_element) = 0xf1; - - /* Apparently required entries. */ - - *(--stack_element) = L4_PAGESIZE; - *(--stack_element) = AT_PAGESZ; - - *(--stack_element) = 0; - *(--stack_element) = AT_UID; - - *(--stack_element) = 0; - *(--stack_element) = AT_EUID; - - *(--stack_element) = 0; - *(--stack_element) = AT_GID; - - *(--stack_element) = 0; - *(--stack_element) = AT_EGID; - - l4_addr_t stack_data_end = (l4_addr_t) stack_element; - - printf("Stack L4 data: %lx / %lx\n", stack_data_end, stack.region_address(stack_data_end)); - - /* No environment pointers. */ - - *(--stack_element) = 0; - - /* Populate stack with argument pointers and count. */ - /* NOTE: Just one argument currently. */ - - *(--stack_element) = 0; - *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg)); - *(--stack_element) = 1; - - char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL); - - /* Adjust the stack alignment. */ - - if (stack_adjusted != (char *) stack_element) - memmove(stack_adjusted, (const void *) stack_element, stack_data_end - (l4_addr_t) stack_element); - - l4_umword_t *stack_adjusted_element = (l4_umword_t *) stack_adjusted; - - printf("%ld %lx %lx\n", stack_adjusted_element[0], stack_adjusted_element[1], stack_adjusted_element[2]); - - l4_addr_t stack_start = stack.region_address(stack_adjusted); - - printf("Stack L4 start: %p / %lx\n", stack_adjusted, stack.region_address(stack_adjusted)); + l4_addr_t stack_start = populate_stack(stack, argc - 1, argv + 1, utcb_fpage); /* Create a new task and thread. */