hl-engine 0.1.13

Safe Rust lifecycle API for the standalone HL Linux guest engine
#include <stdint.h>

__attribute__((noreturn, used)) void start(uint64_t *stack) {
    const char *path = (const char *)(uintptr_t)stack[2];
    const char *const arguments[] = {path, 0};
#if defined(__aarch64__)
    register uint64_t x0 __asm__("x0") = (uint64_t)path;
    register uint64_t x1 __asm__("x1") = (uint64_t)arguments;
    register uint64_t x2 __asm__("x2") = 0;
    register uint64_t x8 __asm__("x8") = 221;
    __asm__ volatile("svc #0" : "+r"(x0) : "r"(x1), "r"(x2), "r"(x8) : "memory");
    register uint64_t status __asm__("x0") = x0 == (uint64_t)-2 ? 0 : 99;
    register uint64_t exit_call __asm__("x8") = 93;
    __asm__ volatile("svc #0" : : "r"(status), "r"(exit_call) : "memory");
#elif defined(__x86_64__)
    register uint64_t rax __asm__("rax") = 59;
    register uint64_t rdi __asm__("rdi") = (uint64_t)path;
    register uint64_t rsi __asm__("rsi") = (uint64_t)arguments;
    register uint64_t rdx __asm__("rdx") = 0;
    __asm__ volatile("syscall" : "+r"(rax) : "r"(rdi), "r"(rsi), "r"(rdx) : "rcx", "r11", "memory");
    rdi = rax == (uint64_t)-2 ? 0 : 99;
    rax = 60;
    __asm__ volatile("syscall" : : "r"(rax), "r"(rdi) : "rcx", "r11", "memory");
#else
#error unsupported guest architecture
#endif
    __builtin_unreachable();
}

#if defined(__aarch64__)
__asm__(".global _start\n"
        "_start:\n"
        "mov x0, sp\n"
        "b start");
#elif defined(__x86_64__)
__asm__(".global _start\n"
        "_start:\n"
        "mov %rsp, %rdi\n"
        "jmp start");
#endif