shithub: drawcpu

ref: ed92e5c04403ed8f187510a1d6484df2a213c490
dir: /posix-amd64/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 rdi asm("rdi") = entry;
    register Tos *rsi asm("rsi") = _tos;
    register int edx asm("edx") = argc;
    register char **rcx asm("rcx") = argv;

    __asm__ (
        // Load values into registers
        "mov rdi, %0\n\t"
        "mov rsi, %1\n\t"
        "mov edx, %2\n\t"
        "mov rcx, %3\n\t"

        // push argv onto stack
        "mov r8, rdx\n\t"
        "add r8, r8, 1\n\t"
        "shl r8, r8, 3\n\t"
        "sub rsp, r8\n\t"
        "mov r9, rsp\n\t"
        "rep movsb\n\t"

        // push argc onto stack
        "mov [rsp], edx\n\t"
        "sub rsp, 8\n\t"

        // jump to entry point
        "jmp rdi\n\t"
        "nop\n\t"

        :
        : "r" (rdi), "r" (rsi), "r" (edx), "r" (rcx)
        : "r8", "r9"
    );
}