1.1 --- a/tests/dstest_exec.cc Sun May 01 23:24:28 2022 +0200
1.2 +++ b/tests/dstest_exec.cc Sun May 01 23:25:09 2022 +0200
1.3 @@ -27,6 +27,8 @@
1.4 #include <l4/util/elf.h>
1.5 #include <l4/util/util.h>
1.6
1.7 +#include <l4/libloader/adjust_stack>
1.8 +
1.9 #include <fsclient/client.h>
1.10 #include <ipc/cap_alloc.h>
1.11 #include <ipc/mem_ipc.h>
1.12 @@ -138,13 +140,15 @@
1.13 return L4_EOK;
1.14 }
1.15
1.16 +#define DEBUG 0
1.17 +
1.18 /* Handle a page fault using any configured regions. */
1.19
1.20 long ExecPager::page_fault(l4_umword_t pfa, l4_umword_t pc, l4_snd_fpage_t *region)
1.21 {
1.22 l4_umword_t addr = pfa & ~7UL, flags = pfa & 7;
1.23
1.24 -#if 0
1.25 +#if DEBUG
1.26 printf("page_fault(%lx, %lx) -> %lx (%lx) -> ", pfa, pc, addr, flags);
1.27 #endif
1.28
1.29 @@ -167,7 +171,7 @@
1.30 region->fpage = l4_fpage(r.start + (page_addr - r.map_start), L4_PAGESHIFT, r.flags);
1.31 region->snd_base = page_addr;
1.32
1.33 -#if 0
1.34 +#if DEBUG
1.35 printf("%lx...%lx from %lx...%lx size %d rights %x\n",
1.36 r.map_start, region->snd_base,
1.37 r.start, l4_fpage_memaddr(region->fpage),
1.38 @@ -184,7 +188,7 @@
1.39 return L4_EOK;
1.40 }
1.41
1.42 -#if 0
1.43 +#if DEBUG
1.44 printf("not mapped!\n");
1.45 #endif
1.46
1.47 @@ -198,7 +202,7 @@
1.48 long ExecPager::attach(address_t *start, offset_t size, map_flags_t flags,
1.49 l4_cap_idx_t ds, address_t offset, unsigned char align)
1.50 {
1.51 -#if 0
1.52 +#if DEBUG
1.53 printf("attach(%lx, %ld, %lx, ..., %lx, %d)\n", *start, size, flags, offset, align);
1.54 #endif
1.55
1.56 @@ -219,7 +223,7 @@
1.57 if (!region_start)
1.58 region_start += increment;
1.59
1.60 -#if 0
1.61 +#if DEBUG
1.62 printf("-> search from %lx -> %lx...\n", *start, region_start);
1.63 #endif
1.64
1.65 @@ -277,7 +281,7 @@
1.66
1.67 l4_touch_rw((const void *) ds_start, size);
1.68
1.69 -#if 0
1.70 +#if DEBUG
1.71 printf("-> added region for %lx size %ld (%d)\n", region_start, region_size, page_order(region_size));
1.72 #endif
1.73
1.74 @@ -401,9 +405,12 @@
1.75 /* Copy the payload regions to new dataspaces.
1.76 NOTE: This should be directed by the ELF metadata. */
1.77
1.78 + address_t program_region_base = 0x1000000;
1.79 + address_t program_start = 0x1000af3;
1.80 +
1.81 char *program_buf;
1.82 offset_t nread;
1.83 - offset_t program_region_contents = 0x28466;
1.84 + offset_t program_region_contents = 0x282ae;
1.85 offset_t program_region_size = round(program_region_contents, L4_PAGESIZE);
1.86 l4re_ds_t program_region_ds;
1.87
1.88 @@ -420,18 +427,19 @@
1.89
1.90 printf("Read %ld from file into %p.\n", nread, program_buf);
1.91
1.92 - if (memcmp(program_buf + 0xae3, "\x31\xed", 2))
1.93 + if (memcmp(program_buf + program_start - program_region_base, "\x31\xed", 2))
1.94 {
1.95 printf("Did not find expected instructions at start.\n");
1.96 return 1;
1.97 }
1.98
1.99 - offset_t data_region_start = 0x102a360;
1.100 + offset_t data_region_start = 0x1029360;
1.101 offset_t data_region_size = round(0x8068, L4_PAGESIZE);
1.102 offset_t data_region_base = trunc(data_region_start, L4_PAGESIZE);
1.103 offset_t data_region_offset = data_region_start - data_region_base;
1.104
1.105 char *data_buf;
1.106 + offset_t data_file_offset = 0x28360;
1.107 offset_t data_region_contents = 0x2058;
1.108 l4re_ds_t data_region_ds;
1.109
1.110 @@ -446,7 +454,7 @@
1.111
1.112 memset(data_buf, 0, data_region_size);
1.113
1.114 - client_seek(file, 0x29360, SEEK_SET);
1.115 + client_seek(file, data_file_offset, SEEK_SET);
1.116 nread = client_read(file, data_buf + data_region_offset, data_region_contents);
1.117
1.118 printf("Read %ld from file into %p in region %p with size %ld for %lx.\n",
1.119 @@ -499,6 +507,19 @@
1.120 l4_addr_t caps_start = (l4_addr_t) stack_env_cap;
1.121 l4_umword_t *stack_element = (l4_umword_t *) stack_env_cap;
1.122
1.123 + /* Populate stack with argument values. */
1.124 +
1.125 + char *stack_arg = (char *) stack_element;
1.126 +
1.127 + stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[1]) - 1, sizeof(l4_umword_t));
1.128 +
1.129 + memset(stack_arg, 0, (char *) stack_element - stack_arg);
1.130 + memcpy(stack_arg, argv[1], strlen(argv[1]));
1.131 +
1.132 + printf("Stack L4 program argument: %p / %lx\n", stack_arg, ((l4_addr_t) stack_arg - stack_buf) + stack_region_base);
1.133 +
1.134 + stack_element = (l4_umword_t *) stack_arg;
1.135 +
1.136 /* Loader flags, debugging flags, and the KIP capability index.
1.137 See: generate_l4aux in Remote_app_model */
1.138
1.139 @@ -524,11 +545,9 @@
1.140 env->utcb_area = utcb_fpage;
1.141 env->first_free_utcb = utcb_start + L4_UTCB_OFFSET;
1.142
1.143 - /* Populate stack with AUXV and environment pointer. */
1.144 -
1.145 stack_element = (l4_umword_t *) env;
1.146
1.147 - printf("Stack L4 env elements: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base);
1.148 + /* Populate stack with AUXV. */
1.149
1.150 /* AUXV NULL. */
1.151
1.152 @@ -557,37 +576,35 @@
1.153 *(--stack_element) = 0;
1.154 *(--stack_element) = AT_EGID;
1.155
1.156 - char *stack_envp = (char *) stack_element;
1.157 -
1.158 - printf("Stack L4 envp: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base);
1.159 + l4_addr_t stack_data_end = (l4_addr_t) stack_element;
1.160
1.161 - /* Populate stack with argument values. */
1.162 -
1.163 - char *stack_arg = stack_envp;
1.164 -
1.165 - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[1]) - 1, sizeof(l4_umword_t));
1.166 + printf("Stack L4 data: %lx / %lx\n", stack_data_end, (stack_data_end - stack_buf) + stack_region_base);
1.167
1.168 - memset(stack_arg, 0, stack_envp - stack_arg);
1.169 - memcpy(stack_arg, argv[1], strlen(argv[1]));
1.170 -
1.171 - printf("Stack L4 program argument: %p / %lx\n", stack_arg, ((l4_addr_t) stack_arg - stack_buf) + stack_region_base);
1.172 + /* No environment pointers. */
1.173
1.174 - /* Populate stack with the environment pointer. */
1.175 -
1.176 - stack_element = (l4_umword_t *) stack_arg;
1.177 -
1.178 - *(--stack_element) = (l4_umword_t) ((l4_addr_t) stack_envp - stack_buf) + stack_region_base;
1.179 + *(--stack_element) = 0;
1.180
1.181 /* Populate stack with argument pointers and count. */
1.182 /* NOTE: Just one argument currently. */
1.183
1.184 + *(--stack_element) = 0;
1.185 *(--stack_element) = (l4_umword_t) ((l4_addr_t) stack_arg - stack_buf) + stack_region_base;
1.186 *(--stack_element) = 1;
1.187
1.188 - printf("Stack L4 start: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base);
1.189 - printf("%ld %lx %lx\n", stack_element[0], stack_element[1], stack_element[2]);
1.190 + char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL);
1.191 +
1.192 + /* Adjust the stack alignment. */
1.193 +
1.194 + if (stack_adjusted != (char *) stack_element)
1.195 + memmove(stack_adjusted, (const void *) stack_element, stack_data_end - (l4_addr_t) stack_element);
1.196
1.197 - l4_addr_t stack_start = ((l4_addr_t) stack_element - stack_buf) + stack_region_base;
1.198 + l4_umword_t *stack_adjusted_element = (l4_umword_t *) stack_adjusted;
1.199 +
1.200 + printf("%ld %lx %lx\n", stack_adjusted_element[0], stack_adjusted_element[1], stack_adjusted_element[2]);
1.201 +
1.202 + l4_addr_t stack_start = ((l4_addr_t) stack_adjusted - stack_buf) + stack_region_base;
1.203 +
1.204 + printf("Stack L4 start: %p / %lx\n", stack_adjusted, ((l4_addr_t) stack_adjusted - stack_buf) + stack_region_base);
1.205
1.206 /* Create a new task and thread. */
1.207
1.208 @@ -618,7 +635,7 @@
1.209
1.210 init_pager(&config);
1.211
1.212 - exec_pager.add(Region((l4_addr_t) program_buf, page_order(program_region_size), L4_FPAGE_RX, 0x1000000));
1.213 + exec_pager.add(Region((l4_addr_t) program_buf, page_order(program_region_size), L4_FPAGE_RX, program_region_base));
1.214 exec_pager.add(Region((l4_addr_t) data_buf, page_order(data_region_size), L4_FPAGE_RW, data_region_base));
1.215 exec_pager.add(Region((l4_addr_t) stack_buf, page_order(stack_size), L4_FPAGE_RW, stack_region_base));
1.216
1.217 @@ -696,7 +713,7 @@
1.218
1.219 printf("Stack at 0x%lx mapped to region at 0x%lx.\n", stack_start, stack_region_base);
1.220
1.221 - err = l4_error(l4_thread_ex_regs(thread, 0x1000ae3, stack_start, 0));
1.222 + err = l4_error(l4_thread_ex_regs(thread, program_start, stack_start, 0));
1.223
1.224 if (err)
1.225 {