From ed5d049c7235db015d9a6581d931c44d6701f489 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 25 Sep 2020 22:36:26 +0200 Subject: [PATCH] Fix issue with int 13h DAP potentially not fitting within a single real mode segment; load stage 2 at 0x8000 and disable LTO as it is broken for some unknown reasons now --- decompressor/Makefile | 7 ++++--- decompressor/linker.ld | 4 ++++ decompressor/main.c | 4 ++-- limine.bin | Bin 32768 -> 32768 bytes stage2/Makefile | 7 ++++--- stage2/drivers/disk.c | 23 ++++++++++++++++------- stage2/linker.ld | 6 +++++- stage2/mm/pmm.c | 2 +- test/limine.cfg | 4 ++-- 9 files changed, 38 insertions(+), 19 deletions(-) diff --git a/decompressor/Makefile b/decompressor/Makefile index 2186687d..9f48cf50 100644 --- a/decompressor/Makefile +++ b/decompressor/Makefile @@ -2,9 +2,9 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -flto -Os -pipe -Wall -Wextra +CFLAGS = -Os -pipe -Wall -Wextra -INTERNAL_CFLAGS = \ +INTERNAL_CFLAGS = \ -std=gnu11 \ -ffreestanding \ -fno-stack-protector \ @@ -20,13 +20,14 @@ INTERNAL_CFLAGS = \ -MMD \ -I. -LDFLAGS = -flto -Os +LDFLAGS = -Os INTERNAL_LDFLAGS = \ -lgcc \ -static-libgcc \ -nostdlib \ -no-pie \ + -z max-page-size=0x1000 \ -static \ -Tlinker.ld diff --git a/decompressor/linker.ld b/decompressor/linker.ld index a5bae43a..707bddf5 100644 --- a/decompressor/linker.ld +++ b/decompressor/linker.ld @@ -24,4 +24,8 @@ SECTIONS *(.bss*) bss_end = .; } + + /DISCARD/ : { + *(*) + } } diff --git a/decompressor/main.c b/decompressor/main.c index 68cd0a67..7c221ec0 100644 --- a/decompressor/main.c +++ b/decompressor/main.c @@ -4,8 +4,8 @@ __attribute__((noreturn)) void entry(uint8_t *compressed_stage2, size_t stage2_size, uint8_t boot_drive) { - // The decompressor should decompress compressed_stage2 to address 0x4000. - uint8_t *dest = (uint8_t *)0x4000; + // The decompressor should decompress compressed_stage2 to address 0x8000. + uint8_t *dest = (uint8_t *)0x8000; tinf_gzip_uncompress(dest, compressed_stage2, stage2_size); diff --git a/limine.bin b/limine.bin index b92fdfbc8afc04f1489f0a83bf93002d634d172a..ab7bd0c132b14ab592845c9b44ead4c562b47e65 100644 GIT binary patch delta 22490 zcmZU&19V+c*Df5}wylPZZJUj4HP(*P*luh$cAGSAY};sT-qZK}?j863{~6=#>1WQl z=2~m)GfrS2L|`Dq4=D%;d(}o6hzW2&76uGVTT4A!f(k2IfeJ6=3Ecw->j8#Fn?}KtfMQw3Li1ohZeQ;He)nJFX?}Kwgja;A~=wbgvB@3=E8IhHV73RY0D1$OHC2IHxA`kKjF)ks1n6;LoBVPiXF2AJ0jlPodPT|5K!DWN+j`tStoFD%(fLzcM0+K?NVhf%*Vn1@A*`l>`eJfZ$yM z;K7IJ`=XJkPM2dP_|Z^Xp``Tw1NGld;Xs{gP(ejbM*n**9TkA$qwUbb{-TC0B-cXY za4iUefzVMyyFe*GrE_dqNGIN?9`2*eVB6aQn+Kr9J3 zDL4o;;a}80%uA3Cgz4;l26C8!1Oxjwq5l>)2a-TW;Qv&&0aB3tGlFv8f_P9Info;; zjuW(i#30|}Oi*wKG>H4(-EX~qe8m0$|Np8-Kxz@ts5_wkFW;trzB*7r?<631)QBL^ zGem%j1VD}O1hH&AgA!0!|8iow-?9DWJ@p{%_*dZn&g2P-Mr}#Whk*tACV_<|dAi(=BNC5&Q%Hh=!tyWrE?oKn?l+FDm6f5&yvk z&Hu;|1RmMP|KAltjXwgpggm0Vv4=cjxQYMgRENBvxhsc(;Ko2U)E0dK%>QQ>tbkI7 z^gy06{XaGL|Bn`{1NL9i|Jg>h|Is3{tTKc*Ppw3Ea<9?#bN~=Vi4rNDITT&*TNec^B?*DZVzN#_|Lky6NdOv zL4l4gGib+x&d9$F|L?Bj{?8>9)c@}U{pUb|ENEw9arNrgepm%26nhF(VHnkdat>cBq}tmN=#k!)>ATz2RK zvm`L<#wnMb7dQTb;t(gPfXLCGvD1g2n-?$d0h*Z&}P3&hjK$JV1Z2Z_mB9ZnK|@RPyJ2Kd&g$Ww2g-TOInjpA z*%@xP>TzWona{Io^~iM2n`gxeGo_+u#WV9^cK-*)YUxJxyOcput@>hR)x4%{te&DB zrDFQV0ZUw8z&ubaM6gU|Q58j?B0taGtX8AOIEM?cO0F^gv^QC!zW&O>Z6Xet^$aaP79GxC4bh8GsNn?Disz< zcsy>ggu8};!e7DP^tQEfJ#@j4u7j6IcseokR8w8}0$ZbvDy!5j;Tn6c z+xposY+|i8Cm(x^SK4U$d2zrgbd2;RleL5P_#0=GCDpC=LF%+%dJy6dsr-_Wx5Em2 zeiBx|>lZyq3=Kz5Vr!jm~x-*vPd)7IQ8acM`vH+QuLm z_ecC1-CIP6Hv9U}rQ3NMO2EVfVOlxk9qU9_xKH!db?y`D(>`T@ch9H1o6)?wlp@A` zO2+-5)axm^r{q-5uZ|`5gN&67klP&Dw>UQZaHo^9lQZjK%71``KP5zC=M9#5jh5>f zcel?}{1sT6D9_jSjomFhhx~A zcLI+N8g1OPJ@zMXw;WnHV2TT+>1!?LrK8dO0`<4}zPar%3hhN!3{jt-oanej~NQ8G- zOa0=N5UM!Cx#O57%rzoBZfRQ8!vb-@LrmiY2)2L^14LR9TmpXEp{ zGs?Sdvs^jXx+^UIc5q!)%3Z5@RS_DVf){GjR`ob0OhtQ^)xz=7p7U}te-?-(&GbgM zW2tVBtZzOAFr-CuyGk{pZCGSaW8Vg9a!5~c`D2G6OP9P2Powdb>NyxZh!*08lJHO> ziD{pDLulH3P0noXm)a9{6_lc*b0Xl65?EwZQkJGi9~#{|m#}lf=QEZ}zUAng@sM6I z)9NSWeAemPQ(0{hapkf!2h%$XB-plrF#megC~oc#49#Bka0d<(|HTpMziASR-s5uQ zR#b1C?`MR(RuQe)TS;TiV+;Rr&PkYou6t;itNh`|BdBt7?_5@u3DnX7&akh$X~ z(^Wl8i1wq1h7p}C<;)Hf z(DfQoqKVxPUk$U#EmfyN#FJ8qU}l!(q3m*v99^+GlnLQh>+<-g_0r9X;G+A~`?^OO zvHmOiy#d6Qz?E@L3L!uB(t%TRA^$eYIMjt4kkdF}sA)4iC8zeCHSud|#*MAinDfQ% zl5As0;oG;Rts#U|81r3uv>i^ zBU^7~4v{z90U=K0Z?hu{vFl<(yoRy^0X#n9wAUqH^QhNwul)_qrz#nJbYivpTWM84 z`9vKPBD^0j?k!Y7|A|P;v_s$FdRm0K;i^Xr%E^b(Wr~#erv{X7pS|s zC;l=lzUdkLrPiS!wn;*~c0*x?Tiw#q+t%EHr1&qpY`p+KLcZuOuJ+7VFjof@62#DDQ+vW`KL58KX|C|3JqwXgPFMB zUWtyDmkJHfOmwy#J(2tDxes*c9D#hVY!*dS!6i3(#-{4yr0#;BvG;ksP*`7J$O~N_ z8*CbMQ$#q%nDlHYk)Ky>*smCJzD11`(r1p(5vVF06g))`SVBWsxPNyEgO>MDG!-`g z#LTS5nr{4cVsCd)*fipAb5f5-Bwg2Fii(ycx&^&qo+8DOE>*(SnML?W+c03IW#b(8 zWypMt0|tRTGAA7W-NT0iA(Nxi4#Ob520VK0fWzO}^Ns5m(+`@X6zp;?o`>bS6brif z>ZC;SIdoV!xCDnjs=EoNBJU{>64N)6Kt=g&mX^sVI)@oUGYJ8Cqfm58vA8wFZCtN@ zlp^R7vokjt#dP?Av3C_t3>xU~unj&Ujo?WOrXzzRC9BlN?DyS8gQWk45Ud0CO_K|X zjR)l_0KpVf)Hx8XQ%gm(tVK#3@wR&=&w-Om+JP8ud}cExe7UN;g#`Tzs+#|1XYei* zmJ?K2;d!fxfPHLtaqXh4!M%%ncf_`RdDY?!rY`Kf0n40J6mw2_lLb(=Rht&vtFldr zd^+i#jm%|g6^Vt#KU&hUG$eL2^c^ma&#olav`qOKzF1F&tem<`0{f=Ey>0MG&yt5ap*915$8?d2%WoRVL5iSRnaS|0 z7o0fsXC6RMvqoD|MHfg*6%EbvAN#I0ukCCb5bXvBhP-U!aBN?jeW1UGCSC5+tWk}l zfV@r`XGN8_+)BW-A0LWS^^BzniU0PF1g5*AFp!-fHC-C+TS|4#rdtWm0+Th(6R$z< zv7E9MK~>6~j=iFBc{<6?6gw2?N5nwkTb|YBlZr7$arWtgj0QMlJC!U)6HH8MXN6?v z?pCMrK(=XCBO%I$@7$$i@XGG|7?RrXtI5Bl9Gc%b`V!yYK;8z=hU*t2^m!I`K2nqc zF%}Sg6m4JLod`xD^Q7S~d0oS5h=SXi((Ggr`;AiOt0`^+ zWR59aT`GIg6B9sW!%NMxfz`=wvnzSHEF^QKSDm8VkmI?XHArlJ{q6%#ZRq!C{dGYyO%~(7)qumMUT- zL;kuorKK*o4EqrN4CfKD;h5C#PD@Fr`x%I|3YS6LNbLtWZVqsdZ|%Hz?0${-`cixM zMiG+z+3*6T`j=salby>AN@Jm0Lr`{(iwx_9kY6A15X`o zc-rH4xvWY-d-f7CYW&ov=h?j4uXzNP@X`NAwo^CR;wGPJ8q ze9I*Ef*32d0?H9e6qHY>PH5VCq>luOEE$&=LKluehK&FW>#pqcQega^n1`_-QfZ|& z?FA>+m;(@mwd}XeJuDJG$w|_yAs3P%ql7rb-ozxIMru|;gH1-gL2H^adI~#Q#HUMxD{>&Ap$1$8O^oaJtl>WVUkB~8l(NFPJvD6!`GF$ z4yOo6B5@8ojt+8@?y@#NA8@OWnn=Kkq*>;lJW=~gz%}|fQKp1F4b4Jyr?k+j=AIp_ z@*_L>{nnK9t_9AwY${;wA4_n8b0fZ6dkwk$yx6Zc*ru*fDZKDLiwXU7O_)Xr@%b>=RABG zhhKF51NE=oxkP<9%XAsOC8HYpI!4$?Z-d>FlRpD4C`uqMl^#P)UiV>85U_Vc-H0Or zU{K6daQ!rtO1Pr|qh_N-@c5@?ziB+qC554%=@8oqQbl&W4W$`jF~xhi7L!fT8E19d zVFL4Kd--fR!fBT9B1^BH;tiq>PYuoA$}0;$-Ui|xnh{N>p?*MAH%xY34SS zSTbde{Ng7|oc9(+_*>1qjIN=4sFZDNirX}TSZsSoH}wwbXJJz}3x=|M=^(?DouThA z#0q#ig-~@o=y+rhsZwg%oVD`Hkx2GPweMO!>5LZQrjOCxs|zn(j*5UqL*Rq}pAvFH zB^8`cV!ypfQ1}mM>CfaR4jtmY5N3G<-dw`vX;*)%$(H>i1&5_qv)Fk{yKevBj4m_r zoEpDmeqv$kU!E2zmYAg|)nnrNM52KGa%;4o=zS+@lA%}Op^ak7=4)$Ws#R?$4) z7q&2*vlL7B?eVW0N9gyh8J00|z*F~^0F#gkeT+e%l%cd2Z z-nV+W@V2J-Q4f$ha|@TkHfnDQ^`oBu=A)*awfvM4e;EgrOd0Of=(2bYoNbjMyfzUn z*YKsT3*5rqMcGxKrA-(KRS@7cdrkKFn(%Q`6tpK!37ql3$;J(o8yE%2;yEcJDsvj}lf(WJZ-d|5`piS{ff-s$Tw%Vwj>&;~|(> zz$GWd_1d3ehf4|#H{~z^#Nr;ctQeu`9V`V8^AOW>eTnD%!FoZ7DiCgJwHp|6f!o=# zayKq^ssg#*r~<*gK_5!7>l}N9gs9seM^ay;>MBX(&2(V!I?W!omK7xjHcwC^d&+VU z(ocD*<(;3ee;wwy;x$*me|D`RL0!1b_)v+6&ho*1E!@)Sl0#Pd7~32J{nmdhm= zmb5xF#OTBl{d}`IFO=cyg1GynoRUQXrb&3yZ@d$+cdhf7gmdJ2(S!6Oi1;{o1Kziz zg{P0L^E^7iH6$|H+$8~Z=qCaxceB}wta(PvQW^fG4L|=O(ax*`n4Uhx{zO%38X054 zwk)*JGhzzCSKEwjpkVQ2$vGS+IRarA9u|Jtlw%adk|vOnre*S42do5O~^d?alwkqd%l*r<&_FPe+GlJw7wKqJr$); zjMAlY8A?BlLUF*$CMp6pI|W!*XaH93c}UsIvQ1m=#Na6%(1n8F77tb7FQD&5qo08? z)XMTD!fY2=R3YF@lvBtm?4*u1{3M#m^_V9&h`xTG4Nvu5;ME)+_m7Zv*H8K;k@>r- zIsAN$EJ}}@SOJTcxb4t6l&Wn+!z&{*;KqZmqsFgn(Q1^&lr!5jh5A=sZ9`#W#M_Lx zwkg*3?QCc)eQM}0;=;!$2&Th}75chX`TkHK zpZni#n$WW}FCEG2kus@Dq=|ewTK({JGkRhuFZdXvrd{uSGqTu(#MMj{e20O-cfO4c z=At{+*bNUGd`wqmN)R>;MnQs1%R)y&j@n|s0LUFXL?H((vKBn-e%-w-*INEqBHJ@w3aiCvblF|x>OF~V3C&mxCt!vI(k z41C3n&fKyi@-iZl>G*ZEbZCRWlX_NHjg@#}AnB2)09jC$cjex(MO+UJA0&b%Fh@vU zUT$I#`HI+;Kb~CME0^@j`t5L5R(%1P2{m~lDV}jO1h?bXRNk=Zq;l8vx}(jS z>pNJC)6t@{!AoGNxZocUwPm~%=$iwU-OxA-d}&}i8M~)(^o@kO3JTTTzhVtch;2jRnGx@}*F^F*Ta%LDz*@nKAap zrE+|0*Ya$Ysl;$+_geFqyd(S9d3wT*x~$K$^fB9ZRdsWR8e3AO<}%MF@Ku$N#2_Etf{CNd1X9uxO~V ztM5?jMa((m<>GOIE1(APB`F0jmYHi1du%pnV~pKvtyE1FcAl_YwGAw`aG2ChrF8ea z7N4v0RGW3eo4w5IK>u*l7AnjT0wc}gt}q_KtsDH&GNc}cTEN&A5H&GP)KgM(#ixh8 zY8DTH@%T6mDHuf;A@=7g1m|U8_2a!r){IBpf6~)PucJkH)`#`5Z3jpCK7Zttb`r0C zJm!?S!^hz`kZO`UBR?+;Q`F?s0r&1x&2U6>zf|}4CV_{t}P)Ca@GJLh*#Iv@Q-aiA(Fn9I?tVw5co5I7w(9`nmj6m2t6L^&}{tWb~?;QFPf`q|RxU z{qV03m*WrBbMX5iZZ)Dq-3xKxdYLr|TRExJCq19coeN)t#>U;R20qm0!CZePNTzId zFU-z93k>xBKOH3kkT9)yy;pRQ9wU5-m7hDaPl&G*!;CAU>rIkYA9LX-^TD0?1;*$M zKX#&dqzm4ne`-X{R)l+Cr5GqV>?9iv)zV**%+HLn$X8D0QrjglK1`H`wgnr-LW-JE zmP~Ry8o+>PdsuOVHCR)81aJHz9aOWmj_gIa=WV(NWT0a)1Lf&*1bMQ)B0>=h80D<@ z0&&p^ZaS^iVVZhhQuew=F-OGh@Tc@L*Ys%33f+|D$`KR>kl1*ZS7S=`1b9vO0MzQK zp_HC$e`dtgAigQSsX&=&%U(HVoTBv4*uzj%JC+7CV*Dw4bv!-wA*qxA;%E6|E zJ#&gcU`4jf_-#cmQ<`+*t9blqk`Z1|aaeCK{$D&?7(KgvC~IMa744vU9*9sR7`v=#q#x+#Cwotjb>2!M!RL+I ztLYR>@=vTjDl~G4Wve>|-(C6%;N>PDxY8gp%N@Tq@0{ETAsNdhyc6kIU1^pm^@-#F zp50}0Pdys!MvF;fTF|aKVCxFaTcIj1B-0(b-=d}Ft!=qm5y(Y5B%GWK2rC`mLzeqY zYE7JHxh7|=gEIL06Hs{_d8Fg4f^ces$$!Wp{z`aZ-pI`97MNjp8<)lu`4-=#Q;iY~ zsp*eMOn1Smom@*G0XC`GWz!+%qjLNQ=*7nnMP7lLt9!!CicamSr1^cWt}Is8V+|_v=7Ovy-Z*y=;dZO;3Op$>r12#!=Y7_>0u2D;JAo^~@Jygn;D6 z20x`{&6!7ZPOpPX<99`DX^Y(x%8h#XM8STj5>HMW*&D}vB!Y{jaNbp26sAHx0L#^f z38+1Z*CXCZy6zGeOjEw3o}(V$^5hgT%&sV?6t;I~{bg46JF`uT$~Tib4Dc)3h*oon zCV_bIoLitHaJA$UuIk65mC$1v)r@1N1K)&_QkMKap~Hkg7WrB3;+p7TDuirp-6tg~ zs!P>2%7PL_++cBmtYQ=Xm+Q3}Hdpx_gt!7M7%7kQuZd;ZK@5Zg`MBYnq=kw*6q$ zH$-q!KHnAq`aSPR-C=T zE$a8>T1jDUG~RTRI__SCxJqEMETA-BvfKM6H#-r|yes1CmlpG)O*@8#tDq z)4e)(mksS}&4Voky)$ebcMVz@M~d)2->s0lYg`gpRwp=SSgz^xQ;}b2)qz? z(pJQjUFpyO<~{PS#_Qrg0UcvXd&0wPLOs9c4_0_SMwZ6)uiN@Z!E#lLog86;9k2f<}X_Q-Uc?(3LgG4As>nLBy^z*Nw+opy*sj4gbw6WYNL!5 zS-bAilM@AUEQ#M|5?cvwsqNx$HI=tvh?TGh874hBIi)aIggxfDq2vcS*nOu(nr-vE z#VkHDg^R0127nYm|{7@o_GmnkPp; z-EP2Ou+0E|22=Br6IoyKFzc?Ztu*f;Z zxVc2{2kXD8YBP>UmM-Yu!{rATj&R(6LtZbam5Mzjv$8~wpH?+WTQqIsijhNd6Z(v& zu=Wk0&Zls;(j}BggR1Df@n>=~hveQ;{;fDG!(f?)cUR6PUrf;xN(5OnkVq1zHBVR| z@@i(Rpaz{C$umw8F545iu^N>hmN?g`vv-1u6P`)1^&+(O+fCc9&`z80lHn-}g)bbh zUH#7S3ugsa{)Tri9N=PZ{qkw3CwrdOwzv-XWmTvoYAkj{Cd_2IMXY*vB|#b<96wlW zDske@jQB}R%>9!JxftmrRK|-A8!8TeR{D@mK?|HK9S78+-WJ;qv_=>!Su@IG3mE|_ z5FgOR*ZLP1e;E8`w({2HrpapVr4596yYM{GZU z`Nn}<@>A){aZzd82JOjOMV;C3H%xu#|-+@J;?Tx-+)lpSZ zjhSZ%ktQBK6#y+5$Z&`k&rv9I%(b0CUDLgjC0ERffr2KTDU&lCZk1p4aFzA~b_0si zE54)p7hhNLd0RPL9n1FYZ<3QSzT&Qq3XVhNVmVU{2#bGK842c(Kb#_O+TGc*!6+t? zIJT$yj*dfF7)708DhB1Kkl*VJERue8A}l6#f+NNVSqw$%Va(r#qQk9k zf8&oD*p_sBHLES?WO`Lc#6l;Gr|>w73imR;C+OfOz7kl^(Spi}X@4%Hu-Vnz5l+dE z*4xbbabl?t+ZN~CoBy41VMg&lTI4qtL%&E75fi$^l%Vq84UxRDURBud067)j8MgVu zLyX|{XKu$J$OCnY$v%x&G@Wp9y{PX}4?HDJY*RP#JbS_QD(}W!@=CSAjr$O(lc_vE zcn76v&afVtj7iPoknS1znW>ok^PeKSSMump1HfgVwtK8-Qv6;dFoOswk=y81b9OtW6g@5DCTeG zY-9VJjwMgphf?!ZmAJRKPo@Qq>o%u@HZrh^<1~of@Z`Cu|CvTp+`+zVu{4@}tKD z`8fQb<%6^TN$$Rq4@g|J9~fucd0`BVPe@2+5scOR<^h|ZmxlG#s<7pQR$NaS5t`W* zoUKOL!5ELN@-2X?c9~`~wJnd=Fd5*W41s3;V5iuZ-S*pH{qd_uOaOj#o2IJ4J$k+} zt7l?v(atg)HF%L~qGFjcSISvGA)BBQBbcYUKpRKu5bvUV8K6m&8mJFJZv7Lj%eS0P zw{hP*cqEYB^ivbQaRqWLkrrNP0G2BZ;erh81C9Yg#g~zo+^r3ld=-ci5PB(ycqC}L z>5zudxYKj%sp9#G;{xXKXFKntOaW$Guwh)plS$QYHdd+J9$raqIb_L;W^V6h2wFqW zex?M6U@zvY2~aMa0mFR~(U3vVLuF5EB+jv6_P!F22h8Ew^s5t9XrSh%)WW1z<@9+8 zp-E%W$ci^KZA8!wof1rzS7lFQiPn&r)i*$Q%Z*8UppMmvDP@pxgY}(~5$G=cmWP*( z;O>Cko^N}ujqYU~cb+}_&OSW?-dfx7!Ixs-Up0S|07M;~o^bDELe{n;{Nly?vR^+U zN3hN?8U3inm5k|_6I<&l3TyWXLsPgT&T{OE1QJFw4F}%MyGuI~AEJ`5rDA`Zme|Ch z(9!pMR}I4P%2)AwQif7G;9PrCu*ie z`~8CI8GtZ>zp9lWqkr+IYU$VNmamG|9AJu}oIRq=$t|3z?3!YM#o_|<#j$>JS;JO= zfAR2FT~?)7?KjCBOo;O&j9*(xEt;Dk&E#0(57jXU@O9v2)IJzcK42=#;+7p(NEn+UTbQ9CW zu$u87Kp^w!8~FLpo5)njNA5jwf2tt-r6~*+NW3%hcTN2&k2|62ol5k!nmP8>ZT!T;vz68|b?zuSQcRpnc zm2N;%bKa`=bC)*i`Cs4a212+=$_9zg zS}OOE0p{kD%4bQx13SZ{QQT`T9{MpIxFJW^O2s2h(nV7RZm5?s?!thDbI2h$Hq)o(JA87YY~n~de8Jo4H7bvu z=cX5e8H{W)Sc1B^8>taR-;1C1s2I-@9S^FPgsxg9eMg)rzn!y>-LlJ5 zdD-ggzYwVEyc(#@DSLJs1up9~8;#z{y-8S=oog@{;H@n9p_IwL6=)kjRpB@_>NFHsf~m-AL5mQ9XSUKHZ2QT_ z-(*#U09BB&5E9}(mRLg$0h%80y9huHFBH03eZDe4v=iCN^{HK&T>sAgObq}0O|Ua) z0-^PO6}`*vPxN$SUJ>R^q%BWY58(bL!i)Ejmu($!w2Kde8=9L@v6~?fjl4f zQ$AD+6m{+^oF%(EUuR#H@(e~z@s-F!$}^9Bp*$CLk(BZYdK5bThr@4JP%%;X=Y&wo9`zB_r1manE1f>X66d3Z*hfUrb1hzvDu519zA4{1nYOiaANcR zSS2s+_0REdnbp=~*Do26sDGel$JzFwhGtq>KmTNu<7H2ebAi^gp*7gq3B3qp8e)5- z?Ed%!#%|603y+!u-ADi9rHUB6c%1764f2iXZx-xIWi1e1L()l45;}mO*hWj+ z6?^n~VCLreR%H-;t>7HkimV6yI(V{5X5|yfO6|E(R+e_$nAzf3Foc=bnE#bg=NZIj$8t=spJ3_30Iqq*4A)ig|vK@-U&Yw>qz&j!$6Mc)9Yc(;^ z_$YJ{pzr>*TFrWZIE3-%0}ZyawB{^@piI%;Oh(DEpK2u?kV@?Q;`bS~fg@X_-=p`jVh6Vy@j>GL1yxovKlBjJ zyN4u?F{$Fx8AS&l;%wo0i?@(Q9$uuH8yt8BnH*AdQw)*a!r9O~I;qVo{rt+QsU|*( z=Z?D}W59r|1-8O8YPGx_*6_+THCIpW^&8`|`P4oRGOODlR~qmKW9GTr$uB~B&+o{2 zsFdF^*!B#8mBT9eg19A#fKe8O-(WQzG@&xRi;QJc>!GV~uJ4NpmyX-1b;FVYqms%@ zwaXmVP2()gH6LNzdx{7!Klia5wm$=5b@ie3;F`dDE_Li~tNyis-xVe^GM{e+ZdhFa zp<~l@(GVkn2r6p3;aVV@bi%23y9t$4fg8*xwv%Z7P1NnSK|9e(8s!=`h*?5o{EAK0 zVHV%Za?FYlBof-G3CSuxLxju(A1p|>=ucV}LEnB0chhQ4ed^_@eT+hRIQHpP7`!a0 zXS@ffrpScmttgd@e>;>a&4-~cvL?7sNg;l<>gPnwkBGJbB{2BV09z=xJ;--yQUJG}BO5`-&hVTp3U z%_T#Ci)fatZdF#BB>qtx9y9U56ED1KiEUrLj+Y6nMW2>`repwN0E&2h<2eC3b3iQ1 zEE35kwR9cq4k9EN)b?= z?iBc3A1y{rG57IUptT9+9x7TwHpd7AlvfkxZ?(JO*@YJ($hj6(2P-1mzpCE)D+eeZlUDLk2=7m4Xc+#6xi?PcA-EP9?OU*y@ztl=T`<9soZ3clQ&gei{4+bLJOn5^F zk+-cLA{Y2b5_p8s@Qa1hA93au(&vT#7@pe3Dy!Ws*Ck)(MyO$)^;V}%(`M_2YOug_ z{3tUhbUh&P%k`E``c^`@WpgfprZ+ zsbsYl+#_V4qngyX3}xEqPs2##Atl-p^waP8{KYO9GaYf)Fy4s3rDr(OPavwJheG+t za3rVdH8G+S12h-~ao< z>%fRnIqwOs-A|8eOD=vfQ8HQJ=hn@%gpV2_cC)1Id(sTzNZ+6a%oMcaSjR*v-L_+P zjM;Gw@l_*P5Ws*c@qz$&%@iTsbme}tXw}=Qi>k{RgRnF!|4NCiOl-4OIM}U(IGT<3 zHI6OUAOM<=X|M~5p^8_88-ll0vBv9e1lkoD()u!mT-S6?Or6c=VRb3S*ABtdHBleg zFb_o;-5vjNLrN$oEbJjJXk_$*e85Xsu+(pJyPdR}k$?R)uEXP7##X_1TVQDn{(o_m71 z?XX%6s>=D`=;xMauQ-l}sUl8Q|NT~#hMM7Clp3x5H=2vzt&H}CzIziTzy-(tk zAF4)Z0eyOjj(GM1`P>3wWke5bX&-v+jEHC1ZE#@k3A=9J+mA6&&aH^e?MYKLrespIW06F|z6@O|SfewwiZHfHxe?=c#Mvtb-zFTY9a zpxH}Ui9xctS z5Z6cew2g)V+ufEw+t!bWnJo0yt9o7@chGf8p%xnqB+rjDR9>`BzN9}bci-TC*U`P& zV+%wVwf^lp`{tm$o9?k1{fOP*Fzeh!Ew$TXyRN<#U)9*aJm!>>etIMUBM7A?I6q%J z6k?A-+sT);g=aTp<+}qKV07gs6FRY03~o#A)?|A0G z4wBiqb44-~AM%njkw4xjNCIO6db%1Z7+fUdfsIDUG7?P52USFO4tnqEHe@dD z3PM%`9~cG2PSCXACuvgHhEM64#sj$<6Kk4A7CGofS*<)MewcVt-x%=CIJX%@q;AKR z0OQ^`{na)d)0%oaW6-Q)bWMcd_hnEZY6Tv+Vh@x6XX;hRexeC?sL|~D;?}EQ>1f-8UPQS-(cop`~$cy`p86o0d)|Op$PpeJ3 zQ*+IrviOsSILh^mXZDkR-sSF`ltZ(8m6B=2|kirm6nqMjpxKe69 zvy2|-lmBxr^aI;*?qEv%o(yU4ra~U>2CF!sDt5hKo_5+Pp2fEb?veW!-s%yt{JmD* z^@udZ{+?>=hN@gcl@W7{>s`b*K450kOH2C=n?|nnF~e7rV35QOBliGL@3$Ct1O%bx zM>Gjf>|ZioV%q`9(H$IO!x{j-YCJVyF-Tr#F(A)RgGt-xkSuF-uVJ@bOSg;V08hHk ze`J5wf>I>(Xs#PmJwNxPZ6eU(U&<6|P1(IPeCQUTiA;=uVEUk^Yd^#PLT`MhS0vQ^ zW9?6m^asEY1BsEmE>=_6MPpvw<|3agFfaX^Mk3@ni1@1%cODuM^bLU5ev%j^N)|IT zsfD)ZE40$O;lBi828PqGX)X3X?I&{8?_ky5r27597C~Hh4gBCebDYoE3WV-B3o+H> zi2>yg=S6sJJ9lFLG&6=sMwq`}o3FT-RByOCXCn2s_*xZl0*8qLf4K?AN>0OC22ls= zezqYeL>SU4hlNb)>G}f0z0oMduwBK;m2}Pq83~q-D%$YT4&!P0vZv9qg~sr z=-g+`0!=afY0;zk5MHN*mfuU>2ZYZ6&+6>kO)~u}6YeFYI4N-V3TNu!qZJD<1RuZ+39IfQnt z-xc<9yiUh8E%-;gB-Y!ZWXg>#(tu~(Gk<{y6qDwyF`v{+=gr)F;JL;ub_F=9{ou?f zV?ObPx~z47K37b^iAMWNGj?uiers7TT-p}A%Fh51XQbzC#CGvc!Ue-U z+74oU=kQ2p5O!qMd78{kN;cx7=N0u()y#2WJ8?wfCr-TGyc>)m|gv2c1!|}-KV+iAQbN5xao8Y@Xc}{=&d2X(uuOwd9`LkB?M(_b` zs{o5<-!&evney?9^7r;_qtjp!dB-c9uy5?Gs%w8OeBWm?rT4+>;=#}=%YrmIzaSj} zr79ccU?VViS)|XZI_XIyKdxR*{$YfL?iYwDLV48~qEb2XePC0rD72vPtx$JJNaLNk zS7&Yn>IyA>{$@S2Bn*c-(4~^E+Q}oXwihZ&IsuIN#|J{jYK0(;X2s%%dhkffdH!V?@f<!8$aH`_v-dB<`?`gp>+-6|o1i zi{+OH%)vWc=_yQl67#u{sQ-@B!?@|Pn9PvBE%JAce`275R5A#6;8&s;2h%RxmIs~6 zvB*99<001JQOm>WsZ% zKaPEv7>|gBteURu!3ooqZFZdrF^;T+1jogZs4nyTY(M8S<=jrqTWGz~3RJF9v^3HI zgV3bZf6Hh?cpN&%^^r11=h>toiZvvvo0D~%LmPn;C698S)D4=BG_uh!)b62vbe0pm zhc@YXo=z1Im(!v1B^GJPZW$FhM;K@XY%yvced5(F|3F&{1p&!H}pBQ$$ zgnnn&F|?*^j<@io;usrNr`k8gu^Uqgl@$1|adcu*79`EZ=x8)+q%xq{X2*2gX)Te* ze;e;& z?Y>1NOh;BILI%P-2SPd?nT|URO|R2fMvSiByoffr#LsvJDjQFn2M88qOh#EKNRAA$ zIi0>{46tg|TA1nrkF5p?XaQ^Kk?;&-e+;|GB}=*!L@QqXhaU%aQi+X*Plo)Vk=4@w z_2E^}7%1mX)Vm&!=GKHz69yz|v^iZZs?BjigxjKVRcg64L#pwj)+*BG?egCM7@#)> z6vlgW=HyD6y@MAevCTIsj9lsTr#Dv^xzhFBgB8Z9o}Vg=zkK>rh4H7|io$pYe@iqe z3S->PpH~=G=@q7)A{B-4nW8YhW@oe&g^`X5BgL;UdUpMc!l;SxD~w!4VKnVh6ow{H zVZ4t_w&4p!j%!qO-2?P-oPZo?bCJy|IrcGy0csn1`v}ZMi|eF{d`A7ff2Lxrc zW%ICOY0Yx9nuRa_ZNamD|<;-Z82v$|_`_b=(L`JV*nu3O2%o9V8( z8j^>rokjFVS13XCHb*6n`H;hd6w-^BcJXsmNa#3l{1e~5`kXP#e`>XFhGQ3|v?(d@ zU*kB6NgscX+XA4Ia)9pxhdxb1a!KIMR|{A9@QiR6_&+>#>z|}eKuD6T zT+0wx5!Jxtwwv?NU%iYQtN;2xsZiCJ<==cQpJpLRx|XE>jv*hC@d}N6whk&g|M>D; z>8VbN7qLd-wbvF$e-C!L_0ZtH-W0{{zh1-7-nMJZzWdPbWA|1xO9z;h2dkmqA~6io z*JoLy{TlTP&}e&pp{2;3rYj=JdiWj*-=pC>628ZJlE=cz&yzgb;z`!SC)$!H-M`7N zgZ~TiG5rif@tE9t=<$(HLF<3&efstXJ?wa?MY{bA4US?=e>G71vZc#aD;o3`sgZK1 zb_KgoMxUK)k%s*7KcUR;e#=eXwrcLZf1s4f>7zK@a9fNl5EDfc%)l5QI}4F(YN+kx zUud`!rFga!!4B9=bu%lO{QY&h15^B#CX1;7y>f~C^9>eHnhsWTs=*|_Ijd6= zJBHl?{PJQu{#pj+Q;XbJq4rJBbBx8Tb(oc=!Qg_%p$oJ^2x*?{J??i^%NwS697i#T zpjHs)D5&Kt1_wTI(udzE8zC%EPPz1fb$E>ghG49We?})LU_E*Y3=*aKR6V19oFysK z3TuDC7?WkQEgvPl;_~@cH0gswu%v%8j@gF>m8eN(C%h+-+i-V|?r~txHXmSnf0*c_ zJA2YyG~i>2vTq0&eZvB+y6G7m81B&DYTh<%M{dT;#gQStZ8Gi2lDZ&2X_4!yPQ1iU zAmP^6fA-sv99N-?t6Q@jZw{qLlMi;0#+pts^jzcOemUGe@XPB9REv=f#z&E5XOoBQ_e{bbrIyFk#s(nLbyUd-YR`r;hc-Krc zy=HNI?XOhy#;Kw3I7Y>;y#P^>g%$7Sw+34M=1b}o$abV5)+5?5HuCXcG7*2`teO5O8uc)5#vgryK8}6`e-aK-?%up{ ze?9&fK#Flv(dJhX-*5D!f2%GSq$IAsw{s!r)W_F%*)Mo(tBZh%jdS$eJn;tw_64>l zqh_E_!`n7oFqzI%NFw#{4HS#(t%Bhb-Ca<4q4>i*@eDH2Zz!Sn!%AoV*FK*&0@MD8 zX%8^>wZ%s-uHKTYQZ;qs5AnFC8gZkHe{G+vXGeo^>nBs=UaBRT9c1Y-=1wL{PlGh5 z`zP{yY8PG19jt9%qwTeI^>(=0x!$AXAZc-n9krdJ-fcT=ZmU>IdU|{DTww=|EErj| z-ko~d+*C1MPQlA>+_nyPW*3+Zp>i#LT=`gidD6}bdY-mrtDgY@@`hsY7q)N5}u zA1RL(hRa>*z8h*ST3?^paqx_}f7#g$?a%j~T5sy?9swCQ(svMLHwIAlFi zb?&97-I>QGT#dQ};DCTT^$^1U1K?|Y19ZItbWH`i_V&6{k9o;@g_Z+Uf6Su&rF0}s zFqjh#lBI2R2M(SgeLylPtcRo?BAD=vTRcsULfW^`Hqh}D)CkE^SciM*F{IZisFhqq zx*qKP1_tr4`C$3I!gy$ZLMxzoygsw-;2HP24ssO=HItr$UUHOPbq_e3Q%^e&!}o-~ zF}6cMutsmIpVratR1HZzf9)2v?xjfX+IBJ0e5oQ4+PY-&k$xqD%6zc`)QqWNAf*U+ zu;0}?PE0gkEDxKt^fdqUW<_3lJIEKn=>Z(r2<+F>djWKR>S_4u4XlUKXF?yK{uQxx z0U3bPVD!QckjySfJVh>I3b7r7moqRBloJob2$3H0X|LEt4v^;Fe^cfI<)Z~H=`s1b z^L(`5$evKAd8e~`y(i5F8TZlgFg0{f3*@(GjOYS>Tc_|_yQnvxsK|lpj{+|phC167 zY{>=l(Td@i6G(@hl!v;+B=ga7wYhh7*o5m*2gwB-vsS>ue}`2CN3I5P5KhMq{0$3A zo5S80*2{CQ3+CKcf7s)G7#vEE)MH_7Bo)L>7resc>mVnP6bE4P0lSbM#x3=kUBFxy za0VU&PO*1j$N;cPjBp2OozN3?4LRjBa!MEF6v`+5F>Z7oy(hI}3^aR$GyU%akPb{ie^vy#A<4t8!2=Q!r6Ab}H3PYUbsItEodID2QqpYeD$f=&po3r?=0mG) zTiZRhjxjLdo9i?8;SgZmz{m$Bpc|P%<|-uUZejD*Pm%5|*AZ89i}P*IgT4tpI6^R! zQ#-sHA@e$9u2+ga124)ir=}D;R~YQ&VB*Tb{qlQC#3ORM<-k z%gO_CEahc|Vu4^N&0lH1NpiWpqFAn6$x2O`mtrWi3-$uRUTAO@l-up40Ou?#5e0xW zlobIYf0cejvhBYX?M?)}3CsXkTA5f{Xjqvq6gZ%BhLvT7i~#w9U|+dPz%-%E;Is=0 zd^sTes902FFE`{D7DC-lz_Bu%OD+>j3Js-Y0s0{6j!I57o z!z++Qz!3~)pbTV9o@o%ui&vGb0Za;u%V8)Ol+z%VI>lA1%F2P@Tz%XMMCa}9v5G&u4HHD)NXQ_?tL z5V*9YoGFtH1_M`=FHC`A1!biIGzG{OLnrc!OOS>!;|nK*D-bs!pppaNP(2KOxjnzo zP*5U5^EgcmMdf8Hfv&4=0$Nfw7!;CLf7(|+l#`vCsH%g7{G!uIyoqdLLwc2N#TKc8O4H7 zVxI^EDF(K@DNL!MGJg89=~I6x7Z@QRH#KdZ!IG4n!^Ks`adD=}Q>IRvJ|o_o|7by> zy$BMym{PH%WCBjh#qAuo>d;R=e*&bx1E27N9Jln~;Jm-e?+?KzgHq2BH)&dUI5!9A zX(&Xo%A|zVo?p%+4N?&Jv#9tnh9ipAXe=!W7UHP8O zl@ynXl^o?*tda8zwDK~cte~tUplnWhYG&%PIT=aG^X2F4)D-z?Zgy(w0tF&_VV?gv z!AIv|ym@gYsiu`n;S0`0Tm!00x9e=E9UzZVt3NH+!LNLCUg} z?0LC^5|BIQ<;+{SU~pnie>#^lFEe$aEr$yaHyB{vOkZgj7-CGAu`)ayN45mTAxhFx zp?u9uNJ8+bGhmWUiCc+6hR!xtKp7E~P(U{nK(t)3-8qRHhFpW=oi7Sypqh#c@=K`5 z1?3eBWCfiA?W{4Zu&<%YNhn(dGTaW8iKRjzOh4caE(rwgYA5Cwe>lp@oc36(AB8<}FBtp5JHSZuT!K3V(R*4f>z6y+OZ@ zSFGpWz$EyCKm3{meJhsgpwXQ4q6iCyqqfwlS$nD_utRiSXy>cCYO|K znFo@ypd`O|B_^_je+9W#ZVpIOCSkd3yVG7?0ZfL}qpV#%sLXtOd8xhR-b^qsK$&oh z$1gHWybq+)QUl5;gCSwO^S*E{lU9b}9SY0pX_6sXEH6j3Sdzb{OcZ7g0<%{-@Hz6^4=i7^f8etSKFi=kx%7tlCyxzd zU}fg|nfJzon-`{h9q@bu)POBhwhD}_6_j#RdiW=I22Oe<$8Vr8SuoRJwF}}Z;3*hf zR2NM4$$8oK{1QVZX5BoWicCdz_>D_BlMN!6ljQ@}VFrvf&K8CYm5cKh%*)A^r*FXX z4c+wTD8x(ie=Bm@Z!{aq3;p%8S6aU;`(_$)9KgoO7Mr24%+9O`*)lOqpE~hTm{({3 zP8xtmP_$sCO)RljKu1=Ac?MO>g~GW>GNhxhe4r3&HBe`zpfNz_VXdIx2DIA%;CPX? zspR;raFhQ%$4&kzH%z`c&;1$|SNy-=yUG8K z@h1NQ=S}`MtjDYh4y=lsHW$b*2LC?`u-i=dMnO1`Y6VN8^s$*Yq|UL!@B=V5HjtWH zT8I_gfay&bajv}-7ITP-kpGwyu*k`O%y8#;f6-u=m%@6GirRgpUo`?ql4V{p=Ull; zS)&wyjZs_(l^BvNY>|nGP83&7GGrhus|w^jE0Z)YBQ*u(u>uCg9%t3;Hr~~&kHNFR(Q3Lyc>Qg|4vBYi&JQ;~G z7u-nSDSv)w5Emq1&<`*W5adP#X!B19IpNdoW>63i5SCAtVdN%uIi5i`=;rs&&(Bj+ znk&$5bD)pH9O$D+&@+nbR?uf62_%Np7aMV;`qUQ#Sn#k5Dsq#H!d$cls5wwgVa^;V z?o2Fvy2{e6-#{UBTaU3jLDW3&IG-3w~@r~O0@j!pD|BE}y6_)6{yD6ti( zzV{XB+rLO(VdE34p=beN|CED~V%T(I=sZ_G#9tDh@0Kqj@P+0k0v#nBom=Yk6kK8p zD29EE{N>s8ukXO8|F@ceGkGWw5MT(z>lfJ+Fa+l7IuwHNHGU-oG8BUHKN9-?NcjIG zVZc8%_J2eWkpHwZ`adj3S6^{}Ar;S`pRHfDfc!VQ@`VOHfw~|CJ%J$yPk$+nJHFH` z-R48V62$-E77ltsalJAh3Ss=3Vt=tSe_c~SetsE6$Ng)fIWS2=_zU|o#C8Roefa`| zC4T+`1meC3U9W~h;@-YoL2*EbLXy5DTu{6(DfLUj2POEDGQK22P$JNOg#SGL5$1eh zUxYth&xS($zmoj7BL9_D@Yf6ke_a^CEV=8Isr|_*YHWmtX7G z8Tmg2pMLQ|f_{O(koteU_+P52e<6V()&F3K|Lf861xIT^1a$nfC;ak64$Jr&gF5~h z5+aAieoa`q2ZJH|zvdu-ukdKDH!Pn#uWlr*;QyD#`HKd*F(n5I8YDaz1qqw zKZE3dv*?h2?LPAR8bZ2}Lxlbl;$P)o+m7L1h=<7kWB~r3xI7=oK{@~N{pa=Hi)rx{ z0s!pe`%lA=W1qhCK~LXY*n^%>UBv%$;DcUKT$Mr|kc0mn3FO8Mj=rzR|9d}7e6a;} zgP+p=@6=oV8$@e`{ulDU_EW)sKzNo_nn#`?7$mzcfxT2%~O{0_lSFwM; z;(z(#2X*}0(_beU{mUXU1n}=bgmk+={^x!c(Eslo{lB+~NOhP<1%yZml&^bF(DOGp zM}J--S6hEC&`4Kve=jf?*B=o&;17LUUulWLJ@i4iAR{+A!9{!C@qD;TM2jW_c zOwlAeO7~H{IaeBI&u~?u%YZ4R>53J$XFJ1gnyK56z;IO5M1SVJc-;_jj#QgfuauxJ z@k~Ve57R;GQEmoeQtF1s&J#@b;jCv+7lKy9^-J%~w#)U`JITh&;6vw_a&N#6?T{Vv zZuRBlHuQpXh7FdWI$d3`&>Lm!?$HSS?1rDoj}1N;@OY(WP@#|k3JI)pW@g6*OnVE< zVh4*yMOO>uu{*QqaAzMZF7SzyRUExD(nrY~%(kPBAkQ5Da2{Bv@6eV}rBD@JbzeoL zkEeHvf;Eiy5sZghcs}WDrvb}=&%v?G_8K$!sQ&_C^h}jCY3W7Tp5Ve5vwNa2%2UMy3d)_Q zWC}YD+v^k*^vuBUY2U@gVBxnZiqPgn2|v2dHWk_D(|DOUeAL8eI{;8&KqhVQNSWs% zH;3XU3Lp!JoFDCp&)oammoMsfo4}?v`Ex-o)kW+Zy-l1!eHEzK6c7NF>`Vo~ zQ)Uw`9|fhJfSvc`o}dy0QBF)97cZ+*$==y&_RL}NjvD-VTY2F#x3PoT4j>+%%QVZ4 zwJ5wlU#(|R2Fq*#x{yNs_|++txK-4hnZ&c$2+N6*3{;2b_ zYkE0b&}eHIw?D7d^*)2asn)$0{`M><LV&RBYqzv%mp1CiD^(z8JPs|rAWUkkknf=!aU~-8 z12y)kY;MNFoBy41O(Xr%S-6h7;)>FyXt^V(P6lLf(v zliNHd#TmE8$Di;uGt+W^^TVv+maKydss9?$S2}LZN@+X12WH^2JXr&fnUa4M@e9nB z5AL7veG3^O&YH7VbqAM9N&qKO&@(R#dVJZ*6CKfAA0CG-ffuUW)(mI|@Q{%G#@s%1 z=-8op<8BYMG}m1x^w(Og(&zE~b{D6nV@l~LxraXo+d6(CPrSL~enqm;gr&XU@H4a+ zkMto&V&ejaftBLZN#B3>gP9DokXjZZN$b|8|G5h_Aut~z^bI}f2uIP4=?bB^x!5CA z!AV4-TnnjXxYS$9WgRaDFw2RBNhrZ51FyAGY!>Z#jb#3}^kmXs*%z;?u{VYDPY&^< z%1CKskE}z!gl>f(?AFLScI)}#CMM5Cq1wHnBr`R=ImlE(`v-S#MeYP%pOeH-4+65bUZ&S>bbZy?o+#LM*37T%hzhc56J{F8Th3P?Lkn<@KQQFKL@oxd{`cr3LQU0Z;O8^J%FCs$Aldk8l3Y zd_VyRq{MJpP{Zx~hd6o~E1oPf_x+JkT9-$NNgJ=)H(`mC40OXeg>ws{*$ad6aqVAc zS-+iEGLf8>X~qmx8k}&E#mu(PoU(m7t-y*E^g3i;_3P$>NODvsQ>|z!u3FGYup&fA z*s=<3iby5!0TFYTQ?q0pe`hvd2*Rc5&d>xp&eleNhs`W0X7yNS|M z>3HnYUH-T7+GuxrN-Lb@D`3m@14$M9@%ZGwtl8Repw*ucls!Wi-i&`)SOS}!5!*fI z3rEErhsci%egnT+W32AHG2IWom4m%x7X@+nJKb#rnq z+39#iuS;Y?elVH+F&nm~Z9f}e(Vs)!q(#1j$5z$7wHrHRo^%@b#mAcT=Lz~#R7M0I z$4*^-|J+kky8&G-BJq2Eal0@lr$09v&f&0Yy*itDxoFiaWsQa}Wq1%VkiC@WDlyy8 zcFJa^2_Tcn&pNnX5TDu>n%aiQ(!n*|Y~1G6eaP=3+m{FV!JfOXWnnE!P52H80iJ^ms1iKEWJND=p z%-<-RLqh>xmxJYxWG0ISYU_FivA9yv0mN*jihL0#v>T6B5xVu;JI* zG=R5R?*mkSe9i*FIzQq<>v5_L^4LBpb2dDiB$vizVMqbc1=Tx@^j?_PU24{|uQkD# z?C!^gisDwYSACls?OCQZFLs+o=h@GG%aXa=BBWi>{%Me?1)Goy)QLgHMluO-CT3MT=g#=+$BEY!nE;)i3GtC}mMJuPZ2bTu9QebJnAGRG0qZ-qj z^O&&C91N%f)r5(7RkX1X^VpDC$ts>rqVR<3F*Z&Ht?a-zEMY+($<68g2*VZwD@ZR=Kb7`OUaFE#>i_LKETXIFFEKD zL4e_x5ZLW=B#}pGME_0OPwrv1dR6)^e^@rPqYo>OZ?XBV#slxn${Ok6b0TO~Kw-sR zD7yRLKdiDip~lZdJYwB!#ynzj#Xhl?b zc9(=ScMBgXCjLMd6#%IOK*Sy~kX3{ZB8D*~7J>Pe%ebd@M5k4nEXb*F)jUqIvZ4R^uqP4B1xMC8rk`5`_u~+w|3u`=5N#G1 z6%vP^pEIEEsaKeXQ3H(0vHWmD13+3=gXv%Vb@xYITk)EM*Njt@(UmQXd*QFH>~kV!{$B_L8cM?n7j2Zt3t?$AWq`ckC}tIyEX1N3TL?F5Q!U1@V+ zPvjb6-KZfNrkKVJ>WX&BOXq z>jDvGX5kn(ws zcJJkG;%tm`9D9Wr>Rk+>%{EVwjRz6Z*Jnhwnk&0#Pk$iCV0g$(0%~4Vi*lzY4Vg^M z<7ea~es(p&&<$X@)nm=^_v;7uLG#t#iWbH-gs!$ElN^?jvu-qM^?USMf`}butD-+9 znoix5i<+VEY}!lx2AES(#CN52Q-Y+MT@gK%=}@(IWa-)>h@z7FUxP!@_n7KwPU$1R zbZNUvkNX07QJ@8=OIB@5Y!I=jSi-+!fg~_`r4E~JvRwi!M3oNjIv!%lS-T*;J{Yop z?|xVIGRn>OzhO7biA`H#?1WqGDxy4AHRpJ^oZ3>GG>I1be2Yc!oDby&C>}MWkwf&} z+=_&{05N-hpK5AGVcTf%S@jcV~Y7vpGwp7^?iVkGkvn!)r>qkKd4owwy85KK1$&&&)$v4 z4|B>MXn*sXx_|aH*01<+HntScAyrT7jH|5$y>lgCi9u!$J+ij!D3u_p-W2{4v5_4IfZGQ*2_#F9y}Y1>oye^%W@J<`P^Ysg+c zai9fh_;LT7@HW^3uV#5xN4o~M-J-kX`9>T3m{p2^ltK1EdrU9D#_5QIgS4{DQ~p$Dz(FB{H>$CeiK7k9_ZGG+pDexr!$roNi9GQ3+iq;7Gm9P>!X=%idPcJBgvlHL zbwvUa+hh4zn2EFv7J$OFS(ew7I0C5#MD+7DW6}w$0%@(~`zOpPlkq0B zE?;nftT|>fdv%B`jyUfY!9?O^Ukh7wTAN&4qbipHx0uaV(6W-IX12M_Q=EYz;@0T> z<5p9{z48I<1E4LGk?GN(srh^RBAOxKv~tM1a&$!^jzOb6$Z`#BP*0z3LM#FS>MY;v zS1#U821-slLz+L(z`XcJQ@?#(&C=tR>q9Ij;FdQXA&xO`^~hLvz~4J>+nx|2=LkQ=bX*1)1CYKM8ryH=(M+-Y)g|Y+a0t+m)D0po>7>1sH!P|QsUhs zolK-Rnleb6zxIex3+(B~j z3TE~pfqdehp}D$ z404Ed8|M~l?4+u< z71(=@0&}>UQr_)?CKTtnNNnS5)3qxZwN3puu_%$dCdSX-@cAC6upoIexsks;GZV?4 z4@~5jILbLg2?Wbp+F_QRP%Q4cj|WW`jJ#eGcqJCjklakW92#9m3-2ET3U5eQ5tx|h z4dC9+XEURB{($cnuYdnFA}G$@87^>N=X&(Kd8J4Ol_mT`Z2^1NONH7YnM%33{fK!< zaz`dt_+0SBHsdmT1?d7M9azD3s%qx}2XRF${(BTQL%6uuturoSds$U2T_m%?rVnv! z(f1DKb{FC{h-P&o*mgq^U_aDwj-@rL-8K3g;SB_Dlwj-u$Oj?+OnXicpti)` zeX$!^H(gwxZw%D2v1>quOvaqUR$WAqxvl|@ETjy=H9!#Yd^%6OPcZYZ3~k1atzC8; zW_e$<9A*vq`W%KI$wTgln7HP= z4lX+%GdSS25$yK?EY{B1&g>l^Zoh{NY$2p_HGfVHMd|LcHeyyJ^`$yC+0L*yWAODT z4yAFSzu7JiU_YCkP~182HDWrfjWZ%}X)Ht6m`quffQjtLUv8TX8Am)4lj9QDrV@1A zVJhL9+^1|f$yswYhsp?7XkJvV5ue!`nd>PI-20(2DZkeOo|6`o`TEtG4FX3_&NwmqzCXZRQ4#uapRcAh`@D zEKPh$4Eh{zDvF+wlF_`j{b~a<@O=z4@W}A;wP*qXfeI;w-)#kQmt-r$()mdSsJ~0*F4!8bdKW78Md$dJ*Uxp^>%QZB9N(#XHui z-U~sUOGOik;bCjjdEP~gjOg&$1&TJ0ptW+EMi26Ng>19Eg`%yj?-{Xorkd6L^cJD6 zW9qArv>-3c#KxUylXhQ^`y zW9^{h<;~ACTdfXILrUWx2&J)I@0!hQx;LPZ8I&%!1xJ}G%~6#8HEO+%b~tsL-N=o_ z7iAM8p+#4|lr}A}1Xq}DDiurlLBfqb-vp5X`cd*n`^MwqfeStOAf;K*`!s7>$SNNm zsdFD@VnKtBSU>-AVU)iXk}BkK8I(y6#j=k%{Sg+XUvv7CVk{r$U%EUz<~MN3_S> zaz?ux+mFFaQK`)m> z4Uy$ik!9F_v>o;ozJ8%788-}_lWf!2r{f9AmPU{W2)%F`5R}b`Ve8`6QKN_hC{ZB% zzKBb>nq=(MhM}h+H#-cT)WG%TH^?yIJUM#GX{>Us-Az}k`|1(p=jZG?@*GVMveJJJ zJMEwCLgnH@Dz*=ezoN6qfl469COAl<`H0A6JKBZz6l4Dve`OR^|C&1_N_RiX&Lp~_ zkM+S5*%KlCDVS{gMrPG#Mq@$-FkrTK8pge#-lojZk{tk3%+W~GSslQE#HF?@mCwlB zXoU9J+LLZc!eZ$&A^6;!hbiZ4I?tBNf=0JU(s> zbWB`;;W4@x_`!=O%;bT9kqIVi0ZB2MD;87@74D zYsUU<=i#@?+?vOqLZb*0fH6H$yh@c?^zoPw@BW0e?n|#ex*sTqurW0$i2(Jz=26-% zA8_QDWO)msvJZyTa%~Xaylp1q7e-yZ!jQNWTZ}7j5c?r_0rzE#b)YWs88sw^ z#m{>OiE<%@uxnCa6UZet1pe2^;q8uS_Lz9GNkWGC7hVW9k>O&e)TRTSYvdQw1_;3= zo;jpb3(3-Gi zIS7}Pzdm0mZy8xl0Ypn!zmokaJyj4mJaZL4pV^*pNb}DQTjPko()TSdo6j|gEt_4| z52dJu-%i5GDWDNuZ6T7JJ?|x@IE*qZF&FMYDQVK3EjKvAke9r{?&aN0=|Y!tn?_l1 zx}6imwnkqR-yOlw@|(T~HyuN-0fow?>K0a@DqqAnT_QMSM zU3|^nqmrFQ^4Esh!?)Ty(7Mz8-psQ!m9t!yonKxG;BvT^h!h1CHBDn(1!8GTA+XzS zcA-jUxV3=w2BZYS#T6TBk7kWS?2Ih?T105s6)wvbia-4`dC-&_R3XnWGpmekxGYc` z)2hYdEQ@k+F_0|%tPJw}U`|SDjgnj)1sb^Vzp{4Re37&%&6XUq|8$x{3FatV4+{Lu zX7@94e@^~&;pAQ$`i&B#!o33qHk!-Yt%eExh3XvuJnTm39z4~_?|rO|#w%euth()N zw&@I3Ymm&pC~46s%e-sG4^WH$joQ>^^JiO46yMQ)3^OxQtQkKSGu0CuJ#Jw>Q2%}v zhaneVHS`E9w9}SuXPe&dy*7J*9YY)|>(|dk;*2nup`t|uamwfLBx6N##{6#@xdcrT zky%6l@`$QTkT#kgN1F&lo@%wrqO9LZXhSgXzvCyI$x<@$&lFqx^(IBvadh$?Fl*&KO@a`e9k3P_h;Dp3H_(!2-!o&H1N#x(!hOBq4)QjGH#_1XQMw7^Ez(kWXLWSKh+)FJB z&EO}v7to2SfXNV%byVB_%ukEMXd@--Ov7Wj#gNW`XezJKGH4?e9KqhZHD^@Vq+ibf z2}-pMOfLe--Vs_uQlkwN+(0URSy9(3b+ud4%U6Bwl4S0T`I78C+zio_jf7E{(dCjW zGA9c2njy;8#T`kbbb?^oN7zo4rm*35uf&dO@#*OdX_ow)K3=-&wcFYPK$Av8 zbk|z38%SZuNh&`GgW{0rZxk`z`3ZXAxU@5s zkWuiJhWt<+*3_sO+fZrbmD65?kfP_ z%0D})Mtc_jL1KMi2qtf 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 diff --git a/stage2/Makefile b/stage2/Makefile index 97728305..80cf9a6a 100644 --- a/stage2/Makefile +++ b/stage2/Makefile @@ -2,9 +2,9 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -flto -Os -pipe -Wall -Wextra +CFLAGS = -Os -pipe -Wall -Wextra -INTERNAL_CFLAGS = \ +INTERNAL_CFLAGS = \ -std=gnu11 \ -fplan9-extensions \ -ffreestanding \ @@ -22,13 +22,14 @@ INTERNAL_CFLAGS = \ -I. \ -I.. -LDFLAGS = -flto -Os +LDFLAGS = -Os INTERNAL_LDFLAGS = \ -lgcc \ -static-libgcc \ -nostdlib \ -no-pie \ + -z max-page-size=0x1000 \ -static \ -Tlinker.ld diff --git a/stage2/drivers/disk.c b/stage2/drivers/disk.c index a81bd41b..bc888e03 100644 --- a/stage2/drivers/disk.c +++ b/stage2/drivers/disk.c @@ -17,35 +17,44 @@ static uint8_t *cache = NULL; static uint64_t cached_block = CACHE_INVALID; -static struct { +struct dap { uint16_t size; uint16_t count; uint16_t offset; uint16_t segment; uint64_t lba; -} dap = { 16, BLOCK_SIZE_IN_SECTORS, 0, 0, 0 }; +}; + +static struct dap *dap = NULL; static int cache_block(int drive, uint64_t block) { if (block == cached_block) return 0; + if (!dap) { + dap = conv_mem_alloc(sizeof(struct dap)); + dap->size = 16; + dap->count = BLOCK_SIZE_IN_SECTORS; + } + if (!cache) cache = conv_mem_alloc_aligned(BLOCK_SIZE, 16); - dap.segment = rm_seg(cache); - dap.offset = rm_off(cache); - dap.lba = block * BLOCK_SIZE_IN_SECTORS; + dap->segment = rm_seg(cache); + dap->offset = rm_off(cache); + dap->lba = block * BLOCK_SIZE_IN_SECTORS; struct rm_regs r = {0}; r.eax = 0x4200; r.edx = drive; - r.esi = (uint32_t)&dap; + r.esi = (uint32_t)rm_off(dap); + r.ds = rm_seg(dap); rm_int(0x13, &r, &r); if (r.eflags & EFLAGS_CF) { int ah = (r.eax >> 8) & 0xff; - panic("Disk error %x. Drive %x, LBA %x.\n", ah, drive, dap.lba); + panic("Disk error %x. Drive %x, LBA %x.\n", ah, drive, dap->lba); cached_block = CACHE_INVALID; return ah; } diff --git a/stage2/linker.ld b/stage2/linker.ld index 3f0d47c1..8551fe38 100644 --- a/stage2/linker.ld +++ b/stage2/linker.ld @@ -3,7 +3,7 @@ ENTRY(_start) SECTIONS { - . = 0x4000; + . = 0x8000; .text : { KEEP(*(.entry*)) @@ -25,4 +25,8 @@ SECTIONS *(.bss*) bss_end = .; } + + /DISCARD/ : { + *(*) + } } diff --git a/stage2/mm/pmm.c b/stage2/mm/pmm.c index 652bc7d0..3d56a17d 100644 --- a/stage2/mm/pmm.c +++ b/stage2/mm/pmm.c @@ -280,7 +280,7 @@ void *conv_mem_alloc_aligned(size_t count, size_t alignment) { uint16_t limit; uint32_t ptr; } __attribute__((packed)) gdtr; - asm volatile ("sgdt %0" :: "m"(gdtr)); + asm volatile ("sgdt %0" :: "m"(gdtr) : "memory"); bump_allocator_limit = gdtr.ptr; } diff --git a/test/limine.cfg b/test/limine.cfg index 3617dc05..21b61ebc 100644 --- a/test/limine.cfg +++ b/test/limine.cfg @@ -1,6 +1,6 @@ TIMEOUT=3 -THEME_BLACK=33000000 +THEME_BLACK=50000000 THEME_RED=aa0000 THEME_GREEN=00aaff THEME_BROWN=aa5500 @@ -9,7 +9,7 @@ THEME_MAGENTA=aa00aa THEME_CYAN=9076DE THEME_GREY=aaaaaa THEME_WHITE=ffffff -THEME_MARGIN=16 +THEME_MARGIN=64 BACKGROUND_PARTITION=0 BACKGROUND_PATH=bg.bmp