From 93d66e8a25ae8021cd598f03a75575b613452f0a Mon Sep 17 00:00:00 2001 From: hippoz <10706925-hippoz@users.noreply.gitlab.com> Date: Tue, 11 Jul 2023 20:49:24 +0300 Subject: [PATCH] initial commit --- .gitignore | 1 + a.out | Bin 0 -> 33634 bytes meson.build | 12 ++++ myfile | 1 + src/mach.c | 24 ++++++++ src/mach.h | 44 +++++++++++++++ src/main.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/start.s | 25 +++++++++ src/sys.h | 52 +++++++++++++++++ src/syscall.c | 28 ++++++++++ src/syscall.h | 3 + src/tos.h | 26 +++++++++ 12 files changed, 368 insertions(+) create mode 100644 .gitignore create mode 100644 a.out create mode 100644 meson.build create mode 100644 myfile create mode 100644 src/mach.c create mode 100644 src/mach.h create mode 100644 src/main.c create mode 100644 src/start.s create mode 100644 src/sys.h create mode 100644 src/syscall.c create mode 100644 src/syscall.h create mode 100644 src/tos.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b4f3cb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +builddir/ \ No newline at end of file diff --git a/a.out b/a.out new file mode 100644 index 0000000000000000000000000000000000000000..30df6b5787cb9a52062f1e13193395080a0e464d GIT binary patch literal 33634 zcmc(H34Bvk+V{Ol+6Dv?7O~0}HE4l?DHLegOreEaELxRSP$*rXT1ssb7Hxs_rpqNQ ziwf$D3$8QcHtHyf!&V9u+z_cCI*4_&Bvb}OMraZ8{hxD}+ywOX`|J8kTpw&%)85GmzRh+g1`ATD z-RvKY(JjwmeAzWyUcIEZ4|)a9P9mgU5Pyu53ha(;+X+k>)tBR(oLFji@b2CTC${Zm zt%P!HFc=gPPWV3}a>Si+^_z&Wkr{SJnP1AV+l1_Z;48H!3BLG~4XJiBIywJteEDXf z(>K|kMCA0|@-bn|J}>x2waK)u1s)#|1nXMfl6HYNdsz2}7lT1xf!*$x2p8a54nl}) zP!S|k-&jy9)IuIqnU6|?sjmYMD*?Y|XJEBn`x6WtRQWrAjV%Ho{06kOoB{tr`hB&wa}nEkrCo$nEjn;a;P1+>g7Sz+8`C)>OTN%EuS(DYN0einhf>f%Pjat z^)+MG;31~|KfvR(t1&g13Sf%_-(&U_z%3*nUu+f5^+@&(0*gy24+ zJ4t{IIRVa5L7)PjnXCcwkkwympH7^?x;ERZ36%KvCsPSBckGVAGZk2ACXkRMfT2w4 z5*Q?Lg?T5#nHI-ljJPw2z~*FNP>~=V_mw$-FwU}ZgmXoZvv^06Bz+TMY8gO-aq|V= z{jo&2kYd>wE1u_EQR4Z&?(Fp7cER@$;64@lT@<9VLS4`x1^I^@f;7xK`4s?@X4zBA=3zP- zTqH>Q1hK&+B%fR~3|XFgFlY7fmajrK0oz5eVD1{QY%Jr*YF!0_ zZz&{sFw7E{LZEj7cBxIk1TL80C&X|pwZOf>L@W%$4TuLZ_Q6=$U9I(Soj4&InnW{y z7LQmV`RwAuf-l7iQ>Gw!Qt)9IjE^a9v7==@sB#KYi{P6CbW>szPQYK{M;6#K%kGqQ zB_tnOlpsh)1V{&tNk*$FtRG|#6N8vopKPx~1mE2t8G5eU9b*gbQW2K^UGSA)a>Z&& zz~pUK7HFLHs+64M;lDx8RKm#|=n{f7FM2{=jlu~UqY@<6nHpkj(65fDR|Ma~ASyf* zJp7xqEfJ6#tN;qZ_Y@0ih;3~3g4mgWYDbNv=;frKM{vI7si-D~su`$`f~H1^$4pSI z1|}rSanrK;I$BMXcFV?F<>+>h;sYCHaQ7Fmb~5BHd*Xn1Sh%J1#J`O!k#s>Jspd%x zQSk`AJHTZIqL6}E@GXauO6~Jer*Ms867q^9&a!GHs+Nr-(URlAA5CNtf5f*Cgb6WC z%ZeC@;fo+$MIy{LG*xuGpwObkF^l(ELJ>JVQ>q-(ihM46jx;<7AC)Oty@iRmy-jOiWLJG)Sm4hFRYd&HD5uT8ErMzoYO#Q&~T< ze_%nwH_|Um)LlChGb9YSV-d;QdlylQD4at=GW$!Bi-aI3=J4m4_yU`uCe`AXkk`T% zen+b_e${LB^kuX* z1Dl2GvS^9iLrvTLyj~SDFRhH&z!YX-Is-JkQ8ZjLK1U)WfXfHzA}nAiLkRo ziaA!_LlkQ$BeSfoLw2fVP`%|C11PdaN>L`;mq4Em#25l+hCh?Z1|2NMG?DTtbMW00 z3!7tU9<4ww`y4E>TPec8I6(`U&h(O*S`0tBXrMZSyr^h_qwyRG9}}nv&>}*v#tFjg z8zv1G#8mqnQwVkOOTV4d$($RINl9NsvQyKlj|D|qEVz70!SvhGd0i!*NoNN0RZ2;T z9p6JN;wJq8IUy~8%u;gg71=KPT|wyZ6+hVRBF4=DlWKNXPZU!L|44xe@^m0 zRA^oDv?nVGBeFG6LawLe!OZKv{v{aH@uQ@_oiw=xZovpOZtC>|gN7@R?FAgP>WDvL zQ<0X0Em2vLZ}~ZAb*cT9hBN`nz*Y-ow!P4@7_|`V?@7uNcRDBu3Bv#@j;E1e2U{3* zfYo0`ky#mlg3GKB8SDQA zYLY3ZZL}(9EYIf{y#ExLjIyo7+}P8lOMY1>8Pcw8Q-4P&f0j`@>lJwnOz}+@680t^ zW^xcmeZaZ90|&X28T?xP(Jb=qbk^f^;;bG1(we?{`Qj7Go^+ld!Y%R)`4t+8(d z7%U7O7HDlL%>e+N@C!2#abJ&fhN)4&f?z)S8 z#AYLZRy=0xcUBAuDMdVQwN!i!UQ)#E1_t4D zbzskEi+3H`S=sFBLy+!{@}w!g2c1L^nq2w#HoLOfJTC0UiR|4m15-R%8L+5e2Bi?R zQDqj*JdVC%{cS%(^NRG@95xu6GI~JEcGhHdy{|UeT3%O+j+RGKe0Qc2v+Y%87k7ja zq=H;7a2pGTG8qnX(1S#wrJ@hoEnAoJV$k7kmm+?5Hqa3*00=}W&toh?heifo(>25s zWF8vG3cO2Eko*asr=0y+I^f$S7qFPXewc1!FRxqLfD-;ly|%ofGDp+2e0BB+c>$?4 zum)i`{p`QA`U=!j{z+#iDO(o6&I1!z1C|9YFbYL6xX{&23@))$^w1y!H?ks(jtj)1 zDAS2F!Ij7yh}Bo1*VQG=y8>?^Du=f`ixzn}{J@13RPh*BXARD`@LXVtejqi>)5d{x z*U-?ot3%_kzF0P%42%jJOO0Dk25#2ILn^Kzq4C}H<1O!<3|xTOg|%%v83>>)G$fqV zPr~3q>Si<`y2bkL&CtcT^4U>|X?FFx&OS*0UaxM+|zT!7YB)K#ZEv z;H)0pa*(wU>C}=3n4L1{7958nOp3vQ%SXG0ib0#JzZksH)kh2tAT`FjqM3Ksd(tz= zuv&f+(=%)>E%-LK{D5z3%TatAS`LfB`L1zdu)uYr7<9X?7K0DDchMk_MGw&3@-7Ob z<(AicOEbU=qgd%wKwH*gy+9XH8bfVhf*z>LSq3{(z)_eS+7ofCIifG6-XqBq6Xj*= z2%y<{S#Y~l7p!AvL@xUX9Hi`y=_^eV2o$G9SP^OEVGHn&Cxb!d07E^09s){r=g))X zDu5d5;IF}7aRhVv4M935^uvNG+d*p2bOWrmddtRT zyyq;nOXoeuw&UrtHW)4hIW7d_Y5f-MWp+<1^_PBI*A(6Eu%{`AY(Z>YzU(vLgG%Ul zmf z9Ku7Tp9onWLI#wURkt$WV9<)K%@CA<95y5)hdhvoV~12~xA`nI!pbd++Cwq# zHNjZxW#X3KEbXfcMtk;c2M%ZT2O&s#cH%4}{4;vXRj08sOzd*}^ zlH*um7B-}+37<=6gP&5$bgdvA6~uaz?^ZFme0i7P4yD6=OoAcd?9dY=buEt)cNkhe zLqt*4Yc#dIEABA1yh%ca5!#SpESHa0tgx~&PO)meh=U}ivaVvAp;XtLu)XE1 zCrE-QMVBeEOKdYnHepJbIBvJfunTpYg??uxtS6ichk*HU(h1r=CE+a8%(7z2?C@vx zpZfvgKt7yAmvrtfGQfjY)$Sej%(3Bko*%0b8R+`wHG2}3Z~{tVh1*d=PeBHSSbq&j z7JQrS8_+=8ks^93W2pTJ)=rujehh|Lhja)jMdGsVDv+NH78E6-$JJiigFJ&~R(7OH zMK)r(`l9t8kjvYvJ0hqa;Ud=O#MXrld!dHd-DyP36!1Pp);Sgcwn1>mZv9se8~WTf z*n*WU4DPswGzYlg61I~S#nLHwoOB$i!?FSo7GP*PC!Mmm=#=*_USs2M;q+~LCvFRa zLftWwP}_5~AJt9tB_tm%iS{KYA9BYFo>qS+C+F7ajIGa*Qp|vGw+osW2C1{MBq49N zwrE@MSk;yt{s(P1{iGWxI4={t*?$lChXC#V`P7GkYTOQ~1xLeZ$~ean=;Ff4%+Nu+erI%sih%}Z6IhNNy6TP>ERd2ol1GL z#k(GLUuW9a(8NyZZl~Bb#IpJWG+Vr%;#+KUSXPt0SiB4H%`*I1tkB=$?a2y*Txr zz%~382&_7E*?R<|(&vOM;}yzRjVJSM8@}A-f}1D0I*DyVUG2oSVU~*N=t(#Meu|^S zw&X>(&{QsHx9(Tp!`LPBt_~o;Bt0Mmn!pOmy!1e7;0t0axVPnNA^U<*8^4V|!G9s{ z`iu=W%aUt()v~oSZY5e?5ZjVmPXW25q6NcR)(YY{IxToO2}vK!y=*<3$>i$l$!7b3 zhH*?Efg(VkJ%T9>fg)mEi4ihgmI}txZ5hshK!mj=SiFgh%fXfk5iRV(jvNajj)N=^ zwOVkST{=N*?OZk%8+}3gk5JoT3|yo5Cd<}j=^%emyqLVay|X$&agg1-gXO-Ijl;#h z+HFiwBUY>&v6$1uD%feyPVO1PYX{zbhp?L{1=eH@YqB2ezjhmwLs%&Q!oD^|mxUuSz@rl~_^}jtHau2ejrwJGj-0v`w!U;*%5KYn{0v{|0=2@m~ z&$A3VRdOwrPFrT}2AWf+EuCfVkc~M2ng}{s*k@u{&Q1;>^?2+Ff|iY=Mz6sfWV5{q zmY9Om#rt2yd>T>k#d!2iCQN9gY5t>5Zt-4Vt(_CGo|oDu%faU0HNfMtPd;tw|0$sB zPFrS}`r0@rhR6G*{~&@)#_{}Q^3KvuRHEo%S@j`Qi0LPL2d8TL%$7Ke2@)HQU(_HhxkGR zQ!X8-LY5p%*h}uw53HS#PKpiK!~BE;y~G7z{u5{=0J`J*5_qrGu6xf$-8>1Qu z0f-H!XyNz2aV_wmdjY)xVTMFGe*ieZXAQG82xyO`Vj$AbguU>POhB;!4~iTJ(jOq{ zmG%YesEb_GDBmOE5Q0da=e`P$IApOB;4n0mCXiV|Z4|4?2XaYdZelRc;yq`8s|Dv- zyoD$*(tzBFKl4`bEWfu@Mte$%!>K@)L2)_>mXrz|jzX)GZZ)5fXUZgJF_E6ci(Hu@ z;TJ3^cziClbzat9LTo+x0j|I}bS{gR&hjVuL#fFP?vBJ0@xve89WzK@aUjvW$SrRK znq_08L;T50!BeGuDe`C>9WTJn%d+)W=~HU?Mc}`2R*wmONO|QB%1CZXP2TmpvwZ@n zA0$B?Z)p(OWK3bH zt%~Rwh!x^OPU$W0_o-;P^Xv)9U+3>r*A~U^z)4nvBa9!(|K!#j3_p8O`r`e0d3kvn zxZ$_J>Bt1&m!JxyQN+^`I3Pf4w!S4dAfSaY*&g5XEfthQN*^+*mUa-b+bmm0jl|mE ziidvb*pOXOWnYk+2e~^-`;))0c=ur~3)Thp(BqSqgTW75w*7{+Sy(PG%O3ZCZE|q5 zUoAD|$U4dAQj?EbR=cT!sCV|8H0jIK0Wi#z59UJ}fm!H~3HX!@-Ut{9{UM{T#<_kZ z1;1zT@+>1=Sk?^EK_Y-}3;cq!9E7{LKp_fYW@U5rATeL!$pZojk)T$Kw-?$j3vLS- z2%JL7R@@e{@<;+&wr%X?!qPQ}r3^6YC|MwBeASV#_nMc(go0 zz?RA{=}4Wie(8V#%4L%`9~vO`19T36FqjG4G^>8y3XFrz(Hn?ZY$;t~+b)Fpk&Htb z7+qM$k@))i&=m@a08Qe&3?q>+(m&}xP!Zi^vD&S24M}|@Hj2Eo7T_6&XRQD0BkVxP zvy*0LyBF;&4l_?U$7VJA?*;ktZpHKC`%L(+*|*aZ^CfLtffBHp{kN%2{(~n%1SR?3 zkZX*f?F>fU6kS5lL=c1wizcC+>|Y5QLU|KUtZ#8_#<_)QHHJx# zmdiLQS^YEFyajgM;Ggln73QKjC>2!?yg-wcj=atb17=~99~2F#PJKZbU?FzQ8y&b$bRK>CHXwUb!;~e9JH+gcI+O0mIC61tkSE* z)`ylyOMAra-_}ce>Zvh>8t;)CZPW;H&PPI(;q%&;;E7y5En#n}RAU!VYw+50@SqQh z)0JYviG;m^^pw2_^>pbg%T{cC9HrRxBwJSXLhc~8*(|GPpwr?VjBl~+D$D8-ta>A> zwzGJzV}Z)YmB8ZE0&Vr{p0tMHAzgvGmt6?lvHOJp9jTXz}LB^>PUqx;1h#LY5Y z%jmM6D8y22*;+bk2%^5l`y_^_5bh3?gF>IgWPJ!4xm6;rR|uWElhTaS4q}nD8eE36 zNBGxRgGX-PgoUE?Eu}IHp0O;Rf%2{{TgapRi#ssOVKcG!sr|XS76@=Mu+s;`Fm|hS9KwDH5!(oKfIN!%$qq^@YwQHAj7{EGc0aw0U0V>J7@AJ#hh3|B7OiV$ zNY2u$I5gKb2WTK>0YNASXi8*U`_}4Hv3zadmiaf&R7%7m}ko{!S&c4eKB^jNkQ zj7p?szhV@ExpV}E8V3y9Fr}5|lpeF&QOAk1)!!WxNnZOXn&CAD7Tl!)VonA~apDA4 zG5{t5kiC#Dwi?QA#AFTL%`})ka*ZHh3l_@a4W&mCJ}1HqWp|+0w|O)5BJnqFeuqY( zByD~t9wnrMu1)~)csElO9~@=1`W|C7@jD)s{jaf#jQ1@%Y$Hg2I&59jAGMGK&He&% z0UUU&Y631zK!&m*G9Ak7Bjwp$-Em#Y=wk>NRRkf=^$Ccxc-f&|jopD}u_>mXQff7o zUM+fAD-2g5X(J3!-fLR@GWR#L%}plfBq2czG|g$j(*MwD%k<+|QFh5Q9frgy>afER zWw*Ku-Po;lj<=(ej96^g!#JFa3{rJ#a9VaFo61tV5?&gbMHVqrN?prQSg^u?*lMy= z#6wZQ%9@Z=SM)?(;VfXKzVkQ?+{S;+w|MG5qk5ZA+ie^FIg-ZJ7ck2uZu2|78w=6{ z>9E&e4KwIKGNmr`I_gt)EBdxRW`=awR{sf9={0t07C`b6JX7&xqCv`kExnL$@vdM9 z4hrIKEG!9u2U+!ttxs!sGBGX#c#3r6)i4iaQYc*IZCJ_es7Z;!eXcMfR3*3#8*p@~|f4P>50gMs@YGh`;2p&S>0s{%E z)wI0GHHUD{C7kyHr)xTvKv#ygX5qll;YvW%CL&(JP)qG;n6*MxP+pX2cZ&UGBKDWn z*91OCKTL~OjsU&P#0YG8eG@_;*YYwrceRJ4@ymhM8296w5Y6F=`UA$mS`3m;<&P(P zt;9HPnGFua_k5cis^~2*gwEjmLTF9xBOfFIwT$Jwg!jVEMGzHCwqN28a3(z za>3Gf=nMk^@khC<2X&QhjzdbejfcDHAbudXit|5+Ie;&&?s!jehr^SDLl8_VAahEx zY_*V9lOUvJ+G#wFbCJ|>?q{{|OlyINIXJgZp8KS7%$d9&!?1kQb(*6-d4HJ>iGaL3 zDKHIl$u|d}0B;>R@a7Nhm<~&a4$zg1`=Jb}fxR2g2$@RJ8_Xg)ByQt>0oYjv=1QiH z0jz_<209KNxX8MX^~0}{P71+Y;%?kf+EftzkpSpqCyR%ZGjt@fo+ zn;3fFf_~%+mky&d+c|MDfjM!B%_zYMj&jrGd(gygb&zcPM<4-$Q8+*e-7YON1V1E; z$n19wJ*M-p56YlX7T7WfZmj+orcC)qH`Y|rCjFWsj&6l)=@N`RWj8X+;ND5e`%6a9 zuWKCAVfhfFMf#GRdC(!o0VYeb)_$$&!9BRP-0euIcF@mk7o)=gx^)|plkd%_^4%LtN!G;lk|!I;h*7G3=yfmLT<({*_yo(pU`iX7T>GWL_oVRIPvJHxTl zPZyEs06QB4QCYFS!w%roay-oxaex&ibhC&VhiZY{0RnNw4T0G4?gxN9LHc&d*UoXc zQ9$xT2r!=W--<6N64#JQ1dD^cWPO5mG*sOjz% z&Rv$i)71_X?t-u!^~ybh-*p1;SRU9Y{}))?*gYSraAuNV-N|n59vEioJDr&dv_bRY zjG%%47{~z=4;aredJDkQKqpmvGFBI)f|eDKRXoRidn*%69Ge)7U_7XGLSlkShPxe= z0FXrYJxEcBCRkW}-HC3VALLg`ux1|x>(WVnpBUsVwVzYvqqAR&7x-mYNhgE*`kiNc zL<*i!XmmYHrF*2W#Pi*jMSXyyDXh>R9spvvVK-?%dt3LwF_6(MxDQ7U@zcL11|zpQd8ovb_7joLLflj?&XC7jq#JfIob zcipi*mq)q(q-P(8SD|QlAOrH`Kf#SUL|OWrDw`6EycxcqGGvmFyc3?OR%O$eWp^^M zl5%KXoaEOX@8?oOfn1Gq=jH1WI^PQyaL4{3m}=MF$xyMW{^>KHfmFPj$cFuD7Ia_ z+yN!gOFRdHXAfNu0l{bEpdi`$$z<6e9WLAzFaJ*3FV-E$xZrYSTwDuXh85V&G!>&< zrC}GdHj2Sc`i<#y>{NNSjiw0B4wP^n#qMMA%7p(p@(vO26a(J6#R+%t{|&y1CKh~@ zrV<$nO*nj_Umo`Z#dz~e@}JGITk#Gpk`e#e0u*s9RZs7ISvFFH!=i%UFrRO?s2AQ@ zq4Te+t9MFubxqcGdz6DP9E1J*Dh|T%b|ntNknP}YF?M984CR)aT!{(42+0?hcSM#X zofi17gygp6*JF~?Lc2EcJEOak4%bVrXw-gwvA!OcGPp;%Ac!YTg7_c2Nzf*=JAElQ zen8w{l=mGN*0M*XnRDT-2l@C8Q>o{7>Qq1f#cc!WG}X&)6RyVV7eOrBp&WK!EFFk z2nPKvA3<#x2Djs$G3@7V#u9lzG_44!nbL_doJBZ=?tV=d~dJjF$p1GfV zLQmW54TiCJ`WFeq>G}L)*Db))`NLC==kZ+Ad*|kZcqZQT-v>I3<5qk-d})2kIBvt2 z71I(IjpO#*K5s$YtK+!QYv+7Fy=k1Y=G`T|{(g08=E?64et+FlXf1fRFsB!RnXI`J2X7FD8{=vginx{*jTaMklJ?;8K z&28T%oJl)gvmtrLn118!ZjueHnk2|eXl+nr1P`?9cfPwX!T-~N}7QMPZ!?vtIei?QMRtz zgbzNLIHvGOLBTtxCVslNTXj{F{kD`}uf0ET?LD{sZFJ^$37Knd>pJQCd&cDKylvW? zr+=DM)_U85_f3V*{p*&D)Sq{J|9v1ko8iqzUJfJN@&*^OLT9XwUwBTMkWn_K6YWU9WY#J?Gi)U)|#y zd;92yBL_biwD|T8$?IzJ+g`i_2Hy6@vtGH0JZb?3=nS7!Ej zdf1~^f3rPvZmQ|rpRWFI=EGB>Hu5w3-??B)ednenbMD;JKXK}{k3V+jLqqFcJ-T`C zodtE%Kf0+~BnZ;ZLSL)o+w*9k+56F+Q~cxq(f#MI@0{{{ z?3{m{ysL7`hrO2^c=gynr`+0gK+Z=+KTYZM<AS{qXYw~Koc_;#E0VrD@WS-|i5qr*wdc#}LsNt$ zozHigQ5QF`<@l^|Gkz*Q_fp@)B{N=My~uJ)${RC2zV?;;E&lIj+`6IL&L5w@=AJwD zT>Ia@_$J*mxR;|dH2Mp>Sm6%ZS>DF{xWmYU;lkWqIbY7NBXDhHVn?1Rr+apQ?5QT_eFwjuGjK|j>%Nb>Y+CY4^xy7VKJ8fdDZn|5jwM%2}SdyCb^dgN6J$!CALK0$$3>vt=4vohawr9Mrm&yA>OEAMFj6BKno8_P9Okc5Xm=VIDV-zHe>lADqO%5|Rfyk_RUx4;|_lF1I8mI}#FxB_t#dNlF|(j3FJKIMgvT z$uTr}Sn}W@N%BY%8?VUjIou}D$A~{_dtRwWqin$6i%Ol24hiNjN}YZzLMQRBDs?N$ zQTTgPsdq)0aBNiSc;S%4-jds*)UQLC&Q*3P^&TkG9G@z6qJ{pxRO&Q0{T){7gq!9& zqSR?D;s3W%C;HmsuSKa7eI4-ki&7{0aI?r6aj-`pqK|UUE=rx~BN)3E$_xX?6)%g!pi*=1W;lv}6{ z0b=^tQdTtPx^kDe@Hz~-WbixV7bgR_%=M{c1S9J%D?1-T2dvx}AvDpBX@*ql{7Z;>O^(4TPT z5{yENv;DU_a&xj=S?ZAX%?0^$vj=JQc5+<_p-!&odsmhcubmvXli^p#_HHgB$*I#h zIrGlhB}+^4fL;l?&ZwgAA1GY7xDedRqlf@hvI@Ywil<9+cEQ4uTon(;#Wfd0F_4)` zHph)<4wsg>**!>&^PH(Udx0jGSQ4#@+SpuDtj%L+26bxBsOFM_+}xtjq}O0lFrx}8 z#_|0iPyn+~NAzgUSqRh`1ZUluv+zOpLYJ~WIb$*-hjeZx%L&bq#B{bmo7Kt1?wsvf zs1aptP6mnDkd8d5le6u#4|OEx4WB!7@Sq`iIYSZ?6Nab+4JT|17B12x=ZskqNx}8a z#qPpfm1d3`Mq^5HT_KuoBzfg&jC0)3<^}G8ocu*0kY3G2%!fiP3C-EArA0ctHz^I8 zPWm?I6}a@`idnOBHXEdpe@k;-aqg0$5N$n)60B(<#dc_>Jz%mruak@0X?H*lc@Fw0 zGBU4;WIDPzYeCMiM0KL5W_YwZjk8@QnRJ3OxZNqL4OT(BHqXvolJ6=}XGEZC&M(X^ zaObE><{Ud`7Zw%gFUoS|YI+;oT!N-TZ4&Hjc#^j>DcSWEKX&=J9!B6 z-_X3*0!eNJlB=6#d(d3#y5_tHkVGPvTv!v*4b6)pfd(|Y7P^ayay3VHa+yp{33K%t z=BBg8AwzVH9CsB9RVwNID8}ldp_7}lbN0eQ(t--o3GuX8tM#D)6mJy*o!tDLv%y4| zV)-^&+6-9EOl%30Q5jfkG!`*h7UjW5qm7dMiq^7Mlu4%3tNsRJ2r4()4rbhjVi6a7+sYx4SK1Fd{MPP2q zSBo5VXi5z+e--irT9M^Xw-EXKg2vhUNuP+AlslDQ$mXJxL43~1^~+AtiNkwF%I8WY zJXc5Jrbgz9D(cuvNK|Fa=^3`N6hj^qt;5#TNFiNCX1)YjmJ*g=Hy9<`&QLhHL^INqK-64>#2|+ zPw8x0FS%}9cXc>-rKCNmBW=VPEmz53P^89S)1@8=^Hm5i=^W2y_^eTll`4Ia?3tTF zW8un(-6~`_gOtz8pDSfhFZSrIZzfL~rcfsIDj~_9YQ^ zYSjxXmV%PzqnY|JrUgp9Kx4VPgG1)q@pKFwtFBQ2nl4w%5M(1zpJC>vUiTt@z zsZIxZYKV#Dda7uRuWMv;QCqaK&A6wLrLZd8{0I&bwKaxwG-;f~HEDKhYNBjX9p1A^ zJsII*n~F7fPF<1ker8i>y-jKg?E+|J)7-%p?QNWmT3&&>L`xqdqqOxDmTGlk-3;ba z3URiW>ll`zkj)Db?1c@}kabg+KU>Tzjk77kx&jpD@r(%MAu6paB8U*0X6t1b7m~9r zBM4j-~}_bL^>-ht#t9)FQ22 zla#H)cZ?y*tW>~AXH5;~2sWZZIzk*Jh4_rs(V|TRTL~=&dM2D9CafXCL&VxFCmLsG z&(9*osq;n#alT18lCxQFfr??mzXNOv0ncd!oSasws52wfX=@r(l9i{qgh@3foM43H zU~al!9j{|pOYUr)r!>ySG&-Wf!?mrmnNh1@DR!_W|`5F-$vRcu5mU}@9f+{ z+NY@mM#?TEjxN(0XXoo6_e6+dL%1l$>9bT;MjM}<4LtzWuVYAx8aM`ZOgw+*f z&C|_hj)1t>ID2kZjt(GF7SXC6!&IS@zkbcIa=lam=o6~gtVVg~t9FJ{f!0&MmG9B7 zqvek---|73WJe}y*B?a}&Gk`-aGgW(Ja&1byoXUcBk}23?8Mnruq$2`AJEb8WTSj; zr6P|sAWqxEkW1*64|8a>38(XV71fo}X}VrV=b1)|60U`M65_&)itV>tO7yZ_XKEx+ z*FqYmQWSg1fDk&{buDa!ZlMZyW8iOszEoWL#njfL0~=eY8+_?pg}TXlRfsO$8tBQ%~vX5;~z*sj30-T(BofhH5s2XUcc5yT1;rG3;$Agw>?KRD#r&3 z@%)-_UGS4b_N2=$XkpRiWqhVSEa{TTa0%V`zbc`&>^u(Mfm!_(nq<= z*6TfzKm>TC-@(;#L-J8=3K&i)xs|O~;0($Ax7R^)Q;|wcXjJb(zvJ? zt!%TcJhLP#N3*y{%~?-{4xZGE&u07a%#sqfdN0gHjxno%Bo$@2?fQ{tmgKk=YBv`V z;eZpGvIndDWHx0ds^yHP>>+A7wJBRU2XbP#dN#iQ9NpqrEP1*Cc zm_E75ot;&p^-XUo$)Bg~G?1NX6k&&}5;3Otbc{=%NU5j%r$vuXb{YP4n~B14=Hw3CyW9 zr#9t;j!bZj;0{T>X)l3obN}Y6QlLmoJj@pb9og57sd71`e!?{D2Mh7k! z)FHOS*=O>K3l|n^vxldtw!|mT_HEGt%=0s*GH*=T(M0E9u{j?2QT)cjUqs8@`~JLg!84 z!D*0+;EIX!g@{Xjt&v^?Q$CkyS#?KS@<)yNB|6ARCUEPZBH>OcVZt`z+D3Y}?0-Z) zA`Qs@2qZA6$jJotX->GTw3lM8SXQ5eWHsWijqKe4m7&O(VGYT^96AOHqc~Ub8r#SR z8w+yq9)gN1(ueKgMqv%%GoQ-IEpTONE0~7gHmbgH!NMF(-jU?}7ESpY5#cg)sI*`RNLpitvYj5igrpJ}?xMCa0)ucD{x(c_kh5~yoncbQ1u^_<0WBmbXqraQxS?#GR^{GybKen|v(zjGta=}*yg zCyHkMm8G5wE64sxM>du2av)`XBYP!LB_UD}h{(U;_oLMz`Z$uZxN$aK^-{a^*o-r3 zqh8>j_#@pARbrnIp;KgVUKQ8P+Aa{#~zobZ}H~9+wdE?rYr+H7bX!7!p^4_WF z8S6v23e(YlEBR{tSH;)x>+vmRicwzv34@oYzrz;;63|=A*S0I?*YP6YeZ1J~DPH2G z0v}%$wQqtqMjH1vUuE#NBe+L8m-DMsIHPyEkN<=(ALlhl#uqX2C7KN^uTSxem9F*~ zBz~PyggC1Bsw@bXYw`f`eEH6cgrq%pYQNE}O{;$C30p35QypiHH?Lbcrze?$;0)`5{ zI%b_9njSOw3?8LdG!ZRNMM-9Y@bKmMtKn;mUSkzs*|VbS>*FiTFcf2LR2BNFf#Xro z^|I*^zFes24vc(-VLkqXhI!HaD4;4Z-e;`jt5JS2t%|QUddA|L_XyPn&%{Rz(CE18 z6t5tm4K^{Z91<+&sjX^iHD7M7fr!h8 zJwFc;X%BIm$mGlCd;8=20k0iqc6%-Gd3Z6^6J5@iPw?DSJI`}16bMs>S{Hjqpl^zI zR#g;&Ri=0J+Ie2$dCjUQ3A|Neu5!K-y7Nw`g07_7DlIFc9zknFyQwn9%M60TCLK*Z7O+Cs#!#|Et@T6fqdPKzfRV*;z*`9P!!><`v8C8Wq zPzf%o2^X9D8R+K`dj)DM`E?!F0xy-Tu3a~EH!t=ei;(|7C+uS-xj*korE)b&8Ql98b|b?v;x8_@fV0rZ3Cs+ebBOBJ99`hgF; z$cyRThajaWwy4xswxiIzgO^OAsg_?2&0KtC6@tizq@$Ns!G`{XCE-t~{rVzvx(eP< z1wDIB6%=BiJ1=i6Hc0Y<|&d5n^wBBeY^c@p%pwJ{W3 zR`MR8S_x#eXywxWe!~Wsb~%LpoI#?NLLZUy*eVDFD+<`Igb-_}C%=lEkb0k52@`lT zMKb)^uqt{D;9dvDxB0)qsaNsjnqC;fUr~pf^R;6UZ-C`#wAMluQW{nm<9djmTxcC; zKzxd-?joT^&Ol3lCI4(nB?5#Gim1AWl>TUn7%lNn@Rd>CVg!+~l~dnL@lLHw@lM}} zSs3Lt%-9#df%+<sx)tuHv{XYS{FPw zAcSh8-v=ZG3`)$NH&r4K!pQN5aABZz<-)}ZNRu4xIatAa(DE8QU!F%{4z7>TSpoa1 zXFBhbf6$ZHkgoh z1=_1IyBBa(CO{((MFvL}u(|@l9WqIyZ1OpScRUsq6aLWm>jt)D@Z)GgkvGZ@0m0R4 z6tR9+7(7PuO)p%&lIOABLjm&;<}nX46VQpE&z>wCM1wgwDiE*-24cAJUOm>D2Lwt)$#T9U`KqCkzm4)K3@V@jlEH*tn4K4CZbUr7 z#P?MhD$FcJA1p#jUIQ)P@Y->;(Q>I4B`mHfXoWP$)1~OD?3J(wSTy^O;sIHYoQmagic) { + case A_MAGIC: return "68020"; + case I_MAGIC: return "intel 386"; + case J_MAGIC: return "intel 960 (retired)"; + case K_MAGIC: return "sparc"; + case V_MAGIC: return "mips 3000 BE"; + case X_MAGIC: return "att dsp 3210 (retired)"; + case M_MAGIC: return "mips 4000 BE"; + case D_MAGIC: return "amd 29000 (retired)"; + case E_MAGIC: return "arm"; + case Q_MAGIC: return "powerpc"; + case N_MAGIC: return "mips 4000 LE"; + case L_MAGIC: return "dec alpha (retired)"; + case P_MAGIC: return "mips 3000 LE"; + case U_MAGIC: return "sparc64"; + case S_MAGIC: return "amd64"; + case T_MAGIC: return "powerpc64"; + case R_MAGIC: return "arm64"; + default: return "[unsupported]"; + } +} diff --git a/src/mach.h b/src/mach.h new file mode 100644 index 0000000..2bbf1d1 --- /dev/null +++ b/src/mach.h @@ -0,0 +1,44 @@ +#ifndef _MACH_H +#define _MACH_H + +#include + +typedef struct Exec { + int32_t magic; /* magic number */ + int32_t text; /* size of text segment */ + int32_t data; /* size of initialized data */ + int32_t bss; /* size of uninitialized data */ + int32_t syms; /* size of symbol table */ + int32_t entry32; /* entry point */ + int32_t spsz; /* size of pc/sp offset table */ + int32_t pcsz; /* size of pc/line number table */ + int64_t entry; /* entry point for HDR_MAGIC */ +} __attribute__((__packed__)) Exec; + +const static int exec_field_count = sizeof(Exec) / sizeof(int32_t); + +#define HDR_MAGIC 0x00008000 /* header expansion */ + +#define _MAGIC(f, b) ((f)|((((4*(b))+0)*(b))+7)) +#define A_MAGIC _MAGIC(0, 8) /* 68020 */ +#define I_MAGIC _MAGIC(0, 11) /* intel 386 */ +#define J_MAGIC _MAGIC(0, 12) /* intel 960 (retired) */ +#define K_MAGIC _MAGIC(0, 13) /* sparc */ +#define V_MAGIC _MAGIC(0, 16) /* mips 3000 BE */ +#define X_MAGIC _MAGIC(0, 17) /* att dsp 3210 (retired) */ +#define M_MAGIC _MAGIC(0, 18) /* mips 4000 BE */ +#define D_MAGIC _MAGIC(0, 19) /* amd 29000 (retired) */ +#define E_MAGIC _MAGIC(0, 20) /* arm */ +#define Q_MAGIC _MAGIC(0, 21) /* powerpc */ +#define N_MAGIC _MAGIC(0, 22) /* mips 4000 LE */ +#define L_MAGIC _MAGIC(0, 23) /* dec alpha (retired) */ +#define P_MAGIC _MAGIC(0, 24) /* mips 3000 LE */ +#define U_MAGIC _MAGIC(0, 25) /* sparc64 */ +#define S_MAGIC _MAGIC(HDR_MAGIC, 26) /* amd64 */ +#define T_MAGIC _MAGIC(HDR_MAGIC, 27) /* powerpc64 */ +#define R_MAGIC _MAGIC(HDR_MAGIC, 28) /* arm64 */ + + +const char *exec_magic_str(Exec *exec); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..d5372c4 --- /dev/null +++ b/src/main.c @@ -0,0 +1,152 @@ +#include "syscall.h" +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mach.h" +#include "tos.h" +#include "sys.h" + +#define ALIGN(v, a) (((v) + (a) - 1) & ~((a) - 1)) +#define DONE_ERR(M_err, M_ret) do { fprintf(stderr, (M_err)); defer_status = (M_ret); goto done; } while(0) + +static char sud_intercept = SYSCALL_DISPATCH_FILTER_ALLOW; + + +extern void start(uintptr_t entry, Tos* tos, int argc, char **argv); +void enter(uintptr_t entry, int argc, char **argv) +{ + Tos tos; + tos.pid = getpid(); + printf("jump to entry 0x%"PRIxPTR"\n", entry); + sud_intercept = SYSCALL_DISPATCH_FILTER_BLOCK; + start(entry, &tos, argc, argv); +} + +void handle_sigsys(int sig, siginfo_t *info, void *ptr) +{ + ucontext_t *uc = ptr; + mcontext_t *mc = &uc->uc_mcontext; + greg_t *gregs = mc->gregs; + + int64_t ret = -1; + int64_t *sp = (int64_t *)gregs[REG_RSP]; + int64_t syscall = gregs[REG_RBP]; + + printf("syscall %ld\n", syscall); + + switch (syscall) { + case OPEN: + ret = sys$open((char *)sp[1], (int)sp[2]); + break; + } + + gregs[REG_RAX] = ret; +} + +int findlibc(struct dl_phdr_info *info, size_t size, void *ptr) +{ + const Elf64_Phdr *p; + uintptr_t offset, length, libc; + + libc = (uintptr_t)read; /* arbitrary function used to identify libc text segment */ + for (p = info->dlpi_phdr; p < info->dlpi_phdr + info->dlpi_phnum; ++p) { + if (p->p_type != PT_LOAD || !(p->p_flags & PF_X)) + continue; + offset = info->dlpi_addr + p->p_vaddr; + length = p->p_memsz; + if (offset < libc && libc - offset < length) { + if (prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, offset, length, &sud_intercept) != 0) { + perror("prctl PR_SET_SYSCALL_USER_DISPATCH"); + exit(1); + } + return 1; + } + } + return 0; +} + +static char *program_argv[] = { + "out", + "../myfile", + NULL +}; + +int main() +{ + int defer_status = 0; + void *file_segments = NULL; + FILE *f = NULL; + Exec header = {0}; + size_t text_addr = 0x200000; + size_t data_addr; + + f = fopen("../a.out", "rb"); + + if (fread(&header, 1, sizeof(header), f) != sizeof(header)) { + DONE_ERR("failed to read file header\n", 1); + } + + // header fields are big-endian + int32_t *buf = (int32_t*)&header; + for (int i = 0; i < exec_field_count; i++) { + buf[i] = ntohl(buf[i]); + } + + printf("load %s binary with entry 0x%"PRIxPTR"\n", exec_magic_str(&header), (uintptr_t)header.entry); + + data_addr = ALIGN(text_addr + header.text, 0x200000); + + size_t segments_size = sizeof(Exec) + header.text + header.data; + file_segments = malloc(segments_size); + if (!file_segments) { + defer_status = 1; + goto done; + } + if (fread(file_segments, 1, segments_size, f) != segments_size) { + DONE_ERR("failed to read file header and segments\n", 1); + } + + void *text_segment = mmap((void*)text_addr, header.text, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (!text_segment) { + DONE_ERR("failed to map text segment into memory\n", 1); + } + printf("mapped text segment at 0x%"PRIxPTR"\n", (uintptr_t)text_segment); + + void *data_segment = mmap((void*)data_addr, header.data + header.bss, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (!text_segment) { + DONE_ERR("failed to map data segment into memory\n", 1); + } + printf("mapped data segment at 0x%"PRIxPTR"\n", (uintptr_t)data_segment); + + memcpy(text_segment, file_segments, header.text); + memcpy(data_segment, file_segments + sizeof(Exec) + header.text, header.data); + + if (dl_iterate_phdr(findlibc, NULL) != 1) { + DONE_ERR("failed to find libc and enable SUD\n", 1); + } + + struct sigaction sa = { + .sa_sigaction = handle_sigsys, + .sa_flags = SA_SIGINFO + }; + sigaction(SIGSYS, &sa, NULL); + + enter(header.entry32, 2, program_argv); +done: + free(file_segments); + fclose(f); + return defer_status; +} \ No newline at end of file diff --git a/src/start.s b/src/start.s new file mode 100644 index 0000000..2ec14cf --- /dev/null +++ b/src/start.s @@ -0,0 +1,25 @@ +/* Thanks: https://git.sr.ht/~mcf/nine/tree/main/item/start.s */ + +/* SPDX-License-Identifier: Unlicense */ +.text +.globl start +start: + mov %rdi, %rbp /* entry */ + mov %rsi, %rax /* _tos */ + mov %rdx, %rbx /* argc */ + mov %rcx, %rsi /* argv */ + + /* push argv onto stack */ + mov %rbx, %rcx + add $1, %rcx + sal $3, %rcx + sub %rcx, %rsp + mov %rsp, %rdi + rep movsb + + /* push argc onto stack */ + push %rbx + + jmp *%rbp + +.section .note.GNU-stack,"",@progbits diff --git a/src/sys.h b/src/sys.h new file mode 100644 index 0000000..8b7f97d --- /dev/null +++ b/src/sys.h @@ -0,0 +1,52 @@ +#define SYSR1 0 +#define _ERRSTR 1 +#define BIND 2 +#define CHDIR 3 +#define CLOSE 4 +#define DUP 5 +#define ALARM 6 +#define EXEC 7 +#define EXITS 8 +#define _FSESSION 9 +#define FAUTH 10 +#define _FSTAT 11 +#define SEGBRK 12 +#define _MOUNT 13 +#define OPEN 14 +#define _READ 15 +#define OSEEK 16 +#define SLEEP 17 +#define _STAT 18 +#define RFORK 19 +#define _WRITE 20 +#define PIPE 21 +#define CREATE 22 +#define FD2PATH 23 +#define BRK_ 24 +#define REMOVE 25 +#define _WSTAT 26 +#define _FWSTAT 27 +#define NOTIFY 28 +#define NOTED 29 +#define SEGATTACH 30 +#define SEGDETACH 31 +#define SEGFREE 32 +#define SEGFLUSH 33 +#define RENDEZVOUS 34 +#define UNMOUNT 35 +#define _WAIT 36 +#define SEMACQUIRE 37 +#define SEMRELEASE 38 +#define SEEK 39 +#define FVERSION 40 +#define ERRSTR 41 +#define STAT 42 +#define FSTAT 43 +#define WSTAT 44 +#define FWSTAT 45 +#define MOUNT 46 +#define AWAIT 47 +#define PREAD 50 +#define PWRITE 51 +#define TSEMACQUIRE 52 +#define _NSEC 53 diff --git a/src/syscall.c b/src/syscall.c new file mode 100644 index 0000000..1809b22 --- /dev/null +++ b/src/syscall.c @@ -0,0 +1,28 @@ +#define _GNU_SOURCE +#include +#include +#include +#include "syscall.h" + +static int mode_open(char *name, int mode, int perm, int flag) +{ + switch (mode & 3) { + case 0: flag |= O_RDONLY; break; + case 1: flag |= O_WRONLY; break; + case 2: flag |= O_RDWR; break; + case 3: flag |= O_PATH; break; + } + if (mode & 16) + flag |= O_TRUNC; + if (mode & 32) + flag |= O_CLOEXEC; + return open(name, flag, perm); +} + + +int sys$open(char *path, int mode) +{ + printf("sys$open(0x%"PRIxPTR", %d)\n", (uintptr_t)path, mode); + + return mode_open(path, mode, 0, 0); +} diff --git a/src/syscall.h b/src/syscall.h new file mode 100644 index 0000000..188cc81 --- /dev/null +++ b/src/syscall.h @@ -0,0 +1,3 @@ +#pragma once + +int sys$open(char *path, int mode); diff --git a/src/tos.h b/src/tos.h new file mode 100644 index 0000000..023f2be --- /dev/null +++ b/src/tos.h @@ -0,0 +1,26 @@ +/* Thanks: https://git.sr.ht/~mcf/nine/tree/main/item/tos.h */ + +#include + +typedef struct Tos Tos; +typedef struct Plink Plink; + +struct Tos { + struct /* Per process profiling */ + { + Plink *pp; /* known to be 0(ptr) */ + Plink *next; /* known to be 4(ptr) */ + Plink *last; + Plink *first; + uint32_t pid; + uint32_t what; + } prof; + uint64_t cyclefreq; /* cycle clock frequency if there is one, 0 otherwise */ + int64_t kcycles; /* cycles spent in kernel */ + int64_t pcycles; /* cycles spent in process (kernel + user) */ + uint32_t pid; /* might as well put the pid here */ + uint32_t clock; + /* top of stack is here */ +}; + +extern Tos *_tos;