From d4e1c29f075af7d2778d7e6ee0aa7d04454be9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Con=C3=A1l=20Paxton?= Date: Sun, 15 Feb 2026 05:55:36 -0500 Subject: [PATCH] Fixed small errors in PIC signalling, added code for allocation and MMIO mapping --- bin/os | Bin 74448 -> 93112 bytes bochs.bxrc | 4 + bochs.txt | 3 - flake.lock | 26 --- image.hdd | Bin 67108864 -> 67108864 bytes image.hdd.lock | 0 obj/src/int.c.o | Bin 131720 -> 131736 bytes obj/src/main.c.d | 3 +- obj/src/main.c.o | Bin 24664 -> 19496 bytes src/acpi.c | 34 +-- src/acpi.h | 88 ++++---- src/alloc.c | 196 ++++++++++++++++ src/alloc.h | 16 ++ src/apic.c | 204 +++++++++++------ src/common.h | 84 +++---- src/int.c | 564 +++++++++++++++++++++++------------------------ src/main.c | 442 ++++++++++++++++--------------------- src/map.c | 388 ++++++++++++++++++++++++++++++++ src/map.h | 6 + 19 files changed, 1324 insertions(+), 734 deletions(-) create mode 100644 bochs.bxrc delete mode 100644 bochs.txt delete mode 100644 flake.lock create mode 100644 image.hdd.lock create mode 100644 src/alloc.c create mode 100644 src/alloc.h create mode 100644 src/map.c create mode 100644 src/map.h diff --git a/bin/os b/bin/os index 13da876d6be80b039d7a38220288a2f1b213b494..52b90eb2f76d701e9839026b1937a89418d43b65 100755 GIT binary patch literal 93112 zcmb<-^>JfjWMqH=CI&kO5YIrJq2d4k|NkAJ5VKlNnusahV@(ck`eNdW(10uda0z$*|L3yLpXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeD4CxS9ck%h$&0ltWJHPXfL#EWuUt*6hi(bf!skpf_sDf*foJ2>r z&wYct8;@6in6j|>MH5$kLznqn+wh9qi(1QJn?u zt1~b#pqo>AxADdu^@zFB8-IOcX%ktDZVtNopdFXGPJg`P;jJ=b)>OY4$%NE9SJzo) zS3f^$bN=ia*NS9yboDSkGw(*};0FiRCi#>Z&MzpM3KJitM?+vV1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^s<9s7L2h$8g6m$56+RV2|cE5+28ogXYv<6w5O(cr@E8 zfB65Op;Xx8_;FbWhK3ih@(c`y2VPtgV_@*;W@Z2I|G!6b1qTCviw7eELpSR>cLs(| z*DEgFsw@!<3?9c_4}ikTkJP5 z=8p_ulh?lg|KFqALBOxu=7ndsyFfQfYlAC8LnrH+a0Z6&7dly8+!+`=yXAem%Q-w5 z?|B?Qe#n`j;l(~Vkf^(WN4L#U16PKI7i;A}&N%)8yI$#Jec;Bx;L@pT8P34q*<3Hcz~Ack|Nno_?syIl>(~?g zZ4O`_yGN(%0gvOytwHA5f*nxL;c@W2$cqi2AUuBD4W~SFg$7a-|*7mG+6w2G#&?8VtBx#@jqxy z1b>q}BLjnH=MT?=FL->cS+BSA2e=}$t$@BkV&*p;;p3R3Gd@T?2x145R zVDRfUx#!vZ?|%uqZ|k>`L$5hKjvoLmOEJ7{c+#Wu&})9f+a8^VJem(Oc{KlYDA@y* z_T*oDu2{t5_#uee*D`Sb`1aaxd9>d46u_-_Gxzm)|>nJI++P(X*F@ z6XLcD9{&$}bYAeWJY2NEqw|8t!53_fJ3t=myy$rOfoJjw4^EzA9*xf#KzV@K_KpiE zK7T|*f)N~uhTmKb54akhbTtG8!C}J#uOEWkdhiw7ey}+QFF*H4KJUTFbIs%610D}% z))_7g46pa5!SeE&dmKOh7o;~r8pOT-;(`nVLnAk636RI}<2;TG z4Ia%$IHDnm=#t^Lmj==>_jz>w_BeiA%8{Yrg|svS1OK+_f)|TGrW`-62ohuivAb=z zJ2No6sFDF^PjFUzC&j>kT3)>VhZ;Ts!GS?x;f?{0fsR3r!Hyx0p^jmW;U1mOUo`#y z|KFqYh-18CoMWtGjAOK8lw+i0M0{LSWORf_^AQ1$^ZfD*SqxbWFSq~y|DRvJ0aPGm zF=R2mT#mwLdO011&-}6-h0pS`9EH#NG987__A(rW&;HUKiO=!U^8f$;@bsC*kj42@ z9Z8<+r6h_x_e)L`KF`aa|B&_bzI=(o=X-e*h0l=1|MK`hWd91h+>XQ-e7O=$z0k|) zNb(F>!Y|uV_#!XMk@%u7Gtu;my$nZ^XUGzN>5jsecxjHpmwc&?!k2m}j>4CI$&SL8 zdHMY>vVUY>K1brqy}bDsIeZwh*6u#$6brinWOK}vw_e*vZzR%0=zmWa! z`|>#o-|yvh6u$q<<0$-qm)lYJfiIV%@Pl4XN8ty*Y)9dTyevoIhrUcl;fK8pN8yLR zbVuPwyfjDQN4``?;YYm`N8v}mWJlr0y!`$X+5fRGpQG^OUS3Dx$G<#|!cTa)9fhCx zaybe=>E(13e)7w96n@Ifauj~*%XAce+RJbhe)>yy6n@4_a}<8&OLY`})=O~|e)dat z6n@Uj?>~_JpZoGT3P11VbrgR7%i}2gf|uJ-_=PW*qwtGfPDkMvzidb0m%J=T;g`Nl zN8y*f3`gOYzjR08SG+Vw;a9#?N8wk!6i4A#zhp<@*S!4x9ohf2FQ23E>t0?*;n%-B zj?B*h)%!2EfQ1|wvKTTN85kH|ER5Pelv*Qg5ZNXGA~OI{8o^B3WDDT;)fvk z?I6Ajg5Lq+n;`g|AifHM-v#1}Ao$%NJ_~~11LA-A1_}bO`+GtBCkTEYh<^pa?+5XZ zAovqN{4EInL=b-of4ifcRg&!u>xN#D9X|&jazVAo%k^{38hd0uX--g1->N zUxMH-0`aFH_@KG!mn{hX5|Dfeg1;2RPeJgPf%qW^{&EoC1;Jkd;+r7&D?xk}1b-EX zFM{B&2Ju-C{52r{moIStuLbd+Ao%M*{3{6ldJz8zg1-U8--6(81o4+3_?tldDG2^% z5WfY%-vZ*7AoyEB{1gO#8;Bo*;BN=Zc(1pF#W<1pf<&UxMI&1@Ti5{BIzB2!j6|#CJjPe}MQV2>wqHUj@Pc z1>%b!_`gAX76ktfi2vn1-2Z<;{3i(hKM?;4g8v`HKLX_&9zY#m@aXOUZ4FB6>|qFq zU})$(b?}uyTIUpoun2|*kAp82I(rx*A{ZLdj<+xbMKCmIFdS=P2#sK9=sVWJ5E8-A zz~Ir{!4bgF05Tu}*?=^J0U1yOl3)g;LJdd(8_;|}z{8e-gMop+HShob|DX{dkLEXA zX~$i^{pa^M?)n4dFn-3^ZywD@xS*pghhgJ&VAY*JJS_i}Nqe+j;&0($WMJsL*!+;$ zqxlz0aggEvm!S3n|Kx)nt(P45ryO_SIM3e-N|GMERsTIZFL*XTVCHWD)yd%TC68XO z|1SL7e8m2{bodDT_vk$3`Ts=eOONLN%*FLDK~;%I^P@k8|6%sK@NZ+WbLn8QaN*zP zV#nyx;bOrEW-@`8OkgH6h{^2He4NF@@>l6ukJghVnI63&79NcM4F7|p12M(}GtbK7 z|8Wn?pQZ0#+j(?e1X*8X>d|>>0{^xezW)v#H5~sztbZWZKM?CLi1pW_`OqH_?+=Lg z$D{LN>G@d52q$cC?l8hCuzx|}mzIVQ{POxQg2OKl9_0)U@MyMGy7~Vi&XM+L}SM zgDMt}ZdOf*Vh)c^)@=^pL3lTaJgDL|Jn+Kv1!!!X)d-=?-2gmfRty?S+szId1hzFX zU|@Km&&j~BpNoNk;l)=Lu!?4oikT1voSF21FabJ=)C{J2xQyw<6A%y&)C4z4)0(6 z|KEB1#SC^ZkMZ^Y{~pJW9|tKo%ErI|jz4Vig*?BZ;o14cv-7XV@#9xP`g+;Gw!a3k z8`(fZ?C)RvgjoCwB$f*nd;a1nM2rnIKM)BOy9g2E1c|wV#a??fJ_Zfax^}*IY-24eble(^l`hR5UhaUqZnVUW$8_g{2FOwk01{bvQap!R@I=l>VQ5OI5u z_;axM^B3_DG4RmnWmX0T4`$gZc3=+#f|MNq33bL^0EM0jlF}8d3=I4VH#{5vfktzS zEj^AOKLJud0i^!;@uwhm3y9qvd%=S__5eu#7m)LgAO8!I%V1?-c&W|Az~BKHf@Wrw z1KHZ?dcw2$52I)E6$X#}AaDQw&(Gk|9eV*e|9E!Z^E~)Y-Ldi6e@4)3$_I~b-xEIF zHU}NQ9cL^J0gr^gnEw3#e(-mSI_3?7yT`CEEGe9aRc-JvJEx_Lf% z?EAqF8m|5D-$U`EhvE;PUK!w3LSE8e4< zcZ&@)06@JO56u%`o#=LZFdp=1KFI9d>GKsdE!P0jqxjQ<@nA_-=Z%9ecvL}Q@6j!C z&|}{NNU+s=D1P$k&fVeD`OZV}pXUx?P+&4JH282H^WePZ(P?s!pV8X0@hB+4cr+dc zQJ(+L@VDyz`~Uyt9#E-u{CJuZL&IwUkK@NXKn!+|=wvJTduIWAF8LmkJs-9?O%Q|4K&waDQj=dz))AYpl)6x5M|B!+lqmqNZjK%tC%$; ztUdl8^yuUju?Cf84*c8hdsy?{2dQ!K=(c@l1@fxtbucA*14R8l<-x!Hn#aLstR9U2 zJPtl$dLj4&R1fg30?VHC=;S>CVs*3bv|?cByybEH7-%E5OLxz-4Xz9g9^ImyU}@7y zAgb5qfJd)Qy$9oQ5B~M1JPtl&^G#34 zo7<(+?~7ySZO6;6T@6n{6drWtyyyW@=)v!D-?j6mr7b6mQm;YJ;T8g<>JGwz3L zw~$L`*dNEsFS~h*EEyO&`8*h}`F0-iZ2s}T#Ll(zoa6Uvj?K>)UAkq1EkVUo+zZd< z7mWOq4th5KV&|W7nB%4k|F)m5oZtCdng0L(@6s)MT7!Y%<+p#Js^{Q@42Fi+k{-ud zoh+eodi>xFke|C*Z7dlWJpLc>=wt*>ib19Yp@|aK_JB?dqO>pgx3RYzC@};j+u#7u zwAuf|DD^A$ehfkZwq#_vrlW+4;{E z(LQtL-)Cd@;@O}7|2_X7_p$s9)em#uf5UG`xf9;r>HOXKh%9)Wn0t^(Z+S0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd70wCj>n6GD|WOb26(k^U@Up64O%^9CLE=lM_qw zi?|rv5;JpBQxr<_71C2n6mnB@^NT7KauW*_tTebZ88~Bn9E03lgF_TTgB_iGT&)xs zd^4T67@YGM)n5;JqbGGGC}uwVu!M;Ap!MFyw*{F0pf#FW$`6lJazsmY}!ARP*cc_|9M z`6;D2sl^O#MTxnoNu_CNsYMW@LqJN38Dbd}bQKu50z91+Tr$Bs9@j%@ym-cOG;AnxEQ#iJ%a)j7-AL5GfOfQa#M?o6Vp?z6wm@CBQrfCwMZc& zF(*wSC9^0sxdaqI1(|v2TzW`K!9h_}oKgT1%`eSMQ3wil2~cnVSsM;Azc@2JFR`Sw z2xNmo83R{PuuBNcSs-RGl026q$QwTS$%#1%PKm`JEf68sJdkHo7<>~8KrT@5_4V{u zC`wJw%+IspVo*>B$fzvNOis+P0$IzYpb(r{l?rAnXfP-wRhFa{Yl4(H=47VlrKTtp zpegrHODj$-QOL{#$0k@KmjXD^6f5MVrlzE(SSc_lD1;;yfs#vEW>HBg)GpVcApamM z1(fuppInrhSdyv`;1UqR#eiQ00r?P+tHGYlO)Mx#O;IQ=O-@cNE>0`W$*EKXNjif0 zpa4a778e&hsKBW%z}GNQ!8t##q$oc}!6_#{Ia^OpkBb3Q7#zo`Dd^_G!X0cFIBkOU z!$TSx$Xt+=308o^Bydgyc?Og%)AEZHpw0$GoPvU9UP@+iYO$3j|l80O$~5ljMV4mhnNQai+7u;i+s5MGoC4tgsE z1}+5!1qJ8C6lkdc6ZOkiNCg)$pzMVx&kLdFj8;JDMkqZAO3#MUi=gyQD18A+ z-+|I_6G2nx^6MEG>gyqx;Xjzk(BQxT9%}>>aMfT&ivSacmnH+lEA6kM`z(HOBdc z_cbZy!fSJs^^Qr%>K_wl(mVFbK>yfuB|Rw-+4%xa9EQgvWDVV1ISj8wnFk6kQVJAw z;*eKTvg;9Wl2G7iQfL!!;&E{Wd)*GS7?WYcbQ#4tQ}`Hm2*_~koFc<8BSgkWMv+NR zwVh9K&J-aB21Onw4n;P_sewXH9Ev;)Yoe4H=1dV{m@$P%ZK*IwodLrP5hjL$Wt&u0+fCLr9VJv1~I7pP+9>>8$f9XC>;Q$6QFbflx~31 z6QJ}0D7^tnAAr&qp!5SM{Q*idh(qm%(h5-807^SR=>RC50Hq6{bOV&00Hqf|=?zf& z0F=G}r5`})4^Wyx0%|{$R)Eq5P}%`X2SDirC|v-h8=&+AD7^qmZ-CMVp!5YO{QydT zfYJ<-Q2U{@0+cp@(hg8M07@r7=>jO-0Hr5D=><@F1C%}hr7u9~2T=M0lxC2E+7G1_ zptJ#$c7W0WP&xrh7eMI-C_Mp6FM!e;p!5MKeE~{8fYKkJG=ntMekiQ~r46981C$Pc z(g{$y07^GN=?PGJ0hHbVr4K;q3sCw2l>Pvv8DyaLLumylZ2+YmpmYF~PJq${P`Uw1 zPk_=3p!5bPeE>>dfYJ}3^am)-APco0N-IEV11RkPr30XJ0+cR*(hX300+e0=r8hw7 z15o+`lzsrEKR{^)IjH?mS^-KMKxqdk9RQ^hpmYJ0Zh+Dgp!5PLy#Y!efYKMB^aCjU z0ZKE-L+yvs3Q*brN;^R504SXRr3;{R1C*Wsr58Zy4N&?3l)eC^A3*63P?|vjYCn`# zfYJs~+5t)jKzyUp!5VNy#PvYfYJw`^aUvW07`#=(hQ1F`=PV~ls16U4p2G( zN+&?+0w~=8r6)k?1yFhels*8ZFF@%BQ2GOuW>A9K52Y2Lv;mZMfYJd_Isr--K2~fHKN;g312~c_gl->ZP z4?yV)Q2GIs{s5&JRG{`lX$2^40HqzEbO4l2fYJp}x&ca0fYJ+~^adz>07_qg(hs2Y z2PnNl?;iuBAfu|PFe|fak+^`kv}&<90|S!@1GB29u)U-ew>3AD1Oo#zKZB<*0|SdN zBeNqW!XJFt{16$0G>>U9;Mg|5!eg*~xAw5Qjht(w&6d4&9 zgjpFNd{DrMfJ_3J1LBAxRC)@7)r#pc3Q7yHIY?AVLiE^6GBAjnFfb`WxFB5;++Z~f z43gZ8p~?&lQnHMO!lB9$+>zYj+zbrTtPD&_hQbUCG9YarhAc<{$XJ*XIaUTH36PAu zEQ6sivW$WUL%ndVGy{X82P1@`ofDy-m8P}PHa4_KAmSV~<+3n(3d52-mj(l~DkvSmk_sYZpwY;S9OZlu}<8Y&FTYLIdm ze^LOs3XwsXAz7IP9G{>B07*@3@L1z!U|i>YZOq$BqGiTD^5f~9$;X=DEeXPLL8hfz*Q(H zd?moa4d+V2qCpB&nldm*BO)A>>|~H453C0gd9twL0vh{r=*mFl0#$1VSdpLxvl&tj zsKdChf zl_73z7uYUdV!5RCbG6V6Wd(&JDA8(zyntM~ z=pY3LxVX^; z6FE@+mPhyz6dwv8zkwKvApNk2K}u=R!b%xAKdK<|BdAUT zla(7R!pqOf13JirSww(U0L%~*VHE@&&A}`#!72(?BcZ@520CnlSyGXK4J5)2I{Jl! zfdh1+4LcJjC+H*@Hby>1E>;dkZVnE1gd#Qu4$v_r{7l>&pyNXL7*BEWva@i2j@}Sq z;^6=tfg#M8#wEngfzZRuz+lYAzyR_p=m;UOR|^;z7(nL*F@gLD!mObCOnDd>7(keb z*$O1a0rI;&$nSy%Oj(SqEGeMC$!26=m0S4GKi2bVdONZqPahZqQLN zEc_Boag3}yU`6qa46M9hRstgjD<7DZ$SA z6j+fR(?Sj=X)x2CX(1<*%yN)c2d0Hw+-pEuL7tOk<>A=}5*B7!$c=CmI|I)Zkf;dL zLLP)DCj-wbkfj9!`FTV@Q7*x>PynG)oB<*#$+S?A#{?uV z#k5ceAb%D|S##J~U!eohANVkQO#K2UtH zwID<}dYBj(lvuerrZ6!uC^DYnRA6V}Sp+gbpJ|~O!Zs!bh^QgcLUEo$AbDe^g%SvP z7O1=_(?Ur>A!P=BVHE~`P^uA8We@<_C!)q62&UB;bU^_sqQRgCq8UUrS$Jg zvG9Tg#H7TT7#JAC%o&`-8LSw*K!W0o)(qaDcopZcVMqosB&59=85qQw3>kbuTuBCT zW)%iMkd0C|LE0JoS*2O-GBGg7us#KmY;Qp%`&W?D85m^Qm>C#kK*JUcsgiPx!FBA8SHlgf&kEDQ`PN{pdQ z#S9E!Ayu%D8c3)PDx?mU&`FoZ8k0yP~ac1m>$35vfP#TR zNROdaSf8O4X~L0#7aG;R}S!O*Y4sm{<3(xJg+%g_&!73a2Nm8M81jFfmMGmgcc%VPMc? za%W*+&|>fag+ww71A`v;BItHj1_t>c76t}=6;L5HNr*wnl%ZHypP?9JhKLD6DVR29 zC;`z7LS_t=!ukxAAdavBga-Me3M9b5Aga!g4|0vLK0`iOMBAW<5tJq@8K#27HF#|q zrh+8I`Ro{`ff@Yz4Aa33L3@U|AciEfxPT$Ud@z$mT*!f80Vo7zf3q+!7=lizU|7Z} z#~ARRg@Hi_%;#qXc}swmfkE~jTun8r9Am&E76t}gwgLtLd#U-az*-q(rC1pljKJw< zxq!5Y5-1ELj6r3$xUdPsMv$don@qsUw{y!e27+w@^U-Vqi!p#~3WV5Hh-{NQ$R<-k zP@wJ*0+9?ZERbqrGdP*cGBDOKGB6xu21OEBo`Hek0wV)MH3I_!XoozLE;|d84m$_4 zBSfXr_fs2z7i6?5v zAu|W4zT#lw;Q$>y$Ih6>#Kz9S2|Ct{g@K)mOM#1f0V5ZWA{XyMMg}HMb`}oMiD96s z5u}8V@f5f&;Spd^1sTXI$e;?!vwT7fYG7IzLNoBQfR0UO42xi7U=WZ_01eSGWH2%? z2!YP)Vg;>;V{qUVmIj@k#lRpU!X(8j$|R-E$iToW$s}bBDt9^bL4`aM7l%2hoM8OU zB*xCf;mpXuAj8Bd>chyuAkE0f$Rx$VC??CmCnm=rFD}nu3vv^m0)ri>w%`+FZ~*Zc zBtYhgC^8uE3NjdgT*<4%U;vWgQ)Vy(@%dC3j6gI4k1B&JNP<@lLh~swxPgpf;8ADr z1)W^RtHIz4Rw>B_I=GH8OphT@ib;bZ)Ru*TK`4Zgfq`8I6#PNVLIEI-28g4;EF=Wt zfNww-U=~&o0}W0J%7J_dmf--WGC^ixMX-zlLWUD8BLtISLCA1{WrSfej0hQSu#70P z@B&7#aYz>NfThHkg%?7kG!VLY!BXOIDJFyzA6QBPE`?+lKUhi{<_ge(-(ZZSL;zf3 z%fNMmz`ovsF@&@#A;2eYtr6*#2@fLa_fi~(IBWek%*F~=aZg^__l6l`v&xbO$Y zJs?q8Q0NQG$+Ivph{-dCFbgy&Fo4Cx>EKK_BjLghVAZad8LE^>0z`(}D!x984P#DvgSlBsO6F{6f7mk#v^7Ak`m(JkpeS>c^JT1gpY}fMGaJ#Fn(v^VP|470%bTRPF_$! zAOtEl1UVR4+(C^=CT!}E;FoV;WDsBj1r%f0 zM_vX7L58m&lJPHyWMbuGU=U*F%5 zlqd%%lo`Ve8GLu~fd(Bt86hn3=Zp*toZ`P385p?0Y;JK@CI$u`Fq@Y_LXnwE@*~Kb zQr|#n5fs7_O3eI{;J}bjX6BIuN2m;+Ey(I{cZLWVeo(?@4EJD|DkA`4dNNFt5ric=o!MhwFAXP6@+4odBe;Q5*c|2GlF5M zi~>YKB*QWpMTlq=!*UrV2s4^tg^V(U8N;wrMg^iamSL5QDnvAnVYQ4Jgc;AUMn)aN zOkh|mqXA(iGOUx)gfNpB*2`!?n8^$qWV9j76o!p5IuK?m!zLMBh!trJn`QJMqUj7< zWI#uIF))T_Fl?7GfQV)?Y?m>FFtZr8%NRkJ*$mrdj3LY%h8;2{5N0mJ4jEGjGml}1 zj2VQP&#*(r9KtMM*ePQHVHPs%l(B>`ix_swSV5S@3_E44AJ0GAJ_R4rcn9U4(WxOHG7KVK?J`iRr z!#){b2(yi0pNt=b+0L*}#vj7$VAwAc0AY4A?3W3IFuNG`%LGA~-3f+5Tvh66Go z5N0pK0hv$;vyb6`Oc;dO&u~B{9KxKya8M=!!kox(P$m+>oWyWYCJMrw%y3X98p52y za7ZQw!ko%*NG2A-oW^iSCJw@!&TvR39>Sc#a9Ab*!ko!)SSAs|oW*chCJDlv&2U&I z8N!^ya6~2r!ko)+L?#u&oX2oPCJn-z&u~O09l~6|a8xD(!d%F3R3;O`T*PoxCJVw` z%y3jD8^T<|a7-o#!d%L5OePn?T*h!rCJ(|~&Tvd7AHrP0a9pMU!d%I4T&57hT*Yu) zrU=4Z&2U_%7{Xk`a6+a8!d%O6LZ%eLT*q)irVPSd&u~Jf9Kzhda8jlM!raJkQl=8Z z+{AEFrV7H`%y3es8p7Pda7v~I!raPmN~RXV+{SQ9rVhf~&TvYm9>Uzga9XB;5yIZd za9XAj%HG9rTBZrg-pz1YrWwlK!*E8X1j5?9&YAWhO(}XBaNXOo6h`GF*_E3T2;TxF9nP z%0ACnT1gHEr!c7i=gb=43}jVL)mv2uE;EbvhOln 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 JEhmGK2LN_&ak2ma diff --git a/bochs.bxrc b/bochs.bxrc new file mode 100644 index 0000000..d431cae --- /dev/null +++ b/bochs.bxrc @@ -0,0 +1,4 @@ +vga: extension=vgahw +ata0-master: type=disk, path="image.hdd", mode=flat +boot: disk +memory: guest=1024, host=1024 diff --git a/bochs.txt b/bochs.txt deleted file mode 100644 index b4d164d..0000000 --- a/bochs.txt +++ /dev/null @@ -1,3 +0,0 @@ -vga: extension=vgahw -display_library: x, options="gui_debug" - diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 48701bd..0000000 --- a/flake.lock +++ /dev/null @@ -1,26 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1770057536, - "narHash": "sha256-Y/Dqu+7StqRVlzQEbow5l2Ws02P9IrHO3eVnpVWbLTE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "79faf5ae0424fe8cd1d07064a513667e6b6ae65a", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/image.hdd b/image.hdd index 4ceb3f36c03a946b7650b6cdb78d23d6139ae513..1ace0251401b0d06b057cb50ea0133499d529c2b 100644 GIT binary patch delta 49688 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 z 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 Yo4N1RALhPSf0_GU{bOGD>OZp>00CrIwEzGB delta 38703 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ňM$i3=AhY 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 UH-H=r>i0tZ57GxplIZRS0Fa1wumAu6 literal 24664 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 g0^R+4m>_F6L2}5r0JLZpltype]; + fg = ~bg; + + u64 addr = entry->base; + u64 end = addr + entry->length; + print("["); + print(type_strs[entry->type]); + print("]"); + print64(addr); + print(" - "); + print64(end); + print("\n"); + fg = savefg; + bg = savebg; +} + + + +static size_t total_pages; +static u8* alloc_start; +static u8* alloc_end; +static u8* alloc_next; +static u64* alloc_bitmap; + +void alloc_init() { + print("Initializing Page Allocator\n"); + + if(!mem_req.response) { + print("Failed to get memory map :(\n)"); + hang(); + } + + u64 largest_base = 0; + size_t largest_size = 0; + + for(size_t i = 0; i < mem_req.response->entry_count; i++) { + struct limine_memmap_entry* entry = mem_req.response->entries[i]; + print_memmap_entry(entry); + + if(entry->type == LIMINE_MEMMAP_USABLE) { + if(entry->length > largest_size) { + largest_base = entry->base; + largest_size = entry->length; + print("\t\\LARGEST USABLE: "); + print64(entry->length >> 20); + print("MiB\n"); + } + } + } + + if(!largest_size) { + print("Couldn't find a free page!!!\n"); + hang(); + } + + + total_pages = largest_size / PAGE_SIZE; + size_t usage_bitmap_size = (total_pages + 7) / 8; + total_pages -= (usage_bitmap_size + PAGE_SIZE-1) / PAGE_SIZE; + alloc_bitmap = (u64*)(phys_to_virt(largest_base)); + alloc_start = (u8*)(phys_to_virt(largest_base + usage_bitmap_size)); + alloc_next = alloc_start; + alloc_end = (u8*)(phys_to_virt(largest_base + largest_size)); +} + +static size_t page(void* addr) { + return ((u8*)addr - alloc_start) / PAGE_SIZE; +} + +static void* addr(size_t page) { + return alloc_start + page*PAGE_SIZE; +} + +static void usepage(size_t page) { + size_t idx = page / 64; + size_t bit = page & 63; + alloc_bitmap[idx] |= (1 << bit); +} + +static void usepagerange(size_t page, size_t len) { + for(size_t i = 0; i < len; len++) { + usepage(i + page); + } +} + +static void unusepage(size_t page) { + size_t idx = page / 64; + size_t bit = page & 63; + alloc_bitmap[idx] &= ~(1 << bit); +} + +static void unusepagerange(size_t page, size_t len) { + for(size_t i = 0; i < len; len++) { + unusepage(i+page); + } +} + +static u8 getpageusage(size_t page) { + return (alloc_bitmap[page / 8] >> (page & 7)) & 1; +} + +void dealloc(void* addr, size_t size) { + // adjust to page size + size_t pages = (size+PAGE_SIZE-1) / PAGE_SIZE; + unusepagerange(page(addr), pages); +} + +void* alloc(size_t size) { + size_t pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; + size_t page = 0; + + if(pages == 0 || pages >= total_pages) { + return NULL; + } + + size_t consecutive = 0; + + for(size_t i = 0; i < pages; i++) { + u64 word = alloc_bitmap[i]; + if(word == 0) { + if(!consecutive) + page = i * 64; + consecutive += 64; + if(consecutive >= pages) { + usepagerange(page, pages); + return addr(page); + } + continue; + } + + if(word == ~0ULL) { + consecutive = 0; + page = -1; + } + + for(size_t bit = 0; bit < 64; bit++) { + if((word & (1ULL << bit)) == 0) { + if(!consecutive) + page = i * 64 + bit; + + if(++consecutive >= pages) { + usepagerange(page, pages); + return addr(pages); + } + } else { + consecutive = 0; + page = -1; + } + } + } + + + return NULL; +} + diff --git a/src/alloc.h b/src/alloc.h new file mode 100644 index 0000000..29d7a6e --- /dev/null +++ b/src/alloc.h @@ -0,0 +1,16 @@ +#pragma once +#include "common.h" +static const size_t PAGE_SIZE = (1 << 12); + +void alloc_init(); +void* alloc(size_t size); +void dealloc(void* arg, size_t size); + +static inline u64 virt_to_phys(void* virt) { + return (u64)virt - hhdm_offset; +} + +static inline void* phys_to_virt(u64 phys) { + return (void*)(phys + hhdm_offset); +} + diff --git a/src/apic.c b/src/apic.c index 331288a..84562aa 100644 --- a/src/apic.c +++ b/src/apic.c @@ -1,73 +1,131 @@ -#include "common.h" -#include "print.h" - -// stub of a PIC layout, we don't need the whole thing -// as we only care about initializing it to disable it -enum { - PIC_COMM_MASTER = 0x20, - PIC_COMM_SLAVE = 0x21, - PIC_DATA_MASTER = 0xA0, - PIC_DATA_SLAVE = 0xA1, -}; - -static void pic_disable() { - outb(PIC_DATA_MASTER, ~0); - outb(PIC_DATA_SLAVE, ~0); -} - -static inline u64 rdmsr(u32 msr) { - u32 hi, lo; - asm volatile ( - "rdmsr" - : "=a"(lo), "=d"(hi) - : "c"(msr) - ); - - return (((u64)hi) << 32) | (u64)lo; -} - -static inline void wrmsr(u32 msr, u64 val) { - u32 eax = (u32) val; - u32 edx = (u32) (val >> 32); - asm volatile ( - "wrmsr" - : - : "c"(msr), "a" (eax), "d" (edx) - ); -} - - -static u64 apic_base; - -u64 apic_get_local_base() { - const u8 APIC_BASE_MSR = 0x1B; - - u64 msr = rdmsr(APIC_BASE_MSR); - - return (apic_base = (msr & 0xfffff000)); -} - -static u64 apic_set_local_base(u64 base) { - const u8 APIC_BASE_MSR = 0x1B; - - wrmsr(APIC_BASE_MSR, base & 0xfffff000); - - return base & 0xfffff000; -} - -static u32* apic_reg(u32 reg) { - return (u32*) (apic_base + reg); -} - -void apic_enable() { - pic_disable(); - print("\nPIC Disabled\n"); - apic_set_local_base(apic_get_local_base()); - volatile u32* reg = apic_reg(0xF0); - print("Local Base Set\nReg 0xF0 at 0x"); - print64((u64) reg); - // set enable flag - *reg = (*reg | 0x100); - print("\nReg written\n"); -} - +#include "common.h" +#include "print.h" +#include "map.h" + +// stub of a PIC layout, we don't need the whole thing +// as we only care about initializing it to disable it +enum { + PIC_COMM_MASTER = 0x20, + PIC_COMM_SLAVE = 0xA0, + PIC_DATA_MASTER = 0x21, + PIC_DATA_SLAVE = 0xA1, +}; + +#define IOAPIC_REG_REDIR(n) (0x10 + 2(n)) + +enum { + IOAPIC_REG_SELECT = 0x00, + IOAPIC_REG_WINDOW = 0x10, +}; + +// I/O APIC redirection entry bits +#define IOAPIC_DST_PHYS (0 << 11) +#define IOAPIC_DST_LOGICAL (1 << 11) +#define IOAPIC_MASKED (1 << 16) +#define IOAPIC_LVL_TRIGG (1 << 15) +#define IOAPIC_EDGE_TRIGG (0 << 15) +#define IOAPIC_ACTIVE_LOW (1 << 13) +#define IOAPIC_ACTIVE_HIGH (0 << 13) + +static void pic_init() { + // Start initialization sequence + outb(PIC_COMM_MASTER, 0x11); // ICW1: Initialize in cascading mode + outb(PIC_DATA_MASTER, 0x20); // ICW2: Master PIC vector offset + outb(PIC_DATA_MASTER, 0x04); // ICW3: Slave PIC at IRQ2 + outb(PIC_DATA_MASTER, 0x01); // ICW4: 8086/88 (MCS-80 compatible) + + outb(PIC_COMM_SLAVE, 0x11); // ICW1: Initialize slave PIC + outb(PIC_DATA_SLAVE, 0x28); // ICW2: Slave PIC vector offset + outb(PIC_DATA_SLAVE, 0x02); // ICW3: It's connected to master PIC + outb(PIC_DATA_SLAVE, 0x01); // ICW4: 8086/88 mode + + // Mask all interrupts + outb(PIC_DATA_MASTER, 0xFF); + outb(PIC_DATA_SLAVE, 0xFF); +} + +static void pic_disable() { + pic_init(); + outb(PIC_DATA_MASTER, ~0); + outb(PIC_DATA_SLAVE, ~0); +} + +static inline u64 rdmsr(u32 msr) { + u32 hi, lo; + asm volatile ( + "rdmsr" + : "=a"(lo), "=d"(hi) + : "c"(msr) + ); + + return (((u64)hi) << 32) | (u64)lo; +} + +static inline void wrmsr(u32 msr, u64 val) { + u32 eax = (u32) val; + u32 edx = (u32) (val >> 32); + asm volatile ( + "wrmsr" + : + : "c"(msr), "a" (eax), "d" (edx) + ); +} + + +static u64 apic_base; + +u64 apic_get_local_base() { + const u8 APIC_BASE_MSR = 0x1B; + + u64 msr = rdmsr(APIC_BASE_MSR); + + return (apic_base = (msr & 0xfffff000)); +} + +static u64 apic_set_local_base(u64 base) { + const u8 APIC_BASE_MSR = 0x1B; + + wrmsr(APIC_BASE_MSR, base & 0xfffff000); + + return base & 0xfffff000; +} + +static u32* apic_reg(u32 reg) { + return (u32*) (apic_base + reg); +} + +void apic_enable() { + pic_disable(); + print("\nPIC Disabled\n"); + apic_set_local_base(apic_get_local_base()); + + if(!map_mmio((u64)apic_base, 1<<12)) { + print("Failed to map APIC registers!\n"); + hang(); + } + + volatile u32* reg = apic_reg(0xF0); + print("Reg 0xF0 at 0x"); + print64((u64) reg); + // set enable flag + *reg = (*reg | 0x100); + print("\nReg written\n"); +} + +static u32* ioapic_base; + +void ioapic_write(u8 reg, u32 value) { + ioapic_base[IOAPIC_REG_SELECT / 4] = reg; + ioapic_base[IOAPIC_REG_WINDOW / 4] = value; +} + +u32 ioapic_read(u8 reg) { + ioapic_base[IOAPIC_REG_SELECT / 4] = reg; + return ioapic_base[IOAPIC_REG_WINDOW / 4]; +} + + + +void ioapic_init() { + +} diff --git a/src/common.h b/src/common.h index a6c9664..5c8e7d2 100644 --- a/src/common.h +++ b/src/common.h @@ -1,42 +1,42 @@ -#pragma once - -#include -#include -#include - -#define pstruct struct __attribute__((packed)) - -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; -typedef int8_t i8; -typedef int16_t i16; -typedef int32_t i32; -typedef int64_t i64; - -static inline void INT(int n) { - asm volatile ( - "int %0" - : - : "i"(n) - ); -} - -static inline void outb(u16 port, u8 value) { - asm volatile ("outb %0, %1" : : "a"(value), "Nd"(port)); -} -static inline void outw(u16 port, u16 value) { - asm volatile ("outw %0, %1" : : "a"(value), "Nd"(port)); -} -static inline void outd(u16 port, u32 value) { - asm volatile ("outl %0, %1" : : "a"(value), "Nd"(port)); -} - - -void* memcpy(void* restrict dst, const void* src, size_t n); -void* memset(void* s, int c, size_t n); -void* memmove(void* dst, const void* src, size_t n); -int memcmp(const void* s1, const void* s2, size_t n); - -extern u64 hhdm_offset; +#pragma once + +#include +#include +#include + +#define pstruct struct __attribute__((packed)) + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +static inline void INT(int n) { + asm volatile ( + "int %0" + : + : "i"(n) + ); +} + +static inline void outb(u16 port, u8 value) { + asm volatile ("outb %0, %1" : : "a"(value), "Nd"(port)); +} +static inline void outw(u16 port, u16 value) { + asm volatile ("outw %0, %1" : : "a"(value), "Nd"(port)); +} +static inline void outd(u16 port, u32 value) { + asm volatile ("outl %0, %1" : : "a"(value), "Nd"(port)); +} + + +void* memcpy(void* dst, const void* src, size_t n); +void* memset(void* s, int c, size_t n); +void* memmove(void* dst, const void* src, size_t n); +int memcmp(const void* s1, const void* s2, size_t n); +void hang(); +extern u64 hhdm_offset; diff --git a/src/int.c b/src/int.c index e76b128..ec7f739 100644 --- a/src/int.c +++ b/src/int.c @@ -1,282 +1,282 @@ -#include - -// for debugging -#include "print.h" - -#include "common.h" - - -// for trap debugging -u64 dbg_var = 0; - -pstruct int_desc { - u16 addr_low; - u16 selector; - u8 ist; - u8 flags; - u16 addr_mid; - u32 addr_high; - u32 resv; -}; - -enum INT_DESC_FLAGS { - ID_GATE_INT = 0b00001110, - ID_GATE_TRAP = 0b00001111, - ID_DPL = 0b00100000, - ID_PRESENT = 0b10000000, -}; - - -#define CODE64_SELECTOR 0x28 - -struct int_desc idt[256]; - -void set_idt(u8 vect, void* handler, u8 dpl) { - struct int_desc* ent = &idt[vect]; - u64 addr = (u64) handler; - ent->addr_low = addr & 0xFFFF; - ent->addr_mid = (addr >> 16) & 0xFFFF; - ent->addr_high = addr >> 32; - - ent->selector = CODE64_SELECTOR; - ent->flags = ID_GATE_INT | dpl*ID_DPL | ID_PRESENT; - ent->ist = 0; -} - -pstruct idtr { - u16 limit; - u64 base; -}; - -#define IDTR_LIMIT (sizeof(struct int_desc)*256 - 1) - -void load_idt(void* addr) { - struct idtr ir = (struct idtr) { - .limit = IDTR_LIMIT, - .base = (u64) addr, - }; - - asm volatile("lidt %0" :: "m"(ir)); -} - -extern void draw(u8 vect); - -struct cpu_ctx { - u64 r15, r14, r13, r12, r11, r10, r9, r8, rdi, rsi, rdx, rcx, rbx, rax; - - u64 vect; - u64 err; - - u64 iret_rip; - u64 iret_cs; - u64 iret_flags; - u64 iret_rsp; - u64 iret_ss; -}; - -struct cpu_ctx* interrupt_dispatch(struct cpu_ctx* ctx) { - print("\n[IRQ "); - print8(ctx->vect); - print("] with message: "); - print64(dbg_var); - print("\n"); - while(1); - return ctx; -} - -__attribute__((naked)) -void int_stub(void) { - __asm__ volatile ( - "push %%rax\n" - "push %%rbx\n" - "push %%rcx\n" - "push %%rdx\n" - "push %%rsi\n" - "push %%rdi\n" - "push %%r8\n" - "push %%r9\n" - "push %%r10\n" - "push %%r11\n" - "push %%r12\n" - "push %%r13\n" - "push %%r14\n" - "push %%r15\n" - "mov %%rsp, %%rdi\n" - "call interrupt_dispatch\n" - "mov %%rax, %%rsp\n" - "pop %%r15\n" - "pop %%r14\n" - "pop %%r13\n" - "pop %%r12\n" - "pop %%r11\n" - "pop %%r10\n" - "pop %%r9\n" - "pop %%r8\n" - "pop %%rdi\n" - "pop %%rsi\n" - "pop %%rdx\n" - "pop %%rcx\n" - "pop %%rbx\n" - "pop %%rax\n" - "add $16, %%rsp\n" - "iretq\n" - : - : - : "memory" - ); -} - -// Macro to generate interrupt stubs without error codes (push dummy 0) -#define ISR_NO_ERR(num) \ - __attribute__((naked)) void isr##num(void) { \ - asm volatile( \ - "push $0\n" \ - "push %0\n" \ - "jmp int_stub\n" \ - : : "i"(num)); \ - } - -// Macro to generate interrupt stubs with error codes -#define ISR_ERR(num) \ - __attribute__((naked)) void isr##num(void) { \ - asm volatile( \ - "push %0\n" \ - "jmp int_stub\n" \ - : : "i"(num)); \ - } - -// CPU exceptions (0-31) -ISR_NO_ERR(0) // Divide by zero -ISR_NO_ERR(1) // Debug -ISR_NO_ERR(2) // NMI -ISR_NO_ERR(3) // Breakpoint -ISR_NO_ERR(4) // Overflow -ISR_NO_ERR(5) // Bound range exceeded -ISR_NO_ERR(6) // Invalid opcode -ISR_NO_ERR(7) // Device not available -ISR_ERR(8) // Double fault (pushes error code) -ISR_NO_ERR(9) // Coprocessor segment overrun -ISR_ERR(10) // Invalid TSS (pushes error code) -ISR_ERR(11) // Segment not present (pushes error code) -ISR_ERR(12) // Stack-segment fault (pushes error code) -ISR_ERR(13) // General protection fault (pushes error code) -ISR_ERR(14) // Page fault (pushes error code) -ISR_NO_ERR(15) // Reserved -ISR_NO_ERR(16) // x87 FPU error -ISR_ERR(17) // Alignment check (pushes error code) -ISR_NO_ERR(18) // Machine check -ISR_NO_ERR(19) // SIMD floating-point exception -ISR_NO_ERR(20) // Virtualization exception -ISR_ERR(21) // Control protection exception (pushes error code) -ISR_NO_ERR(22) // Reserved -ISR_NO_ERR(23) // Reserved -ISR_NO_ERR(24) // Reserved -ISR_NO_ERR(25) // Reserved -ISR_NO_ERR(26) // Reserved -ISR_NO_ERR(27) // Reserved -ISR_NO_ERR(28) // Reserved -ISR_NO_ERR(29) // Reserved -ISR_ERR(30) // Security exception (pushes error code) -ISR_NO_ERR(31) // Reserved - -// IRQs and user-defined interrupts (32-255) -ISR_NO_ERR(32) ISR_NO_ERR(33) ISR_NO_ERR(34) ISR_NO_ERR(35) -ISR_NO_ERR(36) ISR_NO_ERR(37) ISR_NO_ERR(38) ISR_NO_ERR(39) -ISR_NO_ERR(40) ISR_NO_ERR(41) ISR_NO_ERR(42) ISR_NO_ERR(43) -ISR_NO_ERR(44) ISR_NO_ERR(45) ISR_NO_ERR(46) ISR_NO_ERR(47) -ISR_NO_ERR(48) ISR_NO_ERR(49) ISR_NO_ERR(50) ISR_NO_ERR(51) -ISR_NO_ERR(52) ISR_NO_ERR(53) ISR_NO_ERR(54) ISR_NO_ERR(55) -ISR_NO_ERR(56) ISR_NO_ERR(57) ISR_NO_ERR(58) ISR_NO_ERR(59) -ISR_NO_ERR(60) ISR_NO_ERR(61) ISR_NO_ERR(62) ISR_NO_ERR(63) -ISR_NO_ERR(64) ISR_NO_ERR(65) ISR_NO_ERR(66) ISR_NO_ERR(67) -ISR_NO_ERR(68) ISR_NO_ERR(69) ISR_NO_ERR(70) ISR_NO_ERR(71) -ISR_NO_ERR(72) ISR_NO_ERR(73) ISR_NO_ERR(74) ISR_NO_ERR(75) -ISR_NO_ERR(76) ISR_NO_ERR(77) ISR_NO_ERR(78) ISR_NO_ERR(79) -ISR_NO_ERR(80) ISR_NO_ERR(81) ISR_NO_ERR(82) ISR_NO_ERR(83) -ISR_NO_ERR(84) ISR_NO_ERR(85) ISR_NO_ERR(86) ISR_NO_ERR(87) -ISR_NO_ERR(88) ISR_NO_ERR(89) ISR_NO_ERR(90) ISR_NO_ERR(91) -ISR_NO_ERR(92) ISR_NO_ERR(93) ISR_NO_ERR(94) ISR_NO_ERR(95) -ISR_NO_ERR(96) ISR_NO_ERR(97) ISR_NO_ERR(98) ISR_NO_ERR(99) -ISR_NO_ERR(100) ISR_NO_ERR(101) ISR_NO_ERR(102) ISR_NO_ERR(103) -ISR_NO_ERR(104) ISR_NO_ERR(105) ISR_NO_ERR(106) ISR_NO_ERR(107) -ISR_NO_ERR(108) ISR_NO_ERR(109) ISR_NO_ERR(110) ISR_NO_ERR(111) -ISR_NO_ERR(112) ISR_NO_ERR(113) ISR_NO_ERR(114) ISR_NO_ERR(115) -ISR_NO_ERR(116) ISR_NO_ERR(117) ISR_NO_ERR(118) ISR_NO_ERR(119) -ISR_NO_ERR(120) ISR_NO_ERR(121) ISR_NO_ERR(122) ISR_NO_ERR(123) -ISR_NO_ERR(124) ISR_NO_ERR(125) ISR_NO_ERR(126) ISR_NO_ERR(127) -ISR_NO_ERR(128) ISR_NO_ERR(129) ISR_NO_ERR(130) ISR_NO_ERR(131) -ISR_NO_ERR(132) ISR_NO_ERR(133) ISR_NO_ERR(134) ISR_NO_ERR(135) -ISR_NO_ERR(136) ISR_NO_ERR(137) ISR_NO_ERR(138) ISR_NO_ERR(139) -ISR_NO_ERR(140) ISR_NO_ERR(141) ISR_NO_ERR(142) ISR_NO_ERR(143) -ISR_NO_ERR(144) ISR_NO_ERR(145) ISR_NO_ERR(146) ISR_NO_ERR(147) -ISR_NO_ERR(148) ISR_NO_ERR(149) ISR_NO_ERR(150) ISR_NO_ERR(151) -ISR_NO_ERR(152) ISR_NO_ERR(153) ISR_NO_ERR(154) ISR_NO_ERR(155) -ISR_NO_ERR(156) ISR_NO_ERR(157) ISR_NO_ERR(158) ISR_NO_ERR(159) -ISR_NO_ERR(160) ISR_NO_ERR(161) ISR_NO_ERR(162) ISR_NO_ERR(163) -ISR_NO_ERR(164) ISR_NO_ERR(165) ISR_NO_ERR(166) ISR_NO_ERR(167) -ISR_NO_ERR(168) ISR_NO_ERR(169) ISR_NO_ERR(170) ISR_NO_ERR(171) -ISR_NO_ERR(172) ISR_NO_ERR(173) ISR_NO_ERR(174) ISR_NO_ERR(175) -ISR_NO_ERR(176) ISR_NO_ERR(177) ISR_NO_ERR(178) ISR_NO_ERR(179) -ISR_NO_ERR(180) ISR_NO_ERR(181) ISR_NO_ERR(182) ISR_NO_ERR(183) -ISR_NO_ERR(184) ISR_NO_ERR(185) ISR_NO_ERR(186) ISR_NO_ERR(187) -ISR_NO_ERR(188) ISR_NO_ERR(189) ISR_NO_ERR(190) ISR_NO_ERR(191) -ISR_NO_ERR(192) ISR_NO_ERR(193) ISR_NO_ERR(194) ISR_NO_ERR(195) -ISR_NO_ERR(196) ISR_NO_ERR(197) ISR_NO_ERR(198) ISR_NO_ERR(199) -ISR_NO_ERR(200) ISR_NO_ERR(201) ISR_NO_ERR(202) ISR_NO_ERR(203) -ISR_NO_ERR(204) ISR_NO_ERR(205) ISR_NO_ERR(206) ISR_NO_ERR(207) -ISR_NO_ERR(208) ISR_NO_ERR(209) ISR_NO_ERR(210) ISR_NO_ERR(211) -ISR_NO_ERR(212) ISR_NO_ERR(213) ISR_NO_ERR(214) ISR_NO_ERR(215) -ISR_NO_ERR(216) ISR_NO_ERR(217) ISR_NO_ERR(218) ISR_NO_ERR(219) -ISR_NO_ERR(220) ISR_NO_ERR(221) ISR_NO_ERR(222) ISR_NO_ERR(223) -ISR_NO_ERR(224) ISR_NO_ERR(225) ISR_NO_ERR(226) ISR_NO_ERR(227) -ISR_NO_ERR(228) ISR_NO_ERR(229) ISR_NO_ERR(230) ISR_NO_ERR(231) -ISR_NO_ERR(232) ISR_NO_ERR(233) ISR_NO_ERR(234) ISR_NO_ERR(235) -ISR_NO_ERR(236) ISR_NO_ERR(237) ISR_NO_ERR(238) ISR_NO_ERR(239) -ISR_NO_ERR(240) ISR_NO_ERR(241) ISR_NO_ERR(242) ISR_NO_ERR(243) -ISR_NO_ERR(244) ISR_NO_ERR(245) ISR_NO_ERR(246) ISR_NO_ERR(247) -ISR_NO_ERR(248) ISR_NO_ERR(249) ISR_NO_ERR(250) ISR_NO_ERR(251) -ISR_NO_ERR(252) ISR_NO_ERR(253) ISR_NO_ERR(254) ISR_NO_ERR(255) - -// Array of all ISR handlers for easy initialization -void* isr_table[256] = { - isr0, isr1, isr2, isr3, isr4, isr5, isr6, isr7, - isr8, isr9, isr10, isr11, isr12, isr13, isr14, isr15, - isr16, isr17, isr18, isr19, isr20, isr21, isr22, isr23, - isr24, isr25, isr26, isr27, isr28, isr29, isr30, isr31, - isr32, isr33, isr34, isr35, isr36, isr37, isr38, isr39, - isr40, isr41, isr42, isr43, isr44, isr45, isr46, isr47, - isr48, isr49, isr50, isr51, isr52, isr53, isr54, isr55, - isr56, isr57, isr58, isr59, isr60, isr61, isr62, isr63, - isr64, isr65, isr66, isr67, isr68, isr69, isr70, isr71, - isr72, isr73, isr74, isr75, isr76, isr77, isr78, isr79, - isr80, isr81, isr82, isr83, isr84, isr85, isr86, isr87, - isr88, isr89, isr90, isr91, isr92, isr93, isr94, isr95, - isr96, isr97, isr98, isr99, isr100, isr101, isr102, isr103, - isr104, isr105, isr106, isr107, isr108, isr109, isr110, isr111, - isr112, isr113, isr114, isr115, isr116, isr117, isr118, isr119, - isr120, isr121, isr122, isr123, isr124, isr125, isr126, isr127, - isr128, isr129, isr130, isr131, isr132, isr133, isr134, isr135, - isr136, isr137, isr138, isr139, isr140, isr141, isr142, isr143, - isr144, isr145, isr146, isr147, isr148, isr149, isr150, isr151, - isr152, isr153, isr154, isr155, isr156, isr157, isr158, isr159, - isr160, isr161, isr162, isr163, isr164, isr165, isr166, isr167, - isr168, isr169, isr170, isr171, isr172, isr173, isr174, isr175, - isr176, isr177, isr178, isr179, isr180, isr181, isr182, isr183, - isr184, isr185, isr186, isr187, isr188, isr189, isr190, isr191, - isr192, isr193, isr194, isr195, isr196, isr197, isr198, isr199, - isr200, isr201, isr202, isr203, isr204, isr205, isr206, isr207, - isr208, isr209, isr210, isr211, isr212, isr213, isr214, isr215, - isr216, isr217, isr218, isr219, isr220, isr221, isr222, isr223, - isr224, isr225, isr226, isr227, isr228, isr229, isr230, isr231, - isr232, isr233, isr234, isr235, isr236, isr237, isr238, isr239, - isr240, isr241, isr242, isr243, isr244, isr245, isr246, isr247, - isr248, isr249, isr250, isr251, isr252, isr253, isr254, isr255, -}; - -// Initialize all IDT entries -void init_idt(void) { - for (int i = 0; i < 256; i++) { - set_idt(i, isr_table[i], 0); - } - load_idt(idt); -} +#include + +// for debugging +#include "print.h" + +#include "common.h" + + +// for trap debugging +u64 dbg_var = 0; + +pstruct int_desc { + u16 addr_low; + u16 selector; + u8 ist; + u8 flags; + u16 addr_mid; + u32 addr_high; + u32 resv; +}; + +enum INT_DESC_FLAGS { + ID_GATE_INT = 0b00001110, + ID_GATE_TRAP = 0b00001111, + ID_DPL = 0b00100000, + ID_PRESENT = 0b10000000, +}; + + +#define CODE64_SELECTOR 0x28 + +struct int_desc idt[256]; + +void set_idt(u8 vect, void* handler, u8 dpl) { + struct int_desc* ent = &idt[vect]; + u64 addr = (u64) handler; + ent->addr_low = addr & 0xFFFF; + ent->addr_mid = (addr >> 16) & 0xFFFF; + ent->addr_high = addr >> 32; + + ent->selector = CODE64_SELECTOR; + ent->flags = ID_GATE_INT | dpl*ID_DPL | ID_PRESENT; + ent->ist = 0; +} + +pstruct idtr { + u16 limit; + u64 base; +}; + +#define IDTR_LIMIT (sizeof(struct int_desc)*256 - 1) + +void load_idt(void* addr) { + struct idtr ir = (struct idtr) { + .limit = IDTR_LIMIT, + .base = (u64) addr, + }; + + asm volatile("lidt %0" :: "m"(ir)); +} + +extern void draw(u8 vect); + +struct cpu_ctx { + u64 r15, r14, r13, r12, r11, r10, r9, r8, rdi, rsi, rdx, rcx, rbx, rax; + + u64 vect; + u64 err; + + u64 iret_rip; + u64 iret_cs; + u64 iret_flags; + u64 iret_rsp; + u64 iret_ss; +}; + +struct cpu_ctx* interrupt_dispatch(struct cpu_ctx* ctx) { + print("\n[IRQ "); + print8(ctx->vect); + print("] with message: "); + print64(dbg_var); + print("\n"); + while(1); + return ctx; +} + +__attribute__((naked)) +void int_stub(void) { + __asm__ volatile ( + "push %%rax\n" + "push %%rbx\n" + "push %%rcx\n" + "push %%rdx\n" + "push %%rsi\n" + "push %%rdi\n" + "push %%r8\n" + "push %%r9\n" + "push %%r10\n" + "push %%r11\n" + "push %%r12\n" + "push %%r13\n" + "push %%r14\n" + "push %%r15\n" + "mov %%rsp, %%rdi\n" + "call interrupt_dispatch\n" + "mov %%rax, %%rsp\n" + "pop %%r15\n" + "pop %%r14\n" + "pop %%r13\n" + "pop %%r12\n" + "pop %%r11\n" + "pop %%r10\n" + "pop %%r9\n" + "pop %%r8\n" + "pop %%rdi\n" + "pop %%rsi\n" + "pop %%rdx\n" + "pop %%rcx\n" + "pop %%rbx\n" + "pop %%rax\n" + "add $16, %%rsp\n" + "iretq\n" + : + : + : "memory" + ); +} + +// Macro to generate interrupt stubs without error codes (push dummy 0) +#define ISR_NO_ERR(num) \ + __attribute__((naked)) void isr##num(void) { \ + asm volatile( \ + "push $0\n" \ + "push %0\n" \ + "jmp int_stub\n" \ + : : "i"(num)); \ + } + +// Macro to generate interrupt stubs with error codes +#define ISR_ERR(num) \ + __attribute__((naked)) void isr##num(void) { \ + asm volatile( \ + "push %0\n" \ + "jmp int_stub\n" \ + : : "i"(num)); \ + } + +// CPU exceptions (0-31) +ISR_NO_ERR(0) // Divide by zero +ISR_NO_ERR(1) // Debug +ISR_NO_ERR(2) // NMI +ISR_NO_ERR(3) // Breakpoint +ISR_NO_ERR(4) // Overflow +ISR_NO_ERR(5) // Bound range exceeded +ISR_NO_ERR(6) // Invalid opcode +ISR_NO_ERR(7) // Device not available +ISR_ERR(8) // Double fault (pushes error code) +ISR_NO_ERR(9) // Coprocessor segment overrun +ISR_ERR(10) // Invalid TSS (pushes error code) +ISR_ERR(11) // Segment not present (pushes error code) +ISR_ERR(12) // Stack-segment fault (pushes error code) +ISR_ERR(13) // General protection fault (pushes error code) +ISR_ERR(14) // Page fault (pushes error code) +ISR_NO_ERR(15) // Reserved +ISR_NO_ERR(16) // x87 FPU error +ISR_ERR(17) // Alignment check (pushes error code) +ISR_NO_ERR(18) // Machine check +ISR_NO_ERR(19) // SIMD floating-point exception +ISR_NO_ERR(20) // Virtualization exception +ISR_ERR(21) // Control protection exception (pushes error code) +ISR_NO_ERR(22) // Reserved +ISR_NO_ERR(23) // Reserved +ISR_NO_ERR(24) // Reserved +ISR_NO_ERR(25) // Reserved +ISR_NO_ERR(26) // Reserved +ISR_NO_ERR(27) // Reserved +ISR_NO_ERR(28) // Reserved +ISR_NO_ERR(29) // Reserved +ISR_ERR(30) // Security exception (pushes error code) +ISR_NO_ERR(31) // Reserved + +// IRQs and user-defined interrupts (32-255) +ISR_NO_ERR(32) ISR_NO_ERR(33) ISR_NO_ERR(34) ISR_NO_ERR(35) +ISR_NO_ERR(36) ISR_NO_ERR(37) ISR_NO_ERR(38) ISR_NO_ERR(39) +ISR_NO_ERR(40) ISR_NO_ERR(41) ISR_NO_ERR(42) ISR_NO_ERR(43) +ISR_NO_ERR(44) ISR_NO_ERR(45) ISR_NO_ERR(46) ISR_NO_ERR(47) +ISR_NO_ERR(48) ISR_NO_ERR(49) ISR_NO_ERR(50) ISR_NO_ERR(51) +ISR_NO_ERR(52) ISR_NO_ERR(53) ISR_NO_ERR(54) ISR_NO_ERR(55) +ISR_NO_ERR(56) ISR_NO_ERR(57) ISR_NO_ERR(58) ISR_NO_ERR(59) +ISR_NO_ERR(60) ISR_NO_ERR(61) ISR_NO_ERR(62) ISR_NO_ERR(63) +ISR_NO_ERR(64) ISR_NO_ERR(65) ISR_NO_ERR(66) ISR_NO_ERR(67) +ISR_NO_ERR(68) ISR_NO_ERR(69) ISR_NO_ERR(70) ISR_NO_ERR(71) +ISR_NO_ERR(72) ISR_NO_ERR(73) ISR_NO_ERR(74) ISR_NO_ERR(75) +ISR_NO_ERR(76) ISR_NO_ERR(77) ISR_NO_ERR(78) ISR_NO_ERR(79) +ISR_NO_ERR(80) ISR_NO_ERR(81) ISR_NO_ERR(82) ISR_NO_ERR(83) +ISR_NO_ERR(84) ISR_NO_ERR(85) ISR_NO_ERR(86) ISR_NO_ERR(87) +ISR_NO_ERR(88) ISR_NO_ERR(89) ISR_NO_ERR(90) ISR_NO_ERR(91) +ISR_NO_ERR(92) ISR_NO_ERR(93) ISR_NO_ERR(94) ISR_NO_ERR(95) +ISR_NO_ERR(96) ISR_NO_ERR(97) ISR_NO_ERR(98) ISR_NO_ERR(99) +ISR_NO_ERR(100) ISR_NO_ERR(101) ISR_NO_ERR(102) ISR_NO_ERR(103) +ISR_NO_ERR(104) ISR_NO_ERR(105) ISR_NO_ERR(106) ISR_NO_ERR(107) +ISR_NO_ERR(108) ISR_NO_ERR(109) ISR_NO_ERR(110) ISR_NO_ERR(111) +ISR_NO_ERR(112) ISR_NO_ERR(113) ISR_NO_ERR(114) ISR_NO_ERR(115) +ISR_NO_ERR(116) ISR_NO_ERR(117) ISR_NO_ERR(118) ISR_NO_ERR(119) +ISR_NO_ERR(120) ISR_NO_ERR(121) ISR_NO_ERR(122) ISR_NO_ERR(123) +ISR_NO_ERR(124) ISR_NO_ERR(125) ISR_NO_ERR(126) ISR_NO_ERR(127) +ISR_NO_ERR(128) ISR_NO_ERR(129) ISR_NO_ERR(130) ISR_NO_ERR(131) +ISR_NO_ERR(132) ISR_NO_ERR(133) ISR_NO_ERR(134) ISR_NO_ERR(135) +ISR_NO_ERR(136) ISR_NO_ERR(137) ISR_NO_ERR(138) ISR_NO_ERR(139) +ISR_NO_ERR(140) ISR_NO_ERR(141) ISR_NO_ERR(142) ISR_NO_ERR(143) +ISR_NO_ERR(144) ISR_NO_ERR(145) ISR_NO_ERR(146) ISR_NO_ERR(147) +ISR_NO_ERR(148) ISR_NO_ERR(149) ISR_NO_ERR(150) ISR_NO_ERR(151) +ISR_NO_ERR(152) ISR_NO_ERR(153) ISR_NO_ERR(154) ISR_NO_ERR(155) +ISR_NO_ERR(156) ISR_NO_ERR(157) ISR_NO_ERR(158) ISR_NO_ERR(159) +ISR_NO_ERR(160) ISR_NO_ERR(161) ISR_NO_ERR(162) ISR_NO_ERR(163) +ISR_NO_ERR(164) ISR_NO_ERR(165) ISR_NO_ERR(166) ISR_NO_ERR(167) +ISR_NO_ERR(168) ISR_NO_ERR(169) ISR_NO_ERR(170) ISR_NO_ERR(171) +ISR_NO_ERR(172) ISR_NO_ERR(173) ISR_NO_ERR(174) ISR_NO_ERR(175) +ISR_NO_ERR(176) ISR_NO_ERR(177) ISR_NO_ERR(178) ISR_NO_ERR(179) +ISR_NO_ERR(180) ISR_NO_ERR(181) ISR_NO_ERR(182) ISR_NO_ERR(183) +ISR_NO_ERR(184) ISR_NO_ERR(185) ISR_NO_ERR(186) ISR_NO_ERR(187) +ISR_NO_ERR(188) ISR_NO_ERR(189) ISR_NO_ERR(190) ISR_NO_ERR(191) +ISR_NO_ERR(192) ISR_NO_ERR(193) ISR_NO_ERR(194) ISR_NO_ERR(195) +ISR_NO_ERR(196) ISR_NO_ERR(197) ISR_NO_ERR(198) ISR_NO_ERR(199) +ISR_NO_ERR(200) ISR_NO_ERR(201) ISR_NO_ERR(202) ISR_NO_ERR(203) +ISR_NO_ERR(204) ISR_NO_ERR(205) ISR_NO_ERR(206) ISR_NO_ERR(207) +ISR_NO_ERR(208) ISR_NO_ERR(209) ISR_NO_ERR(210) ISR_NO_ERR(211) +ISR_NO_ERR(212) ISR_NO_ERR(213) ISR_NO_ERR(214) ISR_NO_ERR(215) +ISR_NO_ERR(216) ISR_NO_ERR(217) ISR_NO_ERR(218) ISR_NO_ERR(219) +ISR_NO_ERR(220) ISR_NO_ERR(221) ISR_NO_ERR(222) ISR_NO_ERR(223) +ISR_NO_ERR(224) ISR_NO_ERR(225) ISR_NO_ERR(226) ISR_NO_ERR(227) +ISR_NO_ERR(228) ISR_NO_ERR(229) ISR_NO_ERR(230) ISR_NO_ERR(231) +ISR_NO_ERR(232) ISR_NO_ERR(233) ISR_NO_ERR(234) ISR_NO_ERR(235) +ISR_NO_ERR(236) ISR_NO_ERR(237) ISR_NO_ERR(238) ISR_NO_ERR(239) +ISR_NO_ERR(240) ISR_NO_ERR(241) ISR_NO_ERR(242) ISR_NO_ERR(243) +ISR_NO_ERR(244) ISR_NO_ERR(245) ISR_NO_ERR(246) ISR_NO_ERR(247) +ISR_NO_ERR(248) ISR_NO_ERR(249) ISR_NO_ERR(250) ISR_NO_ERR(251) +ISR_NO_ERR(252) ISR_NO_ERR(253) ISR_NO_ERR(254) ISR_NO_ERR(255) + +// Array of all ISR handlers for easy initialization +void* isr_table[256] = { + isr0, isr1, isr2, isr3, isr4, isr5, isr6, isr7, + isr8, isr9, isr10, isr11, isr12, isr13, isr14, isr15, + isr16, isr17, isr18, isr19, isr20, isr21, isr22, isr23, + isr24, isr25, isr26, isr27, isr28, isr29, isr30, isr31, + isr32, isr33, isr34, isr35, isr36, isr37, isr38, isr39, + isr40, isr41, isr42, isr43, isr44, isr45, isr46, isr47, + isr48, isr49, isr50, isr51, isr52, isr53, isr54, isr55, + isr56, isr57, isr58, isr59, isr60, isr61, isr62, isr63, + isr64, isr65, isr66, isr67, isr68, isr69, isr70, isr71, + isr72, isr73, isr74, isr75, isr76, isr77, isr78, isr79, + isr80, isr81, isr82, isr83, isr84, isr85, isr86, isr87, + isr88, isr89, isr90, isr91, isr92, isr93, isr94, isr95, + isr96, isr97, isr98, isr99, isr100, isr101, isr102, isr103, + isr104, isr105, isr106, isr107, isr108, isr109, isr110, isr111, + isr112, isr113, isr114, isr115, isr116, isr117, isr118, isr119, + isr120, isr121, isr122, isr123, isr124, isr125, isr126, isr127, + isr128, isr129, isr130, isr131, isr132, isr133, isr134, isr135, + isr136, isr137, isr138, isr139, isr140, isr141, isr142, isr143, + isr144, isr145, isr146, isr147, isr148, isr149, isr150, isr151, + isr152, isr153, isr154, isr155, isr156, isr157, isr158, isr159, + isr160, isr161, isr162, isr163, isr164, isr165, isr166, isr167, + isr168, isr169, isr170, isr171, isr172, isr173, isr174, isr175, + isr176, isr177, isr178, isr179, isr180, isr181, isr182, isr183, + isr184, isr185, isr186, isr187, isr188, isr189, isr190, isr191, + isr192, isr193, isr194, isr195, isr196, isr197, isr198, isr199, + isr200, isr201, isr202, isr203, isr204, isr205, isr206, isr207, + isr208, isr209, isr210, isr211, isr212, isr213, isr214, isr215, + isr216, isr217, isr218, isr219, isr220, isr221, isr222, isr223, + isr224, isr225, isr226, isr227, isr228, isr229, isr230, isr231, + isr232, isr233, isr234, isr235, isr236, isr237, isr238, isr239, + isr240, isr241, isr242, isr243, isr244, isr245, isr246, isr247, + isr248, isr249, isr250, isr251, isr252, isr253, isr254, isr255, +}; + +// Initialize all IDT entries +void init_idt(void) { + for (int i = 0; i < 256; i++) { + set_idt(i, isr_table[i], 0); + } + load_idt(idt); +} diff --git a/src/main.c b/src/main.c index bc6174a..1d5fb09 100644 --- a/src/main.c +++ b/src/main.c @@ -1,246 +1,196 @@ -#include -#include -#include - -#include "../include/limine.h" - -#include "acpi.h" -#include "common.h" -#include "print.h" - -// credit owed to https://wiki.osdev.org/Limine_Bare_Bones for the limine setup code - -__attribute__((used, section(".limine_requests"))) -static volatile u64 limine_base_revision[] = LIMINE_BASE_REVISION(4); - -__attribute__((used, section(".limine_requests"))) -static volatile struct limine_framebuffer_request fb_req = { - .id = LIMINE_FRAMEBUFFER_REQUEST_ID, - .revision = 0 -}; - - -__attribute__((used, section(".limine_requests"))) -static volatile struct limine_memmap_request mem_req = { - .id = LIMINE_MEMMAP_REQUEST_ID, - .revision = 0, -}; - -__attribute__((used, section(".limine_requests"))) -static volatile struct limine_hhdm_request hhdm_req = { - .id = LIMINE_HHDM_REQUEST_ID, - .revision = 0 -}; - -__attribute__((used, section(".limine_requests"))) -static volatile struct limine_rsdp_request rsdp_req = { - .id = LIMINE_RSDP_REQUEST_ID, - .revision = 0 -}; - -u64 hhdm_offset; - -__attribute__((used, section(".limine_requests_start"))) -static volatile u64 limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER; - -__attribute__((used, section(".limine_requests_end"))) -static volatile u64 limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER; - -void* memcpy(void* restrict dst, const void* src, size_t n) { - u8* restrict pdst = (u8* restrict)dst; - const u8* restrict psrc = (const u8* restrict)src; - - for(size_t i = 0; i < n; i++) { - pdst[i] = psrc[i]; - } - - return dst; -} - -void* memset(void* s, int c, size_t n) { - u8* p = (u8*) s; - - for(size_t i = 0; i < n; i++) { - p[i] = (u8)c; - } - - return s; -} - -void* memmove(void* dst, const void* src, size_t n) { - u8* restrict pdst = (u8* restrict)dst; - const u8* restrict psrc = (const u8* restrict)src; - - if(src > dst) { - for(size_t i = 0; i < n; i++) { - pdst[i] = psrc[i]; - } - } else if(src < dst) { - for(size_t i = n; i > 0; i--) { - pdst[i-1] = psrc[i-1]; - } - } - - return dst; -} - -int memcmp(const void* s1, const void* s2, size_t n) { - const u8* p1 = (const u8* )s1; - const u8* p2 = (const u8* )s2; - - for(size_t i = 0; i < n; i++) { - if(p1[i] != p2[i]) { - return p1[i] < p2[i] ? -1 : 1; - } - } - - return 0; -} - -static void hang() { - for(;;) { - asm ("hlt"); - } -} - - -struct limine_framebuffer* fb; - -void draw(u8 vect) { - for(size_t y = 0; y < fb->height; y++) { - for(size_t x = 0; x < fb->width; x++) { - volatile u32* fb_ptr = fb->address; - fb_ptr[y * fb->width + x] = ( - (x + y) * 0x00010000 | - (x ^ y) * 0x00000100 | - (x - y) * 0x00000001 - )*vect; - } - } -} - -extern void init_idt(void); - -extern u32 fg; -extern u32 bg; -void print_memmap_entry(struct limine_memmap_entry* entry) { - u32 savefg = fg; - u32 savebg = bg; - static const char* type_strs[] = { - "Usable", - "Reserved", - "ACPI Reclaimable", - "ACPI NVS", - "BAD!!!", - "Bootloader Reclaimable", - "Executable and Modules", - "Framebuffer", - "ACPI Tables", - }; - - static u32 type_colors[] = { - 0x00AF00, - 0xAF1F00, - 0x7f7f00, - 0x7f7f00, - 0xFF0000, - 0x007f7f, - 0x408000, - 0x0000FF, - 0x00FF00 - }; - - bg = type_colors[entry->type]; - fg = ~bg; - - u64 addr = entry->base; - u64 end = addr + entry->length; - print("["); - print(type_strs[entry->type]); - print("]"); - print64(addr); - print(" - "); - print64(end); - print("\n"); - fg = savefg; - bg = savebg; -} - - - -u32 apic_get_local_base(); -void apic_enable(); - -void kmain() { - if(LIMINE_BASE_REVISION_SUPPORTED(limine_base_revision) == false) { - hang(); - } - - if(fb_req.response == NULL || fb_req.response->framebuffer_count < 1) { - hang(); - } - - fb = fb_req.response->framebuffers[0]; - - print_init(fb); - init_idt(); - - if(!mem_req.response) { - print("Failed to get memory map :(\n)"); - hang(); - } - - if(!hhdm_req.response) { - print("Failed to get higher half direct mapping\n."); - hang(); - } - - hhdm_offset = hhdm_req.response->offset; - - if(!rsdp_req.response) { - print ("Failed to find rsdp\n."); - hang(); - } - - rsdp = (struct acpi_rsdp_header*)(rsdp_req.response->address); - - for(size_t i = 0; i < mem_req.response->entry_count; i++) { - print_memmap_entry(mem_req.response->entries[i]); - } - - print("Found RSDP @ 0x"); - print64((u64)rsdp); - put('\n'); - - print("With signature: "); - printn((char*)rsdp->signature, sizeof(rsdp->signature)); - - print(" v"); - print8(rsdp->revision); - print("\nRSDT at 0x"); - struct acpi_rsdt* rsdt = - (struct acpi_rsdt*)( - (rsdp->revision? rsdp->ptr64:rsdp->ptr32) + hhdm_offset - ); - print64((u64)rsdt); - print("\nSDT Signature: "); - - - printn((const char*) rsdt->signature, sizeof(rsdt->signature)); - print("\nAPIC Local Base: "); - - /* I should check cpuid to ensure its supported but it will - * be for my machines ;^) */ - /* APIC stuff */ - u32 r = 0xDEADBEEF; - r = apic_get_local_base(); - print32(r); - - apic_enable(); - - print("\nAPIC Enabled"); - - hang(); - -} - +#include +#include +#include + +#include "../include/limine.h" + +#include "acpi.h" +#include "alloc.h" +#include "common.h" +#include "print.h" + +// credit owed to https://wiki.osdev.org/Limine_Bare_Bones for the limine setup code + +__attribute__((used, section(".limine_requests"))) +static volatile u64 limine_base_revision[] = LIMINE_BASE_REVISION(4); + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_framebuffer_request fb_req = { + .id = LIMINE_FRAMEBUFFER_REQUEST_ID, + .revision = 0 +}; + + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_hhdm_request hhdm_req = { + .id = LIMINE_HHDM_REQUEST_ID, + .revision = 0 +}; + +__attribute__((used, section(".limine_requests"))) +static volatile struct limine_rsdp_request rsdp_req = { + .id = LIMINE_RSDP_REQUEST_ID, + .revision = 0 +}; + +u64 hhdm_offset; + +__attribute__((used, section(".limine_requests_start"))) +static volatile u64 limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER; + +__attribute__((used, section(".limine_requests_end"))) +static volatile u64 limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER; + +void* memcpy(void* restrict dst, const void* src, size_t n) { + u8* restrict pdst = (u8* restrict)dst; + const u8* restrict psrc = (const u8* restrict)src; + + for(size_t i = 0; i < n; i++) { + pdst[i] = psrc[i]; + } + + return dst; +} + +void* memset(void* s, int c, size_t n) { + u8* p = (u8*) s; + + for(size_t i = 0; i < n; i++) { + p[i] = (u8)c; + } + + return s; +} + +void* memmove(void* dst, const void* src, size_t n) { + u8* restrict pdst = (u8* restrict)dst; + const u8* restrict psrc = (const u8* restrict)src; + + if(src > dst) { + for(size_t i = 0; i < n; i++) { + pdst[i] = psrc[i]; + } + } else if(src < dst) { + for(size_t i = n; i > 0; i--) { + pdst[i-1] = psrc[i-1]; + } + } + + return dst; +} + +int memcmp(const void* s1, const void* s2, size_t n) { + const u8* p1 = (const u8* )s1; + const u8* p2 = (const u8* )s2; + + for(size_t i = 0; i < n; i++) { + if(p1[i] != p2[i]) { + return p1[i] < p2[i] ? -1 : 1; + } + } + + return 0; +} + +void hang() { + for(;;) { + asm ("hlt"); + } +} + + +struct limine_framebuffer* fb; + +void draw(u8 vect) { + for(size_t y = 0; y < fb->height; y++) { + for(size_t x = 0; x < fb->width; x++) { + volatile u32* fb_ptr = fb->address; + fb_ptr[y * fb->width + x] = ( + (x + y) * 0x00010000 | + (x ^ y) * 0x00000100 | + (x - y) * 0x00000001 + )*vect; + } + } +} + +extern void init_idt(void); + +extern u32 fg; +extern u32 bg; + + + +u32 apic_get_local_base(); +void apic_enable(); +void setup_identity_mapping(); + +void kmain() { + if(LIMINE_BASE_REVISION_SUPPORTED(limine_base_revision) == false) { + hang(); + } + + if(fb_req.response == NULL || fb_req.response->framebuffer_count < 1) { + hang(); + } + + fb = fb_req.response->framebuffers[0]; + + print_init(fb); + init_idt(); + + + + if(!hhdm_req.response) { + print("Failed to get higher half direct mapping\n."); + hang(); + } + + hhdm_offset = hhdm_req.response->offset; + + if(!rsdp_req.response) { + print ("Failed to find rsdp\n."); + hang(); + } + + alloc_init(); + + rsdp = (struct acpi_rsdp_header*)(rsdp_req.response->address); + + + print("Found RSDP @ 0x"); + print64((u64)rsdp); + put('\n'); + + print("With signature: "); + printn((char*)rsdp->signature, sizeof(rsdp->signature)); + + print(" v"); + print8(rsdp->revision); + print("\nRSDT at 0x"); + struct acpi_rsdt* rsdt = + (struct acpi_rsdt*)( + (rsdp->revision? rsdp->ptr64:rsdp->ptr32) + hhdm_offset + ); + print64((u64)rsdt); + print("\nSDT Signature: "); + + + printn((const char*) rsdt->signature, sizeof(rsdt->signature)); + print("\nAPIC Local Base: "); + + /* I should check cpuid to ensure its supported but it will + * be for my machines ;^) */ + /* APIC stuff */ + u32 r = 0xDEADBEEF; + r = apic_get_local_base(); + print32(r); + + apic_enable(); + + print("\nAPIC Enabled"); + + hang(); + +} + diff --git a/src/map.c b/src/map.c new file mode 100644 index 0000000..b8a28de --- /dev/null +++ b/src/map.c @@ -0,0 +1,388 @@ +#include "alloc.h" +#include "common.h" +#include "print.h" + +// MMIO (Memory-Mapped I/O) Mapping for ACPI and other hardware registers +// +// CRITICAL: MMIO regions are NOT regular RAM! +// - They're not in Limine's memory map as "usable" +// - They're often above the RAM limit +// - Limine does NOT map them automatically +// - You must manually map them before accessing + +// Page table entry structure +struct page_entry { + u64 present : 1; + u64 writable : 1; + u64 user : 1; + u64 write_through : 1; + u64 cache_disabled : 1; // IMPORTANT for MMIO! + u64 accessed : 1; + u64 dirty : 1; + u64 huge_page : 1; + u64 global : 1; + u64 unused : 3; + u64 frame : 40; + u64 reserved : 11; + u64 no_execute : 1; +}; + +extern u64 hhdm_offset; + + +// Get current page tables +static u64 get_cr3() { + u64 cr3; + asm volatile("mov %%cr3, %0" : "=r"(cr3)); + return cr3 & ~0xFFF; +} + +static u64 alloc_page_table() { + void* a = alloc((1<<12) / PAGE_SIZE); + return a? virt_to_phys(a) : 0; +} + +// Get or create a page table entry at any level +static struct page_entry* get_or_create_table(struct page_entry *table, u64 index) { + if (!table[index].present) { + u64 new_table_phys = alloc_page_table(); + if (new_table_phys == 0) { + return NULL; + } + + table[index].present = 1; + table[index].writable = 1; + table[index].user = 0; + table[index].frame = new_table_phys >> 12; + } + + u64 next_table_phys = (u64)table[index].frame << 12; + return (struct page_entry*)phys_to_virt(next_table_phys); +} + +// Map a MMIO page with proper cache settings +// physical_addr: Physical address of MMIO region +// size: Size in bytes (will be rounded up to 4KB pages) +// Returns: Virtual address to access the MMIO region +void* map_mmio(u64 physical_addr, u64 size) { + print("Mapping MMIO region:\n"); + print(" Physical: 0x"); + print64(physical_addr); + print("\n Size: 0x"); + print64(size); + print(" ("); + print64(size); + print(" bytes)\n"); + + // Align physical address down to page boundary + u64 phys_base = physical_addr & ~(PAGE_SIZE-1); + u64 offset_in_page = physical_addr & (PAGE_SIZE-1); + + // Calculate number of pages needed + u64 total_size = size + offset_in_page; + u64 num_pages = (total_size + PAGE_SIZE - 1) / PAGE_SIZE; + + print(" Aligned physical: 0x"); + print64(phys_base); + print("\n Offset in page: 0x"); + print64(offset_in_page); + print("\n Pages needed: "); + print64(num_pages); + print("\n"); + + // For MMIO, we typically map to the HHDM region + // Virtual address = Physical address + HHDM offset + u64 virt_base = phys_base + hhdm_offset; + + print(" Target virtual: 0x"); + print64(virt_base); + print("\n"); + + // Get current page tables + u64 pml4_phys = get_cr3(); + struct page_entry *pml4 = (struct page_entry*)phys_to_virt(pml4_phys); + + // Map each page + for (u64 i = 0; i < num_pages; i++) { + u64 current_phys = phys_base + (i * PAGE_SIZE); + u64 current_virt = virt_base + (i * PAGE_SIZE); + + // Extract indices + u64 pml4_index = (current_virt >> 39) & 0x1FF; + u64 pdpt_index = (current_virt >> 30) & 0x1FF; + u64 pd_index = (current_virt >> 21) & 0x1FF; + u64 pt_index = (current_virt >> 12) & 0x1FF; + + // Walk/create page table hierarchy + struct page_entry *pdpt = get_or_create_table(pml4, pml4_index); + if (!pdpt) { + print("ERROR: Failed to get/create PDPT\n"); + return NULL; + } + + struct page_entry *pd = get_or_create_table(pdpt, pdpt_index); + if (!pd) { + print("ERROR: Failed to get/create PD\n"); + return NULL; + } + + struct page_entry *pt = get_or_create_table(pd, pd_index); + if (!pt) { + print("ERROR: Failed to get/create PT\n"); + return NULL; + } + + // Map the page with MMIO-appropriate settings + pt[pt_index].present = 1; + pt[pt_index].writable = 1; + pt[pt_index].user = 0; + pt[pt_index].cache_disabled = 1; // CRITICAL: Disable caching for MMIO! + pt[pt_index].write_through = 0; + pt[pt_index].no_execute = 1; // Don't execute from MMIO + pt[pt_index].frame = current_phys >> 12; + + // Flush TLB for this page + asm volatile("invlpg (%0)" :: "r"(current_virt) : "memory"); + } + + print(" MMIO mapped successfully!\n"); + print(" Access at virtual: 0x"); + print64(virt_base + offset_in_page); + print("\n\n"); + + // Return virtual address (with original offset) + return (void*)(virt_base + offset_in_page); +} + +// Unmap MMIO region +void unmap_mmio(void *virtual_addr, u64 size) { + u64 virt_base = (u64)virtual_addr & ~0xFFF; + u64 num_pages = (size + ((u64)virtual_addr & 0xFFF) + 0xFFF) / 4096; + + u64 pml4_phys = get_cr3(); + struct page_entry *pml4 = (struct page_entry*)phys_to_virt(pml4_phys); + + for (u64 i = 0; i < num_pages; i++) { + u64 current_virt = virt_base + (i * 4096); + + u64 pml4_index = (current_virt >> 39) & 0x1FF; + u64 pdpt_index = (current_virt >> 30) & 0x1FF; + u64 pd_index = (current_virt >> 21) & 0x1FF; + u64 pt_index = (current_virt >> 12) & 0x1FF; + + if (!pml4[pml4_index].present) continue; + struct page_entry *pdpt = phys_to_virt((u64)pml4[pml4_index].frame << 12); + + if (!pdpt[pdpt_index].present) continue; + struct page_entry *pd = phys_to_virt((u64)pdpt[pdpt_index].frame << 12); + + if (!pd[pd_index].present) continue; + struct page_entry *pt = phys_to_virt((u64)pd[pd_index].frame << 12); + + if (!pt[pt_index].present) continue; + + // Clear the entry + *((u64*)&pt[pt_index]) = 0; + + // Flush TLB + asm volatile("invlpg (%0)" :: "r"(current_virt) : "memory"); + } +} + +// Check if a physical address is already mapped +int is_mapped(u64 physical_addr) { + u64 virtual_addr = physical_addr + hhdm_offset; + + u64 pml4_phys = get_cr3(); + struct page_entry *pml4 = phys_to_virt(pml4_phys); + + u64 pml4_index = (virtual_addr >> 39) & 0x1FF; + u64 pdpt_index = (virtual_addr >> 30) & 0x1FF; + u64 pd_index = (virtual_addr >> 21) & 0x1FF; + u64 pt_index = (virtual_addr >> 12) & 0x1FF; + + if (!pml4[pml4_index].present) return 0; + struct page_entry *pdpt = phys_to_virt((u64)pml4[pml4_index].frame << 12); + + if (!pdpt[pdpt_index].present) return 0; + + // Check for 1GB huge page + if (pdpt[pdpt_index].huge_page) return 1; + + struct page_entry *pd = phys_to_virt((u64)pdpt[pdpt_index].frame << 12); + + if (!pd[pd_index].present) return 0; + + // Check for 2MB huge page + if (pd[pd_index].huge_page) return 1; + + struct page_entry *pt = phys_to_virt((u64)pd[pd_index].frame << 12); + + return pt[pt_index].present; +} + + +// Read from ACPI register (8-bit) +u8 acpi_read8(void *mmio_base, u64 offset) { + volatile u8 *addr = (volatile u8*)((u64)mmio_base + offset); + return *addr; +} + +// Read from ACPI register (16-bit) +u16 acpi_read16(void *mmio_base, u64 offset) { + volatile u16 *addr = (volatile u16*)((u64)mmio_base + offset); + return *addr; +} + +// Read from ACPI register (32-bit) +u32 acpi_read32(void *mmio_base, u64 offset) { + volatile u32 *addr = (volatile u32*)((u64)mmio_base + offset); + return *addr; +} + +// Read from ACPI register (64-bit) +u64 acpi_read64(void *mmio_base, u64 offset) { + volatile u64 *addr = (volatile u64*)((u64)mmio_base + offset); + return *addr; +} + +// Write to ACPI register (8-bit) +void acpi_write8(void *mmio_base, u64 offset, u8 value) { + volatile u8 *addr = (volatile u8*)((u64)mmio_base + offset); + *addr = value; +} + +// Write to ACPI register (16-bit) +void acpi_write16(void *mmio_base, u64 offset, u16 value) { + volatile u16 *addr = (volatile u16*)((u64)mmio_base + offset); + *addr = value; +} + +// Write to ACPI register (32-bit) +void acpi_write32(void *mmio_base, u64 offset, u32 value) { + volatile u32 *addr = (volatile u32*)((u64)mmio_base + offset); + *addr = value; +} + +// Write to ACPI register (64-bit) +void acpi_write64(void *mmio_base, u64 offset, u64 value) { + volatile u64 *addr = (volatile u64*)((u64)mmio_base + offset); + *addr = value; +} + +// Example: Map and access ACPI PM1a Control Block +void* map_acpi_pm1a_control(u64 physical_addr) { + print("Mapping ACPI PM1a Control Block...\n"); + + // PM1a Control is typically 2 bytes, but map at least one page + void *mmio = map_mmio(physical_addr, 4096); + + if (mmio) { + print("PM1a Control Block mapped at virtual: 0x"); + print64((u64)mmio); + print("\n"); + } + + return mmio; +} + +// Example: Map ACPI tables (FADT, MADT, etc.) +void* map_acpi_table(u64 physical_addr, u64 size) { + print("Mapping ACPI table...\n"); + print(" Physical: 0x"); + print64(physical_addr); + print("\n Size: "); + print64(size); + print(" bytes\n"); + + void *table = map_mmio(physical_addr, size); + + if (table) { + print("ACPI table mapped at virtual: 0x"); + print64((u64)table); + print("\n"); + } + + return table; +} + + +void print_page_mapping(u64 virtual_addr) { + print("Page mapping for virtual 0x"); + print64(virtual_addr); + print(":\n"); + + u64 pml4_phys = get_cr3(); + struct page_entry *pml4 = phys_to_virt(pml4_phys); + + u64 pml4_index = (virtual_addr >> 39) & 0x1FF; + u64 pdpt_index = (virtual_addr >> 30) & 0x1FF; + u64 pd_index = (virtual_addr >> 21) & 0x1FF; + u64 pt_index = (virtual_addr >> 12) & 0x1FF; + + print(" Indices: PML4["); + print64(pml4_index); + print("] PDPT["); + print64(pdpt_index); + print("] PD["); + print64(pd_index); + print("] PT["); + print64(pt_index); + print("]\n"); + + if (!pml4[pml4_index].present) { + print(" PML4 entry not present!\n"); + return; + } + print(" PML4 entry present, frame=0x"); + print64((u64)pml4[pml4_index].frame << 12); + print("\n"); + + struct page_entry *pdpt = phys_to_virt((u64)pml4[pml4_index].frame << 12); + + if (!pdpt[pdpt_index].present) { + print(" PDPT entry not present!\n"); + return; + } + print(" PDPT entry present, frame=0x"); + print64((u64)pdpt[pdpt_index].frame << 12); + print("\n"); + + if (pdpt[pdpt_index].huge_page) { + print(" 1GB huge page!\n"); + return; + } + + struct page_entry *pd = phys_to_virt((u64)pdpt[pdpt_index].frame << 12); + + if (!pd[pd_index].present) { + print(" PD entry not present!\n"); + return; + } + print(" PD entry present, frame=0x"); + print64((u64)pd[pd_index].frame << 12); + print("\n"); + + if (pd[pd_index].huge_page) { + print(" 2MB huge page!\n"); + return; + } + + struct page_entry *pt = phys_to_virt((u64)pd[pd_index].frame << 12); + + if (!pt[pt_index].present) { + print(" PT entry not present!\n"); + return; + } + + print(" PT entry present:\n"); + print(" Physical frame: 0x"); + print64((u64)pt[pt_index].frame << 12); + print("\n Writable: "); + print64(pt[pt_index].writable); + print("\n Cache disabled: "); + print64(pt[pt_index].cache_disabled); + print("\n No execute: "); + print64(pt[pt_index].no_execute); + print("\n"); +} diff --git a/src/map.h b/src/map.h new file mode 100644 index 0000000..4ce0ccd --- /dev/null +++ b/src/map.h @@ -0,0 +1,6 @@ +#pragma once + +#include "common.h" + +void* map_mmio(u64, u64); +