shithub: drawcpu

ref: 9b8e21a6669c6312809b174220fca59728cbb68b
dir: /posix-arm/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("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"
    );
}