TNEG
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
E0Y^VZGynhq
literal 0
HcmV?d00001
diff --git a/boot/config.txt b/boot/config.txt
new file mode 100644
index 0000000..9a1ce2d
--- /dev/null
+++ b/boot/config.txt
@@ -0,0 +1,9 @@
+arm_64bit=1
+enable_uart=1
+# disable_l2cache=1
+
+[pi4]
+device_tree=
+enable_gic=0
+core_freq_min=250
+armstub=armstub8-rpi4.bin
diff --git a/boot/fixup.dat b/boot/fixup.dat
new file mode 100644
index 0000000000000000000000000000000000000000..5018e6926902f70369aee6e7a1540272cf7ef053
GIT binary patch
literal 7311
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
W!nKP6o}iCakI*;2%8Y{3Z^K^|HOox^
literal 0
HcmV?d00001
diff --git a/boot/fixup4cd.dat b/boot/fixup4cd.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b55ac8dd800b35cf6e3386ffe6f9963bf0fcdf50
GIT binary patch
literal 3183
zcmdT`-D?v;5TD6pvb|o@Yb>E?h-uLhL`o^eN+~U9lp5C{n=)WNN0e$t^2mcFSL_`Ha1fAW>?QN1vlcM!wHkcQVf#LO;GIz^4eAzWsQG;qmq1P7|#?P>c%*I8xP%#fbr^!tJ8~D++)Cz?Z%z
zpijn&%My`{8R_q)z+j=layrCcUjRP4hs^kDALMdG+1w6gWO{Mhvul&}45XYK&eEv`
zqQD;t88>O1l=78GZA7rA#^^_7>Ev0WQOZVMYGcKv2-n9loe?xjcslkzGo%_C9Tv(M
zk=D96VkPOCxrP(n+b?RtgS}2bk*)g??_{=}e>d6HgJgAGdzp7rFm0a$d^Dg}&qQXE
z8Sf9}fUUiZi0iQb+L4yPmBunfE3ZtQ;_+x0brI4KPl
zoQn%U47xt#(VQpz&OpA2r^Gow?+ucYrj0uimKpzI!!L5~7wL#p!KFNvv&@RsBvtY{
zNcy!$HY;BSu>^!wAC#I=Y~F;$*kqA!Q3!Bdj(9iK_#u8xX^LLtPGmOR%BVgUJI>``
zMP#)d4|^KQrcTqZ;RZ4F;>ID0gY?1H?omX%I3#F>eTmRthm5NAQ^@3x7}!?ApDG
zc&*1ANM0m`XnX$e(Q7Dy=psAOD(7ppt?)?EHDWrx%|Jj3*GLb~ogyHdYpx5|YVa*x
zw6Wl(WLTd*v|-GZXfX*RE9?#TL#UWaDsSVXtG_~F5znO{-=$39)=R*v47k3G_;Ctw
RH4XSpKBYh1Na5B)_zCg8jCKG3
literal 0
HcmV?d00001
diff --git a/boot/fixup_cd.dat b/boot/fixup_cd.dat
new file mode 100644
index 0000000000000000000000000000000000000000..b55ac8dd800b35cf6e3386ffe6f9963bf0fcdf50
GIT binary patch
literal 3183
zcmdT`-D?v;5TD6pvb|o@Yb>E?h-uLhL`o^eN+~U9lp5C{n=)WNN0e$t^2mcFSL_`Ha1fAW>?QN1vlcM!wHkcQVf#LO;GIz^4eAzWsQG;qmq1P7|#?P>c%*I8xP%#fbr^!tJ8~D++)Cz?Z%z
zpijn&%My`{8R_q)z+j=layrCcUjRP4hs^kDALMdG+1w6gWO{Mhvul&}45XYK&eEv`
zqQD;t88>O1l=78GZA7rA#^^_7>Ev0WQOZVMYGcKv2-n9loe?xjcslkzGo%_C9Tv(M
zk=D96VkPOCxrP(n+b?RtgS}2bk*)g??_{=}e>d6HgJgAGdzp7rFm0a$d^Dg}&qQXE
z8Sf9}fUUiZi0iQb+L4yPmBunfE3ZtQ;_+x0brI4KPl
zoQn%U47xt#(VQpz&OpA2r^Gow?+ucYrj0uimKpzI!!L5~7wL#p!KFNvv&@RsBvtY{
zNcy!$HY;BSu>^!wAC#I=Y~F;$*kqA!Q3!Bdj(9iK_#u8xX^LLtPGmOR%BVgUJI>``
zMP#)d4|^KQrcTqZ;RZ4F;>ID0gY?1H?omX%I3#F>eTmRthm5NAQ^@3x7}!?ApDG
zc&*1ANM0m`XnX$e(Q7Dy=psAOD(7ppt?)?EHDWrx%|Jj3*GLb~ogyHdYpx5|YVa*x
zw6Wl(WLTd*v|-GZXfX*RE9?#TL#UWaDsSVXtG_~F5znO{-=$39)=R*v47k3G_;Ctw
RH4XSpKBYh1Na5B)_zCg8jCKG3
literal 0
HcmV?d00001
diff --git a/boot/generate-image.py b/boot/generate-image.py
new file mode 100755
index 0000000..6870d63
--- /dev/null
+++ b/boot/generate-image.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+
+# TODO: generate filesystem image.
+
+from os import system
+from pathlib import Path
+from argparse import ArgumentParser
+
+def sh(command):
+ print(f'> {command}')
+ assert system(command) == 0
+
+sector_size = 512
+n_sectors = 256 * 1024
+boot_offset = 2048
+n_boot_sectors = 128 * 1024
+filesystem_offset = boot_offset + n_boot_sectors
+n_filesystem_sectors = n_sectors - filesystem_offset
+
+def generate_boot_image(target, files):
+ sh(f'dd if=/dev/zero of={target} seek={n_boot_sectors - 1} bs={sector_size} count=1')
+
+ # "-F 32" specifies FAT32.
+ # "-s 1" specifies one sector per cluster so that we can create a smaller one.
+ sh(f'mkfs.vfat -F 32 -s 1 {target}')
+
+ # copy files into boot partition.
+ for file in files:
+ sh(f'mcopy -i {target} {file} ::{Path(file).name};')
+
+def generate_fs_image(target, files):
+ sh(f'cc ../src/user/mkfs/main.c -o ../build/mkfs -I../src/')
+ file_list=""
+ for file in files:
+ file_list = file_list + "../build/src/user/" + str(file) + ' '
+ print(file_list)
+ sh(f'../build/mkfs {target} {file_list}')
+
+def generate_sd_image(target, boot_image, fs_image):
+ sh(f'dd if=/dev/zero of={target} seek={n_sectors - 1} bs={sector_size} count=1')
+
+ boot_line = f'{boot_offset}, {n_boot_sectors * sector_size // 1024}K, c,'
+ filesystem_line = f'{filesystem_offset}, {n_filesystem_sectors * sector_size // 1024}K, L,'
+ sh(f'printf "{boot_line}\\n{filesystem_line}\\n" | sfdisk {target}')
+
+ sh(f'dd if={boot_image} of={target} seek={boot_offset} conv=notrunc')
+ sh(f'dd if={fs_image} of={target} seek={filesystem_offset} conv=notrunc')
+
+if __name__ == '__main__':
+ parser = ArgumentParser()
+ parser.add_argument('root')
+ parser.add_argument('files', nargs=14)
+ parser.add_argument('user_files', nargs='*')
+
+ args = parser.parse_args()
+
+ boot_image = f'{args.root}/boot.img'
+ sd_image = f'{args.root}/sd.img'
+ fs_image = f'{args.root}/fs.img'
+
+ generate_boot_image(boot_image, args.files)
+ generate_fs_image(fs_image, args.user_files)
+ generate_sd_image(sd_image, boot_image, fs_image)
diff --git a/boot/start.elf b/boot/start.elf
new file mode 100644
index 0000000000000000000000000000000000000000..3477828862317e1c2327c48f0e38bfcc5ee316ec
GIT binary patch
literal 2955648
zcmeEv3w#vSz5j1^W?vyBn+Ifg?uG;sEJ_HmMoa7D1u>Gc0t#|z9T72ZlR&^K#R#(`
z1Qab%(dgCEkb*UO+Xjkldet(!8_>2^a(nx*_pfDDSXV#R1_&4}u>bFw-E{*2R0uDb
zXcegT1;
z`g+(fn8*an5eCU`1TYfe%oqT}920J4ek@FV-7=Jj8J5HWgRF=~!DOom%=G+XG%>@%
zB^WLIPos(6*qgviCj6LTRdT?va0%fO!kFnf$P+UxT#AOjI+mo@-%nsB6@JY0PA?-|
zMi?{s2xF#qcr(JA5yp&&FlKs(s|Z&S#>{YpG1EKTk8nT2m`O#2ndu!)zaLA~`F;X3
zoe2P8dWZYpK>B|mJxnJ8nCTs^zJ>DNMfotV4IyHtcmFqkjQSrz{b5iwqJbv}kNY5@
z8RoXZJTcQdy(8gra-{z=ftgAqXQp>}Gs2q@#*FqstjC2XBK$Ih!?5DX(l=bq{bvF*
zEO_oxNy}dX%)W0k(vt)D17m}mncn5A2zMZinKux|Of(#z{&$J=z%_d>@&BVc5xGk^gRCkJbh=vrqGTrZQe}S
znZV5Hq`i>R_(^>3heTEMoI>R0eV9F;TSlDQ>f@eUKuOCuH?P9)`Vp!`BUBIlKrMpt
zS-9t>A{GmKQ{{HibJLM-I+5zO7@jMnp(>dRF%Pqu_;dc)q6G63%=15C^EuX|W~}*@
z|Mn&bhrJ1Y)NPf>1#=vHT>e3CW`L{;jYRV9T)MU`wz~
zum#u#EWa!#UZf30#((i-U^S!-E~71|)RCN|^7egRT1Rqn3n?j^Y28*er73qat+uW0
z>6k-tTCC@#_`MH2ZjvnW`pq=!F__0;nqY2hBkra)GR$ft-YlOqbp0Z#6%~Q5LZLPmUT)PY94&FQT
zF_V<0l}_?wE!6&4^Ppe9u$i{o)_&SKNR`ZkVbWmcP&n4(EnNF!Ed$$M&}=L0fp8mP
zTibsH`>_^7`{ONffDQ1AgWCjm0^BCJ69Dt@GXrM!0N7^OiLeJCPGb8ULhrZH^5jB?
zbq;YdTw7?lu}z|)&1BB73Y#gdsEqY@lDlUXVz^d{b7(VflFf1*ViawWsCESJ`gBB|
zG^2Xva=~Tt@;PR2UH(4zJ~i7iHhqt3xoWR!y|&q7%pzBVSW)tWl5FeP2_%o^keJY%XTn&c_ctiq+z+GbPQlr1Z$
ze#Cp*+@X8zaeJpCk7b3e@lTbkE_@!LgV+A+&x6*!=P$my81*BSvlMSp=>Lsi`IF3}
zgq-r!wMTZKy)yGNqAsMh>?gccBH6Te*%Kz|*Rs<1n8CF7hk(t%2&M6dhC*5K6{Z!a
zG>v|8IPqPzD2;bLBsx5$W~K2x;`bIJZUS_Z!b
z{TIg6WVDXq<>0l4JDTOtk2f9-{a6Tve*EFl$7NXx{rE|^pM&`n=AEO5+#jpV_lHNr
z7;JD^M5V>-T-%c9Y%5f%ue1*cQlqjwJ}BUKV9wwv-Vb;Lh&){0i
zefQtDqI_NXkIQ#k8%_{m3z-pJbTRGZpu~*(FCe7n2|DPCbOSlcAQ2(U0M>{xq
z0?%pXCtF4>CYQlmXiElGk>@cXPJ{o&TiSxW
zHE8K_EPu=z7mSC!$+~$9M~_*XEYDiZZre2{>3YeJBVCHG4$i#9Yst#RV?Ib!;1*vFy@p-D=p+%tgV1~
z4JOw&L?K8lUl%VHS_&~@hok1{R)f|yPG%5mErZf6Nz&WfaI!e6%1*G)Oi{Y5XqW0U~F~
zuuLdNJy^@pQa;);*Ha8vw0v#WWDBR&JPffKhavWb!jParb0`OC!m!N(67CD<;OLcZ
z4)NO8$hC0jH-pn)H%!mfYRASrzLo3#5z>}?GL3Z9(ueG8!B6`}#TPBgIE>OM3Zx)??~<`_a`~3}nW>z>Iyt!q4h)|7Z0OMutZis|CL4KCBuR_T5;`KE5rW
z%2(Y{SYerb_uXYjMzFr*f?am3>z0gkhjj>6WD3R;!&2lDB!_=F2mE_dOoE#O)?&mk
zKP@z#LBUWcbZs>5gmA3Nqap>B6Qo`9S=tAWNz3B)PD|wAIm{&X>bzxmuDH$CfL$RGF4(n
z
zRY6Zn2F#_?ms`5>6*s@8%i&je>F$EN_dn3%A;hH0deQb8N4!1#H5=LBN{YCW$N^V!
z#Fb1raHT|CDI~#_8gZqP6RtrK*C3MN8XR#ArbTe2MO2e$9AVsrn_##7EiMr5tD*BEK{_Gz}*WJ4Z_djshgWi>+yM#=`
z2sLh&s9L8DS1nV9spe}(s-~+Z@FZWeiFP?);)vV(50qzUyNs~2*i4CnVw6(chp*==
za-=!b%u8D?qk$t#d)pZYrkSp?N$FCqR3y!m7U27!1{Ds&P_!kER)Ur?szd*V_F#X^
z-D9&fdkV~~B@Bn~^EqqfLf^NijjI0I+(KXBl&?8ot$kaaehcSL
z^I~mknJpSJCtN+@nhD=B)J&LE;JYO)d13B1CVVqVo^Z9HrBpOj-6u}C=52KMm}k;P
z#k^Z@mEy3!x@*)*_)2b^;qsciQ7!ZH
zx%BjwZTYrgi!EHn%0;=07i;~pTujFo2i`=!d*ZNB42rtsX;%)boFqQ9Z5(}DbuJW#
zahvF#cYtL=X}VNvw-+X?>AA<_DP2+MD_!wzpL4~!dskNfuzKCRk%i+6|5cbUY~b@#
zsbD9!qHw2S#WY{(!UW&sg$tLyJ!}80fy1iWLMv)&7uVjpgG-#Z!;rRR+16z>)r+g+
zhK(ry*ABzNX;)3lpLX@MYq-m5tO>&gR9@#TF1;D+rUO`kF$An0ZXIh_MsdTUUpr8WhRhFwQ_Z4BpH43*fMEY7v&T1K%ksQHFh+3+a0S>W62
zua%ES57F~;DLe+_w01pjxm_)~Wiv+WW>4w(%^v6Y&DKx1n`jR8{WaoS88Ko@dJ610a~vOpLKx?s@0#Nl(tUB|D)Q!m84Nqz)ozSP>@#f)
zAELQrAjG825aBta!V;b}g20JH;6@ZLz8qHc!iPJ64|jy|q4FfyFr4AS9Z_5`U{)A~
z@Be+vJhfze%lm6cAhG6IZ7#WAvU-cBXsd;i76BDMIwHQcfrr3e-P>&NmZ!cpe;d3eh3vM$78
z9*<+uuX}nJvuwh}hBIUNUIXqpaI-ZYcEKVL4EhCna;bd=&Ow{o6
zsQ7)*fD9|67zr+qVGf~;Q_i8>7l^^|bBTtZT(A+l4^ZE$LaJP??VSP9y-GEs`6%1J
zJh%ETIpd~0>x2n8;6H5P6Qy6U5wF@*Lz+n)`LS6Yw%ei(f6uCluf(Y%{7J6*sGH|WY;Gzs1~+A%z;rF@8d{jJ8`a(yeg%?mZU)*K*<{91(c#eK0v7&
z)B$La2JHYeSc7%~O4FcM0Ers(Dxe`6^gBR9HR$(%hH20r01elm*8q*spg#f{sX?y;
zvTM*TVznI)69APVOPD1Ua3D@fWyI~x&Km(5j>Xz28G}ut~mb7$n)R2s!nZrg8A2T8g-#6EmXZyNs3`svV7_k@qev0CeRvT57c=W8W_lbR>
z5bNtlC#=tX47+1Sbq=vUX-Tp?DS@u^vpN}3H^xz5v|u`;>Dmg2`#Sg)xiAxwVGJ3`
z7!!uk)2$`*3~kp@!P#;-&i#tS%8;%qD@w(6#p?lHAAp-CXYJe#Dx{#%&e!}wu}Q;}|v`ud*1p#9R+*HdA{A?oWhVLpVpYba#k!w`0o
zKc+u$Q&Dj#lb>TkOdygtf_!EZKDniwpa6q3zaXF<&F=#S!4I(;NSH&8?zfdkMrC)u-TcTXjl(i=O;5JJc_Qm67WQZ^
z3wtzoO^?H`YQ8Mo|5^AGD_QsxD_OV#Ujs$c8!(oe4L?XFQ%L<
z-}3B{V6z4#ur}09T+@~9ub*g?rDmfYypN3v4=4+5b}Kv`$@WvRdcbXMKa%cGHmC<)
zvM7Kai9ll`ek?R4IU4$C1bSZy`_YlNn`ymzKuKWv4ar5k0fd?jnGPuK*&~r$G{`n8
z>ZhgE{E}FTI0f;-<#MDPdA~VaN^{gVfrEC-ShwbzfbUkHY{2iPM-0xx4*!5Wlx~#{
zXZwu|vN!>0ehHQKJLRPnp^;#|Cl!I?8$%W6d78kO*DyaV>46?8?(%l-I;OzD*
z>vN^0Y@|MsGU=n~NTvPP4l!HYU!O@GH!ugB2SsGud}Dv3|n0%=T*#`KJ5Uej1d}j#5O;PdSp^
z@I)ju`xy;N81#V9xnjeIM}d(W>v&7oQg=Q7DoU=Oj$F`B?<+4{hdVJ(
zLSJxsYXH|3mg09>G3uiTtUhXv0Ic(?yx8q;Rt&boe&9CzWkkyDs^<9V;6f9QYkpuO4)4G)|Y0Dz2VkZ}}?qz{`ov
zfNr0u9#{jts-W^wiF)9_6VxMqg@9)wN!{tIOvQB2ucYR(-zRe&7|*D;n-jPP2CEjd
zyg*>NvG~ejl;;)-Er;{{LLB?5$pg~Y?k}1{TH7bip(g&J#vi<y9Z=zS4D|#@D&4
zS2x}ipT_ev!Z4CgGTVh@%jhJ_K!(dKWeNN>{5!rMk@ni6NxigIhOILhG}Tbz?DFAz@dyN;FiAdhfLZ
zV|xq%M}o6`zj;)vLV}zbpd4pA+Pxa>UhS?nNL;1Y>$I(GQ>joLoTjuqZF|aBWTw5T
zR~LY(yVQjFYwxT18axJYfH-Hnqeb`);|I}iAoI340*XTIPMPjgJU2Aa!;|MIo?Dt$
zqD6@=TK|8eW2F_U1?G3kKpkmi8tq&qc81xiytELj$BQ1?&A79n(0-Mg
zB%gELRu45j3>)z3Ego8@!0z-oSF?U_ss&n`{AKD36zWt-p+oH*Njx1|+F`?Q{?0V~
z_UwQ{-l6s#gP8x0ROY`Ug-44~QYiFp=-(>JJk;Y$V7L+Kqc30UBGikAL@FadPG|eY
z*@h}6zoFO&`I%?hLc*AOk}#%H7&HXX;go;wpoKMMRqFK>t3(O*)QSQ2qy;r)Yv8IE
ztJKnkZ`D+(f2bmt_k~c1g*yqU7N%4dQz9`UQJD
z1zARW%Df3>E5-Fj#q%FcWxiLPaSI=)Eh{$$1jX5YBV?~ps8&3-=Yc1;I06+CFg8Hf
zJKKwVH}0NTUE~_*-BC5rdqc$xK+`LVeAh*MJK*cAxI7>rMXXkkd&&dE<3|eL@`NoT
zP>Y!0!_HECrHQt3d66S9A3p4h^Yq6m#q*sCNO;@UB=Bu(xVNgxy>C?*)H-pX_sxoO
z@7#(}0UKf~o*7N#{WEduD=E*B-UR;R9Z=6yJ7a
zYBSN<#$3#tv)Gp=#o6AwrP20GN)cR8ZvJe9u+e}ynd(KP(Pm%gI(%I~y;CP|9Zbnv
zA@lRx*z}}GuIb*J8lySBlw4D`TAc2k)#xZ={uAsO+d`owWj_;{`)`kpwHNtj1BVNJ
zQ+MZ9Lzd<7A@*M%kJTZX)1;JWPLh^Wyw<;LcBHfcdc40z=c>;}=c>wDjMGZs
z^z^MFnF5OdnF9hwW$#`HkFprH%#?1EMR{_Wpf+4-YH7FeYKPIHdNC8sXo?r7z<>2O
zd3A@8_jZo3sGUZOcXx>p$VaZmz$E*vtyn&puc9^_o9d2
z9iBY~1ys~1HPC_I?9ZK9i~$>RHw9AhD+Da~?c0jjs!BciGTU!i>G<|pD(T^QR9Z=m
zm@>MTD)l_}di0V_=_Umt&mPkDX;xypnWTYi$3{nH6A8OO!C)^&-(s_|%(s2?k>a_j
ziC06wpIJ@ss*6OnEAsK`;U|cr*RTr$Wkv=g9Z?cV@G)BJ2>A^bwm-s7su{w(?tH1<
z=r{;6Y8e$io-uJYzO~9
zd`F&yuaIa!`+0x!y9^(a?LtLnOQY?0f7crSVdFARD{6I6H@Z7u(GV
zaA7XNFTYmkpbd`@|B&cq>km!VcvUu*nrZHFz<;BRah)iXXKJ~)mkn}%(!pki#4sKJ
z;so`8y5wh7)L24&F*-Ib4XCpq^GdvjS5m#aGTgUEEl2~`m@JfOXSR(Dm4esfFjNU%
z)iLxKzm*749X8F+p~dq#n4edR?QyKs(#-cv%PJ~-=OeV3Uam5T8P*he$=oG#Qx=4A
zk&fp33H4R1ojo~zr4IW>nZK9E+^O|!c^36BVxEl;Sd{+Ug`5f#
zc+9Diuiy@~yuepz=E|)M$Lz)U3S6bttCkkv*Hh}ouea2LUtg)o-r;fHA-JsSE-LoT
zW{|g|wAkmoqrO^jT?g3e-BBvEB_;7yZ>#kdx4O#`4-M*ZEp4{gigv0xX``=kCY$q)
z8EsZ~sycmZGUiBUQ-dfQZS!PkJNH0d41OB+U2JU81}G?KV{U^u-zb~wKg3wFg-6WG
zRRcxgy$^mfwnxC4q5}Dfss2OoOi6%_pBbl_!tn+(jXyRLv>X{sg}vaiFdY6hq5u5q
z)M*92;%T-UC3TS5HqYlNy{gDHQe^dfM5MhgaON9l%y3Dn$4K!;jpkw_f3${wBqjy;uaU$^z_7l1cRx
zPa~HNJ_#e(I2s@}RNfDLEYrPXdX>U<^@6N`b}jam&Z@881W1@Hc@|{N_x|7L_20|f
zIcE&3pGAb0vzS`jp%#qE^wp0>ZIh_YF`0#Ns)F8&)qJzq_j||IS3}D-4Ku>DNllpn
z>y=du?~$;#@d#v4RpY2YCi}h^=V8jFZ;r9~O~6-qRAM!GT6}j=boa#eVGZK{E^?Id
z-dDv0ZSTZ;e+6LU!MbX9!A?=jGV&H
zG}|*5?=U*cioHb+i~TRgL2gs=4xQE!cqY|!*EF%fQlv;rxaTBn
z)2jW=9oK19uQx_%oLyS=ThE_sTJ^W@=(K8I%2KCQ=}X97cVXAYL3+I6v1fYv_GN7B
z#Ax{_g?<