1.1 --- a/conf/dstest_exec.cfg Tue May 03 00:51:20 2022 +0200
1.2 +++ b/conf/dstest_exec.cfg Tue May 03 01:01:30 2022 +0200
1.3 @@ -47,4 +47,4 @@
1.4 },
1.5 log = { "client", "g" },
1.6 },
1.7 - "rom/dstest_exec", "home/paulb/dstest_exec_payload");
1.8 + "rom/dstest_exec", "home/paulb/dstest_exec_payload", "hello", "world");
2.1 --- a/test_files/programs/exec_payload.c Tue May 03 00:51:20 2022 +0200
2.2 +++ b/test_files/programs/exec_payload.c Tue May 03 01:01:30 2022 +0200
2.3 @@ -25,7 +25,13 @@
2.4
2.5 int main(int argc, char *argv[])
2.6 {
2.7 + int i;
2.8 +
2.9 printf("Hello from %s (%d)!\n", argc > 0 ? argv[0] : "exec_payload.c", argc);
2.10 +
2.11 + for (i = 0; i < argc; i++)
2.12 + printf("Arg #%d: %s\n", i, argv[i]);
2.13 +
2.14 return 0;
2.15 }
2.16
3.1 --- a/tests/dstest_exec.cc Tue May 03 00:51:20 2022 +0200
3.2 +++ b/tests/dstest_exec.cc Tue May 03 01:01:30 2022 +0200
3.3 @@ -413,13 +413,20 @@
3.4 /* Populate stack with argument values. */
3.5
3.6 char *stack_arg = (char *) stack_element;
3.7 + char *stack_arg_top = stack_arg;
3.8 + int arg;
3.9
3.10 - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[0]) - 1, sizeof(l4_umword_t));
3.11 + for (arg = argc - 1; arg >= 0; arg--)
3.12 + {
3.13 + char *stack_arg_last = stack_arg;
3.14
3.15 - memset(stack_arg, 0, (char *) stack_element - stack_arg);
3.16 - memcpy(stack_arg, argv[0], strlen(argv[0]));
3.17 + stack_arg -= round(strlen(argv[arg]) + 1, sizeof(l4_umword_t));
3.18
3.19 - printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg));
3.20 + memset(stack_arg, 0, stack_arg_last - stack_arg);
3.21 + memcpy(stack_arg, argv[arg], strlen(argv[arg]));
3.22 +
3.23 + printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg));
3.24 + }
3.25
3.26 stack_element = (l4_umword_t *) stack_arg;
3.27
3.28 @@ -488,10 +495,17 @@
3.29 *(--stack_element) = 0;
3.30
3.31 /* Populate stack with argument pointers and count. */
3.32 - /* NOTE: Just one argument currently. */
3.33
3.34 *(--stack_element) = 0;
3.35 - *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg));
3.36 +
3.37 + stack_arg = stack_arg_top;
3.38 +
3.39 + for (arg = argc - 1; arg >= 0; arg--)
3.40 + {
3.41 + stack_arg -= round(strlen(argv[arg]) + 1, sizeof(l4_umword_t));
3.42 + *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg));
3.43 + }
3.44 +
3.45 *(--stack_element) = argc;
3.46
3.47 char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL);
3.48 @@ -616,9 +630,9 @@
3.49 /* Copy the payload regions to new dataspaces.
3.50 NOTE: This should be directed by the ELF metadata. */
3.51
3.52 - address_t program_start = 0x1000af3;
3.53 + address_t program_start = 0x1000b43;
3.54
3.55 - Segment program(0x1000000, 0x282ae, L4_FPAGE_RWX, 0, 0x282ae);
3.56 + Segment program(0x1000000, 0x28326, L4_FPAGE_RWX, 0, 0x28326);
3.57 Segment data(0x1029360, 0x8068, L4_FPAGE_RW, 0x28360, 0x2058);
3.58 Segment stack(0x80000000, 16 * L4_PAGESIZE, L4_FPAGE_RW);
3.59 Segment *segments[] = {&program, &data, &stack, NULL};