ref: 775400b52c5b473fe1528f3e31283fcfb730c18a
dir: /posix-arm64/start.c/
#include "u.h"
#include "libc.h"
void start(uintptr_t entry, Tos *_tos, int argc, char *argv[]) {
// entry point
register uintptr_t r0 asm("x0") = entry;
register Tos *r1 asm("x1") = _tos;
register int r2 asm("w2") = argc;
register char **r3 asm("x3") = argv;
__asm__ (
// Load values into registers
"mov x0, %0\n\t"
"mov x1, %1\n\t"
"mov w2, %w2\n\t"
"mov x3, %3\n\t"
// push argv onto stack
"mov x4, x2\n\t"
"add x4, x4, #1\n\t"
"lsl x4, x4, #3\n\t"
"sub sp, sp, x4\n\t"
"mov x5, sp\n\t"
"mov x6, x3\n\t"
"copy_argv_loop:\n\t"
"ldr x7, [x6], #8\n\t"
"str x7, [x5], #8\n\t"
"subs x4, x4, #1\n\t"
"bne copy_argv_loop\n\t"
// push argc onto stack
"sub sp, sp, #16\n\t"
"str w2, [sp, #8]\n\t"
// jump to entry point
"br x0\n\t"
"nop\n\t"
:
: "r" (r0), "r" (r1), "r" (r2), "r" (r3)
: "x4", "x5", "x6", "x7"
);
}