shithub: drawcpu

ref: 1e20174e3d54631d81b0ab310bef356e01179ad5
dir: /posix-riscv64/start.c/

View raw version
#include "u.h"
#include "libc.h"

void start() {
    // entry point
    register int argc asm("t0");
    register int _tos asm("t1");
    register int argv asm("t2");
    register int sp asm("t3");

    __asm__ (
        // Load values into registers
        "lw %0, argc\n\t"
        "lw %1, _tos\n\t"
        "lw %2, argv\n\t"
        "lw %3, sp\n\t"

        // push argv onto stack
        "mv t4, t0\n\t"
        "addi t4, t4, 1\n\t"
        "slli t4, t4, 2\n\t"
        "sub sp, sp, t4\n\t"
        "mv t4, sp\n\t"
        "mv t5, t2\n\t"
        "mv t6, t4\n\t"

    "copy_argv_loop:\n\t"
        "lw t7, 0(t5)\n\t"
        "sw t7, 0(t6)\n\t"
        "addi t5, t5, 4\n\t"
        "addi t6, t6, 4\n\t"
        "addi t0, t0, -1\n\t"
        "bnez t0, copy_argv_loop\n\t"

        // push argc onto stack
        "addi sp, sp, -4\n\t"
        "sw t3, 0(sp)\n\t"

        // jump to entry point
        "jr t0\n\t"
        "nop\n\t"

        :
        : "r" (argc), "r" (_tos), "r" (argv), "r" (sp)
        : "t4", "t5", "t6", "t7"
    );
}