ref: 4f64a0294ee182f54c5ec341ab13163f43038af0
dir: /posix-arm/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("r0") = entry;
register Tos *r1 asm("r1") = _tos;
register int r2 asm("r2") = argc;
register char **r3 asm("r3") = argv;
__asm__ __volatile__ (
// Load values into registers
"mov r0, %0\n\t"
"mov r1, %1\n\t"
"mov r2, %2\n\t"
"mov r3, %3\n\t"
#ifdef ARMV5
// ARMv5 specific code
// push argv onto stack
"mov r4, r2\n\t"
"add r4, r4, #1\n\t"
"lsl r4, r4, #2\n\t"
"sub sp, sp, r4\n\t"
"mov r5, sp\n\t"
"cpy r6, r3\n\t"
"copy_argv_loop:\n\t"
"ldr r7, [r6], #4\n\t"
"str r7, [r5], #4\n\t"
"subs r4, r4, #1\n\t"
"bne copy_argv_loop\n\t"
// push argc onto stack
"sub sp, sp, #4\n\t"
"str r2, [sp]\n\t"
#else
// Generic ARM code
// push argv onto stack
"ldr r4, [r3]\n\t"
"add r4, r4, #1\n\t"
"lsl r4, r4, #2\n\t"
"sub sp, sp, r4\n\t"
"mov r5, sp\n\t"
"cpy r6, r3\n\t"
"copy_argv_loop:\n\t"
"ldr r7, [r6], #4\n\t"
"str r7, [r5], #4\n\t"
"subs r4, r4, #1\n\t"
"bne copy_argv_loop\n\t"
// push argc onto stack
"sub sp, sp, #4\n\t"
"str r2, [sp]\n\t"
#endif
// jump to entry point
"mov lr, r0\n\t"
"bx lr\n\t"
"nop\n\t"
:
: "r" (r0), "r" (r1), "r" (r2), "r" (r3)
: "r4", "r5", "r6", "r7"
);
}