From a265558b985859bd219303ad1035585242b0507b Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Wed, 28 Jan 2026 21:16:24 +1100 Subject: [PATCH] switch from bitfields to enums --- OVMFbin/OVMF_VARS-pure-efi.fd | Bin 131072 -> 131072 bytes kernel/bin/CustomOS.img | Bin 48000000 -> 48000000 bytes kernel/bin/kernel.elf | Bin 17728 -> 18144 bytes kernel/lib/paging/PageTableManager.o | Bin 2728 -> 3480 bytes kernel/lib/paging/paging.o | Bin 0 -> 1888 bytes kernel/src/paging/PageTableManager.cpp | 103 +++++++++++++------------ kernel/src/paging/paging.cpp | 25 ++++++ kernel/src/paging/paging.h | 37 +++++---- 8 files changed, 99 insertions(+), 66 deletions(-) create mode 100644 kernel/lib/paging/paging.o create mode 100644 kernel/src/paging/paging.cpp diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index f7a0a6b31124284143bade91952f5ed52021845f..dc5d36fcf6a1790ae015c2ed0fc4945bd1343cef 100644 GIT binary patch literal 131072 zcmeI*Yitx%6u|Mj-IZ1;)M}$aiK+1e8df8qqR{{q3azwO%R@oY5GjIz(rhaDK&e4Q z1&!i^ha&R91nUzu1`{Dc)C8l3M|^!MA$%ZUVvNR!iLK}C?p>zK40B5dmg0Y!VY)N3 zcV~Y0+%t3cPSu$1({n?A?|OCNin_O#4Vh4USHo?_6s32#cl^|vuFiz1F@uiCilRzg zd#?VInI201(f;Vm>&9+uyQ<>W9g9|N=`dz`XJ%Xbl+h+`cMMoo$ofGEW2$S1PaF5^ zfV$1!t>1h@M{#MDX_cQQGvBnxveFFmdwARQRsX)umOAGYDedl8j zhDAx=IhDwdG#BHMmwe_F*wxh)Wv&_SCzDBsvc={a-@W|ac?#E&YeKQfHNiyWnqV8d zCE{E&!j|h@<}Qae*ZA(`eMbR)C)b3clWT&B$Th(>c1y&$<{DeBcPV|Z%w%(o?_PGN z0xiikq44CIU?Or&u#Mdkajv=6mg`-fWnb7_zI~8b2t_g)F*8~%hYl3a;mWXrBNL#LVS!`d}T;sc!-KjuJa!n{a zxh9y1ToY_#w>ajS%Vqx(nJ@Tp!o(jpHCC@5_w9REmDL@oHO*$OjCRj8GtE5HeFVJ0 zq|7WC4^PSaVny-9S^bJjq8#(O-kyVZsRx;!Y+m!-%kEU5C3!6rp1c-JL|zNFv0Jiv zEq9w^*XJ$Ilh>nUp4o9=#WyeQDQ_QO_N|EzU3s%vAV00<>g=ks(kb)oKv;Pf$(}kamtWp(lBs7(NwcNIl$2a2ubR#M zvS(AX6rFx9A*}3kWN-Z%KEG^lS@-wgI5ngXF8Mg|{$KrTw*D~kmzDQC(>_&>D`l!> zPNk1@eEPWcINgp>JqP+6<3zE1*i*Bz%b44LTD`#-ee5Z^va?TiWy`+MxonNe2V~B- z?H-d_x~g3wFPA-Wt$+R86{|Om{`a4H`ONw0NPE~!mI!H)*LrNWooJhxE8Cmpy~@@m^Vu?Moaxji zbNcIIIlc5(IkGI%4Klg->2rm8`x4~my`NIUB5B<&&0k7+qvRI#`G`9#j-0B^JVBYONfvOF4ROANrizsgEhYh|5*82CHl6X7hA- zy=rXk2t46&n+^pBqQsmGIaUF&tlxaNqy*5_L% zb>Mn#^!d7fAD_7v7CPqye|OW<4zOz+(C0h)4fQGd-bwCaqN(QyZq1#pQS|xpza4eI zzSHNEi&DTupD#bI96C7Z@ze0{HtF+q4?6Xr&!^+C_9|Dn@gVwqXU3QqeZCWKPkIO8 za*rN1&i9(+HJ5TU|Iz28&!=%fpN~FYvBbggCXExu`MgiW(C5p>OW**q>vf26K5tyn z=kt5`Ouytm-msW!tkLH?@q1LiFDj2df8m}Fb&QKXAALT(e&ilV3V;5TalU}(g(`PR!d)b$>YJ|BHP z`h4{HT=NBeKJUGG&+g0U^BvpY(>3(@c(&6U8NP$Y4&7ka9M-qS`NHo9wf)fNJKg$x z;q^wJuMmB{@OshqbSnRzPyZt`Ob8%=00IagfB*srAbz$6&QNOoo~!p{8;Uq-#3|mH(dNm@`L28PC1!xiq(vafNgf58eTuf! QZcZpV;@b3K*#|}e0I}&9YXATM diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index 0f767c55832ff93858b7a24ae16c0566141177a8..4b24e933fb8f2e6a808f1621d1b196b4c493241a 100644 GIT binary patch delta 5367 zcmZ|Q3w%!XAHeamXUEtKGjo~3=8`dFD%ZJ;J@fdw&9xFSEL1c@F3~3T&12CN4yBTA zN*9-yTiQ@ArA8%{YA)5fBcbd5pYxnEvHtyDulLULe80cT_jk_kImoe5;x;==2mnZB( z+5bfCl-)PZj^=vT`f|ApDe~p^WtQ-w@1vag_LZ!&I}{eP1WV-(ITlzl*DPv5V7=Yx z@&YOJbSs|gRD7_Wv&drWUAyAnF9s?u_;|(yXX_x*faL^a&hIi(2Q=@xj3_N$A2Daz5hFX=PRebJbP23R^Mi3Y}Vd$rKJb< z4DtED^7-eK_@|xr7cKA>=Xy^EPKLkG_rXb@-@Y}M*lLM$1TNW!=;G1sOk(&hUhw%3 z`}_w3X@5laoMK~Y&9c6g8OFJ@NBSf3MqIg$vqY9*{CkZE-@G}OjB3jYs%kqo-}qcUdBV6q^#km-X))G5CfN*ugV-(kM;u&swf>mgzr@NyMxi7AhZu&v%tesx! zrf1i1;xpXz4lA}J=@V|+eofeIt8+1au?E=bNW%8UR=AaOUjr@Hnro-qkhUw|66J&g z&xwz>SQ|+98tNZ>;SE0*{rCr>ql9mletz)Gj8k zTrp9^?JCZ@TdeL**U^pN7v==)@pemc=UH8Do<45>Rqk%;I^B&7r@uA5lUY4_p4+KC zH_mR4ITvHK^>ioh$X<8uweH+*FQdphOgf>&9i3d&8K!Q&B?ryk!h3G*^W9l*ww5HC zwS&}3;1a#j?e%P=lg@E_eQKqVP7A5vOj5r7=5E~WZS;0O-0H?XZZX~6_&7H{)O~DC z-1s7^(5~VMH~m^gC!Xc*VV!l>P9JvDfAcWy7VoCNv|>B+5YLki{8U;y>1^j>RO0yB zcc8g@^E2Iej2oZr78Cd-l1p*pVa#W@;=o_dk{fRo>I53Q%cnc>NaF(kI_#F?T#R3> z4b&CwcgHn%579t3y~#S!*(?spNE4U#8hrjMC=Pv%VTq^X%R+x1MJ znsRsAIB&bu!6WSt*4!jB+M3wSjE*VSb5OaSqwTJB@|SiqCwiKU9M&(PeQMgc^s5IY zv}XRKv12pSr%dtQyS#_FJoZ2OF}vF@e@PGf-Bgfl#&{0ZvCeJ|uD{%CMueBWLW<+~ zXOwq5ILd16HP;6nvrc%;>1IY-qA~9f%}6ohYUc6PZlky}cC&A2xb;ek86SGa{Usl; zPNbOaJllHY*X?Ph1gV%R6;wi0Dymdc2~`PGsjL#NQbnbzN;Q=TmFg;yDm7H1RBEc! zQmL&{Myh;m|mMX1O zu2*TTlAzK?+~@bW!Q5(oH2vrMpTGm1GsKN{UKP z6`x8k6;bJ}(nqDQNl=L}jST%__I3+^RB6QEL6!=c}QiE%3_s=Rq|Ap zs63+bsLE26Wh%>6ER_{1D^(s-d0b_c$`dM2sywB#TIFe#H7d`jJgf4Y%JV8OsH|0a zQRO9-bt*5byrS}|%4;g?RW_(>RN18Ry2@siEh_mcTUEBHY**Q#vQy;^m0c=tsuZXc zs_a(Tqq0}!EtR)b_NnYwIiPY-sj8`A+3~l^;}oRQXBeXO%N5 zXI0Lr{GxJR8Qsr;t$yUHIbf2#bY^0!LqLJ3+dLGU0LCMqBV6;TPH2t#Fr zqYA2`8X`~~k*I+v)I=@RMjb?>F0R3~sE7J!fEdK0AsV4En&3J#MI4%;IpWa*Ezt_s zqcsxH1~=eF+=RAhhxX`zj_8C$bVe6+MK>g&J9;1)UZkKWeCP%HKJ`W)^hH1PM=Azj zAO>MDhF~ae#x1xN!*CmhV+3x;NQ^=nMq>=dA{}>N9L8e;?!;ZV8xt`J_aFn4k%=jo zifOnP(=h`xF$?!$Hs;`dWFZ@K@c`ywK60RV5DVbPLgeBhEW%oL|KjRF};v9a#dHjkCxQI*m4Zq_L z{E5HtH%fyRiie*+JP3w~3J5_(R6;1iP#NK< zp*|WQ2C-;}Mre#CxDHJbhh}Jwc(g!Ew8HghjRds84Y(0Ep)J~>JvyKxIw29A(FI-6 z4N2&Z9!Q24Dd-6wdcnR=z0n7K(GUHRiUAmiK^Tl77>b*53vR_Q+=k&8f!i?>qmYKt z7=y7$#~m1l@tA-+aTo5!L`=dx$iQS|VhW~W8t%n(%)m^{!hM*HIk+EL$i`eefO(jY z94H>d0{F2Ixp)YRuow>`4@>X}9>r2D!*W|0itMN3};2AuN=kPpU zz*@YBm#_{m;}yJ$*RUQNuo0W^IyPeq^05`$upK+F6K`M_-b4Wku^W4^7jNNh?8AN> nz(Kr&cX0^s;e8b0Fpl5@e29;56d&UlKEbE>%=4-o_cZ(;R8L-l delta 4715 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 diff --git a/kernel/lib/paging/PageTableManager.o b/kernel/lib/paging/PageTableManager.o index 8027176fee9952fb2044e7632d86695cfeddf1e5..bfffc952aa0650878d031df5c2995410f35ede48 100644 GIT binary patch literal 3480 zcmb`KPiS049LMKv(ni}&yGkiyJ?uqk(LVOYn%W|=VSUL{ny|E8sfD_{-JNDj_n&WH zLL!LT2I08`;w=XcJ$T4TdJH}2)*?pmkb{*Tdl7>55D#Jwf%^N+o7w&CWM3kfAH2-W z=l5s6GjC=e`P9BJ9y1K4%wTV`?nqI_t{m$2)1sSZ!z|8nPVl=Ee6r;PGn-D!-f~*G zO(#e!U3(xrxBqN_cLlt6oFKPca$18gpM-QLu(zx>1mAHM?R6*k%?Wsk2QSWcMY&HcDwHy+WWBvC2f}l;H!Cz zD)xE_{THwXscU@~u(mG?kkWQp04T_9po-1{TK4k3%q^>ib1%UZTP5e!@KpN;#2Nni z0h`EV&L>Y!Oyy1`tvAdO(@Kt{Mn+Rs>UBJ>V1w`^;lbkzVJyasHZnYIXofaE7Gh?6 ze32P*3FAb3=$R!5ehD}}XfNWQu_K8uVwvHCIS7Cu`rbkgwjF~%%0KW=EQ}DY9e+^A zAp7g-4hMjNj>@k0ICP&UTxbDyK7xNJxr!6ofZ?TvySu}_j^IB=@P`q6JAxmA1^1gb z6~V7Y@XsPR%evG2vRkO|Nw)@F&nz|?EPr*%8r40S5j%UX10!Ory<^Tzx{XO*t$Xu! zcJ@*#FDjkE!r*wfR^oHq%UE_*@HdgabHn3B9}{Z6H-C15`{NaN+CH1ToW~BEsMHH? zWvo)E7hMSJCXRbz68FbSC670oyJ&)- z9!-U=h+g$p3goMLpdsJ%-QvxBv3xUs-MvwPV<7B;Z1L_LglGF{Xbr-L2)`vcUM0L= zD*j8!vCgxEe?vHaLRGx@*uWU$4-@_?^wE&V;ZgB_AOzF-VK{G!4?{=ApCO#;AD3L$ zKSkoH{xacI|1H9){$;|c{%<4rFN9P5e-lpi520`{UH?(Zaet`(Q-o9f8N#Xl4+y9F z>k)jBaH{`%!fE}7gwy&@B6wmzELXhuBhXdvHyL8F4>DDdw8qu%D>Iw(Ro^W@>w95a zRy~hbT+`=sJ~KDr9h@ahfj`SZ*a6?i#+ z9e)R;g8$bfAsvqZ-brd{IXEu&MfvC+AUgpMo`p0#J%)z~Y*i-UnZSAQE~C8=HtZE> zk!#bi_jMrS<#ClG#$JOS*3`rQYrX}!STh9=HIo+&%iK5V` m-!;6OC`r%9Y5HwdS^U4j*jL(yX+!p0ME-` delta 787 zcmbOsy+U+?22%$6M6F78{%x)snjbJuwq%l>cu_fI$A2*3XYf$G;BoK)k4NVrk8alu zs{i>J7(6&HcyzjM0P8rx*a2fP0a-vbD?GXxJi0?Kcy#-2@aW{Z@LB+*(c|C?p2_}< z5`0j5nm;hM94M)q+{|biNVZ*}H-JX(z+#aA6NW`DOq5vk0BF$xEEZj4QZXmf`IGgT z-6vNtmk94;Vqjo!6>^Lhn_GQvGm{KsbI}L0@6GRH=FRLTZ;gpDpQeEb z4emi}CQyK6XRD5RWeoh#3vuTDWbR7UT|9IvAB_Eyakxc(cbokiv;aH$&D`(I-SucUxVo|r&LyGkMVtGLQ|r?^(mw6C2(ou8bqIVc2fmb9 zxWd-TSU0`Y2M%D{RX?r$^_YS>30J0f*7**&?P5*ljGFLm9S5lK+A#}LXQ&JcsuZuW z?E^pS5d^jj6Y764sm2*)WLr~n^mWx~YWYs&m0 zaunL@hoCJ7wLX9M>2(zMBSwQ_jvgcDg71B!XS;kUR5ZA|gkyMF@Jk-;d7n3ExI$U* z$rk^H^ABX+H_;GqPEB-$4}aus2Fc(lk3i4rX^KBt*gF!vQ)YMGfkx6 U$7&+yu{z0L=U}?2Y!s^h4{h}l*#H0l literal 0 HcmV?d00001 diff --git a/kernel/src/paging/PageTableManager.cpp b/kernel/src/paging/PageTableManager.cpp index 7cb4078..b3dbd9e 100644 --- a/kernel/src/paging/PageTableManager.cpp +++ b/kernel/src/paging/PageTableManager.cpp @@ -8,58 +8,59 @@ PageTableManager::PageTableManager(PageTable* PML4Address) { this->PML4 = PML4Address; } -void PageTableManager::MapMemory(void* virtualMemory, void* physicalMemory) { - PageMapIndexer indexer = PageMapIndexer((uint64_t)virtualMemory); - PageDirectoryEntry PDE; +void PageTableManager::MapMemory(void* virtualMemory, void* physicalMemory){ + PageMapIndexer indexer = PageMapIndexer((uint64_t)virtualMemory); + PageDirectoryEntry PDE; - PDE = PML4->entries[indexer.PDP_i]; - PageTable* PDP; + PDE = PML4->entries[indexer.PDP_i]; + PageTable* PDP; + if (!PDE.GetFlag(PT_Flag::Present)){ + PDP = (PageTable*)GlobalAllocator.RequestPage(); + memset(PDP, 0, 0x1000); + PDE.SetAddress((uint64_t)PDP >> 12); + PDE.SetFlag(PT_Flag::Present, true); + PDE.SetFlag(PT_Flag::ReadWrite, true); + PML4->entries[indexer.PDP_i] = PDE; + } + else + { + PDP = (PageTable*)((uint64_t)PDE.GetAddress() << 12); + } + + + PDE = PDP->entries[indexer.PD_i]; + PageTable* PD; + if (!PDE.GetFlag(PT_Flag::Present)){ + PD = (PageTable*)GlobalAllocator.RequestPage(); + memset(PD, 0, 0x1000); + PDE.SetAddress((uint64_t)PD >> 12); + PDE.SetFlag(PT_Flag::Present, true); + PDE.SetFlag(PT_Flag::ReadWrite, true); + PDP->entries[indexer.PD_i] = PDE; + } + else + { + PD = (PageTable*)((uint64_t)PDE.GetAddress() << 12); + } - if (!PDE.Present) { - PDP = (PageTable*)GlobalAllocator.RequestPage(); - memset(PDP, 0, 4096); // zero out the new page + PDE = PD->entries[indexer.PT_i]; + PageTable* PT; + if (!PDE.GetFlag(PT_Flag::Present)){ + PT = (PageTable*)GlobalAllocator.RequestPage(); + memset(PT, 0, 0x1000); + PDE.SetAddress((uint64_t)PT >> 12); + PDE.SetFlag(PT_Flag::Present, true); + PDE.SetFlag(PT_Flag::ReadWrite, true); + PD->entries[indexer.PT_i] = PDE; + } + else + { + PT = (PageTable*)((uint64_t)PDE.GetAddress() << 12); + } - PDE.Address = (uint64_t)PDP >> 12; - PDE.Present = true; - PDE.ReadWrite = true; - PML4->entries[indexer.PDP_i] = PDE; - } else { - PDP = (PageTable*)((uint64_t)PDE.Address << 12); - } - - PDE = PDP->entries[indexer.PD_i]; - PageTable* PD; - - if (!PDE.Present) { - PD = (PageTable*)GlobalAllocator.RequestPage(); - memset(PD, 0, 4096); // zero out the new page - - PDE.Address = (uint64_t)PD >> 12; - PDE.Present = true; - PDE.ReadWrite = true; - PDP->entries[indexer.PD_i] = PDE; - } else { - PD = (PageTable*)((uint64_t)PDE.Address << 12); - } - - PDE = PD->entries[indexer.PT_i]; - PageTable* PT; - - if (!PDE.Present) { - PT = (PageTable*)GlobalAllocator.RequestPage(); - memset(PT, 0, 4096); // zero out the new page - - PDE.Address = (uint64_t)PT >> 12; - PDE.Present = true; - PDE.ReadWrite = true; - PD->entries[indexer.PT_i] = PDE; - } else { - PT = (PageTable*)((uint64_t)PDE.Address << 12); - } - - PDE = PT->entries[indexer.P_i]; - PDE.Address = (uint64_t)physicalMemory >> 12; - PDE.Present = true; - PDE.ReadWrite = true; - PT->entries[indexer.P_i] = PDE; + PDE = PT->entries[indexer.P_i]; + PDE.SetAddress((uint64_t)physicalMemory >> 12); + PDE.SetFlag(PT_Flag::Present, true); + PDE.SetFlag(PT_Flag::ReadWrite, true); + PT->entries[indexer.P_i] = PDE; } \ No newline at end of file diff --git a/kernel/src/paging/paging.cpp b/kernel/src/paging/paging.cpp new file mode 100644 index 0000000..8f8b86f --- /dev/null +++ b/kernel/src/paging/paging.cpp @@ -0,0 +1,25 @@ +#include "paging.h" + +void PageDirectoryEntry::SetFlag(PT_Flag flag, bool enabled) { + uint64_t bitSelector = (uint64_t)1 << flag; + Value %= ~bitSelector; + + if (enabled) { + Value |= bitSelector; + } +} + +bool PageDirectoryEntry::GetFlag(PT_Flag flag) { + uint64_t bitSelector = (uint64_t)1 << flag; + return Value & bitSelector > 0 ? true : false; +} + +uint64_t PageDirectoryEntry::GetAddress() { + return (Value & 0x000FFFFFFFFFF000) >> 12; +} + +void PageDirectoryEntry::SetAddress(uint64_t address) { + address &= 0x000000FFFFFFFFFF; + Value &= 0xFFF0000000000FFF; + Value |= (address << 12); +} \ No newline at end of file diff --git a/kernel/src/paging/paging.h b/kernel/src/paging/paging.h index 850d211..cfa6740 100644 --- a/kernel/src/paging/paging.h +++ b/kernel/src/paging/paging.h @@ -1,21 +1,28 @@ #pragma once #include -struct PageDirectoryEntry { - bool Present : 1; // memory exists and can be accessed - bool ReadWrite : 1; // - bool UserSuper : 1; // memory can only be accessed by supervisor or both user and supervisor - bool WriteThrough : 1; // - bool CacheDisabled : 1; // - bool Accessed : 1; // set when cpu accesses page - bool ignore0 : 1; // - bool LargerPages : 1; // - bool ignore1 : 1; // - uint8_t Available : 3; // - uint64_t Address : 52; // physical address - +enum PT_Flag { + Present = 0, + ReadWrite = 1, + UserSuper = 2, + WriteThrough = 3, + CacheDisabled = 4, + Accessed = 5, + LargerPages = 7, + Custom0 = 9, + Custom1 = 10, + Custom2 = 11, + NX = 63 // no-execute, only if supported }; -struct PageTable { - PageDirectoryEntry entries[512]; +struct PageDirectoryEntry { + uint64_t Value; + void SetFlag(PT_Flag flag, bool enabled); + bool GetFlag(PT_Flag flag); + void SetAddress(uint64_t address); + uint64_t GetAddress(); +}; + +struct PageTable { + PageDirectoryEntry entries [512]; }__attribute__((aligned(0x1000))); \ No newline at end of file