From cb2d2eb76bd9beb41855291f402f27b6bb64c4a6 Mon Sep 17 00:00:00 2001 From: bzt Date: Thu, 8 Apr 2021 20:43:57 +0200 Subject: [PATCH] Fixed FAT parsing on RPi --- OLVASSEL.md | 2 +- README.md | 2 +- aarch64-rpi/bootboot.c | 10 +++++----- dist/bootboot.efi | Bin 103614 -> 103614 bytes dist/bootboot.img | Bin 35384 -> 35344 bytes dist/bootboot.rom | Bin 103936 -> 103936 bytes mkbootimg/data.c | 4 ++-- mkbootimg/data.h | 6 +++--- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/OLVASSEL.md b/OLVASSEL.md index 2d75e00..297bef2 100644 --- a/OLVASSEL.md +++ b/OLVASSEL.md @@ -5,7 +5,7 @@ Előre lefordított binárisok mellékelve, egyből használhatók. 1. *x86_64-efi* a preferált indítási mód x86_64-en. Szabvány GNU eszköztár plusz néhány fájl a gnuefi-ből (mellékelve). - [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.efi) (101k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.rom) (101k) + [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.efi) (103k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.rom) (103k) 2. *x86_64-bios* BIOS, Multiboot (GRUB), El Torito (CDROM), bővítő ROM és Linux boot kompatíbilis, RÉGI betöltő. Ha újra akarod fordítani, szükséged lesz a fasm-ra (nincs mellékelve). diff --git a/README.md b/README.md index b795a47..692a0cf 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ I provide pre-compiled images ready for use. 1. *x86_64-efi* the preferred way of booting on x86_64 architecture. Standard GNU toolchain and a few files from gnuefi (included). - [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.efi) (101k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.rom) (101k) + [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.efi) (103k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/dist/bootboot.rom) (103k) 2. *x86_64-bios* BIOS, Multiboot (GRUB), El Torito (CDROM), Expansion ROM and Linux boot compatible, OBSOLETE loader. If you want to recompile this, you'll need fasm (not included). diff --git a/aarch64-rpi/bootboot.c b/aarch64-rpi/bootboot.c index a44eb3b..0658d99 100644 --- a/aarch64-rpi/bootboot.c +++ b/aarch64-rpi/bootboot.c @@ -1363,7 +1363,7 @@ diskerr: } s3=bpb->spc*512; // load fat table - r=sd_readblock(part->start+1,(unsigned char*)&_end+512,(bpb->spf16?bpb->spf16:bpb->spf32)+bpb->rsc); + r=sd_readblock(part->start+bpb->rsc,(unsigned char*)&_end+512,(bpb->spf16?bpb->spf16:bpb->spf32)); if(r==0) goto diskerr; pe=(uint8_t*)&_end+512+r; // load root directory @@ -1377,12 +1377,12 @@ diskerr: // locate environment and initrd while(dir->name[0]!=0) { if(!memcmp(dir->name,"CONFIG ",11)) { - s=dir->sizesize:PAGESIZE; // round up to cluster size + s=dir->sizesize:PAGESIZE; cclu=dir->cl+(dir->ch<<16); ptr=(void*)&__environment; while(s>0) { s2=s>s3?s3:s; - r=sd_readblock(part->start+(cclu-2)*bpb->spc+data_sec,ptr,s2<512?1:(s2+511)/512); + r=sd_readblock(part->start+(cclu-2)*bpb->spc+data_sec,ptr,bpb->spc); cclu=bpb->spf16>0?fat16[cclu]:fat32[cclu]; ptr+=s2; s-=s2; @@ -1412,7 +1412,7 @@ diskerr: s=initrd.size; while(s>0) { s2=s>s3?s3:s; - r=sd_readblock(part->start+(clu-2)*bpb->spc+data_sec,ptr,s2<512?1:(s2+511)/512); + r=sd_readblock(part->start+(clu-2)*bpb->spc+data_sec,ptr,bpb->spc); clu=bpb->spf16>0?fat16[clu]:fat32[clu]; ptr+=s2; s-=s2; @@ -1420,7 +1420,7 @@ diskerr: } } else { // initrd is on the entire partition - r=sd_readblock(part->start,(unsigned char*)&_end+512,part->end-part->start); + r=sd_readblock(part->start,(unsigned char*)&_end+512,part->end-part->start+1); if(r==0) goto diskerr; initrd.ptr=(uint8_t*)&_end; initrd.size=r; diff --git a/dist/bootboot.efi b/dist/bootboot.efi index 793c3e033a039716bc31ebeca09bbb282844dca4..22117b725e7e16a4115796349de4189a3f107e07 100755 GIT binary patch delta 42 ycmdnDl5O8gwh1>_6O)-3xF$O?s!wxb6qp>qD7V>&(RLTBV?mLE!se3QUN-?Tf(}Ul delta 42 ycmdnDl5O8gwh1>_gBqC_xF$O?s!wxb6qp>qD7V>&(RLTBZ(@;x(dLrfUN-?VunuPc diff --git a/dist/bootboot.img b/dist/bootboot.img index 82c1a71040fb84fd443f9fda1566395412334e9f..91f25b6d9e6bd50b827d37e862d2d4879b3d8ee8 100755 GIT binary patch delta 7027 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 aJR85KP<3SDuE^c(({j_ZX?*sx(f<#75dHuF delta 7075 zcmZ`-d3co7xqr|1O(v6tEd-KDhRl+E2#G=r+Ccv}&)0c(Gok*Gbr+1qmR07@7M!GZU-zxqp1i zIp;m+-M6!KyVSj1+OJ`n%X&)h9M3+}aud@X(6uwx%{!7Zn8JIKY-~RtPFliDd|q-H z-cKbziT9ag2i^rKg?QhcvK#M9DMraWfsad_hrt7>V&U1;47~q6bv@o=$B4~$jj6!< zsp$JPG1K|KV{)aW{Vw(G&)*oHpU0EOzcMV#u1l}J(LbVdDm!kjT%IM6WbeQp_@hzh>+SSR?6QrC)*mQRePMFBo=fvQ1csOSg zra#XSnk_Zfuy^=V#$5I>-)VHPJpQq91`KGdX|K60J)q!di70)ERHG^*4i3pOPnDb#d5u{N9yL4ge%btF+Nr4Kd%}rSQ4Z#OQZX;I zSjS@eL&>n{_wTsW?U<^yJi$)!_beIMb;eR7VX7?GV#X@WrpNSUWTx7r33f*!873UU z$d{H0mC~R2np|L=#CPWktbf1&J1^#zVvvft&FuArH5d!CxsTU>5#f zK?UC0!a}@D3v2OyG5Y^{VGaIo7f#KWiUX(BUkz+d^9`&#;8IsT{^sx`jiT;b_rb6a z?(kgZso^#Yzq<$;s^;s99_N9n6Zy5GA5J;zQg5t~gB4)bhNojT^?VLtbj+e2`4j$P z@o(8D{4VQW!R<-wEOvlrO*OK!eD>6(=7!8~sqOn;{8Mc=-r)zP&H(J0sb%KAm;`2m zz06Nss?xjP&1B&a#_4~7Q~*1x#4B0!{C6cUN|eQGrab~vetBAj zBxwx1$#$2NXW*~emP?xqJkdT|YB2CB`?DBzzGc@+Y%hOjj)R@-OrE<)lB6k}OYdr6 z(xxf=_m1h3b4urB$8E;K{8D8G@M@h8u|D45te8CFQuk?c0vCFx2P(C6?7U2&qj@=< zzjeOG0QZQiinVm^ab>V6ue;P4L|Yr6E7+DAPA3ob9vb)wbXI5KA68c&wvL^*9va;| zuQ0(fEDYQ=h+LUgPyw=2qWLTK+yKaf~*45 z{p3;V$U5|pae4wJSYOuAeV>xlR6L73g2I>KBKvyztp#Olh+7xtSR+bU-QtXa&*4$wu59IRMCIl>}rUZQZ2HuJXvfRc7TYlq8 z8^UqKZ>9Mt=E{2+WCKsxj`kj`(oxl^(D!Qliakjif=+l-WW5y+xQO@F4Y zUL-XyX)o5_j(DoZDLr0FXkz$BfZi%3+^-P>ml5Hgmq(`E4_qPZ&UG}HPE z*y$W#^8p+C2)fH;&6P*V!%k2@=#QW`r>i887uTHzx|190Z3NwUNz*iVggnOaG2KPa zC{bD*b7>7Y^f3He=2DtBx}YfbOoP&5hVdu36uV}=V%Gw|yiv+-Gh{CL6q}rspJFrF zQmQvT!|QNx`$%HohMXD7EL8kL9713Aa>Z`JK0$!pNNKg$*A9`3IVX_)5^$}uF0k3C zw4AOW)oCj5rkuY9W0_9nrz;dSER&UyE-;8iap0bj1s~*-A!;ClazZF9k^i)V)Dze< z2zU*oaM}SeZz>6x8#mg90MpS+I=W9IYy1|>p9dkdQJd|=ysy{f z{~d_B0S1&3Di4FWBIEiG&hMxR5(rZcQMp&9=422oRJZVONx(_d0(vhfTsWa^=NuT$ zG^PurVezbN2%V9$LnCrl=nIJ0J#Sjzrkor)317Y->qDpHNg-9%g>K1XLg(a(p{pR) zn97@48ZNagnagFVJkHt9N&7`J|?te18&Z@NV-`r#H*1t*R-@EBjr@`2c zzv)tMzMmMpDyM{Q%BdlQtaQ&a>oy#eGW=_$jElW*kmvNPy5N>%I_8ikUOc-cDOkbz z&dBY=E2nlP2ZwGa1_nXkxpz~7PN>i6`&ric)ug@%DN==Ee?lJXCxfyrY^PnTAhGkS z6>k*r=~w3m&C`^Yvs)Gfg_WM#wJ><@-9PZ{f&^!*>+jnqs7eOTy)J z))%m85>y~^(2%UPY7z2VzoPO?AQEFiTIO4FU^c8~BI=Kx_grcn^0I_j=a5M?>X7kvQJ0)cfvfPL zzXH`&Sq>q!raOJLH~Z45D=aB0EX#^IMqQpr0ZN5=ljB2EB6))iW3&9d2!w*WtFU20 zl_26+`$Rg}fkQ;yE^?L8N6jKndE-hEd|ZQ2-4@GN3h~6l*?&ZtO1Ex@Y|nfd$#6pG zwIxz><@Jb1>{}-I@3SBb&i-Z`+#TH*i-V&gR&OxOQPrt77&WiCuhKOP*7X1a%L<1^$zcYSrz`4G5SA zL5m2-gEF&LX(%X+*^ZL9T=;w@_K34Y*mm#9jk?}wIRDPl zukjJlQgbV^i{M9?isxSiDCK=ifHhweppVb=*ou3NfjYD>b&%#a+`(f0YO`>Mk}Le# zdncn#st&FOXjGw4?5I+GxzyDG3v!~L0;6^l6dkt2=1ic?hkrZf%(7y)Ig}p92y5;z zkjI=Dt0O9r!p$l8zk@Xof+zF1SdJ3>VZOzo(=@jilH|$dciulSN0KX_E}o5)q@gS4 zr;w)}hHKU-YU>p0szgnC|8lP_-Ko}YSaz{8i#(Z2lwpRi0FzAZ17_GMBj$IIbn%4@ z@>KRs4_FL<9~pP0aWX0zpKriokkmfmUK^EdBKE@x)rOx|2Aw4Pkt@=3o9b;WHb0aDWruof)vs?7@hIbQi_8B?d>deF? z0O&SrlmqKc#r*xH=ClVy(Hn2x#C}LxT2_#??J`*UH!A-SQ^MILumXv>HRrf<*#r8h ziWjry)>Dy~ir=JWv-s!#xvWSxR2Vh0EIzob(CbD^FHAq`{!(m3xXq~h>!MY6%>6IH z+68RX<)!>@RX$&Ws?o|v5G#Zy0_%gm%AkEC1<%3NB-GRBLCO)Y0y?JmrbsB}URmIG zpNZ^tCxl*bZ(96wcal)Hth9J3u}PwNPZv)jj~yHAXbBv$bTOPp9<1BLvfXN6lwyK; zdxd$A$2`p2i!xahe7P`hFU-5+OZ>yUy`lsY|1fVa%zJQT1qOu}oRFGZk*RXmDlJtb zk@6iNz>IkZ<|{vf;4sfVij)iP-Ohq2=Y8OIw6C6vbrVvgNhbeyEhzkFOSm{A~znCy5138Sw5z>awf{R$w%Hm6oDsl$Hf^m2GC)vui4R?FB8Bqg?41d2`_( zr{x6BhNlHIAS(fmrNtxKB{QY?Ei&_)`JE3{urvIzhjP8A(S~e7aZQxuH!@9ACB$-w z=*p2y*k`5q7dnD{4*nhgMWWhp%W;i9yT(m-)*X+WnG`Ohk)fumH)YaiApr9zd|RM*|!+4^u5 zn=CZj!~j|eP=Ft8FAY@n@sA&|Ff;%1k;^50w;~zroJ&QG*Dv}kcuoJl6EVDmHtNxr zcex7(UD2C6o?ho0FMwA0kS(w%x)0u7r^j`|8+8vAg4ETAMc=8wV|@dZ=~NSS;bAi% zwd*D=IVH1De!3Fiw)#7k3n038@drdjfrc=yez36ufEsKV+@=J=V_}jcg{0o+2L^8! zs`W5w^BtL((}dUt+s#aPvJqY^n$m-i)8jZpnEu7}{15e6(ybf(a0=U%)5ZD#1ISlN*}*_MF#(2 zg8{YQ*cFzX6f8n!`}eiSfD^wBeB~?POXuUj;TZ4*jK6WRxHu4}9vcNTO^uT9U;hf2 z!T)DPoCIUnC~#d2c>mXckrtc*jK?!c-7c@XlYk;Y%?m7{kNU?8@8%hz_h z1-FxV|H>&bx)Ptl;#wS;v1+E5U{cBO00ZK{akzC!x~dxMY`9mxC^zOs+g_2-ufVFKUG4nJXv^GzdXFt;q9)rPZJAg8 z|1EQ6!arN)chyLSrUcH1u67gpK0=?jX(M^FcTlGP6D(GyI&B?}$jpB&ik}9$MKzd&Wn&`*ol)Iidr*U-g?YSh#eDMz=0b~?j4gi1BG z(G}c46nqYQEgN@V6uG@VzYjimvNr9N~Gt;2O$gCIDG(6}|g4^c~mGkzT)?7`%?d#OA9tB!W!3`gF^N z?b1a5FVQ%nm-k#)L~33N9jlrsOu=xm4h>@GwqNd)W!djVLn#`?hG;{X9um!@FO_zA zoj!loI&gYnkrG8-iKbCBjArCzAm~1aurIh0;rtqUnCq8of>&!4)d|kS7)y<-ZIVpo zNUi(BAoS>_X@Ob|@(KuIP>~$JEU+{_YFinPH_AhLeS%$K*AjX zi0tt}MGq?a6uVd9`Wumh0(SxMNiY#h^m5)6v|!AjLNgWf-Hlc=u0HejzCP^iLj8#} z=krlWF=ZbA)FB^_#-m<-q46HJu5E=f{DS?9?oPETNe=5PBPth+O* zwM_Tm4}PM<4x$b5uP^?k_Sih_kA2hqv2SMlYl?sGh<|BoY~2