# HG changeset patch # User Paul Boddie # Date 1651532490 -7200 # Node ID a66c7ca81849b914a505586381d05acabd5e39c4 # Parent 98fe32380aed32f6b3003a674db3e161300b2d99 Introduced support for multiple program arguments. diff -r 98fe32380aed -r a66c7ca81849 conf/dstest_exec.cfg --- a/conf/dstest_exec.cfg Tue May 03 00:51:20 2022 +0200 +++ b/conf/dstest_exec.cfg Tue May 03 01:01:30 2022 +0200 @@ -47,4 +47,4 @@ }, log = { "client", "g" }, }, - "rom/dstest_exec", "home/paulb/dstest_exec_payload"); + "rom/dstest_exec", "home/paulb/dstest_exec_payload", "hello", "world"); diff -r 98fe32380aed -r a66c7ca81849 test_files/programs/exec_payload.c --- a/test_files/programs/exec_payload.c Tue May 03 00:51:20 2022 +0200 +++ b/test_files/programs/exec_payload.c Tue May 03 01:01:30 2022 +0200 @@ -25,7 +25,13 @@ int main(int argc, char *argv[]) { + int i; + printf("Hello from %s (%d)!\n", argc > 0 ? argv[0] : "exec_payload.c", argc); + + for (i = 0; i < argc; i++) + printf("Arg #%d: %s\n", i, argv[i]); + return 0; } diff -r 98fe32380aed -r a66c7ca81849 tests/dstest_exec.cc --- a/tests/dstest_exec.cc Tue May 03 00:51:20 2022 +0200 +++ b/tests/dstest_exec.cc Tue May 03 01:01:30 2022 +0200 @@ -413,13 +413,20 @@ /* Populate stack with argument values. */ char *stack_arg = (char *) stack_element; + char *stack_arg_top = stack_arg; + int arg; - stack_arg = (char *) trunc((offset_t) stack_arg - strlen(argv[0]) - 1, sizeof(l4_umword_t)); + for (arg = argc - 1; arg >= 0; arg--) + { + char *stack_arg_last = stack_arg; - memset(stack_arg, 0, (char *) stack_element - stack_arg); - memcpy(stack_arg, argv[0], strlen(argv[0])); + stack_arg -= round(strlen(argv[arg]) + 1, sizeof(l4_umword_t)); - printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg)); + memset(stack_arg, 0, stack_arg_last - stack_arg); + memcpy(stack_arg, argv[arg], strlen(argv[arg])); + + printf("Stack L4 program argument: %p / %lx\n", stack_arg, stack.region_address(stack_arg)); + } stack_element = (l4_umword_t *) stack_arg; @@ -488,10 +495,17 @@ *(--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_arg = stack_arg_top; + + for (arg = argc - 1; arg >= 0; arg--) + { + stack_arg -= round(strlen(argv[arg]) + 1, sizeof(l4_umword_t)); + *(--stack_element) = (l4_umword_t) (stack.region_address(stack_arg)); + } + *(--stack_element) = argc; char *stack_adjusted = Ldr::adjust_sp((char *) stack_element, NULL); @@ -616,9 +630,9 @@ /* Copy the payload regions to new dataspaces. NOTE: This should be directed by the ELF metadata. */ - address_t program_start = 0x1000af3; + address_t program_start = 0x1000b43; - Segment program(0x1000000, 0x282ae, L4_FPAGE_RWX, 0, 0x282ae); + Segment program(0x1000000, 0x28326, L4_FPAGE_RWX, 0, 0x28326); Segment data(0x1029360, 0x8068, L4_FPAGE_RW, 0x28360, 0x2058); Segment stack(0x80000000, 16 * L4_PAGESIZE, L4_FPAGE_RW); Segment *segments[] = {&program, &data, &stack, NULL};