1.1 --- a/tests/dstest_exec.cc Mon May 02 23:45:37 2022 +0200
1.2 +++ b/tests/dstest_exec.cc Tue May 03 00:51:20 2022 +0200
1.3 @@ -395,6 +395,125 @@
1.4
1.5
1.6
1.7 +static l4_addr_t populate_stack(Segment &stack, int argc, char *argv[], l4_fpage_t utcb_fpage)
1.8 +{
1.9 + /* Populate stack with additional capabilities. */
1.10 +
1.11 + l4re_env_cap_entry_t *stack_env_cap = (l4re_env_cap_entry_t *) (stack.buf + stack.size);
1.12 +
1.13 + /* Special invalid/terminating environment capability entry. */
1.14 +
1.15 + *(--stack_env_cap) = l4re_env_cap_entry_t();
1.16 +
1.17 + printf("Stack region end: %p\n", stack_env_cap);
1.18 +
1.19 + l4_addr_t caps_start = (l4_addr_t) stack_env_cap;
1.20 + l4_umword_t *stack_element = (l4_umword_t *) stack_env_cap;
1.21 +
1.22 + /* Populate stack with argument values. */
1.23 +
1.24 + char *stack_arg = (char *) stack_element;
1.25 +
1.26 + stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[0]) - 1, sizeof(l4_umword_t));
1.27 +
1.28 + memset(stack_arg, 0, (char *) stack_element - stack_arg);
1.29 + memcpy(stack_arg, argv[0], strlen(argv[0]));
1.30 +
1.31 + printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg));
1.32 +
1.33 + stack_element = (l4_umword_t *) stack_arg;
1.34 +
1.35 + /* Loader flags, debugging flags, and the KIP capability index.
1.36 + See: generate_l4aux in Remote_app_model */
1.37 +
1.38 + *(--stack_element) = 0;
1.39 + *(--stack_element) = 0;
1.40 + *(--stack_element) = 0x14 << L4_CAP_SHIFT;
1.41 +
1.42 + printf("Stack L4 aux elements: %p / %lx\n", stack_element, stack.region_address((char *) stack_element));
1.43 +
1.44 + /* Populate stack with standard capabilities. */
1.45 +
1.46 + l4re_env_t *env = (l4re_env_t *) stack_element;
1.47 +
1.48 + env--;
1.49 + env->factory = L4_BASE_FACTORY_CAP;
1.50 + env->main_thread = L4_BASE_THREAD_CAP;
1.51 + env->log = L4_BASE_LOG_CAP;
1.52 + env->scheduler = L4_BASE_SCHEDULER_CAP;
1.53 + env->rm = 0x11 << L4_CAP_SHIFT;
1.54 + env->mem_alloc = 0x12 << L4_CAP_SHIFT;
1.55 + env->first_free_cap = 0x15;
1.56 + env->caps = (l4re_env_cap_entry_t *) (stack.region_address(caps_start));
1.57 + env->utcb_area = utcb_fpage;
1.58 + env->first_free_utcb = l4_fpage_memaddr(utcb_fpage) + L4_UTCB_OFFSET;
1.59 +
1.60 + stack_element = (l4_umword_t *) env;
1.61 +
1.62 + /* Populate stack with AUXV. */
1.63 +
1.64 + /* AUXV NULL. */
1.65 +
1.66 + *(--stack_element) = 0;
1.67 + *(--stack_element) = 0;
1.68 +
1.69 + /* L4Re global environment pointer. */
1.70 +
1.71 + *(--stack_element) = stack.region_address((char *) env);
1.72 + *(--stack_element) = 0xf1;
1.73 +
1.74 + /* Apparently required entries. */
1.75 +
1.76 + *(--stack_element) = L4_PAGESIZE;
1.77 + *(--stack_element) = AT_PAGESZ;
1.78 +
1.79 + *(--stack_element) = 0;
1.80 + *(--stack_element) = AT_UID;
1.81 +
1.82 + *(--stack_element) = 0;
1.83 + *(--stack_element) = AT_EUID;
1.84 +
1.85 + *(--stack_element) = 0;
1.86 + *(--stack_element) = AT_GID;
1.87 +
1.88 + *(--stack_element) = 0;
1.89 + *(--stack_element) = AT_EGID;
1.90 +
1.91 + l4_addr_t stack_data_end = (l4_addr_t) stack_element;
1.92 +
1.93 + printf("Stack L4 data: %lx / %lx\n", stack_data_end, stack.region_address(stack_data_end));
1.94 +
1.95 + /* No environment pointers. */
1.96 +
1.97 + *(--stack_element) = 0;
1.98 +
1.99 + /* Populate stack with argument pointers and count. */
1.100 + /* NOTE: Just one argument currently. */
1.101 +
1.102 + *(--stack_element) = 0;
1.103 + *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg));
1.104 + *(--stack_element) = argc;
1.105 +
1.106 + char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL);
1.107 +
1.108 + /* Adjust the stack alignment. */
1.109 +
1.110 + if (stack_adjusted != (char *) stack_element)
1.111 + memmove(stack_adjusted, (const void *) stack_element, stack_data_end - (l4_addr_t) stack_element);
1.112 +
1.113 + l4_umword_t *stack_adjusted_element = (l4_umword_t *) stack_adjusted;
1.114 +
1.115 + printf("%ld %lx %lx\n", stack_adjusted_element[0], stack_adjusted_element[1], stack_adjusted_element[2]);
1.116 +
1.117 + l4_addr_t stack_start = stack.region_address(stack_adjusted);
1.118 +
1.119 + printf("Stack L4 start: %p / %lx\n", stack_adjusted, stack.region_address(stack_adjusted));
1.120 +
1.121 + return stack_start;
1.122 +}
1.123 +
1.124 +
1.125 +
1.126 static ExecPager exec_pager;
1.127
1.128 static void init_pager(ipc_server_config_type *config)
1.129 @@ -548,117 +667,9 @@
1.130
1.131 printf("KIP at %lx.\n", kip_start);
1.132
1.133 - /* Populate stack with additional capabilities. */
1.134 -
1.135 - l4re_env_cap_entry_t *stack_env_cap = (l4re_env_cap_entry_t *) (stack.buf + stack.size);
1.136 -
1.137 - /* Special invalid/terminating environment capability entry. */
1.138 -
1.139 - *(--stack_env_cap) = l4re_env_cap_entry_t();
1.140 -
1.141 - printf("Stack region end: %p\n", stack_env_cap);
1.142 -
1.143 - l4_addr_t caps_start = (l4_addr_t) stack_env_cap;
1.144 - l4_umword_t *stack_element = (l4_umword_t *) stack_env_cap;
1.145 -
1.146 - /* Populate stack with argument values. */
1.147 -
1.148 - char *stack_arg = (char *) stack_element;
1.149 -
1.150 - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[1]) - 1, sizeof(l4_umword_t));
1.151 -
1.152 - memset(stack_arg, 0, (char *) stack_element - stack_arg);
1.153 - memcpy(stack_arg, argv[1], strlen(argv[1]));
1.154 -
1.155 - printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg));
1.156 -
1.157 - stack_element = (l4_umword_t *) stack_arg;
1.158 -
1.159 - /* Loader flags, debugging flags, and the KIP capability index.
1.160 - See: generate_l4aux in Remote_app_model */
1.161 -
1.162 - *(--stack_element) = 0;
1.163 - *(--stack_element) = 0;
1.164 - *(--stack_element) = 0x14 << L4_CAP_SHIFT;
1.165 -
1.166 - printf("Stack L4 aux elements: %p / %lx\n", stack_element, stack.region_address((char *) stack_element));
1.167 -
1.168 - /* Populate stack with standard capabilities. */
1.169 -
1.170 - l4re_env_t *env = (l4re_env_t *) stack_element;
1.171 -
1.172 - env--;
1.173 - env->factory = L4_BASE_FACTORY_CAP;
1.174 - env->main_thread = L4_BASE_THREAD_CAP;
1.175 - env->log = L4_BASE_LOG_CAP;
1.176 - env->scheduler = L4_BASE_SCHEDULER_CAP;
1.177 - env->rm = 0x11 << L4_CAP_SHIFT;
1.178 - env->mem_alloc = 0x12 << L4_CAP_SHIFT;
1.179 - env->first_free_cap = 0x15;
1.180 - env->caps = (l4re_env_cap_entry_t *) (stack.region_address(caps_start));
1.181 - env->utcb_area = utcb_fpage;
1.182 - env->first_free_utcb = utcb_start + L4_UTCB_OFFSET;
1.183 -
1.184 - stack_element = (l4_umword_t *) env;
1.185 -
1.186 - /* Populate stack with AUXV. */
1.187 + /* Populate the stack with argument and environment details. */
1.188
1.189 - /* AUXV NULL. */
1.190 -
1.191 - *(--stack_element) = 0;
1.192 - *(--stack_element) = 0;
1.193 -
1.194 - /* L4Re global environment pointer. */
1.195 -
1.196 - *(--stack_element) = stack.region_address((char *) env);
1.197 - *(--stack_element) = 0xf1;
1.198 -
1.199 - /* Apparently required entries. */
1.200 -
1.201 - *(--stack_element) = L4_PAGESIZE;
1.202 - *(--stack_element) = AT_PAGESZ;
1.203 -
1.204 - *(--stack_element) = 0;
1.205 - *(--stack_element) = AT_UID;
1.206 -
1.207 - *(--stack_element) = 0;
1.208 - *(--stack_element) = AT_EUID;
1.209 -
1.210 - *(--stack_element) = 0;
1.211 - *(--stack_element) = AT_GID;
1.212 -
1.213 - *(--stack_element) = 0;
1.214 - *(--stack_element) = AT_EGID;
1.215 -
1.216 - l4_addr_t stack_data_end = (l4_addr_t) stack_element;
1.217 -
1.218 - printf("Stack L4 data: %lx / %lx\n", stack_data_end, stack.region_address(stack_data_end));
1.219 -
1.220 - /* No environment pointers. */
1.221 -
1.222 - *(--stack_element) = 0;
1.223 -
1.224 - /* Populate stack with argument pointers and count. */
1.225 - /* NOTE: Just one argument currently. */
1.226 -
1.227 - *(--stack_element) = 0;
1.228 - *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg));
1.229 - *(--stack_element) = 1;
1.230 -
1.231 - char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL);
1.232 -
1.233 - /* Adjust the stack alignment. */
1.234 -
1.235 - if (stack_adjusted != (char *) stack_element)
1.236 - memmove(stack_adjusted, (const void *) stack_element, stack_data_end - (l4_addr_t) stack_element);
1.237 -
1.238 - l4_umword_t *stack_adjusted_element = (l4_umword_t *) stack_adjusted;
1.239 -
1.240 - printf("%ld %lx %lx\n", stack_adjusted_element[0], stack_adjusted_element[1], stack_adjusted_element[2]);
1.241 -
1.242 - l4_addr_t stack_start = stack.region_address(stack_adjusted);
1.243 -
1.244 - printf("Stack L4 start: %p / %lx\n", stack_adjusted, stack.region_address(stack_adjusted));
1.245 + l4_addr_t stack_start = populate_stack(stack, argc - 1, argv + 1, utcb_fpage);
1.246
1.247 /* Create a new task and thread. */
1.248