From 6d82d04a498a7c8a74a04f6b59c623eb3c2d69b7 Mon Sep 17 00:00:00 2001 From: bellard Date: Tue, 26 Apr 2005 21:02:48 +0000 Subject: [PATCH] proll update: IDE HDD/CD support (Blue Swirl) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1405 c046a42c-6fe2-441c-8c8c-71466251a162 --- pc-bios/proll.elf | Bin 137898 -> 152807 bytes pc-bios/proll.patch | 889 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 792 insertions(+), 97 deletions(-) diff --git a/pc-bios/proll.elf b/pc-bios/proll.elf index ac93c4be99f27c2336eea62a50121d196beb6d38..f6198f4d60c4e1e47f5ac8f371b5a0c5a6ca9196 100644 GIT binary patch delta 51295 zcmdqKeS8$vz4$+~*@Pqn*n|WE1Q_xxL)yQlIcB*3u&F24gcFIU8nZ+59uF7+lB|j6*K9<#57~ko?)zq2Mm)d8 zA2c#^8?*B>(CJ4O{V{!{F>BaS(dp0UaDGc_AY$~1=fA$8Z{7@pc+&JQku+kPGQFHCWJPA)ETf1FxG$$*x0k?=1dPmB zz({Qi7+I3euCTI6bJWf)92#zD&yV?~=8f4co1}^q@dU9O#M&N;(iAYzPQJb|`}LKX zMuu_N|N6?tWFvJKR?$mp^aWFMrk*-M(f4q_f>NCzmo-kh9@87M^0x#HV~1%Nqz%oJ z5>UEQbbrv{3x@*R&J5*7S}Y?gVx+fFO!1K@DL?sIHljQWgs&`6&t2Bo0rCsWHc7>kNb7|&J2r15<<9g;!NFpk$sih12qLE&ya|uW($mLqe1>Fp} z7dJWb{?DQ7b4#Rk>qJ+$DW@~=vSB}8loP%qp4=H|?U%o)!yii(7dPd!?CDQizUm95 zZudocO6`v%x9p+zZP78E>Et<`S{X;MBXONcRwZ%AJCdx)QkR#LtROlQ?-~BO~wr`bf(^L+%UfT#xpxGDjg)(=^QDm?M=l) zXV&yJjMP|@WsHd!shJE^-6#VYITqOsm#T?e9Nw5!aHJ`#W`CpKNF}RdWG|zpVsB^h zMP{w1cDe2V?LiW5o?zggaPgBk~ z%sr`aR?@w8to%FXCHCaeqt0wNoD%ZK{h^G;d?OA0W!aQem$oH@47a;Mdvo-#i8ss?fGM7m-m(aA8GBJj8&5{klGqB z`rdGRry-rf{h%|aja<;Pe>rAw_@Ut;<|iX$3*2df<^f+99{e7cx71ua!2XhwQ7y_Du=l(H_^@k+IP;t&Wk_Iy!E7`$%hjQ;OAq z%^y91P4SR)>XsC1(XOn5U@INlo>4Jk@b|FTH?k|1T=-1l!^V`DPc%u@ij`UR)`}8y zjr~N$rP8jJANh^QtL*G?C7IUYVvCinU}Jl+RZh%$d+xZQ=6QDgxRSwEBYBgbOtq=h zA+;$hbh0_?zUJ*&uXWgM;|AqC{&JyJPEVr88MIeHBNi^SJI9SGvc$jK1(6;^W5MBK z!-yAKdRq2PM1I1qIBOIgxAv@MVR}iyDcYq(O3r5(DXz!~HuHbk>*V zs0xPT=k!b|ZAi0o%?B z<D*zXHz`g_uJ zlIAK;n)Jr>6)I82mlCDBiAb=R!W~!lz1PwU%*(hxflFllbPKZ|`NdK-uQO$5(G(~& zV%hnd>=P3fnCTz<^(dzgwwh-!q9w%QFcQv7t0l z4-YpCSC;im;wBye(LtD*E8($sU?HoI#Tk?Nw+L|MIFY5?_DZc zYHyf2-n`Y`GquiKZRZ9{GS}QUk|`NS(q95-h3u+e|6z-AsMBuNTS_6rcTFH-jFg7! z%hrHpWu?6(ILWl_1Hqdn>}QJb>lLm?XR#qumgLt!e&wW7Q}BSP5u?AMmZ&w(#6ilj&O~;mY@6+dnFD=hk$rOdD06^aIHROjmZ-`Uz-srpT|HxL_}6rh+{6B* zhs5!80p`8@gA{HZ8<`Z5ONcxR*%}I;O$Yp-F;JQ!1;d>KZ3@Rc`U5h~la8?MxTUsM zkzG?06gWAu%Q8mONVs-=Tfbp#bkx<7*I{3NM`YIuBMrd{Hu0&ML)&FuG$XqV*$XXg z9-`(8DppFKHt!?KeR@+e+J>6*1;LRu(fIPZ%#~PYg1j zvA50~Z$4%pm{}73p2rbiBW0kIs)_}wcYn-psd*A7t(Q2jd&C{MA|P%OxwxWzc&I<0 zEIxhtWb?_v&K-pP#7*>pVd5tGKpU>AY7FFCc|jvNN)h`I-Y@$GsS^I`5owJXWbh|D za&7?~tM%N1oHd7ymX1h^a#c?{-J0i(mZSF3a|eYh;#P}ahPPOd;U~o*>&3Fil&o1@ zGo<^FZAw$tvIgzAlz8DVY4HjiXwouC?fLnBai%+zWf#!HF#6vTcrA9oS92uOSYU59 zB1u$xTys{mMCXD0nj?1PyrFCYV&_c{ujxTz3f3V7J8Zpv^h-N! zy4Pph#gA@g5-%CzjwpS%g{RpgwCFyMThs(fI;P=a`w4$4ak#Gcf7MCZHb#@U+YsHLAD=86UtkVsAjbn{qdsDxqsoL`y zPL{sgBpx|WOsYlHBq4Ul@d|Q2ULG;d#@`W!YM`$%#$X%8CbZQW$|kf&%s;gg$Ft_D z1ef5@00~B;Z1v^o3L}=?d4B)2fjqs_Y)LbkW)C`JSd%}PM$}}~W%n^il8c!ba%4eg zLjA15o-upWVA;zsDSlQ=ObG2{X<6>`x!-6v&MwHz_@YmIo%Vs*V+Xw2mSO~+NQnd( zf`j@|Sf|EGh8>tQbb##ChQ+e144&L_dF0vA=pWx6PMrRgJ!{TQVOCX(Rkfy*HM0!q zcJZ>5qsec*OJn{l+|>iC5`7-J++DB?}*q0S! z&9-PDRy5r}cJ75k!;>+krY#0is*GR8?gH6wP~ojo;Wh@H$hqIbfy4>I*>u!gih3qR zP12K*6p68Ho~P4ZFZbxCi4AX&nABGD04R@MOqKaYiWqnL`su!u{}lCMq_bXS)iB9? z`kH;@!lAuZX$_t(3j((PqJqpiX1hw)u(OC?G&X1T0i)9&iNy>yJRja-bf%JSwH>)= zth*g9D92`p_>+8w(RKr!QTJ(!^VwL#2 zaB1*ZVJJiHU*-r1dzl@+&hmSojj-o5dg^v$Lljnvry9ggV}81qs#LiZkl7Q@)W!Yz z6_SY7P_rdXH9f!8Y_E6#;vG>m(nj>~TBW5;swh)s=%zgH|^9L=@Crui5WFm^9bz1Du?Kr_uwkpMz z*8`Neo}<-VhQr(#K4rqHXY$JDX|o>Z*S9#EgTA9_Cc5MR#_g4M{elAa^o9eC4kd#|o!ROskC*qe6P84C-}t|#u>ln$SL8kbRs|Iqtn zCbEIZ4#u;Cjwh%M_Xpg3q?UI5!jjAzCH3R}@X2_|Gsm&^4ZC$=$+-OXQO}$}|3T6B zoYoC!AF7ig?E}{;TRqo%?1=%f`sAnsfY2_pSa;Iey5OZh@6kSnDZnp+nY^ zl4_rNwaMQpFAwS;PYH>OE{|u`RL3hivqi@JLhcvED`LKFBSV3Qa6Phlwzarm{+gIS zk{eHcy#vV{W`Oz@zr{nZk@~%W#qj)m0HqP_8S&(nl_E!$jVzNhZF$hmCT`+8WmXzP zIGyt?am*xp$Kt7J#nOz*#hr`$n?vkVi-(2>bX)oCZEZPQa(66$c1$cw2f|7qjt{5< zk8hunQ>h_MAokG7lHtYB`&n~VOQ;PWcn1Vce_HgVD^dTfrmWB&bRXO{MmC8Uuy-yQ zG@<@ho*dciZ@$H7Pd(rZ8n>2qngab&CLSO;+{FaGJuAOC&cVHmEg6G5oI`v)*PWt+ z4cm`?uMhIo;XWJCVYznjivD!C>MKez>4c|-A&a9U2Ws_p;}wI7MA{FjY^2lUNfu9g z#sI7*OHGLD!xEcn$FCR~o<*~yjwYSXKRsTY9}!tN@zFV%c^iV_4XH(>rBgjzy_{dO zS*$p7@y8s_<(HC6QAbLCBop7p^V=DzR)*MYX9!_uRA%1Bu7@-1Z|P1yG#zj6ABex2dn6A*UfTdAWABgo2=Jro0M%yM{=%;8Xb4V5h7fH+4o5Cf0* zTY8kkgwsFlZ$0!#&g)6v%UQN{S9WJZOLoo5d-}eS%d1sucTRp@Yxe!E9Q9S+5_rAp z+kHc=JNg#1ZqIsSOLJCCz3Y50-^%zTKWqi|2dr`mkR7?tT1JU;-{A@U&3wyxJ>M$) zeZEzCAm1uGnQzVdDBqg%(obv)`nN}t&Kzjai}8BRyhOk(QWryVNkHrtev%WFU#+BRe0$U`l+HwOiU%61ESwc5|Td z5E(MOJ}k@R1OvJ1d-42brESvQPFztYuaYGWd6~B#ZyRZu$cs2AlPAcH%!a-bzMx&O z%rYOfXDpj~Mv=^Xn*%KynfZL1jhH&zh;#73%xKahy5j9U%jTqY8EUE>Yp$>>YA1Dz z?2Wa-uoPS>(BZ4uARB8swR-=z?YNPu=T6>=$ys+nI|FY;8w1B%VDYBJ6L%##2XTrz zVRX|XUx-{@EO_O`$S-AC3Eous_JzIo>AVPx-&z{( z%)J>G-&)z3%i&Gx&80DOv++zEL&}?#-1k;+~PjJsOSJdiO9%LMf!wR6Xzq zj6se5@a+`HM}}Flz{#GGbI06)y!Ma+H*s_zI`la+X!NLvh5hnuZVaNoyuoH&DW^Y^ z`1pq@uggxsC)2Rk-Hp8;O)#hB(mw_@`bH)8jj=L*n370Db|vJ1yU!E7+vLbrz0$z0 zI)9A&Lw*K=dBh*0U!MFx^kaqPhNLOaBC{uo+q&A+t(|Va2Fa`~%aSh_a5Q9o&tAEF zs`+bs_wqZ78aq=sl-m_E{1M|ic}G^3v1zioPEr zxp04t-MVsdSf2HAwTA4|we8e|=h=`0!$ZClc{RAwDPg#B?Ye_psdm>pw%gGyXfqmlWEYS51;HEb;dp`}C@c zund`D%=zKOpYt2DEq~-T%k({y_^bdK>pzD)f6i;n4yClEa|X4`S|%Nw@anjKm`s}i znpNJHi|h?8>xoQWJ&Ei+ElX)kpZYnn6kabzM8^GRoK}YqihvB?5@o_aiXp-`WI{OX z8+MRUC97F-TW>2Y9gs{p^07_{6K*__ZsfXc>757IZ>(Vx)37W1wL@%d)SS?o9b4Iw z9ok7puc06GZ420|R}aWk3nA~n{LFBCX{Bc4-saVpC8rfLHX@vqZ?sRYopb&`G91KG zHPD`9C9&}+C-V)P1F-{#3qsik3PR=27laDq1))+YM0-J~jHQ1dn;c0qfDH;8m6|0i zfz5ljG&J=rK7L($eoS_TJX0OtKu)ISYv5$fSKGl&Lwv_q*r81qhL6ufn(MZYOw6Rb zs4>Oz#Ygh!KzDZE(VR$8akKu8{&dlow*0coRH@l1Nq=B@&0{VJ@X~7&d%;QaXc3vp z#6mmByP6W2R9JI)Jba&1J#}!F&cwiMsCFJ4;I+$Sl+l=Oq{;VMU6H*6Yv+k& zZ)s&2${ZrQ=0ESI?m;=PCrz&=zdZWBJucHQ)M;kCFqB8U?_^;p@IhfHw~Ct6Eu2uuDb4$wt`x|*%RG^Be=hfx>gxn0e4XIR zupgO)EJ!btuN0_{yfsA5_k;?nkjwF_S1w;c2qBlFGq0SlAQUtpmo2nc&a1eB2y*#K zfmhB987|mCgnVs4MRfRrY;6kKDLCl1qh9*f#P}K@2Rb`x zd*uYioSYeR%q?Se*fHY5baVGr8|RSXi1*&WR{Vyro)g7b0Zr1>+v>sK=kfQgZxsy* z7(8Zbt9fnM;~v!6^3O2%7UeP^W{AG0tB~ zReJZ7Q0{l8g!rzUm3K1-svYbE!#@}q3*0&-#+yqk?*~(20d}T73}&!GN!w35GCY>V zN|yKP@J_$T4h)Ya%l!w#J5%JoeR!;g+&@3OGga=%{PH)4$5>)j0T)R@$iviyT+q}z z_PH+P98T=RhGa&fDii}JFz_Y!mf%L&Ri40QQSk%^ngQv&=*tQxX*uY$wC1X)UVWhL!i}j`uAIJRp zMq`fjfzRJ;qlS*B9$VUy))d*%Z_e^{S1+%(me#LZzO?qMR{h$gwaaVM_im45rw{*D zbt3+)AoEvW!pg);dvoCcT*^l{gD{nkVRzhiW0q3ifj9+GBcG7H@>{nI5%Ja#;$%Xx z7=vr!S$rz@W^5f|hDGO&cI0V<`xEio1F#=%gHtu{hO;%ZSl=!s5S<-xo@TPW-O{`T zreTy$1kTXB5iZo+0GAq+r6TU7EgrEu zoAcH9+}?l~Z*33pk(R~*+sSBqP%{qLE}o{RZO`SS&D?dWTYgt(B7T=RjDp>D(4({8 zqZ4y=&{J2!zTvLd!nd_?BfBYsA=oY-?ybd8b+88qiQ8VhTPNhC1F24_^MGd=*>suM+y2k zyiK}Tz~RQZgqaREl@Vq+yloF*Ux%A32_+47nqvffH%sv`j^>;T@8ov#yw*f~-T^+x z67l)8<@|a+8xk))Vc!}3>b&_^uUvX{ZT<3EYx(+ROBx-Yu)3+_nUov{k*otvyjjx+DK z5-wd|yW*;qtLy3~l`QGiE&tlaW!KhRy{2qrSKWxSwk<7OIxJXFSae14@X|A`9O1Qp z@nthFnYVEM`4?4v{rYY@#yOYHIQP6+v**m6n7_$me^K@H1=B9PVDgly9$icE-X1${ zNFFqEeZxd+`qHaQHdt3J-(am;cMY}0Gt1XE*pJ^-+P@%9K+|y*tgK5wBEyac=!A$pxE=m(qOLoLC%H0gQb4nZG==hJIGYOpw{*F$S zqqFg+=qyD?Uul1{BQ5=V>)5q-G7(;(>NTg=a3@7AGh?rb-6?vl_3)3nxwqlrxgLIA z*&E*btwO^XpNRLJWpK@aC6o)6Nz1Q!YP4;U**|;^x1>H+RYD^gBEeJG&wbBj%B}dgQw`Ur4w|^Cg7snlB&CXs|b&2mds9SUZ9s+@iT5VQ?;Co%?!=#n$3Vmo~;@8o8df9gyrEv z%@o2c)4UKa*SrXx?9rL!k;tKoMwuZ2%&ZeX(WtKGs3jyk!?)e-ApOY?e}5jB4euG0K< zm`qg7D7+72idpP@x@N{V;Eh^NH}kob6#a;ne_bLr>l-El-xkecXsbuws9B6QYnHS- zG)Lf_n#E2`^G)z>&E(_TulZ(JJQtRZa|<`ebi_BAeg#EN0g?(m@-mOSTr-atN!6N} zJd>7qh3uN)AMx;`u&dt&<4mPr^f+O;zS&1OSF?1K zd1Urx5TkbaZ-^PgOS0hVD5Q)mQ=;e5^G$Z#aBhsn%) zk*h4>y&gUYk9PDkU-9tU@EA2xN$@vy<7mm;!T!7dMuOCC&hoJFFWXdwBRW&&kpIQ5 zN)r7`HdWG7|FK=wv#OxZuF7HARAuExlwAH~U0%!+Q6hdr5Dpg_#t6rYS>Hl19EDuu z_i3h2XFU-#_TKWnWHa*_gk>nu53>%!XEr^VZMQvqU6FLkxrul#oh$1#BIckZR^Hbv zR!-S-_w4H3*Nm`tN+c4U?0$zeeScI@8EKa$;sfZQeJ7wFGE@eAr)f?@exW_@`_~Ov zh~_#ptB|ZD_8K%Lm)GoL-@i2H8amkqI$1Tba+dIwMEs?~XnT%XJh1OhQr<+$m`=$g zsZ(x!WP11rce>XMfcx&LMS!-*|7ATWf-&d%atD&ORhM}z;sAf$eYpt!B|Qi`|4j#~ zHj+I1a(7Ew$KdU|KO*_7tM9uJP0YOGJRI@xe|B@ug=(KYcSUz}zrU*J@Ce7M?96+d?#?au{BG6U zd%JnSU=K&Td61`4gZE(Ge*zDJN5iLK zzc%?9%$OQ78Tse1X`lF6|G^La`{;eFI_2HuP*5m+Kt@z~x6DulT0HfUh~MHIuW-{ z5*yf?`%H@2TUlL*7UduOl3mt5s@Dp%zLSU#YZfhgW&18iX(vjmVs_q7Mh*BXO1NTJ z2gbLN(SH&vg$(Si{YjEf>cNDqa{3sg7~zJq+T%hN(Y&bnkeoKXM5xnuggxJM{arKg&ujS z!(o+inU0W*%QZ{J6uv97O3f6&7t~B+xx4Blws!8WI;kJLwY%blD;<5=Om%ITA5 zdUw25xKSIW7x-E=(+gzBtlClcL)AMD5l<%4CwH9$=Nt%nox%!S*Iz^y8q?yXQbBM2v z?94(VX$Zdn+6)JS%WlF2CIB;!wXj?4WL*_Lx~PJMM<(?{5fQ@ef(#mdId4G zIT0`3M1o897XJKWlOJ{Fy*Mgu6%iaPmuBpp_hNrD{58CA1ZU7itb5>B;28WU{3^U3 zt9t8Kx(Cz?x3KkeEdor5{GVL7!z49~w<9W$KmY83nxy?F7Vax0ow|H)MKl@z-OBxi zg*&OvS^K`c^-KPsdrhR5OO978TfrS8HkY2;t~^8Mxj$)^PoW3%u9_wM7%79*)MPTPD8iMktD0k8n<#ygH zH<@SKu~$a*I+vxL_bq46Qu3p(+}Z1F7H5_a+1V6bW^a6TR9X!>gV5=;+g|-T>B@dP zs^}}ocu*Wk6BOM-iZe-pJBoH_W@amTz>fU(yk3u^IS$RaNS?DhNc$p^iAd&&1pNu5 z&5-_}ScnN(O3NkePKL_{?VhO(9ihY$Z&BA2`(bR z0eV(8N*6kXD;}(w42p|2<4;-0%!?$H3%Pe-0W?R?Z0k_1NDOx$|VGD$*zDcK2k$rZ%Hc1v6hl7OTfg8xN2A!Vp*EPE(5xHBEWw5%i zd6h$9m4V#&ML@(V0@rP;VYhJguv<7`i;w7EO;D=2fsn!}`86tVcpU+KR&9-IVO*wH zO#7R!_KyB0$Lw=q@h#Md2hC9%sD(`}2&G#qW5Vhp!)pPzurl7=%r`n*+)CQ7*qdG* zWRLnoApA%Kv2ztO%b3@bLo4%^53Nne-RfPhm843y!fpl_{~89=>mr(W-B zmD?qhi!$Fq;MRrp!YQ-LTa~k7dG#9Nb$Fg z^ST{$4-q6*5#J$jo$_4|%gk!=5koNoi;RP0991LEE_p4md^TljrA)Y@WC>BNsJT8B zRu{=104TRIwadc~!fre5hFv#41mnh%tFZZiz4NsZ;RbTz)UUi==kzcd8y+oUrzDdcHbsrR_`pviH~ zPJZ(b=KQIMWX)q_md=G`ofCtL;CV0^mD0lvS@YNnm9Ez;g$ct8kgHMM4siJ;t=(|E zz+7ZEADYe_*w$a#Zuf)3}?zK0( zQ)f=LJKq^K;34E3{f;?>{K=s63V}|5PU)ZO(k3I3Jy1`(VR!#%&qA|L@d!3*#>zx| zYy(=qBYq|ElHzT66->t*acb}JKXIN?mW*z5B0dhC5%=yr{cef5T)GZZo$;h$nAMtp z1lMb3=$KnIKLqF5`dh1toz6o+qxM+%OPUFauHIVvvuq0^u9n5xR2QxA>3&(zwSCWUke7jf`m=e z1j;c=hKTfS$>t-w^{=1!%6)e1t?|A$fH^vvrcXzJ_VJ4!qwr&;P z($pMyhzCdW9`A3j_Z~eYsOCgzy3uFYu}?;(k3I{n)rt7zYWv711zq15k*6uTh|*q9 zP^p<=WHe|N`38@CljgOA5zW^SZq_VvhD(=C>FF|Ci;kYfFI2{N=m^PRr)J4Wda@*7 z1v8$|ypgb7xKREWMh7)JA7ue|C>@msyNrDv55g>pveAZnCs5khGK<##zku68kvJ7qbpC z(%l|Cb+V+a|K53Dl|}wA?R$FqTam7a|K`QxKe2&% zR@syd%;;CT?T;DcGVUG2!ICVoQzze5Xg+LCzAJ8y8bG@l=OQ~qylj$ZVkaHm8O=4# zy}cenbRHsFYRu!&Bc?g3=%=K(ED;Zu$y7_U>_+Ji>Of7HiEhj*(K4U;Mz22;U5zMH zCbMW>k~uPcY&yyL6>RW$bY7CVp!e83?zbl5=UC{JNB1Y0=k?-@#)u-SLUeI7!*70? zBip4NSfXfSFNg1j)z)e7R>P2)g#k|uz6pg2#^=q_VL~FCwV#B135h_azc%|@(n;CMqlbE!SN57n z^y@?)k?4Juspbpjnc@;zOr*7>nKW0-fsY~2!2AOEk8n@*8nha6A5%iaE@RC0PsC?b z!dFK_>E@;KzRk=-R4bw&ObW_Ta#QpW(czm*d0E0>WiF`L1@rWEn4scC{uCr$YF!Dx z2Nxw?+RebN_yisf2MuG~EOowJ$#3UAMxEEcWVw2?$Ipr zHqA>3pU_-G_!N`lkf8G=oHVL_20Ryey3s?ugfuQ-IU6(>HFua82T+q|nfgS0CLTNM zqUg%r=7@25qB6r-&~dn8S&WriP?rnKXDxv_ubkN|N%tM>ZHCR{CxT3XcHnmdqbmYt zX3^ECv?b!_cAyd=N($c(z5{*?R&BIzXTTh4nmeOUWtyYXr!*|LJ(-xvJ}M3h%fNS+WWbzfIN; z!;nLRGxe#JJY1Fi(2>i-*Z4sZr6YgFf2WXhBFF9H9}ae%8I9i$UyK6%VEpsZK#uvK zc{sX1hlThpQmi7y9%4R1YZY3#`nX`VlcF+xUq(N3wl7@S9|hT(vJ_X2h#1CN-p?P0 zCm@%ei}}i#uxwKq8+vP~&X&qALcSYOIyx6?CZozL;D?Zt*3~yRBVUR92}FS|dGy!0 z=2@dRP~hhi@!3bw*^JKfj*dFtcmb9&$R6Y%%;H#iPjvDCR^BI~hX%0nexKB=fph4u zD)sAVrOI-;FMFW5&sX#`DP^teOZ-dln{XEVd-yGw(p3I6dLoYjlwg%RGZDWaH(EN_ zEDlfTQ%Xb8{i_)@L*O9HOf_Kyd=4Cf$HUX$mGDe>I$RISQZ@r_fS18D;SKP5_*{4+ zS?h!23n;ofq=YAIu0@at$5q7N8B>zf_&*;~;fTsd{`e|9{O?-gWaM^_qc1*@c@Kyu zZ0|1IgyY>jakYn^?&e8Z9$s23eLnt8`t77|(v!YM^V0;Az8f^6vxk~@r|m}h>jq6F z2XX_-A$M0TeqAK+VIvQe9|EpSide?tCE z&WZ<~Wt>3dnm)x8Ec}B+{K5#_7d06uNjiBxo+yk6bCLg)t0D^J zPjI4#@9*YwdUx}*DIPx1%`>G3>Fd0{9{!}8XD#;d-S9}mxz4ZbjyV6hZk~NtH_tgk zww3*Aya(!C%byHeRY7AlO+Dw2-O1(-@NkWXAM)@A-F(5dDw|&Vr)eWk^0nxw`psI{ z^Ci{`tGiQN_<)B`GtkfAC$?>zuV=%jh48mwwx0aP->7=9n9j0>n=)?p6LB?M z4*wKpYLnmcSG^54z?0zw%(3e2K{gP>;amB^@F93Ud>ecOmO^|BJ__FjbDkK5W9&X8x;iDvYZam~c-R_bwO) zXTZnd^Wk3b3HYmU4!_x+3%9}p;A)sknnT$r$nWeIe8LS6-ZnM6j9QunFg3f3b~Wkk zb_Yy{k{yoS3Gae=<6@K9WiP>eJE*x3##<(*aPq7BY73qKSHiR5b6_e{jknBcFnLwq zOYnP>W~5?=`Ev5g1WkPFiV7G-I9HTRPJqY}ym|A4?P zimc43TE0)__6&U^N^Ti{1ZR8XmS#y@sF}oF-zX6|Eu=CNdAVk>Q=wUODm9DFWW`~_ z6s4fLaY{Nvv&d&@mfFnq$f>=`>?wkk9(ldy9}_ls!no$J2;bE=lK6z?7YR>#=+!T~H#-JI{d>E!rbjdBvze4UdpXisWwVlKr+?06|lxuzqd4=Y;VYmI>ft~hq z(gwB8E6CmElR{K^XNyO^RX9xTC8AkJ{0`o!S>!RzAH%I4`EJdBK)y$_c&knGarg<%VspRd z-@{L7<}lO@x9gifa&tiQoA5!+C*VVx{{qJ~e*kxA{wsV$b0llj*!xkp-Ld_g!>drNl$6UhUD&;s6n&1XoF_)&_>PTp-q~_LlMnVX#UK@3HXpB_tEg`XUJ5*mjqL5$-w7_si|U->ptX5_HYmQw9*M1zBK&> zOi4^c5(ZS_R5(Mk$O9gEwr1khk0T^)Z#d5*w=|2qRC6D=LNoS~Dy9EPVu_gSi3ob+ zGc;$S<8l@}SIhgtRhmUU&m-4;!k2@5iI(?=>oqTzhz3u@2F?AD>-LtBk+ju$o2e$4 zUZT@3f7H6Zs32&V&%=0f(OCEeI9(#!&V@4mtmrqE|7p)_M zylA|FLw$b2>f@d4yjER?LR4sZWv56&xybhnhurcT7Wy`6*+9-apwpJ2O^l&cuv_`HuqAQG zuOXPMd7TnD@~;zw_=wIXhgF+g1*qY_IBG&7aT z@2!-a3XQ#3^B`^aXA;UqxepWgHNQ;gI`vnuTTfxPp1(1!>>fEsh$!bHhJ;qM{eBL%PJLxoQgq=vh1F8@k5yI*_|b)zDp0`+H^hp+eWV;+9Ho6TYmuk-NJ zn!^T<9>=;P{*7PPHsl{!=tutQO4Y}{NkdQ<*gAXEq|~4Q8$PD9-iglZQZ;yN7)N6J5eU9FiekBIt4QM&@a`^Far9ej_8`x)jum!>5)&? zJd`k~nR2`1(y-uJT3$d{rCBBh#-&m$a(HRNALM&IYAIHOu_hZ!?Eb2&*(EU3sKQaB znvt3rj5U)qryE?<+OsP(Mu|)=6=Bb3P2Snz2U>Z!tls-ws8#S|n&btsFJU^gslDMgXN68PHhKFnT zt&uScuRMi3g8V!~O^?be!nC#WimzGXL8yy6;_O{u!b;37a7g)f9%_g?DZd2lu#DbNA}*Q3G~ACX^15YoKxOI$1R z=$5Hw-{_;g%#846t+$kLt7g$@*1Upnr{=2&TRrkN&8r9xXkJNp&?7&jxsEWdc@5zy zhr{ws22)rHz7}>XCu|`Wc>`Rbna!)IS_1hx*zF2mf!(ekyhQ6?3vbbUorgEVJM~t< z_$oJUZN3J#>jax%w>IB^k7#)WKB4(WSl7n5$>=({k$1=PNUAFEEtv8uz5|x7Ar)(+ zC-^q#8}^>=d4*xao3)&#aL*--?XcS%JK$EWb2q$4^S9wAG^6W#N;6wb_qf7{!O}G9 zUq@@$D!e?l14_4<)~(JlJ^G&Wu}he`N+ zB7XTsU6AL|a|0|C69X^UocTTTyxVt>GzDzL;?NA#MK`=+MaO zAFBF=jHNW4_?HsOMFw$)x(tz^<}(cOrtflko$}bP&=I*zmBQFjQ>C!GD52|I*!;E2 z*pZ90%X-WEN&Z!h9n^l=MEFhk6uc0nkI9T~tup(F1g=*;R>}E;QFOb!@`;B(h4c7` z&S?Tm^Jj!^i+m1;D|JMI5MB9WN-$Tm+*E7!5r#C&0IJvQC)}X92Vq3Bcwwhz>AHI~ z_afZyaBoxk&;e>(7o;|75AfSe`o%K&CkObK^RL+Lc)-j;50|L|_LWdB3fs>iZ&NM1 z)#7KEj(pi&rG{}b@zM_t%6%;#Y_<{TZ-xjjd(a~6P4UW28nxR!k!QK9^)U824kQRMk*#B%w5DCd6S+2v0LorWRl(hv7# zoNKNydoTYvLi)Nq887dMM$R)w_Fn!w67drE%4TMdanYxcOg;i0NhjaKsZP9Ah;k}I?H@~;EHl&3(zI6uA=}y@e`saXPFbnte8d~d`ltJ zsPkw*jXdNZkB}u?<#DNI$zw@0biVoYNM)C$T;{_S6C(U;(R`tifw^Kix-u5%sw)~a z_fltrL;IS2rmXln`SBupDdS7kX*0S~r`ypLW}K|J2fi5=+mg4i)M-hyZMM0~sne~< z{%f5Y=9m+wtaz9_o=wDS%5)y>=t>?>2Mt4}Ve#7wnx#&0&63AG`;N~sFEoo)1)oEi zOji6Bg#&OFAERCVs96UmF1f(W_Yp=eFeipr{E@Mi$5=Z=nh!1hxgn)#T$KzDao8P$ zwbk6~F(`ahpcX+QuH?=bbP`lVoKXJ$zlWe6v;VR&*q!k|HU!sr68ta6pgZo?Eyff1 z*y%xSxvr{=bPc9jBJ++ht5zawLKY!iIOzP_t4zyk2yG*28eE{|OyjE>_mx$dS>~8k9IhKN5_Tf| z5eoOBEPY+Zp0JxxSQ7p;+HkS?-t1Mf%0|>g2aUeD`MgySmKpqe~g;D$qRvW25dI z&0-@Et)6H8%vX0|v~a$8ZtuE9EMX~$_zJo=W!yO5ym4S1bAm}ZByHDF$|miF(elOS zNJ%?mfjP0Jj(I}9inF5G$=j4QGuO#m{d+x(VaeN+WsWgi*8~S(#;_dJo0)JP@_S$z zwhYC(-7%I_cnSRYzRm^aH_Rz@PoW?}lpxo-e_zL|ZzENyl^@XO_U)af%(sMHccUQ7Ru? zgyZV_lKyPcZ&8kGUgSD%s*|>>3}19yXfckfKZCS^g21>^kmz*mc}&*m2zH#W=25IZlMGKQ0 zctJE?Z4MEKWn5uiF}prUp)XIwSC{KTlaXv-WJIWkLh1R82*vc!`URTlN%dE1rqJ~( z_dRii>GNG(e+|MbFhc3;H^EoJ)Uf^*&1~!H8{rUgywl}TKk~bguSS&Qk#C|GG$7~6 z_Y3+vkY5-*QOgqUjYk$*>dMxU#;5dlE~S^$-yLmVYW8!6!gXJ=$50b{U1@bZva%ZU z+}ZUlIO_UDysk<+igHPLl%s@QM+v)*5_TOWoJSp3?t7}neBPW=zn@Bd1EEx092JJ~ zymFMVI87WCfpO*+9Tjb_bt`iFm*T(d7#%MaS?)S!8)+QJtXyv9k5P`l%aL{EBMuSA zZ~u~g$5BsVE6W>SccJJ;+n1XIqy1KxrL*gw#bf-hm+CiYk9`M2uE&HK52|YkGagje z5*`Fg*Af=*y}ED93iAVBSb6EY2*pd%ukV4yr6=HfVd-+GHDhp1DjY-Zo$drRTOw-WCRBAuQzopt6Vv)9O!_98E|m*^%ugnhiMI=!&l zgu>EPGCK(4an*#v(psx0B!!)*Lj%K>fn)#Zg&{t~45ncICmhwdN)|nG!ey%1= zSLOQ@l>yPvI&+N3oeqs6}6I*@f4v5DHd>*aW5`I98dFx22$ z`eF3YwdS`6uDO%=A;dqWpUxOyGNtuh8I4?Lp6grF8a;TOIkI@oYJ9_H8 zNtpgS>Z54hMss!XnitS5PsFcbL!_Q6nI*-h(iL`e_iQvT!T$EI(!gteOA@|vea#F> z5}o{2b9!1SrEd-Lb4`w6hWB1`0u8>1eGMxI8tq>-&kA3&31hko2w$CCivS&w|Np-W z&;`9+z-@N!N5JWkHqXK@F=*ZTu=u;(W#S7$|(T>e~rsfRs%a;^Mkm(vsR=-PEb z=kz31QqWL?iv;B2M*4ud;4%R_@@ju)kYGYClCAwFJPLE0VWwa8iyL}|vLHP}U04_k z_~iz!ASm>(vW|QlGKmwN2?UjzClbzbc%b@{PPL9Wn{WvkKM)5wst?(gB0qx zF4R=?+(M!1Tx2pG^2;5}f6f6EFjHRKhXWE*D1TJywf_m9pNOyHcI_)cr%0LbA2l-w z)}GX?CVVW(4qsicY}#EyF?1^eyY-NfyKq#};6M#3=ZENtPwM72psD zoK{I3>Jm>SSx=4>>*H1LN!S7UMB}suo78;e(#8~ZFfA05h)KpGMUyzK$-u;E!!-1n|$+BakG`R_S<_UzfScdzcfyL%V(NS78C2DTVa;1qY0 z(sx5|R{GDNhn456*^n#Y! zFRA=6=YEo6rR8slMy0<-x=!i8B1JSmc(6RR7M+jg<}b#s?}Zck9j*GgIE0J4mp z)UC=`3Kk8IN-96-$4H6;wBHXR<45P;KrdIB$4MhfA0+jS`&;OZn*Su}X1QOK3Z5eA z<)6?`lO&ZsL^`PSQxEo@{ZLjUeecdd?^N#JlTIlu`MZ^t{5?v4i*%pTQp^58{zHNM zN0gS@#XVxxGb9Jiy92;C0Kyc;H%Y#&v{XE&^s}T#m6nQMRQfRKywbCz3rc^7^o-Ka zlb%-^eRe#ok_;AJgz2olDFNn}dVWeN9(I=%==9|j;7RdByY~9`5nCpr7;Wb;OaGjt zSo4KOzmYjj;>-UMdb#Aw2o=yI09u41O20vxQ2I^MbxNNi?N(akdzF^_q|(149adUo zrj$NQx?kyElV<&X62>C|#sQ@ze>#x=q|)z@`d#)u^o-_((jR; zuyocDuxNqv0jab?JR$TsrGGlj+DbMWZdz=Jgz#nP{Gke%ZaZyoA#@`v+%d_PR|Ct49V# zI6|}Irlwd+tl3F-bX%eyB0@Q5cwiJVYUotQxOe(7_tUc*rrn~}DtoSH$GE8WKK`4Nd$KPtdHdi{|6tG1n6IT! zU}Dr3!IrgF(NK~@Nk=+9iv?@eHm{$Zd)aL+D&N*Ox}#%rQ`~#{1vlZwy~P*Y#%tm& z@#gh?Vr#UyGt#-HvndYM5|6dCMq{0w4t_9Yy5Dd&Tpe#|ZC;;_#!~&6R0o1>&Fim~ zRyMapDAAc3j*{!u?QyTZB;K+H(OCQVz!%aY+AgBrcMrI$iYVtTe$|a3L&<2Yy=841 zHKqE8`l-rW{iu8S>>IDRueg2biP0U~l07>HcF8%lraiHX%#Fq{7}M#Hi)DM#gG1Xh z14+M(Gub~j+G9GHJ~h48KS;N|^i%hvHAXg_>C2cZX5ad$I}@5c_%pYu%)8^?-Fvgw zUAHM4Q&bQB~)D8x>jji;tJ7cdqXNujSo$Vsit^>;_;Zb;$gQr8>4fiJ7O5nmXHo1 z(zXwb_arB=7bED`wQZ8m!L}Wu*?M0xMl%EB;}fZjWFr=BGaX8G(p1r@T}_LLvRFa6 zVbaytHf2peP`jzxwzHsjyC^0+lLM1ILrD|FF%uIuTN*Z&VoVu1Bj(FE!;CL6fk-yZ zOEeoF_79Jx2Yh+TXM5!I-9Uy_K%LqQ8M(B>k=Fa8c-X3DBwC@1bZEWpwmy5#uL&Nj zvuAvuFKMEQmN*kxsomFWt_~5RUg8p^+s90Q#U)@8X^sOPV5nG!A=QaT6t#m4Kj!B| z+sN8J+$ZBmU7R4N(`e2gEZng<3pY*(rrQbS@k~$uuHm84f(fD;hGYS>lih1 z3|5J^?PJD*I5At0G=mu*Aro(FiM6&_R~VH9U_mgJFhhfJ-x7@zj?uMk?b*)pbZUSh zj{)s8EKUqZ+d5PDp?_>*)P%OlU(+V}##(rJaZ#h$#`kfex=>@j4e>;z-Hf5(?S1`u zrHMo&E5%0x8aWZ$Wc3B})|gsGGvhl<`^BI{d%Ka7j`6K&jU@8c#7+AdEdQ4^tuZrF ziG!?vRJ3#eW2GQ%-HNZ`t*!RDKGOFEF1FTDi3k@9Oz%%mjO4T0jqmIrmNTaPi>3_^ zGqn-QG92Sfk7j;bo$=?gWZIH4EbOp~*z0h_U`r>w>rcCXGCO^WeYouZ9(42U_fET; zT`%`5cfWVvTka*-PWH-VuD@bUuOM~#7s|~~k;uJL<4*6`TkeVyxy3o+z5SMZRiz;j z49|PZ&$w5X9)b1NjJHAPr(vciz2P(N6=k87Jb4KH!h6VoE6XV|=*KxyJF~|hthr~Ex8V1>lq*uZB>p4sLZg6*@ zp37eGw*H5^(i~{G$!3RmQ!jVl?x146b&><&T&*VbQG2eNyHWW(#97e=KdHFg9--!H zH6gwXZj^h=Y2|;`o^9rIDehqdk>lL)`F4ib6y%B%G_mHGw$nggE@5r6a9r?=}px32#9Q8LO4LXkt>f%gdO zId6`nZw~G{t@58yDSaH#D%f1(C%}9Y7VU23d6Q2ge=NX%2YEunmzOSIbJAOP&eXQ` zoV((Nbz5Mcu+B~sOsMYq~5Dof6({O6HR1oZVHPtX0NtKhT^yWz`^tfC>u`@{F$ zx~$1Os*Tx|GyCs_{7UK0k8h-a#$VArc3(hO_Nb3)p>A5ieN06qrBTX{wQ0`3KusyyRQ_LyTw zZQI&K_^E*Wo8U|UzYX3Qz~{xV;X;NO_Ni{~&<7YM`*AtqR&*C%MnQ3_HlTO~cz*z2 z1KtzB>>z6Po0_tQ7DvJR0{k}cQ~^u9W=|@zq}z%+9q*IBq1$AyAV)@x7;&rJFUS}n zn7+UF2>f-*-@%d~F*>Z3@?p>3Ua()D6^whOv8z;`jZXGXgOiHc>|~z|2^mtN{~5M* zk$r`n1Df$XTlV;4Mg;x|Tn=BnBKU{kssKI?4hQh7;D!L^aw+=_<;%YTULL?_*^T$U z#z4mV;8g*90o+u;CCp;72a&I^gpF)uAEG?22g~S@OAH2=unb!EBg*sHqvpOY@JZ!o z*Rtu*F*4MJB|Jlx&57~_c-AT#6y+6i;gn5^oXx6W7yAxv4aol~xHo{m22KX>-+{&B z8*TY)$+KjfBcnkT{v(?XiOaQ*N`3_H0{aFofH#4)k4u@RQ(T+rUzS^!`I&<3XOCma=f|TTLoZ44%%JosjYhS&#X^@_<5u^Z{R<7MHR_ zQ8q>LyQK70^a+*hiK>V2J^Bc^Ol|11GhB$gc;V z0&9?!-3)#Qti!Ynk36_3P<|A=1*~0C#?@FhQxg5`lYqke$OyQw?CW50p>Gf|B0DSP z4f-y45$qdq3@iru@~`F0E=zg-DX@6NZ_qh#J9wRZ@qz*63@h1k$uCe|3l@X4K>3Hk z(_pQjycrzuP&qO4ka$R2Sbk$}{^4cd-L}umKW%qnay7`y|G@6XZSBwW`>A9mfSmjUJEuZ`#EPpm<7EU@@ zx$+fL&c8mlsDh(8vqaPBRX!7ytkN_d5qTymS*e-lFMuzAHR#HJNd>?>J`JW^9cWZ%D(DVWz#>*zZ|b+G;vVEBs`VbV z!lTO~;EXj$W&Dz3wuvD;7 z@uFQy;Y^{Otcthoata?;mh!msMXAnuTnzf7?2H(|kGx8rs@k75s8YXX_NQAZV7^cm zA(6jY#kB#I5&QjZi5gJ3&VGXGd$5x0gnUlw|1nW{8+YaMeW-uSTZzjDMdu#dqDt<{ zcs#xcnPD%90{~R`P*{G57Tm|m|!AZ z!ff~ziLp{JPFs>@C;cw4%4e6{fx=hF@D+a5?%?k%SA~z+0}}EEa3%ZLBH~+>&v(`G z-p=(~G-o$Cb~4I;0sR{S`hQG=Q&OGbXPqVgion)@z|V8@=536x@RU7oA>ReuqR9dV zXVF$r<=F2F-BXIg_OlhIUGWNg=&HL)aT9mo64d7fGyba*_N*O8gQBXFW7WikOpi?*wqaJqp%Y(DHxGu)7n!##Gf^`nTzR_%i=g?Y5uSg?xdB z>`u?_i>lzS>C!X{ud6{<#VwpW4c~9T%h2)z zo9kcI&uGDd$uXm#>KznTfw!tcMn(O}0>7G3;8KCFu)0Q1+&N$ks%EaZz7c*zF~=hu z9t2leebsbgD>+7fXzS8-fbC!;!OwoPDZ*QP46C?oy1)Z+H%@Ev!!J3+YYD zAGK$X`NOjMcDu)LULVuJy)}J@?U)Xd(O^gb6BCi$J zbjYDp;G`C~QIF_crudV{p9si*#-8}=3@U%CU8mt}RLtLwhwnsQW1uF*Ft_us8bBY_ zFOsD#s=3#my6kLG1%HWxJ+PPCAgZAYQ#WhdyNUb4&XY7KmJpUi$feHNms_zGK z60XF5LNmCFb&r76#Wg4FVXOHTyoLdJ7JFiup9 z%Oi@j_TzZ}Qd`U46|#oJ9~HF+D8CzdjiFkZ|09PGXix>*79XiXKwVtR{9T^`YfRMs z5WZYU5^B(o!C~+g#WI&jkooeba`Sa_0nDgbx{*KVCrvev4iC7HY8-gqhCQHp1Vdn7Kq2mHI&$&fX%&0g<779G1ys z3al*%Z_~S09fsjyf>J!9E)S1mFdp=WRe18^m@pT}~^8s@Y*<=mMhMDi1#O2d! zA@^vXS_bwFVwlx$0{aHBh0BoxK<$Ds^S_)+mv0fnOr-PjM+iz{Aa5{_a3aHCJ4&)n zm_GY`35qjn0Q0~3_S<*)X?tY2^N8}_vj;`^w^-o|$Tw16cx986_KFX_wXQwA=3+4>vRW)iM9ybOM26T7WKT9mL{Oisj0;FgsTfT3KlSjm>m0+g8Asc;B+QAHj(juT_0NMUAZ*W zP?7(P!CSX9baUk57xVwmdwQqv4&M99($L+X;JuN)Y|p<#HgA26jWB!6>tB;4uYH5B zZ~b>pl6oZ#q1VbqUS8JDzTOZTaSfCPdbeB}O4JL}yxVp9lF9zQ{=ot7zDq+R<>q67 Zp6#Qv|9NTX7PrKF5Hfqive01Ye*voYlNSI0 delta 42085 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 Qc7s4BFUIYSK}=~(0L|+ahyVZp diff --git a/pc-bios/proll.patch b/pc-bios/proll.patch index e72e0e4..fb215a0 100644 --- a/pc-bios/proll.patch +++ b/pc-bios/proll.patch @@ -1,6 +1,6 @@ -diff -ruN proll_18.orig/Makefile proll-patch8/Makefile +diff -ruN proll_18.orig/Makefile proll-patch10/Makefile --- proll_18.orig/Makefile 2002-09-13 14:16:59.000000000 +0000 -+++ proll-patch8/Makefile 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/Makefile 2004-11-13 15:50:49.000000000 +0000 @@ -4,6 +4,7 @@ make -C krups-ser all make -C espresso all @@ -14,14 +14,14 @@ diff -ruN proll_18.orig/Makefile proll-patch8/Makefile make -C espresso clean make -C espresso-ser clean + make -C qemu clean -diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +diff -ruN proll_18.orig/qemu/Makefile proll-patch10/qemu/Makefile --- proll_18.orig/qemu/Makefile 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/Makefile 2005-03-02 16:41:50.000000000 +0000 -@@ -0,0 +1,122 @@ ++++ proll-patch10/qemu/Makefile 2005-04-12 14:42:23.000000000 +0000 +@@ -0,0 +1,123 @@ +# +# proll: +# qemu/Makefile - make PROLL for QEMU -+# $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $ ++# $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $ +# +# Copyright 1999 Pete Zaitcev +# This is Free Software is licensed under terms of GNU General Public License. @@ -47,8 +47,8 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +# want to shift it to form a PGD entry. A relocatable label will not work. +# Linux kernel expects us to be at LINUX_OPPROM_BEGVM . +PROLBASE = 0xffd00000 -+PROLRODATA = 0xffd07000 -+PROLDATA = 0xffd09000 ++PROLRODATA = 0xffd08000 ++PROLDATA = 0xffd0b000 +PROLSIZE = 240*1024 + +# Linux @@ -68,7 +68,7 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +OBJS = head.o wuf.o wof.o main.o $(CONSOLE) \ + printf.o le.o system_qemu.o iommu.o \ + arp.o netinit.o bootp.o packet.o tftp.o udp.o sched_4m.o openprom.o \ -+ vconsole.o hconsole.o rconsole.o vcons_zs.o ++ vconsole.o hconsole.o rconsole.o vcons_zs.o esp.o + +all: $(ALL) + @@ -106,7 +106,8 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +le.o: $(SRC)/le.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/netpriv.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/net.h $(SRC)/phys_jj.h + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c -+ ++esp.o: $(SRC)/esp.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/phys_jj.h ++ $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +arp.o: $(SRC)/arp.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +netinit.o: $(SRC)/netinit.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h $(SRC)/ip.h $(SRC)/udp.h @@ -140,9 +141,9 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile + +proll.aout: $(PROLLEXE) + $(ELFTOAOUT) -o proll.aout $(PROLLEXE) -diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S +diff -ruN proll_18.orig/qemu/head.S proll-patch10/qemu/head.S --- proll_18.orig/qemu/head.S 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/head.S 2005-03-02 15:30:47.000000000 +0000 ++++ proll-patch10/qemu/head.S 2005-03-02 15:30:47.000000000 +0000 @@ -0,0 +1,539 @@ +/** + ** Standalone startup code for Linux PROM emulator. @@ -150,7 +151,7 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S + ** This code is licensed under GNU General Public License. + **/ +/* -+ * $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $ ++ * $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $ + */ + +#include @@ -683,10 +684,10 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S +C_LABEL(ldb_bypass): + retl + lduba [%o0] ASI_M_BYPASS, %o0 -diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +diff -ruN proll_18.orig/qemu/main.c proll-patch10/qemu/main.c --- proll_18.orig/qemu/main.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/main.c 2005-04-03 11:58:46.000000000 +0000 -@@ -0,0 +1,173 @@ ++++ proll-patch10/qemu/main.c 2005-04-16 18:03:23.000000000 +0000 +@@ -0,0 +1,185 @@ +/** + ** Proll (PROM replacement) + ** Copyright 1999 Pete Zaitcev @@ -711,7 +712,9 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +void *init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, const char *cmdline, char boot_device, int nographic); +int vcon_zs_init(struct vconterm *t, unsigned int a0); +int vcon_zs_write(struct vconterm *t, char *data, int leng); -+ ++int vcon_zs_getch(struct vconterm *t); ++void esp_probe(); ++int esp_boot(int unit); +static void init_idprom(void); + +struct vconterm dp0; @@ -733,7 +736,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +} *hw_idprom; + +int ignore_fault, fault_ignored; -+void *printk_fn; ++void *printk_fn, *getch_fn; +unsigned int q_height, q_width; + +/* @@ -745,7 +748,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + unsigned int hiphybas; + const void *romvec; + unsigned int ram_size; -+ char nographic; ++ char nographic, bootdev; + + nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F); + if (!nographic) { @@ -753,10 +756,12 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + q_height = ldh_bypass(PHYS_JJ_EEPROM + 0x56); + vcon_init(&dp0, PHYS_JJ_TCX_FB); + printk_fn = vcon_write; ++ getch_fn = vcon_getch; + } + else { + vcon_zs_init(&dp0, 0x71100004); + printk_fn = vcon_zs_write; ++ getch_fn = vcon_zs_getch; + } + + @@ -790,9 +795,13 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + sched_init(); + le_probe(); + init_net(); ++ esp_probe(); + -+ printk("Boot device: %c\n", hw_idprom->boot_device); -+ if (hw_idprom->boot_device == 'n') { ++ bootdev = hw_idprom->boot_device; ++ printk("Boot device: %c\n", bootdev); ++ if (hw_idprom->kernel_size > 0) { ++ printk("Kernel already loaded\n"); ++ } else if (bootdev == 'n') { + if (bootp() != 0) fatal(); + /* + * boot_rec.bp_file cannot be used because system PROM @@ -809,6 +818,10 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + fname[14] = 0; + + if (load(boot_rec.bp_siaddr, fname) != 0) fatal(); ++ } else if (bootdev == 'c') { ++ if (esp_boot(0) != 0) fatal(); ++ } else if (bootdev == 'd') { ++ if (esp_boot(2) != 0) fatal(); + } + + romvec = init_openprom_qemu(bb.nbanks, bb.bankv, hiphybas, @@ -860,10 +873,10 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + hw_idprom = va_prom; +} + -diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c +diff -ruN proll_18.orig/qemu/openprom.c proll-patch10/qemu/openprom.c --- proll_18.orig/qemu/openprom.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/openprom.c 2005-04-06 16:53:31.000000000 +0000 -@@ -0,0 +1,665 @@ ++++ proll-patch10/qemu/openprom.c 2005-04-16 17:30:19.000000000 +0000 +@@ -0,0 +1,741 @@ +/* + * PROM interface support + * Copyright 1996 The Australian National University. @@ -882,6 +895,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + +//#define DEBUG_OBP + ++#define PAGE_SIZE 4096 ++ +struct property { + const char *name; + const char *value; @@ -1275,6 +1290,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c +static int obp_devopen(char *str); +static int obp_devclose(int dev_desc); +static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf); ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size); ++static void obp_dumb_munmap(char *va, unsigned int size); + +static void doublewalk(unsigned ptab1, unsigned va) +{ @@ -1353,20 +1370,34 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + romvec0.pv_nbgetchar = obp_nbgetchar; + romvec0.pv_nbputchar = obp_nbputchar; + romvec0.pv_reboot = obp_reboot; ++ romvec0.pv_printf = (void (*)(const char *fmt, ...))printk; + romvec0.pv_abort = obp_abort; + romvec0.pv_halt = obp_halt; + romvec0.pv_synchook = &synch_hook; + romvec0.pv_v0bootargs = &obp_argp; ++ romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap; ++ romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap; ++ obp_arg.boot_dev_ctrl = 0; ++ obp_arg.boot_dev_unit = '0'; + switch(boot_device) { + default: + case 'a': + obp_arg.argv[0] = "fd()"; ++ obp_arg.boot_dev[0] = 'f'; ++ obp_arg.boot_dev[1] = 'd'; + break; ++ case 'd': ++ obp_arg.boot_dev_unit = '2'; ++ // Fall through + case 'c': + obp_arg.argv[0] = "sd()"; ++ obp_arg.boot_dev[0] = 's'; ++ obp_arg.boot_dev[1] = 'd'; + break; + case 'n': + obp_arg.argv[0] = "le()"; ++ obp_arg.boot_dev[0] = 'l'; ++ obp_arg.boot_dev[1] = 'e'; + break; + } + obp_arg.argv[1] = cmdline; @@ -1483,9 +1514,11 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + return (const char *)-1; +} + ++extern int (*getch_fn)(struct vconterm *v); ++ +static int obp_nbgetchar(void) { + extern struct vconterm dp0; -+ return vcon_getch(&dp0); ++ return getch_fn(&dp0); +} + +static int obp_nbputchar(int ch) { @@ -1507,32 +1540,88 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + printk("halt, freezing\n"); + for (;;) {} +} -+ ++#define isnum(c) ((c >= '0') && (c < '9')) ++#define ctoi(c) (c - '0') +static int obp_devopen(char *str) { +#ifdef DEBUG_OBP -+ printk("open %s\n", str); ++ printk("obp_devopen(%s)\n", str); +#endif ++ if (str[0] == 's' && str[1] == 'd' && str[4] == ',') { ++ unsigned int target; ++ ++ if (str[5] < 7) ++ target = str[5]; ++ else if (isnum(str[6]) && isnum(str[5])) { ++ target = (ctoi(str[5]) * 10 + ctoi(str[6])) & 7; ++ } ++ else { ++ target = ctoi(str[5]) & 7; ++ } ++ return 's' + target; ++ } + return 0; +} + +static int obp_devclose(int dev_desc) { +#ifdef DEBUG_OBP -+ printk("close %d\n", dev_desc); ++ printk("obp_devclose %d\n", dev_desc); +#endif + return 0; +} + -+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf) { ++extern void *esp_read(int unit, int offset, short len); ++ ++static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf) ++{ ++ unsigned int i; ++ void *src; ++ +#ifdef DEBUG_OBP -+ printk("rdblkdev: fd %d, num_blks %d, blk_st %d, buf 0x%x\n", dev_desc, num_blks, blk_st, buf); ++ printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf); +#endif -+ //buf[8] = 'L'; -+ return num_blks; ++ if (dev_desc >= 's' && dev_desc < 'v') { ++ for(i = 0; i < num_blks; i++) { ++ src = esp_read(dev_desc - 's', offset + i, 1); ++ memcpy(&buf[i << 9], src, 512); ++ } ++ return num_blks; ++ } ++ return -1; +} -diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c ++ ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size) ++{ ++ unsigned int npages; ++ unsigned int off; ++ unsigned int mva; ++ ++#ifdef DEBUG_OBP ++ printk("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size); ++#endif ++ off = pa & (PAGE_SIZE-1); ++ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE; ++ pa &= ~(PAGE_SIZE-1); ++ ++ mva = (unsigned int) va; ++ while (npages-- != 0) { ++ map_page(pmem.pl1, mva, pa, 1, pmem.pbas); ++ mva += PAGE_SIZE; ++ pa += PAGE_SIZE; ++ } ++ return va; ++} ++ ++static void obp_dumb_munmap(char *va, unsigned int size) ++{ ++#ifdef DEBUG_OBP ++ printk("obp_dumb_munmap: virta %x, sz %d\n", va, size); ++#endif ++ ++} +diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch10/qemu/system_qemu.c --- proll_18.orig/qemu/system_qemu.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/system_qemu.c 2005-03-02 16:10:20.000000000 +0000 -@@ -0,0 +1,416 @@ ++++ proll-patch10/qemu/system_qemu.c 2005-04-16 06:16:20.000000000 +0000 +@@ -0,0 +1,430 @@ +/** + ** Proll (PROM replacement) + ** system.c: shared miscallenea. @@ -1859,19 +1948,30 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c +{ + char *p; + -+ if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size); ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); + return p; +} + +/* + * Library functions + */ -+void bzero(void *s, int len) { -+ while (len--) *((char *)s)++ = 0; ++void *memset(void *s, int c, size_t len) ++{ ++ void *p = s; ++ ++ while (len--) { ++ *(char *)s = c; ++ s++; ++ } ++ return p; +} + +void bcopy(const void *f, void *t, int len) { -+ while (len--) *((char *)t)++ = *((char *)f)++; ++ while (len--) { ++ *(char *)t = *(char *)f; ++ f++; ++ t++; ++ } +} + +/* Comparison is 7-bit */ @@ -1881,8 +1981,11 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c + char ch; + + while (len--) { -+ ch = *((char *)s1)++; -+ if ((i = ch - *((char *)s2)++) != 0) ++ ch = *(char *)s1; ++ i = ch - *(char *)s2; ++ s1++; ++ s2++; ++ if (i != 0) + return i; + if (ch == 0) + return 0; @@ -1949,9 +2052,9 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c + n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24); + st_bypass(ptr, n); +}; -diff -ruN proll_18.orig/src/arp.c proll-patch8/src/arp.c +diff -ruN proll_18.orig/src/arp.c proll-patch10/src/arp.c --- proll_18.orig/src/arp.c 2001-12-24 05:12:31.000000000 +0000 -+++ proll-patch8/src/arp.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/arp.c 2004-11-13 15:50:49.000000000 +0000 @@ -45,7 +45,7 @@ #endif static struct arp_cache arp_list[ARPNUM]; /* ARP address cache */ @@ -1986,9 +2089,9 @@ diff -ruN proll_18.orig/src/arp.c proll-patch8/src/arp.c + def_gw = IP_ANY; return(TRUE); } -diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h +diff -ruN proll_18.orig/src/arp.h proll-patch10/src/arp.h --- proll_18.orig/src/arp.h 1999-03-18 03:39:43.000000000 +0000 -+++ proll-patch8/src/arp.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/arp.h 2004-11-13 15:50:49.000000000 +0000 @@ -104,7 +104,7 @@ extern int init_arp __P((void)); @@ -1998,9 +2101,265 @@ diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h /* Add a new antry to the ARP cache */ extern void addcache __P((unsigned char *ha, t_ipaddr ip)); -diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c +diff -ruN proll_18.orig/src/esp.c proll-patch10/src/esp.c +--- proll_18.orig/src/esp.c 1970-01-01 00:00:00.000000000 +0000 ++++ proll-patch10/src/esp.c 2005-04-16 06:24:23.000000000 +0000 +@@ -0,0 +1,252 @@ ++#include /* == */ ++#include /* __P for netpriv.h */ ++#include /* dmaga */ ++#include ++ ++#define PHYS_JJ_ESPDMA 0x78400000 /* ESP DMA controller */ ++#define PHYS_JJ_ESP 0x78800000 /* ESP SCSI */ ++#define PHYS_JJ_ESP_IRQ 4 ++#define BUFSIZE 4096 ++/* ++ * XXX Crude ++ */ ++struct esp_dma { ++ struct sparc_dma_registers *regs; ++ enum dvma_rev revision; ++}; ++ ++struct esp_regs { ++ unsigned int regs[16]; ++}; ++ ++struct esp_private { ++ int active; /* initialized */ ++ int inst; /* iface number */ ++ ++ volatile struct esp_regs *ll; ++ __u32 buffer_dvma; ++ unsigned int irq; /* device IRQ number */ ++ int interrupt; ++ ++ struct esp_dma *espdma; /* If set this points to espdma */ ++ ++ unsigned char *buffer; ++}; ++ ++static void esp_interrupt(void *dev_id) ++{ ++ struct esp_private *lp = (struct esp_private *)dev_id; ++ ++ lp->interrupt = 1; ++ /* Acknowledge all the interrupt sources ASAP */ ++ ++ lp->interrupt = 0; ++} ++ ++static int esp_open (void *dev) ++{ ++ struct esp_private *lp = (struct esp_private *)dev; ++ int status = 0; ++ ++ if (request_irq(lp->irq, &esp_interrupt, (void *)dev)) { ++ printk ("Esp: Can't get irq %d\n", lp->irq); ++ return -1; ++ } ++ ++ /* On the 4m, setup the espdma to provide the upper bits for buffers */ ++ if (lp->espdma) ++ lp->espdma->regs->dma_test = ((__u32) lp->buffer_dvma) & 0xff000000; ++ ++ return status; ++} ++ ++static int esp_close (void *dev) ++{ ++ struct esp_private *lp = (struct esp_private *)dev; ++ ++ free_irq (lp->irq, (void *) dev); ++ return 0; ++} ++ ++static int ++esp_init(struct esp_private *esp, struct esp_dma *espdma, int irq) ++{ ++ volatile struct esp_regs *ll; ++ ++ /* Get the IO region */ ++ ll = map_io(PHYS_JJ_ESP, sizeof (struct esp_regs)); ++ if (ll == 0) return -1; ++ ++ esp->buffer = dvma_alloc(BUFSIZE, &esp->buffer_dvma); ++ esp->ll = ll; ++ esp->espdma = espdma; ++ esp->irq = irq; ++ ++ // Chip reset ++ stb_bypass((int)ll + 3*2, 2); ++ return 0; ++} ++ ++static int espdma_init(struct esp_dma *espdma) ++{ ++ void *p; ++ ++ /* Hardcode everything for MrCoffee. */ ++ if ((p = map_io(PHYS_JJ_ESPDMA, 0x10)) == 0) { ++ printk("espdma_init: cannot map registers\n"); ++ return -1; ++ } ++ espdma->regs = p; ++ ++ printk("dma1: "); ++ ++ switch((espdma->regs->cond_reg)&DMA_DEVICE_ID) { ++ case DMA_VERS0: ++ espdma->revision=dvmarev0; ++ printk("Revision 0 "); ++ break; ++ case DMA_ESCV1: ++ espdma->revision=dvmaesc1; ++ printk("ESC Revision 1 "); ++ break; ++ case DMA_VERS1: ++ espdma->revision=dvmarev1; ++ printk("Revision 1 "); ++ break; ++ case DMA_VERS2: ++ espdma->revision=dvmarev2; ++ printk("Revision 2 "); ++ break; ++ case DMA_VERHME: ++ espdma->revision=dvmahme; ++ printk("HME DVMA gate array "); ++ break; ++ case DMA_VERSPLUS: ++ espdma->revision=dvmarevplus; ++ printk("Revision 1 PLUS "); ++ break; ++ default: ++ printk("unknown dma version %x", ++ (espdma->regs->cond_reg)&DMA_DEVICE_ID); ++ /* espdma->allocated = 1; */ ++ break; ++ } ++ printk("\n"); ++ return 0; ++} ++ ++static struct esp_dma espdma0; ++static struct esp_private esp; ++/* ++ * Find all the esp cards on the system and initialize them ++ */ ++void esp_probe () ++{ ++ if (espdma_init(&espdma0) != 0) { ++ return; ++ } ++ ++ if (esp_init(&esp, &espdma0, PHYS_JJ_ESP_IRQ) != 0) { ++ printk("esp_probe: esp0 init failed\n"); ++ return; ++ } ++ return; ++} ++ ++void *esp_read(int unit, int offset, short len) ++{ ++ // Set SCSI target ++ stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7); ++ // Set DMA address ++ st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma); ++ // Set DMA length ++ stb_bypass(PHYS_JJ_ESP + 0*4, 10); ++ stb_bypass(PHYS_JJ_ESP + 1*4, 0); ++ // Set DMA direction ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x000); ++ // Setup command = Read(10) ++ esp.buffer[0] = 0x80; ++ esp.buffer[1] = 0x28; ++ esp.buffer[2] = 0x00; ++ esp.buffer[3] = (offset >> 24) & 0xff; ++ esp.buffer[4] = (offset >> 16) & 0xff; ++ esp.buffer[5] = (offset >> 8) & 0xff; ++ esp.buffer[6] = offset & 0xff; ++ esp.buffer[7] = 0x00; ++ esp.buffer[8] = (len >> 8) & 0xff; ++ esp.buffer[9] = len & 0xff; ++ // Set ATN, issue command ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x42); ++ ++ // Set DMA length = 512 * read length ++ stb_bypass(PHYS_JJ_ESP + 0*4, 0); ++ stb_bypass(PHYS_JJ_ESP + 1*4, (len << 1) & 0xff); ++ // Set DMA direction ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x100); ++ // Transfer ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x10); ++ return esp.buffer; ++} ++ ++// Sparc boot sequence can be found in SILO docs, ++// first-isofs/README.SILO_ISOFS ++int esp_boot(int unit) ++{ ++ struct sun_disklabel { ++ unsigned char info[128]; /* Informative text string */ ++ unsigned char spare0[14]; ++ struct sun_info { ++ unsigned char spare1; ++ unsigned char id; ++ unsigned char spare2; ++ unsigned char flags; ++ } infos[8]; ++ unsigned char spare[246]; /* Boot information etc. */ ++ short rspeed; /* Disk rotational speed */ ++ short pcylcount; /* Physical cylinder count */ ++ short sparecyl; /* extra sects per cylinder */ ++ unsigned char spare2[4]; /* More magic... */ ++ short ilfact; /* Interleave factor */ ++ short ncyl; /* Data cylinder count */ ++ short nacyl; /* Alt. cylinder count */ ++ short ntrks; /* Tracks per cylinder */ ++ short nsect; /* Sectors per track */ ++ unsigned char spare3[4]; /* Even more magic... */ ++ struct sun_partition { ++ int start_cylinder; ++ int num_sectors; ++ } partitions[8]; ++ short magic; /* Magic number */ ++ short csum; /* Label xor'd checksum */ ++ } *label; ++ unsigned int i, offset; ++ void *src, *dst; ++ ++ printk("Loading partition table from target %d:\n", unit); ++ // Chip reset ++ stb_bypass(PHYS_JJ_ESP + 3*4, 2); ++ ++ esp_open(&esp); ++ ++ label = esp_read(unit, 0, 1); ++ printk("CHS: %d/%d/%d, partitions:\n", label->ncyl, label->ntrks, label->nsect); ++ for (i = 0; i < 8; i++) { ++ printk("%c: %d + %d\n", 'a' + i, label->partitions[i].start_cylinder, ++ label->partitions[i].num_sectors); ++ } ++ offset = label->partitions[4].start_cylinder * label->ntrks * label->nsect + 1; ++ printk("booting sd(0,%d,0):d (offset %d)\n", unit, offset); ++ // Skip a.out header (0x20) ++ dst = (void *)0x4000; ++ src = esp_read(unit, offset, 1); ++ src = (void *)((unsigned int) src + 0x20); ++ memcpy(dst, src, 512 - 0x20); ++ dst = (void *)0x4000 + 512 - 0x20; ++ for (i = 1; i < 7680/512; i++) { ++ src = esp_read(unit, offset + i, 1); ++ memcpy(dst, src, 512); ++ dst += 512; ++ } ++ esp_close(&esp); ++ return 0; ++} +diff -ruN proll_18.orig/src/hconsole.c proll-patch10/src/hconsole.c --- proll_18.orig/src/hconsole.c 2002-07-23 05:52:48.000000000 +0000 -+++ proll-patch8/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000 ++++ proll-patch10/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000 @@ -29,6 +29,10 @@ struct raster r_master; /* For a case of resize, whole fb */ struct raster r_0; /* malloc() erzatz */ @@ -2024,9 +2383,69 @@ diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c t->r_ = r; t->r0_ = q; t->f_ = &f_master; -diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm +diff -ruN proll_18.orig/src/hme.c proll-patch10/src/hme.c +--- proll_18.orig/src/hme.c 2002-07-23 05:52:52.000000000 +0000 ++++ proll-patch10/src/hme.c 2005-04-16 06:16:20.000000000 +0000 +@@ -655,10 +655,10 @@ + unsigned int flags, + unsigned int addr) + { +- __asm__ __volatile__(" +- stwa %3, [%0] %2 +- stwa %4, [%1] %2 +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "stwa %3, [%0] %2\n\t" ++ "stwa %4, [%1] %2\n\t" ++ : /* no outputs */ + : "r" (&rp->rx_addr), "r" (&rp->rx_flags), + "i" (ASI_PL), "r" (addr), "r" (flags)); + } +@@ -667,10 +667,10 @@ + unsigned int flags, + unsigned int addr) + { +- __asm__ __volatile__(" +- stwa %3, [%0] %2 +- stwa %4, [%1] %2 +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "stwa %3, [%0] %2\n\t" ++ "stwa %4, [%1] %2\n\t" ++ : /* no outputs */ + : "r" (&tp->tx_addr), "r" (&tp->tx_flags), + "i" (ASI_PL), "r" (addr), "r" (flags)); + } +@@ -2404,7 +2404,7 @@ + TXD(("[%d]", elem)); + this = &txbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->tx_flags), "i" (ASI_PL)); + #else +@@ -2447,7 +2447,7 @@ + RXD(("RX<")); + this = &rxbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->rx_flags), "i" (ASI_PL)); + #else +@@ -2530,7 +2530,7 @@ + elem = NEXT_RX(elem); + this = &rxbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->rx_flags), "i" (ASI_PL)); + #else +diff -ruN proll_18.orig/src/lat7_2.bm proll-patch10/src/lat7_2.bm --- proll_18.orig/src/lat7_2.bm 1999-02-27 05:48:54.000000000 +0000 -+++ proll-patch8/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000 @@ -1,6 +1,6 @@ #define lat7_2_width 128 #define lat7_2_height 88 @@ -2035,9 +2454,9 @@ diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0x1e, 0x0c, 0x02, 0x70, 0x18, 0x22, 0x22, 0x18, 0x00, 0x00, 0x18, 0x18, 0xff, 0x18, 0x00, 0x12, 0x02, -diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch8/src/lat7_2_swapped.bm +diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch10/src/lat7_2_swapped.bm --- proll_18.orig/src/lat7_2_swapped.bm 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000 @@ -0,0 +1,121 @@ +#define lat7_2_width 128 +#define lat7_2_height 88 @@ -2160,9 +2579,9 @@ diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch8/src/lat7_2_swapped.bm + 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; -diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c +diff -ruN proll_18.orig/src/le.c proll-patch10/src/le.c --- proll_18.orig/src/le.c 2002-07-23 05:52:49.000000000 +0000 -+++ proll-patch8/src/le.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/le.c 2005-04-16 06:16:20.000000000 +0000 @@ -185,8 +185,6 @@ unsigned short rap; /* register address port */ }; @@ -2172,9 +2591,18 @@ diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c /* The Lance uses 24 bit addresses */ /* On the Sun4c the DVMA will provide the remaining bytes for us */ /* On the Sun4m we have to instruct the ledma to provide them */ -diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c +@@ -771,7 +769,7 @@ + /* Clear the slack of the packet, do I need this? */ + /* For a firewall its a good idea - AC */ + if (len != skblen) +- bzero((char *) &ib->tx_buf [entry][skblen], len - skblen); ++ memset((char *) &ib->tx_buf [entry][skblen], 0, len - skblen); + + /* Now, give the packet to the lance */ + ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN); +diff -ruN proll_18.orig/src/netinit.c proll-patch10/src/netinit.c --- proll_18.orig/src/netinit.c 2002-09-13 21:53:33.000000000 +0000 -+++ proll-patch8/src/netinit.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/netinit.c 2004-11-13 15:50:49.000000000 +0000 @@ -49,13 +49,20 @@ unsigned char myhwaddr[ETH_ALEN]; /* my own hardware addr */ t_ipaddr myipaddr; /* my own IP address */ @@ -2218,9 +2646,9 @@ diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c fatal(); } } -diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h +diff -ruN proll_18.orig/src/netpriv.h proll-patch10/src/netpriv.h --- proll_18.orig/src/netpriv.h 1999-04-27 05:39:37.000000000 +0000 -+++ proll-patch8/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000 @@ -130,10 +130,9 @@ * */ @@ -2242,9 +2670,9 @@ diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h /* Empty read buffer */ extern void empty_buf __P((void)); -diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h +diff -ruN proll_18.orig/src/openprom.h proll-patch10/src/openprom.h --- proll_18.orig/src/openprom.h 2002-07-14 02:26:30.000000000 +0000 -+++ proll-patch8/src/openprom.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/openprom.h 2004-11-13 15:50:49.000000000 +0000 @@ -54,20 +54,20 @@ }; @@ -2306,9 +2734,9 @@ diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h }; /* More fun PROM structures for device probing. */ -diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c +diff -ruN proll_18.orig/src/packet.c proll-patch10/src/packet.c --- proll_18.orig/src/packet.c 2000-02-11 04:56:45.000000000 +0000 -+++ proll-patch8/src/packet.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/packet.c 2004-11-13 15:50:49.000000000 +0000 @@ -41,7 +41,7 @@ int aligner; } wbuf; @@ -2336,9 +2764,9 @@ diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c { struct sk_buff *skb; unsigned char *s; -diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c +diff -ruN proll_18.orig/src/printf.c proll-patch10/src/printf.c --- proll_18.orig/src/printf.c 1999-03-19 07:03:59.000000000 +0000 -+++ proll-patch8/src/printf.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/printf.c 2004-11-13 15:50:49.000000000 +0000 @@ -19,7 +19,7 @@ static void printn(struct prf_fp *, unsigned long, unsigned int); static void putchar(char, struct prf_fp *); @@ -2366,9 +2794,9 @@ diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c putchar(c,filog); } else if (c == 'l' || c == 'O') { printn(filog, (long)va_arg(adx,long), c=='l'?10:8); -diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c +diff -ruN proll_18.orig/src/rconsole.c proll-patch10/src/rconsole.c --- proll_18.orig/src/rconsole.c 1999-01-16 07:16:55.000000000 +0000 -+++ proll-patch8/src/rconsole.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/rconsole.c 2005-04-16 06:16:20.000000000 +0000 @@ -28,12 +28,18 @@ * move to California. Only plain lat7 survived. * I recreated lat7-1 changes in lat7-2. --zaitcev @@ -2388,6 +2816,37 @@ diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c #if 1 /* +@@ -46,18 +52,18 @@ + #endif + + static __inline__ void stfb_w(void *ptr, unsigned int data) { +- __asm__ __volatile__ ("sta %0, [%1] %2" : : ++ __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : : + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); + } + + static __inline__ void stfb_b(void *ptr, unsigned int data) { +- __asm__ __volatile__ ("stba %0, [%1] %2" : : ++ __asm__ __volatile__ ("stba %0, [%1] %2\n\t" : : + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); + } + + static __inline__ unsigned int ldfb_w(void *ptr) { + unsigned int data; +- __asm__ __volatile__ ("lda [%1] %2, %0" : ++ __asm__ __volatile__ ("lda [%1] %2, %0\n\t" : + "=r" (data) : + "r" (ptr), "i" (ASI_M_BYPASS)); + return data; +@@ -65,7 +71,7 @@ + + static __inline__ unsigned int ldfb_b(void *ptr) { + unsigned int data; +- __asm__ __volatile__ ("lduba [%1] %2, %0" : ++ __asm__ __volatile__ ("lduba [%1] %2, %0\n\t" : + "=r" (data) : + "r" (ptr), "i" (ASI_M_BYPASS)); + return data; @@ -94,6 +100,7 @@ #endif @@ -2423,9 +2882,9 @@ diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c p->nchars_ = LAT7_NCHARS; p->width_ = LAT7_WIDTH; p->height_ = LAT7_HEIGHT; -diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h +diff -ruN proll_18.orig/src/rconsole.h proll-patch10/src/rconsole.h --- proll_18.orig/src/rconsole.h 1999-01-16 05:00:59.000000000 +0000 -+++ proll-patch8/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000 @@ -13,10 +13,10 @@ */ @@ -2439,18 +2898,21 @@ diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h int nchars_; /* 128 for ASCII ... 65536 for Unicode */ int width_; /* [Pixels]. Maximum size is 16. */ int height_; /* [Pixels == scan lines]. */ -diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h +diff -ruN proll_18.orig/src/romlib.h proll-patch10/src/romlib.h --- proll_18.orig/src/romlib.h 1999-04-20 04:26:45.000000000 +0000 -+++ proll-patch8/src/romlib.h 2004-11-13 15:50:49.000000000 +0000 -@@ -73,12 +73,12 @@ ++++ proll-patch10/src/romlib.h 2005-04-16 20:32:49.000000000 +0000 +@@ -72,13 +72,13 @@ + */ #define memcpy(dst, src, len) bcopy(src, dst, len) #define memcmp(x1, x2, len) bcmp(x1, x2, len) - #define memset(p, len, zero) bzero(p, len) +-#define memset(p, len, zero) bzero(p, len) -extern void bcopy(void *b1, void *b2, int length); -extern int bcmp(void *b1, void *b2, int length); +-extern void bzero(void *b, int c); +extern void bcopy(const void *b1, void *b2, int length); +extern int bcmp(const void *b1, const void *b2, int length); - extern void bzero(void *b, int c); ++typedef unsigned int size_t; ++extern void *memset(void *p, int c, size_t len); /* gcc complains about "conflicting types for builtin function strlen". */ #define strlen(s) ssize(s) -extern int ssize(char *s); @@ -2458,9 +2920,9 @@ diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h /* -diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c +diff -ruN proll_18.orig/src/sched_4m.c proll-patch10/src/sched_4m.c --- proll_18.orig/src/sched_4m.c 1999-04-27 05:48:51.000000000 +0000 -+++ proll-patch8/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000 @@ -108,7 +108,7 @@ static int set_bolt; /* Tick counter limit */ static struct handsc hndv[16]; @@ -2470,9 +2932,9 @@ diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c 0, 0, 0, 0, 0, 0, SUN4M_INT_ETHERNET, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c +diff -ruN proll_18.orig/src/swap.c proll-patch10/src/swap.c --- proll_18.orig/src/swap.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/swap.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/swap.c 2004-11-13 15:50:49.000000000 +0000 @@ -0,0 +1,21 @@ +// Convert the lat7 font so that no conversion is needed at runtime. +#define ORIG @@ -2495,9 +2957,9 @@ diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c + } + printf("\n"); +} -diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c +diff -ruN proll_18.orig/src/system.c proll-patch10/src/system.c --- proll_18.orig/src/system.c 2002-07-23 05:52:49.000000000 +0000 -+++ proll-patch8/src/system.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/system.c 2005-04-16 06:16:20.000000000 +0000 @@ -298,8 +298,8 @@ } @@ -2509,13 +2971,39 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c map_page(l1, va, pa, 0, highbase); pa += PAGE_SIZE; } -@@ -518,12 +518,12 @@ - while (len--) *((char *)s)++ = 0; +@@ -507,30 +507,44 @@ + { + char *p; + +- if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size); ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); + return p; + } + + /* + * Library functions + */ +-void bzero(void *s, int len) { +- while (len--) *((char *)s)++ = 0; ++void *memset(void *s, int c, size_t len) ++{ ++ void *p = s; ++ ++ while (len--) { ++ *(char *)s = c; ++ s++; ++ } ++ return p; } -void bcopy(void *f, void *t, int len) { +- while (len--) *((char *)t)++ = *((char *)f)++; +void bcopy(const void *f, void *t, int len) { - while (len--) *((char *)t)++ = *((char *)f)++; ++ while (len--) { ++ *(char *)t = *(char *)f; ++ f++; ++ t++; ++ } } /* Comparison is 7-bit */ @@ -2524,7 +3012,19 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c { int i; char ch; -@@ -538,8 +538,8 @@ + + while (len--) { +- ch = *((char *)s1)++; +- if ((i = ch - *((char *)s2)++) != 0) ++ ch = *(char *)s1; ++ i = ch - *(char *)s2; ++ s1++; ++ s2++; ++ if (i != 0) + return i; + if (ch == 0) + return 0; +@@ -538,8 +552,8 @@ return 0; } @@ -2535,7 +3035,7 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c for (p = s; *p != 0; p++) { } return p - s; } -@@ -560,14 +560,6 @@ +@@ -560,14 +574,6 @@ va_end(x1); } @@ -2550,9 +3050,9 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c void fatal() { printk("fatal."); -diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h +diff -ruN proll_18.orig/src/system.h proll-patch10/src/system.h --- proll_18.orig/src/system.h 2002-09-13 21:53:32.000000000 +0000 -+++ proll-patch8/src/system.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/system.h 2005-04-16 06:16:20.000000000 +0000 @@ -16,7 +16,7 @@ #define IOMAPSIZE (1*1024*1024) /* 1 Meg maximum: we do not map framebuffer. */ #define NCTX_SWIFT 0x100 @@ -2562,9 +3062,118 @@ diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h #ifndef __ASSEMBLY__ struct bank { -diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c +@@ -164,10 +164,10 @@ + + extern __inline__ void setipl(unsigned long __orig_psr) + { +- __asm__ __volatile__(" +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : /* no outputs */ + : "r" (__orig_psr) + : "memory", "cc"); + } +@@ -176,13 +176,13 @@ + { + unsigned long tmp; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- or %0, %1, %0 +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : "=r" (tmp) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "or %0, %1, %0\n\t" ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (tmp) + : "i" (PSR_PIL) + : "memory"); + } +@@ -191,13 +191,13 @@ + { + unsigned long tmp; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- andn %0, %1, %0 +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : "=r" (tmp) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "andn %0, %1, %0\n\t" ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (tmp) + : "i" (PSR_PIL) + : "memory"); + } +@@ -214,18 +214,18 @@ + { + unsigned long retval; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- and %0, %2, %%g1 +- and %1, %2, %%g2 +- xorcc %%g1, %%g2, %%g0 +- be 1f +- nop +- wr %0, %2, %%psr +- nop; nop; nop; +-1: +-" : "=r" (retval) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "and %0, %2, %%g1\n\t" ++ "and %1, %2, %%g2\n\t" ++ "xorcc %%g1, %%g2, %%g0\n\t" ++ "be 1f\n\t" ++ "nop\n\t" ++ "wr %0, %2, %%psr\n\t" ++ "nop; nop; nop;\n\t" ++ "1:\n\t" ++ : "=r" (retval) + : "r" (__new_psr), "i" (PSR_PIL) + : "g1", "g2", "memory", "cc"); + +@@ -236,13 +236,13 @@ + { + unsigned long retval; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- or %0, %1, %%g1 +- wr %%g1, 0x0, %%psr +- nop; nop; nop +-" : "=r" (retval) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "or %0, %1, %%g1\n\t" ++ "wr %%g1, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (retval) + : "i" (PSR_PIL) + : "g1", "memory"); + +diff -ruN proll_18.orig/src/udp.c proll-patch10/src/udp.c --- proll_18.orig/src/udp.c 2001-12-24 05:12:53.000000000 +0000 -+++ proll-patch8/src/udp.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/udp.c 2004-11-13 15:50:49.000000000 +0000 @@ -81,7 +81,7 @@ int source; int dest; @@ -2584,9 +3193,9 @@ diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c /* Register IP packet type and set write buffer pointer */ if ((writebuf = reg_type(htons(ETH_P_IP), ip_recv)) == NULL) return(FALSE); -diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c +diff -ruN proll_18.orig/src/vcons_zs.c proll-patch10/src/vcons_zs.c --- proll_18.orig/src/vcons_zs.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/vcons_zs.c 2005-03-20 10:25:39.000000000 +0000 ++++ proll-patch10/src/vcons_zs.c 2005-04-10 07:01:03.000000000 +0000 @@ -0,0 +1,68 @@ +/** + ** Console over 'zs' (Zilog serial port) @@ -2648,7 +3257,7 @@ diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c + unsigned zs_ptr = (unsigned) t->impl; + + while ((ldb_bypass(zs_ptr) & 1) != 1) { } -+ return ldb_bypass(zs_ptr + ZS_DATA); ++ return ldb_bypass(zs_ptr + ZS_DATA) & 0xff; +} + +void vcon_zs_fini(struct vconterm *t) @@ -2656,10 +3265,17 @@ diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c + /* violent crash in the end */ + ; +} -diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c +diff -ruN proll_18.orig/src/vconsole.c proll-patch10/src/vconsole.c --- proll_18.orig/src/vconsole.c 1999-11-08 03:10:28.000000000 +0000 -+++ proll-patch8/src/vconsole.c 2005-03-02 14:29:05.000000000 +0000 -@@ -13,6 +13,10 @@ ++++ proll-patch10/src/vconsole.c 2005-04-17 19:23:21.000000000 +0000 +@@ -7,12 +7,17 @@ + #include "vconsole.h" + + #include "hconsole.h" ++#include + + static void vcon_i_cursfeed(struct vconterm *t); + static void vcon_i_backflush(struct vconterm *t); struct hconsole hcons0; @@ -2670,7 +3286,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c int vcon_init(struct vconterm *t, unsigned int a0) { struct hconsole *hconp; -@@ -25,11 +29,49 @@ +@@ -25,11 +30,49 @@ t->vc_x = 0; t->vc_y = 0; t->backp = 0; t->backc = 0; @@ -2720,7 +3336,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c int vcon_write(struct vconterm *t, char *data, int leng) { int l = leng; -@@ -40,29 +82,84 @@ +@@ -40,29 +83,99 @@ if (l <= 0) break; c = *data++; --l; @@ -2741,6 +3357,9 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c + case 'M': + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); + break; ++ default: ++ printk("Unhandled escape code '%c'\n", c); ++ break; + } break; - case 0x0D: /* Return */ @@ -2768,9 +3387,21 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c + if (t->vc_par[1]) t->vc_par[1]--; + gotoxay(t, t->vc_par[1], t->vc_par[0]); + break; ++ case 'J': ++ if (t->vc_par[0] == 0) { ++ //erase from cursor to end of display ++ hcon_clear(hconp, t->vc_y, t->vc_x, hconp->ydim_, hconp->xdim_); ++ } ++ break; + case 'M': + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); + break; ++ case 'm': ++ break; ++ default: ++ printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n", ++ c, t->vc_par[0], t->vc_par[1], t->vc_par[2], t->vc_par[3], t->vc_par[4]); ++ break; + } break; default: @@ -2823,9 +3454,73 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c } } } -diff -ruN proll_18.orig/src/vconsole.h proll-patch8/src/vconsole.h +@@ -100,9 +213,62 @@ + return 0; + } + ++static const unsigned char sunkbd_keycode[128] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ++ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ ' ', ++}; ++ ++static const unsigned char sunkbd_keycode_shifted[128] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ++ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ ' ', ++}; ++ ++static int shiftstate; ++ + int vcon_getch(struct vconterm *t) + { +- return -1; ++ int ch; ++ ++ while ((ldb_bypass(0x71000004) & 1) != 1) { } ++ do { ++ ch = ldb_bypass(0x71000006) & 0xff; ++ if (ch == 99) ++ shiftstate |= 1; ++ else if (ch == 110) ++ shiftstate |= 2; ++ else if (ch == 227) ++ shiftstate &= ~1; ++ else if (ch == 238) ++ shiftstate &= ~2; ++ //printk("getch: %d\n", ch); ++ } ++ while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release ++ //printk("getch rel: %d\n", ch); ++ ch &= 0x7f; ++ if (shiftstate) ++ ch = sunkbd_keycode_shifted[ch]; ++ else ++ ch = sunkbd_keycode[ch]; ++ //printk("getch xlate: %d\n", ch); ++ return ch; + } + + void vcon_fini(struct vconterm *t) +diff -ruN proll_18.orig/src/vconsole.h proll-patch10/src/vconsole.h --- proll_18.orig/src/vconsole.h 1999-11-08 00:58:13.000000000 +0000 -+++ proll-patch8/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000 ++++ proll-patch10/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000 @@ -6,6 +6,8 @@ #ifndef VCONSOLE_H #define VCONSOLE_H -- 2.7.4