shithub: drawcpu

ref: 9b8e21a6669c6312809b174220fca59728cbb68b
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[]) {
    // entry point
    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__ (
        // 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_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, #16\n\t"
        "str w2, [sp, #8]\n\t"

        // jump to entry point
        "br x0\n\t"
        "nop\n\t"

        :
        : "r" (r0), "r" (r1), "r" (r2), "r" (r3)
        : "x4", "x5", "x6", "x7"
    );
}