From 1e02ebb0c674ac0705f182905f032f0b3e36c6af Mon Sep 17 00:00:00 2001 From: sam Date: Sat, 26 Apr 2025 22:43:28 +1200 Subject: [PATCH] did something idk --- .../atomic_helpers.h.32E35DD60967E074.idx | Bin 226 -> 0 bytes .../atomic_helpers.h.5A95DDE70BB8C83F.idx | Bin 220 -> 0 bytes .../index/kernel.c.888550018A9D5949.idx | Bin 2204 -> 0 bytes .../index/kernel.c.D9A3E99583D1279A.idx | Bin 2186 -> 0 bytes .gitignore | 1 + Makefile | 2 +- include/atomic_helpers.h | 4 +- include/sbi.h | 31 +++++ src/kernel.c | 111 ++++-------------- src/sbi.c | 27 +++++ 10 files changed, 85 insertions(+), 91 deletions(-) delete mode 100644 .cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx delete mode 100644 .cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx delete mode 100644 .cache/clangd/index/kernel.c.888550018A9D5949.idx delete mode 100644 .cache/clangd/index/kernel.c.D9A3E99583D1279A.idx create mode 100644 include/sbi.h create mode 100644 src/sbi.c diff --git a/.cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx b/.cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx deleted file mode 100644 index c3559f3228cbe096f9be521f23299f34eb7930ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmWIYbaT7Kz`)>~;#rZKT9U{DWD5gvaY<38KalnW;)*%E$2Rgd81S$-h&8=mDcQgq zkRqq5(HHo}z&@t*a;R1~!_6rlmfY}Z+tix;zAX6Pmq(w@Ir2|YE1l!Qby>+ht@cLk z$;<3Vk4hb7D6Y&+0vgFsl$uuT3Z&I`Zgg9*;cg`(7b7zVGY?1#1S~yQ+C9I$avxBb zk%LhJBFMn-GO;k@GlSf7pfDE)7hE;aw46kcn&P75Vr~$FapN`HT&`)MvJ4CWT8=_t diff --git a/.cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx b/.cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx deleted file mode 100644 index bbd4f851b61b884720f4e14139f80e1d5b28d09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmWIYbaT7Hz`)>~;#rZKT9U{DWD5gvaY<387m#)Y;)*%E$2Rgd81S$h&|$eBY|J3N z;6&Aw1ro})4eVn|pT213ZbJDjD!VCt+_!({RQ?}P z;+u*qbCZCEF%+ey6}tjywVfN?R&2Oi$;idX%)!h9k^%us&y{x1Z?D`36lUaLlz<2_ tFuY7G%=pY8_Z%q9#lZzv4Kyt$5u~QLD7ly$#9-Wb%{G^7TBs}o0|58(KP&(M diff --git a/.cache/clangd/index/kernel.c.888550018A9D5949.idx b/.cache/clangd/index/kernel.c.888550018A9D5949.idx deleted file mode 100644 index 5dc4088b8e187da1c05c4ff7bd867b02a639dcaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2204 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 +#include + +#define EID_DEBUG_CONSOLE 0x4442434E +#define EID_TIMER 0x54494D45 + +#define FID_CONSOLE_WRITE 0 +#define FID_SET_TIMER 0 + +typedef struct { + long error; + long value; +} sbiret; + +sbiret sbi_ecall6( + int fid, int eid, size_t arg0, size_t arg1, size_t arg2, size_t arg3, size_t arg4, size_t arg5); + +#define sbi_ecall5(fid, eid, a0, a1, a2, a3, a4) sbi_ecall6(fid, eid, a0, a1, a2, a3, a4, 0) +#define sbi_ecall4(fid, eid, a0, a1, a2, a3) sbi_ecall5(fid, eid, a0, a1, a2, a3, 0) +#define sbi_ecall3(fid, eid, a0, a1, a2) sbi_ecall4(fid, eid, a0, a1, a2, 0) +#define sbi_ecall2(fid, eid, a0, a1) sbi_ecall3(fid, eid, a0, a1, 0) +#define sbi_ecall1(fid, eid, a0) sbi_ecall2(fid, eid, a0, 0) +#define sbi_ecall0(fid, eid) sbi_ecall1(fid, eid, 0) + +sbiret sbi_debug_console_write(const char* str, size_t len); +sbiret sbi_set_timer(uint64_t stime_value); + +#endif diff --git a/src/kernel.c b/src/kernel.c index da45d9a..9e930e2 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,22 +1,16 @@ +#include "atomic_helpers.h" +#include "sbi.h" #include #include #include -#include "atomic_helpers.h" - -#define DEBUG_ECALL 0x4442434E - -typedef struct { - long error; - long value; -} sbiret; void trap_handler(); void trap_handler_wrapper() __attribute__((naked)); void user_entry(); -unsigned long strlen(const char* str) { - unsigned long len = 0; +size_t strlen(const char* str) { + size_t len = 0; while(str[len] != '\0') { len++; } @@ -28,7 +22,7 @@ int main() { csrw(stvec, trap_handler_wrapper); csrw(sepc, user_entry); - unsigned long sstatus = csrr(sstatus); + size_t sstatus = csrr(sstatus); sstatus |= (1 << 5); csrw(sstatus, sstatus); @@ -36,76 +30,17 @@ int main() { } void user_entry(void) { - while(1) { - __asm__ volatile("ecall"); - __asm__ volatile("unimp"); - } -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall6(unsigned long number, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) { - sbiret ret; - - __asm__ volatile("mv a7, %[number]\n" - "li a6, 0\n" - "mv a0, %[arg0]\n" - "mv a1, %[arg1]\n" - "mv a2, %[arg2]\n" - "mv a3, %[arg3]\n" - "mv a4, %[arg4]\n" - "mv a5, %[arg5]\n" - "ecall\n" - "mv %[err], a0\n" - "mv %[val], a1\n" - : [err] "=r"(ret.error), [val] "=r"(ret.value) - : [number] "r"(number), [arg0] "r"(arg0), [arg1] "r"(arg1), -[arg2] "r"(arg2),[arg3] "r"(arg3), [arg4] "r"(arg4),[arg5] "r"(arg5) - : "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7"); - - return ret; -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall5(unsigned long number, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4) { - return sbi_ecall6(number, arg0, arg1, arg2, arg3, arg4, 0); -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall4(unsigned long number, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3) { - return sbi_ecall5(number, arg0, arg1, arg2, arg3, 0); -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall3(unsigned long number, unsigned long arg0, unsigned long arg1, unsigned long arg2) { - return sbi_ecall4(number, arg0, arg1, arg2, 0); -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall2(unsigned long number, unsigned long arg0, unsigned long arg1) { - return sbi_ecall3(number, arg0, arg1, 0); -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall1(unsigned long number, unsigned long arg0) { - return sbi_ecall2(number, arg0, 0); -} - -__attribute__((always_inline)) -inline sbiret sbi_ecall0(unsigned long number) { - return sbi_ecall1(number, 0); -} - -sbiret console_debug_write(const char* str, unsigned long len) { - return sbi_ecall2(DEBUG_ECALL, len, (unsigned long)str); + sbi_set_timer(1000000); + while(1) { } } int puts(const char* str) { sbiret ret; - if((ret = console_debug_write(str, strlen(str))).error != 0) { + if((ret = sbi_debug_console_write(str, strlen(str))).error != 0) { return -1; } - - if((ret = console_debug_write("\n", 1)).error != 0) { + + if((ret = sbi_debug_console_write("\n", 1)).error != 0) { return -1; } return 0; @@ -117,9 +52,9 @@ void trap_handler_wrapper() { } void trap_handler(void) { - unsigned long sepc = csrr(sepc); - unsigned long scause = csrr(scause); - unsigned long sstatus = csrr(sstatus); + size_t sepc = csrr(sepc); + size_t scause = csrr(scause); + size_t sstatus = csrr(sstatus); if(scause == 8) { puts("hello world"); @@ -127,18 +62,18 @@ void trap_handler(void) { sepc += 4; csrw(sepc, sepc); goto exit; - } - - if(((sstatus >> 8) & 1) == 0) { - sepc += 4; - puts("exception occured in usermode, skipping past"); - csrw(sepc, sepc); - goto exit; } else { - puts("exception occured in supervisor mode, panic"); + if(((sstatus >> 8) & 1) == 0) { + sepc += 4; + puts("exception occured in usermode, skipping past"); + csrw(sepc, sepc); + goto exit; + } else { + puts("exception occured in supervisor mode, panic"); - while(1) { - __asm__ volatile("wfi"); + while(1) { + __asm__ volatile("wfi"); + } } } diff --git a/src/sbi.c b/src/sbi.c new file mode 100644 index 0000000..3ec9dcf --- /dev/null +++ b/src/sbi.c @@ -0,0 +1,27 @@ +#include "sbi.h" + +sbiret sbi_ecall6( + int fid, int eid, size_t arg0, size_t arg1, size_t arg2, size_t arg3, size_t arg4, size_t arg5) { + register size_t a0 __asm__("a0") = arg0; + register size_t a1 __asm__("a1") = arg1; + register size_t a2 __asm__("a2") = arg2; + register size_t a3 __asm__("a3") = arg3; + register size_t a4 __asm__("a4") = arg4; + register size_t a5 __asm__("a5") = arg5; + register size_t a6 __asm__("a6") = fid; + register size_t 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 }; +} + +sbiret sbi_debug_console_write(const char* str, size_t len) { + return sbi_ecall2(FID_CONSOLE_WRITE, EID_DEBUG_CONSOLE, len, (size_t)str); +} + +sbiret sbi_set_timer(uint64_t stime_value) { + return sbi_ecall1(FID_SET_TIMER, EID_TIMER, stime_value); +}