ref: 1e20174e3d54631d81b0ab310bef356e01179ad5
dir: /posix-riscv64/start.c/
#include "u.h"
#include "libc.h"
void start() {
// entry point
register int argc asm("t0");
register int _tos asm("t1");
register int argv asm("t2");
register int sp asm("t3");
__asm__ (
// Load values into registers
"lw %0, argc\n\t"
"lw %1, _tos\n\t"
"lw %2, argv\n\t"
"lw %3, sp\n\t"
// push argv onto stack
"mv t4, t0\n\t"
"addi t4, t4, 1\n\t"
"slli t4, t4, 2\n\t"
"sub sp, sp, t4\n\t"
"mv t4, sp\n\t"
"mv t5, t2\n\t"
"mv t6, t4\n\t"
"copy_argv_loop:\n\t"
"lw t7, 0(t5)\n\t"
"sw t7, 0(t6)\n\t"
"addi t5, t5, 4\n\t"
"addi t6, t6, 4\n\t"
"addi t0, t0, -1\n\t"
"bnez t0, copy_argv_loop\n\t"
// push argc onto stack
"addi sp, sp, -4\n\t"
"sw t3, 0(sp)\n\t"
// jump to entry point
"jr t0\n\t"
"nop\n\t"
:
: "r" (argc), "r" (_tos), "r" (argv), "r" (sp)
: "t4", "t5", "t6", "t7"
);
}