ref: 9b8e21a6669c6312809b174220fca59728cbb68b
dir: /posix-power/start.c/
#include "u.h"
#include "libc.h"
void start() {
// entry point
register int argc asm("r3");
register int _tos asm("r4");
register int argv asm("r5");
register int sp asm("r6");
__asm__ (
// Load values into registers
"lwz %0, argc\n\t"
"lwz %1, _tos\n\t"
"lwz %2, argv\n\t"
"lwz %3, sp\n\t"
// push argv onto stack
"mr r4, r3\n\t"
"addi r4, r4, 1\n\t"
"slwi r4, r4, 2\n\t"
"subi sp, sp, r4\n\t"
"mr r4, sp\n\t"
"mr r5, r5\n\t"
"mr r6, r4\n\t"
"copy_argv_loop:\n\t"
"lwz r7, 0(r5)\n\t"
"stw r7, 0(r6)\n\t"
"addi r5, r5, 4\n\t"
"addi r6, r6, 4\n\t"
"addi r3, r3, -1\n\t"
"cmpwi r3, 0\n\t"
"bne copy_argv_loop\n\t"
// push argc onto stack
"subi sp, sp, 4\n\t"
"stw r4, 0(sp)\n\t"
// jump to entry point
"mtctr r3\n\t"
"bctr\n\t"
"nop\n\t"
:
: "r" (argc), "r" (_tos), "r" (argv), "r" (sp)
: "r4", "r5", "r6", "r7"
);
}