From 1d0b8dd4c60d16e1a2d1dd5476e42580e9721084 Mon Sep 17 00:00:00 2001 From: hq8398Eric Date: Thu, 6 Jun 2024 23:08:56 +0800 Subject: [PATCH 1/6] first commit on lab6 --- initramfs/syscall.img | Bin 0 -> 246920 bytes initramfs/user.img | Bin 0 -> 24 bytes initramfs/usr_prog.S | 11 + initramfs/usr_prog.elf | Bin 0 -> 1064 bytes initramfs/usr_prog.img | Bin 0 -> 60 bytes lab6/kernel/Makefile | 31 +++ lab6/kernel/asm_test.sh | 1 + lab6/kernel/build/alloc_c.d | 3 + lab6/kernel/build/alloc_c.o | Bin 0 -> 14528 bytes lab6/kernel/build/boot_s.d | 1 + lab6/kernel/build/boot_s.o | Bin 0 -> 8440 bytes lab6/kernel/build/cpio_c.d | 2 + lab6/kernel/build/cpio_c.o | Bin 0 -> 7640 bytes lab6/kernel/build/exception_c.d | 4 + lab6/kernel/build/exception_c.o | Bin 0 -> 5600 bytes lab6/kernel/build/fdt_c.d | 2 + lab6/kernel/build/fdt_c.o | Bin 0 -> 6096 bytes lab6/kernel/build/helper_c.d | 1 + lab6/kernel/build/helper_c.o | Bin 0 -> 2816 bytes lab6/kernel/build/kernel8.elf | Bin 0 -> 108704 bytes lab6/kernel/build/kernel_start_c.d | 3 + lab6/kernel/build/kernel_start_c.o | Bin 0 -> 1904 bytes lab6/kernel/build/mail_c.d | 1 + lab6/kernel/build/mail_c.o | Bin 0 -> 1968 bytes lab6/kernel/build/mini_uart_c.d | 2 + lab6/kernel/build/mini_uart_c.o | Bin 0 -> 8296 bytes lab6/kernel/build/mm_s.d | 1 + lab6/kernel/build/mm_s.o | Bin 0 -> 832 bytes lab6/kernel/build/mmio_c.d | 1 + lab6/kernel/build/mmio_c.o | Bin 0 -> 1408 bytes lab6/kernel/build/shell_c.d | 5 + lab6/kernel/build/shell_c.o | Bin 0 -> 13056 bytes lab6/kernel/build/signal_c.d | 1 + lab6/kernel/build/signal_c.o | Bin 0 -> 3264 bytes lab6/kernel/build/system_call_c.d | 3 + lab6/kernel/build/system_call_c.o | Bin 0 -> 9384 bytes lab6/kernel/build/system_call_s.d | 1 + lab6/kernel/build/system_call_s.o | Bin 0 -> 1032 bytes lab6/kernel/build/task_c.d | 2 + lab6/kernel/build/task_c.o | Bin 0 -> 2704 bytes lab6/kernel/build/thread_c.d | 3 + lab6/kernel/build/thread_c.o | Bin 0 -> 9272 bytes lab6/kernel/build/timer_c.d | 2 + lab6/kernel/build/timer_c.o | Bin 0 -> 2880 bytes lab6/kernel/build/utils_s.d | 1 + lab6/kernel/build/utils_s.o | Bin 0 -> 760 bytes lab6/kernel/include/DEFINE.h | 58 ++++ lab6/kernel/include/alloc.h | 22 ++ lab6/kernel/include/cpio.h | 29 ++ lab6/kernel/include/exception.h | 16 ++ lab6/kernel/include/fdt.h | 113 ++++++++ lab6/kernel/include/helper.h | 14 + lab6/kernel/include/kernel.h | 6 + lab6/kernel/include/loader.h | 6 + lab6/kernel/include/mail.h | 23 ++ lab6/kernel/include/mini_uart.h | 28 ++ lab6/kernel/include/mm.h | 19 ++ lab6/kernel/include/mmio.h | 8 + lab6/kernel/include/peripherals/base.h | 6 + lab6/kernel/include/peripherals/gpio.h | 12 + lab6/kernel/include/peripherals/mini_uart.h | 19 ++ lab6/kernel/include/reboot.h | 22 ++ lab6/kernel/include/set.h | 168 ++++++++++++ lab6/kernel/include/shell.h | 3 + lab6/kernel/include/signal.h | 8 + lab6/kernel/include/system_call.h | 26 ++ lab6/kernel/include/task.h | 16 ++ lab6/kernel/include/thread.h | 27 ++ lab6/kernel/include/timer.h | 17 ++ lab6/kernel/include/utils.h | 9 + lab6/kernel/kernel8.img | Bin 0 -> 33696 bytes lab6/kernel/src/alloc.c | 249 +++++++++++++++++ lab6/kernel/src/boot.S | 251 ++++++++++++++++++ lab6/kernel/src/config.txt | 2 + lab6/kernel/src/cpio.c | 197 ++++++++++++++ lab6/kernel/src/exception.c | 180 +++++++++++++ lab6/kernel/src/fdt.c | 128 +++++++++ lab6/kernel/src/helper.c | 51 ++++ lab6/kernel/src/kernel_start.c | 24 ++ lab6/kernel/src/linker.ld | 12 + lab6/kernel/src/mail.c | 57 ++++ lab6/kernel/src/mini_uart.c | 280 ++++++++++++++++++++ lab6/kernel/src/mm.S | 6 + lab6/kernel/src/mmio.c | 9 + lab6/kernel/src/shell.c | 211 +++++++++++++++ lab6/kernel/src/signal.c | 77 ++++++ lab6/kernel/src/system_call.S | 47 ++++ lab6/kernel/src/system_call.c | 239 +++++++++++++++++ lab6/kernel/src/task.c | 47 ++++ lab6/kernel/src/thread.c | 214 +++++++++++++++ lab6/kernel/src/timer.c | 56 ++++ lab6/kernel/src/utils.S | 9 + lab6/kernel/test.sh | 2 + 93 files changed, 3105 insertions(+) create mode 100644 initramfs/syscall.img create mode 100644 initramfs/user.img create mode 100644 initramfs/usr_prog.S create mode 100755 initramfs/usr_prog.elf create mode 100755 initramfs/usr_prog.img create mode 100644 lab6/kernel/Makefile create mode 100755 lab6/kernel/asm_test.sh create mode 100644 lab6/kernel/build/alloc_c.d create mode 100644 lab6/kernel/build/alloc_c.o create mode 100644 lab6/kernel/build/boot_s.d create mode 100644 lab6/kernel/build/boot_s.o create mode 100644 lab6/kernel/build/cpio_c.d create mode 100644 lab6/kernel/build/cpio_c.o create mode 100644 lab6/kernel/build/exception_c.d create mode 100644 lab6/kernel/build/exception_c.o create mode 100644 lab6/kernel/build/fdt_c.d create mode 100644 lab6/kernel/build/fdt_c.o create mode 100644 lab6/kernel/build/helper_c.d create mode 100644 lab6/kernel/build/helper_c.o create mode 100755 lab6/kernel/build/kernel8.elf create mode 100644 lab6/kernel/build/kernel_start_c.d create mode 100644 lab6/kernel/build/kernel_start_c.o create mode 100644 lab6/kernel/build/mail_c.d create mode 100644 lab6/kernel/build/mail_c.o create mode 100644 lab6/kernel/build/mini_uart_c.d create mode 100644 lab6/kernel/build/mini_uart_c.o create mode 100644 lab6/kernel/build/mm_s.d create mode 100644 lab6/kernel/build/mm_s.o create mode 100644 lab6/kernel/build/mmio_c.d create mode 100644 lab6/kernel/build/mmio_c.o create mode 100644 lab6/kernel/build/shell_c.d create mode 100644 lab6/kernel/build/shell_c.o create mode 100644 lab6/kernel/build/signal_c.d create mode 100644 lab6/kernel/build/signal_c.o create mode 100644 lab6/kernel/build/system_call_c.d create mode 100644 lab6/kernel/build/system_call_c.o create mode 100644 lab6/kernel/build/system_call_s.d create mode 100644 lab6/kernel/build/system_call_s.o create mode 100644 lab6/kernel/build/task_c.d create mode 100644 lab6/kernel/build/task_c.o create mode 100644 lab6/kernel/build/thread_c.d create mode 100644 lab6/kernel/build/thread_c.o create mode 100644 lab6/kernel/build/timer_c.d create mode 100644 lab6/kernel/build/timer_c.o create mode 100644 lab6/kernel/build/utils_s.d create mode 100644 lab6/kernel/build/utils_s.o create mode 100644 lab6/kernel/include/DEFINE.h create mode 100644 lab6/kernel/include/alloc.h create mode 100644 lab6/kernel/include/cpio.h create mode 100644 lab6/kernel/include/exception.h create mode 100644 lab6/kernel/include/fdt.h create mode 100644 lab6/kernel/include/helper.h create mode 100644 lab6/kernel/include/kernel.h create mode 100644 lab6/kernel/include/loader.h create mode 100644 lab6/kernel/include/mail.h create mode 100644 lab6/kernel/include/mini_uart.h create mode 100644 lab6/kernel/include/mm.h create mode 100644 lab6/kernel/include/mmio.h create mode 100644 lab6/kernel/include/peripherals/base.h create mode 100644 lab6/kernel/include/peripherals/gpio.h create mode 100644 lab6/kernel/include/peripherals/mini_uart.h create mode 100644 lab6/kernel/include/reboot.h create mode 100644 lab6/kernel/include/set.h create mode 100644 lab6/kernel/include/shell.h create mode 100644 lab6/kernel/include/signal.h create mode 100644 lab6/kernel/include/system_call.h create mode 100644 lab6/kernel/include/task.h create mode 100644 lab6/kernel/include/thread.h create mode 100644 lab6/kernel/include/timer.h create mode 100644 lab6/kernel/include/utils.h create mode 100755 lab6/kernel/kernel8.img create mode 100644 lab6/kernel/src/alloc.c create mode 100644 lab6/kernel/src/boot.S create mode 100644 lab6/kernel/src/config.txt create mode 100644 lab6/kernel/src/cpio.c create mode 100644 lab6/kernel/src/exception.c create mode 100644 lab6/kernel/src/fdt.c create mode 100644 lab6/kernel/src/helper.c create mode 100644 lab6/kernel/src/kernel_start.c create mode 100644 lab6/kernel/src/linker.ld create mode 100644 lab6/kernel/src/mail.c create mode 100644 lab6/kernel/src/mini_uart.c create mode 100644 lab6/kernel/src/mm.S create mode 100644 lab6/kernel/src/mmio.c create mode 100644 lab6/kernel/src/shell.c create mode 100644 lab6/kernel/src/signal.c create mode 100644 lab6/kernel/src/system_call.S create mode 100644 lab6/kernel/src/system_call.c create mode 100644 lab6/kernel/src/task.c create mode 100644 lab6/kernel/src/thread.c create mode 100644 lab6/kernel/src/timer.c create mode 100644 lab6/kernel/src/utils.S create mode 100755 lab6/kernel/test.sh diff --git a/initramfs/syscall.img b/initramfs/syscall.img new file mode 100644 index 0000000000000000000000000000000000000000..70d4a55393c7a3799b5a86db1305d374b6479580 GIT binary patch literal 246920 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 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/boot_s.d b/lab6/kernel/build/boot_s.d new file mode 100644 index 000000000..718ca3b14 --- /dev/null +++ b/lab6/kernel/build/boot_s.d @@ -0,0 +1 @@ +build/boot_s.o: src/boot.S diff --git a/lab6/kernel/build/boot_s.o b/lab6/kernel/build/boot_s.o new file mode 100644 index 0000000000000000000000000000000000000000..72977d272f17021b5b004234896d41594060dcbb GIT binary patch literal 8440 zcmeHMO>7%Q6n@S+bJ|!lr}<@un^MPu_v}wd)KTt z)Zs@I2~J!Hqkl2&rX(Jcr8LWrNJsu482nVpR{6Z=xhSt0Gn zyYuFo_ulv3o7uH?_r1weCprQFa9RMqg2u=}0hS+W$SN0A=!UKa=u3VD{0jIL@GIa~ zz^}mnrUHK{aCr&hRfwpcBmu7CfB#+#es2%J;_!!%7z0?qaWCS%!vNo+yoff7>t~c| zP3gPL#%t^A{Qy^P!0t$O2`=0KHBx;ZkD7An=DN~(y%qv``=J2+p}&LvIH=H{4h88i zk9X2vkM5wqjfLp%C%fpMXS(Uyt2^l(Z5O?p?V*1g572+kKS=Mr4RuiC)nPnpp4Ec^D-vshaBHsz*JBfT#$oB&By@-4- zA>S$Fdl~soBcEEwm={>=Lzv6Z?SU$=oUm81zxEC!h5){XTUawtzl2-i>WZSZEl*b8 zcIMcw_2F@E!x{~a!XHBloNZSg+p*8uxxQ>228WcYfA}@<_kh0#``ZRhwq zkNKB9=D+AMf6Qb4+P~iJzqrTwhdt)M;&J_x9`i4I%zx2i{))%^36J^X9`lDi=EvuQ zURbf8Vf&_m?n?w{f3kz_&na}E6r=|$o%CmXj_Zy={mE&SK9v}!N0Z0s)4AjHnbHJ( zt};nSV`_aY01NN0+I}vq#`!aGyPj+8cMq3tV(dJ8c2@b1Nv)gG^vec-0v%0_6r5?+ z6bNpC?QbSqaT^IjShCo~$3gzG#XYr8;8Si8>Yv2 zDIef^L0FMWL4^KcsTA)D`~wM(2|xJUys3RG^jD<#KSjK^Nj*Q~_$C*8@OcaTix&9R z7WlOm_;rp4AtKf7`xg3ZE%2RaFQtl_0O1yRv;{uO{o^i@KDAA7{UG#6B&P*_R>EHs z`0El5BNZs7$`&!9WEyELm(sH^YZ^t36rRv51G^(oCYDAjX;QNChOWIy(w1RrR%)g| zpaG+0rhsnJhDkIlUnC}T#-Z{&5)`#`s!(t+jp!LD=d+qgtT|J6U>M1OR<=^61vBNc zHbb&`ol8u;NQ!R}(|~it)JZ{1HUc2JWzM_liOxfG1te6oEYXRXDrkB0jSXfySPf&+ zQw2zCO@c;rPS23pyiPKWfojBcp+yE^PHB>ar@q21F8#uSjepV#)acc*^Rb@_N*~K`)!e*6XJSj z_yHH5bm0Rod_-K=Oh4kno$H<92VJ;x5wN^mpO68f<@q9RA?z*F?sJZ0k%|S;Ov*|@ z6n6ncO;Sij85*5249o5PzGapZh6Fn#52`eFhD_JphH=0!={5(dTgfHM_J?qeUDEe! ze*|rrPdR?)KCvoa=hFS-F|@_I%9eObV)42}z|23>bIhIpF*Yr>2uh8%DimTOu@Fw} i!9%w1Moi9~dl8#TmkK5gVRsArir8e&a%YW`Z2uo|Fgc+B literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/cpio_c.d b/lab6/kernel/build/cpio_c.d new file mode 100644 index 000000000..9dcd638a8 --- /dev/null +++ b/lab6/kernel/build/cpio_c.d @@ -0,0 +1,2 @@ +build/cpio_c.o: src/cpio.c include/cpio.h include/mini_uart.h \ + include/helper.h include/alloc.h include/thread.h diff --git a/lab6/kernel/build/cpio_c.o b/lab6/kernel/build/cpio_c.o new file mode 100644 index 0000000000000000000000000000000000000000..23a65483fb778127e7e4c06ce670cf775a85f253 GIT binary patch literal 7640 zcmd6rU2IfE6vxkY3lwSjDr&W8w^9TRY__IJi<)pt{Xjz$nkCi*v)%4)>Be@q-Mvi~ zA=(&YNaUf#CiX#K4Lnq0A`eY0u@5!DCwcG-!b2fj^}z=oFc57Mu%0vb%=R$d(Zpcl zG`n}^H)sBH=FFM9_x7FV_qZV{|r4PcY{tFC@gI9-X*asV7{R03SRNs(q(QeGQXm`M;>?*Y#2)i0#H{YrI~bvPUm(A*A96m`R&!JPiq~JL^~S@b zZ-mxEev=OY^u17xebw0Z!#BQi=Q!1i9Bt75eLwr*Ni{Eylk-v?_n78HpS`*200vr@ zL3nn}-L}L#X&+I)f#djh+OyHK!ekYlb;eDLF)MQY3a!`RFIQn6HdBF7l#?!P=6U)?hI@b0sbSNEu)cJzBR z@8#lX9`j`g^4}|l=jC0hj&W_V3T|uK(E?&g1=3p4Z37 zKgtD}8^--W+UtAPy*l6Ze|W!L`ds6lLAbs3r9IEL*Vorm3n0{te~kc}vsL#|yDjPl zHpjg>wc7_%sbuP4AeN3N0^ON(Utn`C7!0EAi*0RB2e$6-8cex^fyTyQQ!uo>aZoiI z-+t<;V5sQ{#-y{BzOeY-YKQXNqrTe8I{FcZ8btw)(Y1B;+URP409HfP#?nt;t*f0A z6(?8h`fz#2wW~j%1>jFNu7xUCj^d97+Uz}X-^rC_o!73C0rk81q0-^?D~+=7Vm~E1 zl?!rw+UpM>pP)`G_&ihep|$FfgV(O2^H>7-xk42zy>gD%Jq@p?^f#H8!*2_vdi^Dz z!~p#GSE~3?$t)ELEaj^dr`eYlKP+1UJ)NbT4E?aeVqc;5*6j3yr?!+YHxbYtu9NHH zrBowdFXE%}2H7U&x~=jCS&;c{yi!rQg4Y)O=$s_3OB+^7@s}<9RpjK)d-#AtMdcb^ z-@s2Pog{LypW&@kxrZ#rJkOz4Ifv|B{FKsp-@=D2{38oLZQ-9ICqH-d)~NhO2C@ER zIv9h7I5gy-Yp}Z;dJ?%vtS6d@xamk&GNsyFCF4kUG8KmiS9=qX9qh`w8OTQa5=t%7 zAI)SFk=`r}Ml)`tKa)(k-LfYZb-iY9IvR&$W&rvQMf#$>z3CXBQmp?FxILLfG#*K& zk}e!fxRKakCX+~Uot#LZ4^*brH$W{O0d*tcb_E}aX1uOrMwd$FEd~!Uuf}VYuy101 zzrkrd6`FUwS5@D;1;_W5V$pd-_L7gYy*ck^%*}bv34J;5gwT$_e{Akg+V$qplZt9ftc{Afs!Q6~PCG#cmx9IG#=*Q4%L$)}i`ar>3InV;90oB6p`|IT9^ zr2YoxW}ehAH}hnx;4(j3Ec_^QGe3_pH|HG|Ix^0qLWkn1%b3uS{9|D+*P9pilAmF2 z#(Bb`GilM8vglkCI^<`77x1mnk^D!YBlGsU(2@S%5IU0I5;`)Ta~7T379ITvtM9}5 z+?Dfl740MWuXzP?^V|iPoB7Znbfo`Vg^u(;Zqezn==552`h^bpug|Y5bR^FSd+Fy9 zVK4a*b2G2b39e&CDKROy_J#Nb!5<>P<%;0qU&=5ec&#?ZYe8^&m(%5jg#$mQ>U|IK zfO6(~-!-pbZtnYD=H~q>%-p}6h6GB@+;S&NQi(RohjNdJc{I`3I@j#_k%2_35H zoE{cBl8*{|x!y5hFZsvJ%{b`XUWWO=k4`GoO&oB|^?PlH!S#D>&fxlebj;xTy>rsw zc|KP&2G{R@5X>IxbE92&bu-?zN7pim-e}NGqcX5q5%y{^hCNd^d@+ZN&s~*l=^m1RCTyE!TX>)_-8~nf$l-XoFefm zbCuq8n6LEDGMY#KN2A8;hR2!n;|)`QTgJS)gEVB>h7Hm*$It2UhQoS(t%3i_Q+~-@ zqCP$TC2h!8bNmkE!a5{_E>5?9_E>*Jn<|ou=(;Jl^!bpU2NhQLLM? z?Z`^)-%7H)*ZW8Qm~+#Ro|W_s@GW=J|Iz4to8!sM+&e_j!g(`A4N=VX T)4N)!@ge@vjEb>THOK!2g65v? literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/exception_c.d b/lab6/kernel/build/exception_c.d new file mode 100644 index 000000000..bedaffbad --- /dev/null +++ b/lab6/kernel/build/exception_c.d @@ -0,0 +1,4 @@ +build/exception_c.o: src/exception.c include/exception.h \ + include/mini_uart.h include/utils.h include/mmio.h include/DEFINE.h \ + include/timer.h include/task.h include/system_call.h include/exception.h \ + include/thread.h diff --git a/lab6/kernel/build/exception_c.o b/lab6/kernel/build/exception_c.o new file mode 100644 index 0000000000000000000000000000000000000000..0778e0aa59d8d09441d79226f4927a8d5324ce81 GIT binary patch literal 5600 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 F{|h#+B#Zz6 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/helper_c.d b/lab6/kernel/build/helper_c.d new file mode 100644 index 000000000..cb268cdc7 --- /dev/null +++ b/lab6/kernel/build/helper_c.d @@ -0,0 +1 @@ +build/helper_c.o: src/helper.c include/mini_uart.h diff --git a/lab6/kernel/build/helper_c.o b/lab6/kernel/build/helper_c.o new file mode 100644 index 0000000000000000000000000000000000000000..94372690c238710b14e7c64d70f30ccece8ce8e1 GIT binary patch literal 2816 zcmb`J&u<$=6vy9o-KO9)PD3GxTCpP{6i~CVLntv4VvPl@NYz6~RW2y?k1eU{*r~md z98|SN960oXfdhX+TUBar;F~2bT&t>_IIP_>he{l<1T5b-`zGCPT*QGFt!L)5@4b2R zotagxe{kl*1BOA`4Elkdj5HBXMhhp|E?rECz2+_2-89iExicU46X?(NUZEsSA^nthmvV!< zcFtRDcj+*7`p6648~LmDw}Ucu@|(pKH6L%vZ#xMStsC$ftT(_S>Osd`Oj|I7j>>T{B%o?<=xXh_}k!U@Qx{sp%aGZfS9uMGe zqek|BkLdCR_!ImODu1aHb3XF@Y19$a6X-bX$7wi#o{!?F30m-a5*&y1_v7|(7I_C) zAHTyKtHe4ag861KUsQ`e`^N1q*YO+lKn@iP4OJ}f5j0ntK1(CkCl;wayl$jj__k0SuO7%{rv z$C*MskH3Hxd;W!Bj|rB^F1@+@*2%Y5a>Y`);#{Otg~B`O`E#Y6n!A(EX02r_vyk0U z!|b)CB`dT1x?m2cN%afmK3}6)YsNS}o}y!5FAM*X+x$ePI)TNan-R{J4?JBGep>i< z0ne0$Ul48wJbhMpOZZjcp9)ub!72gIoCoJxZt@tW=Fd+|egyt+hI5Of_}CxiV~+eH z5t;ZKWhOF3?Rf=wmi=ZDZf3-esPTTz*rd?MP~rmr!%A~OdyRQ^8djO+S~OR|u(jdVH=1taQtdNp7PlN~?vyYjJXNQLrhbY0(hC(PFfGmwN6@B&9zQ+X&iC-D_a^mg}@!vMNQlNLH!YB&$&m2IczJmQ%yKTHST5Q)kaDG~HtPG8{O} z+1$9;V0Hf|OCt{-k+Alh+U6hFiO3a;-mK&BVP@kATU!$9^TPL!=g~KTzY%P&;b9(` zhN@A(&M@{38=n)-8Fl}!@q8aRXZS2(NZXQ-?_=0>{hH;_;ds4H&D#>M&#~sZe%-z= z@%p`P??e|QFLa#tJC6>tX#MvjzNa0fjn=;gK5GB&$^PAxINm>w)$w}&M$OG3+j3BT omV)D8<0Imq0~@u}6`8+)_hE~!AOC}mjQ>PF(Zz5u`qB7*09`biTmS$7 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/kernel8.elf b/lab6/kernel/build/kernel8.elf new file mode 100755 index 0000000000000000000000000000000000000000..a05f327d7804b256e79f918fd9362b681cb9da1f GIT binary patch literal 108704 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 F|6enL8P@;+ literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/kernel_start_c.d b/lab6/kernel/build/kernel_start_c.d new file mode 100644 index 000000000..6b5564f6e --- /dev/null +++ b/lab6/kernel/build/kernel_start_c.d @@ -0,0 +1,3 @@ +build/kernel_start_c.o: src/kernel_start.c include/mini_uart.h \ + include/shell.h include/fdt.h include/cpio.h include/alloc.h \ + include/thread.h diff --git a/lab6/kernel/build/kernel_start_c.o b/lab6/kernel/build/kernel_start_c.o new file mode 100644 index 0000000000000000000000000000000000000000..653419fdb3137406cad29368b1ae770182dade2e GIT binary patch literal 1904 zcmbu9&1(};5Wpwh)T)h5{Xm3>T`))myCkJ(>1m~CRYXOo;Az=pUp{EEmE9MKE$G#w zLa&NPy?GGyB;x;|cv0$qpf_^}IF7V>247Qh@Sx1gYQLqfHlb9VWw>IcXn}{^qgsY8g74l z`N42L!`kZViaEbt>-n;0R;$*MRavO^BDeZ*anY(QomCi90cN8oKyK?clLZ{!R-pQab`*;4e)Ktdx{^y=k4LI{T90a5N%Q zaBOUZ;-^w5@yRiM9LW)F{ZU_#oyI@+P)|CS!Ov&#s~P-G2CrpsKZC=D2z=3TLg@z5 zszbRCWshM^G}}HjJn6We7eEg~oVMSV&=j!|xZOq=4^os2-1{O31$15CZHhQnwgTaL zu^qNVr{lzBaX~1BSiuF{x@l#T;@&MM_(>I0Le9B_OvS0rA!U;)E1T-*d|q*?qaR+{ z9}?ol*o>YPWfSMM5n9&xVP%uzbxvaZgvP-NA9ST#LoI_?x7Z3q$F-#BORzjwx?t79 z5Ul!Uw<~;P{-zYx+Ku%E+^hNqSW&oWISt$ep-=HYwu#BOx}(|2*qb;;Y~;+K|4!xbc~kD+{;_`zjkNy%QVrogQ~&8Jm+XJq+*JDq rJy2e&1s_D4{>gl*o9sOzc%fcsiyTdo?@xCqEq_)Ww7Xg^naTV=UUiFa literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/mail_c.d b/lab6/kernel/build/mail_c.d new file mode 100644 index 000000000..99d78e84d --- /dev/null +++ b/lab6/kernel/build/mail_c.d @@ -0,0 +1 @@ +build/mail_c.o: src/mail.c include/mini_uart.h include/mail.h diff --git a/lab6/kernel/build/mail_c.o b/lab6/kernel/build/mail_c.o new file mode 100644 index 0000000000000000000000000000000000000000..7196f5db7a2ff0db48118a3f3d110393fc6ef13f GIT binary patch literal 1968 zcmbtU&rcIk5dM}e6omj55{wYrL?ZrTrAUH63`|odGAP50Wtu0**OB*ujwc39XMm z!g>A+(Cr{_>tUe~MOzWe1$CQpR`>xm0roZ6x1|)%{v*J`{ojQs=R^zE6yl{SBaA!k zPY<9I0jh0nOO1WbufBbmSFx5=vk|8icA*`%j%*}^&9u`2J4-s(SvW+io7QpI&KPkj z*$7?r5!WyUM4fKkt^wLW{`u8+FN)l6TyCcs+wc*O;MkP>#0BDUP7?1aS_8C(X^l`0 zs;@kUt{|El&~2xg`bhoYo$r<#F7}7>iu{56>U%do#>d8nLPsX!ON-W0C>+-Mwceia zl6wr_?d#Ke`;Q8kt^%SfigG6c-||7FqcO-A!hV52<9)O#G}{DfA6p+ z^4nLk0wG!xtdL~+XS7LQuix-r7j}mJCOl(4{47+nt5qiuQ0cFlsKn%zdKcgHNl9myNma)>seNJj=Ght|!xokn3F)RaGJd=Sook}Ln zMZy+SmZ^<|Q|6KRnZI0Qez^~kQR?M> z->ZRDe6I+se8!mPhlsz)hcc1sT!Z=A-Pn?t4qcv{rK lZ-$pQo_W2!CkRgjc!m#U;%&=5vQ>+p5cOXzi)Gat{|A8i?tTCO literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/mini_uart_c.d b/lab6/kernel/build/mini_uart_c.d new file mode 100644 index 000000000..d6054bce7 --- /dev/null +++ b/lab6/kernel/build/mini_uart_c.d @@ -0,0 +1,2 @@ +build/mini_uart_c.o: src/mini_uart.c include/utils.h include/helper.h \ + include/mmio.h include/DEFINE.h diff --git a/lab6/kernel/build/mini_uart_c.o b/lab6/kernel/build/mini_uart_c.o new file mode 100644 index 0000000000000000000000000000000000000000..4cf944e4bcbcbb330c0912c41b9cf568bbf7f6e0 GIT binary patch literal 8296 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 YlxjLpfd+H_QOw2ZYf68tX~{M9-{WInt^fc4 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/shell_c.d b/lab6/kernel/build/shell_c.d new file mode 100644 index 000000000..12bd69955 --- /dev/null +++ b/lab6/kernel/build/shell_c.d @@ -0,0 +1,5 @@ +build/shell_c.o: src/shell.c include/shell.h include/mini_uart.h \ + include/reboot.h include/mail.h include/helper.h include/loader.h \ + include/cpio.h include/alloc.h include/fdt.h include/timer.h \ + include/exception.h include/thread.h include/system_call.h \ + include/exception.h include/signal.h diff --git a/lab6/kernel/build/shell_c.o b/lab6/kernel/build/shell_c.o new file mode 100644 index 0000000000000000000000000000000000000000..4cde9379b82d649f60dd5c31d40434a165bce593 GIT binary patch literal 13056 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 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/signal_c.d b/lab6/kernel/build/signal_c.d new file mode 100644 index 000000000..8dcdcdec8 --- /dev/null +++ b/lab6/kernel/build/signal_c.d @@ -0,0 +1 @@ +build/signal_c.o: src/signal.c include/thread.h include/signal.h diff --git a/lab6/kernel/build/signal_c.o b/lab6/kernel/build/signal_c.o new file mode 100644 index 0000000000000000000000000000000000000000..b65a2dc77c42dc921eaa37293ed07b92ded8ca56 GIT binary patch literal 3264 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 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/system_call_s.d b/lab6/kernel/build/system_call_s.d new file mode 100644 index 000000000..36807c754 --- /dev/null +++ b/lab6/kernel/build/system_call_s.d @@ -0,0 +1 @@ +build/system_call_s.o: src/system_call.S diff --git a/lab6/kernel/build/system_call_s.o b/lab6/kernel/build/system_call_s.o new file mode 100644 index 0000000000000000000000000000000000000000..555ba6157932ce63d1c92ca3e68b8936852def0a GIT binary patch literal 1032 zcmb<-^>JfjWMqH=MuzPS2p&w7fx&|b!FB*M9T?ad*cdn%8ZH6VUpc@We@z34?SaJ3 zKw@_wu~$IZCy>NmAh8iPVrMa9btwY_GXs)ik+d=cWzYe{ub4h&0V)*0Vm>!ioCnPy zQK+~Cnz#Z~Tm?;B6)J9kCawh)w?Pxvhl;zPiCaR&1JJ}7R4N$KQ%edmQy5AUi%Q~) zQWK%9@}kU=REE@w)MSRV{Gx0iE3MB7&LKE{2&8GAP1x$J%;BXD?(zU z$GAFBj)MaIAoH-Lx&=US5U_w+$O>eGFvuXwTHpQfRM95u^MB zNONDsn{Q@kXYaNz?#xWK7zPM2 z;4Pe50tMJ=Khj&7J zBfq>?+Rs(Q4UCU!{1Bjhj~&W!v>#!s{S*DBz6cIs>7)?EG!jQykaySw??ekP`t>@`19dmD>ib2!;BteBY^RA4g#esMqg(HE+d9}W%7l_ z@vhiz+g@w#$M-HW$$yg+l>0Pr{~Y&65n3c1WuJ!euHbIVo{{E$f^?1oK|lX6WSU;KTkWo5Dj92^l?dE6Ivz9SE->rQk{NYzyBAc z{jzgF?lpYGnfV#~aS$is3m!Wc#ORy|5Am(B^FVA8pJsW$a|+8=68clnUt&fg?K&w~ zEf&%V@R>uB&-QIIiZorQzEe{)~n%`l#mr#`$WU0p4fAJ2{7@ehC*nA$)-2>b?d!uC9Aq zlV@6!XGW9fk%phr@K-f_Ps4wv;csgAI~x8=4WI5Hl2-J$_$nL4xeHu;4-Yv<;Np7# ztFWH+oF$ySyg#RfmUlCb<+&vftd!$9U@a92U?p?eth<8PO3rhwse21U1 zI`KH~WL>GG|5BqEO)XGwAR94~cf3EoMR#Yt^r1x+35okEv+gYruwIaKZ} zk5}n24wR%=Qq}tJBG#<`zxaVp^LXk%{cDK$UXD{e>e}Sm=b-pL&LKwks~S&v8+wnJ a&Cj3elSSQs4?3I0$M|2|134IVHU1wz6$FU@ literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/thread_c.d b/lab6/kernel/build/thread_c.d new file mode 100644 index 000000000..c6ee98c26 --- /dev/null +++ b/lab6/kernel/build/thread_c.d @@ -0,0 +1,3 @@ +build/thread_c.o: src/thread.c include/thread.h include/alloc.h \ + include/mini_uart.h include/helper.h include/exception.h \ + include/signal.h diff --git a/lab6/kernel/build/thread_c.o b/lab6/kernel/build/thread_c.o new file mode 100644 index 0000000000000000000000000000000000000000..b1580747acf34aaf8babdb375cac6bf949223755 GIT binary patch literal 9272 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 literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/timer_c.d b/lab6/kernel/build/timer_c.d new file mode 100644 index 000000000..b7ed93425 --- /dev/null +++ b/lab6/kernel/build/timer_c.d @@ -0,0 +1,2 @@ +build/timer_c.o: src/timer.c include/timer.h include/alloc.h \ + include/mini_uart.h diff --git a/lab6/kernel/build/timer_c.o b/lab6/kernel/build/timer_c.o new file mode 100644 index 0000000000000000000000000000000000000000..35ae2964e7db69d48e1589bd490a7448e1d2e098 GIT binary patch literal 2880 zcmbtW&1)1{5U-w|Xf)qOiR{Rx1rIawU6CCjI?w?1usr(gw`CJ1f+i@Jnw&D4?%^|m&(H0axv)I? z=dZJ7>hI;znH9e}K)>;e`|06)dR=`5k0 zFw#qAY_DNKr|JXf(++U!AwX}??My=)S^~`Tu2N~EUMN4V?cR3m&p1Lo$X=Z?#(i)N z=#~AHO!!^eF-G@Yr3VQp#{o7630gn)h`N+1FK%eB)Qv8*V;_LL8{kd)Q$^SeiVOP_ zv9wmbF6E|t7WJw0PB`UrUL_VR+*gY^`tS^%^9-J@n!$hP%>^qshWmo+BiToVr>~p?_5V^{bsx3;kvjKOoa(CnK}4SaBmCb+_UyAVW!#;@g zeg+uV*Hw)0AB*t+g>ii@^|7!n;p(~E7Q#@2IJ*d>OT*>)zN+E!yn>y-o$=j%;XnMIUT&a_#k20BofH<-GXb2A>7 z{c2`m2HGP1MsN@#veZpLUB8(Uj5)|va`7O{7se_M77x<^<41+X3ik0zle$9a!!-t$4bK#D^8`suE%7Jr}nca>NY_4v;L8%RU| literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/utils_s.d b/lab6/kernel/build/utils_s.d new file mode 100644 index 000000000..5af69aba7 --- /dev/null +++ b/lab6/kernel/build/utils_s.d @@ -0,0 +1 @@ +build/utils_s.o: src/utils.S diff --git a/lab6/kernel/build/utils_s.o b/lab6/kernel/build/utils_s.o new file mode 100644 index 0000000000000000000000000000000000000000..81addeb9048818323bf8469fd6ab721551144306 GIT binary patch literal 760 zcmb<-^>JfjWMqH=MuzPS2p&w7fx!Yv&;cy$z`)MH22#880CW5`1_lQxjnIS6V#aDR z0|PSy6S`6`pBX5F4j|4zatu@f3y>DTVm=pCoCDn;l?sM}(h_4MhV)br$)HzUnOl;W z1f)xfAan+dRgzj!!l0LuSdz$~msDJgZW391X`n8UFWAs@J3#pYXyPFMAp=Dq2c#c8 zgaVKiA+gazOdTi(3KMemgUrJgYcTs)K<#D)(jW{Ae+j5KCy++B8zl7uDv$1eboUG5 Q(9Z!?r~@?zMxpBm076h6{r~^~ literal 0 HcmV?d00001 diff --git a/lab6/kernel/include/DEFINE.h b/lab6/kernel/include/DEFINE.h new file mode 100644 index 000000000..3d37af655 --- /dev/null +++ b/lab6/kernel/include/DEFINE.h @@ -0,0 +1,58 @@ +#define MMIO_BASE 0x3F000000 +#define PBASE MMIO_BASE + +#define AUX_IRQ ((volatile unsigned int*)(MMIO_BASE + 0x00215000)) +// Auxiliary enables +#define AUX_ENABLE ((volatile unsigned int*)(MMIO_BASE + 0x00215004)) +// Mini Uart I/O Data +#define AUX_MU_IO_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215040)) +// Mini Uart Interrupt Enable +#define AUX_MU_IER_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215044)) +// Mini Uart Interrupt Identity +#define AUX_MU_IIR_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215048)) +// Mini Uart Line Control +#define AUX_MU_LCR_REG ((volatile unsigned int*)(MMIO_BASE + 0x0021504C)) +// Mini Uart Modem Control +#define AUX_MU_MCR_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215050)) +// Mini Uart Line Status +#define AUX_MU_LSR_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215054)) +// Mini Uart Modem Status +#define AUX_MU_MSR_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215058)) +// Mini Uart Scratch +#define AUX_MU_SCRATCH ((volatile unsigned int*)(MMIO_BASE + 0x0021505C)) +// Mini Uart Scratch +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215060)) +// Mini Uart Extra Status +#define AUX_MU_STAT_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215064)) +// Mini Uart Baudrate +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(MMIO_BASE + 0x00215068)) + +#define IRQ_basic_pending ((volatile unsigned int*)(MMIO_BASE + 0x0000B200)) +#define IRQ_pending_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000B204)) +#define IRQ_pending_2 ((volatile unsigned int*)(MMIO_BASE + 0x0000B208)) +#define FIQ_control ((volatile unsigned int*)(MMIO_BASE + 0x0000B20C)) +#define Enable_IRQs_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000B210)) +#define Enable_IRQs_2 ((volatile unsigned int*)(MMIO_BASE + 0x0000B214)) +#define Enable_Basic_IRQs ((volatile unsigned int*)(MMIO_BASE + 0x0000B218)) +#define Disable_IRQs_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000B21C)) +#define Disable_IRQs_2 ((volatile unsigned int*)(MMIO_BASE + 0x0000B220)) +#define Disable_Basic_IRQs ((volatile unsigned int*)(MMIO_BASE + 0x0000B224)) +#define CORE0_INT_SRC (volatile unsigned int*)(0x40000060) +#define CORE0_TIMER_IRQ_CTRL (volatile unsigned int*)(0x40000040) + +#define GPFSEL1 (PBASE+0x00200004) +#define GPSET0 (PBASE+0x0020001C) +#define GPCLR0 (PBASE+0x00200028) +#define GPPUD (PBASE+0x00200094) +#define GPPUDCLK0 (PBASE+0x00200098) + +#define UART_DR ( (volatile unsigned int *) ( MMIO_BASE + 0x00201000 ) ) /* Data Register */ +#define UART_FR ( (volatile unsigned int *) ( MMIO_BASE + 0x00201018 ) ) /* Flag register */ +#define UART_IBRD ( (volatile unsigned int *) ( MMIO_BASE + 0x00201024 ) ) /* Integer Baud Rate Divisor */ +#define UART_FBRD ( (volatile unsigned int *) ( MMIO_BASE + 0x00201028 ) ) /* RFractional Baud Rate Divisor */ +#define UART_LCRH ( (volatile unsigned int *) ( MMIO_BASE + 0x0020102C ) ) /* Line Control Register */ +#define UART_CR ( (volatile unsigned int *) ( MMIO_BASE + 0x00201030 ) ) /* Control Register */ +#define UART_RIS ( (volatile unsigned int *) ( MMIO_BASE + 0x0020103C ) ) +#define UART_IMSC ( (volatile unsigned int *) ( MMIO_BASE + 0x00201038 ) ) /* Interupt FIFO Level Select Register */ +#define UART_MIS ( (volatile unsigned int *) ( MMIO_BASE + 0x00201040 ) ) +#define UART_ICR ( (volatile unsigned int *) ( MMIO_BASE + 0x00201044 ) ) /* Interupt Clear Register */ diff --git a/lab6/kernel/include/alloc.h b/lab6/kernel/include/alloc.h new file mode 100644 index 000000000..4ad1da9ab --- /dev/null +++ b/lab6/kernel/include/alloc.h @@ -0,0 +1,22 @@ +#ifndef ALLOC_H +#define ALLOC_H + +#include + +void* simple_malloc(int, int); + +void reserve(unsigned long l, unsigned long r); +void frame_init(); + +void* frame_malloc(size_t size); +void* my_malloc(size_t size); + +void frame_free(char*); +void my_free(char*); + +void print_node_list(); +void print_pool(); + +void manage_init (); + +#endif diff --git a/lab6/kernel/include/cpio.h b/lab6/kernel/include/cpio.h new file mode 100644 index 000000000..2e6a3a252 --- /dev/null +++ b/lab6/kernel/include/cpio.h @@ -0,0 +1,29 @@ +#ifndef CPIO_H +#define CPIO_H + +struct cpio_newc_header { + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; + }; + + +void cpio_parse_ls(); +void cpio_parse_cat(char*); +void cpio_load(char*); +void* cpio_find(char*); + +char* get_cpio_end(); + +#endif diff --git a/lab6/kernel/include/exception.h b/lab6/kernel/include/exception.h new file mode 100644 index 000000000..49e60c3b2 --- /dev/null +++ b/lab6/kernel/include/exception.h @@ -0,0 +1,16 @@ +#ifndef EXCEPTION_H +#define EXCEPTION_H + +typedef struct trapframe_t{ + unsigned long long x[32]; + // x[31] is empty + unsigned long long spsr_el1; + unsigned long long elr_el1; + unsigned long long sp_el0; +} trapframe_t; +// basically all the shits stored by save_all + +void exception_entry(); +void core_timer_entry(); + +#endif diff --git a/lab6/kernel/include/fdt.h b/lab6/kernel/include/fdt.h new file mode 100644 index 000000000..b88b0cf54 --- /dev/null +++ b/lab6/kernel/include/fdt.h @@ -0,0 +1,113 @@ +// Ref: https://elixir.bootlin.com/linux/v5.16.14/source/scripts/dtc/libfdt/fdt.h +#ifndef _FDT_H +#define _FDT_H + +#include +#include + +typedef int (*fdt_parser)(int level, char *cur, char *dt_strings); + +void fdt_traversal(char *dtb); +void parse_dtb(char *dtb, fdt_parser parser); + +typedef uint32_t fdt32_t; +typedef uint64_t fdt64_t; + +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * Copyright 2012 Kim Phillips, Freescale Semiconductor. + */ + +#ifndef __ASSEMBLY__ + +struct fdt_header { + fdt32_t magic; /* magic word FDT_MAGIC */ + fdt32_t totalsize; /* total size of DT block */ + fdt32_t off_dt_struct; /* offset to structure */ + fdt32_t off_dt_strings; /* offset to strings */ + fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ + fdt32_t version; /* format version */ + fdt32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + fdt32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + fdt32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + fdt32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(fdt32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(fdt32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) + +// Ref: https://elixir.bootlin.com/linux/v5.16.14/source/scripts/dtc/libfdt/libfdt.h#L249 +#define fdt_get_header(fdt, field) \ + (fdt32_ld(&((const struct fdt_header *)(fdt))->field)) +#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) +#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) +#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) +#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) +#define fdt_version(fdt) (fdt_get_header(fdt, version)) +#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) +#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) +#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) + +#define fdtn_get_header(fdtn, field) \ + (fdt32_ld(&((const struct fdt_node_header *)(fdtn))->field)) +#define fdtn_tag(fdtn) (fdtn_get_header(fdtn, tag)) + +#define fdtp_get_header(fdtp, field) \ + (fdt32_ld(&((const struct fdt_property *)(fdtp))->field)) +#define fdtp_tag(fdtp) (fdtp_get_header(fdtp, tag)) +#define fdtp_len(fdtp) (fdtp_get_header(fdtp, len)) +#define fdtp_nameoff(fdtp) (fdtp_get_header(fdtp, nameoff)) + +// Load fdt32 (big-endian) +static inline uint32_t fdt32_ld(const fdt32_t *p) +{ + const uint8_t *bp = (const uint8_t *)p; + + return ((uint32_t)bp[0] << 24) + | ((uint32_t)bp[1] << 16) + | ((uint32_t)bp[2] << 8) + | bp[3]; +} + +typedef uint32_t (*fdt_callback)(int type, char *name, char *data, uint32_t size); +uint32_t print_dtb(int type, char *name, char *data, uint32_t size) ; +uint32_t get_initramfs_addr(int type, char *name, char *data, uint32_t size); +uint32_t fdt_traverse(fdt_callback cb); + +int get_fdt_end(); + + +#endif /* _FDT_H */ diff --git a/lab6/kernel/include/helper.h b/lab6/kernel/include/helper.h new file mode 100644 index 000000000..9f7abc7a1 --- /dev/null +++ b/lab6/kernel/include/helper.h @@ -0,0 +1,14 @@ +#ifndef HELPER_H +#define HELPER_H + +void hex_to_string(unsigned int, char*); +int same(char*, char*); + +void substr(char*, char*, int, int); +int strlen(char*); +void strcpy(char*, char*, int); + +unsigned long stoi(char*); +void delay (unsigned long long); + +#endif diff --git a/lab6/kernel/include/kernel.h b/lab6/kernel/include/kernel.h new file mode 100644 index 000000000..d2e9fcc54 --- /dev/null +++ b/lab6/kernel/include/kernel.h @@ -0,0 +1,6 @@ +#ifndef KERNEL_H +#define KERNEL_H + +void kernel_begin(char*); + +#endif diff --git a/lab6/kernel/include/loader.h b/lab6/kernel/include/loader.h new file mode 100644 index 000000000..70dcbe9d7 --- /dev/null +++ b/lab6/kernel/include/loader.h @@ -0,0 +1,6 @@ +#ifndef LOADER_H +#define LOADER_H + +void load_kernel(); + +#endif diff --git a/lab6/kernel/include/mail.h b/lab6/kernel/include/mail.h new file mode 100644 index 000000000..66ba7e515 --- /dev/null +++ b/lab6/kernel/include/mail.h @@ -0,0 +1,23 @@ +#define MMIO_BASE 0x3F000000 +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MAILBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) +#define MAILBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) +#define MAILBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14)) +#define MAILBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18)) +#define MAILBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C)) +#define MAILBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20)) +#define MAILBOX_RESPONSE 0x80000000 +#define MAILBOX_FULL 0x80000000 +#define MAILBOX_EMPTY 0x40000000 + +#define GET_BOARD_REVISION 0x00010002 +#define GET_ARM_MEMORY 0x00010005 +#define REQUEST_CODE 0x00000000 +#define REQUEST_SUCCEED 0x80000000 +#define REQUEST_FAILED 0x80000001 +#define TAG_REQUEST_CODE 0x00000000 +#define END_TAG 0x00000000 + +unsigned int get_board_revision(); +int get_arm_memory(unsigned int*); +int mailbox_call(unsigned int*, unsigned char); diff --git a/lab6/kernel/include/mini_uart.h b/lab6/kernel/include/mini_uart.h new file mode 100644 index 000000000..853929005 --- /dev/null +++ b/lab6/kernel/include/mini_uart.h @@ -0,0 +1,28 @@ +#ifndef _MINI_UART_H +#define _MINI_UART_H + +#include +#include + +void uart_init ( void ); +char uart_recv ( void ); +void uart_send ( char c ); +void uart_recv_string( char* buf ); +uint32_t uart_recv_uint(void); +void uart_printf(char* fmt, ...); +void uart_send_num(int64_t, int, int); + +void uart_irq_on(); +void uart_irq_off(); +void uart_irq_send(char*, int); +char uart_irq_read(); + +void change_read_irq(int); +void change_write_irq(int); + +void irq(int); + +void recv_handler(); +void write_handler(); + +#endif /*_MINI_UART_H */ diff --git a/lab6/kernel/include/mm.h b/lab6/kernel/include/mm.h new file mode 100644 index 000000000..784ac4b88 --- /dev/null +++ b/lab6/kernel/include/mm.h @@ -0,0 +1,19 @@ +#ifndef _MM_H +#define _MM_H + +#define PAGE_SHIFT 12 +#define TABLE_SHIFT 9 +#define SECTION_SHIFT (PAGE_SHIFT + TABLE_SHIFT) + +#define PAGE_SIZE (1 << PAGE_SHIFT) +#define SECTION_SIZE (1 << SECTION_SHIFT) + +#define LOW_MEMORY (2 * SECTION_SIZE) + +#ifndef __ASSEMBLER__ + +void memzero(unsigned long src, unsigned long n); + +#endif + +#endif /*_MM_H */ diff --git a/lab6/kernel/include/mmio.h b/lab6/kernel/include/mmio.h new file mode 100644 index 000000000..c272df237 --- /dev/null +++ b/lab6/kernel/include/mmio.h @@ -0,0 +1,8 @@ +#ifndef MMIO_H +#define MMIO_H + +void mmio_write(long reg, unsigned int data); + +unsigned int mmio_read(long reg); + +#endif diff --git a/lab6/kernel/include/peripherals/base.h b/lab6/kernel/include/peripherals/base.h new file mode 100644 index 000000000..63f9c038f --- /dev/null +++ b/lab6/kernel/include/peripherals/base.h @@ -0,0 +1,6 @@ +#ifndef _P_BASE_H +#define _P_BASE_H + +#define PBASE 0x3F000000 + +#endif /*_P_BASE_H */ diff --git a/lab6/kernel/include/peripherals/gpio.h b/lab6/kernel/include/peripherals/gpio.h new file mode 100644 index 000000000..5e9af26af --- /dev/null +++ b/lab6/kernel/include/peripherals/gpio.h @@ -0,0 +1,12 @@ +#ifndef _P_GPIO_H +#define _P_GPIO_H + +#include "peripherals/base.h" + +#define GPFSEL1 (PBASE+0x00200004) +#define GPSET0 (PBASE+0x0020001C) +#define GPCLR0 (PBASE+0x00200028) +#define GPPUD (PBASE+0x00200094) +#define GPPUDCLK0 (PBASE+0x00200098) + +#endif /*_P_GPIO_H */ diff --git a/lab6/kernel/include/peripherals/mini_uart.h b/lab6/kernel/include/peripherals/mini_uart.h new file mode 100644 index 000000000..af95a3bee --- /dev/null +++ b/lab6/kernel/include/peripherals/mini_uart.h @@ -0,0 +1,19 @@ +#ifndef _P_MINI_UART_H +#define _P_MINI_UART_H + +#include "peripherals/base.h" + +#define AUX_ENABLES (PBASE+0x00215004) +#define AUX_MU_IO_REG (PBASE+0x00215040) +#define AUX_MU_IER_REG (PBASE+0x00215044) +#define AUX_MU_IIR_REG (PBASE+0x00215048) +#define AUX_MU_LCR_REG (PBASE+0x0021504C) +#define AUX_MU_MCR_REG (PBASE+0x00215050) +#define AUX_MU_LSR_REG (PBASE+0x00215054) +#define AUX_MU_MSR_REG (PBASE+0x00215058) +#define AUX_MU_SCRATCH (PBASE+0x0021505C) +#define AUX_MU_CNTL_REG (PBASE+0x00215060) +#define AUX_MU_STAT_REG (PBASE+0x00215064) +#define AUX_MU_BAUD_REG (PBASE+0x00215068) + +#endif /*_P_MINI_UART_H */ diff --git a/lab6/kernel/include/reboot.h b/lab6/kernel/include/reboot.h new file mode 100644 index 000000000..43e0ed91e --- /dev/null +++ b/lab6/kernel/include/reboot.h @@ -0,0 +1,22 @@ +#ifndef REBOOT_H +#define REBOOT_H + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +void set(long addr, unsigned int value) { + volatile unsigned int* point = (unsigned int*)addr; + *point = value; +} + +void reset(int tick) { // reboot after watchdog timer expire + set(PM_RSTC, PM_PASSWORD | 0x20); // full reset + set(PM_WDOG, PM_PASSWORD | tick); // number of watchdog tick +} + +void cancel_reset() { + set(PM_RSTC, PM_PASSWORD | 0); // cancel reset + set(PM_WDOG, PM_PASSWORD | 0); // number of watchdog tick +} +#endif diff --git a/lab6/kernel/include/set.h b/lab6/kernel/include/set.h new file mode 100644 index 000000000..3e87e51b6 --- /dev/null +++ b/lab6/kernel/include/set.h @@ -0,0 +1,168 @@ +#ifndef SET_H +#define SET_H + +#include "mini_uart.h" +#include "alloc.h" + +typedef struct nodeList { + int key; + struct nodeList *left; + struct nodeList *right; + int height; +} nodeList; + +int height(nodeList *N) { + if (N == NULL) return 0; + return N->height; +} + +int max(int a, int b) { + return (a > b) ? a : b; +} + +nodeList* newNode(int key) { + nodeList *node = (nodeList*) simple_malloc(1, sizeof(nodeList)); + node->key = key; + node->left = NULL; + node->right = NULL; + node->height = 1; + return(node); +} + +nodeList* rightRotate(nodeList *y) { + nodeList *x = y->left; + nodeList *T2 = x->right; + + x->right = y; + y->left = T2; + + y->height = max(height(y->left), height(y->right)) + 1; + x->height = max(height(x->left), height(x->right)) + 1; + + return x; +} + +nodeList* leftRotate(nodeList *x) { + nodeList *y = x->right; + nodeList *T2 = y->left; + + y->left = x; + x->right = T2; + + x->height = max(height(x->left), height(x->right)) + 1; + y->height = max(height(y->left), height(y->right)) + 1; + + return y; +} + +int getBalance(nodeList *N) { + if (N == NULL) return 0; + return height(N->left) - height(N->right); +} + +nodeList* insert(nodeList* node, int key) { + if (node == NULL) return newNode(key); + + if (key < node->key) + node->left = insert(node->left, key); + else if (key > node->key) + node->right = insert(node->right, key); + else + return node; + + node->height = 1 + max(height(node->left), height(node->right)); + int balance = getBalance(node); + + if (balance > 1 && key < node->left->key) + return rightRotate(node); + + if (balance < -1 && key > node->right->key) + return leftRotate(node); + + if (balance > 1 && key > node->left->key) { + node->left = leftRotate(node->left); + return rightRotate(node); + } + + if (balance < -1 && key < node->right->key) { + node->right = rightRotate(node->right); + return leftRotate(node); + } + + return node; +} + +nodeList * minValueNode(nodeList* node) { + nodeList* current = node; + + while (current->left != NULL) + current = current->left; + + return current; +} + +nodeList* deleteNode(nodeList* root, int key) { + if (root == NULL) return root; + + if ( key < root->key ) + root->left = deleteNode(root->left, key); + else if( key > root->key ) + root->right = deleteNode(root->right, key); + else { + if( (root->left == NULL) || (root->right == NULL) ) { + nodeList *temp = root->left ? root->left : root->right; + + if (temp == NULL) { + temp = root; + root = NULL; + } else + *root = *temp; + } else { + nodeList* temp = minValueNode(root->right); + root->key = temp->key; + root->right = deleteNode(root->right, temp->key); + } + } + + if (root == NULL) + return root; + + root->height = 1 + max(height(root->left), height(root->right)); + int balance = getBalance(root); + + if (balance > 1 && getBalance(root->left) >= 0) + return rightRotate(root); + + if (balance > 1 && getBalance(root->left) < 0) { + root->left = leftRotate(root->left); + return rightRotate(root); + } + + if (balance < -1 && getBalance(root->right) <= 0) + return leftRotate(root); + + if (balance < -1 && getBalance(root->right) > 0) { + root->right = rightRotate(root->right); + return leftRotate(root); + } + + return root; +} + +// Function to get any arbitrary element +int getAnyElement(nodeList* root) { + if (root != NULL) { + return root->key; // Simply returns the root key as an arbitrary element + } + return -1; // or handle appropriately if the tree is empty +} + +void preOrder(nodeList* root) { + if (root != NULL) { + uart_printf("%d ", root->key); + preOrder(root->left); + preOrder(root->right); + } +} + +#endif diff --git a/lab6/kernel/include/shell.h b/lab6/kernel/include/shell.h new file mode 100644 index 000000000..43d937d48 --- /dev/null +++ b/lab6/kernel/include/shell.h @@ -0,0 +1,3 @@ + + +void shell_begin(char*); diff --git a/lab6/kernel/include/signal.h b/lab6/kernel/include/signal.h new file mode 100644 index 000000000..3cbec92d3 --- /dev/null +++ b/lab6/kernel/include/signal.h @@ -0,0 +1,8 @@ +#ifndef SIGNAL_H +#define SIGNAL_H + +void handle_signal(void*); +void sigkill(); +void signal_handler_wrapper(void*); + +#endif diff --git a/lab6/kernel/include/system_call.h b/lab6/kernel/include/system_call.h new file mode 100644 index 000000000..6f0d4335a --- /dev/null +++ b/lab6/kernel/include/system_call.h @@ -0,0 +1,26 @@ +#ifndef SYSTEM_CALL_H +#define SYSTEM_CALL_H + +#include "exception.h" +#include + +typedef void (*handler) (void); + +int do_getpid(); +size_t do_uart_read(char buf[], size_t size); +size_t do_uart_write(char buf[], size_t size); +int do_exec(char* name, char *argv[]); +int do_fork(trapframe_t*); +void do_exit(); +int do_mbox_call(unsigned char ch, unsigned int *mbox); +void do_kill(int pid); +void do_signal(int, handler); +void do_sigkill(int, int); + +void from_el1_to_fork_test(); + +// for debug purpose +void get_sp(); +void output_sp(void*); + +#endif diff --git a/lab6/kernel/include/task.h b/lab6/kernel/include/task.h new file mode 100644 index 000000000..7eda77a58 --- /dev/null +++ b/lab6/kernel/include/task.h @@ -0,0 +1,16 @@ +#ifndef TASKLIST_H +#define TASKLIST_H + +typedef void(*task_callback)(void); + +typedef struct task { + struct task *next; + task_callback callback; + int p, started; +} task; + +void execute_tasks(); +void create_task(task_callback callback,int priority); +void enqueue_task(task *new_task); + +#endif diff --git a/lab6/kernel/include/thread.h b/lab6/kernel/include/thread.h new file mode 100644 index 000000000..ba5795aa4 --- /dev/null +++ b/lab6/kernel/include/thread.h @@ -0,0 +1,27 @@ +#ifndef THREAD_H +#define THREAD_H + +typedef struct thread { + unsigned long long reg[10]; + void* fp; + void* lr; + void* sp; + void* stack_start; + void* kstack_start; + void* sstack_start; + int state, id; + struct thread* next; + struct thread* prev; + void* signal_handler[10]; // sigid at most 9 + int signal[10]; +} thread; + +void thread_init(); +void thread_test(); +void kill_zombies(); +void idle(); +void schedule(); +int thread_create(void*); +void kill_thread(int); + +#endif diff --git a/lab6/kernel/include/timer.h b/lab6/kernel/include/timer.h new file mode 100644 index 000000000..cafc570b3 --- /dev/null +++ b/lab6/kernel/include/timer.h @@ -0,0 +1,17 @@ +#ifndef TIMER_H +#define TIMER_H + +typedef void (*timer_callback)(char*); + +typedef struct timer { + struct timer* next; + char data[100]; + timer_callback callback; + unsigned long long exp; +} timer; + +timer* create_timer(unsigned long long exp, char* str); +void print_data(char* str); +void set_timeout(unsigned long long s, char* str); + +#endif diff --git a/lab6/kernel/include/utils.h b/lab6/kernel/include/utils.h new file mode 100644 index 000000000..436890797 --- /dev/null +++ b/lab6/kernel/include/utils.h @@ -0,0 +1,9 @@ +#ifndef _BOOT_H +#define _BOOT_H + +extern void put32 ( unsigned long, unsigned int ); +extern unsigned int get32 ( unsigned long ); + + + +#endif /*_BOOT_H */ diff --git a/lab6/kernel/kernel8.img b/lab6/kernel/kernel8.img new file mode 100755 index 0000000000000000000000000000000000000000..2d76c901c8e903a68279f796fd2fe206f495ed7f GIT binary patch literal 33696 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 12; + unsigned long r_frame = r >> 12; + + for (unsigned long i = l_frame; i <= r_frame; i ++) { + frame_par[i] = -1; + } +} + +void* simple_malloc(int num, int size) { + if ((int)now % size != 0) now += size - (int)now % size; // align + if (limit && now + num * size >= limit) { + uart_printf ("you're allocator is going to fuck you\r\n"); + } + now += num * size; + return (char*)(now - num * size); +} + +void print_node_list() { + for (int i = 0; i < 6; i ++) { + uart_printf("size %d: \r\n", i); + preOrder(node_arr[i]); + uart_printf("\r\n"); + } +} + +void print_pool() { + uart_printf("cur pool:\r\n"); + preOrder(node_arr[20]); + uart_printf("\r\n"); +} + +void add_node_list(int ind, int pos) { + node_arr[ind] = insert(node_arr[ind], pos); +} + +void remove_node_list(int ind, int pos) { + node_arr[ind] = deleteNode(node_arr[ind], pos); +} + +int pop_node_list(int ind) { + int t = getAnyElement(node_arr[ind]); + if (t == -1) { + return t; + } + node_arr[ind] = deleteNode(node_arr[ind], t); + return t; +} + + +void manage_init() { + frame_pool = simple_malloc(arr_size, sizeof(char)); + for (int i = 0; i < arr_size; i ++) { + frame_pool[i] = 0; + } + frame_par = simple_malloc(arr_size, sizeof(int)); + frame_sz = simple_malloc(arr_size, sizeof(char)); + for (int i = 0; i < arr_size; i ++) { + frame_par[i] = i; + frame_sz[i] = 0; + } + for (int i = 0; i <= 20; i ++) { + node_arr[i] = NULL; + } + + reserve (0, 0x1000); + reserve (0x80000, 0x100000); + reserve (manage_start, now + sizeof(struct nodeList) * 10000); + limit = now + sizeof(struct nodeList) * 10000; + // TODO This is SHIT, might potentially cause problem + reserve (fdt_addr, get_fdt_end()); + reserve (_cpio_file, get_cpio_end()); + + for (int i = 1; (1 << i) <= arr_size ; i ++) { + for (int j = 0; j + (1 << i) <= arr_size; j += (1 << i)) { + int l = j, r = j + (1 << (i - 1)); + if (frame_par[l] == l && frame_par[r] == r) { + frame_par[r] = l; + frame_sz[l] ++; + } + } + } + // build the initial layout + + for (int i = 0; i < arr_size; i ++) { + if (frame_par[i] == i) { + int sz = frame_sz[i]; + add_node_list(sz, i); + } + } +} + +void* frame_malloc(size_t size) { + int sz = 0, t = 1; + while (t < size) { + t <<= 1; + sz ++; + } + + int pos = 0, tsz; + for (tsz = sz; tsz < 20; tsz ++) { + pos = pop_node_list(tsz); + if (pos != -1) { + break; + } + } + + if (pos == -1) { + return 0; + } + + while (tsz > sz) { + int pt = pos + (1 << (tsz - 1)); + frame_par[pt] = pt; + frame_sz[pos] --; + + remove_node_list(tsz, pos); + tsz --; + add_node_list(tsz, pos); + add_node_list(tsz, pt); + + } + + if (frame_sz[pos] != sz) { + uart_printf("Something went wrong at malloc...\r\n"); + } + remove_node_list(sz, pos); + frame_par[pos] = -1; + return (void*)(pos << 12); +} + +void frame_free(char* addr) { + int p = (int)addr >> 12; + frame_par[p] = p; + add_node_list (frame_sz[p], p); + while (1) { + int sz = frame_sz[p]; + if ((p / (1 << sz)) % 2) { + p -= (1 << sz); + } + + int l = p, r = p + (1 << sz); + if (r >= arr_size) { + break; + } + + if (frame_par[l] == l && frame_par[r] == r) { + remove_node_list(sz, l); + remove_node_list(sz, r); + frame_sz[l] ++; + add_node_list(sz + 1, l); + p = l; + } + else { + break; + } + } +} + +const int chunk_size = 512; +// should be divisor of 4096 + +void* my_malloc(size_t size) { + if (size > chunk_size) { + return frame_malloc((size + 4096 - 1) / 4096); + } + if (node_arr[20] == NULL) { + char* t = frame_malloc(1); + for (char* i = t; i < t + 4096; i += chunk_size) { + add_node_list(20, i); + } + } + int pos = pop_node_list(20); + if (pos == -1) { + uart_printf ("Failing to get a small chunk\r\n"); + return 0; + } + frame_pool[pos >> 12] ++; + return pos; +} + +void my_free(char* addr) { + int pos = (int)addr >> 12; + if (!frame_pool[pos]) { + frame_free(addr); + return; + } + add_node_list(20, addr); + frame_pool[pos] --; + if (frame_pool[pos] == 0) { + for (int i = pos << 12; i < (pos << 12) + 4096; i += chunk_size) { + remove_node_list(20, i); + } + frame_free(pos << 12); + } +} diff --git a/lab6/kernel/src/boot.S b/lab6/kernel/src/boot.S new file mode 100644 index 000000000..e6add013b --- /dev/null +++ b/lab6/kernel/src/boot.S @@ -0,0 +1,251 @@ +// #include "mm.h" + +#define CORE0_TIMER_IRQ_CTRL 0x40000040 + +.section ".text.boot" + +.globl _start +_start: + mov x19, x0 + + mrs x0, mpidr_el1 + and x0, x0,#0xFF // Check processor id + cbz x0, master // Hang for all non-primary CPU + b proc_hang + +proc_hang: + b proc_hang + +master: + bl from_el2_to_el1 + + ldr x1, =0x100000 + mov sp, x1 + + + adr x0, bss_begin + adr x1, bss_end + sub x1, x1, x0 + bl memzero + + bl set_exception_vector_table + + // bl from_el1_to_el0 + + // bl core_timer_enable + + msr daifclr, 0xf // enable el1 interrupt + + mov x0, x19 // get fdt back + bl kernel_begin + b proc_hang // should never come here + + +from_el2_to_el1: + mov x0, (1 << 31) + msr hcr_el2, x0 + mov x0, 5 + msr spsr_el2, x0 + msr elr_el2, lr + eret + +// save general registers to stack +.macro save_all + sub sp, sp, 32 * 10 + stp x0, x1, [sp ,16 * 0] + stp x2, x3, [sp ,16 * 1] + stp x4, x5, [sp ,16 * 2] + stp x6, x7, [sp ,16 * 3] + stp x8, x9, [sp ,16 * 4] + stp x10, x11, [sp ,16 * 5] + stp x12, x13, [sp ,16 * 6] + stp x14, x15, [sp ,16 * 7] + stp x16, x17, [sp ,16 * 8] + stp x18, x19, [sp ,16 * 9] + stp x20, x21, [sp ,16 * 10] + stp x22, x23, [sp ,16 * 11] + stp x24, x25, [sp ,16 * 12] + stp x26, x27, [sp ,16 * 13] + stp x28, x29, [sp ,16 * 14] + str x30, [sp, 16 * 15] + // empty 8 bytes + + mrs x0, SPSR_EL1 + mrs x1, ELR_EL1 + stp x0, x1, [sp, 16 * 16] + mrs x0, sp_el0 + str x0, [sp, 16 * 17] + // nested shit + +.endm + +// load general registers from stack +.macro load_all + ldp x0, x1, [sp, 16 * 16] + msr SPSR_EL1, x0 + msr ELR_EL1, x1 + ldr x0, [sp, 16 * 17] + msr sp_el0, x0 + + ldp x0, x1, [sp ,16 * 0] + ldp x2, x3, [sp ,16 * 1] + ldp x4, x5, [sp ,16 * 2] + ldp x6, x7, [sp ,16 * 3] + ldp x8, x9, [sp ,16 * 4] + ldp x10, x11, [sp ,16 * 5] + ldp x12, x13, [sp ,16 * 6] + ldp x14, x15, [sp ,16 * 7] + ldp x16, x17, [sp ,16 * 8] + ldp x18, x19, [sp ,16 * 9] + ldp x20, x21, [sp ,16 * 10] + ldp x22, x23, [sp ,16 * 11] + ldp x24, x25, [sp ,16 * 12] + ldp x26, x27, [sp ,16 * 13] + ldp x28, x29, [sp ,16 * 14] + ldr x30, [sp, 16 * 15] + + add sp, sp, 32 * 10 +.endm + +exception_handler: + save_all + mov x0, sp + bl exception_entry + load_all + eret + +.global core_timer_enable +core_timer_enable: + mov x0, 1 + msr cntp_ctl_el0, x0 + // mrs x0, cntfrq_el0 + mov x0, 0 + msr cntp_tval_el0, x0 + mov x0, 2 + ldr x1, =CORE0_TIMER_IRQ_CTRL + str w0, [x1] + mrs x0, cntkctl_el1 + orr x0, x0, #1 + msr cntkctl_el1, x0 + + ret + +core_timer_handler: + save_all + bl core_timer_entry + load_all + eret + +general_irq_handler: + save_all + bl c_general_irq_handler + mov x0, sp + bl handle_signal + load_all + eret + +system_call_handler: + cmp x8, #10 + beq system_call_handler_end + save_all + mov x0, sp + bl c_system_call_handler +system_call_handler_end: + load_all + eret + +sig_return_handler: + load_all + eret + +undefined_exception: + bl c_undefined_exception + +.align 11 +.global exception_vector_table +exception_vector_table: + b undefined_exception + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + + b system_call_handler + .align 7 + b general_irq_handler + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + + b system_call_handler + .align 7 + b general_irq_handler + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + + b undefined_exception + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + b undefined_exception + .align 7 + +set_exception_vector_table: + adr x0, exception_vector_table + msr vbar_el1, x0 + ret + +/* +.global to_el0_with_timer +to_el0_with_timer: + mov x29, lr + bl from_el1_to_el0 + bl core_timer_enable + b proc_hang + mov lr, x29 + ret +*/ + +.global switch_to +switch_to: + stp x19, x20, [x0, 16 * 0] + stp x21, x22, [x0, 16 * 1] + stp x23, x24, [x0, 16 * 2] + stp x25, x26, [x0, 16 * 3] + stp x27, x28, [x0, 16 * 4] + stp fp, lr, [x0, 16 * 5] + mov x9, sp + str x9, [x0, 16 * 6] + + ldp x19, x20, [x1, 16 * 0] + ldp x21, x22, [x1, 16 * 1] + ldp x23, x24, [x1, 16 * 2] + ldp x25, x26, [x1, 16 * 3] + ldp x27, x28, [x1, 16 * 4] + ldp fp, lr, [x1, 16 * 5] + ldr x9, [x1, 16 * 6] + mov sp, x9 + msr tpidr_el1, x1 + + ret + +.global get_current +get_current: + mrs x0, tpidr_el1 + ret + +.global ret_from_fork_child +ret_from_fork_child: + load_all + msr DAIFclr, 0xf + eret diff --git a/lab6/kernel/src/config.txt b/lab6/kernel/src/config.txt new file mode 100644 index 000000000..279349696 --- /dev/null +++ b/lab6/kernel/src/config.txt @@ -0,0 +1,2 @@ +kernel_old=1 +disable_commandline_tags=1 diff --git a/lab6/kernel/src/cpio.c b/lab6/kernel/src/cpio.c new file mode 100644 index 000000000..9065b0cc5 --- /dev/null +++ b/lab6/kernel/src/cpio.c @@ -0,0 +1,197 @@ +#include +#include +#include "cpio.h" +#include "mini_uart.h" +#include "helper.h" +#include "alloc.h" +#include "thread.h" + +extern char* _cpio_file; +char buff[1024]; + +uint8_t hex_char_to_bin(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return 0; // Not a valid hexadecimal character +} + +uint64_t hex_to_bin(const char* hex) { + uint64_t result = 0; + for(int i = 0; i < 8; i ++) { + result = (result << 4) | hex_char_to_bin(hex[i]); + } + return result; +} + +void* cpio_find(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + return filedata; + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return 0; +} + +void cpio_parse_ls() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + uart_printf("%s\r\n", buff); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +void cpio_parse_cat(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + uart_printf ("Cat %d\r\n", filesize); + substr(buff, filedata, 0, filesize - 1); + uart_printf("%s\r\n", buff); + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +extern thread* get_current(); + +void cpio_load(char* str) { + irq(0); + /* + void* t = my_malloc (4096); + stack += 4096 - 16; + */ + void* pos = cpio_find(str); + void* code = my_malloc(4096 * 64); + strcpy(pos, code, 4096 * 64); + + thread_init(); + + void* stack = get_current() -> stack_start + 4096 - 16; + void* el1_sp = get_current() -> sp; + + uart_printf("Running code from %x...\n", code); + + // uart_irq_on(); + + /* + uart_irq_send ("fuck me\r\n", 9); + + char buf[1]; + + while (1) { + buf[0] = uart_irq_read(); + if (buf[0]) { + uart_irq_send(buf, 1); + } + delay(1e7); + uart_irq_send ("fuck me\r\n", 9); + } + */ + + asm volatile( + "mov x1, 0;" + "msr spsr_el1, x1;" + "mov x1, %[code];" + "mov x2, %[sp];" + "msr elr_el1, x1;" + "msr sp_el0, x2;" + "msr DAIFclr, 0xf;" + "mov sp, %[sp_el1];" + "eret;" + : + : [code] "r" (code), [sp] "r" (stack), [sp_el1] "r" (el1_sp) + : "x1", "x2", "sp" + ); +} + +char* get_cpio_end() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + return filedata + filesize; + } + + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return header; +} diff --git a/lab6/kernel/src/exception.c b/lab6/kernel/src/exception.c new file mode 100644 index 000000000..12aca3c7b --- /dev/null +++ b/lab6/kernel/src/exception.c @@ -0,0 +1,180 @@ +#include "exception.h" +#include "mini_uart.h" +#include "utils.h" +#include "mmio.h" +#include "DEFINE.h" +#include "timer.h" +#include "task.h" +#include "system_call.h" +#include "thread.h" + +#include + +/* +extern char* write_buffer; +extern int write_ind; +extern int write_tail; + +extern char* recv_buffer; +extern int recv_ind; +extern int recv_tail; +extern int flag; +*/ + +extern timer* head; + +void exception_entry(){ + uart_printf("Entering exception handler\r\n"); + + void *spsr1; + void *elr1; + void *esr1; + + asm volatile( + "mrs %[var1], spsr_el1;" + "mrs %[var2], elr_el1;" + "mrs %[var3], esr_el1;" + : [var1] "=r" (spsr1),[var2] "=r" (elr1),[var3] "=r" (esr1) + ); + + uart_printf("SPSR_EL1: %x\r\n", spsr1); + uart_printf("ELR_EL1: %x\r\n", elr1); + uart_printf("ESR_EL1: %x\r\n", esr1); + + return; +} + +void core_timer_entry() { + unsigned long long cur_cnt, cnt_freq; + + asm volatile( + "mrs %[var1], cntpct_el0;" + "mrs %[var2], cntfrq_el0;" + :[var1] "=r" (cur_cnt), [var2] "=r" (cnt_freq) + ); + + asm volatile("msr cntp_ctl_el0,%0"::"r"(0)); + irq(0); + + if (head == NULL) { + irq(1); + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; + return; + } + while (head -> next != NULL && head -> next -> exp <= cur_cnt) { + head -> next -> callback(head -> next -> data); + head = head -> next; + } + if (head -> next != NULL) { + asm volatile("msr cntp_cval_el0, %0"::"r"(head -> next -> exp)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } + + irq(1); + unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + *address = 2; +} + +void simple_core_timer_entry() { + // irq closed before getting in + unsigned long long cur_cnt, cnt_freq; + + asm volatile( + "mrs %[var1], cntpct_el0;" + "mrs %[var2], cntfrq_el0;" + :[var1] "=r" (cur_cnt), [var2] "=r" (cnt_freq) + ); + // uart_printf ("now is %d\r\n", cur_cnt / cnt_freq); + asm volatile("msr cntp_tval_el0, %0"::"r"(cnt_freq >> 5)); + // unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + // *address = 2; + + schedule(); + // uart_printf ("I'm back\r\n"); +} + + +void c_general_irq_handler(){ + unsigned int gpu_irq_src = mmio_read((long)IRQ_pending_1); + unsigned int cpu_irq_src = mmio_read((long)CORE0_INT_SRC); + + irq(0); + + if(gpu_irq_src & (1 << 29)){ + + unsigned int irq_status = mmio_read((long)AUX_MU_IIR_REG); + if(irq_status & 0x4){ + // uart_printf ("[DEBUG] irq read\r\n"); + // change_read_irq(0); + // create_task(recv_handler, 5); + recv_handler(); + } + else if(irq_status & 0x2){ + // uart_printf ("[DEBUG] irq write\r\n"); + // change_write_irq(0); + // create_task(write_handler, 5); + write_handler(); + } + } + else if (cpu_irq_src & (0x1 << 1)) { + // unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; + // *address = 0; + // create_task(simple_core_timer_entry, 5); + simple_core_timer_entry(); + } + irq(1); + // execute_tasks(); + +} + +void c_undefined_exception() { + uart_printf("This is a undefined exception. Proc hang\r\n"); + while (1); +} + +void c_system_call_handler(trapframe_t* tf) { + irq(0); + int id = tf -> x[8]; + // uart_printf ("having exception of id %d\r\n", id); + if (id == 0) { + tf -> x[0] = do_getpid(); + } + else if (id == 1) { + irq(1); + tf -> x[0] = do_uart_read(tf -> x[0], tf -> x[1]); + } + else if (id == 2) { + irq(1); + tf -> x[0] = do_uart_write(tf -> x[0], tf -> x[1]); + } + else if (id == 3) { + tf -> x[0] = do_exec(tf -> x[0], tf -> x[1]); + } + else if (id == 4) { + tf -> x[0] = do_fork(tf); + } + else if (id == 5) { + do_exit(); + } + else if (id == 6) { + tf -> x[0] = do_mbox_call(tf -> x[0], tf -> x[1]); + } + else if (id == 7) { + do_kill(tf -> x[0]); + } + else if (id == 8) { + uart_printf ("Do a register\r\n"); + do_signal(tf -> x[0], tf -> x[1]); + } + else if (id == 9) { + uart_printf ("Do a kill\r\n"); + do_sigkill(tf -> x[0], tf -> x[1]); + } + else { + uart_printf ("This is unexpected systemcall, proc hang\r\n"); + while (1); + } + // uart_printf ("Exception ended with return value = %d\r\n", tf -> x[0]); + irq(1); +} diff --git a/lab6/kernel/src/fdt.c b/lab6/kernel/src/fdt.c new file mode 100644 index 000000000..d8fe9d3a4 --- /dev/null +++ b/lab6/kernel/src/fdt.c @@ -0,0 +1,128 @@ +#include "fdt.h" +#include "mini_uart.h" +#include +#include "helper.h" + +char* _cpio_file; +char* _fdt_end; +char* fdt_addr; + +void _print_tab(int level) +{ + while (level--) { + uart_printf("\t"); + } +} + +void _dump(char *start, int len) +{ + for(int i = 0; i < len; i ++) { + if (start[i] >= 0x20 && start[i] <= 0x7e) uart_send(start[i]); + else uart_printf("%x", start[i]); + } +} + +char* ALIGN(uint64_t ptr, int x) { + if (ptr & 3) { + ptr = (ptr + (4 - (ptr & 3))); + } + return (char*)ptr; +} + +uint32_t print_dtb(int type, char *name, char *data, uint32_t size) +{ + static int tb = 0; + if (type == FDT_BEGIN_NODE) { + _print_tab(tb); + uart_printf("[*] Node: %s\r\n", name); + tb ++; + } + else if(type == FDT_END_NODE) { + tb --; + _print_tab(tb); + uart_printf("[*] Node: end\r\n"); + } + else if(type == FDT_PROP) { + _print_tab(tb); + uart_printf("[*] %s: ", name); + _dump(data, size); + uart_printf("\r\n"); + } + else if(type == FDT_NOP) { + + } + else { + uart_printf("[*] END!\r\n"); + } + + return 0; +} + +uint32_t get_initramfs_addr(int type, char* name, char* data, uint32_t size) +{ + if (type == FDT_PROP && same(name, "linux,initrd-start")) { + _cpio_file=(char *)(uintptr_t)fdt32_ld((void*)data); + } + return 0; +} + +uint32_t parse_dt_struct(fdt_callback cb, char *dt_struct, char *dt_strings) { + // inside a struct + char *cur = dt_struct; + + while (1) { + cur = (char *)ALIGN((uint64_t)cur, 4); + struct fdt_node_header *nodehdr = (struct fdt_node_header *)cur; + uint32_t tag = fdtn_tag(nodehdr), t = 0; + + if (tag == FDT_BEGIN_NODE) { + t = cb(FDT_BEGIN_NODE, "", nodehdr -> name, -1); + cur += sizeof(struct fdt_node_header) + strlen(nodehdr->name) + 1; + } + else if (tag == FDT_END_NODE) { + t = cb(FDT_END_NODE, "", "", -1); + cur += sizeof(struct fdt_node_header); + } + else if (tag == FDT_PROP) { + struct fdt_property *prop = (struct fdt_property *)nodehdr; + t = cb(FDT_PROP, dt_strings + fdtp_nameoff(prop), prop -> data, fdtp_len(prop)); + cur += sizeof(struct fdt_property); + cur += fdtp_len(prop); + } + else if (tag == FDT_NOP) { + t = cb(FDT_NOP, "", "", -1); + cur += sizeof(struct fdt_node_header); + } + else { + t = cb(FDT_END, "", "", -1); + cur += sizeof(struct fdt_node_header); + break; + } + if ( t != 0 ) return t; + } + _fdt_end = cur; + return 0; +} + +uint32_t fdt_traverse(fdt_callback cb) +{ + struct fdt_header *hdr = (struct fdt_header *)fdt_addr; + + if (fdt_magic(hdr) != FDT_MAGIC) { + uart_printf("[x] Not valid fdt_header\r\n"); + } + + char *dt_struct = fdt_addr + fdt_off_dt_struct(hdr); + char *dt_strings = fdt_addr + fdt_off_dt_strings(hdr); + + uint32_t r = parse_dt_struct(cb, dt_struct, dt_strings); + + return r; +} + +int get_fdt_end() { + if (_fdt_end == 0) { + uart_printf ("You haven't get fdt_end\r\n"); + } + return _fdt_end; +} diff --git a/lab6/kernel/src/helper.c b/lab6/kernel/src/helper.c new file mode 100644 index 000000000..03aa03dcd --- /dev/null +++ b/lab6/kernel/src/helper.c @@ -0,0 +1,51 @@ +#include "mini_uart.h" + +void hex_to_string(unsigned int x, char* buf) { + buf[0] = '0'; buf[1] = 'x'; + char arr[16] = "0123456789abcdef"; + for (int i = 0; i < 8; i++) { + unsigned char ch = (x >> ((32-4) - i*4)) & 0xF; + buf[i + 2] = arr[ch]; + } + buf[10] = '\0'; +} + +int same (char* one, char* two) { + for(int i = 0; ; i ++) { + if(one[i] == '\0' && two[i] == '\0') return 1; + if(one[i] != two[i]) return 0; + } +} + +void substr(char* to, char* from, int l, int r) { + for(int i = l; i <= r; i ++) { + to[i - l] = from[i]; + } + to[r - l + 1] = '\0'; +} + +int strlen(char* str) { + int t = 0; + while(str[t] != '\0') { + t ++; + } + return t; +} + +unsigned long stoi(char* str) { + unsigned long res = 0; + for(int i = 0; str[i] != '\0'; i ++) { + res = res * 10 + str[i] - '0'; + } + return res; +} + +void strcpy(char* from, char* to, int size) { + for (int i = 0; i < size; i ++) { + to[i] = from[i]; + } +} + +void delay (unsigned long long t) { + while (t --); +} diff --git a/lab6/kernel/src/kernel_start.c b/lab6/kernel/src/kernel_start.c new file mode 100644 index 000000000..4227cc5f8 --- /dev/null +++ b/lab6/kernel/src/kernel_start.c @@ -0,0 +1,24 @@ +#include +#include +#include "fdt.h" +#include "cpio.h" +#include "alloc.h" +#include "thread.h" + +extern char _bootloader[]; +extern void core_timer_enable(); +extern char* fdt_addr; + +void kernel_begin(char* fdt) { + fdt_addr = fdt; + uart_init(); + + fdt_traverse(get_initramfs_addr); // also set _cpio_file + manage_init(); + // core_timer_enable(); + + thread_init(); + + shell_begin(fdt); + return; +} diff --git a/lab6/kernel/src/linker.ld b/lab6/kernel/src/linker.ld new file mode 100644 index 000000000..a26d7cae4 --- /dev/null +++ b/lab6/kernel/src/linker.ld @@ -0,0 +1,12 @@ +SECTIONS +{ + . = 0x80000; + .text.boot : { *(.text.boot) } + .text : { *(.text) } + .rodata : { *(.rodata) } + .data : { *(.data) } + . = ALIGN(0x8); + bss_begin = .; + .bss : { *(.bss*) } + bss_end = .; +} diff --git a/lab6/kernel/src/mail.c b/lab6/kernel/src/mail.c new file mode 100644 index 000000000..fef31238e --- /dev/null +++ b/lab6/kernel/src/mail.c @@ -0,0 +1,57 @@ +#include "mini_uart.h" +#include "mail.h" + +int mailbox_call(unsigned int *mailbox, unsigned char ch) { + unsigned int r = (unsigned int)(((unsigned long)mailbox) & (~0xF)) | (ch & 0xF); + while(*MAILBOX_STATUS & MAILBOX_FULL); + *MAILBOX_WRITE = r; + while(1) { + while(*MAILBOX_STATUS & MAILBOX_EMPTY); + // uart_send_string("Trying to get the result from mailbox...\r\n"); + if(r == *MAILBOX_READ) + return mailbox[1] == REQUEST_SUCCEED; + } + return 0; +} + +unsigned int get_board_revision(){ + unsigned int __attribute__((aligned(16))) mailbox[7]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + if (mailbox_call(mailbox, 8) ) { + return mailbox[5]; + } + else { + return 0; + } +} + +int get_arm_memory(unsigned int* arr) { + unsigned int __attribute__((aligned(16))) mailbox[8]; + mailbox[0] = 8 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_ARM_MEMORY; // tag identifier + mailbox[3] = 8; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + mailbox[6] = 0; // value buffer + // tags end + mailbox[7] = END_TAG; + + if (mailbox_call(mailbox, 8)) { + arr[0] = mailbox[5]; arr[1] = mailbox[6]; + return 0; + } + else { + return -1; + } +} diff --git a/lab6/kernel/src/mini_uart.c b/lab6/kernel/src/mini_uart.c new file mode 100644 index 000000000..396e1019e --- /dev/null +++ b/lab6/kernel/src/mini_uart.c @@ -0,0 +1,280 @@ +#include "utils.h" +#include "helper.h" +#include "mmio.h" + +#include "DEFINE.h" + +#include +#include + + +#define SIGN 1 + +char write_buffer[1024]; +int write_tail = 0, write_ind = 0; +char recv_buffer[1024]; +int recv_tail = 0, recv_ind = 0; + +void uart_send ( char c ) +{ + while(1) { + if(get32(AUX_MU_LSR_REG)&0x20) + break; + } + put32(AUX_MU_IO_REG,c); +} + +char uart_recv ( void ) +{ + while(1) { + if(get32(AUX_MU_LSR_REG)&0x01) + break; + } + return(get32(AUX_MU_IO_REG)&0xFF); +} + +void uart_recv_string( char* buf ) { + int m = 0; + while(1) { + while(1) { + if(get32(AUX_MU_LSR_REG)&0x01) + break; + } + buf[m ++] = get32(AUX_MU_IO_REG) & 0xFF; + if (buf[m - 1] == '\r') { + m --; + break; + } + if (buf[m - 1] == 127) { + m --; + continue; + } + uart_send(buf[m - 1]); + } + buf[m] = '\0'; +} + +uint32_t uart_recv_uint(void) +{ + char buf[4]; + + for (int i = 0; i < 4; ++i) { + buf[i] = uart_recv(); + } + + return *((uint32_t*)buf); +} + +void uart_send_string(char* str) { + for(int i = 0; str[i] != '\0'; i ++) { + uart_send(str[i]); + } +} + + +void uart_send_num(int64_t num, int base, int type) +{ + const char digits[16] = "0123456789ABCDEF"; + char tmp[66]; + int i; + + if (type & SIGN) { + if (num < 0) { + uart_send('-'); + } + } + + i = 0; + + if (num == 0) { + tmp[i++] = '0'; + } else { + while (num != 0) { + uint8_t r = ((uint64_t)num) % base; + num = ((uint64_t)num) / base; + tmp[i++] = digits[r]; + } + } + + while (--i >= 0) { + uart_send(tmp[i]); + } +} + +// Ref: https://elixir.bootlin.com/linux/v3.5/source/arch/x86/boot/printf.c#L115 +void uart_printf(char *fmt, ...) +{ + const char *s; + char c; + uint64_t num; + char width; + + va_list args; + va_start(args, fmt); + + for (; *fmt; ++fmt) { + if (*fmt != '%') { + uart_send(*fmt); + continue; + } + + ++fmt; + + // Get width + width = 0; + if (fmt[0] == 'l' && fmt[1] == 'l') { + width = 1; + fmt += 2; + } + + switch (*fmt) { + case 'c': + c = va_arg(args, uint32_t) & 0xff; + uart_send(c); + continue; + case 'd': + if (width) { + num = va_arg(args, int64_t); + } else { + num = va_arg(args, int32_t); + } + uart_send_num(num, 10, SIGN); + continue; + case 's': + s = va_arg(args, char *); + uart_send_string((char*)s); + continue; + case 'x': + if (width) { + num = va_arg(args, uint64_t); + } else { + num = va_arg(args, uint32_t); + } + uart_send_num(num, 16, 0); + continue; + } + } +} + + +void uart_init ( void ) +{ + unsigned int selector; + + selector = get32(GPFSEL1); + selector &= ~(7<<12); // clean gpio14 + selector |= 2<<12; // set alt5 for gpio14 + selector &= ~(7<<15); // clean gpio15 + selector |= 2<<15; // set alt5 for gpio15 + put32(GPFSEL1,selector); + + put32(GPPUD,0); + delay(150); + put32(GPPUDCLK0,(1<<14)|(1<<15)); + delay(150); + put32(GPPUDCLK0,0); + + + + put32(AUX_ENABLE,1); //Enable mini uart (this also enables access to its registers) + put32(AUX_MU_CNTL_REG,0); //Disable auto flow control and disable receiver and transmitter (for now) + put32(AUX_MU_IER_REG,0); //Disable receive and transmit interrupts + put32(AUX_MU_LCR_REG,3); //Enable 8 bit mode + put32(AUX_MU_MCR_REG,0); //Set RTS line to be always high + put32(AUX_MU_BAUD_REG,270); //Set baud rate to 115200 + + put32(AUX_MU_CNTL_REG,3); //Finally, enable transmitter and receiver + + *UART_ICR = 0x7FF; /* clear interrupts */ + *UART_FBRD = 0xB; + *UART_LCRH = 0b11 << 5; /* 8n1 */ + *UART_CR = 0x301; /* enable Tx, Rx, FIFO */ + *UART_IMSC = 3 << 4; /* Tx, Rx */ +} + +void irq(int d) { + if (d) { + asm volatile ("msr DAIFclr, 0xf"); + // uart_printf ("IRQ is on\r\n"); + } + else { + asm volatile ("msr DAIFset, 0xf"); + // uart_printf ("IRQ is off\r\n"); + } +} + +void change_read_irq(int d) { + if (d) { + mmio_write((long)AUX_MU_IER_REG, *AUX_MU_IER_REG | (0x1)); + } + else { + mmio_write((long)AUX_MU_IER_REG, *AUX_MU_IER_REG & ~(0x1)); + } +} + +void change_write_irq(int d) { + if (d) { + mmio_write((long)AUX_MU_IER_REG, *AUX_MU_IER_REG | (0x2)); + } + else { + mmio_write((long)AUX_MU_IER_REG, *AUX_MU_IER_REG & ~(0x2)); + } +} + +void uart_irq_on(){ + change_read_irq(1); + *Enable_IRQs_1 |= (1<<29); +} + +void uart_irq_off(){ + change_read_irq(0); + *Disable_IRQs_1 |= (1<<29); +} + +void uart_irq_send(char* c, int siz) { + for (int i = 0; i < siz; i ++) { + if (c[i] == 0) continue; + write_buffer[write_tail ++] = c[i]; + } + if (write_tail > write_ind) { + change_write_irq(1); + } +} + +char uart_irq_read() { + // uart_printf ("%d, %d\r\n", recv_ind, recv_tail); + if (recv_ind >= recv_tail) { + return 0; + } + else { + return recv_buffer[recv_ind ++]; + } +} +void write_handler(){ + change_write_irq(0); + irq(0); + + while(write_ind != write_tail){ + char c = write_buffer[write_ind++]; + while (!(*AUX_MU_LSR_REG & (1 << 5))) { + asm volatile ( "nop;" ); + } + *AUX_MU_IO_REG = (unsigned int)c; + } + irq(1); +} + +void recv_handler(){ + + irq(0); + + while ((*AUX_MU_LSR_REG & 1)) { + char c = (char)(*AUX_MU_IO_REG); + if (c != 0) { + recv_buffer[recv_tail ++] = c; + } + } + // change_read_irq(1); + + irq(1); +} diff --git a/lab6/kernel/src/mm.S b/lab6/kernel/src/mm.S new file mode 100644 index 000000000..1bd32ff37 --- /dev/null +++ b/lab6/kernel/src/mm.S @@ -0,0 +1,6 @@ +.globl memzero +memzero: + str xzr, [x0], #8 + subs x1, x1, #8 + b.gt memzero + ret diff --git a/lab6/kernel/src/mmio.c b/lab6/kernel/src/mmio.c new file mode 100644 index 000000000..ffa7a16ec --- /dev/null +++ b/lab6/kernel/src/mmio.c @@ -0,0 +1,9 @@ +#include "mmio.h" + +inline void mmio_write(long reg, unsigned int data){ + *(volatile unsigned int*)reg = data; +} + +inline unsigned int mmio_read(long reg){ + return *(volatile unsigned int*)reg; +} diff --git a/lab6/kernel/src/shell.c b/lab6/kernel/src/shell.c new file mode 100644 index 000000000..395482c12 --- /dev/null +++ b/lab6/kernel/src/shell.c @@ -0,0 +1,211 @@ +#include "shell.h" +#include "mini_uart.h" +#include "reboot.h" +#include "mail.h" +#include "helper.h" +#include "loader.h" +#include "cpio.h" +#include "alloc.h" +#include "fdt.h" +#include "timer.h" +#include "exception.h" +#include "thread.h" +#include "system_call.h" +#include "signal.h" + +char buf[1024]; + +extern void core_timer_enable(); + +void help() { + uart_printf("help : print this help menu\r\n"); + uart_printf("hello : print Hello World!\r\n"); + uart_printf("reboot : reboot the device\r\n"); + uart_printf("revision : get the revision number\r\n"); + uart_printf("memory : get the ARM memory info\r\n"); + uart_printf("ls : ls the initial ramdisk\r\n"); + uart_printf("cat : cat the initial ramdisk\r\n"); + uart_printf("initramd : use devicetree to get initial ramdisk\r\n"); + uart_printf("dtb : output the device tree\r\n"); + uart_printf("async : test for async uart\r\n"); + uart_printf("timeout : set timeout (ms)\r\n"); +} + +void handle_timeout() { + char* buf = my_malloc(512); + uart_printf("Input time(ms): "); + uart_recv_string(buf); + unsigned long t = stoi(buf); + uart_printf("\n"); + uart_printf("Input data to output: "); + uart_recv_string(buf); + uart_printf("\n"); + set_timeout(t, buf); +} + +void async_test() { + uart_irq_on(); + + uart_irq_send("Test\n", 5); + + int t = 100000000; + while (t --); + + char* str = my_malloc(512); + int len; + for (len = 0; ; len ++) { + str[len] = uart_irq_read(); + if (str[len] == 0) break; + } + + uart_irq_off(); + uart_printf("%s, End\n", str); +} + +void page_test() { + print_node_list(); + int* arr0 = (int*)my_malloc(4096 * 1); + int* arr1 = (int*)my_malloc(4096 * 2); + int* arr2 = (int*)my_malloc(4096 * 2); + int* arr3 = (int*)my_malloc(4096 * 4); + int* arr4 = (int*)my_malloc(4096 * 8); + print_node_list(); + int* arr5 = (int*)my_malloc(4096 * 1); + for (int i = 0; i < 4096; i += sizeof(int)){ + arr0[i] = 1; + } + for (int i = 0; i < 4096 * 2; i += sizeof(int)){ + arr1[i] = 1; + } + for (int i = 0; i < 4096 * 2; i += sizeof(int)){ + arr2[i] = 1; + } + for (int i = 0; i < 4096 * 4; i += sizeof(int)){ + arr3[i] = 1; + } + for (int i = 0; i < 4096 * 8; i += sizeof(int)){ + arr4[i] = 1; + } + for (int i = 0; i < 4096; i += sizeof(int)){ + arr5[i] = 1; + } + print_node_list(); + my_free(arr5); + print_node_list(); +} + +void malloc_test() { + print_node_list(); + char* arr[17]; + for (int i = 0; i < 17; i ++) { + arr[i] = my_malloc(512); + for (int j = 0; j < 512; j ++) { + arr[i][j] = 'a'; + } + } + print_node_list(); + print_pool(); + for (int i = 0; i < 17; i ++) { + my_free(arr[i]); + } + print_node_list(); + print_pool(); +} + +void shell_begin(char* fdt) +{ + while (1) { + uart_recv_string(buf); + uart_printf("\r\n"); + if (same(buf, "hello")) { + uart_printf("Hello World!\n"); + } + else if (same(buf, "tt")) { + uart_printf("Input:\r\n"); + uart_recv_string(buf); + uart_printf("\r\n"); + unsigned long t = stoi(buf); + uart_printf("started countind from %d\r\n", t); + while (t--) { + + } + uart_printf("end\r\n"); + } + else if (same(buf, "timeout")) { + handle_timeout(); + } + else if (same(buf, "help")) { + help(); + } + else if (same(buf, "async")) { + async_test(); + } + else if(same(buf, "initramd")) { + fdt_traverse(get_initramfs_addr); + } + else if (same(buf, "ls")) { + cpio_parse_ls(); + } + else if (same(buf, "cat")) { + uart_printf("Filename: "); + uart_recv_string(buf); + uart_printf("\n"); + cpio_parse_cat(buf); + } + else if (same(buf, "dtb")) { + fdt_traverse(print_dtb); + } + else if(same(buf, "revision")) { + unsigned int rev = get_board_revision(); + if (rev) { + uart_printf("%x", rev); + } + else { + uart_printf("Failed to get board revision\n"); + } + } + else if(same(buf, "memory")) { + unsigned int arr[2]; + arr[0] = arr[1] = 0; + if(!get_arm_memory(arr)) { + uart_printf("Your ARM memory address base is: %x", arr[0]); + uart_printf("Your ARM memory size is: %x", arr[1]); + } + else { + uart_printf("Failed getting ARM memory info\n"); + } + } + else if (same(buf, "reboot")) { + uart_printf("Rebooting\n"); + reset(100); + } + else if (same(buf, "exit")) { + break; + } + else if (same(buf, "page")) { + page_test(); + } + else if (same(buf, "malloc")) { + malloc_test(); + } + else if (same(buf, "load")) { + uart_printf("Filename: "); + uart_recv_string(buf); + uart_printf("\n"); + cpio_load(buf); + } + else if (same(buf, "thread")) { + thread_test(); + } + else if (same(buf, "fork")) { + thread_create(from_el1_to_fork_test); + } + else if (same(buf, "timer")) { + core_timer_enable(); + } + else { + uart_printf("Command not found\n"); + help(); + } + } +} diff --git a/lab6/kernel/src/signal.c b/lab6/kernel/src/signal.c new file mode 100644 index 000000000..1aed70de1 --- /dev/null +++ b/lab6/kernel/src/signal.c @@ -0,0 +1,77 @@ +#include +#include +#include + +extern thread* get_current(); + +void sigkill() { + kill_thread(get_current() -> id); +} + +void test_handler() { + uart_printf ("This is test handler\r\n"); +} + +void signal_handler_wrapper(void* func_ptr) { + // in el0 + uart_printf ("In user mode\r\n"); + void (*func) (void) = func_ptr; + func(); + + // while (1); + + asm volatile ( + "mov x8, 10;" + "svc #0;" + ); +} + +void handle_signal(void* tf) { + thread* t = get_current(); + + for (int i = 0; i < 10; i ++) { + if (t -> signal[i] == 0) continue; + uart_printf ("found signal\r\n"); + t -> signal[i] = 0; + if (t -> signal_handler[i] == NULL) { + kill_thread(t -> id); + uart_printf ("never back\r\n"); + } + void* func = signal_handler_wrapper; + uart_printf ("Going to usermode\r\n"); + uart_printf ("%x :(:(:(\r\n", func); + irq(0); + t -> sstack_start = my_malloc(4096); + void* sp = t -> sstack_start + 4096 - 16; + /* + asm volatile ( + "mov x0, %0;" + "bl signal_handler_wrapper;" + : + : "r" (i) + : "x0" + ); + */ + asm volatile ( + "mov x1, 0;" + "msr spsr_el1, x1;" + "mov x1, %[func];" + "mov x2, %[sp];" + "msr elr_el1, x1;" + "msr sp_el0, x2;" + "mov x0, %[handler];" + "mov sp, %[ori_sp];" + "msr DAIFclr, 0xf;" + "eret;" + : + : [func] "r" (func), + [sp] "r" (sp), + [ori_sp] "r" (tf), + [handler] "r" (t -> signal_handler[i]) + : "x0", "x1", "x2", "sp" + ); + uart_printf ("should not be here\r\n"); + while (1); + } + +} diff --git a/lab6/kernel/src/system_call.S b/lab6/kernel/src/system_call.S new file mode 100644 index 000000000..334161a07 --- /dev/null +++ b/lab6/kernel/src/system_call.S @@ -0,0 +1,47 @@ +.global getpid +getpid: + mov x8, 0 + svc #0 + ret + +.global uart_read +uart_read: + mov x8, 1 + svc #0 + ret + +.global uart_write +uart_write: + mov x8, 2 + svc #0 + ret + +.global exec +exec: + mov x8, 3 + svc #0 + ret + +.global fork +fork: + mov x8, #4 + svc #0 + ret + +.global exit +exit: + mov x8, 5 + svc #0 + +.global mbox_call +mbox_call: + mov x8, 6 + svc #0 + ret + +.global kill +kill: + mov x8, 7 + svc #0 + ret + diff --git a/lab6/kernel/src/system_call.c b/lab6/kernel/src/system_call.c new file mode 100644 index 000000000..f0eab54fc --- /dev/null +++ b/lab6/kernel/src/system_call.c @@ -0,0 +1,239 @@ +#include "system_call.h" +#include "alloc.h" +#include "thread.h" +#include "mail.h" +#include "cpio.h" +#include "mini_uart.h" +#include "helper.h" +#include "exception.h" + +extern thread* get_current(); +extern thread** threads; +extern void** thread_fn; + +#define stack_size 4096 + +int do_getpid() { + return get_current() -> id; +} + +size_t do_uart_read(char buf[], size_t size) { + buf[0] = uart_recv(); + return 1; +} + +size_t do_uart_write(char buf[], size_t size) { + uart_send (buf[0]); + return 1; +} + +int do_exec(char* name, char *argv[]) { + cpio_load(name); +} + +extern void ret_from_fork_child(); + +typedef unsigned long long ull; + +uint64_t get_sp_el0() { + uint64_t value; + asm volatile("mrs %0, sp_el0" : "=r" (value)); + return value; +} +uint64_t get_sp_el1() { + uint64_t value; + asm volatile("mov %0, sp" : "=r" (value)); + return value; +} + + + +// tf is the sp +int do_fork(trapframe_t* tf) { + uart_printf ("Started do fork\r\n"); + int id = thread_create(NULL); // later set by thread_fn + + thread* cur = get_current(); + thread* child = threads[id]; + + for (int i = 0; i < 10; i ++) { + child -> reg[i] = cur -> reg[i]; + } + strcpy(cur -> stack_start, child -> stack_start, stack_size); + strcpy(cur -> kstack_start, child -> kstack_start, stack_size); + + child -> sp = (void*)((char*)tf - (char*)cur -> kstack_start + (char*)child -> kstack_start); + child -> fp = child -> sp; + // on el1 stack + thread_fn[id] = ret_from_fork_child; + + for (int i = 0; i < 10; i ++) { + child -> signal_handler[i] = cur -> signal_handler[i]; + } + + if (get_current() -> id == id) { + uart_printf ("Child should not be here%d, %d\r\n", get_current() -> id, id); + } + + void* sp_el0 = get_sp_el0(); + void* sp_el1 = get_sp_el1(); + uart_printf ("CUR SPEL0: %x, CUR SPEL1: %x\r\n", sp_el0, sp_el1); + + trapframe_t* child_tf = (trapframe_t*)child -> sp; + child_tf -> x[0] = 0; + child_tf -> sp_el0 += child -> stack_start - cur -> stack_start; + + uart_printf ("Child tf should be at %x should jump to %x\r\n", child -> sp, thread_fn[id], child_tf -> elr_el1); + uart_printf ("And then to %x, ori is %x :(:(:(:(:\r\n", child_tf -> elr_el1, tf -> elr_el1); + + uart_printf ("diff1 %x, diff2 %x\r\n", (void*)tf - (cur -> kstack_start), (void*)child_tf - (child -> kstack_start)); + + return id; +} + +void do_exit() { + kill_thread(get_current() -> id); +} + +int do_mbox_call(unsigned char ch, unsigned int *mbox) { + return mailbox_call(mbox, ch); +} + +void do_kill(int pid) { + kill_thread(pid); +} + +void do_signal(int sig, handler func) { + uart_printf ("Registered %d\r\n", sig); + if (sig >= 10) { + uart_printf ("this sig num is greater then I can handle\r\n"); + return; + } + get_current() -> signal_handler[sig] = (void*)func; +} + +void do_sigkill(int pid, int sig) { + uart_printf ("DO sigkill %d, %d\r\n", pid, sig); + if (sig >= 10) { + uart_printf ("this sig num is greater then I can handle\r\n"); + return; + } + threads[pid] -> signal[sig] = 1; +} + +extern int fork(); +extern int getpid(); +extern void exit(); +extern void core_timer_enable(); +extern int mbox_call(unsigned char, unsigned int*); +extern void test_syscall(); + +void given_fork_test(){ + uart_printf("\nFork Test, pid %d\n", getpid()); + int cnt = 1; + int ret = 0; + if ((ret = fork()) == 0) { // child + long long cur_sp; + asm volatile("mov %0, sp" : "=r"(cur_sp)); + uart_printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + ++cnt; + + if ((ret = fork()) != 0){ + asm volatile("mov %0, sp" : "=r"(cur_sp)); + uart_printf("first child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + } + else{ + while (cnt < 5) { + asm volatile("mov %0, sp" : "=r"(cur_sp)); + uart_printf("second child pid: %d, cnt: %d, ptr: %x, sp : %x\n", getpid(), cnt, &cnt, cur_sp); + delay(1000000); + ++cnt; + } + } + exit(); + } + else { + uart_printf("parent here, pid %d, child %d\n", getpid(), ret); + } + while (1) { + uart_printf ("This is main create fork shit\r\n"); + delay(1e7); + } +} + +void fork_test_func() { + for (int i = 0; i < 3; i ++) { + int ret = fork(); + if (ret) { + uart_printf ("This is father %d with child of pid %d\r\n", getpid(), ret); + } + else { + uart_printf ("This is child forked, my pid is %d\r\n", getpid()); + } + } + exit(); + /* + while (1) { + delay(1e7); + } + */ +} +void simple_fork_test() { + for (int i = 0; i < 1; i ++) { + // uart_printf ("%d: %d\r\n", getpid(), i); + int t = fork(); + if (t) { + uart_printf ("This is parent with child %d\r\n", t); + } + else { + uart_printf ("This is child with pid %d\r\n", getpid()); + } + } + exit(); + while (1); +} +void fork_test_idle() { + while(1) { + unsigned int __attribute__((aligned(16))) mailbox[7]; + mailbox[0] = 7 * 4; // buffer size in bytes + mailbox[1] = REQUEST_CODE; + // tags begin + mailbox[2] = GET_BOARD_REVISION; // tag identifier + mailbox[3] = 4; // maximum of request and response value buffer's length. + mailbox[4] = TAG_REQUEST_CODE; + mailbox[5] = 0; // value buffer + // tags end + mailbox[6] = END_TAG; + + if (mbox_call(8, mailbox)) { + uart_printf ("%x\r\n", mailbox[5]); + } + else { + uart_printf ("Fail getting mailbox\r\n"); + } + + uart_printf ("This is idle, pid %d, %d\r\n", getpid(), threads[1] -> next -> id); + delay(1e7); + } +} + +void from_el1_to_fork_test() { + irq(0); + uart_printf ("From el1 to el0 fork test\r\n"); + get_current() -> stack_start = my_malloc(4096); + void* stack = get_current() -> stack_start + 4096 - 16; + + asm volatile( + "mov x1, 0;" + "msr spsr_el1, x1;" + "mov x1, %[code];" + "mov x2, %[stack];" + "msr elr_el1, x1;" + "msr sp_el0, x2;" + "msr DAIFclr, 0xf;" // irq(1); + "eret;" + : + : [code] "r" (simple_fork_test), [stack] "r" (stack) + : "x1", "x30" + ); +} diff --git a/lab6/kernel/src/task.c b/lab6/kernel/src/task.c new file mode 100644 index 000000000..1137cde43 --- /dev/null +++ b/lab6/kernel/src/task.c @@ -0,0 +1,47 @@ +#include "task.h" +#include "alloc.h" +#include "mini_uart.h" +#include "utils.h" + +#include + +task *task_head; + +void push_task(task *t) { + asm volatile("msr DAIFSet, 0xf"); + + if (task_head == NULL) { + task_head = my_malloc(1 * sizeof(task)); + task_head -> next = NULL; + } + + task* cur = task_head; + while (cur -> next != NULL && cur -> next -> p > t -> p) { + cur = cur -> next; + } + + t -> next = cur -> next; + cur -> next = t; + + asm volatile("msr DAIFClr, 0xf"); +} + +void create_task(task_callback callback, int priority) { + task* t = my_malloc(1 * sizeof(task)); + + t -> callback = callback; + t -> p = priority; + t -> started = 0; + + push_task(t); +} + +void execute_tasks() { + while (task_head -> next != NULL && !task_head -> next -> started) { + irq(0); + task_head -> next -> started = 1; + irq(1); + task_head -> next -> callback(); + task_head = task_head -> next; + } +} diff --git a/lab6/kernel/src/thread.c b/lab6/kernel/src/thread.c new file mode 100644 index 000000000..a8ae0ee2b --- /dev/null +++ b/lab6/kernel/src/thread.c @@ -0,0 +1,214 @@ +#include "thread.h" +#include "alloc.h" +#include "mini_uart.h" +#include "helper.h" +#include "exception.h" +#include "signal.h" + +#define stack_size 4096 +#define max_thread_num 500 + +thread* thread_start; +thread* thread_tail; + +thread** threads; + +void** thread_fn; + +extern thread* get_current(); +extern void switch_to(thread*, thread*); + +void thread_init() { + + threads = (thread**)my_malloc(sizeof(thread) * max_thread_num); + thread_fn = (void**)my_malloc(sizeof(void*) * max_thread_num); + + irq(0); + for (int i = 1; i < max_thread_num; i ++) { + threads[i] = NULL; + } + + thread* x = my_malloc(sizeof(thread)); + threads[0] = x; + x -> id = 0; + x -> state = 1; + x -> kstack_start = my_malloc(stack_size); + x -> sp = x -> kstack_start + stack_size - 16; + x -> fp = x -> sp; + + for (int i = 0; i < 10; i ++) { + x -> signal[i] = 0; + x -> signal_handler[i] = NULL; + } + + x -> stack_start = my_malloc(stack_size); + asm volatile ("msr tpidr_el1, %0" : "=r" (x)); + + thread_start = x; + thread_tail = thread_start; + thread_start -> next = NULL; + thread_start -> prev = NULL; + + + irq(1); +} + +void kill_zombies() { + irq(0); + for (int i = 1; i < max_thread_num; i ++) { + if (threads[i] -> state == 0) { + my_free(threads[i] -> stack_start); + my_free(threads[i]); + threads[i] = NULL; + } + } + irq(1); +} + +void idle() { + while (1) { + uart_printf ("In idle\r\n"); + kill_zombies(); + schedule(1); + // can't be called in el0 + delay(1e7); + } +} +void im_fine() { + uart_printf ("I'm fine\r\n"); +} + +void schedule() { + if (thread_start -> next == NULL) { + // uart_printf ("No next thread job\r\n"); + return; + } + thread_start = thread_start -> next; + if (thread_start -> id == get_current() -> id) return; + + if (get_current() -> state) { + thread_tail -> next = get_current(); + get_current() -> prev = thread_tail; + get_current() -> next = NULL; + thread_tail = thread_tail -> next; + } + thread_start -> prev = NULL; + // uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); + switch_to(get_current(), thread_start); + // after successfully switched, ending of irq handler do irq(1) + return; +} + +void kill_thread(int id) { + irq(0); + uart_printf ("Killing child %d\r\n", id); + if (thread_tail -> id == id) { + if (thread_tail == thread_start) { + uart_printf ("You're killing the last shit and I won't let you do that\r\n"); + return; + } + thread_tail = thread_tail -> prev; + } + if (threads[id] -> prev != NULL) { + threads[id] -> prev -> next = threads[id] -> next; + } + if (threads[id] -> next != NULL) { + threads[id] -> next -> prev = threads[id] -> prev; + } + threads[id] -> state = 0; + irq(1); + if (id == get_current() -> id) { + while (1); + } + // wait for being scheduled away + // schedule(); +} + +trapframe_t* sp; + +void thread_func_handler() { + asm volatile ( + "mov %0, sp;" + : "=r" (sp) + : + : "sp" + ); + /* + // uncommenting the upper shit will affect the sp, need to modify them in the ret_from_fork shit + int id = get_current() -> id; + void* func = thread_fn[id]; + */ + uart_printf ("Jumping to %x with sp %x\r\n", thread_fn[get_current() -> id], (char*)sp + 16 * 2); + asm volatile ( + "add sp, sp, 16 * 2;" + // "mov x0, sp;" + // "bl output_sp;" + : + : + : "sp" + ); + asm volatile ( + "mov x0, %0;" + "blr x0;" + : + : "r" (thread_fn[get_current() -> id]) + : "x0", "x30" + ); + kill_thread(get_current() -> id); +} + +int thread_create(void* func) { + uart_printf ("creating thread\r\n"); + thread* x = my_malloc(sizeof(thread)); + x -> stack_start = my_malloc(stack_size); + x -> kstack_start = my_malloc(stack_size); + x -> sp = x -> kstack_start + stack_size - 16; + x -> fp = x -> sp; + x -> lr = thread_func_handler; + x -> state = 1; + + for (int i = 0; i < 10; i ++) { + x -> signal_handler[i] = NULL; + x -> signal[i] = 0; + } + + for (int i = 1; i < max_thread_num; i ++) { + if (threads[i] == NULL) { + threads[i] = x; + thread_fn[i] = func; + x -> id = i; + break; + } + if (i == max_thread_num - 1) { + uart_printf ("Not enough thread resources\r\n"); + return -1; + } + } + + x -> next = NULL; + x -> prev = thread_tail; + thread_tail -> next = x; + thread_tail = thread_tail -> next; + uart_printf ("Created %d, prev: %d\r\n", x -> id, x -> prev -> id); + return x -> id; +} + +void foo(){ + for(int i = 0; i < 3; ++i) { + uart_printf("Thread id: %d %d\n", get_current() -> id, i); + delay(1e7); + schedule(); + } + // kill_thread(); + // uart_printf ("should not come here\r\n"); + // while(1); +} + +void thread_test() { + uart_printf ("started thread testing\r\n"); + thread_create(idle); + for (int i = 0; i < 3; i ++) { + thread_create(foo); + } + schedule(); +} diff --git a/lab6/kernel/src/timer.c b/lab6/kernel/src/timer.c new file mode 100644 index 000000000..afe99e80d --- /dev/null +++ b/lab6/kernel/src/timer.c @@ -0,0 +1,56 @@ +#include "timer.h" +#include "alloc.h" +#include "mini_uart.h" +#include + + +void print_data(char* str) { + uart_printf("%s\r\n", str); +} + +timer* head; + +void push_timer(unsigned long long exp, char* str) { + + irq(0); + + timer* t = my_malloc(sizeof(timer)); + + t -> exp = exp; + for (int i = 0; ; i ++) { + t -> data[i] = str[i]; + if (str[i] == '\0') break; + } + t -> callback = print_data; + + if (head == NULL) { + head = my_malloc(sizeof(timer)); + head -> next = NULL; + } + + timer* cur = head; + while (cur -> next != NULL && cur -> next -> exp < t -> exp) { + cur = cur -> next; + } + + t -> next = cur -> next; + cur -> next = t; + + if (head -> next != NULL) { + asm volatile ("msr cntp_cval_el0, %0"::"r" (head -> next -> exp)); + asm volatile("msr cntp_ctl_el0,%0"::"r"(1)); + } + irq(1); +} + +void set_timeout(unsigned long long s, char* str) { + + asm volatile("msr DAIFSet, 0xf"); + unsigned long long cur_cnt, cnt_freq; + asm volatile ( "mrs %[x], cntpct_el0" :[x] "=r" (cur_cnt)); + asm volatile ( "mrs %[x], cntfrq_el0" :[x] "=r" (cnt_freq)); + // uart_printf("freqeucy: %d\n", cnt_freq); + cur_cnt += s * cnt_freq / 1000; + push_timer(cur_cnt, str); + asm volatile("msr DAIFClr, 0xf"); +} diff --git a/lab6/kernel/src/utils.S b/lab6/kernel/src/utils.S new file mode 100644 index 000000000..503f69b17 --- /dev/null +++ b/lab6/kernel/src/utils.S @@ -0,0 +1,9 @@ +.globl put32 +put32: + str w1,[x0] + ret + +.globl get32 +get32: + ldr w0,[x0] + ret diff --git a/lab6/kernel/test.sh b/lab6/kernel/test.sh new file mode 100755 index 000000000..b1dde6947 --- /dev/null +++ b/lab6/kernel/test.sh @@ -0,0 +1,2 @@ +#! /bin/bash +qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio -dtb ../../bcm2710-rpi-3-b-plus.dtb -initrd ../../initramfs.cpio -display vnc=0.0.0.0:0 -vga std From e709e60730f522420a19fbc19aac27c0c79e9186 Mon Sep 17 00:00:00 2001 From: hq8398Eric Date: Wed, 12 Jun 2024 11:16:15 +0800 Subject: [PATCH 2/6] lab6 version 1 --- "lab6/kernel/\\" | 217 +++++++++++++++++++++++++ lab6/kernel/build/alloc_c.d | 2 +- lab6/kernel/build/alloc_c.o | Bin 14528 -> 14896 bytes lab6/kernel/build/boot_s.d | 2 +- lab6/kernel/build/boot_s.o | Bin 8440 -> 8624 bytes lab6/kernel/build/cpio_c.d | 3 +- lab6/kernel/build/cpio_c.o | Bin 7640 -> 9520 bytes lab6/kernel/build/exception_c.o | Bin 5600 -> 5992 bytes lab6/kernel/build/helper_c.o | Bin 2816 -> 2984 bytes lab6/kernel/build/kernel8.elf | Bin 108704 -> 114384 bytes lab6/kernel/build/kernel_start_c.d | 2 +- lab6/kernel/build/kernel_start_c.o | Bin 1904 -> 2864 bytes lab6/kernel/build/mail_c.o | Bin 1968 -> 1984 bytes lab6/kernel/build/mini_uart_c.o | Bin 8296 -> 8448 bytes lab6/kernel/build/mmu_c.d | 2 + lab6/kernel/build/mmu_c.o | Bin 0 -> 3640 bytes lab6/kernel/build/shell_c.d | 2 +- lab6/kernel/build/shell_c.o | Bin 13056 -> 15848 bytes lab6/kernel/build/signal_c.o | Bin 3264 -> 3232 bytes lab6/kernel/build/system_call_c.d | 3 +- lab6/kernel/build/system_call_c.o | Bin 9384 -> 10528 bytes lab6/kernel/build/thread_c.d | 2 +- lab6/kernel/build/thread_c.o | Bin 9272 -> 10104 bytes lab6/kernel/include/DEFINE.h | 2 +- lab6/kernel/include/helper.h | 2 + lab6/kernel/include/mail.h | 2 +- lab6/kernel/include/mmu.h | 20 +++ lab6/kernel/include/mmu_regs.h | 20 +++ lab6/kernel/include/peripherals/base.h | 2 +- lab6/kernel/include/system_call.h | 1 + lab6/kernel/include/thread.h | 3 + lab6/kernel/include/utils.h | 8 + lab6/kernel/kernel8.img | Bin 33696 -> 38752 bytes lab6/kernel/src/alloc.c | 14 +- lab6/kernel/src/boot.S | 55 ++++++- lab6/kernel/src/cpio.c | 76 ++++++--- lab6/kernel/src/exception.c | 20 ++- lab6/kernel/src/helper.c | 6 + lab6/kernel/src/kernel_start.c | 19 ++- lab6/kernel/src/linker.ld | 7 +- lab6/kernel/src/mmu.c | 215 ++++++++++++++++++++++++ lab6/kernel/src/shell.c | 58 ++++++- lab6/kernel/src/system_call.c | 122 ++++++++++++-- lab6/kernel/src/thread.c | 33 +++- 44 files changed, 844 insertions(+), 76 deletions(-) create mode 100644 "lab6/kernel/\\" create mode 100644 lab6/kernel/build/mmu_c.d create mode 100644 lab6/kernel/build/mmu_c.o create mode 100644 lab6/kernel/include/mmu.h create mode 100644 lab6/kernel/include/mmu_regs.h create mode 100644 lab6/kernel/src/mmu.c diff --git "a/lab6/kernel/\\" "b/lab6/kernel/\\" new file mode 100644 index 000000000..ec17845cd --- /dev/null +++ "b/lab6/kernel/\\" @@ -0,0 +1,217 @@ +#include +#include +#include "cpio.h" +#include "mini_uart.h" +#include "helper.h" +#include "alloc.h" +#include "thread.h" +#include "mmu.h" +#include "utils.h" + +extern char* _cpio_file; +char buff[1024]; + +uint8_t hex_char_to_bin(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return 0; // Not a valid hexadecimal character +} + +uint64_t hex_to_bin(const char* hex) { + uint64_t result = 0; + for(int i = 0; i < 8; i ++) { + result = (result << 4) | hex_char_to_bin(hex[i]); + } + return result; +} + +void* cpio_find(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + return filedata; + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return 0; +} + +void cpio_parse_ls() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + uart_printf("%s\r\n", buff); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +void cpio_parse_cat(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + uart_printf ("Cat %d\r\n", filesize); + substr(buff, filedata, 0, filesize - 1); + uart_printf("%s\r\n", buff); + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +extern thread* get_current(); + +void cpio_load(char* str) { + irq(0); + thread_init(); + thread* cur = get_current(); + uart_printf ("cur: %llx\r\n", cur); + long xxx = read_sysreg(tpidr_el1); + uart_printf ("xxx: %llx\r\n", xxx); + + void* pos = cpio_find(str); + cur -> code = my_malloc(4096 * 64); + cur -> code_size = 4096 * 64; + for (int i = 0; i < cur -> code_size; i ++) { + ((char*)cur -> code)[i] = ((char*)pos)[i]; + } + + uart_printf ("%llx, %llx, %llx\r\n", cur -> PGD, pa2va(cur -> PGD), &(cur -> PGD)); + + setup_peripheral_identity(pa2va(cur -> PGD)); + for (int i = 0; i < cur -> code_size; i += 4096) { + map_page(pa2va(cur -> PGD), i, va2pa(cur -> code) + i, (1 << 6)); + } + for (int i = 0; i < 4; i ++) { + map_page (pa2va(cur -> PGD), 0xffffffffb000L + i * 4096, va2pa(cur -> stack_start) + i * 4096, (1 << 6)); + } + cur -> code = 0; + cur -> stack_start = 0xffffffffb000L; + void* sp = 0xfffffffff000L - 16; + void* el1_sp = cur -> sp; + + long ttbr1 = read_sysreg(ttbr1_el1); + long ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx\r\n", ttbr0, ttbr1); + + uart_printf ("cur -> PGD %llx\r\n", cur -> PGD); + + // uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans(cur -> code)); + + asm volatile("dsb ish"); + write_sysreg(ttbr0_el1, cur -> PGD); + asm volatile("tlbi vmalle1is"); + asm volatile("dsb ish"); + asm volatile("isb"); + + + uart_printf ("uart printf: %llx\r\n", uart_printf); + while (1); + + uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans_el0(cur -> code)); + ttbr1 = read_sysreg(ttbr1_el1); + ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx, &TTBR0: %llx\r\n", ttbr0, ttbr1, &ttbr0); + + asm volatile( + "mov x1, 0;" + "msr spsr_el1, x1;" + "mov x1, %[code];" + "mov x2, %[sp];" + "msr elr_el1, x1;" + "msr sp_el0, x2;" + "msr DAIFclr, 0xf;" + "mov sp, %[sp_el1];" + "eret;" + : + : [code] "r" (cur -> code), [sp] "r" (sp), [sp_el1] "r" (el1_sp) + : "x1", "x2", "sp" + ); +} + +char* get_cpio_end() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + return filedata + filesize; + } + + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return header; +} diff --git a/lab6/kernel/build/alloc_c.d b/lab6/kernel/build/alloc_c.d index 3038764c6..8a63d0860 100644 --- a/lab6/kernel/build/alloc_c.d +++ b/lab6/kernel/build/alloc_c.d @@ -1,3 +1,3 @@ build/alloc_c.o: src/alloc.c include/alloc.h include/mini_uart.h \ include/fdt.h include/set.h include/mini_uart.h include/alloc.h \ - include/cpio.h + include/cpio.h include/mmu.h diff --git a/lab6/kernel/build/alloc_c.o b/lab6/kernel/build/alloc_c.o index bfdc244c58c4e80521cf80908264197b6b8875fe..e4ea2b5292dd4837796866efca958d5211b64601 100644 GIT binary patch delta 2749 zcmZ`*Ur3u*6#s6jYhs-yG3m{xwrU&v)A%P5m-t|7I=Z37hq(5^hYbvL=!R=`b5@wp zq;p#a9n+n_98_naFgG03#s|CkpwI^&WYaDWZe$~Y4IJ}f4j(KC-MRO>DThEl$i3(O ze&_tox&OX=Ya?f7|3HBc= z`%~;=i4Tg`3-!M>?P|I-_*6UUoYszdei4D<*ABh*&zS=_}9gfz`29`reIq-W(l#>-s?T&3A8HAApp@m#{kHti;REXy7wwblOww1)fxRhr$a`QQ+1h1L#t?UEzH>_*sR|D|}e_`wZN!Sx*>< zoB*2VVZVa2S7rN}Y~K*A?`qCpP zYqA{{EyO%-Rtevu)#E9~9lwWs97eFk)xvgJA}bQvgl!KGZ>e13-k9Zxs5KE*d(jvOHHsH2T&Oh@e;2{e68tKxH*&pCv0^UOgq@IV zBoBLEvI}|G$I#ov^$o((o$Y}rvLSW#bMubEQWNhUCoGMfQMj069jVq`Y77M4KyWDmL8&3O|pj|jJam=uy+N^R%BJHqAHdIAGSLZNlD~&sPS^W-)4yBuE3;V zyJLCSWrd4b&}!H6;E!Pmb8Qecx_1W<^>SZOy}X5H3z_L9g46eO57>PCR!Fg;etNsF zktnJ*NpN~jmI+SJ$%ewSyE(5a+ca?a#%I&FNG#pc6l`OKX~l{PYskDDWyT<@yrwvp z!iB&1_sQaw3eP<`Zi3VG=`wH_Xtnuzh$gLJh{SqTe$ho>y;Z!E!>wG8<%wMo?D@q! zY?>(36XJ3hX~ZnNiN9K}Fg^QGvW1X%3b8j~pM>5ve0{4wAgh4z$+CSAMK=4v5z1k$ zu!L;(D}=7452b`nVI$`2B^0!UIOi z%V5}F&&J^^f2Um&>Zq*tKR)ZYfb1uj?yU1CO>mWG=4 WfTin{G5Q+9IEwj=Q5eF3s{aArOMhGd delta 2493 zcmZ`*O-vg{6yDj8#)b{`Z^ujcF;#?DX2IAE*iaA=A%|Mx;A1S&iUU>L z3aPY0D)d<@tpE{;gAYAGjoMU+RFF6jscLPB0|(N86jeErmO~Dx>dfp|eOhT(+S%Rj z``-87%9#X3g92klgbrL@BztL{W;?MfrzaIbN6en8g2;xYlX`lM>fhDO{ho z;aw76mH1t$@0YmNrnC!46wdCFQ0k;4E!wPTKjdwES_Z6Ga%G1-^P?p3tjBt;NPG@R z7k&K;$)0#ERtyBYU6%N<58mwh8xq|=wQxc0ukP=!=yS5qekOW_p*c>mqYT@96t?p!V0-W|yvIva`B`e@%?J5w1k`0)MP)J8C)e)2;R6mxELFw2WvpwO$p5y*N|y`54(m7iiU^G!V89#1wSwN zs<{6__&q>=A>?-`G)F@JTsWKwhju|SrJ_Z z(oe}e+-FV|fviG<`E4M-9^|(r^gBXd7s^8ir3Qt5s(ZBm>$-+~#$cJ{on&nf7^X+h zAzdfZ-GM2Sl8<29q~J2I!yQwD6gwZ8n!X}q_*>GAVpieQq?t|0CK($=Y*peZ8@?lP zKBxUizt1bp93VFnvA-cVj2}syyA2@yGw!B`uUZhVJdD`u&={clqyw83>|FoX;rUms2YasD&>N%r3}SJv zS(u9PFZi<<%{-7Ad&YeS{K&!cSa>RM%JR0zMXI?D%*u*g;2okQ01eiLU}A{sok$r* z{hAhR(Seq{d$VrqEP{#*oXReUwayGl!f5o9Aq%ELrX!K@~1K;7iC2 zk9h_5;xxXCqVW7`KFgYC8AMqE(3_z5LXzdQ%|w*S~YlW?nk5A-`qBdmTfbCc<(3Lr{8y>Ng~7&z0xw zTelt9MdXR+aUbEa+6Omo5xx17P-kWF<1)Ld>{^GtVX8NO2|OHPN0ZIN3&u8o0CF}~ zgWeIUH+S`ljm^T;2<>R@-iJ1p?cSe{{I1sh@P2ZnwJ2BNg#dh$93dWfoE&F6raLw6 z4hO7~eub%2QhgeLuTnSFwjdNjufa*mU|RR+xO$d=cSmo!6}blI^ZLDYlsV1fuXZ573X#8VDptaY&|p>2}2pcInW z3Oxj|Ob!ZODm_T-!8BJ7B0cCafr!>i?MYGmxh1D{=Izvs8Io__eDm{WcBUD9HU9XR zYd%;x{)Cnxtcb6eP1g^3Rp!Jr;3gqkKpp=JMTY(o& ztU?R;T=ut>)F!a?Tw0_t2BVuU&DR)PVrxV2Lv)D_cK3U>6)4$PmBxiUFo6Wcseq^=_*ZExvh7g-_OtEPXn_9k6>~kI)tf@@GOoizFfbPCEH)ka>X4ax3fd$=~ z&X{H*WiFVhgq4|`&88-;LxZ`5W&*)Pl N>^>#(o}>O?@Gm_xxOe~n delta 936 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 F|4)np5HA1# delta 1280 zcmZ{j&ubGw6vy9gn8@S-YAWx2KJS4w)d3nnB?bT+szaeM-MyeyKt0rB4`|Dv#y)ryP4yai#`SrF zp1oyJ z;EFBea+%z$FPTrJeKW;;))!nHA0H<_FEp?EsLw8)Y;3b7+ONE|yfa7bW3zvL+q?|< z=xo%RwkM*v4dkXHEL2IY-zB`(*DbbMzfjE(2ym~D$O9Xb*`;_kF+ZPA!qZYQSy+P7 zTrr(U#WT4~31-u!cyggwOy_u9$mHYcTneB*Hh5hUcE}^QKR7@g+hgBkL>>WPqz&ob zATQjm@-fPKQ1%4zQN&NXaOg8cPFlrG!wG(;m-FEcZZSCd`4Edb5;xU3g@f?Lr7mW_yb@G2TG{u0_LZjcNRY5TrW)QqpmV8^B3J>t@%Ir zq1~D`@8!I+iUsNM^K6{6S2zumvcBE!Vx)92x{HkP11ep7UUuVu zXIe!@m~S9Ge(@&KWB!J74>|C?A3Ej@HPOC^G^W4T^5q}mu9?K-u(f3~(p4K-m&4+j znF#ia#pvY9=66(JBTUhRvrohOM)VTSTm@ILK7kqcDux4 z9oD`LJfsvXSrMTqq~O7zLx(6WijI?b@DNea!41>in|Wi80ei6Tz4`sW|NndYm@$pz zJ((DZX%o8$k@U_wJfreOyyrEFbHpO?5#MM58Jm3TU6iD8oba8fzQYtcw%ZFlrE3{TU^(bM zH@UO0Q<1*oP;t2g_>#_Bu{uyL)v$6H#C3&mJrHvRi$2q zsz-UnFdn1oeZgBKc&C^*x#aSuc*Qd3L7wUGubZTSY#W_34D%ch=T45peKt=5`@`a~ zBCenZJVxd@p4UEC@D|=a;3fIX)CTY zhp%pu7GW#XRgI;Zh&)KN2n8m#N#$Ac(?Rc$oaIUc#cB*vDYw% zjb-o1Aq9!rPvA{8`WO2@&JF+o delta 958 zcmZ{hO=uHA7>2)@-6YLlH=AU$MpL`BJ(RYXcnL~NlTZZi=~ss=m=ddW>xBuWtp zJ*0fagR~_%8Kpv{r+|X!MO5(TAc`VUJa`cC*nooHWG65LoWl(BKJz}a%lz2io~(`Y zdi3E0=a}JBL5D*T{MC2P_q%w3UvVDa`>Vl9+kg&0^&0n;+U^?F#4neuWpoqUU2ao9{kwtyf5+n}g63`9gIRp@={%w7FNRSkDh;;2h zH_(Yu_rx!KnhX=3(}8ErC)%0!gaB`ODwy}~gqvbl7mSM#=XoIp9~ajq7eC?s615BlF(> zRV2&H+>-y@%MW8AYR{ijY$J;8QlG6R+0{N|v!=P~{nKyZkr!N-Az9#&3@ygWhV-Oh<;4YN h(w7l0Rf?^OFZExhv2RprmsyOHijUh;kUma?`UUKiQ#$|v delta 160 zcmZ1>-XJzXgXsYKMlC1i$w!!9FiK2b%OXBGnL}pt50(v#lMk>tPv&O7JBi~2qt4`$ z9Og_7Y?GNd?HF?=J963s$wnYqF!>;mY?#c*WzV<S7`6Q56zyjf&n9Rv-&S?RabDr!8@e$&nPF; diff --git a/lab6/kernel/build/kernel8.elf b/lab6/kernel/build/kernel8.elf index a05f327d7804b256e79f918fd9362b681cb9da1f..cc62d6b2b686a39a4b7af50b44840604d0472ccd 100755 GIT binary patch literal 114384 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 XPQT-2^MqTkH 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 F|6enL8P@;+ diff --git a/lab6/kernel/build/kernel_start_c.d b/lab6/kernel/build/kernel_start_c.d index 6b5564f6e..4b6ad01e5 100644 --- a/lab6/kernel/build/kernel_start_c.d +++ b/lab6/kernel/build/kernel_start_c.d @@ -1,3 +1,3 @@ build/kernel_start_c.o: src/kernel_start.c include/mini_uart.h \ include/shell.h include/fdt.h include/cpio.h include/alloc.h \ - include/thread.h + include/thread.h include/mmu.h diff --git a/lab6/kernel/build/kernel_start_c.o b/lab6/kernel/build/kernel_start_c.o index 653419fdb3137406cad29368b1ae770182dade2e..21db29013ddb925e07a0ccd637080df3262821d6 100644 GIT binary patch literal 2864 zcmbuAOKTKC5P)mlsL>=EjT#|h28^PjLso(>JdAG-A|i@{!aCXMWP`i2VWwBt2P)#h zgMz^vyeQ&HJ$MztgP;e&i$wIMB$6MXc-ljVRnyhkc6R2Xwd{2D*HzWk-PJQU4jw%; zFOvZ+8F&Sao~8gl7dCV!QXS}kc9^;P=J`w(#(uX!eX<+sICLMtsZVt~b&Ny(@yXfQ ziOF6Z?{%X7k1V{HQaakg7}+R4Q&+Y;M&sjC=%?(Qx^-90mBG2@7{JG_7FeciyEbR6 z%BGj>%22qZPQmJBHsstr3V*NEee0cx<-PXoagH>Nvtz6C?u=}^>s!=z0ecLv> ze_#`1iqlCCl+2YA&{A8Q>1po;3;U}HqD<3c?-J)x>*Iy{9xSMS|Mqzap){ehY=K|1 zN#ohXlLpA*FG;c(DM_+0zX_{#H1n>=GO5C7UZco3qKeZBE1G5?`_=?Xd_famg=D$0 z-e@0@t;4_GbJJ-{3g4c>_oVP6Dg0~-FQ#yr!f&SVyD9u(3V)iy;erT!QObwX4WwOw zJ`eh88V-u#5g&#;nRh)efGV2gNBj{9(M3`H(O|@vLoh7VP~et_LS;^VXn0Wsp@6dM zyTgLLi-B-GrITNw8U(_ZkS|m`p)z4z_#T8syn1<+O5-edV2O3$nzZQp*%{*&8}uMI zFH*n3m+Bzc(m9iKp}kq%PDBA##`po|6yK~fstXbw$BKFYN4eE;G(XNf9_J);S}(o$ zw47mu)@$-}%qh-tZH(=CgR48LfM;;MhlHq3Nhr=rrAE(D)+rylb6Ti=NhlwaUsD*! zzMFMwZn94HCcn)*9{-MEZ^j>I9?$bh3V+L7pNp=8_ssRVX#T;7)5$tDpA4?w-GtUK zpO5RB$9mM*;pMV)2f+?ypxUC=0#R~pDQXgI&y_CNgJB4EP*I&irCg@lVfz&+?8C=S zZNVI?#oiX*MH>`t3%!RMn8&|RePo;o*PNz_&y5H^ s@cd_Zunk!|{^S0Okj2jq5m;P5FR5cld|T*UnB;$l^LGtjQse%A0C2JPkN^Mx delta 550 zcmZ9KJxc>Y5Qca6F5c~#OD{Pd7W_ErX%EeE?c!crdc+D%%nQ9EiCu_#1O*4gs5@6QG()=URTX<%`n8 z(_?yx^six5@56?kUD(;k7Ya+O`Ss1B+*MfkJCKYxYrE1iI7(;#@m|Gy1pld($U|Ls zyZirC*-Fch0u8zLkRq}+3OnSY5DMGbKQxBCF^igUATBmzW@4W9z4)YZI8Mwot%xUb z(J)g=c|3s`{D$SAur`8}pXDvYXP`5JNQ9oiHbu;+|HIHXx diff --git a/lab6/kernel/build/mail_c.o b/lab6/kernel/build/mail_c.o index 7196f5db7a2ff0db48118a3f3d110393fc6ef13f..21f89246726c0339a5d55721d88616eb138961bf 100644 GIT binary patch delta 284 zcmdnMe}I322IGN=n(na={{R2Pz~Hb`o`In-`~UwC29fEP7#=MD1QLHJ@351Rfnle- z0`pY{VT3qHJp%)i5J-!ZOd$S~yJEI_&3lxzC zVj%`bhAoo|nZ+3eCU-LXOMU<;1p;ZHty~Z$m<*Zxk=dSc%Va|qkV;RMt^vDq<7Og_nG&sZ>- Ylii+i#bi%*d(H$Fh*go3C$h=|0OXTaNdN!< delta 268 zcmX@Wzkz>(2IGc_n(n>~3=TWx85jz?|NjqR5Sf07;lc7x59J+pGBPmilviNB${-98 z1F2(RU=jkUO$4bGK!}6X+cPj^H*P!|%*eTf0SFxV6w)_qGPyGfg1JBuX&@G2U}RV_ zxsh3%kzw*oW`D^CKrs-I2HM62VS-7Q$&4)aj7ugvvVc@ZvK(h@n5@WZ&Uj;TB&$8s z0mjLNOk$Hauxh}VA6PXQ4@{P1vuAn(kt<-+VEVu~c@~=;Bgf>MZ1#)^lO@^h8D~t6 RWVh!GV1ZZ_Ie8(gJOJ~_M}+_Y diff --git a/lab6/kernel/build/mini_uart_c.o b/lab6/kernel/build/mini_uart_c.o index 4cf944e4bcbcbb330c0912c41b9cf568bbf7f6e0..f5da91883862211806b5a37fa2b3efb8b11a6c29 100644 GIT binary patch literal 8448 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 diff --git a/lab6/kernel/build/mmu_c.d b/lab6/kernel/build/mmu_c.d new file mode 100644 index 000000000..09379cbe3 --- /dev/null +++ b/lab6/kernel/build/mmu_c.d @@ -0,0 +1,2 @@ +build/mmu_c.o: src/mmu.c include/mmu.h include/helper.h include/utils.h \ + include/alloc.h include/thread.h include/mmu_regs.h diff --git a/lab6/kernel/build/mmu_c.o b/lab6/kernel/build/mmu_c.o new file mode 100644 index 0000000000000000000000000000000000000000..2e2a8e25f702ac0bf8fc337ea2ef6cbd24fcbcf5 GIT binary patch literal 3640 zcmb_ePiz!b82@Hxu?t;FOKTuj-D!dXrYvpk0WgLEf|!UNprj-mhG}=88+Ny4cZ!9o zG)jy{4lH0|jG!hYmL9!mO^gtY;V4V$NpQA!Ffk+$IIv0U`upCzM~B%Z8ud$N-+RCB z@B7|w=I!zAJ70=u8Y$7}D_U47l<5AFg}EuFCM~5nRdwwu(YqyY1y!mEsyso|<|WJu zO&+@DHBhD8fVuJY^36nltktMb=x)Dxt-Qjl7(^eiz9ZUFM9xY~`G)mv%|b7Hqg3>e zhv$j8hC3JMs(nQ7mAqEuZ>P#Kj?s>s6f24v8ez+8j@c@6HX^5r$vTb+U$*0zi~r=9 zCraKjV5n1zL%$3oYUCI^CxeO|z!^&z`V9I|yrf${&yRm|abBn5UCxU-%ZNLR-rVH+ zESlbn`pT9$?djTcH1gDLBCXNW=@t5fTFS_8thw|tVlVglY1)HbB2I@dN6@!^b6V^H z`xbrUx{y1JN67SRoR}ze5KSrlP5A9czqgP!#eN&PPobCu-vrSeJ4)F9+a(}v?pF|z#uj<*Yd)2`m$B#}{fZgL~l46ph7ZG^uTjc-?89E~8c=I)$f*=d9o|_m24sy#aox+Un&n|MwiNN6BVUzL9*iw9)c5K_W$yl>z zU^M5B8r|K=-elLh?oqMqeygV^+10yN!ohH)9ot3Gv8T26c!JuXS?Q;tW{{7zG?|gD zO=Mu&CGn4ZeE+%l`NpkhmP7__T))-?-II9m(g-=hzgwER&OLU1k#*xbt3_;=ClI!U zzIi(|obx2FAwity7X(U_;!(!ym+@Ht!{6wClll!jBHy{ld2Ofkm#Uh9w-=>5)fxo= zz3$DxxL(g3X!H^Iq8hwGAho!E?Qm7KqLc3x)c8nD^fid{Tqk_R>WEH{)u2m(w9rC5 zY9}jzFAwxV@B~<|#MN5x1lWssBy}-ckR6zEoR?+m#MuLTRpOHo-}Zz*&_RiJhU~Kv zPf0u_?F$&|RB%jW?2YkeGGF?=7J?#z-`Ed_At~EHC&%+sI3;9J-ryV2y z8$6Is*DF7pUHl;!k$^7m~=tnkB9I{iF15@$CX57f5UNN5)a3TOFSH> zH-IxIl_(x9LSDHQp<;frC|vP$uMa=K74ODExZ>TZ5U%(;8NwAGuY_>LyWc~&;vFRm zN3*UyfYHtS~l32GT&fh=IBjE@4 z)3XwnG?Ui2Gs20ahGPV!6AO;{Z~eRB%Q1r-!;&UteuEbQQS~bb|38I)mjdK?Mf!7n zK~eRqaVwN+9<;mn5BJ|M{loR&SN@^k;re&MpG{3XLHTL1zq%wrK0o$V{wpQU;lsIE ubzfdNrc^cpi{lCVbDHqk0iq4k@N-@SB(xpeZT0<6`4=wP0bibm{r>{hEP)RI literal 0 HcmV?d00001 diff --git a/lab6/kernel/build/shell_c.d b/lab6/kernel/build/shell_c.d index 12bd69955..91b9f6d00 100644 --- a/lab6/kernel/build/shell_c.d +++ b/lab6/kernel/build/shell_c.d @@ -2,4 +2,4 @@ build/shell_c.o: src/shell.c include/shell.h include/mini_uart.h \ include/reboot.h include/mail.h include/helper.h include/loader.h \ include/cpio.h include/alloc.h include/fdt.h include/timer.h \ include/exception.h include/thread.h include/system_call.h \ - include/exception.h include/signal.h + include/exception.h include/signal.h include/mmu.h diff --git a/lab6/kernel/build/shell_c.o b/lab6/kernel/build/shell_c.o index 4cde9379b82d649f60dd5c31d40434a165bce593..a9b3abb01cee733a37402996e6f6b3d0c680dd7f 100644 GIT binary patch literal 15848 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 literal 13056 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 diff --git a/lab6/kernel/build/signal_c.o b/lab6/kernel/build/signal_c.o index b65a2dc77c42dc921eaa37293ed07b92ded8ca56..8b8635648bc0f11d21713aa3dfb13a6a20caf03a 100644 GIT binary patch delta 565 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 diff --git a/lab6/kernel/build/thread_c.d b/lab6/kernel/build/thread_c.d index c6ee98c26..9aa5c3c31 100644 --- a/lab6/kernel/build/thread_c.d +++ b/lab6/kernel/build/thread_c.d @@ -1,3 +1,3 @@ build/thread_c.o: src/thread.c include/thread.h include/alloc.h \ include/mini_uart.h include/helper.h include/exception.h \ - include/signal.h + include/signal.h include/mmu.h include/utils.h diff --git a/lab6/kernel/build/thread_c.o b/lab6/kernel/build/thread_c.o index b1580747acf34aaf8babdb375cac6bf949223755..a5f863504e66e65e08000b4ed63466348d9d2d7b 100644 GIT binary patch literal 10104 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 diff --git a/lab6/kernel/include/DEFINE.h b/lab6/kernel/include/DEFINE.h index 3d37af655..2624e30bd 100644 --- a/lab6/kernel/include/DEFINE.h +++ b/lab6/kernel/include/DEFINE.h @@ -1,4 +1,4 @@ -#define MMIO_BASE 0x3F000000 +#define MMIO_BASE 0xffff00003F000000 #define PBASE MMIO_BASE #define AUX_IRQ ((volatile unsigned int*)(MMIO_BASE + 0x00215000)) diff --git a/lab6/kernel/include/helper.h b/lab6/kernel/include/helper.h index 9f7abc7a1..5b6a6d69d 100644 --- a/lab6/kernel/include/helper.h +++ b/lab6/kernel/include/helper.h @@ -11,4 +11,6 @@ void strcpy(char*, char*, int); unsigned long stoi(char*); void delay (unsigned long long); +void memset(char*, char, int); + #endif diff --git a/lab6/kernel/include/mail.h b/lab6/kernel/include/mail.h index 66ba7e515..38340b34c 100644 --- a/lab6/kernel/include/mail.h +++ b/lab6/kernel/include/mail.h @@ -1,4 +1,4 @@ -#define MMIO_BASE 0x3F000000 +#define MMIO_BASE 0x3F000000 + 0xffff000000000000 #define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) #define MAILBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0)) #define MAILBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10)) diff --git a/lab6/kernel/include/mmu.h b/lab6/kernel/include/mmu.h new file mode 100644 index 000000000..8bfa0eb1b --- /dev/null +++ b/lab6/kernel/include/mmu.h @@ -0,0 +1,20 @@ +#ifndef MMU_H +#define MMU_H + +void set_up_identity_paging(); +void kernel_finer_gran(); + +void map_page(long*, long, long, long); +void switch_page(); + +long pa2va (long); +long va2pa (long); + +long trans(long); +long trans_el0(long); + +void setup_peripheral_identity(long*); + +void three_level_translation_init(); + +#endif diff --git a/lab6/kernel/include/mmu_regs.h b/lab6/kernel/include/mmu_regs.h new file mode 100644 index 000000000..9b97b70f1 --- /dev/null +++ b/lab6/kernel/include/mmu_regs.h @@ -0,0 +1,20 @@ +#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16)) +#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30)) +#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB) + +#define MAIR_DEVICE_nGnRnE 0b00000000 +#define MAIR_NORMAL_NOCACHE 0b01000100 +#define MAIR_IDX_DEVICE_nGnRnE 0 +#define MAIR_IDX_NORMAL_NOCACHE 1 + +#define PD_TABLE 0b11 +#define PD_BLOCK 0b01 +#define PD_ACCESS (1 << 10) +#define PD_KERNEL_USER_ACCESS (1 << 6) +#define BOOT_PGD_ATTR PD_TABLE +#define BOOT_PUD_ATTR (PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK) + +#define VT_OFFSET 0xffff000000000000 + +//reference +#define ENTRY_ADDR_MASK 0xfffffffff000L diff --git a/lab6/kernel/include/peripherals/base.h b/lab6/kernel/include/peripherals/base.h index 63f9c038f..ff5bda485 100644 --- a/lab6/kernel/include/peripherals/base.h +++ b/lab6/kernel/include/peripherals/base.h @@ -1,6 +1,6 @@ #ifndef _P_BASE_H #define _P_BASE_H -#define PBASE 0x3F000000 +#define PBASE 0xffff00003F000000 #endif /*_P_BASE_H */ diff --git a/lab6/kernel/include/system_call.h b/lab6/kernel/include/system_call.h index 6f0d4335a..687285a22 100644 --- a/lab6/kernel/include/system_call.h +++ b/lab6/kernel/include/system_call.h @@ -18,6 +18,7 @@ void do_signal(int, handler); void do_sigkill(int, int); void from_el1_to_fork_test(); +void simple_fork_test(); // for debug purpose void get_sp(); diff --git a/lab6/kernel/include/thread.h b/lab6/kernel/include/thread.h index ba5795aa4..710d71698 100644 --- a/lab6/kernel/include/thread.h +++ b/lab6/kernel/include/thread.h @@ -6,6 +6,7 @@ typedef struct thread { void* fp; void* lr; void* sp; + long* PGD; void* stack_start; void* kstack_start; void* sstack_start; @@ -14,6 +15,8 @@ typedef struct thread { struct thread* prev; void* signal_handler[10]; // sigid at most 9 int signal[10]; + void* code; + int code_size; } thread; void thread_init(); diff --git a/lab6/kernel/include/utils.h b/lab6/kernel/include/utils.h index 436890797..95dcbaa5e 100644 --- a/lab6/kernel/include/utils.h +++ b/lab6/kernel/include/utils.h @@ -4,6 +4,14 @@ extern void put32 ( unsigned long, unsigned int ); extern unsigned int get32 ( unsigned long ); +#define write_sysreg(r, __val) ({ \ + asm volatile("msr " #r ", %0" ::"r"(__val)); \ +}) +#define read_sysreg(r) ({ \ + unsigned long __val; \ + asm volatile("mrs %0, " #r : "=r" (__val)); \ + __val; \ +}) #endif /*_BOOT_H */ diff --git a/lab6/kernel/kernel8.img b/lab6/kernel/kernel8.img index 2d76c901c8e903a68279f796fd2fe206f495ed7f..61360180f888009c21b1714dddc106f6830160d0 100755 GIT binary patch literal 38752 zcmeHw4|rA8mG3?`0U`tqe-x_LoTwB8)SxH?7<0oPK|#SlN2j$zLJ~)yU$*0ueJ7CYp=ETKKovORiyT&)$Bv+;^f11Nlc@gQ@x3@*@xz<kkIRetUY}gt_p_^q^}R7`c;7FoNAw+8T+(-J`8j>ZZy(wB>(!(BPOL5M`)&K^ zzLR&K+xMTFAZv2=p$hzkBg*GVr?v{B8xm_*{W&Rt^GXLAoGXEK8nZN4Km8pKc zzZ|zh^__o**EgXq(f5w#qP~kdiu>N#Gpz5Y*q@wJsRplIk?gzfj+(w%b@ThGniurV z?O53NCq0Y$uBc27R(mSA@1UlWIyhVQt8dqyL!S%m`Yz5XRGBJE@l!37|5Zi$LwUuz zky0gSG)X{pSR$&ibi}B;xrzR#dzzJmEP2BTTCOb-H z!t;`u!=sXDCo`*+TIZ)z7h1eio4(q23c3o*RmLk$)nad7`yU?mrW3$tLUJ%$p3LBU zCBt?(&PU|4M1NKQ*PEzer#5|K5BZ+jv|s4`Y7}uao+?fbf2?-0Jwq#d z5!!}6@&7TG+y1K}HI@80<^Z0vd@dR{_1kCzcMM^|pL8+i89T=CdDH%(evF}ab!Df5KPS6*;S7$i=lPtna6DUok~nl3=6spP*==w_^x@QY@M7>_d?NgC zk+=6%_;FovvM*Vz`s#{n@agr9vvPoMA7l(CgWhDs7x)zU+qjtkoc*E~iD8MoPZi9G z_#(TJ<7P`6GT;B7`TqVPJlk0K5wr{a{deed{XNnrXdMR(d^T(`e0uSGHF=q}@uu~4 z;QrL$M*fDrub{8cZy!M4B{7W|kt~i9a9=RE(K1)P0(=a6K?4z)rqW2UR#JcylE3 zp;;%#XlJ$|+b_}PImD?=U(d@STuaEigGr^fsX9LZJ+Uo)OlYci1uuiaA~N8Yy0`5XprQR&w&Q6A23cPM| zP)~mWK5R0Ebrsv?YPvutGbE}xov*L#`HZ?h@b!e*<$-zH$=q?3J``ZEIZ$sGB zk%{&!#acOx*p;L&8d##I;zYjR{(d^CKZs6TOS=51pLcNGTn$}ZEjf5bJ>vn|qpg3t za-+ZT4E#7It~H&Ubl%u&Do~H!2tJG#n!hi$&n;J(kr5yEVT~+L(Vko2=T+fyV=Lf= zpp(Tj{B7M9tRFt#2fCFmU94&P6k+6fg$qj>o=a6`tmP^A;JFmOV%BbUsjjOh?A>q26yQ|Y*x+kj3EiFrjJt!V>-NqVp?VnuG@WsK_gXp~G0wz83xsA5+{r(HH=!cx6=#RqN+UMHXK9D7oy;ke| zKGYL=cvlzT!6#{(8XMCrJqM4p;4_+^wKw=d4#e?fRRv;2#l?#8yo&OkCM)J-`ztU9 z=4X|ddR~yIJf);zB5;4CR*RIa?UN7&s;s9dgMcyx0M%oloz_G z3TGjY056=C%={4g578EX1%2^XL*u!Vam>@TsLs`PpU7NEdx`xpb_8S-T0P|}L(;-L zg)Zk0{#oQp%=hQ7!>@CYfpFTG>pO&we?(c>54lk5&+wSj(JwUU3uu=wQyV^q@vI3L z2Q6;4SoYHc*p>?|jEQ{)^e}hv8GIgLUY9uH+8BO78w=d(Y?juUvGHxz##zv#EW0VM zmhU#s!}k9r`m>-%7;8NG59dl-Pybzxb;J=>z=L+dnwUzwa^3q3Q^-m7=mteh+ zCtwePUfvuaqm4_Rtto)3mW^M@br{zWCcfLf!sgO(Ttj)ZexE)72fp|a=eOL-V&~$( z!)YoLPIJ}*@cq*M3zbr1%Tb?%%prwv)E_p_pdLScJZ*Rx`mrXmmuY>zf0)!|u}vq( z`j9w)eJS-`1OLdI>tzLahMtFbA$wWKb_H#Re#-f-!nuMEb#dDI2QK}UG)7TydtNP%T~nApe2a4#Qa|tm+W$UFE1VJ(gH{ONxf1hxOMit=AAp|e3tU^&3-dVF0d=+0=$6l*A+g5ds*}}Y z*k27l{5W(Q^+QLrne_+R163o3RD<7swc#AbKek^}8}`s2&{qBGHicYs0p~|p%8T(H z^=^~ug4n>+3s~=i+{fGf`KM6_B=85j z?iIYWA8Z_^dT*p$+^6?=!FRY0$eYhEtKbDb^Zbv`&v*gPHYqn{pzPr|z{cSjdkL>N z`7qm2KX4%bZ8$@iDtz^Pk0|iH9ejbe&r4nrSXr(@AAO|;af$iP_D?bWb+jYsUvBhx zCfZ5hXDJibCTMK2^N(c2T-^Sl^m4V8FBQu-+{m%}*KrQzIzF{2KevnA)&|s_i7C|C zP`t*2?p!-3*nsDia)wO(!3Nx8iJtjP8^F%gPiXunVz5W`t zB=GWV@B;d11NaEyqB`QiR>V>1D}tX6hhE9Y+L(RJGUcN}BC^vRUw3)yb4w9&`4RaBB1 z;2xB;!=mwf_aOhLKS_C$W741}v?wq7DDO1vo1fjTG8Z{~E;W48+c6IL*h4N2bALHD z%>C%twMH*$HtHkG+u+%{q)>*BQU>B6SEa#=?ebE!;p5l?*}0jVvrmOngYO~U?V4M3 z$ijH{n9t=8l*s3gsx_?K*f0y(vXIT2jdBHyRTl7o+5 z%k%WqfQS3cl<{y;(O%wdPSoJ8Htt;S!hLMsO=i6O)ykT_Q=9%z-kB`tq5giB^Rv(U+U1U2d1KrxhRdi@8+FLDIeB;UW{|{S`y=2 ze5q$3{~wd5uD0?xF>bh#rvm2*)JL43^!`wMAbn*}4jU$t`i{D)oqgyqYbMr7%-cF= z?^FI&!TG>rES7O~R|RAEtmlDzdsQ$R&pHpML746!e5ql0bRyYb1%Ji1>y|o z9aInMGb8Bl=zWsQQ?)k%rVu}r+H=g-3^f>wn3tIaox0;tw-0)V0fl|aSEvW7aTh-3 zfqg)P2U<~^H26mueAMIa7=g{hdW1fzajtPGVnreRt;QvB|K2zA=I2;oq&D#1mavGICb#vuc2S|8`57c{R%q! z82X3P-!CG*?oR@rbvft#Qsg66-soI?n+mTAHX|=9jCaqSDCa+69DOrd8>UWGC*SiT z-WZLI_O9F1hTY%?+iX+ms{`hK(hIp4O*t@C8PvP5UI*q^2Jf*j*hTrtL3_pl8*exO z`VV6NDtQQS`cMyfV84jH^M(;%we$|TL%7^BgcNQ0OtmagZCu$!09Pfy;ZhvVm{9V z_J;*?p4tt3S8r48SnL&d8=lnHqrkh&!hB6vY?`VJaQ5u#b!s7x0At77v6nkz`zwRj z&O8?P5)xDY24ja|tngAZf|r3$|Do?rihNh!MJaqwZ**PdU0kwK%cS_;u1d`-TUnu$ zmb1k4-8pe3cuZydtSD6hYdO5nn;O5zkKgt1{lCc5KO=aW@?*VvsF$-?)AYv*+yP(= z$d3c@86e_rCWkW&dH0L67ZbB(A78#%ZRn$)6!xF+HoQ)I6!afRs9w3NQqT`So+>hi zGlDIY5$jFyEC777XorXsh@0z1Ip@qa&e`|D*%62{Bd}huFJ~-GlRux2f9PRcu?p;+ zs`%W(%#l2hR}LdSzB&ywxYn@_E99&UaUXVs9WqZM2ATY|O{r^wddLZxBRF(A#y)$< zG1KWoq=oh970{yoU0mBHpFmr(hcM|ATdg9^ZaWA?vH!7{kf;Ch$f5F_rO2=9aFMcWL=NGSME1aXE{a%-Vr_K%4>LkNcTa?L(wxp5YIJ z(5c*^32%pAu7$mB*Y>&(Iwp*^ehu|X5ze?7H#tWyb#1^km_jZOImX~!fID!k^N|CB zEcgL;3wcQ#Bwg5!bG7tHDXlm%-6IV@GnxEQX5EbtTmC~8Wybq)W|riORk^G+~zRahx^ z7p(5SggMf;(?8f%oA&;`lQAJ>{WyJXuo>}1cw^i+$If^mTThNtbX7rmrv$Ius?aURC; z`7rR4h7N682mHu)SZ6XPfaj}tM`ClG(c@qiwJl%~FLqXQ)@HBOD*fmKz&7euBOX{8;38(v`#L+3pkUy;|7zpu!ym z?$h88gSTSsVh=Q6_YFHx*Hh=9OS@ywF*8_=93t(y>w-IV`=EMg!65Hd-1eK?_P;_6 zyymz*s}uTZoU`Dphiz}OoVgrS?8EoV$H7N#7u<1Ed5*WrjN@GneTEzO3 z+@{jk1vkiDZp16>pQuy!eTl0((RJ&^W8rI6j1k~DmFtOP)VS@@o)3O0ae5tWp~lDk z)F<>ZBtGtj$v&=zW6I(&q{VUcg&MxkfxVgIu;w#30;y$xIANE>E$f4}{zw%e#*Kr$ z;k!x1J71+cG5<`8u@7?R@Qyb(8Gq9h?m~bja?&>utLfKuh#iRk_D-Nv+c@u1aTgx> zKxm{beb7>%!}yWA7JswwHy3}^-~qoO57vU@kwlzBj$>S)zsM)&mc_jYJ}b~P@5{!< z=O?B%zgJbIM#g((|6JB!7ik?r_CfO=IJ{TC?^h);?l|DmW`+05TzaKKPrpO2ap<{p ziim@JVRMqzJL3k|y-V)|?#(IlPX0{vehD0`kEtPIC)PCHWkLtYH;fzbwJkN^1-7T3Gl zCN{3{-mdIF8DAPyaA~tYJ3oeFeW12`f&L6QeLS{Bymz7whuZJl3;NU%<~4@%bY&A= zz_;q1cooa}Omv?$i#2f=YXdepqQdJ;eK5Qa^*H;)kNUX=pkvJU==;%54@=e7fp_j+ z?W^qHjq@`2n6?-C#a{691nLpa`<=7_Xk?LR5+w&dfxDxhME-d${H0e#eTL}wOZq=S zpE>-?nktu;)Eb}mg88U5EM3v1k%_rS>cV@WXYll!>t@fUZXl2N0OdrRYwc%w`uLWq z8TES>^3I}OJvAOm9y_gvM`$&-M2)3N_Q z@)r+t56gR&m-=c9^pH6Wyw$+@TmcU2k;BMuKGtQDbpm`hEXQ2RYpVVgIqM^w=jxg& z>Rf^6Y5eB>0sI`CA@~i#=LaXgO>?22kv`Vf;HA)g4dV4Ru-}TI_&IW(QFji`kaIEn zx&(OeT=~DV?zn%ny5k)Nk9UFK6U;T@v&Q!$|Amj#|2VGi;`cG;92xI&lsOA-#@QHi zw#3nnF{nXITaCLWYImIL^p{CLYloCWXBFspkS#Sfro9|}{dj&q-q(2Q(ONYwhAlC$ z27%%3lmn{)tb(*uoLlD^`l>YUn`Qb^P7b~Xef1pcoOfSo$2xg^3i=LIfbZy--eqR2 z%i|LCrAlyz*XS#oll@;t4U7Bg;mgRMnUvG#l^VR^F~Nlrv2}ueOQLGU+>K=39Om-*2Ch?`8xZ)3N%=^3;jw> zpYZkY8|Jyc!aTJO^gBGkTQMdclN=*52~CWlZn(F!c=U+`gTO8TDLB^=R$omezPk?uPJPR6>vuf;()t+@P z^1L0i29^KJSm@;ESFk=J?8sld$o)0uwT1ACV)};~T&;p58$E->aF@L{|B1h5jXov>obB?H)$%=*!@zNAUkko`Uy1jFy>$ubrGPKiPt?aV*Cg;Oij!ZYoQ1fQ z(c9YnFwa5gKjI6}6Kpspgnq5g-o(8ueFpMRW}gtpQt?;X1MyVvFEQTS3sR{k1}-OE z#zCi#yyAO6#quup!&pax=kDQjUH}%*3{Ih#EyN2lVR{m%mne#Bhd=<*vEX>`L zXW@Ht2G~<_$m^c1??k{yp%;1Q6(XjFe4d_s7&q zZ_${-d=H(cuMhqV`q28H75u4fhqHo}ww;_{Fc_2iSj#T>cF~C2;8v_y10RuK6uK5xWGQ zx*?ci>85W8CK=qjfotJD`ot#@Q?JMUInCGRI=$w2w)#2L-n)^bWt^&(dsWJRtTz2M zoabR3avax^$M@2FMon`c^DbmQK$*E-aV{55Lkz+iyB6#5r=ZERE5wv4+wY?vYeDBu zt_8dcmDqr>N6mTKCoqmQL>9j~_$B5;{yJXRyGJ^X_Z;P1?;l802D~?7Uf97lVmsTP zU>muEIcPiE$b&c*9_VEoGB=y?+xQH|LFb@8V=H)A6(dx}h&Ke&PHuj%A3c z{0d1F_avB1ls9p*k7^IdMnE;nOM{*Cx9H)Dav?_!3z{~eEAYQ`=#W8tHD ze3zQBzzfl4?xCJap>O*0Cg}Sdw6#Cl9Pnky%|+MFb4piZPXAO)w5O?Qlew+jIDgAfOFTj)MV$2=5Ps{J2c=+Qw^!KGMl<(>AyDT_s z4=1NGuN>3wGgve6?y=++jFV@)w~(3(cRHgSR979GZ{tQ-9gIbr-`C~uFXWc0%owf- z`h&fnyEMhRe~ZjRzZ;Qt&6urt-kC)01sb%y=pHo04{%=xcQ{eM0jEv{Cm7F2m-Yd_ za57>{!MsS5IQ%Z%lc?KK<78xfN(HZTJakfox!5_OzTy1}+`%f^dmZj_3$F5l9{`u% z**%wY5xro{;uLr%arZ#SC0G9MkoICD8^*C+4*9Qyovr-eA`bWsC9~jQ&+#nzF3{ii z6d93Q{~a-ocdPmRQ0jCX&%_{;!aN8Q`3+3=Rgf>PZ}eU3TYx9ysXNd=lN`jM?xvv@ z=Q*nEQOOH(e8b97t>uurTh85UkqP%M`>jj{?@TgHp-jY~OyI?~y?brv{#oEWNIb~E zJJtNmyHjmsqYkv5y`T*`gpIbTZ9}gS#)s@&@TFg+ynuPq$6DKGbBEkTws-&I_e+u+ zZLNy<4<7qe-I(CB)^FgW%R!5Dz0jkd2z>GhtZ}TpwCs_=Qze2$z&nB*Cb-E&gnO~U zP2sGTFjbcb=IHqdtt}3(nNI&&jFUYIYHk^qP6X2dmt2fKkMCTN=OD*X$;G7Y7X_CA zhwoFg97T~Fzs0*w%3KGT`Tarswv)!Gi*b%RI8Oryzt^O3QZdf!4$d!u^CgRuj&Xiu zaMIxA({6a*+JU}37B`G>UvlWZh`6=O;;7ZZ|YkSRC}@8SiL~o`*&A*=}iK@5p@)YpZY?K0l2+9L8Vn<9>Xa#4;UIQ^SI% zK##alobrbUPoS^X@=Om8K8@#FEl+<$#Pfrer}f$7h~QD+rjREugdJ<_m{dGwy&01& z(R%mNG3+h_s{_5qFn)#|-yh?=&%r6dIW^8(v@XIJXO+QmZQBXCtZlymeL%lr+g7Ll zJlJ-;rHAtbi=T9O9><-|Q5MIKab`I<6CoGqkH_B;FB#)p<=}kg_1t#c`4ZVxT}f~= z?4yQ*wue0rZ3Wv@AqNfEvwXYH<35A9#Nl4(HTc=@ z!&`;8sO8anH=b3N7&I~U<5T}yIo!aOIzrvkd64#Q1`4#u&~y##Bp+}#cx)F|QI4juEHN9S%s z2jjA6+r7|e&_Yao>$;k?>GD)&IDA!VGsr4+HRr&(n$M`Kb6t*1tVz2Znap#ZOkGAM zjLV|UI=33<)BIi^X|hIp4{Dg%tjF6;4QcvUp-*bacF?djBw^q~n8;~hQN0F#lv>Gr zUvEFwU`QO+YoJg5L)EgxiE7AoriL_fTw~=}r{y@Uh9n;BakZ7n;GIdP?Uac)lnK1p zj%rBI%BvOeEHxx~@cTQkM+H6)BR=3P^*Ims@WeLw4O0CHn*i6FqO^b8deZT4_}r0- z$5>~=$Jg4sb)dZ#wnQ9^{5*Pwudg-o0-tUA`g+*#`Jd@{k!{d+^^nv5+4LPopULAm z0~{568F64F&n$6{aV|em+wr`WXAp|9GaMDL77@R|_YAo&3=t<0ll9)`A>d+emqOQ~ z2Yg04U|f9&c;Kn;^xFFwI#+$l$n<^Or_*u9<|lIB@qU5&ko$F-{^(#X>7%cZ{&nc*{DBw8UGl)0 zhi~F;_9FNo^7p0K+a!>mW1hNZ_;bYY$fv^5fe)IkIeYh&)&F5J;ae&u&UF;|?$4r2`pKRq`XMfs^O+5mKKDWI9;eR}2~(46xJ z()=}i0L9gKJ8t?PGESWrypC~d3EnSx>0>MZBVR7DA@0?$$9cnK(4*}xz$fn*$2vMM z_#SC+ZgpkBOKcx}ctDLyAFBqv-=cQ3d7F37_&#t9Xu$t7VngUqaZf_Jv@>)iw8FCB z0BG^Ma)bEpM%14k6Z`}EUHyri_#OlH^Q%q)*Uj_xoVy=2`kV3{5Po+~+ZyNIf7IPe z$go%8e!`E*gS8)gn`Z`*Y{{`fFJ$8#8m*79!8Sa9JCnw?M&HzXAXH&`&`Fxld%KZBpZc^`wjM zGV`4m2X0F#@O#@v+e=^ZQiy?kR5AGpIbdgKjnQb z)@7{8wxW*Z`p%*)^7`Y0TS*7cJBNTR2JA4#^PQjIr^g5LiO=?y^bW_;(|$Bjd^A-%TjE=+7tTk{uQA?-FI5f!$9W&-E#DcA z^vQEqtD{2w86ApVEDrnRZ@iA9X`D;u`?H?6TKLdF62HgSmk?%x&2lnkJxq|=+pM7r#$S#q>ptJZO!_FpHfF*j_x@8E&^%IC4b~rz88|a z1JhDcCqN$kdymtM?0}=Dkv#q;{R{c@aqLOB_Js%T)$p_osx*GxD(f z_9Eh$=mYqSZMF_0UJAc4FS+#)@ zhXErF^W(b;ZCH@g)kE5cDsVn1e66hu@lelQ37x(b&ZM`1i@!K|Tk;P4_u^u@u+{Ns*F@7V?VSbYz6ILmm--;1%-6Zx;?8!WiZWS1$2c{^llN)8WI6v($mT z!=&F~TK&c~sDe(1LI0)>-KWCygD)U=y7F+YgfkA`=gg13>&gK5&v)y(b)QOJ5bOdS z{%*TV%Ufo~xO400Jh83|{SLUaPtx)n0xyyQFy3*oG?J!nRiIG;dwN#KL(rhktuOqS zc!5s^_<69A%=rww$`SME%TK^h*T7z`ervS;P;2GeioOdQ>-s@m8v8}4{cMGy!@Vu* z_Bwo@G13k2WsZ1nW&8&AnGno^eRw}YWHoedI0GHITY}tmy@BJbS=Ly-U&Ze?Ky#n! zpAcLE9#SirJtOn4saN*len)VD_O*kmcfsH?3lh<>lGUOM5`G9CAgx z_+2Z~MU6NX{Rx~SqRy)QbDWb!`%=KO)q2k^xxqeT|0KDi+T@CA!G$sA6(u#d%glKws<+RWnz>>3Uy27ikf zix@E$|7}(MyR7d17q~C{7I_nN+!!YOD1%)GX&vuGF1rp*Utz2hdm!G3ju|V^hEK4@ z->2%{5qu2t2n_v&dv5NNc+cr>cV_)&ynXeh>0)!+(D@n2Ww4dEgEU?fqHM8j6pc z)xu6P@AQQM-~H#~#cNHUkECiJp;Pd%&3B|ZAf#!=J+h`OHH6Gx*o^c>A-KS%Npc6108GVqq0wcJl}&nTtA9A z74XP6V_eQN8q58Z>=Ur3V%*|0&uiEwUD+p?XF12^egd^(HS!OCca*r|gR)=HV>#DC zzLuWP{fxt({iIj;+d6Y2TiLUDXODsSEPEyV9ualV-z8$KV!cOy^*5_edM6jW7!K|n zsC)nZW9jY}kEJHQcFf=0|4DUnVRY|R;v;NC-F}q*RIslpe^8yM@YT`h;Xl0ZT*7w{ zco)O=6sNt!X*WCVhn)5v)Bcvz_qx*t-3;kMAM!b=(O0U!NUg7Lt6$sH={MJZpviA* z@Ag~TTDn{6TU$QZ)Hr&iQunlPoZQ*u*SEH|H`I5xcls?|{@V7IwzYnDyMNclhIKwL zfY^lr{-nk^J_q5S`A`iTJN=IK_SQM3V`cmLrtW5rzq_fe+rPWB9nJb~f4y+H>Z+@V zheGGZ`j%G1Wo=WpU+;Gj!*6Kb*tU)+T`?V!uT+M1h|Evl`ks1Pw!B)O0Xu2Ti|Fw+lkX5VZ*H-Eg(|tb7$Qv&6zw!ou z#o~o77o|4VcXs<7oh@zMcjXPJ-PqQ~c{j8-Hu-mTwy!t5?{02sXr}VX81p|9-|7Cl z9FUb(sYPwwP2jfHZ|Z4i>gaB1Z-dF(8e5w>HO|TvD{EITT1M$b6^oYTJ*q|dV700l zvf%&g{f%vnO?S1lH8sYhuku%Pwl|PLWSGYK?s~s|O*^OE)LIz{*3#A`E)&B+r*%dI zU)T;7olR?7x*$J#<#}C8YpcPqa%^mC>gi}|=!O_w_W*Z&1KedgG+ZFZIoj-MQjc!D zck286TcK;rTRbFwZfc{O@Oe_#9N!F!{F?oXZe3Vm1%McrlmSbcuwwnY+dEsevsd=yfmKYeX8wYOi*8h9nvan5@51V9 zYMc(mW9s4%%}uQxzWp~xd#;a#+~o^oeN!8wfKqq@U-Qr6X<=@sFjirmO>5er4*hQq z7|COIbCciL^nsR!Cac#@Jay4q`EQP>hDcF&+s5^4Vl67QzG;1X=RKONgI`m7i*G>PoeC8C*>tk0ft`px;@)zOki?0SCb^Mx5jGacD%XMkStr(K2X`zp=|sth=+R ziPoZ#PiLbVyVtmU+BbH0Y}Bl@USRVkDyP2dp0);yImhpA>VnT8JnMc&7d^-Bmi0{_ zqA}`h z)pNNz;o3XbiSU-AMcw7EsfS0l$m$l-h(CFFqGtzg_<=@o zz;{xQKW7U6&v;l@bNfa(GApAsO^9`!CNiyLh=&0hQ3XNt$RD-epFV05qN!VVEO>XV zzjDQ*Wl`;5I|}NDT9f*~N`_0w#k70`KB>jv-pGs$Ms5C0h)XuF8;KS!rxKVjG2Rhj zbhBDQLDbd3g@!_;tEr(KX8OYi z(8&1LQQyh>j|#N{fRC^hQLLTU*SEC!4Khg`EV`Oo7}_lSu6oS86H@wjw{$lf3WyVW zPLWw6e9eL;V}4tIk07$FGAmhEKf3;8j23T)5Up$4r7p63TTnX1g4@wp=j(kILlNUB z4t1~TjBMSFhXOkj@2&DV;tvCzps_a8&4`V}K~sv0ez6`XVuWzhrJ*%>gJ8>J7l1)N3>PoEmjX= zN==!8*|L>-)>X;+dsgdEp(i?BYE6{xP?L;dE!EW4zHx0c*pm{XUl(FnLz6D_7l_Ny zuUP~(eE?*H*(!~!JsW){OhxhC5My|Ol#zJR{=t+<%KKogD(<<&yQs8W4hSYf>(lWc z|C~CuF9GKjY!V$_ zi7tc0d7QxC){p0M^Y95A{}xE$qgjSA`_TV5_H5{1v18=UbLKx%lK6}>b|!Etx8>`G zI#`DOh3H>}HfioC-dVKL=z#E6z4#HSsfxLG4`{8Q*JemIw- zE-m~HXZ-VkF9Up@hL`O~?DTGN;BNrl3^;9N$3tp6-J66-V(!nXlF^U+)mKbAlm!XwcT z!}kHc=WlYki{0^yG~CCKgMdH&iCpeD+IIXVBO|+L`{Tgr#((gZ{sx?~dSm-i$o)F{ z&HSv7LdDugDPJXUW#;3^la=;&dGM8&~=-zJV zUXH$nfWHoS8T<?J#+1LUR;~2ONICXzJ z^cvgQ?T^Z>`i$;wu6VE^;zpZNJ)ZW|F{uQjIsHS}*of3NPZY%u*N(O^Ve%tZfYL+5>_e>(afMZeXqTrN%G2+4SFu{*&mx!_ZlUe(I|m{qykS z60hlgyUsRRJ+Pbec?@_bfcLb<^VeZK?eR4Fd%qa@huG`g#vX*f1o%O~Q+k}x|8oa^ z9PmnfL1UGMpBAUbZ$w?~hc`6ZgQ z0MzSoj{p19^H*sJ^oIT(NA5cvxu*j@V1Ow(`dlT6G%SNXtMhW@9&2D@mz*X=0XIcokRBNJqiRouNcGtM(lbBOl>Z9`Nxm$2zL-doz#BnkDS{(x+nn+ixoJp=Yh9y;LQ4c!@!>b zF60s$*;v8xrMSTJN<3a-g=?Sb27ad=FK{<*F9Uqyi@9941AnhG?^eKD0mtvHlE2uG zd>=&rzL(;BOMSo38TUBgrH67k>JH@9lq9n?0dt&P23i`^B+kh zl1_Xs!%Oa#yQ*pysg0N(KVs?TH>)- z$31|*_M<3n3mqG`DeI$vPYI*iUEsEM2UzsDA2_YRInz3P1@LabAJlWvGMHpT8BYTK zayIf;@gM82o_T>{KgpB-raV@H|3z){e*HPyJontApF8j$yCVD{^SODJey+P-fA*OE Y(#!PoueU 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 chunk_size) { - return frame_malloc((size + 4096 - 1) / 4096); + return pa2va(frame_malloc((size + 4096 - 1) / 4096)); } if (node_arr[20] == NULL) { char* t = frame_malloc(1); @@ -229,7 +234,10 @@ void* my_malloc(size_t size) { return 0; } frame_pool[pos >> 12] ++; - return pos; + if (pos == 0) { + uart_printf ("something wrong\r\n"); + } + return pa2va(pos); } void my_free(char* addr) { diff --git a/lab6/kernel/src/boot.S b/lab6/kernel/src/boot.S index e6add013b..0d90e2cfa 100644 --- a/lab6/kernel/src/boot.S +++ b/lab6/kernel/src/boot.S @@ -1,6 +1,6 @@ -// #include "mm.h" +#include "mmu_regs.h" -#define CORE0_TIMER_IRQ_CTRL 0x40000040 +#define CORE0_TIMER_IRQ_CTRL 0xffff000040000040 .section ".text.boot" @@ -10,18 +10,57 @@ _start: mrs x0, mpidr_el1 and x0, x0,#0xFF // Check processor id - cbz x0, master // Hang for all non-primary CPU + cbz x0, setup_tcr_el1 // Hang for all non-primary CPU b proc_hang proc_hang: b proc_hang -master: +setup_tcr_el1: bl from_el2_to_el1 + + ldr x0, = TCR_CONFIG_DEFAULT + msr tcr_el1, x0 + + ldr x0, =( \ + (MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | \ + (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8)) \ + ) + msr mair_el1, x0 + + mov x0, 0x1000 // PGD's page frame at 0x1000 + mov x1, 0x2000 // PUD's page frame at 0x2000 + + ldr x2, = BOOT_PGD_ATTR + orr x2, x1, x2 // combine the physical address of next level page with attribute. + str x2, [x0] + + ldr x2, = BOOT_PUD_ATTR + mov x3, 0x00000000 + orr x3, x2, x3 + str x3, [x1] // 1st 1GB mapped by the 1st entry of PUD + mov x3, 0x40000000 + orr x3, x2, x3 + str x3, [x1, 8] // 2nd 1GB mapped by the 2nd entry of PUD + + msr ttbr0_el1, x0 // load PGD to the bottom translation-based register. + msr ttbr1_el1, x0 // also load PGD to the upper translation based register. + + mov sp, 0x100000 + bl three_level_translation_init + + mrs x2, sctlr_el1 + orr x2 , x2, 1 + msr sctlr_el1, x2 // enable MMU, cache remains disabled + + ldr x2,= boot_rest + br x2 + +boot_rest: + - ldr x1, =0x100000 + ldr x1, =0xffff000000100000 mov sp, x1 - adr x0, bss_begin adr x1, bss_end @@ -227,8 +266,8 @@ switch_to: mov x9, sp str x9, [x0, 16 * 6] - ldp x19, x20, [x1, 16 * 0] - ldp x21, x22, [x1, 16 * 1] + ldp x19, x20, [x1, 16 * 0] + ldp x21, x22, [x1, 16 * 1] // x0, x1 are 0xffff shits ldp x23, x24, [x1, 16 * 2] ldp x25, x26, [x1, 16 * 3] ldp x27, x28, [x1, 16 * 4] diff --git a/lab6/kernel/src/cpio.c b/lab6/kernel/src/cpio.c index 9065b0cc5..c744d6242 100644 --- a/lab6/kernel/src/cpio.c +++ b/lab6/kernel/src/cpio.c @@ -5,6 +5,8 @@ #include "helper.h" #include "alloc.h" #include "thread.h" +#include "mmu.h" +#include "utils.h" extern char* _cpio_file; char buff[1024]; @@ -121,37 +123,57 @@ extern thread* get_current(); void cpio_load(char* str) { irq(0); - /* - void* t = my_malloc (4096); - stack += 4096 - 16; - */ - void* pos = cpio_find(str); - void* code = my_malloc(4096 * 64); - strcpy(pos, code, 4096 * 64); - thread_init(); + thread* cur = get_current(); + uart_printf ("cur: %llx\r\n", cur); + long xxx = read_sysreg(tpidr_el1); + uart_printf ("xxx: %llx\r\n", xxx); - void* stack = get_current() -> stack_start + 4096 - 16; - void* el1_sp = get_current() -> sp; - - uart_printf("Running code from %x...\n", code); + void* pos = cpio_find(str); + cur -> code = my_malloc(4096 * 64); + cur -> code_size = 4096 * 64; + for (int i = 0; i < cur -> code_size; i ++) { + ((char*)cur -> code)[i] = ((char*)pos)[i]; + } - // uart_irq_on(); + uart_printf ("%llx, %llx, %llx\r\n", cur -> PGD, pa2va(cur -> PGD), &(cur -> PGD)); - /* - uart_irq_send ("fuck me\r\n", 9); - - char buf[1]; - - while (1) { - buf[0] = uart_irq_read(); - if (buf[0]) { - uart_irq_send(buf, 1); - } - delay(1e7); - uart_irq_send ("fuck me\r\n", 9); + setup_peripheral_identity(pa2va(cur -> PGD)); + for (int i = 0; i < cur -> code_size; i += 4096) { + map_page(pa2va(cur -> PGD), i, va2pa(cur -> code) + i, (1 << 6)); } - */ + for (int i = 0; i < 4; i ++) { + map_page (pa2va(cur -> PGD), 0xffffffffb000L + i * 4096, va2pa(cur -> stack_start) + i * 4096, (1 << 6)); + } + + uart_printf ("%llx\r\n", cur -> PGD); + asm volatile("dsb ish"); + write_sysreg(ttbr0_el1, cur -> PGD); + asm volatile("dsb ish"); + asm volatile("tlbi vmalle1is"); + asm volatile("dsb ish"); + asm volatile("isb"); + + cur -> code = 0; + cur -> stack_start = 0xffffffffb000L; + void* sp = 0xfffffffff000L - 16; + void* el1_sp = cur -> sp; + + long ttbr1 = read_sysreg(ttbr1_el1); + long ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx\r\n", ttbr0, ttbr1); + + uart_printf ("cur -> PGD %llx\r\n", cur -> PGD); + + // uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans(cur -> code)); + + + uart_printf ("uart printf: %llx\r\n", uart_printf); + + uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans_el0(cur -> code)); + ttbr1 = read_sysreg(ttbr1_el1); + ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx, &TTBR0: %llx\r\n", ttbr0, ttbr1, &ttbr0); asm volatile( "mov x1, 0;" @@ -164,7 +186,7 @@ void cpio_load(char* str) { "mov sp, %[sp_el1];" "eret;" : - : [code] "r" (code), [sp] "r" (stack), [sp_el1] "r" (el1_sp) + : [code] "r" (cur -> code), [sp] "r" (sp), [sp_el1] "r" (el1_sp) : "x1", "x2", "sp" ); } diff --git a/lab6/kernel/src/exception.c b/lab6/kernel/src/exception.c index 12aca3c7b..bda87d382 100644 --- a/lab6/kernel/src/exception.c +++ b/lab6/kernel/src/exception.c @@ -133,10 +133,28 @@ void c_undefined_exception() { while (1); } +#define ESR_ELx_EC(esr) ((esr & 0xFC000000) >> 26) + void c_system_call_handler(trapframe_t* tf) { irq(0); + + unsigned long esr = read_sysreg(esr_el1); // cause of that exception + unsigned int ec = ESR_ELx_EC(esr); + + if (ec == 0b100100) { + uart_printf ("data aboart el0\r\n"); + while (1); + } + if (ec == 0b100000) { + uart_printf ("ins \r\n"); + while (1); + } + if (ec == 0b100101) { + uart_printf ("data aboard el1\r\n"); + while (1); + } + int id = tf -> x[8]; - // uart_printf ("having exception of id %d\r\n", id); if (id == 0) { tf -> x[0] = do_getpid(); } diff --git a/lab6/kernel/src/helper.c b/lab6/kernel/src/helper.c index 03aa03dcd..a3c6c359f 100644 --- a/lab6/kernel/src/helper.c +++ b/lab6/kernel/src/helper.c @@ -49,3 +49,9 @@ void strcpy(char* from, char* to, int size) { void delay (unsigned long long t) { while (t --); } + +void memset(char* arr, char t, int size) { + for (int i = 0; i < size; i ++) { + arr[i] = t; + } +} diff --git a/lab6/kernel/src/kernel_start.c b/lab6/kernel/src/kernel_start.c index 4227cc5f8..7cc63a402 100644 --- a/lab6/kernel/src/kernel_start.c +++ b/lab6/kernel/src/kernel_start.c @@ -4,20 +4,33 @@ #include "cpio.h" #include "alloc.h" #include "thread.h" +#include "mmu.h" -extern char _bootloader[]; extern void core_timer_enable(); extern char* fdt_addr; +extern char _code_start[]; +extern char _code_end[]; + +extern thread* get_current(); void kernel_begin(char* fdt) { fdt_addr = fdt; uart_init(); + long t = 0xffff000000000000; + uart_printf ("%llx translated to %llx\r\n", t, trans(t)); + + uart_printf ("Hello world\r\n"); fdt_traverse(get_initramfs_addr); // also set _cpio_file manage_init(); - // core_timer_enable(); - + thread_init(); + get_current() -> code = _code_start; + get_current() -> code_size = (_code_end - _code_start + 1); + get_current() -> PGD = 0x1000; + + long x = 0xffff000000000000; + uart_printf ("0x%llx\r\n", &x); shell_begin(fdt); return; diff --git a/lab6/kernel/src/linker.ld b/lab6/kernel/src/linker.ld index a26d7cae4..2d7e67ba1 100644 --- a/lab6/kernel/src/linker.ld +++ b/lab6/kernel/src/linker.ld @@ -1,8 +1,13 @@ + + SECTIONS { - . = 0x80000; + . = 0xffff000000000000; + . += 0x80000; + _code_start = . ; .text.boot : { *(.text.boot) } .text : { *(.text) } + _code_end = .; .rodata : { *(.rodata) } .data : { *(.data) } . = ALIGN(0x8); diff --git a/lab6/kernel/src/mmu.c b/lab6/kernel/src/mmu.c new file mode 100644 index 000000000..705834554 --- /dev/null +++ b/lab6/kernel/src/mmu.c @@ -0,0 +1,215 @@ +#include "mmu.h" +#include "helper.h" +#include "utils.h" +#include "alloc.h" +#include "thread.h" +#include "mmu_regs.h" + +#define PERIPHERAL_START 0x3c000000L +#define PERIPHERAL_END 0x3f000000L + +#define DEVICE_BASE 0x3F000000L + + +const int page_size = 4096; + +void three_level_translation_init(){ + unsigned long *pmd_1 = (unsigned long *) 0x3000; + for(unsigned long i=0; i<512; i++){ + unsigned long base = 0x200000L * i; // 2 * 16^5 -> 2MB + if(base >= DEVICE_BASE){ + //map as device + pmd_1[i] = PD_ACCESS + PD_BLOCK + base + (MAIR_IDX_DEVICE_nGnRnE << 2) + PD_KERNEL_USER_ACCESS; + } + else{ + //map as normal + pmd_1[i] = PD_ACCESS + PD_BLOCK + base + (MAIR_IDX_NORMAL_NOCACHE << 2); + } + } + + unsigned long *pmd_2 = (unsigned long *) 0x4000; + for(unsigned long i=0; i<512; i++){ + unsigned long base = 0x40000000L + 0x200000L * i; + pmd_2[i] = PD_ACCESS + PD_BLOCK + base + (MAIR_IDX_NORMAL_NOCACHE << 2); + } + + unsigned long * pud = (unsigned long *) 0x2000; + *pud = PD_TABLE + (unsigned long) pmd_1; + pud[1] = PD_TABLE + (unsigned long) pmd_2; +} + +/* +void set_up_identity_paging() { + write_sysreg(tcr_el1, TCR_CONFIG_DEFAULT); + + long attr = + (MAIR_DEVICE_nGnRnE << (MAIR_IDX_DEVICE_nGnRnE * 8)) | + (MAIR_NORMAL_NOCACHE << (MAIR_IDX_NORMAL_NOCACHE * 8)); + write_sysreg(mair_el1, attr); + + long* l0 = (long*)0x1000L; + long* l1 = (long*)0x2000L; + + memset(l0, 0, 0x1000); + memset(l1, 0, 0x1000); // clears the page table: + + long *p0 = (long*)0x3000; + for (int i = 0; i < 504; i++) { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_BLOCK, (1 << 6); + } + // [0x3F000000 ~ 0x80000000] device memory + for (int i = 504; i < 1024; i++) { + p0[i] = (i << 21) | PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_BLOCK; + } + + l0[0] = (long)l1 | BOOT_PGD_ATTR; + l1[0] = 0x3000L | PD_TABLE; + l1[1] = 0x4000L | PD_TABLE; + + write_sysreg(ttbr0_el1, l0); + write_sysreg(ttbr1_el1, l0); + + unsigned long sctlr = read_sysreg(sctlr_el1); + write_sysreg(sctlr_el1, sctlr | 1); +} +*/ + +/* +void kernel_finer_gran() { + // [0x00000000, 0x3F000000] normal memory + asm volatile ( "dsb ish;" ); + + long* l1 = pa2va(0x2000L); + + asm volatile ( "dsb ish;" ); + + l1[0] = 0x3000L | PD_TABLE; + l1[1] = 0x4000L | PD_TABLE; + asm volatile ( "dsb ish;" ); +} +*/ + +void map_page(long * pgd, long va, long pa, long flag){ + for(int i=0; i<4; i++){ + unsigned int offset = (va >> (39 - i * 9)) & 0x1ff; + + if(i == 3){ + pgd[offset] = pa; + pgd[offset] |= PD_ACCESS | PD_TABLE | (MAIR_IDX_NORMAL_NOCACHE << 2) | flag; + return; + } + + if(pgd[offset] == 0){ + unsigned long * new_page_table = my_malloc(4096); + for(int j=0; j<4096; j++){ + ((char *) (new_page_table))[j] = 0; + } + pgd[offset] = va2pa(new_page_table); + pgd[offset] |= PD_TABLE; + } + + pgd = (long*) (((long) (pgd[offset] & ENTRY_ADDR_MASK)) + 0xffff000000000000); + } +} + +/* +void map_page(long* pt, long va, long pa, long flag) { + if (pa < 0x3c000000) { + uart_printf ("mapping from %llx to %llx, pt is %llx\r\n", pa, va, pt); + } + for (int level = 0; level < 4; level ++) { + // uart_printf ("%d\r\n", level); + long id = (va >> (39 - 9 * level)) & 0b111111111; + if (pt[id] != 0) { + if (level == 3) { + uart_printf ("exited mapping\r\n"); + } + pt = pa2va(pt[id] & (0xfffffffff000L)); + } + else { + if (level == 3) { + pt[id] = pa | PD_ACCESS | PD_PAGE | flag | (MAIR_IDX_NORMAL_NOCACHE << 2); + break; + } + else { + long* t = my_malloc(page_size); + for (int i = 0; i < 4096; i ++) { + ((char*)t)[i] = 0; + } + pt[id] = va2pa(t) | PD_TABLE; + pt = pa2va(pt[id] & (0xfffffffff000L)); + } + } + } +} +*/ + + +void setup_peripheral_identity(long* table) +{ + unsigned long pages = (PERIPHERAL_END - PERIPHERAL_START + 4096 - 1) / 4096; + for (int i = 0; i < pages; i++) + { + // uart_printf ("%d\r\n", i); + map_page(table, PERIPHERAL_START + i * 4096, PERIPHERAL_START + i * 4096, (1 << 6)); + } +} + +long pa2va(long x) { + return x + 0xffff000000000000; +} +long va2pa(long x) { + return x - 0xffff000000000000; +} + +long trans(long x) { + long res; + asm volatile ( + "mov x0, %[input];" + "AT S1E1R, x0;" + "MRS %[res], PAR_EL1;" + // "isb;" + : [res] "=r" (res) + : [input] "r" (x) + : "x0" + ); + if (res & (0x1)) { + uart_printf ("trans failed, res: %x\r\n", res & 0xfff); + } + return (res & 0xfffffffff000) | (x & 0xfff); +} + +long trans_el0(long x) { + long res; + asm volatile ( + "mov x0, %[input];" + "AT S1E0R, x0;" + "MRS %[res], PAR_EL1;" + // "isb;" + : [res] "=r" (res) + : [input] "r" (x) + : "x0" + ); + if (res & (0x1)) { + uart_printf ("trans failed, res: %x\r\n", res & 0xfff); + } + return (res & 0xfffffffff000) | (x & 0xfff); +} + +extern thread* get_current(); + +void switch_page() { + asm volatile( + "mov x0, %0;" + "dsb ish;" + "msr ttbr0_el1, x0;" + "dsb ish;" + "tlbi vmalle1is;" + "dsb ish;" + "isb;" + : + : "r" (get_current() -> PGD) + : "x0" + ); +} + diff --git a/lab6/kernel/src/shell.c b/lab6/kernel/src/shell.c index 395482c12..9f564b5d3 100644 --- a/lab6/kernel/src/shell.c +++ b/lab6/kernel/src/shell.c @@ -12,8 +12,15 @@ #include "thread.h" #include "system_call.h" #include "signal.h" +#include "thread.h" +#include "mmu.h" char buf[1024]; +extern thread* get_current(); +extern thread** threads; +extern void** thread_fn; + +extern char _code_start[]; extern void core_timer_enable(); @@ -112,8 +119,56 @@ void malloc_test() { print_pool(); } +void do_simple_fork_test() { + irq(0); + int id = thread_create(from_el1_to_fork_test); + thread* child = threads[id]; + thread* cur = get_current(); + int t = (cur -> code_size + 4096 - 1) / 4096 * 4096; + child -> code = my_malloc(t); + child -> code_size = cur -> code_size; + + uart_printf ("Child code physical: %llx\r\n", child -> code); + + uart_printf ("simple fork test: "); + for (int j = 0; j < t / 4096; j ++) { + for (int i = 0; i < 10; i ++) { + uart_printf ("%d ", (_code_start + 4096 * j)[i]); + } + uart_printf ("\r\n"); + } + + uart_printf ("copying code of size %d\r\n", t); + strcpy(cur -> code, child -> code, t); + uart_printf ("fuck: "); + for (int i = 0; i < 10; i ++) { + uart_printf ("%d ", ((char*)(child -> code + 4096))[i]); + } + uart_printf ("\r\n"); + uart_printf ("t / 4096 : %d\r\n", t / 4096); + for (int i = 0; i < t / 4096; i ++) { + map_page(pa2va(child -> PGD), i * 4096, va2pa(child -> code) + i * 4096, (1 << 6)); + } + + for (int i = 0; i < 4; i ++) { + map_page(pa2va(child -> PGD), 0xffffffffb000L + i * 4096, va2pa(child -> stack_start) + i * 4096, (1 << 6)); + } + + setup_peripheral_identity(pa2va(child -> PGD)); + + child -> code = 0; + child -> stack_start = 0xffffffffb000; + + uart_printf ("%llx\r\n", child -> PGD); + + uart_printf ("thread_fn[%d]: %llx\r\n", id, thread_fn[id]); + + irq(1); +} + void shell_begin(char* fdt) { + fdt += 0xffff000000000000; while (1) { uart_recv_string(buf); uart_printf("\r\n"); @@ -198,7 +253,8 @@ void shell_begin(char* fdt) thread_test(); } else if (same(buf, "fork")) { - thread_create(from_el1_to_fork_test); + do_simple_fork_test(); + while (1); } else if (same(buf, "timer")) { core_timer_enable(); diff --git a/lab6/kernel/src/system_call.c b/lab6/kernel/src/system_call.c index f0eab54fc..9cb78859b 100644 --- a/lab6/kernel/src/system_call.c +++ b/lab6/kernel/src/system_call.c @@ -6,6 +6,8 @@ #include "mini_uart.h" #include "helper.h" #include "exception.h" +#include "utils.h" +#include "mmu.h" extern thread* get_current(); extern thread** threads; @@ -50,17 +52,50 @@ uint64_t get_sp_el1() { // tf is the sp int do_fork(trapframe_t* tf) { + switch_page(); + uart_printf ("Started do fork\r\n"); int id = thread_create(NULL); // later set by thread_fn thread* cur = get_current(); thread* child = threads[id]; + for (int i = 0; i < 10; i ++) { child -> reg[i] = cur -> reg[i]; } - strcpy(cur -> stack_start, child -> stack_start, stack_size); - strcpy(cur -> kstack_start, child -> kstack_start, stack_size); + + for (int i = 0; i < stack_size; i ++) { + ((char*) child -> kstack_start)[i] = ((char*)(cur -> kstack_start))[i]; + } + // uart_printf ("finish copying kernel stack\r\n"); + for (int i = 0; i < stack_size * 4; i ++) { + ((char*) child -> stack_start)[i] = ((char*)(cur -> stack_start))[i]; + } + // uart_printf ("finish copying user stack\r\n"); + + int t = (cur -> code_size + 4096 - 1) / 4096 * 4096; + child -> code = my_malloc(t); + child -> code_size = cur -> code_size; + + for (int i = 0; i < t; i ++) { + ((char*)child -> code)[i] = ((char*)(cur -> code))[i]; + } + // uart_printf ("finish copying code\r\n"); + + setup_peripheral_identity(pa2va(child -> PGD)); + // uart_printf ("finish mapping peripheral\r\n"); + for (int i = 0; i < t / 4096; i ++) { + map_page(pa2va(child -> PGD), i * 4096, va2pa(child -> code) + i * 4096, 0); + } + // uart_printf ("finish mapping code\r\n"); + for (int i = 0; i < 4; i ++) { + map_page(pa2va(child -> PGD), 0xffffffffb000L + i * 4096, va2pa(child -> stack_start) + i * 4096, 0); + } + // uart_printf ("finish mapping stack\r\n"); + + child -> stack_start = 0xffffffffb000; + child -> code = 0; child -> sp = (void*)((char*)tf - (char*)cur -> kstack_start + (char*)child -> kstack_start); child -> fp = child -> sp; @@ -77,16 +112,18 @@ int do_fork(trapframe_t* tf) { void* sp_el0 = get_sp_el0(); void* sp_el1 = get_sp_el1(); - uart_printf ("CUR SPEL0: %x, CUR SPEL1: %x\r\n", sp_el0, sp_el1); + uart_printf ("CUR SPEL0: %llx, CUR SPEL1: %llx\r\n", sp_el0, sp_el1); trapframe_t* child_tf = (trapframe_t*)child -> sp; child_tf -> x[0] = 0; child_tf -> sp_el0 += child -> stack_start - cur -> stack_start; + + //elr_el1 should be the same - uart_printf ("Child tf should be at %x should jump to %x\r\n", child -> sp, thread_fn[id], child_tf -> elr_el1); - uart_printf ("And then to %x, ori is %x :(:(:(:(:\r\n", child_tf -> elr_el1, tf -> elr_el1); + // uart_printf ("Child tf should be at %x should jump to %x\r\n", child -> sp, thread_fn[id], child_tf -> elr_el1); + // uart_printf ("And then to %x, ori is %x :(:(:(:(:\r\n", child_tf -> elr_el1, tf -> elr_el1); - uart_printf ("diff1 %x, diff2 %x\r\n", (void*)tf - (cur -> kstack_start), (void*)child_tf - (child -> kstack_start)); + // uart_printf ("diff1 %x, diff2 %x\r\n", (void*)tf - (cur -> kstack_start), (void*)child_tf - (child -> kstack_start)); return id; } @@ -96,7 +133,17 @@ void do_exit() { } int do_mbox_call(unsigned char ch, unsigned int *mbox) { - return mailbox_call(mbox, ch); + int* t = my_malloc(4096); + for (int i = 0; i < 4096; i ++) { + ((char*)t)[i] = ((char*)mbox)[i]; + } + int res = mailbox_call(t, ch); + for (int i = 0; i < 4096; i ++) { + ((char*)mbox)[i] = ((char*)t)[i]; + } + return res; + + // return mailbox_call(mbox, ch); } void do_kill(int pid) { @@ -178,7 +225,14 @@ void fork_test_func() { } */ } + +extern void uart_write(char); void simple_fork_test() { + uart_write('f'); + while (1); + // uart_printf ("In simple fork test\r\n"); + + /* for (int i = 0; i < 1; i ++) { // uart_printf ("%d: %d\r\n", getpid(), i); int t = fork(); @@ -190,7 +244,7 @@ void simple_fork_test() { } } exit(); - while (1); + */ } void fork_test_idle() { while(1) { @@ -217,12 +271,49 @@ void fork_test_idle() { } } +extern char _code_start[]; + +void im_fineee() { + uart_printf ("im fine\r\n"); +} + void from_el1_to_fork_test() { irq(0); - uart_printf ("From el1 to el0 fork test\r\n"); - get_current() -> stack_start = my_malloc(4096); - void* stack = get_current() -> stack_start + 4096 - 16; + // switch_page(); + uart_printf ("%llx\r\n", get_current() -> PGD); + long ttbr0 = read_sysreg(ttbr0_el1); + long ttbr1 = read_sysreg(ttbr1_el1); + uart_printf ("ttbr0: %llx, ttbr1: %llx\r\n", ttbr0, ttbr1); + void* sp = 0xfffffffff000 - 16; + void* code = (char*)simple_fork_test - _code_start; + + long test = code; + uart_printf ("%llx translated to %llx\r\n", test, trans(test)); + uart_printf ("%llx translated to %llx\r\n", test, trans_el0(test)); + + uart_printf ("stack: %llx code: %llx\r\n", sp, code); + + /* + for (int i = 0; i < 100; i ++) { + uart_printf ("%d ", ((char*)code)[i]); + } + uart_printf ("\r\n"); + */ + + /* + for (int i = 0; i < 100; i ++) { + uart_printf ("%d ", ((char*)simple_fork_test)[i]); + } + uart_printf ("\r\n"); + */ + // simple_fork_test(); + + /* + void (*func)() = code; + func(); + */ + asm volatile( "mov x1, 0;" "msr spsr_el1, x1;" @@ -230,10 +321,13 @@ void from_el1_to_fork_test() { "mov x2, %[stack];" "msr elr_el1, x1;" "msr sp_el0, x2;" - "msr DAIFclr, 0xf;" // irq(1); + // "msr DAIFclr, 0xf;" // irq(1); "eret;" : - : [code] "r" (simple_fork_test), [stack] "r" (stack) - : "x1", "x30" + : [code] "r" (code), [stack] "r" (sp) + : "x1", "x2" ); + + uart_printf ("fuck you\r\n"); + asm volatile ( "eret;" ); } diff --git a/lab6/kernel/src/thread.c b/lab6/kernel/src/thread.c index a8ae0ee2b..abe08642e 100644 --- a/lab6/kernel/src/thread.c +++ b/lab6/kernel/src/thread.c @@ -4,6 +4,8 @@ #include "helper.h" #include "exception.h" #include "signal.h" +#include "mmu.h" +#include "utils.h" #define stack_size 4096 #define max_thread_num 500 @@ -24,7 +26,7 @@ void thread_init() { thread_fn = (void**)my_malloc(sizeof(void*) * max_thread_num); irq(0); - for (int i = 1; i < max_thread_num; i ++) { + for (int i = 0; i < max_thread_num; i ++) { threads[i] = NULL; } @@ -36,20 +38,26 @@ void thread_init() { x -> sp = x -> kstack_start + stack_size - 16; x -> fp = x -> sp; + x -> stack_start = my_malloc(stack_size * 4); + + long* PGD = my_malloc(4096); + for (int i = 0; i < 4096; i ++) { + ((char*)PGD)[i] = 0; + } + x -> PGD = va2pa(PGD); + for (int i = 0; i < 10; i ++) { x -> signal[i] = 0; x -> signal_handler[i] = NULL; } - x -> stack_start = my_malloc(stack_size); - asm volatile ("msr tpidr_el1, %0" : "=r" (x)); + write_sysreg(tpidr_el1, x); thread_start = x; thread_tail = thread_start; thread_start -> next = NULL; thread_start -> prev = NULL; - irq(1); } @@ -95,6 +103,7 @@ void schedule() { thread_start -> prev = NULL; // uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); switch_to(get_current(), thread_start); + switch_page(); // after successfully switched, ending of irq handler do irq(1) return; } @@ -138,7 +147,7 @@ void thread_func_handler() { int id = get_current() -> id; void* func = thread_fn[id]; */ - uart_printf ("Jumping to %x with sp %x\r\n", thread_fn[get_current() -> id], (char*)sp + 16 * 2); + uart_printf ("Jumping to %llx with sp %llx\r\n", thread_fn[get_current() -> id], (char*)sp + 16 * 2); asm volatile ( "add sp, sp, 16 * 2;" // "mov x0, sp;" @@ -159,14 +168,20 @@ void thread_func_handler() { int thread_create(void* func) { uart_printf ("creating thread\r\n"); + long ttbr1 = read_sysreg(ttbr1_el1); + uart_printf ("TTBR1: %llx\r\n", ttbr1); + uart_printf ("my_malloc: %llx, is at %llx\r\n", my_malloc, trans(my_malloc)); thread* x = my_malloc(sizeof(thread)); - x -> stack_start = my_malloc(stack_size); + x -> stack_start = my_malloc(stack_size * 4); x -> kstack_start = my_malloc(stack_size); x -> sp = x -> kstack_start + stack_size - 16; x -> fp = x -> sp; x -> lr = thread_func_handler; x -> state = 1; + x -> PGD = va2pa(my_malloc(4096)); + memset(pa2va(x -> PGD), 0, 4096); + for (int i = 0; i < 10; i ++) { x -> signal_handler[i] = NULL; x -> signal[i] = 0; @@ -184,7 +199,7 @@ int thread_create(void* func) { return -1; } } - + x -> next = NULL; x -> prev = thread_tail; thread_tail -> next = x; @@ -205,10 +220,12 @@ void foo(){ } void thread_test() { + irq(0); uart_printf ("started thread testing\r\n"); thread_create(idle); for (int i = 0; i < 3; i ++) { thread_create(foo); } - schedule(); + irq(1); + // schedule(); } From 7e54854f4d92266cabe6ce56613a7c6d5d66e2b1 Mon Sep 17 00:00:00 2001 From: hq8398Eric Date: Wed, 12 Jun 2024 17:00:09 +0800 Subject: [PATCH 3/6] lab6 almost --- lab6/kernel/build/alloc_c.o | Bin 14896 -> 15360 bytes lab6/kernel/build/boot_s.o | Bin 8624 -> 8552 bytes lab6/kernel/build/cpio_c.o | Bin 9520 -> 9728 bytes lab6/kernel/build/exception_c.o | Bin 5992 -> 6024 bytes lab6/kernel/build/fdt_c.o | Bin 6096 -> 6384 bytes lab6/kernel/build/kernel8.elf | Bin 114384 -> 115008 bytes lab6/kernel/build/kernel_start_c.o | Bin 2864 -> 2952 bytes lab6/kernel/build/mmu_c.o | Bin 3640 -> 3640 bytes lab6/kernel/build/system_call_c.o | Bin 10528 -> 10984 bytes lab6/kernel/build/thread_c.o | Bin 10104 -> 10264 bytes lab6/kernel/include/DEFINE.h | 4 ++-- lab6/kernel/include/fdt.h | 2 +- lab6/kernel/include/system_call.h | 2 ++ lab6/kernel/kernel8.img | Bin 38752 -> 39352 bytes lab6/kernel/src/alloc.c | 5 +++-- lab6/kernel/src/boot.S | 7 ++++--- lab6/kernel/src/cpio.c | 24 +++++++++++------------- lab6/kernel/src/exception.c | 13 +++++-------- lab6/kernel/src/fdt.c | 7 +++++-- lab6/kernel/src/kernel_start.c | 5 +++-- lab6/kernel/src/mmu.c | 2 +- lab6/kernel/src/system_call.c | 17 ++++++++++------- lab6/kernel/src/thread.c | 6 ++---- 23 files changed, 49 insertions(+), 45 deletions(-) diff --git a/lab6/kernel/build/alloc_c.o b/lab6/kernel/build/alloc_c.o index e4ea2b5292dd4837796866efca958d5211b64601..6e0f76c64c341bf4975a57404af7d04ec2adc76e 100644 GIT binary patch delta 2092 zcmZ{lUr19?9LLX{vo_gmbJM$EQhEr3MG^)EopaB*`0K*X!#($WzQ5o1ch0$I zXREVw>1@za)YdNkc8qw);2%Or{%Z|cp?#LnvBX){O8dPUY2{0eM`$F+VvRT!%f`QW zF5`KKIDHNb3pbq0ryI|wQt80|4`*HBhxfC^ZMD+yq56@fy65&`uvz{VKFN=*7ONGe z{8KRN_hzOgLK=ufyk}@6ZR>Q*+5^E$EJ5f3A-!OJdL=@+Vbp9W#3OO9Wwk~@Mp-jz|rajglx)-$29EeoKTyZ|+H z&WTA0%5-iARpKkU>Zs=y%&iT%xnLtCD|w`1=S9d-^&L`iZc)$O6)O8w7m#xbe$w16 zar(`x*oOA7tW=PSoev>FRloR!Fy|n0?uBwhmIn3bD6EBLX$&M)R_}{=8Draos_Asx~A-H+AF2UK_@t5gGKKN@dARgfxpg*5* z-k@JO9Z1MSd$$~4L}i+h`lgEACgQmKG0b<%s!Lpj#sPRM9KC`Y2f*My80u+*bdM_@ zL=o+19^)p*9idI2cy^x|{5Exzm6TA~X5%$yVWvlp=TR=MwT`k>G=~!6c+H#4P1&mA zR$=Ou!zyaf%L|x~!vx}L;a2aSq!|BSc?(aerHf*(B}hbN#rRj+HmPZtkA9F+kch?V z?uY|aYJ#V+sI&_2V*^qV?An06DC&KOgcg%l;E^_9`Pc|aUlZ(VL1_oN+0!NVRi`k1UeDn&+bTp>%Q4-2p+do=K-L(J! delta 1626 zcmZ{kO=uHA6vtQ!I$BQqb{ty8$?1eQ{i6A$ z>pV0$zL&@JM-7gO6W({-ywOT1+4k}b{;X3O@A4@09QPMbQRxqP)JP*)lrm{h@rlZB zZEbN)gm{iodwiIX)W~5PV4_f&`jV{{Iw_=?}1yOt^RhTvz z{UUPA9h;o1nrvo0?HQnh%*fl&f}rNQqShU4*y!)zc7)L__{7KGP>L`!slE{55JJ1Y zfb<~JQ*bcIrqYUvd+9{h}=3?<>s_D?F<6Z@Y2vu>u}s2RlzCF9E&$y_tT(J2 zMaU^CYVjfDMXgc5wWw-Y(6JR8x{EyV=cczy3(+fF?u~t;M*W{!bV$_5k$BBPV1ya< zKV{WI!!SMafd(NEA8y`1AuF>!xE7DmS$G~Fr&;(KA9rO{zt0dz4AYBnB{A-}x0STlNm++gVYGsGXm8B$$l`I4<`M=r2ghcabw2G30y3j4@h({ za#}Gm009ew%;Z2RanBZJ5Dx+Rz)Ti~2Wa8}P+c}G2(=*ALa6#3n>R{{Gcx*3ekiTa zm@-*VMqDxvs6_y1QHTJlma5H;GX9K{=gCG){vmt7vjJ+8G*G!Ll1i9OAaOY)aiE!C zAOsYbM-soWSyH~7k@3Uii3;YNC!i)NOuh)@eUN~t^O!8CXwGRN1L5^e4g~UEK+U$9 Id{JH=0F6;zwEzGB delta 481 zcmaFiw843T24lfS&Cl$r3atzg4hj-iK{Uf6iK`3@O_vxMS}r|mVTe#-U|Pk*!0_|X zWJeBjPN!y|N(T9Bj++}fgc%thZl21i!#G)%GkLQN_Z=2S!O4sQ^^6}UHv-9vU~(gv z^qkBn^q(;h%r*p*CnqzC{0FHKs%HeM0g@BJWFeRg1e1oF8^w(odH(w|Uwyzl{~7}j zY~CT!!KmoL2x7A^s4#B7iU$#Om0rDC5t_n~|88l9L)=oSB}Nm@_$FHgfVY z*+aHRfI$QT(m>6!5GI)HfVu%BE{7!U!UExd#N{Wil@sSxK$3m1`J!AoBjbdR%{dL^Av~MOo$~Skys2zI diff --git a/lab6/kernel/build/cpio_c.o b/lab6/kernel/build/cpio_c.o index c515842f419e1c815ff937053342cd04b0a91e31..8030943eac3b6e10d583700dcedd25467ef4f51a 100644 GIT binary patch delta 1576 zcmZ`%UuauZ82`@AW|KB?>6&^Ia@Tv3bS~P#Habj7b-8uIvI&7a@%xmk}>(76;drs)!0@$YjU@7>;32>bg7R6za{);khZx*-3ad5?P%M~Tc zm;Rd{0vwF3}8T1ts3ltPC+Dz0X|f7C{_Y^zvJ)vn2dEDC7#UD*(i)ZJY~Mr9F>{+ zGSm{XbQAhdYV(g}+gGO!{#D4dr6iFY#b z2K&%LQ9r*|)bIY@ujYhebCoM?xs->NQ<9pr%_yAt^e>tYe`!n4HM-@=?do7?+x$4} zop(#2ZJ9IGf*q>kP#snTmvg$X0xiBkyXgno8~KOGKSX|-&a~y;>$hBaNi=ceqJvsZ zal8;tMP$57-Vc5q&drHFQs^TuP(DEZ0rHiy^F3VrHN>txse$P~qM+M4x#Y(7n zu%95FRB<^)^9J&Grbka5R9U$nx{Ag(f?rUdV|c{W@j*`%cY30i%p^O9%+%RUFL_HQ z*(Pog@HS4Edg@L~3xV2>hZi3HKHeZ!0yA7^Nqj`Mfum%Pdy&&Jf~!1?<2;_4R1Yl} zHLe7waGn@tk3s7ujS6n?FFWt3{B9aXBb(!V=0~=GquE0HTWY$II9|%WpxtUm7JG&s zT%IO~yIt3r>0~h&FbR<+5_D%#YLI|Y^N>oQuJo-h3HTxg zGFBf_v|v0Dk*IsOE!5^IC4F!~$f_xXB515D_CejW1$|W8mjUB??(E$(4IP+!?>XOh zzVF;0XJGEYg*N4t`P240nw7;I}dtGd@s0sukG?Q z;pzY4T=U{--UqG&{Gq5>QDK&o4m(eEG@k~3m>I0Fkb^=9Aj)&j(L%n@c1?hDf}ory z@tjkzDK^30#Q=8koLvAPL^u@*4j7q2o^ok`FB{%fhD5G;C)Ejz<~3vdWwX9}eO4d~ zGf;>M>vimZsLlBqr>agJ{HtKrC9-@*_}dXqm0p$br=0L_U#$!+T!up8e-!y;svC$N zVdFNID_=L2E6?9_%Y8!cdY5Z;R@`HYU6Ptu>p>X%<}K|GvwjU<)%hmYIyPdZT%TIf z&-lIhd0H(AOqYkeLS8H6#d^Ulv#&f~-c!8*=%jP%2G=m?GCL^OL2*0KnNqxs;%yWs zXinJfx9zqoE|5+`Jc7;MD-i9p2ZUX-xGKElw1+hOF#&FUf>GTtsz7~3xbu^FSSW=Jg zli6mO6^A9he#|B{Hh^6;4&qc&iw{X=FELxHBySwX+k}p6P`@D=$Am)sghUfmYpknv z(A=uU&u*wKO2(vDTa;+6!uF-@x$z3k-m!ridDzsf}JGJ1SLHs9P16KuUbS%kSU_@xguHz2E13-{tqa%gNQk z`0^-Zien$3R6L4C+wDJgKWp0k>88bUcY(3(Y4pLK(r)8E4Bq(o=1gV9gnjMM=G4a1 zP1|5iCh9QNVXCE_wPun196V%$yWOs)lsUDJ0IL>!kKtB^9>c8A z#Ok>o|-9|Y#jveIGkPGWB^GJxJCeb`P>Bh*^-^8l)Wd{EB1L!yNo*kq$XJ zigmirhMU+?Yh-l426CU~n^$0f`lDfOvk{#dBitxFX$D8zc zHF3BU?pf`2N*0yt?lgBjj$m94UXooRrLj&=pXusv$c_y4bGV15F%K1dVsO*_i@cN_ zJ~|2UI?Gt1&KhnT`|uE-N2iqd0Dg+zgbjpPiqs-4W1jRK?vQ>(xR8PdTBKRbla_IZ N^b~=oz($LY`~#xD#wGv& delta 1189 zcmZ{jPiPZC6vk(=iDpTgZ2mc2QZ!MaDFo9(AqUYU5G7z0>qQS04Je3su;4*R4=s2I z*n{Eq&_i1c22906B|;;JBzox~pdt~4DoOFsg9i&eq+q}|yR$eHGBDqJ`+o0z8D=+y z_|B;(Q5r3dZqWH+C!o2=e%qDWPm{STl#n+GP-*kL2aBHn#a{kHrLNrg+RMLN>nWrd zX`gNp+#TL049MSeU&wZ-MF?3u7FJrl{CkMoMyu1dtWvEw?$e7Y^e1We*vg?*hwakO zA8vdc#(fPpUlUx??(m9zRk>hdgFobTT z*ZRa?4` z!e{vxYpoc3Mmj0cqZYzA3)IK-vP8oYt--jDdEW|ZoxcWNpC9h|2GVV5E+WnCiMn;? zn}T%@IBmj=>7)#AA%Q!6A}as zT#uE3ij^1DRU%155Z-lDSQ&VsFrlli8hFv5v~$jTwjDM$*n7_T|9{VOp69$DYe#3pPH}t@kvC+AvDV=kc zdGi@C4K4>vevF;aZhirJi`x(+z7sB+6x<9!i)uKVS$9ChqMo=y)-Hrm4AVpimGiNi z%&9&rF&VL)$#jtXS-yQkobc;3!pX_83^B=xI)g^ATFLZjny@_Q1d_p3bQ~@f-8S__ z@AO2X(Oa-ubOF1-W>v8ps;uY9{JOQw=hRZ6m%L678R=O$;h9yz#qgGq{{-?=9vQT$ znLHbLZbWc*^4z%K>Uqc68de22eI8jiX`>Yy?6j8-d$yORygZ|JNf<>;LS_^twcFW1vu5A!{unhr)+@kl>s=xMuz z8pd;CW89nMI=yT3B-8p-fjrY(&+TzW(;HB3lkW-yeBgS92dpR~K3*0bOtQA1?TUwO z0zx8jgCjCDC@a_xNkuJ9e}76y74&ByBYSUT zIN<(*n;_{9SxT&$dDR5RJSU~QGWlqFA?68~V|))cEO|ni)q6;KLQ;bfYP~H|pHZW| i0o)I-ysgrp8-96P@C?+btwg$}wwl}c8x?_@o{IlLG}+hy delta 1503 zcmZ`&OGs2v7(VCD!-}k@HV=KPa zoQo;BaK7n_f-!6>g#L9~6b5YFI1bac4+`FaEA~cQg!}eZya{>xH$O5FN)`*p5FN?l zJmek6Tag*!Sh9$s$b7rK^Sod~P1h9kxNsO15kfgS_B1WXoC2ToHe{V+b5#cRWhjl# z)wE1IXB?N{sH;7&U?Hh#&y2eZTsP)NTv3b-Fx{^;71>dM@$_?91~o(6LmX%5Dgf)Q z5blOFUH9*<2f*}@lS6bJL>OhU(bzsx2Hj7--v2M z)Y_@ifORj?4B;~?SmqmqfBSq_%6!v45-It9En`iI-6~_3B^HUD*sJQd#CprvgEhom z%4@)~pTJ;E0up|&db&)Tm$c`(cEi&8GD6F`4Z~S~4~qafKaT|8{RtcaEzll`iSuGQ zUF;My*FjYYz6n1ABr+*!>Lkqq*DNv(UgGnQd_E3$R1(RuBcPu~BePpL!dD1Qa`s^b zc9ydX71%}2E>&QEKs-o#3ldv;1uS(`+&gv-s;GsTBLZi2%6LC42gyWAVp$hs!t~NeU#ly(Vzho{SeHJ!|ZRi1ka- zyHH|}*bv12jyI)1a)K@Tp2P1k0#zfmrAKejD%j_smfcYL=)1JfOr*DY)~Y#&vQ=MM>>?oDoagbI0~zzQ%QxuV|3sY^ctNM QdSrCEV__>y8chAbe+whSjQ{`u diff --git a/lab6/kernel/build/kernel8.elf b/lab6/kernel/build/kernel8.elf index cc62d6b2b686a39a4b7af50b44840604d0472ccd..f0fbd84a37d167fa202fc3f4c9c9e716ad395cbc 100755 GIT binary patch delta 17613 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 X@V6<~bqHT-y$#lFN93NjDf|BbiG1z^ delta 16816 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 MJwcro!3rk-0KiXSfdBvi diff --git a/lab6/kernel/build/mmu_c.o b/lab6/kernel/build/mmu_c.o index 2e2a8e25f702ac0bf8fc337ea2ef6cbd24fcbcf5..2d0f0f99b30fb31547b5584fe66ee0ac8878c219 100644 GIT binary patch delta 14 VcmdlXvqNUXHzvl8&EJ_ExdAX41=0Wj delta 14 VcmdlXvqNUXHzvlm&EJ_ExdAW@1<(Kh diff --git a/lab6/kernel/build/system_call_c.o b/lab6/kernel/build/system_call_c.o index f3e3ca7295fd9021fcb810e016e20be0cb28e73e..45c8a83bf725b8ec018ac10772e6edd8dec62834 100644 GIT binary patch delta 2772 zcmZ{mUr1Y59LLYSN!n;)k~Ued`BQV(s!6R>Gde59%8hf7FxlGSz%gOk>WEubW3{7n zj@r>NVU{UBVP&o2SRbtTpkxo-Xu+~R^r2A8EOa0=x<2^egByD=qlKMw@9&Jm8D25x zp3m?1{hr_X<=&e+^X|rb<8gI1wpjB_Rh&?21I3x2wtb?UIcyZ|^+u5pGERt5ROo-< z%*fAV>x5zZs_|cZUd+Vi*Oz1}AlY&M}Wx-F1BuVF9I`>jH7b&j0jN+P~S7)sj)oo8+ ze*SCzdPz`$+ohS)Z)EziJ^Ii``e3I2JUu(zt9K9SRoUzXPCh>WX-*&NH(6OJEzLZV zXQ?XFdzMFP_5O2xdf%WWJs!tDD#(Xica{CMdT;jJhrQW^nNX__=IEpzP4lbnAtf+u zr_M>wh%)7y_O^g$vdk9F_jn>oS&A*0^wdx7ns%JbU-iDFD#Q8T_h^dRu;yc795$j9NbUsLV7;d}pQ!7is29mb?fn6wIq0(Ht3 zydS6w-Yl_#W>;)sO~bA$PhG`^H?v>=bfd z(=s}>A?G{c{3JXMYl$vNRX|mbq~bioR7wt#R68qaeY7HW%u8C%7nt_YlB6n_8ba<% zssao|{ID8!2bVFzzQGV?vtb34hz3t1?h`cv4eYiiybp1#svJ4*1LqMqwO>~G7Jr!CoD>)eGoHHFpOotmgINUKEmUeKs&m7V#J81t#&Uci za{@mMQ&A08E8K~3q`Zm^^q!QwIlsoLP-e^>%u3pF)!OR3q~(0U)IMZA=-$8_)}eZ# zL-qJTVf;0Lw<70t8n{*pIqw$dZLp?miFQeqLRE*P;=Gfof?XK>|CM-I*V0*xvS*ig zM~q5qb>UiL(psF4v$fJUgtf#gWkqruLAR%p8|SNL<=cYW>q7Tlz`(0o!ihgtyoa;s z=|;|b$hi;h9nca@l4=1}hNR-Wm8mYZ3#vMyk`6&7@=oOJInyBIcOhrp7WoC_>^nLp zIT(t!J>B`ELX?* zsV^2UHC$Fw*aj`J2K56ET#PjQXq(k{W_$A(4 NV#F+MH{7d^{tFt4UOWH* delta 2280 zcmZ{lQD{?F7=X{YNxFEw*Jhe{8k?HL+VwVzwpXNfFuU4yU`3p|31#FVg*_D3L4`63 zD>M#Y1`aa*!U{TRw>??C& z|NZ|t=icP(UR%9db&O`;{lW`_GcY5-nRhqx9f$8@H;wjZ@HTcy4&LV-e@4;|*WX9j zuZ*#(e5-Len~OYq|Kpa|Z>D)v0tRFIXS{^qc+{P)D&&T%-f zY)1@lwll+_(wX$`Bqj{r<-I&8xY3Bhe}_&Qttb?dCoj}usw87M|H{}GoUwz9v&YCw z$iGBh>^;?WL z;mQ$_-u0KtSho!JVxk%>a5KU#;p|kj56(&w&e?(M-LeAaq-2ho^bA&c1#8{HZDaHh zMi(&Zr^?S{5s$)~jF_}=^{TH;h8!o5Q?+{-JCB^I5x=Oaxh2h_US-W9{;jh3EZpxA z({q?JB4=_WG?RPC)eH+EUekJQVr)a}MZB(h!Ag&H?c-3Dojs~Y@wU_Y8|cK5)B1^9 zuy$1N44jkK5qQ}n+^Ib(l=i4l_AAW!ZdG&Ra_#E1thvNjlt9Q{{d*p}941Wvm91xvV{dF}3m&@Jmj>V%~zOymj_eXuVCXLW9<&btk^7 zy1TD6tBKY-%_83N=iF9vPDk;N;f!>`&vYE7j|ulUMrk)%SlK~NyFt7NPx9*N+LG>h z&FwORgdp$Sxeg?YcO<= z9)+whe~eu1C(htTui$Z5J1*R$I-TT8 zce{}5ZbrGTqgivFv#My7G>dpySy1h(FE#L>N#f%alcSPb$WLpW4$QAL zP6y_^#_7OZ*7$1hS6X0yYXLe!A8C96-h3p|xA1q=)}mvO?-#rbpY;E0%$s03!{+P5 z{`Rwm1s9xQW5a~4#9>%*9QxRB9J7uablU)PVA%M|hVg+>W62J32OOhf!#|R2_kvLv ZHR_!(E{8-4ekzRaTj&cqOvBGk_J1p800;m8 diff --git a/lab6/kernel/build/thread_c.o b/lab6/kernel/build/thread_c.o index a5f863504e66e65e08000b4ed63466348d9d2d7b..43e07ba6ad68a561e5ac31140a3f5aee80ae1f7c 100644 GIT binary patch delta 2868 zcmZ`*Pe@}&7=II^O>9hF{FBLZ)8r)@*MenDyP#X_s*7z+k)mwN3bmND5wvwtx2?5h zDF!@P@L>9R*oECC3sO9I(7FW+9uz#JAXG~W7Cb0;$YBo(LOpos%)A-;@gM{FX7c-e z-|w4m-pssr`QfAf#b$Dtd;RYE+!M0V?C2v7%>~nCZ#z;I@JrdWmn?MsrfJ$D`{gtZ zyzan8qw}gf_DRpXcRqgqQ}gcUqa&Gb#z!*ddk-e=oAHeK^#rq3mD)yqqEndk%66-+9}Nd(6FBBbta~<9+tyEdyCE zg=4QtUI6jka68K^yd7@&uCv&*Zm0WVe^7rF2Sxsmc_0i){9~{MeG)0v2ua4iM(9P!Tgac-q#kfU`d*L}l`UKK1kWqn*3uICt%aE(1#+Jj9t6|EoAmwdH*U{vz zWO?2oVhaebMfg6#4TK-T4pVz+%cV+Jlne{9|S^?cpf9Fq$u z8t>yLwrnYxEsy+pHia*XY^y?lP3Uil@ireD1*GPaO1#^HDaM|aU@rvgDYpW6-8fbU za*Y}{OR(*N9V)@51UplLeJI#`33geqyOOn^&sWZY6 z7o3DB(ZT;3KMw;TnrxAtdB*~$NNwKbkpkD><{)d!kPcI_!m}i{Z9a#Vi?%Cqb&?cb;8A1`4p`OukO)(l346d3 z_K+iivGW1=iL>s7aD&N6NHr5FPjO~y&usV|}wg}kR(;c{RaE#S{NC^f zIfTcJZSG^gl`s$gG`5i-_~V_-4#Yd%!Agsng2(YT@*^BD=2!4Hb&^dOXzFy#Ho#9! aw;g&F{MmGy-34)v8e?kQI8hnr8CK!XN2tmHi z@LTopd)=?w=|Hu9d*+LI(OeNI9cvzZ*YLjH{~P@Ei~_ zK*o4tR&dzrH|sP$KNeMvQ&2Ky>Yl#HffbHyr@|>=rgcgernKq4Y9=7pD#av(F)qP* zSc(-w@`UUXa;0J>pk{t#*Qj2nxIy?w!V3z4svHyt zgdP%lOx`#btb0M4ONGEjGzjBS{6@ewWi}9S2Cm-59d{1c4l$hX+4~xISJcv)w8q_e zyZA$R(`g7EO4#Jd~mrTp|)RL!GO4nLu`Rc8@_zKlpBmZ^s|498! z)rUf7Fsw%1qFq$81K}=dp0GNcJyk5EyZ)=Ik}g*7Sb1G7$f4`Q8tk}Yq5MCtv!q+D zp~JHQUAHvr{dx+Jjp3eUTFV(6#S2)CN&Awq?!Hv?mB!V(<9Jnh3IncVG81WV>{O2B zbSWk^?(TMbc$lZ}*7mhIg2_G=-6LLTZer-6Tvd3XhJ0Fw7DcEr- z{-$`NqB*3GBeiY`ovWG@tj6(dhzDUVZrG1?mYO|3-=8r&$<*_3jot^$oA2jCNLbRm ztifIp8`9UB8W(>v2E4JPJ%UFKG&UtDL>RQh{wOsr;)q2TPlGVZ;(Jf)VI|S1`A-qQt zJW%*kkcDUQ diff --git a/lab6/kernel/include/DEFINE.h b/lab6/kernel/include/DEFINE.h index 2624e30bd..43c55152d 100644 --- a/lab6/kernel/include/DEFINE.h +++ b/lab6/kernel/include/DEFINE.h @@ -37,8 +37,8 @@ #define Disable_IRQs_1 ((volatile unsigned int*)(MMIO_BASE + 0x0000B21C)) #define Disable_IRQs_2 ((volatile unsigned int*)(MMIO_BASE + 0x0000B220)) #define Disable_Basic_IRQs ((volatile unsigned int*)(MMIO_BASE + 0x0000B224)) -#define CORE0_INT_SRC (volatile unsigned int*)(0x40000060) -#define CORE0_TIMER_IRQ_CTRL (volatile unsigned int*)(0x40000040) +#define CORE0_INT_SRC (volatile unsigned int*)(0xffff000040000060) +#define CORE0_TIMER_IRQ_CTRL (volatile unsigned int*)(0xffff000040000040) #define GPFSEL1 (PBASE+0x00200004) #define GPSET0 (PBASE+0x0020001C) diff --git a/lab6/kernel/include/fdt.h b/lab6/kernel/include/fdt.h index b88b0cf54..b90850855 100644 --- a/lab6/kernel/include/fdt.h +++ b/lab6/kernel/include/fdt.h @@ -107,7 +107,7 @@ uint32_t print_dtb(int type, char *name, char *data, uint32_t size) ; uint32_t get_initramfs_addr(int type, char *name, char *data, uint32_t size); uint32_t fdt_traverse(fdt_callback cb); -int get_fdt_end(); +long get_fdt_end(); #endif /* _FDT_H */ diff --git a/lab6/kernel/include/system_call.h b/lab6/kernel/include/system_call.h index 687285a22..72722f7ab 100644 --- a/lab6/kernel/include/system_call.h +++ b/lab6/kernel/include/system_call.h @@ -24,4 +24,6 @@ void simple_fork_test(); void get_sp(); void output_sp(void*); +void im_fineee(); + #endif diff --git a/lab6/kernel/kernel8.img b/lab6/kernel/kernel8.img index 61360180f888009c21b1714dddc106f6830160d0..96e1c7b1b4f852275b28bfa25c0bf507d13bab92 100755 GIT binary patch delta 12028 zcmaJ{34D~*wZGqF5<(J^Ktd8G+m}fQgrp>p1VUIc#3-wRF=_ynK@(*Odk}o6Gb|Nk zsdGI+c$Hq ze7*7v2pbF6=+{H2`o_?QEYU?VZe`eI%yahC4NMWM4 zKq}yM3E>k!d4`O1>L_8N!m3o8Xt3Dc9FpVo8YBelubV6@fnxbwoM?++GYnYT3h2!t zgK4%SR_UfWj)DSjiQH}R2MT3huD4UHTkv&@rtQ|f?kbTF(LqO*8Yq$82u3m66}%~e z=^hF?3T%Nw%FT4}XME;}VG;WJGF_eC@3h@#qr?&2H_X){W5bz zPNZn5tF!6*qI5ZPOj@7_aT7spmgtNVBGr&CqMEGQdW4@zfuupB^Mtp)2!8fihW)14 z4AD8r64Uuz!N3em{)_wH!o;`t&2V)>hvAgJh~CPo=4mBmFB{}8&=)r}6)f6A*-nqS zj>5IK*DL&&@}NZb$!i$YVSimP1#5jZ@5*22*~ENTE2TIr&i!Q}Y7LWlQ9^4(a>2s#2auFh59 zgZ>MG&E`!vbvZ5T@YS-;+9q1uQ1(vVM&_R9)F-&fS(Kj6HuIsk*wvXD!Fj@2Wc%_8 z{oQ$8(gswDDrAIi5=%WJf0S~H?#nM#KBFh|Gt$(NvK-zC;q6Tgu@%w#`C}6NBc%#b z04`0V?1JI8KoLzT7&YkOE9MLWoCAnhF+HWGk-s3CIUX+&T+BYrVt0kvRoXDDgmoVq zrt2O_?+t6M1aq>*9HIL!NE6hnmB=TqR~HoUv3=n#mC^lZL}?A1xePAds|Yi%(|g0q zBBt;TRTk+}=(Lz4%=qY)qSP#C+Gg5wp{Suc1a({9Quzd3EXv9RgWr(;o+Eo>L>sji z4v7Yx>@;GS?$k!hPJ~l)Xy1rpPas`jFL>);!Dcy?EZSxTwcUX!BG@;@G}u)t7elAF zr|NXzDpZWCut+ta*O+usCT|BlknRe;g0u;Y7eQ?9-fyt5`o@DEWe4Q&-5~t+imG&K z2Sn!pBuLjYgT)zjt};1>y)%iofj9yGX^)CdPEiZr2;3Ja6PF+L8b;vA z+>oLx#px4Ia`ryTuDAvUAgxQXE5NZU#aFZjZMW#mjL>9?_>kUv zN^-~jjP>p|rwDn5a}&hMo!=T$<0xj3f~tzu8jGlpMPSOY!aOd;xD?||e34FP%Of;*mC1LY*@{QVqHB~qWo(5D%E>w- z1^uIBx54WPrtpe!aPb|2iE+&~Yje90qvdZ|n2i_1Xfb##XNF-s3}e%oz7s-nUH_g_ z{?YOo$a8uMSH@|}j>_;ut<8AtPDgQIHS7YL_Un>!)UGu zp3OyGLa`Coa=Ax0BvP-efANVcQNk!FMqwC=t+WO0RV^aYby%EZR_7V0Tr>vGhc#v(P8HD&&vg zR$q#~)qFx!$|4>onPXR_97-2U%RLK`;;`8x+Kqz^lfHORuTtLn1)zyoZ?6!CF9kI1 zQXn2)$Gd`)F?l||&4M11<%3Z{nnvnloKQI^HD@C6T(L1u)`g+W5~5>eX}0z{dbKQv zKjug)%XSz2yEjSj2J^AJxw8Jm;jXCpXRfS&$ykQK_|tlvQC=FRhe2QDgc$~MX? z&wsdFRW?&|`FO=c2g~!7?esg49;5#*FID!_;EG|&Z)svhMzlIs+U+#AA}9L=bToR6 z!-1Y#0BeeVZ25$Hto)L8Rpe%$07o<&#uCDZvGOw{B~L(w(_`pVh1c$`lE0%HD?QP@ zHqq9fWMvASuk3I4R>{2-tn`g`Rdb`)`Acpett|Cd$yG*n_Xv}&pnk&$kLiUm4o?_; zy@}>-w9|rFr8GKcp9oaRIZ)@|W#G7>Hs;|#jO2YF(!4rOUJHJ1V^GCLaB}^`(&Zi} zuK|r3#tyc7$H^L6I<~CdQ07y*#>oKY5T_WYya1ksr$IOXMP^Ct5u#deoplFv7@4VQ zy?HpZOdP#AcHCeu%ULDZEWJgPT~%gNt7%r%U?rQHt11%IYV0cEQ}A`s(sAkZVwGwO zen%fw#aXjz*0uiwpD7l5ry=gwwH~tp4xqT|u9#!fbssOsRxBhJ z-b38(VOstV57hgWU$5db%xmSNyIS54K1&BTqas>Bz8hNI$)L1mkdL zPC-f*>%1u=xF;D-(KQ7&_k@n(n%^nPG`i?2RwhvP-@%EJbRa(s6O>Y@5>?r|;}2gvp8U)na@Vwx|+&s$A*%ov>rG!B7I zJ=(rF`q_-aYuX)Ql;5Fi;pAF^#pi06U=$o283xS;3((k;hcPU5>aahKl4g#~@fl8p zSTHtObO+|moSq0&$N_I0b0{G;$7ThJ| zbPIMXa*743Hd$xEB1%rSV1JaHWWg@G91oZ#+>mi=?`3Q_{UpIXFJPBtAaGsU_>J*( z{|jH7=`emlxT587ONl#L4mEk#g4d#}z;Oq`J-~c=`i4R~u8-05{tZ7;eop-x=3*F# zrn?%lr%k`eQX6|Wvj^DfLTv8cz%be;hVN$>{hJV5d)G6pUnP9K>lnsaU2V#@cD&JW zms0uB1)yPgKFIF_&Q+sMUs?Zq^SFOjKkiQhuN^bGXyNkq4xmLhEsuT{*gw&SH)Sei z6uc=j`WG0#OhaxSUb43?IEhd2@%rK66NinL0={>P3-{^I6kL4R%S2jwbE(or`)(eY zd_kx&a%}@+JJ)G*#nPj5CwaOY z@)wpaNY4Tn>s9=*d?vID(1(7FK%pn`>$`_<`myqA@LkZfbe&i95AixoUN1U7rU|vb ztTrs`y0%ByssKLIGSUn|UerErZduUXpH|OvW(E4oeDM7#WGgOY>uY*?UWP{vBmRN< zYc)^DQQ}^-gj`{sPa=5!0iF(v#~tSR(B$!3X9eo}UBDf-c>Q5sPj7_6UtQ96AF!CZ z!c2cKdAiX4=#vY?$@v;l!C6<7i5YoPjCf-`%aV5y3VBmfyl!}1_`8aU( zmJ;^>`7?~Kvy=n|gp{l^T?|-BBNF8v@Ol%x^$x^+vL)k649P4pW%^=8!$6Lc;tms= zNVzS;;|(L`ncQwzh{fqU+|uX|^VFL>k%3<` zbW()TY;@-F7E>V1R7o%0mQg5@Lh~w#5W446ZFlfHW0i!OMBm&tw13`tc(KFPd5ntY zXZ7xMz)(%5H|JMgz0T<5dxSe#MneGe@CkHB ze!T?ZwD2cO4f8vQZU(d-AqL8C^!a-0r(sK>tk&%AYaso~JyAJIU%J;SRkUpK3jV1Q!#{2%ny?Jv`VB}sJhjvwpa#-^o? z7tI=YN4N$m5X*b5jy`U>y4e4@G2y;DjE4&a`{Gd(cNRD^;o$Nhn$_&I`3KSJ=2{Q# z?siU(YcD(3}5}Wg3`UAA1)GjQQ#wSKApO&Al08H zFMVZrCeZz`;H}huVWu+OB7X=nib<*^H-QPs?sWMk2x98i-hkr2R7G-OX60Cz%>+$&Q2mkOwFVR~&IJBsTt-)^~d3uHnvYr!~_1+F3T zFeLdF+#j?MUO41qU(r){r_t<1cKZO3a1l<8?m~&VLMsQE!G-9+;J}mYeYM? z9vbaNSmB#PuEqF0@P~@s;X3-~q8yK!DHlh${TBN5GuZT@#{quR!H(mE;^>OW7^79< zE`wX5vuJVnTB?V@pDAyKE~D$P9vNQH6O7wZKUT5yGla-|Z)2Hg;mVTJY31TFk2_0F zgmggJI4FQOHlx+SwGGeK;JjenD%cCYL|R@fLT%8W#Nd(cMIcKSvmT7s{{XE3w6l=! zv+9OBTjl~s>XIURAX}!;wM&Li>KegawSJ{qz^7W2xA(EXg|0n50XlX(UvqTW6?~OGaaEX;G#Ijv>Ewa*O)i zd2%kRRyNVC%WkmD`t88jh?-it>)jHkCNE`s~;#Wv-_tw)n1 zs3Ky!fzP!f2^q$REdEf`A+rrK3JgX%!VX}^aCL1L{v0{04eF;n2PmB}`M->h`-Cw)~Re`<`6iQKfRFiI`fvw^x+#YW!`F9*;Yt11S&BXZGY zMERRf=(g2qqjj%A<{%2MkmlUsqAC;NqP9tZh6OOiK4Y;QTi+*i|LWpsHBWwdnVwpm zIoq2j|AuS=Ymexv3-TL@sj5f882EP4l_$?J&rol#m%9wEqqxxB2Urg=s*$zJ*3ppG z2`;oUN{LbC_?1H0DiHCFy>~$1E9{n#P=&$61@$xFZD@HE@R!rB)&>sKUt690Nm`R* za}`tRnrgetDSu2$*OXNYjtr_O+eV(~Qw5I0!S!7Ezw?aVS>v>KIpqSnvL+w>RNmdG zgVlUl&oeX+zZY;VUGW``u5?;(cW$xI$dY#9&6g96VEIIuUAnL}HJr?Rw!#6Q@MY64 z@6J>1qc`p@h!zDh|1xdM$idF_)-Prq$==@QC~xhG>0PQcB8CO>8eZcdyr`FIFg=WR zCbWY<=Q^d&FwAR>>HW2LW}0Z8JgZT;;`7=A|L~}6x@Vn+qf`i5ch9=PLt9$bso(z@ z5ZCdyd)6zJt5@iR0ddTXe^xJCzNV!~y=%GJx?HD}sJE|aRTnK=-P*jM$>i;5UcX6+ zVTDlh$-UJvw_mkz5u{r0R89HYo7DxahDj5%c+Jukmd=nhF?kuJ7B(-lC?)FhRg2U` zs}0fW;pV>(=x}U$Ny#ozn_E`RZ*Cc7`nGxn24$vO^ugx6&UtlL*WNhgR`rHE7B)An zX=!d!uUWNxsX7#PFrg;awCcxm6o8%2`qq+3NRrGmFYj}w+}jPSwE#uz`XfUirJRqd2z3% zoy4pxW47ht;P@cq-mhtR=3u&C*_XOMrIrS@4K$Rt1K)K}(^?F9J@~dcW;h_i&b|$v z*q>?ILcq|W&$uxhF^|9>gT-txOf{6~3^p^StN{OyfmnA))9NA=%nB0r2?ans$q+;zl#i4gvo)@GcY2$#Y$V z>64&m;JM_eLDyYh6k+-t=!ZbBGU&-OO}*a&e-ijCW6E@5`@q61{CTMB2~FD^p=-XW zs{ptOpcfpWe{FY;XabmURMT*A3@saSWQCa`LIrv&c%DB>*X+pg90k||_U8@uvKDy3 zfjJ5MiYGPAXW-S_P5cMIe+qn?$$y85{{r}?r^3;=&cr9+#Zbn9N(c|A$@&dH{5nA+P6gWHL5^E`E)0|6dH7!Jz&cyWLQrXREo{MKW-Q zKtBn(9)65@lROVx>xB~9C7;NANY_Q%&!obC3AYPb+QTYvMtjpK>7 zb`Gb-Rxq3g1J8$@x!N@92mZpp;q^HK{{`??+H#G)IbxyS1-0s#O z)g7`obJK&2w#gp)y)4|Xl(aV#y zM>tG&G_L+rnx+DVN`0-biCC)wlYUDC{l*A-9q1oGzBPhA&!i*2b43#v%6f5p8SA8n zjt$=neCu0O-R8JyFTkF+G>!KI?*Z;>7(NbsH}J;|d`Pq#_=RtW@>9o0=I43PeQ(nd ztYHEoviUT<4iJC26~oV<$xC~9mpz70yT&sVx64t;M@|6mN#`Oww4r_jt!LT}0EgbC z>AM`BqW~M;3m*>bDNp7k@GZcrhNt=rtSB<>oJp@TOz2UrB^&p8p~fjT30H{!!g(FR zV>1tIUi{%nB1$BDK%eY##>@t`)=WuULJzvk`J!`M^?zPrl zd#$ziIrL1Y8hk=+%^0EG#un&W+F|iz_op3Z?3NydZRk0+fi3Vbb+5`;=tW*Va`NmX z)}|&-I9$W@KdFgnhih)dM3(h-HJ(+B@vc9+60`N_#B9c1b7!))ccWOFIXmibFe+(p z1AlO>vV*df>y=)*OIfM-KriMmFNk|$0BZ|IF2m7bW-9>Wv--4FtX^ZRo3T88G>)E6D^k50eUnzF>giNF zEN`Hm&J|#F##$LzYle;SNEWkLT3D5)vU&&hk71b}TZEW>ajRp+$m1L1SX%_FFjAXs z>{yl_2&U@+eH}|@>vTfkUW1d(J7}&uH&+|UuXc18!+CF(5nxSAepq3e?ErN%??}Fc z?r~4hjFG%90?6j*p$j5F=g|pwZf1mrUYLykkJ)}KitUvi8pEkHeYA?l;&iuotWD1o zj|VK~KP~1L>Elxj4N+ntb2baaF_vu2)~GzAMuc;1hC4;K5$CbM5C;L#qZyg1uF-25 z6+&^p;nxn)(&gs#If0@C#;Fc*-j z;CEEk?E>ALm8Z!C0$phY1QL!+43@J%ZzcA!Tn~ImZ)P4KE3YvP#QbR123I;1eH522 zfj5S-Mkpnlv@EAHUvQX&$W~9`eOvCaU#{v9rq{A3}1aa04l$lQW>H z!M3NPm!KR&(pJ|fekYZT&PWH~c5C*}95G^88y(LZ77h80E?PEHIkU;$8D zpnRtxDylgfHG}G!=-;Uan2QbeW0Jrytvav^Jhal~1O8*y3tmzg<_Q^|v-(?w?5Ey> zw5i5u?iSwJ!WsxQ{CnX(77!`w@F#(H3f^|!XIMty$do=slM7QP??LwZ?-Q=*gZ-E- zX9`!q6Rs4TG3#GwXMywxtsYyepLk*FU^!y~PMSWwfx@hbcL=@h_7X8)&{^?p)t#rU zrHLhpILgfrj^;;@#XBpb4*O~FS?NBZGs}){ueoVRuldnQWdaKYm0N}cLHoa@e+_}_`!N-%2Y+gV!F;cw?v zKXPX6|Lp0CTKx8zwfi4AgS&`W2(uc&2$aq$Tx4pnl|lHzniT#z(m9Ayk>jI`zj}r$ z^5=BNSDpWK}8f`482*D>++w)vnW*L$?IU+7(Nv1>P@ms z%R7b-7UMzo*gu9RP<3(X{5eQz*z9H-tOE>P>BM^3m5jRSkg-^!hp{~;g9G6406kQV z0v9J$IaU-oPaKd6QqtzpKZ{ew+bYFj=Rh&Fj}}wJKVec+?EBJ&T1qd;Ot+{0ia10a zHx7>rdq%#Jbl>wb@Y%u2!wmm=2MJ#-f7$7?-(tto4|fhi$Hj)7S^J{BS=Jmwzq^M8 zA3hm0&65fmS1^kOSiH67Gq4g&#~5oqj_6^>Kt~OM!>e?3Qr3TSkM;@XmSOTq0ZwIs zV5$IRN{|=#v**E&7uzrSS(4AN+Re0NY-<14<;BUUJ4EZpX1Ic5_&VA(HdXmM1;%36 zi}+GHF*eP`igEQyC{1%|#e5-+D$PL}He8|lu{9AzUt1@86qW@)8zEhUuY zC^u0_S(eg7bIXd9Mp|Dsa`@JG)|MkY!LgjBu~oaQn71;cn14&kI5&M%7CoE;CHk2} zMG&;=)gFia)7GGYp!4kZ>B58 zxB39ajs_mZqV3Ftg0XywmC@ZonUE{!(K2B$7P(d^+`+9QE0(QN5O+srW9K?!fpush zKe<((Q_bzV{!h!Q(ipQj*+63@*s-o zCuSYoVh4jLrs+_FYxHQ*C!}eAFHcc#5zNF_S7RQGX+@O+)sgzhT zIC5G+g-7iwrr8xWiNRud;|-!I2ho%}>A8vw-CxSrsdmW&kc9dZLZ&hPAkJK|7O%>h zgJ`C5J&~AV#<$V1%5>#?8dsU?K|&zPvV7NDFCwi>E93JW^>AZtWrgZ5>-x`O3NOwF98!W- z*2%M?oB8GQwIpQCe2GmOEv^Rj^mJ9O>L1tnUe(_eMWbES1xgaVUY(=F(~0Vw*r z+YB~ji#M5yYZBET66j>LNBt(D^U9hviW(f(`BCjIm$H=BPdjH~J#rprLY*-LtwEGL zDttmcUY^*38ab)90ujO_9YFg)n&#z8Z{cQ7|4{jQu+gxsIx1FZ-i*B8%^4hK>4T+~D%?|+W79=z6x~g34sfFER9Jw<=!0NvL!<)(W}Z6`tUd=cg)W=9Fw-{LHw)tk#hvfXJYU7zL&=ZTvQkPAcbycc9o)*`QQg+g&x=(!m@%+NmW;+uno?gx`aOhw;pXboV1U|>1 z^@)6@L$eBgu0#7P_&E;kt>jZ3TA#$L9XdFPPjP5tGOq+pb5yY{FTukA2-`i z)1C9vl^OKN{PgHU7=J~t&d*P3tPKqnCvm0h<~W{eL!{r394*|cpy3OOl=o@of-#BR z%v;5WI#CE>xeLamSk0grc{mY0c{Boaoav1Ixxk}(8GXB8ifS+_y)b*gIJ})mDN|_i zg=18J{&=CMpO^7h5PZ@Xrcw8W(W<6&9=Wha8RS*?wcu;wdrhn55KX!$K{XUQ@1iL_ z?_mCrqYx@)11gj&K?U6&?{$!m`~l&?&A~6r25vExpAFn`(@d3EUG2kW*jNKMF(G4K zl~-8irLN`(TV>#RiS+jlx3 z=IZnGH5=1~!&fd&bMem+3C)ghg%y=NEdUTFhZ(8aqjUhYirM)!H!PG4PI<};%CV*rTjOJ6=}G5lfh z>KrBh82$jpvm7N_zdj{5*)9g1q|y8Ft-u=bMx7gRuXg4b;W^jXb9!T0{a_I%#UB=4 zNl#sp=IaVGF1FELSct{3o9}20hB5UvCNl8X!3)GprsGSQI@OnUG$vpw`5t8kb%mL6R^qW{b<;YEx1%=OOV z47DqkzF(}ljx()4rF+LIXVF~mXbipm$>$w+_H2B{kS_cC^Jut?10Ax-+%NkbmJ;mG zO)P5{ZYvU}$MK)!GVxx7N$AR!e`p;_QNh|7)$W_cH5Sfr3)_hs`?%o}FVj+y;<&g+~nzpqwjfG)SyB)mQA! z{DSPv_uDhyqtCC*QO>4>tMtUvRjaPSw~$^RzBA$#UZ;z%($&*dwDYQLPTY1P%a$@)M(K()$V?i3b-GgF zi2wa>vmMPf8P{4|-&v?o2z+c1{|o{)ZDUVR@t>Uc-OqK%g(b38*Wf$MNVp>wl!E86 za1A3p2Js_8hsb(wB0nVP?kznm$$zp6`hG-0pIK|YVw&)4D0B=Kseso>5!Zldu;L{G zj<+4dIK1XWegMj1Fd>9@mOj3JFn^Y2E=yO>M9~}7DP$~jDPPfT%g#~$MXxVIp$y?| znCHSg%c&u}72{XKIz-;lfaRHsx`yyuBmDgum*%&nzgAYr>3R~s2^i}k_XF67NsuHFV*MLYFp_kEcy5@~3#S#hp{Wge(!^j52z9 zzv_EoXl0P2e#8rdq;0G-rf*i z9jRSZuQQIYOj*~asNQTUzqX{dDbm3%%RzQ(eb04~{GiQ;X%(hL?hnA;O4VK2^uVNo@<%&+#E0fg9ujqo670PbnD;J$-WOH#t>~jg@K3Dw_K>}X} zX_~Fq8P5=7qwXGT2^BY_rEUQs7^3R(A{<-XkloL5XmLZzKztKA3x0-KLkEnA7{As~ zqFg~|8r=O*M?-nSca*s*#l0E_$M-)^$qwcp%9ZbE)~YO@?Gu}3ZG2aZeIKy-3iwR+ zSto{~=UVH+*TlegpCWPb^r>vQ7R~BUi19|NCjH{Oj!fBX`EvZfka^E#q0jI{E$$Vv zCCqOr(-4$n5M&`(&Lk1MJ_mpk0e75{fyJD|m?P>Sk}s48qtw0oAuFWS*A=BlBf_}H z1%T>c!J+&q)TwQSUbxOZODYeqR4A{)9|d<={kVhaDSRiU%(6NHiqLXenPJa~bPgGX z&7#TIC#oQ4U+)%=<=5wlhY&pSGrOu_2K)`-8ciSy5kZxQl5#D`l^Y2!bop2h-SS1QlM zZ1LGwycLLpO1!ApeWHVDX*|V>RyS*_4b4CS*_OK%jAcZbN?`r-pwU+x66>DC)6T){N{1Rc1cxI%6n)+{i{ zCp#--l;ynN&POU(<8gV1@y#@MP0px0|7C?+{ACypi`S(N)-{Za*E#1n`xjo{ZldjL z$_oNkND*E)zY+*}XELg|j*ng9kP`l?oZEmufXncrHZ?0ja3-FRO&p*jxSEI%%B4Zx7m6^}TDIn)q8qPt+iY23P^0y| zB6#S@8;2{E^!kk^b>Gy~>0R5TbSD1ZP&&8XJRzoY!fk(1q7&j^hT`wo*4ceWz2Yw1 zY?}Dy$XNBj#OVXAMHOSHZ>A}mQq(z{>4Hs}sK7k= z@D{A&OBZ7eDr5e;>1NC*+e$m|*mDm(kH_wN>BDA^yYW8L6zdTSUt+r)4}G8ANA4Dn zTDFa*v}CH=w$mke9NIxQx1@~E2fP)SCckMmShoGj_T(K&)d|C^X-L~(^(Z_z6pzi7 zJ_!HzKS0m7r1*qO?_(JIplL1z4YS4DV|GL@`0xYav4o$7d=BI~LgUEQSr$Od&%lMJ z;UUv36BDWjYTI2qqRxw$KMC>;katALms#>0nXQY&jp9#`^@_{fA87K9EgMnC3GUym$q?5Z)aGKkZ4=Y_<5>r8fT)@LR!ev+5bq|ddf6EvH1G-*d6_9C}y>@UcnX%+6LSYz}a!pmScVfi)Cyd1Z{t!zy8r3 za|mSjpXgnXr$82Wq8QyV$>?mCcapo+9a9FfrIRW^)(h@FS_rZcWa~bup$+80eRMCl z`#|o0n*Iv%5XiCsz1!;cof6!?{&(@m!;^0Co2+HXOkNa`$%T;TKl|JA8IT*0>(+dk z$dTE&0&@Sei1%*+S^(&Rf|o4?GF?~N4kUv28044ZV~~tL#-aqez}o|!ojlU%74{qr z@*w2;bA8DIIi2J~e6IfJgJ6s86I*e?*~84=1;ZxWj0^*PvCX6W}r;t8Q|}G z-ZZybeDC)79Rq48PQ5g;=>e19Wttl-onl$O=*6~=A}?A2XaPX1M>un~ZFCR#t-s*Q zHG|&<{^enX(M~A}c@XlWzaiJe9Q+SLEaL#hP-bQ>PM+ceeaWDS<3{M11pd?mXz^~} zB9JQpDHBuSo@h{!9c~@u2IN~K1p`G4e(+44!&eChg3d%m!G5b|XFiFJXUHlj1&SW@SG z_<=Z&=!>@gF{gl;`Ud^jhBA*w;NKwkT_|&q)83#8koeONoAU-Oyvyxt1X+)7sJ~3l zmS5ou`@0=JHXK`LDBBZv4631lZ3$7Tg7_Y?cl#i4Q+s|p4qsYwpHpVC#W`gr!XJ3cQo2g5D2)Ecp8@e&5tX;O_=sv-tnD`KP3ue!LqSgE(z{o80Z# z7?6{WPz6ZQ|5qHLh3)RVMv$kDnC7Vn_tdr40)(4wkiYT{-P`W=?E~5LZuoR@&ijMl zw}Ss`?g-wOw%l$(GK4jxs(M7LNgTx3y7zG4TW&~Hwxjo<2tSpaOy z2Xx6+cT5w=Pd=iXL2d<^AH-!ZGiE=?6+w}LdGCX445Eca code = 0; cur -> stack_start = 0xffffffffb000L; - void* sp = 0xfffffffff000L - 16; - void* el1_sp = cur -> sp; long ttbr1 = read_sysreg(ttbr1_el1); long ttbr0 = read_sysreg(ttbr0_el1); @@ -175,20 +173,20 @@ void cpio_load(char* str) { ttbr0 = read_sysreg(ttbr0_el1); uart_printf ("TTBR0: %llx, TTBR1: %llx, &TTBR0: %llx\r\n", ttbr0, ttbr1, &ttbr0); - asm volatile( - "mov x1, 0;" - "msr spsr_el1, x1;" - "mov x1, %[code];" - "mov x2, %[sp];" - "msr elr_el1, x1;" - "msr sp_el0, x2;" - "msr DAIFclr, 0xf;" - "mov sp, %[sp_el1];" + write_sysreg(spsr_el1, 0); + write_sysreg(elr_el1, cur -> code); + write_sysreg(sp_el0, 0xfffffffff000L); + uart_printf ("sp %llx\r\n",cur -> sp); + asm volatile ( + "mov sp, %0;" + // "msr DAIFclr, 0xf;" "eret;" : - : [code] "r" (cur -> code), [sp] "r" (sp), [sp_el1] "r" (el1_sp) - : "x1", "x2", "sp" + : "r" (cur -> sp) ); + long tt = read_sysreg(elr_el1); + uart_printf ("should go to %llx, but instead %llx\r\n", 0, tt); + while (1); } char* get_cpio_end() { diff --git a/lab6/kernel/src/exception.c b/lab6/kernel/src/exception.c index bda87d382..c012a3865 100644 --- a/lab6/kernel/src/exception.c +++ b/lab6/kernel/src/exception.c @@ -78,15 +78,12 @@ void core_timer_entry() { void simple_core_timer_entry() { // irq closed before getting in - unsigned long long cur_cnt, cnt_freq; + long cur_cnt = read_sysreg(cntpct_el0); + long cnt_freq = read_sysreg(cntfrq_el0); - asm volatile( - "mrs %[var1], cntpct_el0;" - "mrs %[var2], cntfrq_el0;" - :[var1] "=r" (cur_cnt), [var2] "=r" (cnt_freq) - ); - // uart_printf ("now is %d\r\n", cur_cnt / cnt_freq); - asm volatile("msr cntp_tval_el0, %0"::"r"(cnt_freq >> 5)); + write_sysreg(cntp_tval_el0, cnt_freq >> 5); + + // asm volatile("msr cntp_tval_el0, %0"::"r"(cnt_freq >> 5)); // unsigned int* address = (unsigned int*) CORE0_TIMER_IRQ_CTRL; // *address = 2; diff --git a/lab6/kernel/src/fdt.c b/lab6/kernel/src/fdt.c index d8fe9d3a4..7c03396db 100644 --- a/lab6/kernel/src/fdt.c +++ b/lab6/kernel/src/fdt.c @@ -5,7 +5,7 @@ char* _cpio_file; char* _fdt_end; -char* fdt_addr; +extern char* fdt_addr; void _print_tab(int level) { @@ -62,6 +62,7 @@ uint32_t get_initramfs_addr(int type, char* name, char* data, uint32_t size) { if (type == FDT_PROP && same(name, "linux,initrd-start")) { _cpio_file=(char *)(uintptr_t)fdt32_ld((void*)data); + _cpio_file += 0xffff000000000000; } return 0; } @@ -108,6 +109,8 @@ uint32_t fdt_traverse(fdt_callback cb) { struct fdt_header *hdr = (struct fdt_header *)fdt_addr; + uart_printf ("%llx\r\n", fdt_addr); + if (fdt_magic(hdr) != FDT_MAGIC) { uart_printf("[x] Not valid fdt_header\r\n"); } @@ -120,7 +123,7 @@ uint32_t fdt_traverse(fdt_callback cb) return r; } -int get_fdt_end() { +long get_fdt_end() { if (_fdt_end == 0) { uart_printf ("You haven't get fdt_end\r\n"); } diff --git a/lab6/kernel/src/kernel_start.c b/lab6/kernel/src/kernel_start.c index 7cc63a402..f647e1d76 100644 --- a/lab6/kernel/src/kernel_start.c +++ b/lab6/kernel/src/kernel_start.c @@ -7,14 +7,15 @@ #include "mmu.h" extern void core_timer_enable(); -extern char* fdt_addr; extern char _code_start[]; extern char _code_end[]; extern thread* get_current(); +char* fdt_addr; + void kernel_begin(char* fdt) { - fdt_addr = fdt; + fdt_addr = pa2va(fdt); uart_init(); long t = 0xffff000000000000; uart_printf ("%llx translated to %llx\r\n", t, trans(t)); diff --git a/lab6/kernel/src/mmu.c b/lab6/kernel/src/mmu.c index 705834554..0205e7d15 100644 --- a/lab6/kernel/src/mmu.c +++ b/lab6/kernel/src/mmu.c @@ -6,7 +6,7 @@ #include "mmu_regs.h" #define PERIPHERAL_START 0x3c000000L -#define PERIPHERAL_END 0x3f000000L +#define PERIPHERAL_END 0x40000000L #define DEVICE_BASE 0x3F000000L diff --git a/lab6/kernel/src/system_call.c b/lab6/kernel/src/system_call.c index 9cb78859b..d616c16a3 100644 --- a/lab6/kernel/src/system_call.c +++ b/lab6/kernel/src/system_call.c @@ -86,11 +86,11 @@ int do_fork(trapframe_t* tf) { setup_peripheral_identity(pa2va(child -> PGD)); // uart_printf ("finish mapping peripheral\r\n"); for (int i = 0; i < t / 4096; i ++) { - map_page(pa2va(child -> PGD), i * 4096, va2pa(child -> code) + i * 4096, 0); + map_page(pa2va(child -> PGD), i * 4096, va2pa(child -> code) + i * 4096, (1 << 6)); } // uart_printf ("finish mapping code\r\n"); for (int i = 0; i < 4; i ++) { - map_page(pa2va(child -> PGD), 0xffffffffb000L + i * 4096, va2pa(child -> stack_start) + i * 4096, 0); + map_page(pa2va(child -> PGD), 0xffffffffb000L + i * 4096, va2pa(child -> stack_start) + i * 4096, (1 << 6)); } // uart_printf ("finish mapping stack\r\n"); @@ -120,8 +120,8 @@ int do_fork(trapframe_t* tf) { //elr_el1 should be the same - // uart_printf ("Child tf should be at %x should jump to %x\r\n", child -> sp, thread_fn[id], child_tf -> elr_el1); - // uart_printf ("And then to %x, ori is %x :(:(:(:(:\r\n", child_tf -> elr_el1, tf -> elr_el1); + uart_printf ("Child tf should be at %llx should jump to %llx\r\n", child -> sp, thread_fn[id], child_tf -> elr_el1); + uart_printf ("And then to %llx, ori is %llx :(:(:(:(:\r\n", child_tf -> elr_el1, tf -> elr_el1); // uart_printf ("diff1 %x, diff2 %x\r\n", (void*)tf - (cur -> kstack_start), (void*)child_tf - (child -> kstack_start)); @@ -134,11 +134,11 @@ void do_exit() { int do_mbox_call(unsigned char ch, unsigned int *mbox) { int* t = my_malloc(4096); - for (int i = 0; i < 4096; i ++) { + for (int i = 0; i < 144; i ++) { ((char*)t)[i] = ((char*)mbox)[i]; } int res = mailbox_call(t, ch); - for (int i = 0; i < 4096; i ++) { + for (int i = 0; i < 144; i ++) { ((char*)mbox)[i] = ((char*)t)[i]; } return res; @@ -274,7 +274,10 @@ void fork_test_idle() { extern char _code_start[]; void im_fineee() { - uart_printf ("im fine\r\n"); + long elr_el1 = read_sysreg(elr_el1); + long sp_el0 = read_sysreg(sp_el0); + + uart_printf ("im fine, elr_el1 %llx, sp_el0 %llx\r\n", elr_el1, sp_el0); } void from_el1_to_fork_test() { diff --git a/lab6/kernel/src/thread.c b/lab6/kernel/src/thread.c index abe08642e..5259edba2 100644 --- a/lab6/kernel/src/thread.c +++ b/lab6/kernel/src/thread.c @@ -25,7 +25,6 @@ void thread_init() { threads = (thread**)my_malloc(sizeof(thread) * max_thread_num); thread_fn = (void**)my_malloc(sizeof(void*) * max_thread_num); - irq(0); for (int i = 0; i < max_thread_num; i ++) { threads[i] = NULL; } @@ -57,8 +56,6 @@ void thread_init() { thread_tail = thread_start; thread_start -> next = NULL; thread_start -> prev = NULL; - - irq(1); } void kill_zombies() { @@ -87,6 +84,7 @@ void im_fine() { } void schedule() { + // uart_printf ("thread_start: %llx\r\n", &thread_start); if (thread_start -> next == NULL) { // uart_printf ("No next thread job\r\n"); return; @@ -101,7 +99,7 @@ void schedule() { thread_tail = thread_tail -> next; } thread_start -> prev = NULL; - // uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); + uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); switch_to(get_current(), thread_start); switch_page(); // after successfully switched, ending of irq handler do irq(1) From b31f040fff856f6c1f1c6d9724f2750fa1bf3728 Mon Sep 17 00:00:00 2001 From: hq8398Eric Date: Wed, 12 Jun 2024 20:22:59 +0800 Subject: [PATCH 4/6] basic part --- lab6/kernel/build/boot_s.o | Bin 8552 -> 8576 bytes lab6/kernel/build/cpio_c.o | Bin 9728 -> 9728 bytes lab6/kernel/build/kernel8.elf | Bin 115008 -> 115272 bytes lab6/kernel/build/mmu_c.d | 2 +- lab6/kernel/build/mmu_c.o | Bin 3640 -> 3792 bytes lab6/kernel/build/system_call_c.o | Bin 10984 -> 11648 bytes lab6/kernel/build/thread_c.o | Bin 10264 -> 10000 bytes lab6/kernel/kernel8.img | Bin 39352 -> 39584 bytes lab6/kernel/src/boot.S | 12 +++++++++++- lab6/kernel/src/cpio.c | 4 ++-- lab6/kernel/src/exception.c | 1 + lab6/kernel/src/mmu.c | 13 ++++++------- lab6/kernel/src/system_call.c | 15 +++++++++++++-- lab6/kernel/src/thread.c | 6 ++++-- 14 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lab6/kernel/build/boot_s.o b/lab6/kernel/build/boot_s.o index 488b2f424814fd2a1122ce2199948533cabe9afd..eb4bc3b61b96c881b3239dd0fa2ea74404fe0c4f 100644 GIT binary patch delta 174 zcmaFi)ZjcpgVAB5=4W=b1+5Gb4hj-iK{Uf6iK`3@O_vxMS}r94`AQ5-tC$!Vemb>I zcH%JOJk$(S${>I3;O0gSVMeCJ>dn(QckziUnK=BMZ_Rv_322IZGsjgB`@TK%W`BuD zCdLb!S4yQbGUiMclo4kv*{mtEoQd(n=8JOWj7%JYlf4wo7#~b-RIq2_keqx-!HzLt TGNYnBCxbi#7}!kil$Qqp+nP1y delta 168 zcmZp0e&IAhgHdCn=4W=b2Q3T{4hj-iK{Uf6iK`3@O_vxMS}rXD@|75vRxvR!{A_BO z?8ITl$G@adRVwFeB5#s?F0lckyk`kcePn+_CwfR63(%hyVi$sA6Pb5MW?o zh}rBYvz&?X#^#rD<%~=p1STgbm@%H1JX67*>4U`NTMBlJ7Lz3v?Kxk_LA2XUUMMdQ E0PV*ws{jB1 diff --git a/lab6/kernel/build/cpio_c.o b/lab6/kernel/build/cpio_c.o index 8030943eac3b6e10d583700dcedd25467ef4f51a..8c3105d2bada620da0bc3dd6140b84c57573f431 100644 GIT binary patch delta 39 scmZqhY4F+Lz$V4OxZn~41H+Vu%nYj@xI6r0>|yu`rWrR!u`QDa0250NUH||9 delta 39 tcmZqhY4F+Lz$Vqeu;3B{1H+Vu%nYj@xI6r0>|yu`q8k}DN3kuF2LL7~4_p8M diff --git a/lab6/kernel/build/kernel8.elf b/lab6/kernel/build/kernel8.elf index f0fbd84a37d167fa202fc3f4c9c9e716ad395cbc..94b26740c663242d6ae01aad3672c4cb379f2d8b 100755 GIT binary patch delta 15540 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 delta 15382 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 delta 566 zcmZ8fJxIeq6n>XnYLX`LC)FTURB)(Lj7qTup^ck^o3lt!Q9%cHhky=>OUvt8br3Aw zq>J5j6CAV!M%Ki z#Iv0$%thwOwu9iF)`tNOTCqWfiLzUN5~2Jk(z4g?Gy$OSr=!s6u`JJatB|ab4Q!NCikoQ8*-X z5BCP2${wGwt)dd9NqHh9-1_d@*_3>q_wb|qfiEJrx8jvX* zl0SOCgy7ak01WQ(%P~$U7CFH@+e?^LtO?3}CR0jGA#=6N@$ME}!-it%3C{ZY7A~ku zB#xJ=)jP{4E%6kI@%|{w*kJ4xXP;ZxI1Ytx2-AdcU-1Dw>RgcFJ+)WaSq_J6$4 zVoHg(AH;^1WDhW+XM}gI)Y&(nSk}|Rt%5JCd`dWKq)7_bjf|30gWg%((guD3qU(Dx diff --git a/lab6/kernel/build/system_call_c.o b/lab6/kernel/build/system_call_c.o index 45c8a83bf725b8ec018ac10772e6edd8dec62834..12dd77fbcb98c358e8d1ffb57d583569a2c88132 100644 GIT binary patch delta 3178 zcmZ`*UuaWT96l$RGfCSdwXG+&NzJWI+NA4d?&xgMZl=p`58Qk1 z`M&S>o!|L$&%JA3dgkn@m?kO(yB?%D$0{jAP50BcR~O-6Ra4`MBYo!A7rrsi44=dFJC-ha~IGYt4sE<)f3|8Mm(?{IOiKTmH2Zw3y7f4auq zQpyEV^k9S&AubaoMER}Pf8vJkrq|W?@`ax_O@4JFKf#|lpT6O_x%1S^7cib=FxTcQ zJqvnVbf&bri%~iVmAZX&6q5D(jLvsOfa4+RPr3gtLP2+` z-w|GP9eTs8W)n5`*x=`I*qFrV*be7GW-;;zwaN%xD&9gc&*1 zh&5=zI8hbA;%r%A;|kjcnFvb`;~tm&uA?G{xXf}LXj2_*MXIg57QtT^yG&>i5}$;P z2s>6lR^(WtWU-{V$sN3`xk-FQxLIW_O7`_yi<0=7h~g_V-^7ef)QFX7R5Iy+)h1?j z?sOnIA4hR?-H6Nika!Qw?qT#e^z!?#?J%i1457o6<{cxXF3-^QW5jl*l( zVUx#(Qg|rI^b6Q|2yvOd#3OLhWHbTAC^Py{BbMlWWnzxQLX^<~Xf~NKsQE0R|B&sI zg?X+S)--FV;V&rfYee)#3oy=~ZwqH@4)ro;4<0!8H6MvTuzeocu}fO4{17Z_u@YYq zv6;V+)ko^_I>Q!tN|}KZ3jU#jXAzf~4`JrRP~0mHq$kbHx}s@@Q8R+LToH+niYS@~ zYcDe7x=R7*!gALyMobB@v7WOi0Q&Y+V|BaS|#J5E3SO~vbVm3Zf zMjcUbrr@T6tFL$m;&PUjFwYd?at0*c>EQ5VORX`a#mbLS7B0oa3pd`vtPw?HDfx^l z{wkh_+88q?kQK+kekE!Kdb#r*pmAp0Qyj#pv5uL~iGJw=nB~evTe-B2a#<*iXUNJK z2;ztDIb`CDmW5`_gMR~3lR`~3;&PTG9zQZQv+{3lS!1_ggR?<=QMNR85t`drqx`+=!R;Y4idDgZw#R%g zc@tf}gkfh(*8K2UVn1Dj@x&p1Uq~GCuHk@Bfj8OZIud}x$xmFD1F#U>4cC(i??}K2 q9e`hxUEW~AX)S@bz012&>$EPyG2Tk!`}hZ3{&hs(gVMD!m`Cx)>A delta 2568 zcmZ`*L1-IC6x~@Xt)$qplvo?X1f(1F~kb{kS$RP(Ca>yYRIrw0T+r*^@A5^fR2OkXWpWQ$0FyKAx zXx{tp{Xc(qM^n3V^wnzGY+T#QWLR^7{pE$b{(mlgxloy3xI2@axtILr-u!o6exupf z>F@nfvs8aE9IE->OA?|irJT<&7V~l8JuQM}@X~M%AJ_Gd_XR}a< z@takO5jBTNCx)8lnI~>p^OX3C@U&XQ>TBGC-59rx3$BT*bCx_kgv&Z5?uAO6!%-|~ zZBXQZ7P$eTc)}_YD%Q|Nkz$yDwK%t`3L90}ZPeLVnyP5rfDU<>15p2RPP*(VZ78-5`QIBR*P8i zocc&1hCL`GIO~Mn1h;$McL~{nG}Y5fxa@$$V^B|Um`Zd)F4@USj>oL#ktdHi%|qf< z;lXNPCpmlMIJ`K=Vf!41myQFzZ@7ZLHEor$pK4l(pE+7D9HuxMfE3<`A@l*a$7u(W zooJ9xj&RutiRa-2>o3CX6t_xR%q!API5ATqmsO=0@eXE{r?D)uTdP|3BXU@WEv)dN zfR^EL7Gsv7#FprIK0LLC-m2#eS&1xhq<(Y0C8g?0(Kx9p^`i^RVK)2Pc?! zpIEt;8aW&YZRJ$aeynKE6kOeVynZ)GcC0~eorKFQ5)VRXklQ&;wMnYHrjmHkQB5kU z5v8^%MWy0ps1IVFi4~o^p{VY|F0#vtr`Rl7RLKey2042m^0IZXuX1bSoXDq6WJ5$+ zKWj0^`##X|Jou3g6Zd0j`nls6oQpq!1{$<84lC@zmvu! zqT-V5bqEdpf6`djSPvACl_!nY8hZfWBYR9=$eG6C(PN04Z6CZD`h^)#&y4v`xtsi9 z7yOaAVdgKwZYY8Wq_q55&8B_%i*8U9>e(^#P5^$*ero;{a6^aFzLkK>k3(g6%(pt| h&NiWrv+bZe!~Fwiy%Bfz7E&LM`SRD?Sp`zr#J{;lC}scv diff --git a/lab6/kernel/build/thread_c.o b/lab6/kernel/build/thread_c.o index 43e07ba6ad68a561e5ac31140a3f5aee80ae1f7c..96096ac4df73395129cac46f8ffb938933304595 100644 GIT binary patch delta 2044 zcmZ`)O-NKx6n=Mp{A1L4nO&dFIB&)ol~ywmsnE|I&J_pazYSvl;7z7it`!;B)q`P;QdqyN*9G#($G?yUtOJI-BvA z@L?#2m*Am!Ss067%nvo@VbwsCM7X6PZ^=v_wb!E9T7}w3sda+zRu7(q2klY}K-rSw z0xYykShmvQ1_(>$ZnB(4r;Lsh9*;iaCYc_+U3^M=6t%}A^bpVV^{n=rX%96vv+DC; z9+uW8=E2zw#h$m?Xv}y@&PHHNK5jQyyOzpGM!ztS4)pvgSNlE?&YcF%M%MQoMxq4r#q2 zCH9kG{VZ$Ed(?;(*ivU)_0(J@^_s4^0hyQ--*nu?m`UR?)WXTz`pOB%2*=5Dd=T=g z!Vr{W66Ru|lbtMQoN}#E1g#cyb@n=DH*uW{H($b5l$#Th%vvQiA6VqP4du2QE2*E*kC?uToGDg{;N_%&LE zcv5EE50p*kaas3sl=a}la4q>!yoLT$Z^MM?l-v!&z0`5vem$6thhQbu10Ne};a{pB zcb}1i{;pn;gR!pD;ub8ZSb&|b)4oCij&`4_Ukf=^=HPC3Z+(GoaUZ-^zpm1Qm50}< F*nij$>q7tl delta 2268 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 delta 9834 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 J=+1qE{|~3sZy^8x diff --git a/lab6/kernel/src/boot.S b/lab6/kernel/src/boot.S index 215933f72..836568cd9 100644 --- a/lab6/kernel/src/boot.S +++ b/lab6/kernel/src/boot.S @@ -125,7 +125,7 @@ from_el2_to_el1: msr ELR_EL1, x1 ldr x0, [sp, 16 * 17] msr sp_el0, x0 - + ldp x0, x1, [sp ,16 * 0] ldp x2, x3, [sp ,16 * 1] ldp x4, x5, [sp ,16 * 2] @@ -177,8 +177,11 @@ core_timer_handler: general_irq_handler: save_all + // mov x0, sp + // bl debug bl c_general_irq_handler // mov x0, sp + // bl debug // bl handle_signal load_all eret @@ -276,6 +279,13 @@ switch_to: mov sp, x9 msr tpidr_el1, x1 + ldr x2, [x1, 16 * 6 + 8] + dsb ish // ensure write has completed + msr ttbr0_el1, x2 // switch translation based address. + tlbi vmalle1is // invalidate all TLB entries + dsb ish // ensure completion of TLB invalidatation + isb // clear pipeline + ret .global get_current diff --git a/lab6/kernel/src/cpio.c b/lab6/kernel/src/cpio.c index dcea4c4e4..e395d2df4 100644 --- a/lab6/kernel/src/cpio.c +++ b/lab6/kernel/src/cpio.c @@ -130,8 +130,8 @@ void cpio_load(char* str) { uart_printf ("xxx: %llx\r\n", xxx); void* pos = cpio_find(str); - cur -> code = my_malloc(4096 * 64); - cur -> code_size = 4096 * 64; + cur -> code = my_malloc(4096 * 128); + cur -> code_size = 4096 * 128; for (int i = 0; i < cur -> code_size; i ++) { ((char*)cur -> code)[i] = ((char*)pos)[i]; } diff --git a/lab6/kernel/src/exception.c b/lab6/kernel/src/exception.c index c012a3865..956610b16 100644 --- a/lab6/kernel/src/exception.c +++ b/lab6/kernel/src/exception.c @@ -193,3 +193,4 @@ void c_system_call_handler(trapframe_t* tf) { // uart_printf ("Exception ended with return value = %d\r\n", tf -> x[0]); irq(1); } + diff --git a/lab6/kernel/src/mmu.c b/lab6/kernel/src/mmu.c index 0205e7d15..47cd2d9e8 100644 --- a/lab6/kernel/src/mmu.c +++ b/lab6/kernel/src/mmu.c @@ -4,6 +4,7 @@ #include "alloc.h" #include "thread.h" #include "mmu_regs.h" +#include "mini_uart.h" #define PERIPHERAL_START 0x3c000000L #define PERIPHERAL_END 0x40000000L @@ -147,11 +148,8 @@ void map_page(long* pt, long va, long pa, long flag) { void setup_peripheral_identity(long* table) { - unsigned long pages = (PERIPHERAL_END - PERIPHERAL_START + 4096 - 1) / 4096; - for (int i = 0; i < pages; i++) - { - // uart_printf ("%d\r\n", i); - map_page(table, PERIPHERAL_START + i * 4096, PERIPHERAL_START + i * 4096, (1 << 6)); + for (long i = PERIPHERAL_START; i < PERIPHERAL_END; i += 4096) { + map_page(table, i, i, (1 << 6)); } } @@ -199,10 +197,10 @@ long trans_el0(long x) { extern thread* get_current(); void switch_page() { + uart_printf ("switching\r\n"); asm volatile( - "mov x0, %0;" "dsb ish;" - "msr ttbr0_el1, x0;" + "msr ttbr0_el1, %0;" "dsb ish;" "tlbi vmalle1is;" "dsb ish;" @@ -211,5 +209,6 @@ void switch_page() { : "r" (get_current() -> PGD) : "x0" ); + uart_printf ("switching done\r\n"); } diff --git a/lab6/kernel/src/system_call.c b/lab6/kernel/src/system_call.c index d616c16a3..3accb0233 100644 --- a/lab6/kernel/src/system_call.c +++ b/lab6/kernel/src/system_call.c @@ -60,6 +60,8 @@ int do_fork(trapframe_t* tf) { thread* cur = get_current(); thread* child = threads[id]; + uart_printf ("PGD for child %d is %llx\r\n", child -> id, child -> PGD); + for (int i = 0; i < 10; i ++) { child -> reg[i] = cur -> reg[i]; @@ -282,13 +284,13 @@ void im_fineee() { void from_el1_to_fork_test() { irq(0); - // switch_page(); + switch_page(); uart_printf ("%llx\r\n", get_current() -> PGD); long ttbr0 = read_sysreg(ttbr0_el1); long ttbr1 = read_sysreg(ttbr1_el1); uart_printf ("ttbr0: %llx, ttbr1: %llx\r\n", ttbr0, ttbr1); void* sp = 0xfffffffff000 - 16; - void* code = (char*)simple_fork_test - _code_start; + void* code = (char*)fork_test_idle - _code_start; long test = code; uart_printf ("%llx translated to %llx\r\n", test, trans(test)); @@ -334,3 +336,12 @@ void from_el1_to_fork_test() { uart_printf ("fuck you\r\n"); asm volatile ( "eret;" ); } + +void debug(trapframe_t* tf) { + uart_printf ("%d: ", get_current() -> id); + uart_printf ("sp: %llx, code: %llx\r\n", tf -> sp_el0, tf -> elr_el1); + long ttbr0 = read_sysreg(ttbr0_el1); + long ttbr1 = read_sysreg(ttbr1_el1); + uart_printf ("ttbr0: %llx, ttbr1: %llx\r\n", ttbr0, ttbr1); + +} diff --git a/lab6/kernel/src/thread.c b/lab6/kernel/src/thread.c index 5259edba2..f38c66f6a 100644 --- a/lab6/kernel/src/thread.c +++ b/lab6/kernel/src/thread.c @@ -99,9 +99,11 @@ void schedule() { thread_tail = thread_tail -> next; } thread_start -> prev = NULL; - uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); + // uart_printf ("[DEBUG] Scheduled From %d to %d\r\n", get_current() -> id, thread_start -> id); switch_to(get_current(), thread_start); - switch_page(); + // switch_page(); + long PGD = read_sysreg(ttbr0_el1); + // uart_printf ("id is now %d, PGD is now %llx, cur -> PGD is %llx\r\n", get_current() -> id, PGD, get_current() -> PGD); // after successfully switched, ending of irq handler do irq(1) return; } From 624d33368b404a91e73f96b650ad3b332ccc9d43 Mon Sep 17 00:00:00 2001 From: hq8398Eric Date: Sat, 15 Jun 2024 23:59:22 +0800 Subject: [PATCH 5/6] first lab7 commit --- lab7/kernel/Makefile | 31 ++ "lab7/kernel/\\" | 217 ++++++++++++ lab7/kernel/asm_test.sh | 1 + lab7/kernel/build/alloc_c.d | 3 + lab7/kernel/build/alloc_c.o | Bin 0 -> 15360 bytes lab7/kernel/build/boot_s.d | 1 + lab7/kernel/build/boot_s.o | Bin 0 -> 8576 bytes lab7/kernel/build/cpio_c.d | 3 + lab7/kernel/build/cpio_c.o | Bin 0 -> 9728 bytes lab7/kernel/build/exception_c.d | 4 + lab7/kernel/build/exception_c.o | Bin 0 -> 6024 bytes lab7/kernel/build/fdt_c.d | 2 + lab7/kernel/build/fdt_c.o | Bin 0 -> 6384 bytes lab7/kernel/build/helper_c.d | 1 + lab7/kernel/build/helper_c.o | Bin 0 -> 2984 bytes lab7/kernel/build/kernel8.elf | Bin 0 -> 115272 bytes lab7/kernel/build/kernel_start_c.d | 3 + lab7/kernel/build/kernel_start_c.o | Bin 0 -> 2952 bytes lab7/kernel/build/mail_c.d | 1 + lab7/kernel/build/mail_c.o | Bin 0 -> 1984 bytes lab7/kernel/build/mini_uart_c.d | 2 + lab7/kernel/build/mini_uart_c.o | Bin 0 -> 8448 bytes lab7/kernel/build/mm_s.d | 1 + lab7/kernel/build/mm_s.o | Bin 0 -> 832 bytes lab7/kernel/build/mmio_c.d | 1 + lab7/kernel/build/mmio_c.o | Bin 0 -> 1408 bytes lab7/kernel/build/mmu_c.d | 2 + lab7/kernel/build/mmu_c.o | Bin 0 -> 3792 bytes lab7/kernel/build/shell_c.d | 5 + lab7/kernel/build/shell_c.o | Bin 0 -> 15848 bytes lab7/kernel/build/signal_c.d | 1 + lab7/kernel/build/signal_c.o | Bin 0 -> 3232 bytes lab7/kernel/build/system_call_c.d | 4 + lab7/kernel/build/system_call_c.o | Bin 0 -> 11648 bytes lab7/kernel/build/system_call_s.d | 1 + lab7/kernel/build/system_call_s.o | Bin 0 -> 1032 bytes lab7/kernel/build/task_c.d | 2 + lab7/kernel/build/task_c.o | Bin 0 -> 2704 bytes lab7/kernel/build/thread_c.d | 3 + lab7/kernel/build/thread_c.o | Bin 0 -> 10000 bytes lab7/kernel/build/timer_c.d | 2 + lab7/kernel/build/timer_c.o | Bin 0 -> 2880 bytes lab7/kernel/build/utils_s.d | 1 + lab7/kernel/build/utils_s.o | Bin 0 -> 760 bytes lab7/kernel/include/DEFINE.h | 58 ++++ lab7/kernel/include/alloc.h | 22 ++ lab7/kernel/include/cpio.h | 29 ++ lab7/kernel/include/exception.h | 16 + lab7/kernel/include/fdt.h | 113 +++++++ lab7/kernel/include/helper.h | 16 + lab7/kernel/include/kernel.h | 6 + lab7/kernel/include/loader.h | 6 + lab7/kernel/include/mail.h | 23 ++ lab7/kernel/include/mini_uart.h | 28 ++ lab7/kernel/include/mm.h | 19 ++ lab7/kernel/include/mmio.h | 8 + lab7/kernel/include/mmu.h | 20 ++ lab7/kernel/include/mmu_regs.h | 20 ++ lab7/kernel/include/peripherals/base.h | 6 + lab7/kernel/include/peripherals/gpio.h | 12 + lab7/kernel/include/peripherals/mini_uart.h | 19 ++ lab7/kernel/include/reboot.h | 22 ++ lab7/kernel/include/set.h | 168 ++++++++++ lab7/kernel/include/shell.h | 3 + lab7/kernel/include/signal.h | 8 + lab7/kernel/include/system_call.h | 29 ++ lab7/kernel/include/task.h | 16 + lab7/kernel/include/thread.h | 30 ++ lab7/kernel/include/timer.h | 17 + lab7/kernel/include/tmpfs.h | 172 ++++++++++ lab7/kernel/include/utils.h | 17 + lab7/kernel/include/vfs.h | 82 +++++ lab7/kernel/kernel8.img | Bin 0 -> 39584 bytes lab7/kernel/src/alloc.c | 258 +++++++++++++++ lab7/kernel/src/boot.S | 301 +++++++++++++++++ lab7/kernel/src/config.txt | 2 + lab7/kernel/src/cpio.c | 217 ++++++++++++ lab7/kernel/src/exception.c | 196 +++++++++++ lab7/kernel/src/fdt.c | 131 ++++++++ lab7/kernel/src/helper.c | 57 ++++ lab7/kernel/src/kernel_start.c | 38 +++ lab7/kernel/src/linker.ld | 17 + lab7/kernel/src/mail.c | 57 ++++ lab7/kernel/src/mini_uart.c | 280 ++++++++++++++++ lab7/kernel/src/mm.S | 6 + lab7/kernel/src/mmio.c | 9 + lab7/kernel/src/mmu.c | 214 ++++++++++++ lab7/kernel/src/shell.c | 267 +++++++++++++++ lab7/kernel/src/signal.c | 77 +++++ lab7/kernel/src/system_call.S | 47 +++ lab7/kernel/src/system_call.c | 347 ++++++++++++++++++++ lab7/kernel/src/task.c | 47 +++ lab7/kernel/src/thread.c | 231 +++++++++++++ lab7/kernel/src/timer.c | 56 ++++ lab7/kernel/src/utils.S | 9 + lab7/kernel/src/vfs.c | 176 ++++++++++ lab7/kernel/test.sh | 2 + 97 files changed, 4319 insertions(+) create mode 100644 lab7/kernel/Makefile create mode 100644 "lab7/kernel/\\" create mode 100755 lab7/kernel/asm_test.sh create mode 100644 lab7/kernel/build/alloc_c.d create mode 100644 lab7/kernel/build/alloc_c.o create mode 100644 lab7/kernel/build/boot_s.d create mode 100644 lab7/kernel/build/boot_s.o create mode 100644 lab7/kernel/build/cpio_c.d create mode 100644 lab7/kernel/build/cpio_c.o create mode 100644 lab7/kernel/build/exception_c.d create mode 100644 lab7/kernel/build/exception_c.o create mode 100644 lab7/kernel/build/fdt_c.d create mode 100644 lab7/kernel/build/fdt_c.o create mode 100644 lab7/kernel/build/helper_c.d create mode 100644 lab7/kernel/build/helper_c.o create mode 100755 lab7/kernel/build/kernel8.elf create mode 100644 lab7/kernel/build/kernel_start_c.d create mode 100644 lab7/kernel/build/kernel_start_c.o create mode 100644 lab7/kernel/build/mail_c.d create mode 100644 lab7/kernel/build/mail_c.o create mode 100644 lab7/kernel/build/mini_uart_c.d create mode 100644 lab7/kernel/build/mini_uart_c.o create mode 100644 lab7/kernel/build/mm_s.d create mode 100644 lab7/kernel/build/mm_s.o create mode 100644 lab7/kernel/build/mmio_c.d create mode 100644 lab7/kernel/build/mmio_c.o create mode 100644 lab7/kernel/build/mmu_c.d create mode 100644 lab7/kernel/build/mmu_c.o create mode 100644 lab7/kernel/build/shell_c.d create mode 100644 lab7/kernel/build/shell_c.o create mode 100644 lab7/kernel/build/signal_c.d create mode 100644 lab7/kernel/build/signal_c.o create mode 100644 lab7/kernel/build/system_call_c.d create mode 100644 lab7/kernel/build/system_call_c.o create mode 100644 lab7/kernel/build/system_call_s.d create mode 100644 lab7/kernel/build/system_call_s.o create mode 100644 lab7/kernel/build/task_c.d create mode 100644 lab7/kernel/build/task_c.o create mode 100644 lab7/kernel/build/thread_c.d create mode 100644 lab7/kernel/build/thread_c.o create mode 100644 lab7/kernel/build/timer_c.d create mode 100644 lab7/kernel/build/timer_c.o create mode 100644 lab7/kernel/build/utils_s.d create mode 100644 lab7/kernel/build/utils_s.o create mode 100644 lab7/kernel/include/DEFINE.h create mode 100644 lab7/kernel/include/alloc.h create mode 100644 lab7/kernel/include/cpio.h create mode 100644 lab7/kernel/include/exception.h create mode 100644 lab7/kernel/include/fdt.h create mode 100644 lab7/kernel/include/helper.h create mode 100644 lab7/kernel/include/kernel.h create mode 100644 lab7/kernel/include/loader.h create mode 100644 lab7/kernel/include/mail.h create mode 100644 lab7/kernel/include/mini_uart.h create mode 100644 lab7/kernel/include/mm.h create mode 100644 lab7/kernel/include/mmio.h create mode 100644 lab7/kernel/include/mmu.h create mode 100644 lab7/kernel/include/mmu_regs.h create mode 100644 lab7/kernel/include/peripherals/base.h create mode 100644 lab7/kernel/include/peripherals/gpio.h create mode 100644 lab7/kernel/include/peripherals/mini_uart.h create mode 100644 lab7/kernel/include/reboot.h create mode 100644 lab7/kernel/include/set.h create mode 100644 lab7/kernel/include/shell.h create mode 100644 lab7/kernel/include/signal.h create mode 100644 lab7/kernel/include/system_call.h create mode 100644 lab7/kernel/include/task.h create mode 100644 lab7/kernel/include/thread.h create mode 100644 lab7/kernel/include/timer.h create mode 100644 lab7/kernel/include/tmpfs.h create mode 100644 lab7/kernel/include/utils.h create mode 100644 lab7/kernel/include/vfs.h create mode 100755 lab7/kernel/kernel8.img create mode 100644 lab7/kernel/src/alloc.c create mode 100644 lab7/kernel/src/boot.S create mode 100644 lab7/kernel/src/config.txt create mode 100644 lab7/kernel/src/cpio.c create mode 100644 lab7/kernel/src/exception.c create mode 100644 lab7/kernel/src/fdt.c create mode 100644 lab7/kernel/src/helper.c create mode 100644 lab7/kernel/src/kernel_start.c create mode 100644 lab7/kernel/src/linker.ld create mode 100644 lab7/kernel/src/mail.c create mode 100644 lab7/kernel/src/mini_uart.c create mode 100644 lab7/kernel/src/mm.S create mode 100644 lab7/kernel/src/mmio.c create mode 100644 lab7/kernel/src/mmu.c create mode 100644 lab7/kernel/src/shell.c create mode 100644 lab7/kernel/src/signal.c create mode 100644 lab7/kernel/src/system_call.S create mode 100644 lab7/kernel/src/system_call.c create mode 100644 lab7/kernel/src/task.c create mode 100644 lab7/kernel/src/thread.c create mode 100644 lab7/kernel/src/timer.c create mode 100644 lab7/kernel/src/utils.S create mode 100644 lab7/kernel/src/vfs.c create mode 100755 lab7/kernel/test.sh diff --git a/lab7/kernel/Makefile b/lab7/kernel/Makefile new file mode 100644 index 000000000..a4fb3bd32 --- /dev/null +++ b/lab7/kernel/Makefile @@ -0,0 +1,31 @@ +ARMGNU ?= aarch64-linux-gnu + +COPS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only -O0 +ASMOPS = -Iinclude + +BUILD_DIR = build +SRC_DIR = src + +all : kernel8.img + +clean : + rm -rf $(BUILD_DIR) *.img + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + mkdir -p $(@D) + $(ARMGNU)-gcc $(COPS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMOPS) -MMD -c $< -o $@ + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +kernel8.img: $(SRC_DIR)/linker.ld $(OBJ_FILES) + $(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -o $(BUILD_DIR)/kernel8.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/kernel8.elf -O binary kernel8.img diff --git "a/lab7/kernel/\\" "b/lab7/kernel/\\" new file mode 100644 index 000000000..ec17845cd --- /dev/null +++ "b/lab7/kernel/\\" @@ -0,0 +1,217 @@ +#include +#include +#include "cpio.h" +#include "mini_uart.h" +#include "helper.h" +#include "alloc.h" +#include "thread.h" +#include "mmu.h" +#include "utils.h" + +extern char* _cpio_file; +char buff[1024]; + +uint8_t hex_char_to_bin(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return 0; // Not a valid hexadecimal character +} + +uint64_t hex_to_bin(const char* hex) { + uint64_t result = 0; + for(int i = 0; i < 8; i ++) { + result = (result << 4) | hex_char_to_bin(hex[i]); + } + return result; +} + +void* cpio_find(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + return filedata; + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return 0; +} + +void cpio_parse_ls() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + uart_printf("%s\r\n", buff); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +void cpio_parse_cat(char* name) { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + // Convert c_namesize and c_filesize from ASCII hex to binary + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + // Calculate the start of the file name and file data + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + break; // End of archive + } + + if (same(buff, name)) { + uart_printf ("Cat %d\r\n", filesize); + substr(buff, filedata, 0, filesize - 1); + uart_printf("%s\r\n", buff); + } + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } +} + +extern thread* get_current(); + +void cpio_load(char* str) { + irq(0); + thread_init(); + thread* cur = get_current(); + uart_printf ("cur: %llx\r\n", cur); + long xxx = read_sysreg(tpidr_el1); + uart_printf ("xxx: %llx\r\n", xxx); + + void* pos = cpio_find(str); + cur -> code = my_malloc(4096 * 64); + cur -> code_size = 4096 * 64; + for (int i = 0; i < cur -> code_size; i ++) { + ((char*)cur -> code)[i] = ((char*)pos)[i]; + } + + uart_printf ("%llx, %llx, %llx\r\n", cur -> PGD, pa2va(cur -> PGD), &(cur -> PGD)); + + setup_peripheral_identity(pa2va(cur -> PGD)); + for (int i = 0; i < cur -> code_size; i += 4096) { + map_page(pa2va(cur -> PGD), i, va2pa(cur -> code) + i, (1 << 6)); + } + for (int i = 0; i < 4; i ++) { + map_page (pa2va(cur -> PGD), 0xffffffffb000L + i * 4096, va2pa(cur -> stack_start) + i * 4096, (1 << 6)); + } + cur -> code = 0; + cur -> stack_start = 0xffffffffb000L; + void* sp = 0xfffffffff000L - 16; + void* el1_sp = cur -> sp; + + long ttbr1 = read_sysreg(ttbr1_el1); + long ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx\r\n", ttbr0, ttbr1); + + uart_printf ("cur -> PGD %llx\r\n", cur -> PGD); + + // uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans(cur -> code)); + + asm volatile("dsb ish"); + write_sysreg(ttbr0_el1, cur -> PGD); + asm volatile("tlbi vmalle1is"); + asm volatile("dsb ish"); + asm volatile("isb"); + + + uart_printf ("uart printf: %llx\r\n", uart_printf); + while (1); + + uart_printf("Running code from %llx, which is %llx\n", cur -> code, trans_el0(cur -> code)); + ttbr1 = read_sysreg(ttbr1_el1); + ttbr0 = read_sysreg(ttbr0_el1); + uart_printf ("TTBR0: %llx, TTBR1: %llx, &TTBR0: %llx\r\n", ttbr0, ttbr1, &ttbr0); + + asm volatile( + "mov x1, 0;" + "msr spsr_el1, x1;" + "mov x1, %[code];" + "mov x2, %[sp];" + "msr elr_el1, x1;" + "msr sp_el0, x2;" + "msr DAIFclr, 0xf;" + "mov sp, %[sp_el1];" + "eret;" + : + : [code] "r" (cur -> code), [sp] "r" (sp), [sp_el1] "r" (el1_sp) + : "x1", "x2", "sp" + ); +} + +char* get_cpio_end() { + char* cpio_start = _cpio_file; + struct cpio_newc_header* header = (struct cpio_newc_header*)cpio_start; + substr(buff, header -> c_magic, 0, 5); + while (same(buff, "070701")) { + uint64_t namesize = hex_to_bin(header->c_namesize); + uint64_t filesize = hex_to_bin(header->c_filesize); + + char* filename = (char*)(header + 1); + char* filedata = filename + namesize; + filedata = (char*)((uintptr_t)filedata + ((4 - ((uintptr_t)filedata & 3)) & 3)); // Align to next 4-byte boundary + + substr(buff, filename, 0, namesize - 1); + if (same(buff, "TRAILER!!!")) { + return filedata + filesize; + } + + substr(buff, filename, 0, namesize - 1); + + // Move to the next header, aligning as necessary + header = (struct cpio_newc_header*)(filedata + filesize); + header = (struct cpio_newc_header*)((uintptr_t)header + ((4 - ((uintptr_t)header & 3)) & 3)); // Align to next 4-byte boundary + substr(buff, header -> c_magic, 0, 5); + } + return header; +} diff --git a/lab7/kernel/asm_test.sh b/lab7/kernel/asm_test.sh new file mode 100755 index 000000000..4ebc6f3a2 --- /dev/null +++ b/lab7/kernel/asm_test.sh @@ -0,0 +1 @@ +qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio -dtb ../../bcm2710-rpi-3-b-plus.dtb -initrd ../../initramfs.cpio -display vnc=0.0.0.0:0 -vga std -d in_asm diff --git a/lab7/kernel/build/alloc_c.d b/lab7/kernel/build/alloc_c.d new file mode 100644 index 000000000..8a63d0860 --- /dev/null +++ b/lab7/kernel/build/alloc_c.d @@ -0,0 +1,3 @@ +build/alloc_c.o: src/alloc.c include/alloc.h include/mini_uart.h \ + include/fdt.h include/set.h include/mini_uart.h include/alloc.h \ + include/cpio.h include/mmu.h diff --git a/lab7/kernel/build/alloc_c.o b/lab7/kernel/build/alloc_c.o new file mode 100644 index 0000000000000000000000000000000000000000..6e0f76c64c341bf4975a57404af7d04ec2adc76e GIT binary patch literal 15360 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 TV*L+p7Z!XT4vW%XzyJRNZIMu! literal 0 HcmV?d00001 diff --git a/lab7/kernel/build/boot_s.d b/lab7/kernel/build/boot_s.d new file mode 100644 index 000000000..1bbe62f69 --- /dev/null +++ b/lab7/kernel/build/boot_s.d @@ -0,0 +1 @@ +build/boot_s.o: src/boot.S include/mmu_regs.h diff --git a/lab7/kernel/build/boot_s.o b/lab7/kernel/build/boot_s.o new file mode 100644 index 0000000000000000000000000000000000000000..eb4bc3b61b96c881b3239dd0fa2ea74404fe0c4f GIT binary patch literal 8576 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 aH-Dv$DEj;<%}VKaJ?|^oLYJDl{=WgYVky1= literal 0 HcmV?d00001 diff --git a/lab7/kernel/build/exception_c.d b/lab7/kernel/build/exception_c.d new file mode 100644 index 000000000..bedaffbad --- /dev/null +++ b/lab7/kernel/build/exception_c.d @@ -0,0 +1,4 @@ +build/exception_c.o: src/exception.c include/exception.h \ + include/mini_uart.h include/utils.h include/mmio.h include/DEFINE.h \ + include/timer.h include/task.h include/system_call.h include/exception.h \ + include/thread.h diff --git a/lab7/kernel/build/exception_c.o b/lab7/kernel/build/exception_c.o new file mode 100644 index 0000000000000000000000000000000000000000..9ab4e06da9ce78db3ff9e6349303b715839f163b GIT binary patch literal 6024 zcmbuDU2IfE6vxl*7FeYeEJdoV^n&$^kEK--s}i{tDt#c@Kvgs*%Xas+yXk(kcW-qO zqkS;O7#~V(3=cvyA+h2M40H#1HK6n!d6gW@pyIY+M%=Gj<&U>fi< zgSutZ1sLCNU1^!7n&$TPNynaT1NiOj2=rSr79GC?Fmpj;6 zKr6&G_`Xz!x+I<|0}GB?u)NPYH^+`wGV>!5NAlZ*G_Bemz__8XU= z{Eo^eu5Gg12Iru@nq$RUka7OYZ8o+ejkvB+JB<0b?$t}yRn31roWpp~W`nXh1S)5f z^|&`aZ&Mr(DCKH$Iq?><_qomXk`F)TPx<_OyyTpsM$`O}4-}`hOPq9WaV@hL?`*jR z>lWP0xu?Fu6Vh1Tjxlbx&$Ug!=-d8$m2*#eYHa*(#wG*C=NFX?QRXbu{$gV7nxgRGUt=}cXTz$w+P!?Q*0Nca@xO0`*INHn7VUE^`lsK@nS z9RD=GzJ|Txy9VdSHTu3VsoOj#Hcc>^;5^(XtaUtVK(05>eyk}qM{nl+IB0c*Sb)jeRF!ZN0MGOBYtg(E` z8O-FJR8=}=^|^&4O)%uE1EdmO!b%Jj60T=C*$%;w$rml^RL4;#+gTakQ@|-)XDCy| z_>rpqa3-5&3yEVa@03QIq=#V?52I}^naF0hS|fTKdw1`?-@5a$fw8h=9qZU}7h`}mloTwX=k`NgX+x-`z71Nj->fJ=n(FR`j^oQuEIata_YKsg zar`}?N-thE84vgQ1~h)qABH_tv;U)-Ki*GO&d|^92J3j;iO4XI(`Fx2qZ~(f!K^e2&`BFeVwSf2|%SdQ~Ql< zdw~5t0i4bY&3l@ctj-0pz5x3t+5UI7SLXy-A;A7{0Dn1vPa>yyrsy1DY4$5Pg*EZ> z%+)zVb{;=+SFl+rUtp^i|2BaC7{GrC;C}@0`2c=B=BrjbjRCwhfJ5c^8B0QY3ffCm z5_j^Rdl<&>85bYHhpjgV8Fv)YP9g=xOl~CW#FGWriF=uxVxq(7SDN=`?!&DbDL-~ZX6s+95wU|f!mgBpaD(eg` zd((p4ztg^52iuE|#r+*zi;i%*PgG1DTTuYf5nZ`&q9eSQ?MV7W$-B+_ywF853B$rcdg7t=NRi)hK}&|0G%#F=PlORY3K;I19T2){3h0*>Lrcqc{r)@ zn>G6j8rSWA(s+wz-_EaUlplI8mC~#6TLfaA*7ydEAJaH~=d6_T8n-GG;A`fR|Fb-H znYrwv@b5Go{hZ8ce50nnhJV?J{skUuVlMi^o0*&Eq)X$QG=1C9zszHM41M9fnvNcS zzsB|blD$}l`@&a2&9IZ_5uWD$(*~FK$mb0%?~895T;B7}7+l`-AXYq_^AZDCd#+!n zrR6%=M9gza9>nPD8^i{RMToftzmqKFa`-|7v3$XEVtXHXY+KPwB!|&}+?;fL&`snV zp7wuN7Aj!Mmb}^9$f%?^-+qt2^DHiOH;CDbF*NfFOBa9jz^|%mo+#TjbA3B=zHUqb zP8##d0L7}8t=J*W|LWg~zND$28SKIo&mS=+l=#Vp3jS?G`FE&Z^~ZbsRf*!$i^xg+ z5DrRPxBHg;bw+K|_6cTY{Fm8Z-djY+jGz8^TWkON=!+ee3BLl`Kk^lS**}WMoSR&x tc;9<@V^$)gBVqbqhs@kNMDQz3h~*Ar!A2M8cWf>HGRL1#D%BsR|6dnr7~KE> literal 0 HcmV?d00001 diff --git a/lab7/kernel/build/fdt_c.d b/lab7/kernel/build/fdt_c.d new file mode 100644 index 000000000..b4593fc62 --- /dev/null +++ b/lab7/kernel/build/fdt_c.d @@ -0,0 +1,2 @@ +build/fdt_c.o: src/fdt.c include/fdt.h include/mini_uart.h \ + include/utils.h include/helper.h diff --git a/lab7/kernel/build/fdt_c.o b/lab7/kernel/build/fdt_c.o new file mode 100644 index 0000000000000000000000000000000000000000..835c41c399b060c3c4e5a3e7d1d100e80e578f16 GIT binary patch literal 6384 zcmb_gU2Igx6+Y`-f)g8Kuv5FW6<;eRB!nz$f@FfIa?MX560s;YB~^)*wRerJtp9ee zBezEBqEZQ|RKme(Qwh6PMI}I0mA7Wow1qZR^NO+rp@63F2&Uen7Id}G6|KQ+}7ivNwG7_TS((1^dL~lL1+ILmgr43Y1Yv99zd3nz|OEfi?ISp{e_{7H9ttSK%p!X&dHN zW8C59DMFhH@LNQ`(BkHwCwjH+OFPy-t60nXbsmfBDbKm2i2DZC^eT0 zkX%DwawKbHA5B!chqZq4G&ta|BZ9ot(7)Iol`S|_+_ zX)5I7;{4mXrjMK|KdWP!|AyhI|KDONJniN=pSqrC-sW0wxEg6Hhy2)cM7d)tvpT0M zvtN-L#Bo#BgLTdobWY~EmIyfeeX(5rSphL1j_bw;bSt?F5o*3%{yXX#b)@sD=j|Bs zss=yr4_!kYmx^uJqZT|TZLsY@+vAqbB4*gnn=$I8g#9Z$#r{vAZck%BPw4$T%dugO zYvI!lw-lz_=6ez!ufqXXj-LOpz&4`C+;qmhgePdO2!9UZWnbUsJTfo#_9p7z@bOw| z^mBHRIbE9*_NoqH|AMhcE>R0AuEJKtz7;wS&6WNw`D<}Y&$3V8%`xPf=Mnz{%(Kr= zkmGyd=Ih09)Adt+U#!o05}QvAr?rkQ69?+ytJab8b0Y@kZiao(+MSSe@r|Y2(Yic2>CFFx^3AxjpdTiGn@OjR` z6|A41i>152IJOjeC&TASZp|~mak-@?#R)F##ZM(~r)sbdkFWZv=pfHOv2{?Z_pmp` z#}OCyPxUrXmy+#PXgfamh2u!YZI{!3*!g-4s@DvdUSkxX8Y*)sFz7Tll2lA zPwSccmUMbX@z1b7&v`A89!)yKNiRN1wYAc zZ-aBZfv6qbnBXqAz!xHm;l7XWVph)|8yb%Y z?|B|W+EK8^uI8XNWWQH=5^|1j!W$P}JZJPi=wo>KgU%~|Chj--=tdAHXGn*i4IZM40oR08BZsvD@op9G)D2E$lgEWmJOAm)Bo}3<=)JPVG5A_~-@lYRW-J~~2IGEz1!o=`f6L?|BDg<4 z^#S_kIq~baiazg)ozHfQhx6v>Fvzj|+IW}6W9M_X#bd|6*W$790~U`R&k>7<{l+Ao zqZW^i4_G{QJV^`JXRsz3@$tLDpZ4(^eA42v`Oo=y4hzqDACJK=1n}JO@w_ZN@A-HP z{(;5QD!SaNuQ&truLkJf3edkDpnoSo z|Dyo?FD-p@MydtL?<2==--|ZHUjhh-+hdAX(P=0r*JCVUp%6PzsUzV}w!_E65 zzpt?vo*ewJnDJ^mIkvycaI}aP$7xDtv~=yysCg`@J!KZ;Rq3OSdDYmr11) zQ7<*)Q8bzG5)>WGW+|GP(1W3gv9Z)R=Ef(yRP<2aasFH#dKC(6mKuo4ITqJi-D68n)MnctKr1efCxBQ0lqehn_^ zHbdHu9&`Hbb7J3I(bOH|-@yEx!kl*P@tm=LhX*>}6TfNq zVbb(%z2UW=cxu|OdqV8}@sEgo%xB<_{}}A6?cby%?v4b-`^UD%-s~UK`+c*?o1%D2 sChLIl@3!Bb|KH=^J3utT29V$ArgHZ!N4;ZKvp*~^1Br^I?)dHh1H8yRasU7T literal 0 HcmV?d00001 diff --git a/lab7/kernel/build/helper_c.d b/lab7/kernel/build/helper_c.d new file mode 100644 index 000000000..cb268cdc7 --- /dev/null +++ b/lab7/kernel/build/helper_c.d @@ -0,0 +1 @@ +build/helper_c.o: src/helper.c include/mini_uart.h diff --git a/lab7/kernel/build/helper_c.o b/lab7/kernel/build/helper_c.o new file mode 100644 index 0000000000000000000000000000000000000000..1e893837440768b686d8e3cf8abc0ca16ce3b271 GIT binary patch literal 2984 zcmb`J&u<%55XWb`ZWBlvr=gIFMzJFz6j0;XA(R>ku_1z1P1QqiRW2y?k1eSh+pWEk z5>&N8AaUpg0|)*DT9A4K-z?Ds*QzS&fy3H8bEw3jmI}*v-p)(5&ko|ilk9!(vorJN zeP^DN8}Fa_V4r1?9v1yXyDLqJ)&_Uyj+#1jkcKJvh3@%rYPN0a`nJ=x4s5T$Kg)B9 zQNxOdYq)%cPlIC4E&ogFRxn4+mxvCxX?w+=bDBw_W%4FJY{xO5ZoNzsG=}hF{vFD8 z?l@V0Zo5f?)Mz6vY;P`JbH3>msj;}0KcV(R4D5HvM_i7Vn4qh(e+4;}#|$+R$SIMu zA0XdG%U=C0_#Al;P?z%#67WfEH`@bYY$7KM`>RtHhUw}Qqe!sGpJhA7aAQ(p;VLqXb-S!Z5JJ9pd5ORVRe4aS_;r#6(r#pqX z9h{HfVUJ~E9pd4BQ`pbcqRqBLPLuQa19~8a@`Z-Vmum#gm8N@X#QMaH+@t5#x>y19 zPB_h-Gl|AQ92$>Pa||(fFW(Z?!}AEJ3k?+`{hGylfI zo5$ZekA=x~A#gB=n6Gd~wc((5Bg7}K!=?j0cobwTa$Z$uuu0*1t?TiM@KbU$ zRcEl*h5s(x!J0<~AC5n-jAzyXCs;aV(6P z@If!&98tB734hVx6T!|h8T0c-P=s zM@rSV%3i*Jr&kM~YkF3LJSorJ^e9!zdwEI~>UB!hs^OwoEtlO2-c_oen>u;++-%*; z7cawr-Q2a+i#1mNe;P@|;ns@QghM<0h4F=PHO(7&6gJEpe4=Aiu9ogIzPG%OzClOC z_*LP?HgwknV$U(6gZqbLn&$u2pYIXJjP@9o^s5BqdmJ4)f6cO(u)jX1<`2bR_qXOc zfBk$<{PlbNjG02q3+<=v&SS#N%zse)A8JE+n)$DQ_p6^H^=pYA*N=U*zph`uz1hW= p{e4Mz2yD2IKmJbl)DDPR(vYWl5gF$B@xNkUf1PMP;>%Oh{~tnc!Vdrd literal 0 HcmV?d00001 diff --git a/lab7/kernel/build/kernel8.elf b/lab7/kernel/build/kernel8.elf new file mode 100755 index 0000000000000000000000000000000000000000..f44d1f114b44865d0932b030684c059339ed2836 GIT binary patch literal 115272 zcmeHw3z$^ZmF}+Y7Fs}Upp6|N_GyKHfY>0)Q>o@5C@9#FNTQkUrn{h9`b9sq5u>Ft z35jInC>f2J(}Gzp?4-ieb`AxTVP5`1KaP9$~zf9`45rSrhfj_Ve5PL)m^~ZrK+xTlTHR{h6jKn z*F|Q)pst6%bYb%oH;*oY$r%y9x_dYXn?EVDwndsR47vV2i_~1{{g(tk2 z9BO(GoD%6hcv?a4ugVL1U!PFa``dF*=zU}6klsJcAKH6pNpbI6D^Bcv=gMKd|4}o% z_wf1=y?<^ysrTLMPVW8dX4o2?wZ8&?$)P2^rV8J;nSo@X@t+!Qb|i^0Fcl$U`X z9WYh+9vX$dD(G7PeG8#)5%evFzKfx63G^+6zDuC*Qs`R-eaoTmGU&S;`l17{*{AIu z+TtA;18mVId`IzJx7n=mjOjBe^b7DZsj~h3g*6{oJHPS)xABAOpC5g|c9)-R-t-F1 z>JQ3(`q$nMxD6kq@7@dB%e}(=;a`YB=mYU@(ko7>bly)cdiX6MBDxb;^mAX5hS)(cbgdRQ1lRUC=wb zabfS=_C>uH_AKr_yD~a3KVtlw_m=HHb4GOF!MTO|3%s)Z<+m2^=k+h<7s~oIzIT>< ze~@dE5>pb#{)I7%sOEuf~`SULtMYt~5y z>i}2rZOFXb)kQll0#DF4=GZ#o8w+rq;~S{^KS4{*M?2<6`{2VHFLOE}3qvbo{}