shithub: drawcpu

ref: 4f64a0294ee182f54c5ec341ab13163f43038af0
dir: /posix-power/start.c/

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

void start() {
    // entry point
    register int argc asm("r3");
    register int _tos asm("r4");
    register int argv asm("r5");
    register int sp asm("r6");

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

        // push argv onto stack
        "mr r4, r3\n\t"
        "addi r4, r4, 1\n\t"
        "slwi r4, r4, 2\n\t"
        "subi sp, sp, r4\n\t"
        "mr r4, sp\n\t"
        "mr r5, r5\n\t"
        "mr r6, r4\n\t"

    "copy_argv_loop:\n\t"
        "lwz r7, 0(r5)\n\t"
        "stw r7, 0(r6)\n\t"
        "addi r5, r5, 4\n\t"
        "addi r6, r6, 4\n\t"
        "addi r3, r3, -1\n\t"
        "cmpwi r3, 0\n\t"
        "bne copy_argv_loop\n\t"

        // push argc onto stack
        "subi sp, sp, 4\n\t"
        "stw r4, 0(sp)\n\t"

        // jump to entry point
        "mtctr r3\n\t"
        "bctr\n\t"
        "nop\n\t"

        :
        : "r" (argc), "r" (_tos), "r" (argv), "r" (sp)
        : "r4", "r5", "r6", "r7"
    );
}