From f8e03d9024617ece1b365ac7831ac5150d20c7a8 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Tue, 13 Aug 2024 15:13:17 +0200 Subject: [PATCH] Added bigError() --- include/fs/impl.h | 1 + include/screen/graphics.h | 1 - kern.iso | Bin 1474560 -> 1470464 bytes src/stage2.asm | 2 +- src/stage3.c | 84 ++++++++++++++++++++++++++++++++++---- 5 files changed, 78 insertions(+), 10 deletions(-) diff --git a/include/fs/impl.h b/include/fs/impl.h index f8c55cc..935beb2 100644 --- a/include/fs/impl.h +++ b/include/fs/impl.h @@ -36,6 +36,7 @@ uint8_t loadFile(inode_t* inode, void* dest) { if (totalBlocks > 0) { // TODO: Indirect extents + return 1; } return 0; diff --git a/include/screen/graphics.h b/include/screen/graphics.h index 157787d..f8e70ce 100644 --- a/include/screen/graphics.h +++ b/include/screen/graphics.h @@ -26,7 +26,6 @@ void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) { int8_t sx = (x1 < x2) ? 1 : -1; int8_t sy = (y1 < y2) ? 1 : -1; int16_t err = dx + dy; - // TODO: Sometimes the condition isn't met for some reason and it breaks everything while (!(x1 == x2 && y1 == y2)) { diff --git a/kern.iso b/kern.iso index cdf5b2596baf507c8e544443f43520e8f27b3ee4..2af9ee848587a338202a3df2c11cd90a75298071 100644 GIT binary patch delta 4928 zcmd5pRI}&IBoue|4_Nr-p5OVM z-#Pa&GxttPOLIy+i(Z+`46IHY8@$7*E?5y&^O1QM8_y7;@WG#&3?KmEQo;o+34%)n zmliJgb0z6p*lJJk-Xy)k$GSq3#_Ov+EHxN(DoI9}m_%A?Q0cNl2vK83Ke!~;ZBT`H zQV1D>Y%pBP>NDeNra~h2DM<|IVNY@y^mGBwjUE)0Vl~siVZm`RF+b_3lG_YJP|~ej z26V2ZC&0SFDl;=`GW*dPnU7OLrkYk{PNt<(A)El4<+>7BZorOC`H znzD4X^(C0S?Sy`Y_n!+E@I=oLXb2JC1=^ANc8H4PW(%E-Vi3pU0*NmJ-=rEj!?EQ!E)URK?!gj};;U@Tw`}aUwfUH#gp5OQr`*04NHF`vujCoghGj{Qmx3bc z5Vqb#p*8tz&(A{7_L@lWD|R7UwbmzmCmc`vyr_Tqt>TME@rkV3h7s4L^)nf|Do>-> zA3`_fMWT5vFAj}6FG`0usZmr3#*SKGym@6|`+*S}8{4&l6cluOLTG7zx&ll?{_oM; z&yUhzUP8nkXldiNcx1Wd6Vce0=O}SLw6tP_B0q%Y7Q}&Zl^1j<#+tGY;|(uOCze4R z=POp5#3^@tKKa)6w;eZl+mhYhP=_glc0NDUI?Q2IJ2+MOSS#-FpDQo|T*4`QIh;!nJa+9Bq3rx0- z!49LoKrnVXjNxFeIgEqBh>p}TOW`Sg6dJb}RAKCbiHRw&N#ww)CZA;w8nuG)0+?%Q z$JQ)QKJPGIU|IyD2N*H!_!{4mFr9+Y+O~a8 z_v1S3V@)JmU(#Kry-(oJVeB|33XKk9TZMM=17o+hb-H)|G%uA${_OGj!VmDM;u8zq zsIUXhOw90_5+4yq!5GacW)1v@^MHvM4z2CP7$BnXl1U$|mQ|vn0@QV&0=kp{*$Sk; z+zdJMR3Dkf>?c1$8FmmAVBYe}uuqLSN6y_Y%QWUOW{&q+adhi@%W0q=zb+4T@+4Nu znVG#ZEa)dQI zX-xe4z5HPmOAFgayw5L2KBW)8_;@ob4CO^E=x+ zj)}4u=EtAzC8K*Q;|zZj2Llf;#a-1++llaI8oDB0YgxX=Qm|^JC9zL_PtiNo9Z*-}fW12b05i!U~;VlnU&0YQ65D^%YcmOh_J&4`f07p8<@joR} z&+5XEZV0#k0R1mq$oC}DB}I=YeodrnixQX*>E5DL<}ht7iUE8F+8uPrni%Fqnhx!3 zx)|C7S^}+xzPTn+(Gg7>*2F7XW2gwGX9Nwi#4}}diX~Fs!b{Q{6 zd{M@wh|kFQZNw*K+=Td38TTMQAmfoqfNQO?^CUVuW&9#yLB?+(E|KvO!0kW6&4Wd} z0N5lx8W?r4M!YmUE;c&m!@plmolXNc7SqJ$Op8P6NtN@NqJHMR!vSRPbvYB3hhZ1*v4yc?uDQ12k_bB1x>1(`0lEkRJYIq$uf~h z(E}cCatyq^Nr$lQ`>8_U#jV(d?En5$iAi@|Twlb5hJ)e|+%qDb_@9QS)1@0Tm{9u0 z#>jq2P($2DtGh-F(1R@5U8e;@k9N(XlQxAZk)zSwqm&Z+!Ic;pv|JfSn>R(tPITMo z!59`!IZ7^gBW9cm8d4wyo1`%p~C}E&~>EHj_n2om_*0(X#VUl4M26{kJ_LqGt+60<97-}Ivrm*0;BUP zv(fyuasrwwm6PZTRdCdS-cV3S(p}Y6k0`8T+VNvV%~dUqn`siy$)0pjn#7Z`XV$Rw zDkW?woOoB1)h6*hzp@TqIg_}%S9wsSl9VmIO6x<))sm+#ouU9)|8>?-TZfu|M=G*V z4gn$chyqR&dh1N~*LhbGj}6peq&j`d=pQbFaZa4pTjpmO@p74=S0oq4L;kZ)Gj+cb z9)9n~z>MDqr7$c`3~i_4D{+GYPoDH@nMoFVL^**IZ_p9dg%NR)#BClU{_U#I2WKsO zix4sCx@&)R8WY>+m(3*z%SYS)-7gzjL1URcuD{TYLAsGRZ{r0aBTgJ5x>8=vQ&``_ zefGJ_((FD){EUp75&uEP9>mjS+=F(Ir@Bl&jpdGG}fhI`OmgszCL3O_2JqK96aWDP^8gNS3g z-gY9!c00&2%ywI889uXEgJ1NP$ zG0fCqbNg&(eOVm87Dexa$PtO#P0k_{UyanOK+STb;--|Fy?}ogxvjuu=froL_!HCu4Ui?9L#& zQ)zdq?9P66XRzI=wmbXVof^AyfZeIJJ9Tzvh~3HBoqD@7)b1Q;cZS)W;rpBs?tcT% CPy8|f delta 4133 zcmb_eeNa`( z8fcYUovDtk$kf?(>u$Q4p*XG@EC|}_V0X4_w^gH{yfn0>YOB@O>^biNi*5I>T^;WI z{m%KFlXLHV_rv1Ow^#~x&12NN=g$n-<4_en7xDUg#e22MfrJnR@gofUX8|kWk0C+C z2mgr91dNziqCi;?{4vDOY1Ez9DtwGHIO&1*kU_WGZK5WVCP1xLhq7V-%`zoWi%A*0 z0QCM4GHfUQ^l8&f>M|*{hB<^x`HzR5GbJ=H)C7(QgCwD8j72S3EMqJhIoTM?c(gPx z8m+^rSv07D!dSYHOQQ$(v-EK;0}5lQg-eGrSnA@^n-{XpIqB525Ue>YU6M18S|kh# z=v_JK&5PLP+;pc&=h8GkV`OI1+uB{b8;ld7Y~~ zu>I>3M=syH?bVshkV!{4F#(+mI(61TH9s5GpQ?VY&dK44iGbQCJH;PiRcl>k3hx8@ z)V1Oh^lXl3Ue);CGMV4?%jfxSF0_KXq!S9(*kL+F`|9zTT$I zL;0)M6|QYs{{yvbn;zi?e^NWP-r2%MhE1sUoOrqh0~sm5nj13JRd>Y~dQ5ybe(*WDd4~D``_r2)cxh4v$)poPvf# z(5_8sEY?g{*Qd*1e|`8kjExVI>>c%Svi+<2WCa9#xVeDEfly1si!%7JAzIO?cb+X8 zR8-qDRdud1eFiRKMX>SXw|!bdw0ll*)*f%F@-9MR+UUs^kmXQCGmxw5JE^2eA=;6SP~KRF@U<2 z25528PWVG}49^u|=$u7x6&CPU6NrlwL*c^|?K4O0tu9EFzk1kt2R1`XYywSqVe-_8 ziNqy_%R7SOBY^o*P|Qaq(!v*>oe~Qcvv>p|qRM?>AKR1iu6QUQ5w$-(nF;w%w2l1)ByN~votDt>?zOhBG zh%?aRTjCU9QB;I(ZVU}6i(^jGj556<*+AEnO_}tyfe`-tPY#jdr}(d+3cd|C7;K`Z zvdPsZsm$|Gh+Jmf0hk!v!g{=y>60t|dZy~-UV;ABJGVVv*CF6i3 zz(-}Aiuj0(HzRJTmPtL5Ju*ImSdj4*#8onW0N67CiwBb!Zp6ubWTfiyabiRaA)e3f z`+VSyl)U$0kkXjIn>-!7$7Syf$$LrmCgEY`cyMEr=b-GJC3#(AVi#cM8rhp{q<=48 zT0Kt^6^w|qbzclm+9Gg>O;DD2FPf011C9sMo;h(5>_@>&nvSFC)?4;DIXT7KR*HQf zE6hXmDWJRpeh5VTQ?N*44;b>-@jQ%}$Biz&FKI!s0xWN$1@y}by>S!R#6)O3DffK7++03e8fuo#0WRFZ8zZ_YG93r zepbG$6CQXEpH`xC+(TKMf2jJkf)Sm6tBz(Aa6q{&?_&4L&RN(U-`RlO6E#b*d$lGk zAr@x9XJUH&?!DD!w&Z8JZ8J*`AEWwCc(0TgDP;aEQsz-KeUo$=8=^5h_boLb=36R}M zzqAHm?cZ7Bg0WJ8Q+q3|cU9#Tkd`LZM$eb6D(^D1E|z|*+oYNl#1L-^j)J)0!}XP_ ze5KH`zGO~JgDs8G_S#iC5oXjn#2mt28uQKC)bag5Os&{TrqsI2in-Zzl1%F2r7o(2Iv$ta8HHTrzxPzuYU}?*Xtux=!y>ma*s>5-UpyPCxD5>}xnuHsm6!wsJgE@*hb5b^S$bLH;&%=Di; z^8}DccjAA4=6(6SB>5koc^Poa{qi&KDH_debUshF`)NcNtdRM+kRBsm8gPEQccY@( z1CuY#yebXkCgKPg2hIXKLBcaeUB^jV;d zQmhYY9#Sc@W;W2}NL?tNigW=|%sicsLmm%YaHBgFX*g05X(mz)t=yNo#Eh`_3QY52 zowd_oz3W#NZoSKvMJ+2Ihj;W&@O#4%y@F^0qJ4-|h~B~IX8PT}$h0N}m$KV&>58 z`yX|_u|GPr#$j_XHiyFI@UuBsn?q@H_}d%-HiydQ2(&rI*&IPOhuY@Q*c{_+4z10h YvpIrojtMqLh|Ljt*b(MxH6-c&4KCJb^8f$< diff --git a/src/stage2.asm b/src/stage2.asm index 73b9130..7b51d60 100644 --- a/src/stage2.asm +++ b/src/stage2.asm @@ -368,7 +368,7 @@ CODE_SEG equ GDT.codeDescriptor - GDT.start DATA_SEG equ GDT.dataDescriptor - GDT.start ;; VBE Stuff -;; !! IF YOU WANT TO SELECT ANY VALUE IN THE SETUP, SET THESE TO ZERO !! +;; XXX IF YOU WANT TO SELECT ANY VALUE IN THE SETUP, SET THESE TO ZERO XXX width: dw 1920 height: dw 1080 bpp: db 32 diff --git a/src/stage3.c b/src/stage3.c index bedd81d..1d0dd9a 100644 --- a/src/stage3.c +++ b/src/stage3.c @@ -6,6 +6,8 @@ #include #include +void bigError(); + __attribute__ ((section("entry"))) void main() { // Physical memory manager setup @@ -27,22 +29,29 @@ void main() { deinitMemoryRegion(MEMMAP_AREA, maxBlocks / BLOCKS_PER_BYTE); // Load root dir, find kernel INode and parse it - superblock_t* superblock = (superblock_t*)SUPERBLOCK_LOC; - superblock->rootInodePtr = BOOT_FIRST_INODE_LOC + sizeof(inode_t); - diskRead(superblock->dataStart * 8, 8, (void*)SCRATCH_BLOCK_LOC); + superblock_t* sb = (superblock_t*)SUPERBLOCK_LOC; + sb->rootInodePtr = BOOT_FIRST_INODE_LOC + sizeof(inode_t); + inode_t* root = (inode_t*)sb->rootInodePtr; + diskRead(root->extent[0].block * 8, root->extent[0].length * 8, (void*)SCRATCH_BLOCK_LOC); inode_t* inode; if ((inode = getInode("kernel.bin")) == NULL) { - __asm__ volatile ("cli; hlt" : : "a"(0xDeadBeef)); + // kernel.bin doesn't exist??? very bad -> error + bigError(0xDEAD); } else { loadFile(inode, (void*)KERNEL_LOC); } - if ((inode = getInode("term16n.fnt")) == NULL) { - __asm__ volatile ("cli; hlt" : : "a"(0xDeadBeef)); - } else { loadFile(inode, (void*)FONT_LOC); } + if ((inode = getInode("term16n.fnt")) != NULL) { + loadFile(inode, (void*)FONT_LOC); + } else if ((inode = getInode("testfont.fnt")) != NULL) { + loadFile(inode, (void*)FONT_LOC); + } else { + // No font found, bad. + bigError(0xBeef); + } // Virtual memory manager setup if (setupVirtualMemoryManager() != 0) { - while (1); + bigError(0xCafe); } // Identity map VBE framebuffer @@ -67,5 +76,64 @@ void main() { // Call/jump to kernel ((void(*)(void))0xC0000000)(); + bigError(0xffffffff); +} + +void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + uint8_t* vidmem = (uint8_t*)gfxMode->physicalBasePtr; + uint8_t bytesPerPx = gfxMode->bpp / 8; + uint32_t convColor = convertColor(c); + + for (uint32_t dx = 0; dx < w; dx++) { + for (uint32_t dy = 0; dy < h; dy++) { + uint32_t offset = (((y + dy) * gfxMode->xRes) + (x + dx)) * bytesPerPx; + + for (uint8_t i = 0; i < gfxMode->bpp; i++) { + vidmem[offset + i] = (uint8_t)(convColor >> (i*8)); + } + } + } +} + +/* + * Something went VERY wrong. + * Eg. kernel.bin is missing, no filesystem, Virtual Memory failed, etc. + */ +void bigError(uint32_t err) { + // Red BG + rect(0x00ff0000, 0, 0, gfxMode->xRes, gfxMode->yRes); + // E + rect(0x00ffffff, 20, 10, 10, 50); + rect(0x00ffffff, 30, 10, 30, 10); + rect(0x00ffffff, 30, 30, 30, 10); + rect(0x00ffffff, 30, 50, 30, 10); + // R + rect(0x00ffffff, 70, 10, 10, 50); + rect(0x00ffffff, 70, 10, 30, 10); + rect(0x00ffffff, 70, 30, 30, 10); + rect(0x00ffffff, 90, 10, 10, 30); + rect(0x00ffffff, 80, 40, 10, 10); + rect(0x00ffffff, 90, 50, 10, 10); + // R + rect(0x00ffffff, 110, 10, 10, 50); + rect(0x00ffffff, 110, 10, 30, 10); + rect(0x00ffffff, 110, 30, 30, 10); + rect(0x00ffffff, 130, 10, 10, 30); + rect(0x00ffffff, 120, 40, 10, 10); + rect(0x00ffffff, 130, 50, 10, 10); + // O + rect(0x00ffffff, 150, 10, 10, 50); + rect(0x00ffffff, 170, 10, 10, 50); + rect(0x00ffffff, 150, 10, 30, 10); + rect(0x00ffffff, 150, 50, 30, 10); + // R + rect(0x00ffffff, 190, 10, 10, 50); + rect(0x00ffffff, 190, 10, 30, 10); + rect(0x00ffffff, 190, 30, 30, 10); + rect(0x00ffffff, 210, 10, 10, 30); + rect(0x00ffffff, 200, 40, 10, 10); + rect(0x00ffffff, 210, 50, 10, 10); + + __asm__ volatile ("cli; hlt" :: "a"(err)); }