From 8df0c7fcf0eb6bb92f05c7551d2ba8d1fd440196 Mon Sep 17 00:00:00 2001 From: bzt Date: Tue, 23 Feb 2021 16:01:36 +0100 Subject: [PATCH] Fixed issue #40 --- aarch64-rpi/bootboot.c | 2 +- dist/bootboot.bin | Bin 13312 -> 13312 bytes dist/bootboot.efi | Bin 103073 -> 103073 bytes dist/bootboot.img | Bin 34912 -> 34888 bytes dist/bootboot.rom | Bin 103424 -> 103424 bytes mkbootimg/data.c | 6 ++--- mkbootimg/data.h | 2 +- x86_64-bios/bootboot.asm | 47 +++++++++++---------------------------- x86_64-cb/bootboot.c | 16 ++++++------- x86_64-cb/smp.S | 1 - x86_64-efi/bootboot.c | 27 +++++++++++----------- 11 files changed, 39 insertions(+), 62 deletions(-) diff --git a/aarch64-rpi/bootboot.c b/aarch64-rpi/bootboot.c index 3824c80..bb29e22 100644 --- a/aarch64-rpi/bootboot.c +++ b/aarch64-rpi/bootboot.c @@ -1636,6 +1636,7 @@ gzerr: puts("BOOTBOOT-PANIC: Unable to uncompress\n"); #endif /* we have fixed number of cores, nothing to detect */ DBG(" * SMP numcores 4\n"); + bootboot->numcores = 4; /* generate memory map to bootboot struct */ DBG(" * Memory Map\n"); @@ -1855,7 +1856,6 @@ void bootboot_startcore() { // spinlock until BSP finishes do { asm volatile ("dsb sy"); } while(!bsp_done); - __sync_fetch_and_add(&bootboot->numcores, 1); // enable paging reg=(0xFF << 0) | // Attr=0: normal, IWBWA, OWBWA, NTR diff --git a/dist/bootboot.bin b/dist/bootboot.bin index cb987a7f54b57cc747895c6a979244c073a80caa..cefa53ce5c7a85f3f58ddd1510ee06a475ce1a3d 100644 GIT binary patch delta 2420 zcmZuxeQZ#8^;9p+gE<9oD_rO=Jpdq?KwZ6`Gm~DA#euM<@w|EN|z=18G~| zAMf4!JLmk)@1A?!32qK2T&un zv>%Doaxv$T&zth~d<-v_kUP1A8}bh1`L?P$mT)JsNg1v%o^jEeO5e?mH#dE|$t%qw zUMzBbE^-4O!*ygQclu2o&^?JEtced;{j)T2f5CG%2dqNOzPM$%5G~-n(rYeyTj5Ka z9hWbf=3Y2BV3AciKIGBy^LJmG@JcN_{Z!!-9C4v{Q4k@a$Amzr@IlZ6N&_>5C^{VU zn7YFXFD|(2N{wN`aam|I6a)h*$=sOw7JDTx8K1F`8+DR;<k}2K*$mAyk^AKcCuHs*kK0!4-N;Lt?)(uhbea+Li9AOy179@S-BBLrnHRhZq@TrTl$D9bsws(_bN4bZsmy0-nWUB0v|VhQ7owcws#v4~c>D%dvY?C;7FU)- zV~A}Ag_4mbQi_&dgm5MoLK;M0ej>~JE+J@|P+YSta94;h8X?*b?h(e65l5@QFH8<( z*Sn^(`_+QjYEBH9;A4aQPqQnOOyYlHk`oX!)gyyi(NaL}XSd;e(x{(RHJu_{#Bz+^ zNZin7qJB)>5U}ni`0J{#c2xT31e^28Cc|tJ(fe@zQNwJ{D~$-H{_seaGyE?-%PV{j z*V@Pb&sEJ0@Z`6K3T}ue7Yqw*T1I$l98^xw;(#wAcMLVgtJ?QE!JgzTdl&Y&9<6KIX~$#*_MCI8Q5`4FaQgoMf%37{5w(m=@tY z(qn4+Z=Tx!;dzzhRp$}(Ls#yV<}C$5|>Tt&XhS(Wp9W{i9X#%18)m8`^_ z`#N{AkwkJI>Dlk+Qs%+icwi$rmA6`@1A#Ik*j%b*%d|SFG?O2gTRa)Vw&I`%1#)3- zbhKjO13^|YJe151B{jmbz?Y%sayNqJ)(N3zX2IJ_p+R*)a>iW8!RNZU+2MB4yiv*I zrutF%v8j5LmXAWaMVNnLNY@)=aq6lz4Rwz)#Xlm;EXCYsjpQxMw!C3ybCBDvhy}Su zRqpA)xyT)7_gzaNX5`uV2Q7?*GyeK*4pe2d824`=@8|DZ#YPSaEQz6|*(iJvDG=(J z4+w3)C(AK)>oX8DaNYNTtpKKuf!%RcSO}TO=LI{kM1DAPY1WRrviuZ%XJ!R9llaUR zH1Zu;hC-N$$<}5#51Uj2jHQWtQ%Wm&!#1zvv;(2xrO+rE^a4~MWm2H& zqViJ`v(4g;tS5uEvYgjvB6Jv@b7l2&w$9a6HV|!LeOuQED-aCKwvo)he160yNCi!B zf`$>gY9w_V)UKhwnsy7gsC~rOTj@?J5xt#u7Y4Gt(s38f8X@}&YZpFAOO`NP<*I|mlao98_;}?%YD+G?iEEFFc!#%#q||t@QeO*E~L5_insJ+v3ethZ2`=?CX{?p z)C;7&#PUiGtQ8H+RnfqV>CiJk)H9$jJQ_;+dNhn;W9ljGU?}O#U@tO^Ife%r@sQf(Zf5Ui?XnnXQUNq$jcUSQjoL{NqZgOxHA zH$k?-x-g&`*V;9U5Vv+mx2g&iqOJ}X^>HxqrCt$uSYLT(&T)72p8 zxwxAPD5-r~0J9)4jKQ(fg~4XF$9_F5y4RJh$9Q#j&+HmJ|9B0khH>{E`UqC^90Uo` z=b@ke5@D_MXV}BB4?TS5W+4R?e^;m3bn<-D{awXbj*B&r6O|*{82lA5OVWMhcU4Vz Z5&5Eu$HDHb>YppSch()8L5AkP_HU0xbngHF delta 2460 zcmZuxYj9J?72dt_mE?yk`5|EoKV(}5+W|WQn=2Vv#gy1}XnCaJQqn;bI=ut}gks4U z!hl=_YWX(QWLxqhw1aR%D32r^1GW3OmI{%}WIRLY6p|q`r~`zRl?JdAo-Vg%EnudP z`{V5Hd3^hwbI+c@%Ym15%Z^$TAED8Gx*a8(1%!gH<>L;MyxBB}(hwSZ=Mn#7&>FG% z{JwB4S0L>BxN*uxVE`{wkUO@3i;E+9-Ywdm1>B(xq#Rcovt0BV@4fbeYpXwBEh;;S zh-I$QMXuugcpur$9a*~`;2sVjtdERXd`0?*ui)8hBNl1EHotkH)VEy_m9tKIL*q^6 zJI?*VH2vhB5wogYF9bd7g;_g>ABakyK>w=oN{)y$G%tXVG-yIVR5}*$08@XO)Q5Tl zp3VIsjfe}Dx)OJ=7RdE;6Q-w4yKx;MJ96i4dq>f3PxCDGH=pXWJzT57p~SmWs>! zYQRK?RaNb=Y!tdJn}nG5RRP7cTLcug3w`T_9?&&fHV8ZH2Wteo2CAo3)-)!*d?ZC{ zYXmN+wF{bPtzF<)3_dwuQpy4H-bh}1;lWM9qlo*bJGl=6hhPi90ne*~e&=DU~!-N-vBhu4q=#$8m%;~$BGRAKMIZ0`;C25meX9OwdxF8oxpuT$*^DHRkgyqF{ zXbibETf;NZXhPFGgb+^Mg^(W6r4LoLYZyV(1S9%3|4k{(V5B}f$S^}nk)ze%7b3f} z>YbCf`*f1rk{^wmV6npePj1)njN;>%*aL`pG^hew*}R?H&T7Tmh|5q^J$Xf_nB8&r zYV>M)D(bt`4FTW(9==ljX=jyhTA*ngS)E-$!Uiwi_GWg4=d=r<#BcAZY6^eJ(|e`= zgSF!R|6Sp2Z+O1QGzO< z*q0^QDy3ic&6FG1zmg3$kofk{@5mP8Y_7yf-Zj2scpma;p%p-|Z;?P&m`bohI!*I% zI~g=J{wGfDf8i)3C&!!{XM7HSt*Ug<9oA7^CvoN+#4`Cb=Y^by%ozR(jBVf{DxJig z`$Mj%k%V*a8QAl4^6emvyMIp(=PlFvV2?1t`DN*Bo7Bbl4)RQXvnOR}F9~>%KUae8 zYQfSmN#&V77|ROA^irGuQn1PH1^{1%6l`J^ytND()F+Um`E?vDm-Cw(zjo5RF~#Jj zhB0{9R5wQLW6*A4<{yn`3K!8_0#0tDP6^Eq(NwK z7M$q@(p->_mou3@|CXu_e#Rq2PU)xB!vkiJ_33Dmu7CD;D5 zP;Xy`sQkQsd+ei=O`lsfR&>#(8>EnLi#W?rsLchCEkCt zXcfjElEo$Um8TN$3eHW3t8N7&&4Zcj=Y*MV1a#u^VC>tn;X{&BYJM>X_L>Ifs%c=x zWbmm%HZaAR&{#0$9n>=j{1oH4!GZ>_O0>{E5#93OJ`Q!+o zWKC%eUQOO8tr5Fe@Q)mD3@O=IHV+Sz_sXpG!?g&xv0q1*0ikCjZqCnB z+av*IL14H8X(y)!n%Eip46x~+C|il~$^MrrX5v|QW&&%Nj0cbf9OwxMlKQ>@?e*s{ z>#RS*8Pe{45sWD}9~rd&UH2X6+{Bf5|1T?#b6mk3^3AF*G78{rz}QKi=_StUMtqR8 SR|`1af2?{V-*2hwPWv}p1&xFN diff --git a/dist/bootboot.efi b/dist/bootboot.efi index b536b240eda5a3dc32db736ea0861547f0d2bafd..86254fbd92be8d7d0193bd9d7f12a47d9bd8728b 100755 GIT binary patch delta 19028 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 Y{j1oYthD0K)oex(vs6qiWFwmWf4L@fGXMYp delta 18857 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 delta 4321 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 diff --git a/dist/bootboot.rom b/dist/bootboot.rom index 1bd29d01d350ffa6b5e3963525863295dcdd2a77..f5811ab31bc6d9f0a774e9c06d458087f057c90a 100644 GIT binary patch delta 18836 zcma)j30zcF8}~f}C@6Yy0YODa92HjvbxKkU1oTpaPKx^m3J5NU25PAdHlR-9*w`s= ziyBs%Ehgt8S~lPRxyuN?@Av(_`}@JY=ULBrw)32Op>$V^ z(p@b)X7=Nz_^$$9T4LZLdxKR}y~oxYf{*SMgxRyaA688aw1f^k*iI0t#h7Z*SeMsE z2oPiHBzMpQkxY;nVnuu(Rx9)wXsM42H$C`IQch>>K`l$C0gO zT^5AoOsl)sL_Q!qGJH#WCV1z~5(IJoYW$=zt2_D^J~g~=kB5LsuK6}Hxuz~M{sd5l zn(x9S=WjK2!SN@cX%>Gzyf?d(zaQRI zjlL=}!Rl_a_$vXop!|;o%ri0jbGlikRrQIymt}2iOOr1%c?3Y6CnRU8$>!}ljYw9R ziVlYn*lm%B%DKuUdD{Zz_*)d$P6`wRm&%8go%n)OBvyYU2Oj}Ej2*2S*)5N;FZqt{-6P&=$AtJZdCrc~QL%ffAjF@->|f+xb{{FWc*8%L zSa0i0-p82MdYb|}9$)Rf!Iv9jgX{N$rP}*Gf6+KR|wrS^?g#C}11yjt8} zoz9MXf8l982DaJ{aJra!)B6Tr)g#N0Ii8>I(Jy2Gh=0*L&JdfyTlJ~xn7fDYWU`m? zREg~t@=y9C8e*(GEcU*ZK8W+S%H#R5OYWNTDoOBp$K4Cc@@ldCyb=(@{xhYh;^vMc-d1?0T8-e|w)wR|FPEA8w(pZnJ{8 z;4M`VV)+Tctxjl4d>AP2$v+fL<*(?P*L?`i#7C4=b`=Y>~Tp_#TrXjS_hRp zSGqDIu4IekUOCq4{N3uj?EQ%6^p6cW^b!fV;N8NX=--EV_}l$Q8R8|*1`J{UaLa)1 z>}x)8z$nc4$pMquKHfOsx$c*-u6td@e-a;z>uo!l#;g7m(jCW{x0df4*qOb-KOERO z`Y>i2U!DH8&|47TMBsjB}lO_{7%)*5t&TdH>WRzvR9k!u0h zksqqabj6e5d&bX5ky+OIRE?48DKZU(X9dL&rR^dl{4o!tqfd2)OVDK*vk2q{vj~m#NOP z2<{Zp?@9`GC574$Kgam)!3C_CcN)^4jpQjqV%RG@Z^(3mcqczPq)&%QcN2B0DNJ(w zVvIk9^#7XQ9P$|ZgnNdLYI|fmy!zBskhm?O&+)pU{n#K3kSLrs9*r$D{^0D)H5cXUf!2%zLL z!yN5Z_?y_=B-g!|SYoMy>!6~qOiH@D$yqkUe z*vJ^RllL6i-#)AbO{mONOKUl}@ou5wRKe2W1UaWb#JoAhZ+HDtA_$BFn%(U-EqS1W zqbotY3Z%#Mv74vnoM}gpMg_7l;g+0h3S{xez25xvH>2dv{bn$PB9EnH z>}4neYr9bUGVsNEfZeZ~szD>UY+0yFX304bjYgW_oj(~sXP`-PTw~(K4RDHtuB4i8 zyt{AC_zuW#$Mt-%Oj4e1+%J~>i`AsX`;yA8isir4%G}ZSQVu#sm<$pEDY!TU^3imm zoFG(tz-I`=BHD>j+YTEr2c=QzhDo8d>cqPy8IyJbjJW(2hL>E!q;j8F#sPXq2*avE zhA7B0KpsX0P;5$1D1_dTD(V1Vl@!Aw`LjuP+0k197ji`E`=#W#5h$+Pg%%VnV>Z(* zvDJ2EKKEzPDB4O2-NmLN$^DiZ2e4%k1i&8@p17q1)7?8Bxh}afL0NuAEIX#4%1j7d z<&qqC31Znrs5V>S_OSSBXq@~w%5G0=6{*Ck5=)M1M)5?9(r|<5c!h6F?qx40$DwH` zyV+4!}I3rkcr3v%l%<7Km&fl!g>*OGc+9b*KxalBI8r#*r3=W{V zD=aRoOqpet0tF2TqV=lV7R4kH(j~bAZHlvLwI>0vx=Vc`2}{G{28AxY#vAIh#Y&E2 zMu=SzO={N@ud3*bSROkKnzW_BqCdeR(z_ufUl2;Y(|$miUUQ6co%gVG%y$R1L(M{P zV*k7V3o9{Lf8rmq27F*8v1E|)5B>!sCL&=XO4ib@d&cT6GgU&c&yz$3Q)eZvzX_1! z+MqW0<)_55V!k?MNRkI&GN$55ES&BXGGq#z6@J|WwDX4Ktf3Xcf+X4MPQl)BL&;s< zm=ZILm;%M}&)b4elR*h0xl)ijwmNCejSD`XAg=weJpuK@LeK;Jp48s#NxmetUz>x9 zPBp3y@?EJz>^bTbEQ^qOivD0_E$+lJ?6kpMuTe~g}s2gM`d`E7~mkprWJu(fi+s)uc}oTft%s{?GV|?_qu64 zuS@IQ{$(@^R@jFKGf3)FJaTljnTB*xz*XShJmAFj4HS@$w@jtLA%DN-xuXZ!GY~J5 zV>res%9ENWG!y5~q!6UKeloPrL!L##!+$494lWAhTDm)qq0cEct&nPd4p0(BEPDt# ztpRKUMq$Upl5=;yh}2UBmSq-MA5kcaQ=)pWFka)z#Aqcdnr3PfEs%gd zP+> zMz}+-dqv3Yt0f2OLqoYuia?(s^`{l0(qP$SuypsMM#@KLYs#`+fbdyUJMrz3$sVGt zc|tIi)5MX_VD?X?kv9_`u7eDBPzSm>R$*sNKS75ABoX}d#uN zEo%dHDkVz9H~*p9g2IsQYN3Rpn8`t# z{mF`F^kh`ilHZ}ci`Q<6`W(+H zXNJnDJM48Amh1!!S^GN`JG@_@dAthy(sqd>rsNV*T}eaJDCnOcuwz9mLiZ6oo=6HT z#fns6NKGUV+531>a0@BM9rT*YExA|VO-!K48v{KM`V4^)vl4&yo*wq!VrgV4+CaC& zH&I?Ol`SdCCjeKdu&jkhl|1o&myz5@Abf#*n2lg!~u70b;N# z98xomIF;kvHzZJ1ff+7)M3+Cs>dH@28U>t*z58eZ6z+9YV{!Py8yzb9VGKh=Vf-1I zl`CnA&lV{jc*|raxI5@UlI}Rh-?=xc<0FIM;`M1^0FMJ$Jn*tCy=4jL*-MRfq`yoTziq5d7HXzB>mQ4JNYp)RVZaG-W+ zD0_s4JE`I#fOBiOZW?MgQ0g{}GTIeDETj|YazRH6cduxxIRCTW%Cg6*VDW&|*1f4B z2wA-5MpA2W?K=pkcwe4#McdN1Oe9+n%UjypQZ&Tlq-2RE>$}6RI&q>9_is_mAnxB_ zqBXdYohMl2LyW3u6xJYL*iW*P}7PR%$ZgL8u^jfMnI#e>(EMEu9-wDiYM zY7(zs@+ThLK?}dK1BWG`^aUIjS^@MJUeie~^3ypySzYs!B=>qD7=0wF7;1X8AVr<(I_ro|H-_0!>&c>dn9vpe;j&nE^hCiJ^+5 z3Bw7Q=NtvqYTrZKjJh5F5{&(V+K*Ulz)H)5bJno=O2qk_tMLn=l}5WDM`+KK+Q+W*JBb7gmHeO4-`P14*s$x~+vW14XukM$PI@>gAiHH*4bhJy)oJjZ|vk zb9jc;8@_-fcc^6*1VbXp;fdoS`~B9F>LHzzKS$pVUp9_Zi>})f5C&3b7*$|$1-Fm0 zbWyvFCVjHwnz-yk760+Lp>$rvN}AvkeQ?RL(<+70*0=C~P;>{y2MPtP5*Mk2{w#Vg z>$x_LszOl4hct2O-fMmiU-KP_m7JfT3!|r!4h@<54k)d;{x3kwQ?RBizR%Xn{$DEH zq3DXQja>Hn|4>?_DqXB74Le6llY+^}#gl2Pv)ud~Aa~;04{)og3zb|*?P5cK6wneo zfH&?dvbNtiz3N&t||3ENy5mPJ@5`v_gxABw-Qaf$U+Q~A za(6r{IeOeB6mNxyuc58U3E{+NK3{!4UN`4?_>A$9_Q?9XF4F*%4|tkUK0=iJL8%_s z+?FMeHp9;+d}}}6)moyXz{1}E-Tb@%xCN)l52J3a`j9Lao{M@2(6)`Z(QD+n-c%Hg z`0DzjzXGqFz|^ys)jh+MlRSYkl+Gb_Fq+RcOme-Yys)sMGdf6CR~pK|chlX0HR%a8 zqT^|_!5K7@O?aTTGK|lf5ZQSFM#-)~lUw@BaXnC6I|^gRwU%O80{2Yl&Z2nbgwE_T z|6oFIaq}9?x0MmHsfFnNSY|)GLg}B`th6Aa&{;rxkaZ>+zrys@;* zb;B65NV=~968#$MU*hK`-PskU62$c_>BOZRaBdZDT@l^KT2?V1G?bD8m6ailBiiHxo1i*yBFG$Yp#W6%&orl(m`CGMwZi# zB1#GjB>=<^gS$u!_06OTf=rqRsSsl0P%e7T*Piic#iP<~;Mt~uA)W6@i0{^*ytyqS_~xno>|<6VY_!fx5>tN{ z-}U7o>(@tN~f{B943!&T}{`Uq?JmYPJj<$KJ9I@9_;FhT0hDnUXOb_T+hUdK}Sh7q6AqtW~C zVOHltQxfuvURn-7JBvuyTQiqkJ@$KV(rY?*(0=M~l{pb%U!8$oIrW(YXqymbgeF>atRrD-9tgCHaOrBv zm5l0sU!)Qlr8v=JIwisQq*993s}sF2I&4iiDXx12sQRV&MIWTnooABY#02na=DW~z zb|f)<%?$>IRB;r(Nu<(;iH7$;q@dT_P-MM9&Lf`sfr=E6D=SF&fG5oAY45140KTA& z#;nwJII(XzRNcA{sY!vI|pd5&@gfM5cU;k4bSejB)xT_t!iUX)aS3e_~Z zbTykGmQVg$c{HSoG}i!= ze$EhDxgonNaEbvB!_wzb^_c{jmtktU1L8WOcPae~N@_whg<2J}Stgg7O?ITCruV zuaaxT@<*WWiYNZ6@}|E~rEnqg6MkPd*|B0M(r$y2=f#O=;^?RZXQktOhKi-8rQX-l z+irKz0Fr>0-fEXkZ#<--83{GZPq~stNcgHOv6==MbjMLj=~H6xae-lS$U?G&(R*nx zJV$P)w?g%^{=}Z|tjDn~9CEELlgX8g_v-fzpzk5BC4ra@iZ^Y3bV=-VL&wtVK?r4+ z{hq*dX9f=X_dwyeV{!1n z3t^P*-)VQ%4ybf;t^W^g&~8g0@!?wxF_#=sFozUO_>J8}5PfkEUzv4p>&Qc1s;BN~ z_X++<*1h5Sa%;SiIMRmFJ|8`R$7e?va!>H|>}0%cc4fyKo@4x-YB3ti))4n<=`u{Lwv-XzA2IM)vDH}=5D+ts#-_ z=&0k0!BTw1_v1U!N)ROxAj1KSOfkt?zBa~vz&QO#0zJ8?M(ux$qu&`tOalR*~XT)eM>5%Q{Eq(Q; z0O3X1oo~&komjrM$&Bhd`}p3Rn8`nrHQbg}OHoy(9)Ql<{fwv`1~AR)pqFHat%mGd?`Cn(`95a?{s@X{5& zJuljDV<)Y%tVUap(Mp*i;_8 zz-~D88h0+pWDBa!FSy&l`txpuiH1uJ{KA5mDtloyGyJxPCl?Jed{NJr6m>G}+QT0y zn!^J5rJ}JRz3R!5ZT4*DsY`lA%-cgp8VU7i1wNu@;@hY@2*GGy(qnAa1r(rRLdiSCv z)=PVsj_oG4Hs8=KA-I^ngbbTL^C$|J#i^hYUw?wzmi7<+=qH76K6fk~W^n&h_4d*m z%&_SPeyDhl;rjQypyVhU$_FkRYxvFpK&8`Q<~pJfadT@?$hQcbl$Nzby|nuoV9911|*c zgiWxVK2KvVmptkJea$0A z@#YmQm0#LCg)QKt<-6{!JPZPH%qL#?D>MoR+Emcko%j@P@mKSlmW@Y9K;jYtI}_*N zM*Xmw`R?#yjIpcG$D=l*`3LfSA^#jALd&H?yw{VaPA3kcKmA2IQB9qC{Txb8XX4>Q zRasBIX<)s0*JmmXWrh6oGYR<1px`ZW_*p&e_fydWrrCCGOdfp0jkf8}w9|3u@{x5f(oom=B?3BTvo_zN0u)5nqS@J|S^ zQ3tpu1w!+mi}lQUEFa5Dn|Hc7@#_A zq??#l3qdy*@^_!@8%YYL&xFKBu?hMOXPNp~Mc2V2=F>zkz%J929dcrS@Fg$MfoT9X zY!$l;6DLT{D?qJX$j4T6K~&GL=xq43fUm9SF7{LuhgTDq+mgaxuNX1-Qw$WH>u?6Y zrSrZ5l1y$`Oz{2p2Ei5N!FLw$nC&AwU(46=5h}hT@Hkgna`}VX2X@})M}LgZSzwO@ z8n5y#-FVIR#ZjlR7>G^>F5Ph{2rsdV`(sb3na|Uoiy!nPu;Tt&{8b2OuGjl~)0ICE zu?$wYW+u-_o|!zWz77ZooXmGU7lS{5{opwhyPG#Y*M%kX(C1?Yn?Y=KjSd4z93CBY zc8Z6fE_f!R!^ma`5D$!PAs$dd^KPE?e3xEh2=8t)RJnyKBQf=4=|h3!F{=W#Oym{M z4>bHapMU&(Ps5pf{>SqYTgVe%h+(-r>xE8+XY%<2FZ3{cUBI`zF!_WbS_BO+c=`0GvhWJuh}nG=yCckl%-MlCd9ky_HU z#v@$Ney-|2t9vd*qexH+Q+)aNp2pz^umdIVJpMZN<5s}o?M3J5paA?z4$TwmsNVrX zCC?F*9aZGHeBStCmv)J-kvyfth{Y^+F0bmktFOWEObH+Ja&NZ0s_^9-21DJeeE#mu zhEL~k!=6MIUzN1ybB4E+k(GlDo3psJa+KllOWaernhob|_q}A;w2L3wx8C4;k*B=2 zG_(u4Ds>OGn0d`>S*%l4Ox0tCs-gSy0$PmDonst4q^jaj<`8@EN}tbTZ~jxM!5Sa* z`HFzEY54qye7>;%kDuG+{XfQbUs4n0=GDz7qB9Er7r2i1-&g%_em@?%R%o)4aIaoH z4y)5vYX)=JZ32q4apP@PD#ADz!cM{(O@(`^k}tPpQK66dd|Nj8d~f0BL;QS=pI`9v zPgVA>ErY^;+3fQb<7WeYUd7Lc`1z-5^&fw=Z0|Wh`=lV$VmGGCc(7{iKZSukDyC~= zWC>kah%<+3MYRAe=FKKxYr$5Yd%&M!i>RFHuhT{@l)%qBR zAG#{^aiBV`yr|w8j>L48YIp-v$3mTY575Td=+fv4(B#t}LMmfbzFjEN0h$7vKGqbN z^>GW8F-#w~R>xWRFiuxMsCxI{3oTs%ZPa_kSL!_=QoUDxsf|PEZpR9AKwFIfAL-}{ zXs_Nq`WU%Qmu`VTZG|??B7xcpi!}N`&4PYx_JP z6pM(`<7CBc_)0lCg^h{QL+0FV=xTX&3g)0k%(dIlmGW+&JL>@xIkUNPp-w)Z0_A$Z z47&|qA-72ddy(e;DYv0*7vzztETXd>E-P-shh2~hfsfL|<;mOd9(gOoN9oaW@HTX% z{1Kt`SULA!=$nMrL*?3kp$Dd6?s}v|&T78&qA%oGX_&hnDZ_5V+rE%D0x$oQ%7WWX zxee)&--c{fdf>A(Cbwc9d65mO^pattmzTKwadNOK`}I9cwvJ~;7A7wm&$_cp**%_( zi&_B6_V^3Eu!(9+9o6FXXZg?Z>`sIEv^;168*M<4EStavu||2v1a^1GS&hpmUzz|5 z6uqi4GgYl{7qXIsdgSO#OsnybiXN!mgr||jgtncN$7ZrYhNQFdLzyhXAncVlXF{2I zyL=wwdps|z3}-a4_|&8DH9nxihxSqL9W;4aXVq~(^(LIhK~q`VE_vicOdeL6$l?sP z59MtWS?`cCZ4oy4qlv7Oq3A97N202g!zZyg+|ni?>>E$0!tiNcx%wjCNoJkAV-gI} zsL804FHM3B^C`K-WHu{Y3?uobpxWEFD8WEiCG0~MXC-h@pkG9=V^LVgJBhNREs zJ-D-K`J2hgRN73ztwK(m0%Ip#Qn?y5=JD_{F_+4VKxHuRmA6fylz3moYrBQ8K_e4B zmrnz42>V?AaSEpDc~PZ%NE3HWn@gQMa4M!+iZ9Z19anEcxbC};1u zl%7;&OPXr@r=KSKvl(o8a_y%oyqku8T|uD9Pi*sms;gQ?SLc|z9mPgJavR_oPm6{Z;X|>6VX0cA~D&AM&y)`tGpO}RT zVXKu-gWDkdB>y-I@sy=WnWB-c(_D>snhhz{x4C+++y-GLFPzPS5$+|kSs%j?gS>4v z>(*0fUhpv1P;EDli7!U1hIN&DsV;E!4bx^_s% z>Kv6(QzI}rItMmR`avF3*lCoq8&oRo$;D;0+BvMqZT5#vy0k&SiaAOZkUf=+63FZjnb@&g=46 zy4${&H`Bf7Gx>a;qO;9B*xROUDkC&m7c{4p%85XCuGCVfyM_+dvbSiTTsV)7jG;du zq$!n-RS6`G?m112`8D}8=t4$lbRIc8pWKMDmyZ>eY8e-+vC+pm5@*&jw7&*#l(*(% zg|+gfd=@vj@@*BoPs2{sxN2=GV7RvV_S5oOsFlYSD51W(fNJp>l}umL{aR3DHOPAk zsHA@)A1`3N*(~`|0j2+5dE|WT1QpsAmZoXV)6!q4lna43828I-=d(eb1YUX~ zW;`gLCc3ag@{jXb@0k0wS=UX~W{ojjRhsFHd*wk3P){oARrn+7O*o>ZVy!%L0o>jG zK=}gpfWcn+r221;YU4~rhW@agWU7!a@MM0fDTJcP)(k@AMa>}i$6~?L41$095h|NO zVgZSjR~NE&_R^=DDxkl%tZW9k50KhskODx$o@vUp43LUu5C0aDZq@*hAdnnCISscr_j42V$CRM+2tly0{-1+_)3sMy{V z5)DXoGsply>Y71@0U|utl*a{)2qBa+HB!M3!Zuvicp*Xa<_RRo&q zUavLoCfp0Cf3uufzwSZBb&=(*x#NQ$s21vCZ zlABjBdr@{lVPis5nsm@)y`n>GW73qhQg5%ynWTBDqM4&+l6qONXhdUji>;$aVPz<| zx75!AQEl6%kP<*_FUV)_hwH*#(lN6&6`tifWPCB%Dz`9cvktK?&dy0$yfoJwuS3XE z`ytO0))Z0$NS3K7G8*Xt0-olx)~;@9ps`TfO97v>gb3l)Aye(s9Fa|#L(iaOhD zgwD8*xr>Uj1y3{A2|?g3(%D8Y&CRtf zUc69PtV5>dE?u0FyGStlA*8G|xJq~EGz94kNRl6ttc6aUt0~Q3&=jo_hBk3j5ZBqaGWWAWT##RX=QPD7G+fh%kJV@*Ma0jk@pL*Sz#xJk&mW%2y%!InE_ z7gu1HR+XWEC{wC!HtA!KW8Nk2Tt=Z8r_+*BFEF+qO(9nRF+QO~FnNS34F9MOAugc> z%F^}Iq<8!lftObR+bx}Gy z(cTBzI)5?~q=>lv#!!6$NHbro1dS2jJXP}$*JeOG&1SKKB-{5iCE7+>S#rnCh^B_V6^R1c>hbf|J{aX%Aek%!TCi+!C zJo9xyMDqb4m3}TQL4;a=g`cfC%Is{)^%=ObHv0?5(%hoOOA+f~%~Iq7h>CD*x#i41 z0jX~0%)nqwv8_&n_?=jUT|#IUzhR)M_4_-$P)RGn_9Wig-V)uNi2SazrDvvPK#uW2 zUG!|N0u|x4hRUS|dC>!Peka;STk#DO%kXbGWT8Qj?3t%?5#(M#jO(;Fv+9mF6(E~` ze@OIE zN!bevaxzAZ&w>MP+2a`qs$AI=vJ;R-zZp{&7d=3+SL9bllctWnaz|6H6M$qjYlF@L zQe8+i&~Fehqm&{T%;@*oB+b+n{vaaJ7r|zJxvA(YfD|ok3JDECG`y%o$U+5$1;w>t xI^_Q1rOK97t?KFq^>lRsTVu0X4*g_Tmd^Kk?=ph_@B5zreIC5`{NClf=RNOv&wK72 z3-&cB*w>^aiaoX|`fH!M_ZS!18_ZPxK3i|_A9+|1X3lVbQ$E4h(jr!J`SD;TNKRo+ zeWA4(JJL!Js>IG!qN!$1px`5Rt^r4u!VxSvE{UBlp?#}4BwRrc@k--G_G$UXR^ttZ zD>L{Ht?Su2{#l!0&62MRLR_lN)ir^K1_cLgcz_A+FQyBESg{&^3C!jS`-Ue5_2`rX zO5BO>g5yrq1V^6+$#CL(qvZJgM2&y+Y4nuLc~CdjogWM8${4S~zhCnvZRNoCY6O9J z-UCl1-{1BIv+|wori5J;nP77T&iq=y&2RF@0_==^_zSvO9x87aJcgyMX-UQxnM(wq zj?LRx6oFF7R z>TE8{p3e#B^FsN%AwL?}vGTp4>liC9kL);yu@Cq&;o)r$v|>W^g*lEk(tBcfydXrM zh4nK3Abgm3<8`kw5$=`ac{@`=^Nnv1b}G8cJ)h4tMfiVN0g)>AU@n`61XQSve-`qu zP0|B3<-~eLe7Z`ks7hp~+|#(FQ=evg04Iv^cidh1!cJ+1lMnOroq7g@LND}uvVgPB zkpVl^)^iK^pw5>Kx5x6}E>+#!$s!r*x6$FF3;Ee@eGOY} z{C2nUHWLmJom>_&N7cA?0YA|_*06cZ=7@)z{swLC$1?fkh{c1Y1Ej#?e&-=D7FUVI zmz8+<4O7?$B)5D+8FS=8UE{^ss>Wg5r$;G9k6t^0}ouR9=7 zQJ5EYtcg0fbqe8%yIxWVV)1F_H(%wI}R`LB>X+1@lmp}QCH3q2zYTO|Hp z&j&kASEchz1uJcl`7ai%OzNAzO>(VFwmJT=Ij*~7d1|kSfR|q;C0E=ncyX`ptbiZv zHNvoSH2=L`oJtc|Wpd`svi2$)78@olC(xv$LRfA*O&@#-G6`=QW5PAx*B z5RNrf{qTuK4A+V4fa}ELDlrkZd$2T=8JXcB$M{9_7b7!SEAHQSEDWFAw+rjRSM}{{ z`1@CWu~;R{ zfcQWQ5jISQtjm(XZI&KgUip(6eP;iR8FzI(NUhVfCWN|PVz`w|UCXyx`i75%B&_^u zx3cv9odoBjd;cWo05bwMlV7zAVT*X@f%BSG?V#ZK$9;Dwe|q4M(C9xPSQsPZ4S}xD zeiDQ^{}?=CejoI9k=G6E&5rWm2YUxJ*QDZk(u0fqe?)I^LLfi+VE5+l{|F6^C`?3i ze&fOP=7HO(y~=EK_vIyn+O&U2p&O62fYlh6dz((ivKZ8+LmQ1uqXPMqm;C8qzG+bF zt~Y)le&exbD*buT-TMavE3V3KnV2!jA05BO{~0uZxp?oGu539U7ZcHLM=3_hZc4F` zV&W4U?@*)!2J=lZVXPTH9AmQw#Rx(|@wGLgEvC{xb&M5ffaTR|Bo15eu1H)o-6>O%7<}Z+;mb+VVE3Qfs!+P1JCS*~O86y{@BO8YcrDwC2 z3?am=AmW@^d2fY&B@t4uAO~A*TKs71!canPDoCfP$y=t(zR-#g%23b~b5D=If-L&D z>zkkbuJRZa^ zqN?)a&8#Nt0l)~!Z!s;BbC6W*5sRJ$^tNEcNSD({U4B&{9z*cs*)s4Mh0%RLCGF<( zt(}>PyR3ulCKx410q;sZzLE-W`-)HGp!$S}WeeS6Z*fQD3jK`c5!4-nXgJ6+Pi!oh-AbO}b-F!RCDRp@%? z)5yIhF7-1fG43731CHw2&yc~CqA-aZ+6OR=^$ZNKVXQ|KLw@y_ zoC(5w%xM*GKcZz5iTXXmBS(bVhr#(29}1%rgHddYP*CuYI1N$VuE+_*NSEaDO;IMA z#&`*U%~jwLNm&9OHz<6GC)_PODG^fPNfXqr2%~PdlC0X%1+m!P89j;N1puMZ@-dts zy%Rt!K`3yK`w7{3?MYhUQ>VvGi<=%dBW@;D?hFYH0gCPOW9U=Du=ebKnj>taoxD-} z>0QXf9trj+OO`g>3pUj7RnYG#v9d5otJaC@?*NmW8_cD2FFq?4#q;cu{jJm_S1R+U zMS+sgpbSTaE1N)e+?E_CXr%CDmBK#~TgPqk*BM?jvhyGk_7#iwwuEX;2SOj+jigDg zk=EY6;_(RLy6q1Ti2R@^@yp_au8&fb!SH>WRGHA5#E>Es zc8w5IEf%&@7SYq{F_R_;`F{|P932{5r0U1{=LMvF|9Iy^EfR{)=56LPNB6YPrkd9| zMBmc`H^TSzz0e1|R6H6)o3o1z=8}n20!ne1-V~|O%?fYZ#V6hlBzTFxS#_&?+6gSdP+OKNiy5N zqQ&AI?@#G9Hu8ClCm?~QICe=52rfS#x?xLNAtaurlLA&2{VU{kq7$ew(KU(6H+TFm zS^$osA*!5MH0M60#1l`WZlc7ei!```egY0ZCKmDmiS3w?+Y-CkjKr`$?Uu)r=p3$W zT&Z|Qokj^S?rr+lCXTwH?qr>Mkj~*aTH%1@&Oj^4vD{x1EPjr^o!Hl2ck`aAD|l8V z--=Kq^(lPGi6P$thOPAv%7l35Kz6Lg8o=c&Bwh0fc1_;_`b@m6lv9@OB2(f_oD>g4QPqccGl&8z1UqPg6k4%nby_ z?nl;zEzL(Nt-mf%a9?k@9Na=*MM)1u`P1sQ02WtlC75BXds2eM%Hw9MvVZzzk@muq{NR|7Hn;j27~pCA0#; zhX@tN&7C1`b4Iv#siX%$a(|%oC_dcq$&;*;bN2NoS}(epZ+9 z`sIJ)!R7ae9k1$W3`mDQr-WvJ3RDDTt`)6!spTpW`~~4CQW#Qwm0^xUx+}%Jn~#w6 zYeRHxFQ)TW!5|?&AgLH7@5dM|%Iw7oL%bOwM2Q2r2NzZMbRH0-ekda-U(ud(h5(Ec zn+N%G5O!mw4#JsBnoksyx8mv@kG`lyvPyZ`Uja}l5a7&L*ztxBrXAr0$?fcvCM7>5 z$)GDm40TnaqslW;FRjG&W_lNd9d0X_kpY6Ji7fB0&OQvFcZQbp=g3}5_phK)JluqO zOFWJ0O4;euJ|yV2xvX8i$`g@tPX9^yYM7Gx-o!Ih6+xBKgQ7?=PwFZt@B7Mx6ocSi z*@dzhoteKwA&(h+j4vMB4#kXPtfj*~blIptF1#r&`$(A%{^i&KVgG|3>w(jkomV+} zru6u~afE~8LzN>pr30J9H>89;5LlNyr$kzN>n`M%kAyY3{6tDu`~T>`)dKHiZVp@a zx}tzwf{XSBSBXz9z0xhYxrlOyp9%AUjNwm?%9})+lO>QKSL~J#aXV4dLULj)<{5k> zpQgy!?y+Ah4s(A&a@t03cP>M**5H8P_=9Q&BdUQGQcU%dSJ2TuMF5I(agI<9T7C)C zgL9Dk&Q~-aO%;;Mue*l+43vsC|Dzr?58wR&?0Se}IG8FU3|{-LhhKZx-=18%2BkK< zLpHlmpkdlDn)gY{VNf(dqOI3xvKO-0?Y!q2)m*XA0!1|0jt`_B?@F#V7bP5#^7cTR zUoqJ4mGr_zkEix!gozk#7o?--K2k5qQ7!%R9Y&AiWvba!n|IygnG>nMe1n>2OB$&; z_BqsKC~B~UgTCphM)c>1KGI8fHdhMzZNCFO^#^rcAP9C6jIDeedFH@JG(|zh$X|fo z-iVv>LiI~1UA`w0V@`;LFQS-DqN4>JeEq024CZUb2e)5}W}MU4?2`T|yyYvddkF2q zn@z={I9@hBoOR;WLJu7x|dfj@>Kufnh2N*O-t6 zb_3B*(>F0FTw>8{JbFU!u-#PfJMn5uIZUE}d|Cn2;*~F-5b?k+5^-75 zF{SR~7ceE6{M8Aa2gWG&Td{#|&`yck`PJq7j?L#K#iObxPl}H($FbMuB>y#=*wG$I zUAQc*FscTz){}I9`YV~U(qGA4DHv$&GNm7~AizcZ7ztek?%SV$x(obzmG=fXsVuDq zSy>Ko&gK5@T@=E*kp+_+Ka&X&wTWF&!X~`7rw zDV2#ur8?xJKY`qL$tTj~V>M;txr=YlN?k ziWN(I&~B!*dEn$ut&!XW>y1oQ>JQ?Uoa`cxRBmHZKV)2XboIqxCS*G$gru4MWS&eAX>L5vs|3iGoGY5-${X>X} z+F`UkDrv#*gO${a{%Qcn>e}n>dkgX-h5DO&a|j$rOKJ&%;|Ljv9r|?;^~_CBUFf|m zY;Uk_#Ckwn9-io0<)@bVIPbgTRE_!PY(59n1Ednq+9MBLL0 zABulyp`oHGqqpCZ&9Ts&0S#$@6 zqHwIu#9b)}f5k.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] != 0xFFFF) numcores = i; + if(i && lapic_ids[bootboot->bspid] != 0xFFFF) bootboot->numcores = i; break; } } @@ -1149,8 +1149,8 @@ gzerr: panic("Unable to uncompress"); "inb $0x70, %%al; orb $0x80, %%al; outb %%al, $0x70;" // disable NMI : : :); - if(!nosmp && numcores > 1 && lapic_addr) { - DBG(" * SMP numcores %d\n", numcores); + if(!nosmp && bootboot->numcores > 1 && lapic_addr) { + DBG(" * SMP numcores %d\n", bootboot->numcores); memcpy((uint8_t*)0x1000, (void*)&ap_trampoline, 128); // enable Local APIC @@ -1182,14 +1182,14 @@ gzerr: panic("Unable to uncompress"); } } } else { - numcores = 1; + bootboot->numcores = 1; lapic_addr = 0; lapic_ids[bootboot->bspid] = 0; } /* Create paging tables */ DBG(" * Pagetables PML4 @%p\n", (void*)paging); - memset(paging, 0, (37+(numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE); + memset(paging, 0, (37+(bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE); //PML4 paging[0]=(uint64_t)((uintptr_t)paging+PAGESIZE)+3; // pointer to 2M PDPE (16G RAM identity mapped) paging[511]=(uint64_t)((uintptr_t)paging+20*PAGESIZE)+3; // pointer to 4k PDPE (core mapped at -2M) @@ -1219,14 +1219,14 @@ gzerr: panic("Unable to uncompress"); MapPage(bb_addr, (uint64_t)((uintptr_t)bootboot)+1); MapPage(env_addr, (uint64_t)((uintptr_t)environment)+1); // stack at the top of the memory - for(i=0; i<((numcores*initstack+PAGESIZE-1)/PAGESIZE); i++) { + for(i=0; i<((bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE); i++) { if(paging[23*512+511-i]) panic("Stack smash"); paging[23*512+511-i]=(uint64_t)((uintptr_t)paging+(37+i)*PAGESIZE+3); // core stacks } /* Get memory map */ - uint64_t srt, end, ldrend = (uintptr_t)paging + (37+(numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE; + uint64_t srt, end, ldrend = (uintptr_t)paging + (37+(bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE; uint64_t iniend = (uint64_t)(uintptr_t)core.ptr + core.size; MMapEnt *mmapent=(MMapEnt *)&(bootboot->mmap); for (i = 0; (int)i < lib_sysinfo.n_memranges; i++) { diff --git a/x86_64-cb/smp.S b/x86_64-cb/smp.S index d717e92..9f50c25 100644 --- a/x86_64-cb/smp.S +++ b/x86_64-cb/smp.S @@ -183,7 +183,6 @@ bootboot_startcore: movw %ax, %ss movw %ax, %fs movw %ax, %gs - lock incb 0x200A // __sync_fetch_and_add(&bootboot->numcores, 1); movzwq %di, %rbx shll $1, %ebx // ebx = lapic id * 2 addl $lapic_ids, %ebx diff --git a/x86_64-efi/bootboot.c b/x86_64-efi/bootboot.c index bb0ea8c..4c1e4ed 100644 --- a/x86_64-efi/bootboot.c +++ b/x86_64-efi/bootboot.c @@ -1405,7 +1405,6 @@ VOID EFIAPI bootboot_startcore(IN VOID* buf) // spinlock until BSP finishes (or forever if we got an invalid lapicid, should never happen) do { __asm__ __volatile__ ("pause" : : : "memory"); } while(!bsp_done && core_num != 0xFFFF); - __sync_fetch_and_add(&bootboot->numcores, 1); // enable SSE __asm__ __volatile__ ( @@ -1470,7 +1469,7 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) file_t ret={NULL,0}; CHAR16 **argv, *initrdfile, *configfile, *help= L"SYNOPSIS\n BOOTBOOT.EFI [ -h | -? | /h | /? | -s ] [ INITRDFILE [ ENVIRONFILE [...] ] ]\n\nDESCRIPTION\n Bootstraps an operating system via the BOOTBOOT Protocol.\n If arguments not given, defaults to\n FS0:\\BOOTBOOT\\INITRD as ramdisk image and\n FS0:\\BOOTBOOT\\CONFIG for boot environment.\n Additional \"key=value\" command line arguments will be appended to the\n environment. If INITRD not found, it will use the first bootable partition\n in GPT. If CONFIG not found, it will look for /sys/config inside the\n INITRD (or partition). With -s it will scan the memory for an initrd ROM.\n\n As this is a loader, it is not supposed to return control to the shell.\n\n"; - INTN argc, scanmemory=0, numcores=0; + INTN argc, scanmemory=0; // Initialize UEFI Library InitializeLib(image, systab); @@ -1900,13 +1899,13 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); // failsafe: we cannot map more stacks (each core has 1k) if(i>PAGESIZE/8/2*4) i=PAGESIZE/8/2*4; if(i<1) i = 1; - numcores = i; + bootboot->numcores = i; } - DBG(L" * SMP numcores %d\n", numcores); + DBG(L" * SMP numcores %d\n", bootboot->numcores); // start APs status = uefi_call_wrapper(BS->CreateEvent, 5, 0, TPL_NOTIFY, NULL, NULL, &Event); if(!EFI_ERROR(status)) { - for(i=0; inumcores; i++) { status = uefi_call_wrapper(mp->GetProcessorInfo, 5, mp, i, pibuf); if(!EFI_ERROR(status)) { if(pibuf->StatusFlag & PROCESSOR_AS_BSP_BIT) { @@ -1919,7 +1918,7 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); } } } else - numcores = 1; + bootboot->numcores = 1; #else UINT8 *ptr = (UINT8*)bootboot->arch.x86_64.acpi_ptr, *pe, *data; UINT64 r; @@ -1946,16 +1945,16 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); bsp_num = lapic_ids[bootboot->bspid]; if(bsp_num == 0xFFFF) bsp_num = 0; else { - numcores = i; - DBG(L" * SMP numcores %d\n", numcores); + bootboot->numcores = i; + DBG(L" * SMP numcores %d\n", bootboot->numcores); } } break; } } } - if(nosmp || numcores < 2 || !lapic_addr) { - numcores = 1; + if(nosmp || bootboot->numcores < 2 || !lapic_addr) { + bootboot->numcores = 1; lapic_addr = 0; } #endif @@ -1980,11 +1979,11 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); // create page tables paging = NULL; status = uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 37+ - (numcores*initstack+PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&paging); + (bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&paging); if (EFI_ERROR(status) || paging == NULL) { return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); } - ZeroMem((void*)paging,(37+(numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE); + ZeroMem((void*)paging,(37+(bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE)*PAGESIZE); DBG(L" * Pagetables PML4 @%lx\n",paging); //PML4 paging[0]=(UINT64)((UINT8 *)paging+PAGESIZE)+3; // pointer to 2M PDPE (16G RAM identity mapped) @@ -2015,7 +2014,7 @@ gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); MapPage(bb_addr, (UINT64)(bootboot)+1); MapPage(env_addr, (UINT64)(env.ptr)+1); // stack at the top of the memory - for(i=0; i<(UINTN)((numcores*initstack+PAGESIZE-1)/PAGESIZE); i++) { + for(i=0; i<(UINTN)((bootboot->numcores*initstack+PAGESIZE-1)/PAGESIZE); i++) { if(paging[23*512+511-i]) return report(EFI_OUT_OF_RESOURCES,L"Stack smash"); paging[23*512+511-i]=(UINT64)((UINT8 *)paging+(37+i)*PAGESIZE+3); // core stacks @@ -2105,7 +2104,7 @@ get_memory_map: __asm__ __volatile__ ("pause" : : : "memory"); // memory barrier // start APs - if(numcores > 1 && apmemfree) { + if(bootboot->numcores > 1 && apmemfree) { // copy trampoline and save UEFI's 64 bit system registers for the trampoline code __asm__ __volatile__ (