| /* |
| * Copyright 2019, Data61 |
| * Commonwealth Scientific and Industrial Research Organisation (CSIRO) |
| * ABN 41 687 119 230. |
| * |
| * This software may be distributed and modified according to the terms of |
| * the BSD 2-Clause license. Note that NO WARRANTY is provided. |
| * See "LICENSE_BSD2.txt" for details. |
| * |
| * @TAG(DATA61_BSD) |
| */ |
| #include <sel4runtime.h> |
| #include <sel4runtime/start.h> |
| |
| /* |
| * This function is simply passed a pointer to the inital stack from the |
| * C runtime entrypoint. |
| * |
| * The stack has the following structure: |
| * |
| * * argument count, |
| * * array of argument pointers, |
| * * an empty string, |
| * * array of environment pointers, |
| * * a null terminator, |
| * * array of auxiliary vector entries, |
| * * an 'zero' auxiliary vector, then |
| * * unspecified data. |
| */ |
| void __sel4_start_c(void const *stack) |
| { |
| // First word on the stack is argument count. |
| unsigned long argc = *((unsigned long const *) stack); |
| |
| // Second word on the stack is the start of the argument vector. |
| char const *const *argv = &((char const * const *) stack)[1]; |
| |
| // The environment pointer vector follows after the argv. |
| char const *const *envp = &argv[argc + 1]; |
| int envc = 0; |
| while (envp[envc] != SEL4RUNTIME_NULL) { |
| envc++; |
| } |
| |
| |
| // The auxiliary vector follows the environment pointer vector. |
| auxv_t const *auxv = (void const *)(&envp[envc + 1]); |
| |
| __sel4runtime_start_main(main, argc, argv, envp, auxv); |
| } |