From 467e4a944a7bc136bbeb87137a827784c763ecd8 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Thu, 13 Mar 2025 18:06:14 +0200 Subject: [PATCH] Initial commit --- .gitignore | 2 + build.zig | 74 +++++++++++++++++++++ etc/boot/rv64_fw_jump.bin | Bin 0 -> 273432 bytes etc/riscv64-unknown-none.ld | 39 +++++++++++ etc/riscv64.lldb | 7 ++ src/arch.zig | 12 ++++ src/arch/riscv64.zig | 23 +++++++ src/arch/riscv64/boot.zig | 115 ++++++++++++++++++++++++++++++++ src/arch/riscv64/entry.S | 67 +++++++++++++++++++ src/arch/riscv64/regs.zig | 35 ++++++++++ src/arch/riscv64/sbi.zig | 56 ++++++++++++++++ src/arch/riscv64/vmm.zig | 127 ++++++++++++++++++++++++++++++++++++ src/debug.zig | 42 ++++++++++++ src/kernel.zig | 7 ++ src/mem.zig | 9 +++ src/sync.zig | 6 ++ 16 files changed, 621 insertions(+) create mode 100644 .gitignore create mode 100644 build.zig create mode 100644 etc/boot/rv64_fw_jump.bin create mode 100644 etc/riscv64-unknown-none.ld create mode 100644 etc/riscv64.lldb create mode 100644 src/arch.zig create mode 100644 src/arch/riscv64.zig create mode 100644 src/arch/riscv64/boot.zig create mode 100644 src/arch/riscv64/entry.S create mode 100644 src/arch/riscv64/regs.zig create mode 100644 src/arch/riscv64/sbi.zig create mode 100644 src/arch/riscv64/vmm.zig create mode 100644 src/debug.zig create mode 100644 src/kernel.zig create mode 100644 src/mem.zig create mode 100644 src/sync.zig diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..02689f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/zig-out +/.zig-cache diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..e4723b1 --- /dev/null +++ b/build.zig @@ -0,0 +1,74 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const optimize = .Debug; + const target = b.standardTargetOptions(.{ + .default_target = .{ + .cpu_arch = .riscv64, + .os_tag = .freestanding, + .abi = .none, + } + }); + + const kernel_module = b.addModule("kernel", .{ + .optimize = optimize, + .target = target, + .pic = true, + .red_zone = false, + .code_model = .medium, + .root_source_file = b.path("src/kernel.zig") + }); + + const kernel = b.addExecutable(.{ + .name = "kernel", + .root_module = kernel_module, + .pic = true + }); + kernel.pie = true; + + kernel.entry = .{.symbol_name = "__rv64_entry"}; + + kernel.setLinkerScript(b.path("etc/riscv64-unknown-none.ld")); + kernel.addCSourceFiles(.{ + .files = &.{ + "src/arch/riscv64/entry.S" + }, + .flags = &.{}, + }); + b.installArtifact(kernel); + + const elf2bin = b.addSystemCommand(&.{ + "llvm-objcopy", + "-O", "binary", + "zig-out/bin/kernel", + "zig-out/bin/kernel.bin" + }); + + // TODO QEMU binary override + const qemu_info = switch (target.result.cpu.arch) { + .riscv64 => .{ "qemu-system-riscv64", "rv64" }, + else => unreachable, + }; + + const qemu_cmd = b.addSystemCommand(&.{ + qemu_info[0], + "-M", "virt", + "-kernel", "zig-out/bin/kernel.bin", + "-m", "256M", + "-cpu", qemu_info[1], + "-serial", "mon:stdio", + "-display", "none" + }); + + if (target.result.cpu.arch == .riscv64) { + qemu_cmd.addArgs(&.{ + "-bios", "etc/boot/rv64_fw_jump.bin" + }); + } + + elf2bin.step.dependOn(b.getInstallStep()); + qemu_cmd.step.dependOn(&elf2bin.step); + if (b.args) |args| qemu_cmd.addArgs(args); + const run_step = b.step("run", "Start the OS in qemu"); + run_step.dependOn(&qemu_cmd.step); +} diff --git a/etc/boot/rv64_fw_jump.bin b/etc/boot/rv64_fw_jump.bin new file mode 100644 index 0000000000000000000000000000000000000000..e9cfb9f57ffc0e83502094188561dec9cd7f66c8 GIT binary patch literal 273432 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 z zxa~*B;s-BLcE-`WpzGOz(UgflDrNL!EY-KuyAWe3@x)M+nEf?*B+}g#xVv&kZ``ew z?$+;(jkvYfptC>Fe6JnoulFuctrrhbSsrEc{~mb;+$Hs)V6S8Gq0@AK)*+H!ddM*m ze66~WOSZ5uvG)bpCW~Q>*%9L0hd%*J)|GR#Phl37SY-Wk-E*Jo+P}E2c$NSD3PtH= zPK*!q3RyqVSE1zWgBm0(I#s$LqC-a)I*rhQSNXt23iCt!(l! z#Ru^w$o-lrc43|WWB%&-UAX0B`(S02`>E^)+6i~4e0s5~kDt!qwd>#S_nD=?LU!<7 zRcR^z^t$#4A+#&wqN|4LJ^yJ9HpA2F?ymtk+~oy!TBWshinj3DI1bt)IsDr=4+Z%e z8$z+Kchm2~4)tj>aKhhPHS)%^>j&qN?=*HAZb6CD@!!FDwnVyea9)sks^N)&Wi7@Z#eG!bX-g3{TFI7rnyz9w*=cmZ}~#+lpW zNLOjOP|EMOwom`m?&2R;t=13e*|1N3_bfbc3VkcAD&dB4D{xI@q0i0xEi&{ zwN)QcEg44ipreQz@Ilwp)N+?CSeAAknD7)wLGwsk!Lqv961*Y}VeX4uV|V*9<(9}? zz(#M|Fh6*G+)H8_Qe@(gW{T@A=&gQdU8eUcDq3RDslh+!=UW@9tYP4!gNm7c_RIOy zd-)jMVn4f|y}omA{V-~7BCQlidg*EUun(LJv23@(DG|hCPn}R*&)mpl~UR=@2N=Jv=Q$5-Q-8<^_ zb}EziyYXQ?65ev`ys|^$o1&sO`N{nAu*P79Sqzb3))(--dO;{F897t^7xcn?!OY~7 zeskB0BN4~%&iRS;|4ctdG*w+N$;E*&%bdHbSfA_8 zRbG{-K2ACQMlR9R*R1BA&`0J{X^Fbp!2dzsPM?YDi%AJ~XZx=LnQ41>oqA{8-v+*H zLFw<+my;5%mE?ODQj7ZH;;Fz1mM9wdGSvzkp{bB4b{{)k)fg|l*cLbT7Et+5Q4+XS=RjJF6~)-QP~A%&~ZQ z((l`;p47b^)AL>J@R(PekK!i0rtdlRl_`$J@0)BUczfU5as<))>PolF=b6pk<;m{5 zj(M_^2kN2}%6-KABE-4%vhjwsr-+iYK6#Y1&#(`wzem44Lg~t6Y7y zo10Fd%|8D{n+xl?@dj6mXwSF)o)B7?KN-G|F51{k`mlbyJXGN2Ka2s^ParTy5zW6& z!Iz}uQ~||KO*o2tAiSVtLa5kUC6gDLIQb7&PX9wLq{DWO%KHv*=Yu1G;vLx!&l=%- zyKj@PNx|U>pnbdMvc9kwPhP;2jd-#esHW^mLYE{AT6*#X@S5pKdsK0oyhtgN|DcxX zi*)cVn8C@9j6v&xGW`!9fzRf1i1m?L#&d`uKR9>^^X0r<-gvS>D! zXvFD1S@c$kA7s&QL|o35MZX$Rm@9vwkdse6k7x!#rhlQIO#U+R2kI(0{nXJi`SSrX z-vNa4+EeOV#(GeG!4DEfYcSATgBM(v-q=^A=YmB$JhGL*6`0Qjo3>35rz#XrSjBgX z6)Fo5LH|cC6C>@49jnFiZHi}14V?I1v77vbP);8jf%cc7{YZ?F02;4Gz5k$$D-u6Y zq{ab5(F8v5o6TZWqb#I%j^PI`SP{uFeYtl^u;FLUG3T?quGzK(GnZ!XtR=<@hIC|0 zaQUUou6U;m7R?{}N_?pQVHB?~9wLn_@m42aVH`_pu zqOda}n2$3>V^gdqMbH+!OIZGdiILM_@lo{Q9Qsg)K2-dRKFmZPW=efHWXmX(>^6v8N#uh+G9hv)<5D7*)ABJm zFsFJ3uhHVoiu!`z+`xN7(84I$R>hf=iOPu7awRNP{w*@H{xVNpS5{@&Lh{)qO(WB* zD(biaHt43Fge7+K#n4K55jgpW*HGh8^z$5M*;33f^tpH*xEuY(+?Ke2W*cS$&9W(} zG{Xq9pJo@$+h;t+hMY;gm~y}r$R99jDFzI9q4-0-6pAJBT@T!8V2Bb{XF(+4w+2U* zO0hmbr{<(A0DoD48jJZ`sJlOM0T7qXO39gjfjfQrm!n%Hy)mt*p?Dke7^7&z>2(a@ zDb5GkxD)pS!_)D~VBqKyzUe!_f|}OUeH7%!?jHr;L5LAWmLPa=%^8lULZWJ4yz?lT zzHmtAjFt@of-bTKV>G}y+Krc!gOcI{W*VVqoRgX|x9}Mcxa5V4p&kSNGp;+Co?(2N z%TB+uQM2;^w@b@V=AWxVuLlTy<$HQ?Sm5QvhZ=tYwoJx@EZ*Wo>YWrlN?=8-bwzaF zz#I?cGYiSuN1Wq(K9Q#~#5;FVN>X!LYG5}d{`sYVu<2d7h8UjrR0G4akE)Q<`-8iP zV)`QRL17)F^(dLV1e`|v+g~BA3&aB??TF_~!1a)kkc~u};OHBeSr$JJ*{Xh)U%X`T zYlX+E(#wt6>GY2LP|`L8+@f|E7lY2=Vp?mc&IovP6E|H5ex4kA`;2UA+jC+YqE=kQi&FY`EhjAuxUKelfNZh@KuvLSA zfr{4hfThLvyG*|`k310m~-kEvI-$)t_60FLW^f1=W86pWf(_s zOEyk3+}T)a!0z+=hi*x6Hs=v*vkq}Ku#Sh!hkQbujT2`zwVC2@AkW60R~g+sIl~0rwU9oMSfAiQMwoAoExG<+0<UgX`O7URU)v+Im*z@n|b~I-Et;f#*J3Hrn1~yLaELKla6aafcZjA-|DHY?YLI+_%SMPPP1a z$Jve98y|X9YbZ5bg6|n9o-N$M%Eem}!eJGk%xSV(@P?8fz?_t$L`CZ1)S^opQA(!S z(Q=O>$)_2-^XYqZZfrzAF8wzpLU6{oFiFo12r@rm*qs1enK{G1wHYb@Dl(aA!8f<= zm!|`zjIYOPPu@Ix-Pm@iEUGT1_Pv`NZ%fcm!G7Q+><34_f|=blt1~?N!3#4)m$5ON1NMKP`*u(zzuQ4|?zX}) zAG8LIc1Sbqr01Yn#dBTqgH}P3MI=Mcry{?M+5}&Rj2c7)+<*BpY*Aj=! z`rfVv=|-?)U0;yqMo!e5Cjy{!8xi{SO^p^1No z$_PyS$dq#3Ur}1`d*A71k1Ttwm-k)zal7BS{afpruKp}yE{(o||IUT~xcmG|j~=t9 ze6)VH<4B*k9RH_g>1$v32>uH3QhM99YntA>`1D(zdJVVK^nKmVPyQQDJKJ%_dC^m^ zJ^!6kk6rsw`hR3EcV7B`{_-PRH$CxEc@AG_U`cZtu(gCs3oJ= z+&!V}q3*vD``#~I^Dcb9;RlZ{U2=Barz~>O)-%t!9RFGCL7ackd-11S`LPe+t?KC6 zUth7zYJBWnkKNz!o(Hk(Tz1W;{`gEfWxCvNGbZm7gsLp z{kJO*ofGZ(`O2+Q{6}o>T+%Ny=ic^~2QrGl{ zFSj52hB=9R{?R3ZJp0$xCy}4xlgKqA7u9|Eq8)X3TjKejzV;kWfa$-w(>vgmQ^$$y z7wLUux_7N+9G8h$;cq+bW&aa{mi;;IaTeJAfp5}T;OY2VJ3H$B{9iL)T5<^gyBGJh zrN1IepI+MjwOwB(-ks-o4_tq} zclYvl;m$ky{FiVNct7e7e@}VKvc%)}SJw~zOZ4_719NX%1gH_KdkywS53Kqd%*noI zZ8x>wvFh~Yx8F+^qEWIsSotrvbM;nd&c!c$!E0E(qwbnz+yBSkt&V(p)kWT?PJQBj zdJBHw>#KJxJM{s&zj)!5V;}#!y6tt>ye0Y3ZD&Q6UG%^WH+WCpcQ-U2H@crb@bkJa z-uL(3XAlRywf_0+&tEeqgb_X=oOt>H%-}z;Oh5eU%l=EZ)2 zO8fHM;}~!ZI0hU8Z(;^Qp^(X4Q?Stwg1Dc`riy+dl1j&8esjD~$QAsi*u^V63eRUs zHNy|ATYCi=TJhd|JiBM}4!e5$4ng%{I3Ck{_#;)R+Tl!{F!aWGMQ9W|4mOul^RWb|UWOeB@{6RB(@ow_x? zP%|_3^65x1kt<}Z=7}v+dE?PYI(=d_uTyO9j%4Ce8SHNKxv`?$6}|28NU>Ci2UWTY z>UC`D+Usx0m9oW(CiF^DuN8YcI(PV6;|EgFxzrc5x7Sq8JWbN`+x@0=spHn;>~6_r zgIqdZZF@nx9eZ|F>riGF)a%@J-AU|aG3M+bhs3p#SkiVG!p3U?1x^D2_ zn@9xlxoSrK7O)3BZE`_-9q~wBSzOSb(VK6P?fK2cTrrZqxW#7IZ$@j47Y@W@b4V$u z_9Y7OIEHfb%#}Y{h!msA>P#E^o9CH_Z_XAx6;oYk_-L^{4f)r{3qdNEt&mA});7gV zihGKYY%EfU8O3eoVmwQ#ws%3#P8P`7wsJmRfWa(Ergf|JBoSL0#N(;T?~NCWscf&m zYsa2Ve)rC8yKR9tQ)4xKb;nkTD=zF-`s-lwKj>Xkh-6FYNFh}`WXnVJ)|GcMtV?IX55IMT<0!*cb(_X`7);DnMQhndw|4cAQRCcu=IuRYvSuL4h!Bj3pwav^0(R$$HjU zZG~8_WI4vDe!O+hD;5w?h{sZecvKeHRHAwH4;^X;nC+{V-lpK0BI*dAGSLVI;#%>3 zi~8WYE7E1ysC+hcl)<1FfNW!DJzT2nQhqgig z5&vb3!!|vU%h}z)F8=NcJrT1@KzghnuztY$0qX~>ABg@{Hh$2??mC-+V4clCk@HjJ z{1n-Kk?j}Rev$1L+3v#p&*zR(yfm831@Wwx!y+Z$T2nRwgzw;SM7E7S7V#KM zio_Ql2JUeJ|$X)24w=N6=_zkptZ=XhHw(Ma|p8t~)MQZbH%>}=_ImvDWfip=D~s3F+eO@2Jx;fhUYDuyrq=Z_TB1~23Q5wG*Ik_Brsxi1p()zM z?hWjATQ~5HyXVsDObl81?g~-;t?>4+d!4v;J;SA|D&L+%K^NBhW;;T;VndaDBYY2U zsZ6dpoK%Ad4tWmw(PTWjKah14_0|%*wFPbwf8TQ89X(t&@$~6ztlub=%Hu*N_2ekO%_4Z6RFN zzjN#8d1glNeTU?GyplS>PeIA&V=1VJ>H$Y=0($HZSW>y=wm(QL8cdAFvL z`3!+0I*?@iKL z6|EW#^td(o`!RR?uBmXNyWO78VogemO~iSB69*f69E^SviAHHV#}l=mDC9ES%Bs_s zc{`WKasaar>Xu>@;*r>;2eD_QQ{l?0oFf)eLG(aN6#E>z;tEm;tTyI=A{IKamgrTj zts$c%=~dwo6A;466#EGYw|0*Ynp+p;(-|b$6f|GF(Lb)FSTTiZ{HgS-J-aZ@5=R&! znmf1b!C^L9I#0GiDWA`QK5QtGSY@Q+@w}Nv5&NX##VEqOXx{v!s&kkxYwi0h+(XO}W+6UIn2V=$ct+qt8UJnJi5+*D% z=cTe(P{NI1i+La(Lf?)Y3S|P|8Zqi#Z$6a^p}J_oA;kF2)PeZ~{vel6_U2lG-u0~; z)`yY@Gr4Ri6D=*YJ`W*VWGYUEu;R_paSYj{$Iea|CnM<+<&-7|!qFHoR3jQqc60tp z4s2uL2E`NP`{~$#R#?Bg5dp=@T8r!*-_C4~Fvw>jd4$J%Ln!gVRLnNCY{c+{li5^+ z#$;4MF&z(8{5`4OIZq{jk`7k)A-Ww1MX@K&#?zsc46If8unIU9paQSS^yJE+Xgr;^ z69jo_$w}j+EPih(#Y^!p4lHOA!igu&)Wf}nTqzGsI)0V?Ac@&IM20Hm57O9hnOzv! zC12RgX7BbhsZ6$%0d2RGuvL#?4h#ZXT~jdGCVsNGLg4Aki}j#xF#cbPWdRoa0(*IT z2mrparE-h-&`)z2^kLeXz!=#x<7gzGPMK*9?U2t!f)EzEpgC?CvwEpakcyf#=GuEU z8mHLk;(j5p(0SNt<|>JEPgr^*g+>tJ0G}IXIZA+HstreX1wY15WooZG6CIiglX5_@D zP$E?>p&hR=9d)i9S#J(&gB(tp3RI6aJ<3P65TbA*Hp?HX$0HM$CW^Uo5M-#-`9*&W zBgHpcN4S|x%Ivu0{K2l) zD#s9&a|y<2!j7P2P&sMCs>9JEYzU=6k8GIv7{a6B#(cKH9&IE;5p1XC`LUI(_R|)I z{XB`8!6k&l3M{rw85x)Jl1d1dD`fL8?Q3q`X6xG=&W4J)PzI~MC|$bYNZF*gK)6xn z?8vwmIT%{lhFQ15l#DU5+QqqDHo*BWNHjxBl*XwLu0JpcWuu3@XsLiH6N5=UZVH&& zA2DNk&WzrkXX`mkBeKZ~+OctI(L;4yWvZ$iXcV^lo0UEVaQ_cv;zR9)f@CUTCM61o zU*?cG{oWF0t`L^9@p6a`{KXEfQs%*I-;AR30&Kd~xJ}jK7%DNOQw_}d?PP0fh0YmM zShNsDlq=E0HFp{}4VX}DJhQ|$BwHp@dljBAX#7Kz=BD6c%rljDAS!cb3bzFz>YO~p+x*O- zlD@@h-jgPd(nm5lU&i59$SieXCRfQXh$$Qjp@C6r3YjB9V~UR8tKm$F76Cyjrt}U* z_Qy;4YE7FH8ZYN^hjZRcDO72MP`Q+PCS4YW?AEoCe+93hiLYutUc((jAmVLr4jbS| z_R#zdV?ehZW;CW1ZidE&FcLk`6l-rPw=~&fLyhBHDP-3nW?nR-dNhwCYF=kW53Flz zZSAS7yU4$8J(k2(>o7ABR{PhZaCROmCf8lQ-i+JWS4Se*mi?Gv3x}|(+`s;^`Qv$I z0JLkC$~b;=(#%UTGHD#+TeN_w#f%f^1jG;T;b}jGcW6>kK6;=57)QMY(*mpX?3SyB zBHCymH|ln5VQWog-<-R0dsg}KF!j)RN6-=}=ht1{dW9)0c&XxP1MyV7uBSFp?WY;D z+HcnVq=biYj7YSsE@jj4NRUM9itsv|%E!x7(=5;jW09*`uei*fnb4|ujtBD+j6Dx! zrOsVDwwUlr`d4nS^=0>+i4y!L%1?$axvTOMOZT=|+cy8Q@2PBg60K&cqkPM``6fD> z$1UV0*-#^DJ`-7>RV$qM!H|pOW0?plBA4cMA$enQbE{;t;bDLOUYx3%-EHOFk>fV3 zoydgUH&*L6t-&e#Z8(yLlf%fDj^qP#Ye#uD7fW*r+)U=Bw+V02Q0Zt)N};652+pDl zr7Rt~FQh-W`=;G2Vs6^HwTst{)%lv!!>d2I1jPo}411inO(w^j0FAw2x)hQ94($O~^x#7a?5VBAYAqrPQ z8X%`Z&Vrl)`SB*`K|ZqCy7$5T0^~->X2x2TD{;szAk5?o_mg2W$iV0=$7aVMUxxez zglUXF*Pb)I*j)UPIYlfgFYW2=W5tS;!>h8OS#w-+)ZykIf!| zJO%kGWEAo^%6O4EB2Tjz`$OH-S*QZZhvah579yU`r2T?1LmA_dp(p+;{+E zGUVJc#uLaDkaoz;5D(G-`N*x9<00PfVT^`*1oA9o2C^Dh7H-D}F^)mL3;6&f2I+$g zLwv}Kw_%L@5XO4Q6l4a{(1$q$avMJ13ps$#cS7!iJOp_R@;KznkS8HANFLH~JMs!y z57`R29x@I5806`@kRO(3sy-7|9Y+4|a`=%dz31?G)!i7Q;ntGr6NKqFm%x_4fW2xg zQ58bTpK9WN z48NEB5(Izb?se_l0i8P`^iY22)GCbkd&Bm!IBZ^~vB5Sx$XFddda1+{9LEo(Ogs!i zQh~ijn;(zEY40rOY9?KYUv+S!@Ja;1Cy>~-Cbe#g`-qDMz3tL zxEz5|U%=ZNs2Fo~U^L{A1=}!lzhq8Nq;o)nj%UES9CPydN7$T0Pz_U_u$A@f8AI3} zdz%!cWqIA4723LaZ>z%t_trm{oh?GLkR;^A!No}r;@kwe9?}W97P1v`HKYx)9?}B2 z5aL75g`5RB4N?zz0x|-54DvY$=`BY72>OGNdm;Bg?u7I~bh&Ef)7&40sn^g~46yZ& zSeEdD9eKbY-DiaPcmwyibS7i;v5}usXWYh^n-xW$@VVLZtUpD&9iE+?f;X~<)cJ0U%gt0Ct?UU_(S_8G_*Aa_F& zkPVO)q`4d7Nkf$88hGhQP&DJ1Ik(5B19-_VjAKPQ!kQZh(e_PbJ}oe3-GLVlN9g@f zIUb4Tl5reuMGu8>%Z4jZ+#yqfxNXBE5XqzWa4!iAPS;xV0KA=(#>Hs`qhZWutC+KS zjD?GIfn}oexLeVtS2a9&%gfYR0SDMLvXs&|M>k_5jp=keA1%gV3MUL6O;N@i9sE{o zS)S;UdLER@<2*>pZVq|F`1%{BhEkBU9oiU0Ug>@Rg3TtrVS@fC(I^{puZ@QfVEhfo zGx)j$Ud}-7%`N76@39U4}u!a*j*ON^oyF*MpoT^XC4L zicFW|m0&wJhtoJVw!OmhPR9qDkC#HsK(f@UyWZ=o^ZvZ<>`0w=`lao4UE7y?U0!{E z=h7uhjP5BCncZa^SI&=q4SqU5Iuo)Aat@>savtQJkoS%M&f&gOzWmJZ+<4kO18@I_ zhj)ML$Y0!kVfcHUyPo~CPyXl^e{%kdcfGdeg+C7M`rg(xYi2IrKGkm)qGBoNvujE1X51-PWASkM$FhVF>;f?RJ_&$ZNWjv{H@#kycLkfSX$J!rO`1+W|M-=`O``VP( z$m6x-zm@&X3iqzG<&<#IKX8w=-=_4t7;jhjk>9ua9SYyhc&EajxXbEyD}0Layuw#~ z-0GJVK1mZVo<4=&%Xq)SpX2-wD13F8Msl=Ig+G+F_>jU^u>E0$Z)AK#;h#U-+8I@N zp7qBx&OD4O{9eYV6yChX*5kCo{R=F9RN?JS7N1f01moT^8!qi(;6m%KSNQlv7H?2^ zGy5AAo?mYDC0y(evR=2+|Hgo+7O$-E8$WIFK824lKA`ZG_gZ~PN75bsHB88OCYAos zr>y>z!dEih$>k6`&75wx!k^}JlM0_^T=)<>Q>-_n^t(Q5^E0Y&|1%aJQ}|CgKVnbp zk8*iEUWW-j!FXQbpJDrDg}`Xe3Lj>CTH!|-KdSJyw_5u%3h!gwv-TSl-pqK1!n^;>>US&rFzXK} zeEH|C{*c0pY-dv853>HW!dn>kxm`&9pJcpM;meq97lzbjx{dR?C|J>?#D*Rct)35Lik6Zmgh2PC~h7{g*mF;(BJ{OSu zG)!7MeF{(fy~X<#jz5}coA7y-6;WLcS zDBL^S@>9>}8d6{Nj5jL0f$?UA`;50Kyp{0|g|{=_t#JIC3ey3S3h!jRtnhBe`xU;A z@j-G znHspq=bKVqNw>ZR-cSQ?tbzMA@a7tLYYn`u2Hsu+@2G)y*1)@K;QMOe$r^aR241d# z_tn7rYv2Pl@Ii&&#_eiI;ZncDHSm!d_^84s*gvN5Za%M-aA{Z5tT(Cjzs>t!2^amg zRdyUWs`O_rv-pg{J6PZ2^u>7bNO6C;r-_@{|X;@yVdvjTwCl< zFfQlaf_JlCgVG;if1|>u+3zddKg+Juniby7c&ow(7;jVfB;)N0Z#di9?@)M>aVdwC zE6;lSl>Pn8zi#nX zh2O_`QsGB@t6x_5lHaiSkiz>IA5r)h7@t)5P3K!X(+VG8yn*leB>%_OSbbmNw_RZI z4uzj}p~bruzLW8Og^w{lpzywntR1;`l>E%F-iXp4ZnV6QDm>5ln8F9%ZuQ3%KF;`r z!rRZa`jZMj%J`JRM;V`1`0#nwj+8^n)xi10#fBL#1%H+vt=B z=OxyT@F8~kS+A`0zs&j)F8co4?KmlX3qHp2M{3xSaM5pNJ09~b_!nAiKI;{JBjfD~ zzk~4(g|{&-^(^*>S#MD3PqDs)i@wYY<658n6AFJOWb;3z@OCb*&+S6&Z)W{wg=ZO; zb|?DXtklOYaop16V! zF+QN|eBxa;KN2qbWzNsA(jR00gu*A;FYot=ok4!zr=MNH#XnF3mw2K-%6daefB7{w z|04>2<+m&@@x;y~muph#&#-?=;mz-~NWKJ5a{PVD&J%d~jvfgY{ZY14R{9f+_bYsg@j->pFg~vE ztCKd}3574|wfKy}??_l&-ZPVY`uv_$1G|C`vR}dlZ)3b!=^x2j`x0K!=lyKE(x2F1 z>#IZIat_d`aMABpxSRv*Q@H3S74FlEczDVRZ)1E=;UnxHQuwVoTV4s5@^-SF38gRo z$r|{S!e`h&t?*W#*HH>@VBBL@^0V(2n@9jdWDZL-k|Wk zAGG@NKB(B)$9m05e~A693O~yJc7->-!?sVcC-y}zsr0|`A)BAF!hdp`#rqWA%Jzp8 zE_%ZXpSj)I8CAI0A5(Zc+n-SQKE|coQZ9)3$S?V`F&8)mvkExF8;W zH`l=BJyc1zo%O^Oyqob3WvAimHvbYX`h(}&`W;mI-~MZ>Kcw(|->~?w!oT`8=7--8 z68jhYjl~-j{tDY^RCojH%X>y*XOQ(emHyqVUsiaMafv5(hPk{$O23}pUm8~UDC>_X zT=Yj3KF<1M3K#uxg-^2ngu+FCQsL9AKc(1{iN=SMcvJ zpPdT7ZQRyxpTa%H#h%!iTw~kYh|(Wpzql2B#>bWZ=h*(F!l&7OW7GWo`{z0TzQSMq zTbqA*PfgMtVZEf%Pye0OA5i%9j7vPR<6U6OEAP7r-hQFY-;}cR7~7F>(QjZoog7ba zpYeSPZ)H5M@D9f1Jv*`EU1ak!r1YmbKVu5N?VFYdi6?eO*nR`s6MT$uU*VICw=2Ap z{o;z9B;(ym|5eVXgp2+R+aFf?Uy=G!_)}aidEZd%v^86Pjw=1ur!5aN3U6S%k>iOS zd7sc%xV%r;s&ILqP|_DW^-Z>2^(%ex57fZN6u$SLZT`m<{v_iQ3h!gQ{^I%lYxxhX zod$*9#CW5^ea3x--^X}|!q0!v+V52O2FCjpe#Z~3{-DAqS$|C7H~pM>Q1}?*M-}e< z!s^c`Jjr3YYbLyTW~5 z_jD+{%=_d{h0FJrx)m<>h5HmP-?K?7T;4OzD_q{6C@WmP57eh{Sts=?T+Vj}6kgB! zmO+J&^7n6s6kgBwSi=gJ??sI$T)t;Bs&M)K(3ryI`&;7*mvfB?h0A-clM0u8&XmIC z`#{qQm-D8h3g5@?V~IH<(i!KmUf~zrkeR%+dO&KQ%+PKz1&*?(1bZC}r2Trb4lGp?v<0 z)C9+{Na(kjR=rYs>EKT@+W`#o9^bQzpue&S0LqSUWwD zz?7?jBZ|9NJINqpqU_q!G0$DBouFVRl)Zbp_E21L7i|X<6vgS>bDgmx?qco8NO9e+ zP7_t!#oCGWM6(oU_m<6DtKG%giRSaR{d9IxclEZgyI4Dkg9$Tn@7;dGc8V+RV*6n_ z-W!P?noGTY?&G399l&ZLS1?iDLcg(GHSVH}KsnY^G*-IyTAsySY`Fs4Exc`eO!KL@ zi?x%+ak|Wf6BVcA&c$^~F;5Usk`6%Pnqk`b%JqV3GYOO4uQY(OQ zOzS6nmYp#4_&}Xsoj;u)oxVglU_^J;f{efEd$X=ES`k^M*PoA~+M!FVB;SX74)1ImrTPoke%xYm24{#v{S zz3W>ytPf?PC1NSQs4?b^=7r+n+^n1mp(*_bC0nb!Z#2(XNFRdk= zZ279!LBG-pexpQlypt^-?T=^=r1i;9d#!4z-kZ@riiGxOqT}N;3Hc?Q_B(WENc%Lw zM4$F*@>#+tKNN?gI!r#({!8z{0KM*`%lEnw{);H+{qV^aE0T(YQkmf2aWi(ZDLK9W z2nK#x?cI!jawz{Fkx^%J9s?&^Z>C=45PzP96MKrucqG;my{fe}Bv%qAj^IL1iUFA$ z#ntDQCuQVKs8p*x<}?4kg(s~E-h{<2hPq^Napz$=D{nNu@DLnKX_E{3rM#(V zaBx8d1^(>VY>uF@tL(@x_fdUUTEDEnhc{Zk+%K`ZC-+N@Y**jsRPL|ZZG74%(KEHq tx^jOd@&9$!<_Doh^%v|v!$!A}ewn{7Imrh3%S`i4V2kE2dTM3m{{wsYNRR*k literal 0 HcmV?d00001 diff --git a/etc/riscv64-unknown-none.ld b/etc/riscv64-unknown-none.ld new file mode 100644 index 0000000..d2e55ca --- /dev/null +++ b/etc/riscv64-unknown-none.ld @@ -0,0 +1,39 @@ +ENTRY(__rv64_entry); + +SECTIONS { + . = 0x0; + + .text : ALIGN(4K) { + *(.text.entry*) + *(.text*) + } + + .rodata : ALIGN(4K) { + *(.rodata*) + *(.got*) + *(.plt*) + } + + .dynamic : ALIGN(4K) { + *(.dynamic*) + } + + .rela : ALIGN(4K) { + PROVIDE(__rela_start = .); + *(.rela*) + PROVIDE(__rela_end = .); + } + + .data : ALIGN(4K) { + *(.data*) + } + + .bss : { + . = ALIGN(4K); + PROVIDE(__bss_start = .); + *(COMMON) + *(.bss*) + . = ALIGN(4K); + PROVIDE(__bss_end = .); + } +} diff --git a/etc/riscv64.lldb b/etc/riscv64.lldb new file mode 100644 index 0000000..a7aa4a3 --- /dev/null +++ b/etc/riscv64.lldb @@ -0,0 +1,7 @@ +gdb-remote localhost:1234 + +target modules add -s kernel zig-out/bin/kernel +# target modules load -f zig-out/bin/kernel -s 0x80200000 +target modules load -f zig-out/bin/kernel -s 0x200200000 + +breakpoint set -n arch.riscv64.boot.rv64BspEntryLower diff --git a/src/arch.zig b/src/arch.zig new file mode 100644 index 0000000..e7d7a5d --- /dev/null +++ b/src/arch.zig @@ -0,0 +1,12 @@ +pub fn arch() type { + const builtin = @import("builtin"); + + switch (comptime builtin.cpu.arch) { + .riscv64 => { + return @import("arch/riscv64.zig").arch(); + }, + else => { + @panic("Architecture is not supported"); + }, + } +} diff --git a/src/arch/riscv64.zig b/src/arch/riscv64.zig new file mode 100644 index 0000000..08d0289 --- /dev/null +++ b/src/arch/riscv64.zig @@ -0,0 +1,23 @@ +const boot = @import("riscv64/boot.zig"); +export const _ = boot.rv64BspLowerEntry; + +pub fn arch() type { + return struct { + pub inline fn halt() noreturn { + while (true) { + _ = setInterruptMask(true); + pause(); + } + } + + pub inline fn setInterruptMask(mask: bool) bool { + // TODO + _ = mask; + return true; + } + + pub inline fn pause() void { + asm volatile ("wfi"); + } + }; +} diff --git a/src/arch/riscv64/boot.zig b/src/arch/riscv64/boot.zig new file mode 100644 index 0000000..75b12b3 --- /dev/null +++ b/src/arch/riscv64/boot.zig @@ -0,0 +1,115 @@ +const sbi = @import("sbi.zig"); +const debug = @import("../../debug.zig"); +const arch = @import("../../kernel.zig").arch; +const vmm = @import("vmm.zig"); +const regs = @import("regs.zig"); + +const log = debug.log; + +extern const __rela_start: u8; +extern const __rela_end: u8; +extern const __rv64_bsp_stack_top: u8; + +pub export fn rv64RelocateKernel(imageBase: usize, relaStart: usize, relaEnd: usize) void { + const elf = @import("std").elf; + + const relaTablePtr = @as([*]elf.Rela, @ptrFromInt(relaStart)); + const relaCount = (relaEnd - relaStart) / @sizeOf(elf.Rela); + const relaTable = relaTablePtr[0..relaCount]; + for (relaTable) |entry| { + if (entry.r_type() == 0x03) { + const value = @as(*isize, @ptrFromInt(imageBase + entry.r_offset)); + value.* = @as(isize, @bitCast(imageBase)) + entry.r_addend; + } else { + arch.halt(); + } + } +} + +fn bspUpperEntry(a0: usize, a1: usize) callconv(.C) noreturn { + asm volatile ("":::"memory"); + + _ = a1; + // Relocate the kernel yet again, this time to another base + const relaStart = @intFromPtr(&__rela_start); + const relaEnd = @intFromPtr(&__rela_end); + const relOffset = vmm.KERNEL_VIRTUAL_BASE + vmm.L1.offset(a0); + + asm volatile ("":::"memory"); + + rv64RelocateKernel(relOffset, relaStart, relaEnd); + + asm volatile ("":::"memory"); + + // Can unmap lower half now + for (0..4) |i| { + vmm.fixed.entry(i).* = .INVALID; + } + + asm volatile ("":::"memory"); + + debug.log.setWriteFn(&sbi.debugPrintByte); + + log.info("Still alive", .{}); + + arch.halt(); +} + +fn longJump(pc: usize, sp: usize, a0: usize, a1: usize) noreturn { + asm volatile ( + \\ mv sp, %[sp] + \\ jr %[pc] + : + : [a0]"{a0}"(a0), + [a1]"{a1}"(a1), + [pc]"r"(pc), + [sp]"r"(sp) + :"memory" + ); + unreachable; +} + +fn setupMmu(realAddress: usize) void { + var table = &vmm.fixed; + const realL1 = vmm.L1.index(realAddress); + + // Lower half + for (0..4) |i| { + table.entry(i).* = vmm.TableEntry(vmm.L1).page( + .{ .raw = i * vmm.L1.SIZE }, + .{ .r = true, .w = true, .x = true } + ); + } + + // Map 1GiB at KERNEL_VIRTUAL_BASE -> physical 1GiB where the kernel is loaded + table.entry(vmm.KERNEL_VIRTUAL_L1I).* = vmm.TableEntry(vmm.L1).page( + .{ .raw = vmm.L1.address(realL1) }, + .{ .r = true, .w = true, .x = true } + ); + + const address = @as(usize, @intFromPtr(table)); + regs.SATP.write(.{ + .PPN = @intCast(address >> 12), + .MODE = .sv39 + }); +} + +pub export fn rv64BspLowerEntry(realAddress: usize) callconv(.C) noreturn { + debug.log.setWriteFn(&sbi.debugPrintByte); + + setupMmu(realAddress); + + // &bspUpperEntry will yield a pointer like: X + P, where + // * X is symbol's raw address, + // * P is the physical load base of the image (0x80200000 on rv64 usually) + // + // Relocate the address to point to Y + P, where Y is the virtual load base + // const kernelL1Offset = realAddress & ((1 << 30) - 1); + const realAddressL1Offset = vmm.L1.offset(realAddress); + const virtualEntry = @intFromPtr(&bspUpperEntry) + vmm.KERNEL_VIRTUAL_BASE - realAddress + realAddressL1Offset; + const virtualSp = @intFromPtr(&__rv64_bsp_stack_top) + vmm.KERNEL_VIRTUAL_BASE - realAddress + realAddressL1Offset; + + longJump(virtualEntry, virtualSp, realAddress, 0); + + arch.halt(); +} diff --git a/src/arch/riscv64/entry.S b/src/arch/riscv64/entry.S new file mode 100644 index 0000000..d855b4c --- /dev/null +++ b/src/arch/riscv64/entry.S @@ -0,0 +1,67 @@ +.set ENTRY_SYMBOL, rv64BspLowerEntry +.set RELOC_SYMBOL, rv64RelocateKernel + +.global __rv64_entry +.global __rv64_bsp_stack_top + +.extern ENTRY_SYMBOL +.extern RELOC_SYMBOL + +.pushsection .text.entry +.option push +.option norvc + +.type __rv64_entry, @function +__rv64_entry: + auipc s0, 0 // a0 = real PC (also a real load address/offset) + + csrw sie, zero + csrw sip, zero + csrw satp, zero + mv tp, zero + + // Zero the .bss + // NOTE: I don't trust the assembler to place a proper pair of instructions + // in place of a `la`, so do this manually +.P00: auipc t0, %pcrel_hi(__bss_start) + addi t0, t0, %pcrel_lo(.P00) +.P01: auipc t1, %pcrel_hi(__bss_end) + addi t1, t1, %pcrel_lo(.P01) + +.L01: + beq t0, t1, .L02 + sd zero, (t0) + addi t0, t0, 8 + j .L01 +.L02: + +.P02: auipc sp, %pcrel_hi(__rv64_bsp_stack_top) + addi sp, sp, %pcrel_lo(.P02) + + // Relocate the kernel +.P03: auipc a1, %pcrel_hi(__rela_start) + addi a1, a1, %pcrel_lo(.P03) +.P04: auipc a2, %pcrel_hi(__rela_end) + addi a2, a2, %pcrel_lo(.P04) +.P05: auipc t0, %pcrel_hi(RELOC_SYMBOL) + addi t0, t0, %pcrel_lo(.P05) + + mv a0, s0 + jalr t0 + +.P06: auipc t0, %pcrel_hi(ENTRY_SYMBOL) + addi t0, t0, %pcrel_lo(.P06) + + mv a0, s0 + jr t0 +.size __rv64_entry, . - __rv64_entry + +.option pop +.popsection + +.pushsection .bss +.p2align 4 +__rv64_bsp_stack_bottom: + .skip 65536 +__rv64_bsp_stack_top: +.popsection diff --git a/src/arch/riscv64/regs.zig b/src/arch/riscv64/regs.zig new file mode 100644 index 0000000..8721b9a --- /dev/null +++ b/src/arch/riscv64/regs.zig @@ -0,0 +1,35 @@ +fn makeRegister(comptime name: []const u8, comptime bits: type) type { + const repr = @typeInfo(bits).@"struct".backing_integer.?; + return enum(repr) { + pub fn set(value: repr) void { + asm volatile ("csrw " ++ name ++ ", %[value]"::[value]"r"(value)); + } + + pub fn get() repr { + return asm volatile ("csrr %[value], " ++ name:[value]"=r"(-> repr)); + } + + pub fn write(value: bits) void { + set(@bitCast(value)); + } + + pub fn read() bits { + return @bitCast(get()); + } + + pub usingnamespace bits; + }; +} + +pub const SATP = makeRegister("satp", packed struct(u64) { + // 0..44 + PPN: u44 = 0, + // 44..60 + ASID: u16 = 0, + // 60..64 + MODE: enum(u4) { + bare = 0, + sv39 = 8, + _, + } = .bare +}); diff --git a/src/arch/riscv64/sbi.zig b/src/arch/riscv64/sbi.zig new file mode 100644 index 0000000..4b2cf82 --- /dev/null +++ b/src/arch/riscv64/sbi.zig @@ -0,0 +1,56 @@ +const std = @import("std"); + +const SbiExtension = enum(u64) { + hsm = 0x48534D, + time = 0x54494D45, + dbcn = 0x4442434E, + spi = 0x735049, +}; + +const SbiError = enum(i64) { + failed = -1, + not_supported = -2, + invalid_param = -3, + denied = -4, + invalid_address = -5, + already_available = -6, + already_started = -7, + already_stopped = -8, + no_shmem = -9, + invalid_state = -10, + bad_range = -11, + timeout = -12, + io = -13, +}; + +const SbiResult = union(enum) { + ok: u64, + err: SbiError, + + fn fromSbi(a0: u64, a1: u64) SbiResult { + if (a0 == 0) { + return .{ .ok = a1 }; + } else { + return .{ .err = @enumFromInt(a0) }; + } + } +}; + +fn sbiCall1(ext: SbiExtension, func: u64, arg0: u64) SbiResult { + var a0: u64 = undefined; + var a1: u64 = undefined; + asm volatile ( + "ecall" + : [ret0] "={a0}" (a0), + [ret1] "={a1}" (a1), + : [arg0] "{a0}" (arg0), + [func] "{a6}" (func), + [extn] "{a7}" (ext) + : "a2", "a3", "a4", "a5" + ); + return SbiResult.fromSbi(a0, a1); +} + +pub fn debugPrintByte(byte: u8) void { + _ = sbiCall1(.dbcn, 0x02, @as(u64, byte)); +} diff --git a/src/arch/riscv64/vmm.zig b/src/arch/riscv64/vmm.zig new file mode 100644 index 0000000..81ea0b9 --- /dev/null +++ b/src/arch/riscv64/vmm.zig @@ -0,0 +1,127 @@ +const PhysicalAddress = @import("../../mem.zig").PhysicalAddress; + +pub const KERNEL_VIRTUAL_BASE: usize = 0xFFFFFFF000000000; +pub const KERNEL_VIRTUAL_L1I: usize = (KERNEL_VIRTUAL_BASE >> L1.SHIFT) & 511; + +fn translationLevel(comptime shift: usize) type { + return struct { + pub const SHIFT: usize = shift; + pub const SIZE: usize = 1 << shift; + + pub inline fn index(addr: usize) usize { + return (addr >> shift) & 511; + } + + pub inline fn offset(addr: usize) usize { + return addr & ((1 << shift) - 1); + } + + pub inline fn address(idx: usize) usize { + return idx << shift; + } + }; +} + +pub const L1 = translationLevel(30); +pub const L2 = translationLevel(21); +pub const L3 = translationLevel(12); + +pub const RawEntry = packed struct(u64) { + // 0: Valid + v: bool = false, + // 1 : Read + r: bool = false, + // 2: Write + w: bool = false, + // 3: Execute + x: bool = false, + // 4: U-mode access + u: bool = false, + // 5: Global bit + g: bool = false, + // 6: Access bit + a: bool = false, + // 7: dirty bit + d: bool = false, + // 8..10 Unused bits + _pad0: u2 = 0, + // 10..49: Address + address: u39 = 0, + // 49..64: Unused bits + _pad1: u15 = 0, + + pub fn makeUnion(self: @This(), other: @This()) @This() { + const lhs = @as(u64, @bitCast(self)); + const rhs = @as(u64, @bitCast(other)); + return @as(@This(), @bitCast(lhs | rhs)); + } + + pub fn clear(self: *@This(), mask: @This()) void { + const lhs = @as(*u64, @bitCast(self)); + const rhs = @as(u64, @bitCast(mask)); + lhs.* &= ~rhs; + } +}; + +pub fn TableEntry(comptime Level: type) type { + _ = Level; + return struct { + raw: RawEntry, + + pub const INVALID: @This() = .{ .raw = .{} }; + + pub fn address(self: @This()) PhysicalAddress { + if (self.raw.v) { + return .{ .raw = self.raw.address << 12 }; + } else { + return PhysicalAddress.NULL; + } + } + + pub fn bits(self: @This()) u64 { + return @as(u64, @bitCast(self.raw)); + } + + pub fn page(addr: PhysicalAddress, flags: RawEntry) @This() { + return .{ + .raw = flags.makeUnion(.{ + .address = @as(u39, @intCast(addr.raw >> 12)), + .r = true, + .v = true, + .d = true, + .a = true, + }), + }; + } + + pub fn table(addr: PhysicalAddress, flags: RawEntry) @This() { + flags.clear(.{ .r = true, .w = true, .x = true }); + return .{ + .raw = flags.makeUnion(.{ + .address = @as(u39, @intCast(addr.raw >> 12)), + .v = true, + }) + }; + } + }; +} + +pub fn Table(comptime Level: type) type { + return struct { + pub const Entry = TableEntry(Level); + + entries: [512]Entry align(4096), + + pub fn empty() @This() { + return .{ + .entries = [_]Entry{.INVALID} ** 512 + }; + } + + pub inline fn entry(self: *@This(), index: usize) *Entry { + return &self.entries[index]; + } + }; +} + +pub var fixed = Table(L1).empty(); diff --git a/src/debug.zig b/src/debug.zig new file mode 100644 index 0000000..44d16e8 --- /dev/null +++ b/src/debug.zig @@ -0,0 +1,42 @@ +const std = @import("std"); + +fn dummyWrite(_: u8) void {} + +pub const log = struct { + pub const Level = enum { + debug, + info, + warn, + err, + }; + + var writeFn: *const fn(u8) void = dummyWrite; + const writer: std.io.GenericWriter(u0, error{}, writeWrapperFn) = .{ + .context = 0 + }; + + fn writeWrapperFn(context: u0, data: []const u8) error{}!usize { + _ = context; + for (data) |byte| { + writeFn(byte); + } + return data.len; + } + + pub fn setWriteFn(f: *const fn(u8) void) void { + writeFn = f; + } + + pub fn info(comptime format: []const u8, args: anytype) void { + write(.info, format ++ "\r\n", args); + } + + pub fn writeRaw(data: []const u8) void { + writeWrapperFn(void, data); + } + + pub fn write(level: Level, comptime format: []const u8, args: anytype) void { + _ = level; + writer.print(format, args) catch return; + } +}; diff --git a/src/kernel.zig b/src/kernel.zig new file mode 100644 index 0000000..5264bac --- /dev/null +++ b/src/kernel.zig @@ -0,0 +1,7 @@ +// export const _ = @import("arch/riscv64/boot.zig").rv64BspLowerEntry; +pub const arch = @import("arch.zig").arch(); +pub const mem = @import("mem.zig"); + +export fn kernel_main() callconv(.C) void { + arch.halt(); +} diff --git a/src/mem.zig b/src/mem.zig new file mode 100644 index 0000000..ae68d29 --- /dev/null +++ b/src/mem.zig @@ -0,0 +1,9 @@ +pub const PhysicalAddress = packed struct(u64) { + raw: u64, + + pub const NULL: @This() = .{ .raw = 0 }; + + pub fn add(self: @This(), offset: usize) @This() { + return .{ .raw = self.raw + @as(u64, @intCast(offset)) }; + } +}; diff --git a/src/sync.zig b/src/sync.zig new file mode 100644 index 0000000..fddee00 --- /dev/null +++ b/src/sync.zig @@ -0,0 +1,6 @@ +pub fn IrqSafeSpinlock(comptime T: type) type { + return struct { + inner: T, + + }; +}