#include "calls.h" extern char __bss[], __bss_end[], __stack_top[]; __attribute__((section(".text.boot"))) __attribute__((naked)) void boot(void) { __asm__ __volatile__ ( "mv sp, %[stack_top]\n" "j kernel_main\n" : : [stack_top] "r" (__stack_top) ); } sbiret sbi_call(long arg0, long arg1, long arg2, long arg3, long arg4, long arg5, long fid, long eid) { register long a0 __asm__("a0") = arg0; register long a1 __asm__("a1") = arg1; register long a2 __asm__("a2") = arg2; register long a3 __asm__("a3") = arg3; register long a4 __asm__("a4") = arg4; register long a5 __asm__("a5") = arg5; register long a6 __asm__("a6") = fid; register long a7 __asm__("a7") = eid; __asm__ __volatile__ ("ecall" : "=r"(a0), "=r"(a1) : "r"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5), "r"(a6), "r"(a7) : "memory"); return (sbiret){ .error = a0, .value = a1 }; } void putchar(char ch) { sbi_call(ch, 0, 0, 0, 0, 0, 0, 0x1 /* Console Putchar */); } int getchar(void) { sbiret r = sbi_call(0, 0, 0, 0, 0, 0, 0, 0x2); return r.error; } void sbi_shutdown(void) { sbi_call(0, 0, 0, 0, 0, 0, 0, 0x8); } sbiret sbi_get_impl_id(void) { return sbi_call(0, 0, 0, 0, 0, 0, 0x1, 0x10); } sbiret sbi_get_spec_version(void) { return sbi_call(0, 0, 0, 0, 0, 0, 0x2, 0x10); } sbiret sbi_hart_stop(void) { return sbi_call(0, 0, 0, 0, 0, 0, 0x1, 0x48534D); } sbiret sbi_hart_get_status(unsigned long hartid) { return sbi_call(hartid, 0, 0, 0, 0, 0, 0x2, 0x48534D); }