ref: 1e20174e3d54631d81b0ab310bef356e01179ad5
dir: /posix-amd64/start.c/
#include "u.h"
#include "libc.h"
void start(uintptr_t entry, Tos *_tos, int argc, char *argv[]) {
// entry point
register uintptr_t rdi asm("rdi") = entry;
register Tos *rsi asm("rsi") = _tos;
register int edx asm("edx") = argc;
register char **rcx asm("rcx") = argv;
__asm__ (
// Load values into registers
"mov rdi, %0\n\t"
"mov rsi, %1\n\t"
"mov edx, %2\n\t"
"mov rcx, %3\n\t"
// push argv onto stack
"mov r8, rdx\n\t"
"add r8, r8, 1\n\t"
"shl r8, r8, 3\n\t"
"sub rsp, r8\n\t"
"mov r9, rsp\n\t"
"rep movsb\n\t"
// push argc onto stack
"mov [rsp], edx\n\t"
"sub rsp, 8\n\t"
// jump to entry point
"jmp rdi\n\t"
"nop\n\t"
:
: "r" (rdi), "r" (rsi), "r" (edx), "r" (rcx)
: "r8", "r9"
);
}