shithub: drawcpu

ref: 9b8e21a6669c6312809b174220fca59728cbb68b
dir: /posix-386/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 ebx asm("ebx") = entry;
    register Tos *ecx asm("ecx") = _tos;
    register int edx asm("edx") = argc;
    register char **esi asm("esi") = argv;

    __asm__ (
        // Load values into registers
        "mov ebx, %0\n\t"
        "mov ecx, %1\n\t"
        "mov edx, %2\n\t"
        "mov esi, %3\n\t"

        // push argv onto stack
        "mov edi, edx\n\t"
        "inc edi\n\t"
        "shl edi, 2\n\t"
        "sub esp, edi\n\t"
        "mov edi, esp\n\t"
        "rep movsb\n\t"

        // push argc onto stack
        "mov [esp], edx\n\t"
        "sub esp, 4\n\t"

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

        :
        : "r" (ebx), "r" (ecx), "r" (edx), "r" (esi)
        : "edi"
    );
}