From 61e8950b2e59fa247ccdaf0df1d0aaeff49ed7f2 Mon Sep 17 00:00:00 2001 From: sam Date: Sat, 26 Apr 2025 18:24:51 +1200 Subject: [PATCH] first commit --- .../atomic_helpers.h.32E35DD60967E074.idx | Bin 0 -> 226 bytes .../atomic_helpers.h.5A95DDE70BB8C83F.idx | Bin 0 -> 220 bytes .../index/kernel.c.888550018A9D5949.idx | Bin 0 -> 2204 bytes .../index/kernel.c.D9A3E99583D1279A.idx | Bin 0 -> 2186 bytes .clang-format | 25 +++ .gitignore | 3 + Makefile | 34 ++++ include/atomic_helpers.h | 17 ++ linker.ld | 9 ++ src/entry.s | 17 ++ src/kernel.c | 147 ++++++++++++++++++ 11 files changed, 252 insertions(+) create mode 100644 .cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx create mode 100644 .cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx create mode 100644 .cache/clangd/index/kernel.c.888550018A9D5949.idx create mode 100644 .cache/clangd/index/kernel.c.D9A3E99583D1279A.idx create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 include/atomic_helpers.h create mode 100644 linker.ld create mode 100644 src/entry.s create mode 100644 src/kernel.c diff --git a/.cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx b/.cache/clangd/index/atomic_helpers.h.32E35DD60967E074.idx new file mode 100644 index 0000000000000000000000000000000000000000..c3559f3228cbe096f9be521f23299f34eb7930ee GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx b/.cache/clangd/index/atomic_helpers.h.5A95DDE70BB8C83F.idx new file mode 100644 index 0000000000000000000000000000000000000000..bbd4f851b61b884720f4e14139f80e1d5b28d09b GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/kernel.c.888550018A9D5949.idx b/.cache/clangd/index/kernel.c.888550018A9D5949.idx new file mode 100644 index 0000000000000000000000000000000000000000..5dc4088b8e187da1c05c4ff7bd867b02a639dcaf GIT binary patch literal 2204 zcmZuy2~ZPP7=9rev)R0C0wJ2b1c)b=0zw@r7_CP^8&q%#C{kkw1cD-34uObP#X_ap z(E`$G!TYFA>r~V_QZ3$fYAw{G!>FaU<3Tm?Ks@p4+jah|%yeh+Prm*Bw=e(qzHjrs zecZTO7NK`D?WK8HMd=JeNKZe7MFq1~$PfybBUIY3raEz+K2mq0WAo#~eaGDUx>i?Z zxKTAB(Hi~H^q4*R?{}0OB$u`-I@>#YZ<=&|!s^hc&ZkdW%c8!U@%-XmV@y`XGQ)%J zM`TJ}|52Ye4p_6>|FnBw#UD*MnzXj+ozbVtI#of%9|Vl}a{R6ROPae@ZoJQQpVRz1 zFY1%Dn)hm(7M;!*(?3VKV6XC!_T1b{t)bDLt+%foSRYtZG(V!ecYGsTefuZRBzs2r zC?l?0d*PsR=w*tqg|%vY^`hxAiQn;Tkc@BJ{mhWTxzDk(>|Zk4SxYRL52 zpRz%-$F6e>{qty_Q*o)+mL^+^U6VVvH%G?5B)GT<}!$IDxp#qyZ$(K{pC z{<{6)?w_wmFYxr@^!C}6FWWngUYm7m&cmX^zg#$R)pgf-s`;BMYvNm*LdLsI+p6_j zmfd09TGyVxvyap(E{E@T+-)yEV5)elp)9vwa`1z=4KIG&VGez?^y;Rh^~Vy1#SLya zIP+%8a?ge>!&ACyf=hR8)IF0uo@;)F3SD^_dLM*j<2{LrkRUlmAqbITMX@iz3hYZy zO}x5~buCGZtEBXsl+IV=n}|lCF#(;duem(rMLkxdU`lg794i)}ultzJw48m%j!{2K zC-F%}u>ifY+NUhGK6@fY11TNL#~Q@~bYwQ4+4lCf6pZ>)I)P6xiUsKW19|1g_e@R0 zXaJ?{yxk}kpvQ(7H$A+vx(K7bluqSSjbZ`%`P7?b|7_J(ViZVe!Vp$0K+EnkD@HGh zsK;m!rNj6zqga4mzUbSo$rlQDU=&2@EGCN;3((VCUGBEDwMTdq?t_R*rQ*c`^qF{% zdsVF8QH#_I**P&zbTZAm&x@8uPPWHZ?u z9PIhu%dK}(L$xY~m>Dw*b1=lhSYAVcmO!h-SsCkVT#2b902E|Mskt;rLN1HTDxt;f zVl1Ib8CxmyVi-iu^@t88)6~-p(p(wp3u%QVuO@s7$mNBttEhZSB6T=QmZlveubfLfw z1x*`uDcq(@s7oaz_)akLt^3_<{S>wV3He}8wm(J zNbM@TSEL6xd1qf}qD%N(FDl5IlP>fX7R)TP317T^Kr&*x+_6m;G~y&<2{4y>CFo&CwiFQF3Uz?jRd?1j`xhOmLF8{rftV#doyWfA#x#v6I zce>a%e}1hJp?O6%Pg!w=gFy%d(676qe08-1A(adv&yJ6qQ#J>N`_&H~cylPBF!jdm z5U9Rh8?e=+lEBd2XU0HXdW?R19`-0aPAPpUg84CIK=FdG}oH`vHYySM; zz{#WS9p=B^+8BB0qy4L{9<`MArRSad`e^B?SLbfb@^~)}UO#qub+3GMsVVioE#k+S zSBpD#`;QiRYw(EU<+!-yko_%B9vtY6u-lt<*DsE%-KUtoAiH_{b#GnQmx-OaRo^Fn zXsevLYf4LFa+KTh$mFQ+?YzA(dgbB7YqssFbwi$PiAC|< zF`M^EJI?Ig7`5)gH2KB+uI3!<)B4E3Q@>rRXA!R9ca|5%AOGa6Yxv^(fzD=M(^%fv zPnWW<6r4+JnCTln`Nqz&or(=@<_WXy2S;}t8NT!T)b65}dRCOz`u_Q#{aMqj*axpw zcmCF?|10*y%17>)5+_ zCUw_ZHe7exT~$^PAVo;B;9izICRBz|6hfp@Ug=M;9Q)H#;y+J%M&8a!Z=m!vO1tDP zBhkvWMxb*7wqBe5tQBieB&F3-wURGD-;^5r`_9j`VH8H`Y&P4#7oeM(rQWnw=R%C8 zP&$oGGw=oI8BVrnU{>1_jKV3M$z~e(0<^2MtoFOFmM+I=GNo;-&A=C+Q)3K!{=BiJ z0;5n$=d!s5z5xAn>0R%y`*jT%nJFE_1S$Cfv}Bao^vZ^WR*WJjZDB12z5xB+h9e`3 zF1Zh36in%2rdY`rpqEvR3=S;+w2MWtQbbfL70VZ(`!nthZcdxnjnPy(+Mo3gG_=Ur z7Fi%ogk)lLfW%*JAG~LNaqTZX7=_RlJ8L)a1!l0B$6PMirc)TjP&!f`sUteMP6u>L z{JNCHC4Em>q^IjERZ5mGK-XR+u2GM33nmtYMJp&z;+c50h|&~kTEQ^Hrm$%R1CUHb zrdDtZ$yQ`*1?Q1mMXpxx0hL{+W686Cm zGh==Zg_uLaL@ta8dyZRgTptVyGQ?x@go>!jToopw8f6U@QG-O;AQ3QZM5Z1W9ZZ&K zmg&WP6=(|duoF;8svZ|7OfobXdJqldqD@?~;Ak+((d6i1QD~-3T)xDnEKQakW`LKV zOTxN>q*_@m2#ra-L|HEik4d9M*(hSjG+l`cw78Nr!I}g%g=EtvF4kgGNmPji zUIR3tTj7EYO^|6Cr027YiCJeh!uHjC*kQ;WhwJqb6mm;W(?(qikLeKVQW0^!6cOh( z5&h>jz;JO;rMO!I9%EuPT0>xyn3N=y%!b`yvL rom +} diff --git a/src/entry.s b/src/entry.s new file mode 100644 index 0000000..d92bdcc --- /dev/null +++ b/src/entry.s @@ -0,0 +1,17 @@ +.global _start +.global sret_wrapper +.extern main + +.section .bss +stack: .space 4096 +stack_top: + +.section .init +_start: + la sp, stack_top + mv s0, sp + call main + sret +.loop: + wfi + j .loop diff --git a/src/kernel.c b/src/kernel.c new file mode 100644 index 0000000..da45d9a --- /dev/null +++ b/src/kernel.c @@ -0,0 +1,147 @@ +#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; + while(str[len] != '\0') { + len++; + } + + return len; +} + +int main() { + csrw(stvec, trap_handler_wrapper); + csrw(sepc, user_entry); + + unsigned long sstatus = csrr(sstatus); + sstatus |= (1 << 5); + csrw(sstatus, sstatus); + + // _start in entry.s will do the sret +} + +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); +} + +int puts(const char* str) { + sbiret ret; + if((ret = console_debug_write(str, strlen(str))).error != 0) { + return -1; + } + + if((ret = console_debug_write("\n", 1)).error != 0) { + return -1; + } + return 0; +} + +void trap_handler_wrapper() { + __asm__ volatile("call trap_handler\n" + "sret"); +} + +void trap_handler(void) { + unsigned long sepc = csrr(sepc); + unsigned long scause = csrr(scause); + unsigned long sstatus = csrr(sstatus); + + if(scause == 8) { + puts("hello world"); + + 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"); + + while(1) { + __asm__ volatile("wfi"); + } + } + +exit: + return; +}