// hello.c
// Minimal RISC-V Linux program without the C library.
// It uses direct system calls via the ECALL instruction.
//
// System call numbers for RISC-V Linux:
//   __NR_write = 64
//   __NR_exit  = 93
//
// Compile this program with: 
//   riscv64-unknown-elf-gcc -nostdlib -static -O2 -o hello hello.c

// _start is the entry point when not using the standard C runtime.
void _start() {
    // Define the message to print.
    const char msg[] = "Hello, world!\n";

    // --- Write "Hello, world!\n" to stdout ---
    // For the write(2) system call:
    //   a0: file descriptor (1 for stdout)
    //   a1: pointer to the message
    //   a2: length of the message (without the null terminator)
    //   a7: system call number (__NR_write, which is 64)
    register long a0 asm("a0") = 1;           // file descriptor (stdout)
    register const char *a1 asm("a1") = msg;    // pointer to message
    register long a2 asm("a2") = sizeof(msg) - 1; // message length
    register long a7 asm("a7") = 64;            // syscall number: write
    asm volatile ("ecall" : : "r"(a0), "r"(a1), "r"(a2), "r"(a7));

    // --- Exit the program ---
    // For the exit(2) system call:
    //   a0: exit code (0 for success)
    //   a7: system call number (__NR_exit, which is 93)
    register long exit_code asm("a0") = 0;
    register long a7_exit asm("a7") = 93;       // syscall number: exit
    asm volatile ("ecall" : : "r"(exit_code), "r"(a7_exit));

    // We should never reach this point.
    while (1) {}
}