# HG changeset patch # User Paul Boddie # Date 1651440309 -7200 # Node ID db518b1b88d7922bf08781fb6ab753726f3ca345 # Parent 62821ff693bfdd5d0c5c76d17752f8dfc5d6c16d Fixed or improved stack initialisation. diff -r 62821ff693bf -r db518b1b88d7 tests/dstest_exec.cc --- a/tests/dstest_exec.cc Sun May 01 23:24:28 2022 +0200 +++ b/tests/dstest_exec.cc Sun May 01 23:25:09 2022 +0200 @@ -27,6 +27,8 @@ #include #include +#include + #include #include #include @@ -138,13 +140,15 @@ return L4_EOK; } +#define DEBUG 0 + /* Handle a page fault using any configured regions. */ long ExecPager::page_fault(l4_umword_t pfa, l4_umword_t pc, l4_snd_fpage_t *region) { l4_umword_t addr = pfa & ~7UL, flags = pfa & 7; -#if 0 +#if DEBUG printf("page_fault(%lx, %lx) -> %lx (%lx) -> ", pfa, pc, addr, flags); #endif @@ -167,7 +171,7 @@ region->fpage = l4_fpage(r.start + (page_addr - r.map_start), L4_PAGESHIFT, r.flags); region->snd_base = page_addr; -#if 0 +#if DEBUG printf("%lx...%lx from %lx...%lx size %d rights %x\n", r.map_start, region->snd_base, r.start, l4_fpage_memaddr(region->fpage), @@ -184,7 +188,7 @@ return L4_EOK; } -#if 0 +#if DEBUG printf("not mapped!\n"); #endif @@ -198,7 +202,7 @@ long ExecPager::attach(address_t *start, offset_t size, map_flags_t flags, l4_cap_idx_t ds, address_t offset, unsigned char align) { -#if 0 +#if DEBUG printf("attach(%lx, %ld, %lx, ..., %lx, %d)\n", *start, size, flags, offset, align); #endif @@ -219,7 +223,7 @@ if (!region_start) region_start += increment; -#if 0 +#if DEBUG printf("-> search from %lx -> %lx...\n", *start, region_start); #endif @@ -277,7 +281,7 @@ l4_touch_rw((const void *) ds_start, size); -#if 0 +#if DEBUG printf("-> added region for %lx size %ld (%d)\n", region_start, region_size, page_order(region_size)); #endif @@ -401,9 +405,12 @@ /* Copy the payload regions to new dataspaces. NOTE: This should be directed by the ELF metadata. */ + address_t program_region_base = 0x1000000; + address_t program_start = 0x1000af3; + char *program_buf; offset_t nread; - offset_t program_region_contents = 0x28466; + offset_t program_region_contents = 0x282ae; offset_t program_region_size = round(program_region_contents, L4_PAGESIZE); l4re_ds_t program_region_ds; @@ -420,18 +427,19 @@ printf("Read %ld from file into %p.\n", nread, program_buf); - if (memcmp(program_buf + 0xae3, "\x31\xed", 2)) + if (memcmp(program_buf + program_start - program_region_base, "\x31\xed", 2)) { printf("Did not find expected instructions at start.\n"); return 1; } - offset_t data_region_start = 0x102a360; + offset_t data_region_start = 0x1029360; offset_t data_region_size = round(0x8068, L4_PAGESIZE); offset_t data_region_base = trunc(data_region_start, L4_PAGESIZE); offset_t data_region_offset = data_region_start - data_region_base; char *data_buf; + offset_t data_file_offset = 0x28360; offset_t data_region_contents = 0x2058; l4re_ds_t data_region_ds; @@ -446,7 +454,7 @@ memset(data_buf, 0, data_region_size); - client_seek(file, 0x29360, SEEK_SET); + client_seek(file, data_file_offset, SEEK_SET); nread = client_read(file, data_buf + data_region_offset, data_region_contents); printf("Read %ld from file into %p in region %p with size %ld for %lx.\n", @@ -499,6 +507,19 @@ 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, ((l4_addr_t) stack_arg - stack_buf) + stack_region_base); + + stack_element = (l4_umword_t *) stack_arg; + /* Loader flags, debugging flags, and the KIP capability index. See: generate_l4aux in Remote_app_model */ @@ -524,11 +545,9 @@ env->utcb_area = utcb_fpage; env->first_free_utcb = utcb_start + L4_UTCB_OFFSET; - /* Populate stack with AUXV and environment pointer. */ - stack_element = (l4_umword_t *) env; - printf("Stack L4 env elements: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base); + /* Populate stack with AUXV. */ /* AUXV NULL. */ @@ -557,37 +576,35 @@ *(--stack_element) = 0; *(--stack_element) = AT_EGID; - char *stack_envp = (char *) stack_element; - - printf("Stack L4 envp: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base); + l4_addr_t stack_data_end = (l4_addr_t) stack_element; - /* Populate stack with argument values. */ - - char *stack_arg = stack_envp; - - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[1]) - 1, sizeof(l4_umword_t)); + printf("Stack L4 data: %lx / %lx\n", stack_data_end, (stack_data_end - stack_buf) + stack_region_base); - memset(stack_arg, 0, stack_envp - stack_arg); - memcpy(stack_arg, argv[1], strlen(argv[1])); - - printf("Stack L4 program argument: %p / %lx\n", stack_arg, ((l4_addr_t) stack_arg - stack_buf) + stack_region_base); + /* No environment pointers. */ - /* Populate stack with the environment pointer. */ - - stack_element = (l4_umword_t *) stack_arg; - - *(--stack_element) = (l4_umword_t) ((l4_addr_t) stack_envp - stack_buf) + stack_region_base; + *(--stack_element) = 0; /* Populate stack with argument pointers and count. */ /* NOTE: Just one argument currently. */ + *(--stack_element) = 0; *(--stack_element) = (l4_umword_t) ((l4_addr_t) stack_arg - stack_buf) + stack_region_base; *(--stack_element) = 1; - printf("Stack L4 start: %p / %lx\n", stack_element, ((l4_addr_t) stack_element - stack_buf) + stack_region_base); - printf("%ld %lx %lx\n", stack_element[0], stack_element[1], stack_element[2]); + 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_addr_t stack_start = ((l4_addr_t) stack_element - stack_buf) + stack_region_base; + 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 = ((l4_addr_t) stack_adjusted - stack_buf) + stack_region_base; + + printf("Stack L4 start: %p / %lx\n", stack_adjusted, ((l4_addr_t) stack_adjusted - stack_buf) + stack_region_base); /* Create a new task and thread. */ @@ -618,7 +635,7 @@ init_pager(&config); - exec_pager.add(Region((l4_addr_t) program_buf, page_order(program_region_size), L4_FPAGE_RX, 0x1000000)); + exec_pager.add(Region((l4_addr_t) program_buf, page_order(program_region_size), L4_FPAGE_RX, program_region_base)); exec_pager.add(Region((l4_addr_t) data_buf, page_order(data_region_size), L4_FPAGE_RW, data_region_base)); exec_pager.add(Region((l4_addr_t) stack_buf, page_order(stack_size), L4_FPAGE_RW, stack_region_base)); @@ -696,7 +713,7 @@ printf("Stack at 0x%lx mapped to region at 0x%lx.\n", stack_start, stack_region_base); - err = l4_error(l4_thread_ex_regs(thread, 0x1000ae3, stack_start, 0)); + err = l4_error(l4_thread_ex_regs(thread, program_start, stack_start, 0)); if (err) {