shithub: drawcpu

ref: 8df6746590a6bf6ebebbbc5509c6bbf5da889c59
dir: /posix-arm64/start.c/

View raw version
#include "u.h"
#include "libc.h"
void start(uintptr_t entry, Tos *_tos, int argc, char *argv[])
{
    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__ __volatile__ (
                // 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 in at a time
                "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, #4\n\t"
                "str w2, [sp]\n\t"

                // jump to entry point
                "br x0\n\t"
                "ret\n\t"
                :
                : "r"(r0), "r"(r1), "r"(r2), "r"(r3)
                : "x4", "x5", "x6", "x7");
}