From 20cc8788d87c5fcaea3fc6c38c87eff45a4c8776 Mon Sep 17 00:00:00 2001 From: iDunnoDev Date: Sat, 5 Jul 2025 11:44:43 +0100 Subject: [PATCH] Final commit? (not entirely sure what all this is now..) --- _argtest | Bin 0 -> 14568 bytes _cat | Bin 0 -> 15672 bytes _cls | Bin 0 -> 14168 bytes _count | Bin 0 -> 15508 bytes _echo | Bin 0 -> 14548 bytes _forktest | Bin 0 -> 8976 bytes _grep | Bin 0 -> 18524 bytes _hello | Bin 0 -> 14764 bytes _init | Bin 0 -> 15152 bytes _kill | Bin 0 -> 14636 bytes _ln | Bin 0 -> 14536 bytes _ls | Bin 0 -> 17096 bytes _maze | Bin 0 -> 17028 bytes _mkdir | Bin 0 -> 14660 bytes _rm | Bin 0 -> 14640 bytes _screen | Bin 0 -> 16684 bytes _sh | Bin 0 -> 28780 bytes _shutdown | Bin 0 -> 14796 bytes _stressfs | Bin 0 -> 15564 bytes _usertests | Bin 0 -> 63168 bytes _wc | Bin 0 -> 16104 bytes _zombie | Bin 0 -> 14216 bytes argtest.asm | 1174 +++ argtest.d | 1 + argtest.o | Bin 0 -> 3276 bytes argtest.sym | 50 + bio.d | 2 + bio.o | Bin 0 -> 7012 bytes bootasm.d | 1 + bootasm.o | Bin 0 -> 1708 bytes bootblock | Bin 0 -> 512 bytes bootblock.asm | 341 + bootblock.o | Bin 0 -> 5688 bytes bootblockother.o | Bin 0 -> 1268 bytes bootmain.d | 1 + bootmain.o | Bin 0 -> 6804 bytes cat.asm | 1268 ++++ cat.d | 1 + cat.o | Bin 0 -> 4964 bytes cat.sym | 52 + cls.asm | 1142 +++ cls.d | 1 + cls.o | Bin 0 -> 2620 bytes cls.sym | 50 + console.d | 3 + console.o | Bin 0 -> 54460 bytes count.asm | 1275 ++++ count.d | 1 + count.o | Bin 0 -> 4788 bytes count.sym | 50 + echo.asm | 1181 +++ echo.d | 1 + echo.o | Bin 0 -> 3304 bytes echo.sym | 50 + entry.o | Bin 0 -> 1432 bytes entryother | Bin 0 -> 122 bytes entryother.asm | 115 + entryother.d | 1 + entryother.o | Bin 0 -> 1660 bytes exec.d | 2 + exec.o | Bin 0 -> 10848 bytes file.d | 2 + file.o | Bin 0 -> 9992 bytes forktest.asm | 685 ++ forktest.d | 1 + forktest.o | Bin 0 -> 5480 bytes fs.d | 2 + fs.img | 3 + fs.o | Bin 0 -> 31148 bytes grep.asm | 1595 ++++ grep.d | 1 + grep.o | Bin 0 -> 8728 bytes grep.sym | 55 + hello.asm | 1189 +++ hello.d | 1 + hello.o | Bin 0 -> 3664 bytes hello.sym | 50 + ide.d | 2 + ide.o | Bin 0 -> 13200 bytes init.asm | 1238 +++ init.d | 1 + init.o | Bin 0 -> 4292 bytes init.sym | 51 + initcode | Bin 0 -> 44 bytes initcode.asm | 43 + initcode.d | 1 + initcode.o | Bin 0 -> 1508 bytes initcode.out | Bin 0 -> 1136 bytes ioapic.d | 1 + ioapic.o | Bin 0 -> 5040 bytes kalloc.d | 2 + kalloc.o | Bin 0 -> 6744 bytes kbd.d | 1 + kbd.o | Bin 0 -> 6072 bytes kernel | Bin 0 -> 235032 bytes kernel.asm | 18368 +++++++++++++++++++++++++++++++++++++++++++++ kernel.sym | 534 ++ kill.asm | 1185 +++ kill.d | 1 + kill.o | Bin 0 -> 3472 bytes kill.sym | 50 + lapic.d | 2 + lapic.o | Bin 0 -> 15188 bytes ln.asm | 1181 +++ ln.d | 1 + ln.o | Bin 0 -> 3308 bytes ln.sym | 50 + log.d | 2 + log.o | Bin 0 -> 10232 bytes ls.asm | 1466 ++++ ls.d | 1 + ls.o | Bin 0 -> 7016 bytes ls.sym | 53 + main.d | 2 + main.o | Bin 0 -> 17900 bytes maze.asm | 1386 ++++ maze.d | 1 + maze.o | Bin 0 -> 6688 bytes maze.sym | 56 + mkdir.asm | 1202 +++ mkdir.d | 1 + mkdir.o | Bin 0 -> 3460 bytes mkdir.sym | 50 + mkfs | Bin 0 -> 21440 bytes mp.d | 2 + mp.o | Bin 0 -> 11616 bytes picirq.d | 1 + picirq.o | Bin 0 -> 2660 bytes pipe.d | 2 + pipe.o | Bin 0 -> 11128 bytes printf.d | 1 + printf.o | Bin 0 -> 7136 bytes proc.d | 2 + proc.o | Bin 0 -> 25652 bytes rm.asm | 1202 +++ rm.d | 1 + rm.o | Bin 0 -> 3452 bytes rm.sym | 50 + screen.asm | 1389 ++++ screen.c | 4 +- screen.d | 1 + screen.o | Bin 0 -> 6208 bytes screen.sym | 51 + sh.asm | 2727 +++++++ sh.d | 1 + sh.o | Bin 0 -> 23344 bytes sh.sym | 71 + shutdown.asm | 1210 +++ shutdown.d | 1 + shutdown.o | Bin 0 -> 3692 bytes shutdown.sym | 50 + sleeplock.d | 2 + sleeplock.o | Bin 0 -> 7456 bytes spinlock.d | 2 + spinlock.o | Bin 0 -> 10684 bytes stressfs.asm | 1288 ++++ stressfs.d | 2 + stressfs.o | Bin 0 -> 4784 bytes stressfs.sym | 50 + string.d | 1 + string.o | Bin 0 -> 7076 bytes swtch.o | Bin 0 -> 1204 bytes syscall.d | 2 + syscall.h | 29 + syscall.o | Bin 0 -> 10664 bytes syscalltable.h | 58 + sysfile.d | 2 + sysfile.o | Bin 0 -> 24692 bytes sysproc.d | 2 + sysproc.o | Bin 0 -> 10744 bytes trap.d | 2 + trap.o | Bin 0 -> 11204 bytes trapasm.o | Bin 0 -> 1328 bytes uart.d | 2 + uart.o | Bin 0 -> 7184 bytes ulib.d | 2 + ulib.o | Bin 0 -> 7100 bytes umalloc.d | 2 + umalloc.o | Bin 0 -> 5272 bytes usertests.asm | 6630 ++++++++++++++++ usertests.d | 2 + usertests.o | Bin 0 -> 73980 bytes usertests.sym | 95 + usys.S | 39 + usys.o | Bin 0 -> 1944 bytes vectors.S | 1537 ++++ vectors.o | Bin 0 -> 16384 bytes vm.d | 2 + vm.o | Bin 0 -> 27544 bytes wc.asm | 1319 ++++ wc.d | 1 + wc.o | Bin 0 -> 5500 bytes wc.sym | 52 + xv6.img | 3 + zombie.asm | 1157 +++ zombie.d | 1 + zombie.o | Bin 0 -> 2708 bytes zombie.sym | 50 + 198 files changed, 56377 insertions(+), 2 deletions(-) create mode 100644 _argtest create mode 100644 _cat create mode 100644 _cls create mode 100644 _count create mode 100644 _echo create mode 100644 _forktest create mode 100644 _grep create mode 100644 _hello create mode 100644 _init create mode 100644 _kill create mode 100644 _ln create mode 100644 _ls create mode 100644 _maze create mode 100644 _mkdir create mode 100644 _rm create mode 100644 _screen create mode 100644 _sh create mode 100644 _shutdown create mode 100644 _stressfs create mode 100644 _usertests create mode 100644 _wc create mode 100644 _zombie create mode 100644 argtest.asm create mode 100644 argtest.d create mode 100644 argtest.o create mode 100644 argtest.sym create mode 100644 bio.d create mode 100644 bio.o create mode 100644 bootasm.d create mode 100644 bootasm.o create mode 100644 bootblock create mode 100644 bootblock.asm create mode 100644 bootblock.o create mode 100644 bootblockother.o create mode 100644 bootmain.d create mode 100644 bootmain.o create mode 100644 cat.asm create mode 100644 cat.d create mode 100644 cat.o create mode 100644 cat.sym create mode 100644 cls.asm create mode 100644 cls.d create mode 100644 cls.o create mode 100644 cls.sym create mode 100644 console.d create mode 100644 console.o create mode 100644 count.asm create mode 100644 count.d create mode 100644 count.o create mode 100644 count.sym create mode 100644 echo.asm create mode 100644 echo.d create mode 100644 echo.o create mode 100644 echo.sym create mode 100644 entry.o create mode 100644 entryother create mode 100644 entryother.asm create mode 100644 entryother.d create mode 100644 entryother.o create mode 100644 exec.d create mode 100644 exec.o create mode 100644 file.d create mode 100644 file.o create mode 100644 forktest.asm create mode 100644 forktest.d create mode 100644 forktest.o create mode 100644 fs.d create mode 100644 fs.img create mode 100644 fs.o create mode 100644 grep.asm create mode 100644 grep.d create mode 100644 grep.o create mode 100644 grep.sym create mode 100644 hello.asm create mode 100644 hello.d create mode 100644 hello.o create mode 100644 hello.sym create mode 100644 ide.d create mode 100644 ide.o create mode 100644 init.asm create mode 100644 init.d create mode 100644 init.o create mode 100644 init.sym create mode 100644 initcode create mode 100644 initcode.asm create mode 100644 initcode.d create mode 100644 initcode.o create mode 100644 initcode.out create mode 100644 ioapic.d create mode 100644 ioapic.o create mode 100644 kalloc.d create mode 100644 kalloc.o create mode 100644 kbd.d create mode 100644 kbd.o create mode 100644 kernel create mode 100644 kernel.asm create mode 100644 kernel.sym create mode 100644 kill.asm create mode 100644 kill.d create mode 100644 kill.o create mode 100644 kill.sym create mode 100644 lapic.d create mode 100644 lapic.o create mode 100644 ln.asm create mode 100644 ln.d create mode 100644 ln.o create mode 100644 ln.sym create mode 100644 log.d create mode 100644 log.o create mode 100644 ls.asm create mode 100644 ls.d create mode 100644 ls.o create mode 100644 ls.sym create mode 100644 main.d create mode 100644 main.o create mode 100644 maze.asm create mode 100644 maze.d create mode 100644 maze.o create mode 100644 maze.sym create mode 100644 mkdir.asm create mode 100644 mkdir.d create mode 100644 mkdir.o create mode 100644 mkdir.sym create mode 100644 mkfs create mode 100644 mp.d create mode 100644 mp.o create mode 100644 picirq.d create mode 100644 picirq.o create mode 100644 pipe.d create mode 100644 pipe.o create mode 100644 printf.d create mode 100644 printf.o create mode 100644 proc.d create mode 100644 proc.o create mode 100644 rm.asm create mode 100644 rm.d create mode 100644 rm.o create mode 100644 rm.sym create mode 100644 screen.asm create mode 100644 screen.d create mode 100644 screen.o create mode 100644 screen.sym create mode 100644 sh.asm create mode 100644 sh.d create mode 100644 sh.o create mode 100644 sh.sym create mode 100644 shutdown.asm create mode 100644 shutdown.d create mode 100644 shutdown.o create mode 100644 shutdown.sym create mode 100644 sleeplock.d create mode 100644 sleeplock.o create mode 100644 spinlock.d create mode 100644 spinlock.o create mode 100644 stressfs.asm create mode 100644 stressfs.d create mode 100644 stressfs.o create mode 100644 stressfs.sym create mode 100644 string.d create mode 100644 string.o create mode 100644 swtch.o create mode 100644 syscall.d create mode 100644 syscall.h create mode 100644 syscall.o create mode 100644 syscalltable.h create mode 100644 sysfile.d create mode 100644 sysfile.o create mode 100644 sysproc.d create mode 100644 sysproc.o create mode 100644 trap.d create mode 100644 trap.o create mode 100644 trapasm.o create mode 100644 uart.d create mode 100644 uart.o create mode 100644 ulib.d create mode 100644 ulib.o create mode 100644 umalloc.d create mode 100644 umalloc.o create mode 100644 usertests.asm create mode 100644 usertests.d create mode 100644 usertests.o create mode 100644 usertests.sym create mode 100644 usys.S create mode 100644 usys.o create mode 100644 vectors.S create mode 100644 vectors.o create mode 100644 vm.d create mode 100644 vm.o create mode 100644 wc.asm create mode 100644 wc.d create mode 100644 wc.o create mode 100644 wc.sym create mode 100644 xv6.img create mode 100644 zombie.asm create mode 100644 zombie.d create mode 100644 zombie.o create mode 100644 zombie.sym diff --git a/_argtest b/_argtest new file mode 100644 index 0000000000000000000000000000000000000000..c93bec2ec9dd5f07eb8b2a414c7c7a0627958277 GIT binary patch literal 14568 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 literal 0 HcmV?d00001 diff --git a/_cat b/_cat new file mode 100644 index 0000000000000000000000000000000000000000..d6728e0987fdd3be3b97bf6646f820fd64fa060c GIT binary patch literal 15672 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 literal 0 HcmV?d00001 diff --git a/_cls b/_cls new file mode 100644 index 0000000000000000000000000000000000000000..5787f6b30721291f3b9b934c5dac4b4587dadaf4 GIT binary patch literal 14168 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 QseGR!;ZI5l<7V;wH=wEDng9R* literal 0 HcmV?d00001 diff --git a/_count b/_count new file mode 100644 index 0000000000000000000000000000000000000000..938280125ddf06770cf39795864b20461c2a4638 GIT binary patch literal 15508 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 DmLCLT literal 0 HcmV?d00001 diff --git a/_echo b/_echo new file mode 100644 index 0000000000000000000000000000000000000000..2c6726ed7afac10fd76999bca52de7a70407b35a GIT binary patch literal 14548 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 a{sp3hMr@+zXDZ)=H!=2OlZQIX_WuHQ7%u7n literal 0 HcmV?d00001 diff --git a/_forktest b/_forktest new file mode 100644 index 0000000000000000000000000000000000000000..51ab3238d86a27e4730b99099ee455015f2fefc4 GIT binary patch literal 8976 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 O+d23bpi5ji25KoBM|GZP*bK?2li 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 TFW^kM`fKrP5*lD$mfZgV(e!9g literal 0 HcmV?d00001 diff --git a/_init b/_init new file mode 100644 index 0000000000000000000000000000000000000000..b9b8886d879e16dcb39c9fb862b389ca44d68bb0 GIT binary patch literal 15152 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Μ~$UMdD(WGJs@D-KXx?7IzD!GU;f=v5MmrG|w~>JWh7M+O0*T97!#P zZv~+52Ji2{Tb{^^cy*calKz9|5_qmo7KDLT?$?#WmY|7<0vTjyi6qR|~F) zWJudI5eSBvAb!^(+{itZ226a0+bkMxLsRL-w0m&lT&I@`dnaxVJCrE8Ahsk}$CMfR zqv)gxDdS|)7A_=x+d)30nX6{KzGuRB{%pxnawePp_Uv7wlRAWZ8mnt zec*9O9+#sB<0OesWx~jX$H;~L6_A`H{d3Yl1E#M9&O^gj(Iifz5wqQjo1O(~$^b@x zLDS@oAZDW!3L{- zWZK9)h3vgW4B);H)6-JteQ(k%A$Ch9Nxg&i7MdDlx5@~A0^qM`OrdmChye^QVno{| z@4F3Jl7g&4%A&$JEUK7Fk)x1#(A35Twn%Ea4iI^ycCbo`SP5V`nq7gG*CAui!hn)u zFT~(qF+k~oVU~@2+>KTT6z@Ahvu=qrvRP?Fpm|&CwzFAz10Xj6vk6TNuo5}VAprD{ zRO{o~%A~fDdo*;BKFQI<{wn35&Guvd6y$E0gO>GM?yDa8>*qMvQa<)N0 zDM(jS?#7^iVwW-nx0wSV=GJ3hRSM?Pn6b%d3fl)g8ZUt?JqhkY{|&Hz2kmEQeD~wP z&<^z-P?O~jMf(k1yFsBR!!GnGo58H`?AgF;#vY{^dz5DEOq#KuxQ+cJ^<}WD4si?E zBWQLS*yAH6b^`XK(dNyk=_LpTElA!M#B@4V$21QKlw#spXnJF7m`y7rVmZM1XkI16 zraN~5vkFiZno`eZI7sRN0A#WfU^85Vka@xs>2K2e|^%=U(WE0t%qn zz6IIG$TAAXD$k81^l!k?qsETL`vGKN;3Xypv4L?IX^SQ2wEC`D86 z2H#rn88iKgL}vn8>-i5$?nba(Z^^B}U=_)|V#&!V-ypfuxVa&_?t&${5u6(=(IyQ1 zB>Ju;DxF&j6uTB}Nk$PIm(Fbit_@8(cNYdb(A3qqjhT875L<}0!n4tm+Xq}Xnv^4k z9yIk3Zc;8o$0!QsOukZ~2cp;sKr@~WS+r(^ywPIJK1xnFlBw(-0?hk5F`{a4bDL+_2;F_Uor1^9Ke+)z^xxVePG=8|`sSdu)XQmFL1LOyMl z+?li=80G$zs1}zjpA;PuXiCuE#9Xp~)&sniP}^Cue0=T$unTPhCI2!S{}4CI1fT4X z@%#>`-$s*h`5p!XXsWRCz>>&qn%YS#D%F5Vn}pqLqI?43b;$+)Gsy{8J)1;AcwkW2 zuwomb%_ njG3-qjXkG9_Wf{=K&`m$71%SuK`YJ4|g!0 zob>~m!%c4yJSAl+#u`hd=boKAZA23x=C(D{U^`27$^uYHUipYbyqPrCDOVZp9}$;I z$4uRWsWMZ4FA;PURf*>L3~XwajUKhs(kKK>9mUOj74)iPaHWlYG}{b+KO|BgLFs34 zC{Y zBY-DP1vROi&2f^eNzLtSt~8kCT}%AgI_32sNW3o}`xVdjkeeT4o>j=gKkcc4Ek&ofnX^!%k?`>wbJUdih068L zvO+N}XQ{V5hl8Mdcu|VisZPq9v^LAbQ?n2;Qz5k5r%F8zACuBf2s=skKAuyKhkcT% z)x;Ybo!KzTHJ-B6>)~no!t9-L&Sb%0iWFMvRluGy4w3bm#OwRlYztAJRu7? z*#S`lt608CG?|w;nJV>MA)*=a5o4j#EhXZL0NLU(v|G`2B$NGxnqkE}ysh8?l4uuP zatc;z8R*KC{3>bArfeib0o+JXU_=1fDJ&q*;Qm-%$Q#N_s+X%NPNxwQ%AIE{QE5h^ zyf7B#q<=v?@mL!l^h_$vtZ`9>-Psd(sdqI$yvRw@);iZaYoIX4hpCN;r{xp?kt-cG zQ%FUKZ#yWZG_d8RprBCIl&p9NlrPExjz31ZYGZj2@o?k$k{DAX*S5HMYqM$#Iax=M zz{8t@=7>|J@seKXA%-N*mwIX7EClB)c;K?s7YZZd$)AsSicDPGOZQm3Q?IOVqxL-% z)3ot4GR3NVFRhJq#A2-c4Zkv$a3d6%OPP{=FW9n-jAkcBK2cT9xO^H~#$|;TR^GU& zfXKfx-xJ1%%*^-1#91ld<93@x>i{y@<-uT?!~X?}$c!7H?*B1EzlP?Nw>dN_qgw^t46BM@ z)n-81(yAieEu2$C(adro^o62GPm$(ueTT?}9o!?*snfYgqrTd}meZIdR^WFHZ*75? zsULwlbe?MA)|-S20`79*(0_=bM^ENwrc)fR`fb z6RwFsTgYW5a;E-QSdIB-V*aErgX5&I)0|xx?!inbngZ{Kg z)ww>2W;CjxKo;sURF=vn;QqPAf)6A+LcTR1;SvfRzSU&j{eNAG9V(tN>t6o6@;Qy; zmY=qS^vatod869PFcY1ha&_J-l2u2!C{w$9(i_ClYeY{!?G?$oCj#_bVI!Ahrn-%# z;5BMq?-eP8e#$7`8;k`p->7K)1}Q3RuBRJFs-bnLN zN%n%K=21*}S2Zmdbz3b;go~?nHQOGhY?GOQfD?M9z+wQfgNyW5akaXmT%-e6F6>KD zM(TRxPn`;A);pMBp~%8YNUcFtQ>mz{#-{a!g-4xLEd66|hR7Nd6(EbMx0Y%=9m5nc?T|=aAg1}nHQ1DiZGl`%Lfts7uU4}>Oz5FlYwk&4TOsuJL+2f#qDh{ z!rx&r*VW%y+}_a^_Sc8oOk{h&4{BX#N3g!Rqb=AL2^B|zU4dXjaky?vi$4TnC`@wo zEp?%0OFGaNWOW@)^(@rf))6j<`$r$b>cVXSB6c$W_CVO=AVOQaKge4Bt*vdHe%4SI zt|K7i53^4Cqybl80d*~4BdC1`Yx0LfEFz;uW`tRXzpjBrNLwfU+D>e(?daM{tjO= zi?jr`0NOt9IsoK*2tC<_&L}?OH4MRs9^JH$jlb}74t_FW8a_U0+EvOn+^T6@T|?uV zjTjRL-kJ5QBxed=qow4jps6#{Pt(ru z*Evlur!|mv6X_z|$N4Gn5#1b81k54H0O;laE~or=KFG&{+shy1JOvLslT9nBK!U7SFwVY zVA6+W|FHTvExgAOenP*iej@u(^{d!qz^46^?8$9{e@y$xO59!~kPLW?C|%fB7;Hvt z%+2F{vZIS>A5c#4*H=utz%O%)`YQy0sHc=y6xCkTPxNCL6J6EbP~K1=qo~>|G?L5p zr1~;#7T|jtwPD~6A}Ye7^(a#NO8c_xvnNz)ZDO{eK$x8cBH!vS+Y zfP^-E8Ejm33-&J}`dDkHBy36#or%zu{-8h|cnl z2zo&2Lmsq8mG4vcedPsORxc>SirT)tA6w}sI4{v>nttsQWxtUfvo4K?%wwdx2D+it zR8s>r!=!DPx*Bv>C>cuu)fRu4_U?z3N0lV(PgmLI6w!9`sPYn_UxJE6^e`E*4#yEV ze1Ts;v7viF$?9Zj3ztoqoWxQy(`j%u{sbq}YwoI-c$B<~DqojgQD&L8TN#fWi$G93osEDe=fq8gT8}xk4nST&rkzWR_ z4B?9n{V5ThcPy0lBL6kVB0G%tiXr8gB9{q<>QPlYiIu>#Zf!sQs!{uzrX9p`W%ylj zO!yccSTYEtc>G0b{>l5?|(0`nuFA4BMz~$g0eQv;^1b#2zi=a(4>A8UO z66o}E^g=YMLz170ab*Ji8ohvD51aJTZ=4L`hX6UCgNJc~@s%VT3yh^QifI}GQ_08s~ z$vC&kV{m9LHILsNxw8l1^n&i$v zW4_RiR-AUxhdYeE*&2oY+r!M)(I)l#{LP!>xtjT48}rq-wbIFv`5OFNB2Am>I_iQ= zI1ZX%AlTSujqA2-!BNkGa4z**V@zZX2@QwG;I{gfKnTZ2Q(;H2$$(KF|In2OE>wm5 zKQj{8jkZp1*aT5c8&@GZ;-gZge+fH-w$C8RJMD*b%|NsG-U82NY>bbX^-pw*kG@>c zo=K%D_fvd$qCO7LED@b65-b=r8E#dFeo-d{8aW*xX() f!e549Bl?o11h6%v=Vv0{E7vmiBN8w#i|>B{urW6R literal 0 HcmV?d00001 diff --git a/_ln b/_ln new file mode 100644 index 0000000000000000000000000000000000000000..3a8baa60f3bc66118157ff91836d6a977ccd134a GIT binary patch literal 14536 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 z

pOv;jlfgzkN9hmNjOe}&!eph~WQ?aDMqm%AK_z9au4X38_>TOc?4|9OKb09SwOI_GJ*X3g?$BHY!Jkk0xZ)nhe&YZlD{y|r zkc;u=z!Jbc0h|ZtmkjG}k5xRVv)8Xcx&j9bxa)v%*w8n^j>BMf{6_yfdI$?ZpC8w;0Sz*j}cpYIsoN9P!9?A2d|h+({{zou(3kMWxR z7GanCkbZ#fKcF9_Gf8yP(m14dk9u`ek#9r8O{Li zUd>sc(IwvopJBW$eJJ^DS|R}UGl_U$WMy_@KS?CJx*JuOd2{ccaEaRTOG)o;qr;O998XJUU4Y0my5 z?F-fK(!YZpGzXJDton!bC%EyRfcuI5K>tGZJ^FW0WWZ+pQ1x6k;ip+g7UA?NK^S5@ zM#@IkW7rJeIK|^r+Obg>pD`x*s#F*s$xG6u{t6Bt^_2E&P4|rKB>fo1r0d4J+PfNL zG~M_$M{2vC(BELO0N?Y-4I8%yaj|hd`n~SV^o}74VPxSw@XS+NjeF$1Qja~e)wowa z2p5q72YD77h4)J1VYwJNKw96%GDHS~kU6LT=i^Rmjv; zYxQQW(^y-hN6|I4dZOZPG3Y9gTX#waz$Ip<-0MP2q27z45g1BUL&xxHHHOo}ZhHX- z?FBgX020QS`LJ>RO{nv|)*E-K`T!!PL&4|AOMSc0Ub%Z_J{kWa4`JQLDfwG=zm;d1 zL}%p%Lf_Z+Ar8h*v`5)Js=dN(^@?^<)0;PSqLhAtM_~SV+G%{D?Xsie8g~;BUx^KqP<4+YfzDlK1m~% z;|UWB{z!g=WJC9TEw@!<&6q!8c$&x@kj=r>W26`mbgJq_nc%7t+IQ8e7+GO#)A}P_ zk1=Z|v2;$Fg;390z~O>+-UPMFJx+NeuMybIUB6qlOFar#k!oQ9Q*o)b>4PxmpgnMl zmH^nJHlu)cH#SO;~xxT4>mYI5bU+UIEG7{avL>Ye$YAY zVTg}=@BxG1|KyE8FHw`I$vsFfZ~^p$uR`yBSfN2;Jm5zlA3#re_2Ly{9^}6PJ%5bn zwE`(E%F#37cx5HbS6A-WOj*FFOC0X%_!$r33ec~1>T@RGO2F>deWcd|{?fS+k={f) zu3O|IJ%;|3B>EkIuS?Rm9kBbWKlu}Y-$~-YP{0qR3CBX*(w>C9Qq>luAE=hhISpBXGnDc!N@W3Q}(*e6*Nszzq$*^q6ilt?9imr8^{(2wu)PRqd_H$~{#H2?* z`vFuv%Q_F&&Vzd`o=oxbp|o*?Y;t0|1;x0(MB8iDBE0*hi=fT>YQg| z`vLv7`i2HkRaaf#V!tfeSc$g)_EWq4Fs|MWs0ZXY{wJp~EY_}F7mcpPGiwVTi|rQz z>Rk)1#Jh-ST|8FZv@s&8v?-$gYiiRj(81TJ;ddEOXyh>=ijaJw% z0=RnoAQRo(h*u!!V=Z=H=Z<3GO)*i_(xmhkh3nR;mo1_Qwuz#urbfOW5JlDDb@AG@ zl`WN#T0HbSV11;f$sJd&TZadF7sA_zusg;??vQ9KxDRfsYN(ImC4r-`B~oj{Di{Ad zr-5KXhS((>{Wi2w>MI!xaAew@7>1sFNK-Kb^e!}hL+TzOXD}AM%Xbhpl|S$9r;u|v zX)PuLX8lB3tG)F$_7fjk+{5LY3Iz2{bO_|T+GTQRq|bE5F3E$BdG@;idd|gz_g&<7 zkDr0>V$#Gejb9k~v}#uH`cj96#^~BdVO8 h3!H*6bC13FMtoM%1nw{ZhGf1|)A3QVD}>(V`!Byb3rPR~ literal 0 HcmV?d00001 diff --git a/_sh b/_sh new file mode 100644 index 0000000000000000000000000000000000000000..ab57690c507c7016956a0b53dd968edf40b2385f GIT binary patch literal 28780 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%0DB)sv%Z1!_=u&;2VG=!;IvzFL>elZ@?)`EH`S$?! zJ{uCYlRlvMvI z;HD(_OTghIm~o~#3FglNd%yicdHfBgQ%Jjz2coN`illU(H%%3peMST$| zg!*|e!0hj6z#Ee4F9h6<8NzR`DUTnay`EHm3E=%mFqx{q6yj2}gVAaL`&)z`c%Q+O zelOtt*ywX*C;S<5?~7T&|AzWbeJpV&VE+G4yr|!Fz;7kV{|VqlN$}4ApMt*^gP!sp z28_Q9R~Pkr6tMTvC+nXC{A3b;JNeOnzOQBd5y0;z)xQk*OcMM$U_R1bOe?w-J}$JsJoW31%GBtDvM;7V5o(_clZw^mo23i0adP{Z2^z zsIfX{k2XZAH&%$%tJj9Zt8oh6h(mV$@niKLa@pFo zczfVM%9Jh@noCB*9-VM~Ikim)Y^+9@iq>*n&`V{foyE5HE0dmrD zd&d6 zq~kh%7ZTSz@5*-z>hF$F9__-U;~MH+)QM@9n|t`Ztl_b z$48heTpDH`9oKV~z3W=g1u{LTv+m!4N~XIBuFtj7ySzH)?iO8D?W}~)U{EO%%OX}d lUB)g^jTtg^SsM^{Jt4q&MVcU~d*Z!X{49WGQFo8-{{VnsY^eYM literal 0 HcmV?d00001 diff --git a/_shutdown b/_shutdown new file mode 100644 index 0000000000000000000000000000000000000000..29dbda2af3a02af949b4068d029195b0a9f83a2f GIT binary patch literal 14796 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 literal 0 HcmV?d00001 diff --git a/_stressfs b/_stressfs new file mode 100644 index 0000000000000000000000000000000000000000..77d010e580939ecf8409f755aa71e484375ce48b GIT binary patch literal 15564 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 literal 0 HcmV?d00001 diff --git a/_usertests b/_usertests new file mode 100644 index 0000000000000000000000000000000000000000..7fd23124249f475a695f5908170a931af4c188a5 GIT binary patch literal 63168 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

KjqdC)|v~yHob( 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 literal 0 HcmV?d00001 diff --git a/_wc b/_wc new file mode 100644 index 0000000000000000000000000000000000000000..0592ba9db952de1495df286f50e2de6ecad18e37 GIT binary patch literal 16104 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 Zo|b079r8Mx&Ue=(Li|EW*e93ozX00sP2B(h literal 0 HcmV?d00001 diff --git a/_zombie b/_zombie new file mode 100644 index 0000000000000000000000000000000000000000..38ee70799ba58554b65d7c3953c7dfa6b19ddc35 GIT binary patch literal 14216 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 G@4o;Sxb~9( literal 0 HcmV?d00001 diff --git a/argtest.asm b/argtest.asm new file mode 100644 index 0000000..2d20cb2 --- /dev/null +++ b/argtest.asm @@ -0,0 +1,1174 @@ + +_argtest: file format elf32-i386 + + +Disassembly of section .text: + +00000000

: +#include "types.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 08 sub $0x8,%esp + 14: 8b 31 mov (%ecx),%esi + 16: 8b 79 04 mov 0x4(%ecx),%edi + for (int i = 1; i < argc; i++) { + 19: 83 fe 01 cmp $0x1,%esi + 1c: 7e 24 jle 42 + 1e: bb 01 00 00 00 mov $0x1,%ebx + 23: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 27: 90 nop + printf(1, "Arg %d: %s\n", i, argv[i]); + 28: ff 34 9f push (%edi,%ebx,4) + 2b: 53 push %ebx + for (int i = 1; i < argc; i++) { + 2c: 83 c3 01 add $0x1,%ebx + printf(1, "Arg %d: %s\n", i, argv[i]); + 2f: 68 48 07 00 00 push $0x748 + 34: 6a 01 push $0x1 + 36: e8 e5 03 00 00 call 420 + for (int i = 1; i < argc; i++) { + 3b: 83 c4 10 add $0x10,%esp + 3e: 39 de cmp %ebx,%esi + 40: 75 e6 jne 28 + } + + exit(); + 42: e8 5c 02 00 00 call 2a3 + 47: 66 90 xchg %ax,%ax + 49: 66 90 xchg %ax,%ax + 4b: 66 90 xchg %ax,%ax + 4d: 66 90 xchg %ax,%ax + 4f: 90 nop + +00000050 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 50: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 51: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 53: 89 e5 mov %esp,%ebp + 55: 53 push %ebx + 56: 8b 4d 08 mov 0x8(%ebp),%ecx + 59: 8b 5d 0c mov 0xc(%ebp),%ebx + 5c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 60: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 64: 88 14 01 mov %dl,(%ecx,%eax,1) + 67: 83 c0 01 add $0x1,%eax + 6a: 84 d2 test %dl,%dl + 6c: 75 f2 jne 60 + ; + } + return os; +} + 6e: 8b 5d fc mov -0x4(%ebp),%ebx + 71: 89 c8 mov %ecx,%eax + 73: c9 leave + 74: c3 ret + 75: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000080 : + +int strcmp(const char *p, const char *q) { + 80: 55 push %ebp + 81: 89 e5 mov %esp,%ebp + 83: 53 push %ebx + 84: 8b 55 08 mov 0x8(%ebp),%edx + 87: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 8a: 0f b6 02 movzbl (%edx),%eax + 8d: 84 c0 test %al,%al + 8f: 75 17 jne a8 + 91: eb 3a jmp cd + 93: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 97: 90 nop + 98: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 9c: 83 c2 01 add $0x1,%edx + 9f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + a2: 84 c0 test %al,%al + a4: 74 1a je c0 + p++, q++; + a6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + a8: 0f b6 19 movzbl (%ecx),%ebx + ab: 38 c3 cmp %al,%bl + ad: 74 e9 je 98 + } + return (uchar) * p - (uchar) * q; + af: 29 d8 sub %ebx,%eax +} + b1: 8b 5d fc mov -0x4(%ebp),%ebx + b4: c9 leave + b5: c3 ret + b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + bd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + c0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + c4: 31 c0 xor %eax,%eax + c6: 29 d8 sub %ebx,%eax +} + c8: 8b 5d fc mov -0x4(%ebp),%ebx + cb: c9 leave + cc: c3 ret + return (uchar) * p - (uchar) * q; + cd: 0f b6 19 movzbl (%ecx),%ebx + d0: 31 c0 xor %eax,%eax + d2: eb db jmp af + d4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + df: 90 nop + +000000e0 : + +uint strlen(const char *s) { + e0: 55 push %ebp + e1: 89 e5 mov %esp,%ebp + e3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + e6: 80 3a 00 cmpb $0x0,(%edx) + e9: 74 15 je 100 + eb: 31 c0 xor %eax,%eax + ed: 8d 76 00 lea 0x0(%esi),%esi + f0: 83 c0 01 add $0x1,%eax + f3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + f7: 89 c1 mov %eax,%ecx + f9: 75 f5 jne f0 + ; + } + return n; +} + fb: 89 c8 mov %ecx,%eax + fd: 5d pop %ebp + fe: c3 ret + ff: 90 nop + for (n = 0; s[n]; n++) { + 100: 31 c9 xor %ecx,%ecx +} + 102: 5d pop %ebp + 103: 89 c8 mov %ecx,%eax + 105: c3 ret + 106: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 10d: 8d 76 00 lea 0x0(%esi),%esi + +00000110 : + +void* memset(void *dst, int c, uint n) { + 110: 55 push %ebp + 111: 89 e5 mov %esp,%ebp + 113: 57 push %edi + 114: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 117: 8b 4d 10 mov 0x10(%ebp),%ecx + 11a: 8b 45 0c mov 0xc(%ebp),%eax + 11d: 89 d7 mov %edx,%edi + 11f: fc cld + 120: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 122: 8b 7d fc mov -0x4(%ebp),%edi + 125: 89 d0 mov %edx,%eax + 127: c9 leave + 128: c3 ret + 129: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000130 : + +char* strchr(const char *s, char c) { + 130: 55 push %ebp + 131: 89 e5 mov %esp,%ebp + 133: 8b 45 08 mov 0x8(%ebp),%eax + 136: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 13a: 0f b6 10 movzbl (%eax),%edx + 13d: 84 d2 test %dl,%dl + 13f: 75 12 jne 153 + 141: eb 1d jmp 160 + 143: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 147: 90 nop + 148: 0f b6 50 01 movzbl 0x1(%eax),%edx + 14c: 83 c0 01 add $0x1,%eax + 14f: 84 d2 test %dl,%dl + 151: 74 0d je 160 + if (*s == c) { + 153: 38 d1 cmp %dl,%cl + 155: 75 f1 jne 148 + return (char*)s; + } + } + return 0; +} + 157: 5d pop %ebp + 158: c3 ret + 159: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 160: 31 c0 xor %eax,%eax +} + 162: 5d pop %ebp + 163: c3 ret + 164: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 16b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 16f: 90 nop + +00000170 : + +char* gets(char *buf, int max) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 57 push %edi + 174: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 175: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 178: 53 push %ebx + for (i = 0; i + 1 < max;) { + 179: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 17b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 17e: eb 27 jmp 1a7 + cc = read(0, &c, 1); + 180: 83 ec 04 sub $0x4,%esp + 183: 6a 01 push $0x1 + 185: 57 push %edi + 186: 6a 00 push $0x0 + 188: e8 2e 01 00 00 call 2bb + if (cc < 1) { + 18d: 83 c4 10 add $0x10,%esp + 190: 85 c0 test %eax,%eax + 192: 7e 1d jle 1b1 + break; + } + buf[i++] = c; + 194: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 198: 8b 55 08 mov 0x8(%ebp),%edx + 19b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 19f: 3c 0a cmp $0xa,%al + 1a1: 74 1d je 1c0 + 1a3: 3c 0d cmp $0xd,%al + 1a5: 74 19 je 1c0 + for (i = 0; i + 1 < max;) { + 1a7: 89 de mov %ebx,%esi + 1a9: 83 c3 01 add $0x1,%ebx + 1ac: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1af: 7c cf jl 180 + break; + } + } + buf[i] = '\0'; + 1b1: 8b 45 08 mov 0x8(%ebp),%eax + 1b4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1b8: 8d 65 f4 lea -0xc(%ebp),%esp + 1bb: 5b pop %ebx + 1bc: 5e pop %esi + 1bd: 5f pop %edi + 1be: 5d pop %ebp + 1bf: c3 ret + buf[i] = '\0'; + 1c0: 8b 45 08 mov 0x8(%ebp),%eax + 1c3: 89 de mov %ebx,%esi + 1c5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1c9: 8d 65 f4 lea -0xc(%ebp),%esp + 1cc: 5b pop %ebx + 1cd: 5e pop %esi + 1ce: 5f pop %edi + 1cf: 5d pop %ebp + 1d0: c3 ret + 1d1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1df: 90 nop + +000001e0 : + +int stat(const char *n, struct stat *st) { + 1e0: 55 push %ebp + 1e1: 89 e5 mov %esp,%ebp + 1e3: 56 push %esi + 1e4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 1e5: 83 ec 08 sub $0x8,%esp + 1e8: 6a 00 push $0x0 + 1ea: ff 75 08 push 0x8(%ebp) + 1ed: e8 19 01 00 00 call 30b + if (fd < 0) { + 1f2: 83 c4 10 add $0x10,%esp + 1f5: 85 c0 test %eax,%eax + 1f7: 78 27 js 220 + return -1; + } + r = fstat(fd, st); + 1f9: 83 ec 08 sub $0x8,%esp + 1fc: ff 75 0c push 0xc(%ebp) + 1ff: 89 c3 mov %eax,%ebx + 201: 50 push %eax + 202: e8 cc 00 00 00 call 2d3 + close(fd); + 207: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 20a: 89 c6 mov %eax,%esi + close(fd); + 20c: e8 2a 01 00 00 call 33b + return r; + 211: 83 c4 10 add $0x10,%esp +} + 214: 8d 65 f8 lea -0x8(%ebp),%esp + 217: 89 f0 mov %esi,%eax + 219: 5b pop %ebx + 21a: 5e pop %esi + 21b: 5d pop %ebp + 21c: c3 ret + 21d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 220: be ff ff ff ff mov $0xffffffff,%esi + 225: eb ed jmp 214 + 227: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 22e: 66 90 xchg %ax,%ax + +00000230 : + +int atoi(const char *s) { + 230: 55 push %ebp + 231: 89 e5 mov %esp,%ebp + 233: 53 push %ebx + 234: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 237: 0f be 02 movsbl (%edx),%eax + 23a: 8d 48 d0 lea -0x30(%eax),%ecx + 23d: 80 f9 09 cmp $0x9,%cl + n = 0; + 240: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 245: 77 1e ja 265 + 247: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 24e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 250: 83 c2 01 add $0x1,%edx + 253: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 256: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 25a: 0f be 02 movsbl (%edx),%eax + 25d: 8d 58 d0 lea -0x30(%eax),%ebx + 260: 80 fb 09 cmp $0x9,%bl + 263: 76 eb jbe 250 + } + return n; +} + 265: 8b 5d fc mov -0x4(%ebp),%ebx + 268: 89 c8 mov %ecx,%eax + 26a: c9 leave + 26b: c3 ret + 26c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000270 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 270: 55 push %ebp + 271: 89 e5 mov %esp,%ebp + 273: 57 push %edi + 274: 8b 45 10 mov 0x10(%ebp),%eax + 277: 8b 55 08 mov 0x8(%ebp),%edx + 27a: 56 push %esi + 27b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 27e: 85 c0 test %eax,%eax + 280: 7e 13 jle 295 + 282: 01 d0 add %edx,%eax + dst = vdst; + 284: 89 d7 mov %edx,%edi + 286: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 28d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 290: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 291: 39 f8 cmp %edi,%eax + 293: 75 fb jne 290 + } + return vdst; +} + 295: 5e pop %esi + 296: 89 d0 mov %edx,%eax + 298: 5f pop %edi + 299: 5d pop %ebp + 29a: c3 ret + +0000029b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 29b: b8 01 00 00 00 mov $0x1,%eax + 2a0: cd 40 int $0x40 + 2a2: c3 ret + +000002a3 : +SYSCALL(exit) + 2a3: b8 02 00 00 00 mov $0x2,%eax + 2a8: cd 40 int $0x40 + 2aa: c3 ret + +000002ab : +SYSCALL(wait) + 2ab: b8 03 00 00 00 mov $0x3,%eax + 2b0: cd 40 int $0x40 + 2b2: c3 ret + +000002b3 : +SYSCALL(pipe) + 2b3: b8 04 00 00 00 mov $0x4,%eax + 2b8: cd 40 int $0x40 + 2ba: c3 ret + +000002bb : +SYSCALL(read) + 2bb: b8 05 00 00 00 mov $0x5,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(kill) + 2c3: b8 06 00 00 00 mov $0x6,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(exec) + 2cb: b8 07 00 00 00 mov $0x7,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(fstat) + 2d3: b8 08 00 00 00 mov $0x8,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(chdir) + 2db: b8 09 00 00 00 mov $0x9,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(dup) + 2e3: b8 0a 00 00 00 mov $0xa,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(getpid) + 2eb: b8 0b 00 00 00 mov $0xb,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(sbrk) + 2f3: b8 0c 00 00 00 mov $0xc,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(sleep) + 2fb: b8 0d 00 00 00 mov $0xd,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(uptime) + 303: b8 0e 00 00 00 mov $0xe,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(open) + 30b: b8 0f 00 00 00 mov $0xf,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(write) + 313: b8 10 00 00 00 mov $0x10,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(mknod) + 31b: b8 11 00 00 00 mov $0x11,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(unlink) + 323: b8 12 00 00 00 mov $0x12,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(link) + 32b: b8 13 00 00 00 mov $0x13,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(mkdir) + 333: b8 14 00 00 00 mov $0x14,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(close) + 33b: b8 15 00 00 00 mov $0x15,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(getch) + 343: b8 16 00 00 00 mov $0x16,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(greeting) + 34b: b8 17 00 00 00 mov $0x17,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(shutdown) + 353: b8 18 00 00 00 mov $0x18,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(screen) + 35b: b8 19 00 00 00 mov $0x19,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(cls) + 363: b8 1a 00 00 00 mov $0x1a,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + 36b: 66 90 xchg %ax,%ax + 36d: 66 90 xchg %ax,%ax + 36f: 90 nop + +00000370 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 370: 55 push %ebp + 371: 89 e5 mov %esp,%ebp + 373: 57 push %edi + 374: 56 push %esi + 375: 53 push %ebx + 376: 83 ec 3c sub $0x3c,%esp + 379: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 37c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 37e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 381: 85 d2 test %edx,%edx + 383: 0f 89 7f 00 00 00 jns 408 + 389: f6 45 08 01 testb $0x1,0x8(%ebp) + 38d: 74 79 je 408 + neg = 1; + 38f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 396: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 398: 31 db xor %ebx,%ebx + 39a: 8d 75 d7 lea -0x29(%ebp),%esi + 39d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3a0: 89 c8 mov %ecx,%eax + 3a2: 31 d2 xor %edx,%edx + 3a4: 89 cf mov %ecx,%edi + 3a6: f7 75 c4 divl -0x3c(%ebp) + 3a9: 0f b6 92 b4 07 00 00 movzbl 0x7b4(%edx),%edx + 3b0: 89 45 c0 mov %eax,-0x40(%ebp) + 3b3: 89 d8 mov %ebx,%eax + 3b5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3b8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3bb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3be: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3c1: 76 dd jbe 3a0 + if (neg) { + 3c3: 8b 4d bc mov -0x44(%ebp),%ecx + 3c6: 85 c9 test %ecx,%ecx + 3c8: 74 0c je 3d6 + buf[i++] = '-'; + 3ca: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3cf: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3d1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3d6: 8b 7d b8 mov -0x48(%ebp),%edi + 3d9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3dd: eb 07 jmp 3e6 + 3df: 90 nop + putc(fd, buf[i]); + 3e0: 0f b6 13 movzbl (%ebx),%edx + 3e3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3e6: 83 ec 04 sub $0x4,%esp + 3e9: 88 55 d7 mov %dl,-0x29(%ebp) + 3ec: 6a 01 push $0x1 + 3ee: 56 push %esi + 3ef: 57 push %edi + 3f0: e8 1e ff ff ff call 313 + while (--i >= 0) { + 3f5: 83 c4 10 add $0x10,%esp + 3f8: 39 de cmp %ebx,%esi + 3fa: 75 e4 jne 3e0 + } +} + 3fc: 8d 65 f4 lea -0xc(%ebp),%esp + 3ff: 5b pop %ebx + 400: 5e pop %esi + 401: 5f pop %edi + 402: 5d pop %ebp + 403: c3 ret + 404: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 408: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 40f: eb 87 jmp 398 + 411: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 418: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 41f: 90 nop + +00000420 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 420: 55 push %ebp + 421: 89 e5 mov %esp,%ebp + 423: 57 push %edi + 424: 56 push %esi + 425: 53 push %ebx + 426: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 429: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 42c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 42f: 0f b6 13 movzbl (%ebx),%edx + 432: 84 d2 test %dl,%dl + 434: 74 6a je 4a0 + ap = (uint*)(void*)&fmt + 1; + 436: 8d 45 10 lea 0x10(%ebp),%eax + 439: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 43c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 43f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 441: 89 45 d0 mov %eax,-0x30(%ebp) + 444: eb 36 jmp 47c + 446: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 44d: 8d 76 00 lea 0x0(%esi),%esi + 450: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 453: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 458: 83 f8 25 cmp $0x25,%eax + 45b: 74 15 je 472 + write(fd, &c, 1); + 45d: 83 ec 04 sub $0x4,%esp + 460: 88 55 e7 mov %dl,-0x19(%ebp) + 463: 6a 01 push $0x1 + 465: 57 push %edi + 466: 56 push %esi + 467: e8 a7 fe ff ff call 313 + 46c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 46f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 472: 0f b6 13 movzbl (%ebx),%edx + 475: 83 c3 01 add $0x1,%ebx + 478: 84 d2 test %dl,%dl + 47a: 74 24 je 4a0 + c = fmt[i] & 0xff; + 47c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 47f: 85 c9 test %ecx,%ecx + 481: 74 cd je 450 + } + } + else if (state == '%') { + 483: 83 f9 25 cmp $0x25,%ecx + 486: 75 ea jne 472 + if (c == 'd') { + 488: 83 f8 25 cmp $0x25,%eax + 48b: 0f 84 07 01 00 00 je 598 + 491: 83 e8 63 sub $0x63,%eax + 494: 83 f8 15 cmp $0x15,%eax + 497: 77 17 ja 4b0 + 499: ff 24 85 5c 07 00 00 jmp *0x75c(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4a0: 8d 65 f4 lea -0xc(%ebp),%esp + 4a3: 5b pop %ebx + 4a4: 5e pop %esi + 4a5: 5f pop %edi + 4a6: 5d pop %ebp + 4a7: c3 ret + 4a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4af: 90 nop + write(fd, &c, 1); + 4b0: 83 ec 04 sub $0x4,%esp + 4b3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4b6: 6a 01 push $0x1 + 4b8: 57 push %edi + 4b9: 56 push %esi + 4ba: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4be: e8 50 fe ff ff call 313 + putc(fd, c); + 4c3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4c7: 83 c4 0c add $0xc,%esp + 4ca: 88 55 e7 mov %dl,-0x19(%ebp) + 4cd: 6a 01 push $0x1 + 4cf: 57 push %edi + 4d0: 56 push %esi + 4d1: e8 3d fe ff ff call 313 + putc(fd, c); + 4d6: 83 c4 10 add $0x10,%esp + state = 0; + 4d9: 31 c9 xor %ecx,%ecx + 4db: eb 95 jmp 472 + 4dd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 4e0: 83 ec 0c sub $0xc,%esp + 4e3: b9 10 00 00 00 mov $0x10,%ecx + 4e8: 6a 00 push $0x0 + 4ea: 8b 45 d0 mov -0x30(%ebp),%eax + 4ed: 8b 10 mov (%eax),%edx + 4ef: 89 f0 mov %esi,%eax + 4f1: e8 7a fe ff ff call 370 + ap++; + 4f6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 4fa: 83 c4 10 add $0x10,%esp + state = 0; + 4fd: 31 c9 xor %ecx,%ecx + 4ff: e9 6e ff ff ff jmp 472 + 504: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 508: 8b 45 d0 mov -0x30(%ebp),%eax + 50b: 8b 10 mov (%eax),%edx + ap++; + 50d: 83 c0 04 add $0x4,%eax + 510: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 513: 85 d2 test %edx,%edx + 515: 0f 84 8d 00 00 00 je 5a8 + while (*s != 0) { + 51b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 51e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 520: 84 c0 test %al,%al + 522: 0f 84 4a ff ff ff je 472 + 528: 89 5d d4 mov %ebx,-0x2c(%ebp) + 52b: 89 d3 mov %edx,%ebx + 52d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 530: 83 ec 04 sub $0x4,%esp + s++; + 533: 83 c3 01 add $0x1,%ebx + 536: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 539: 6a 01 push $0x1 + 53b: 57 push %edi + 53c: 56 push %esi + 53d: e8 d1 fd ff ff call 313 + while (*s != 0) { + 542: 0f b6 03 movzbl (%ebx),%eax + 545: 83 c4 10 add $0x10,%esp + 548: 84 c0 test %al,%al + 54a: 75 e4 jne 530 + state = 0; + 54c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 54f: 31 c9 xor %ecx,%ecx + 551: e9 1c ff ff ff jmp 472 + 556: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 55d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 560: 83 ec 0c sub $0xc,%esp + 563: b9 0a 00 00 00 mov $0xa,%ecx + 568: 6a 01 push $0x1 + 56a: e9 7b ff ff ff jmp 4ea + 56f: 90 nop + putc(fd, *ap); + 570: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 573: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 576: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 578: 6a 01 push $0x1 + 57a: 57 push %edi + 57b: 56 push %esi + putc(fd, *ap); + 57c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 57f: e8 8f fd ff ff call 313 + ap++; + 584: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 588: 83 c4 10 add $0x10,%esp + state = 0; + 58b: 31 c9 xor %ecx,%ecx + 58d: e9 e0 fe ff ff jmp 472 + 592: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 598: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 59b: 83 ec 04 sub $0x4,%esp + 59e: e9 2a ff ff ff jmp 4cd + 5a3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5a7: 90 nop + s = "(null)"; + 5a8: ba 54 07 00 00 mov $0x754,%edx + while (*s != 0) { + 5ad: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5b0: b8 28 00 00 00 mov $0x28,%eax + 5b5: 89 d3 mov %edx,%ebx + 5b7: e9 74 ff ff ff jmp 530 + 5bc: 66 90 xchg %ax,%ax + 5be: 66 90 xchg %ax,%ax + +000005c0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5c0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5c1: a1 68 0a 00 00 mov 0xa68,%eax +void free(void *ap) { + 5c6: 89 e5 mov %esp,%ebp + 5c8: 57 push %edi + 5c9: 56 push %esi + 5ca: 53 push %ebx + 5cb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5ce: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5d1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5d8: 89 c2 mov %eax,%edx + 5da: 8b 00 mov (%eax),%eax + 5dc: 39 ca cmp %ecx,%edx + 5de: 73 30 jae 610 + 5e0: 39 c1 cmp %eax,%ecx + 5e2: 72 04 jb 5e8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5e4: 39 c2 cmp %eax,%edx + 5e6: 72 f0 jb 5d8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 5e8: 8b 73 fc mov -0x4(%ebx),%esi + 5eb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5ee: 39 f8 cmp %edi,%eax + 5f0: 74 30 je 622 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 5f2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 5f5: 8b 42 04 mov 0x4(%edx),%eax + 5f8: 8d 34 c2 lea (%edx,%eax,8),%esi + 5fb: 39 f1 cmp %esi,%ecx + 5fd: 74 3a je 639 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 5ff: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 601: 5b pop %ebx + freep = p; + 602: 89 15 68 0a 00 00 mov %edx,0xa68 +} + 608: 5e pop %esi + 609: 5f pop %edi + 60a: 5d pop %ebp + 60b: c3 ret + 60c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 610: 39 c2 cmp %eax,%edx + 612: 72 c4 jb 5d8 + 614: 39 c1 cmp %eax,%ecx + 616: 73 c0 jae 5d8 + if (bp + bp->s.size == p->s.ptr) { + 618: 8b 73 fc mov -0x4(%ebx),%esi + 61b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 61e: 39 f8 cmp %edi,%eax + 620: 75 d0 jne 5f2 + bp->s.size += p->s.ptr->s.size; + 622: 03 70 04 add 0x4(%eax),%esi + 625: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 628: 8b 02 mov (%edx),%eax + 62a: 8b 00 mov (%eax),%eax + 62c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 62f: 8b 42 04 mov 0x4(%edx),%eax + 632: 8d 34 c2 lea (%edx,%eax,8),%esi + 635: 39 f1 cmp %esi,%ecx + 637: 75 c6 jne 5ff + p->s.size += bp->s.size; + 639: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 63c: 89 15 68 0a 00 00 mov %edx,0xa68 + p->s.size += bp->s.size; + 642: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 645: 8b 4b f8 mov -0x8(%ebx),%ecx + 648: 89 0a mov %ecx,(%edx) +} + 64a: 5b pop %ebx + 64b: 5e pop %esi + 64c: 5f pop %edi + 64d: 5d pop %ebp + 64e: c3 ret + 64f: 90 nop + +00000650 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 650: 55 push %ebp + 651: 89 e5 mov %esp,%ebp + 653: 57 push %edi + 654: 56 push %esi + 655: 53 push %ebx + 656: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 659: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 65c: 8b 3d 68 0a 00 00 mov 0xa68,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 662: 8d 70 07 lea 0x7(%eax),%esi + 665: c1 ee 03 shr $0x3,%esi + 668: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 66b: 85 ff test %edi,%edi + 66d: 0f 84 9d 00 00 00 je 710 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 673: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 675: 8b 4a 04 mov 0x4(%edx),%ecx + 678: 39 f1 cmp %esi,%ecx + 67a: 73 6a jae 6e6 + 67c: bb 00 10 00 00 mov $0x1000,%ebx + 681: 39 de cmp %ebx,%esi + 683: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 686: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 68d: 89 45 e4 mov %eax,-0x1c(%ebp) + 690: eb 17 jmp 6a9 + 692: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 698: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 69a: 8b 48 04 mov 0x4(%eax),%ecx + 69d: 39 f1 cmp %esi,%ecx + 69f: 73 4f jae 6f0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6a1: 8b 3d 68 0a 00 00 mov 0xa68,%edi + 6a7: 89 c2 mov %eax,%edx + 6a9: 39 d7 cmp %edx,%edi + 6ab: 75 eb jne 698 + p = sbrk(nu * sizeof(Header)); + 6ad: 83 ec 0c sub $0xc,%esp + 6b0: ff 75 e4 push -0x1c(%ebp) + 6b3: e8 3b fc ff ff call 2f3 + if (p == (char*)-1) { + 6b8: 83 c4 10 add $0x10,%esp + 6bb: 83 f8 ff cmp $0xffffffff,%eax + 6be: 74 1c je 6dc + hp->s.size = nu; + 6c0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6c3: 83 ec 0c sub $0xc,%esp + 6c6: 83 c0 08 add $0x8,%eax + 6c9: 50 push %eax + 6ca: e8 f1 fe ff ff call 5c0 + return freep; + 6cf: 8b 15 68 0a 00 00 mov 0xa68,%edx + if ((p = morecore(nunits)) == 0) { + 6d5: 83 c4 10 add $0x10,%esp + 6d8: 85 d2 test %edx,%edx + 6da: 75 bc jne 698 + return 0; + } + } + } +} + 6dc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6df: 31 c0 xor %eax,%eax +} + 6e1: 5b pop %ebx + 6e2: 5e pop %esi + 6e3: 5f pop %edi + 6e4: 5d pop %ebp + 6e5: c3 ret + if (p->s.size >= nunits) { + 6e6: 89 d0 mov %edx,%eax + 6e8: 89 fa mov %edi,%edx + 6ea: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 6f0: 39 ce cmp %ecx,%esi + 6f2: 74 4c je 740 + p->s.size -= nunits; + 6f4: 29 f1 sub %esi,%ecx + 6f6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 6f9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 6fc: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 6ff: 89 15 68 0a 00 00 mov %edx,0xa68 +} + 705: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 708: 83 c0 08 add $0x8,%eax +} + 70b: 5b pop %ebx + 70c: 5e pop %esi + 70d: 5f pop %edi + 70e: 5d pop %ebp + 70f: c3 ret + base.s.ptr = freep = prevp = &base; + 710: c7 05 68 0a 00 00 6c movl $0xa6c,0xa68 + 717: 0a 00 00 + base.s.size = 0; + 71a: bf 6c 0a 00 00 mov $0xa6c,%edi + base.s.ptr = freep = prevp = &base; + 71f: c7 05 6c 0a 00 00 6c movl $0xa6c,0xa6c + 726: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 729: 89 fa mov %edi,%edx + base.s.size = 0; + 72b: c7 05 70 0a 00 00 00 movl $0x0,0xa70 + 732: 00 00 00 + if (p->s.size >= nunits) { + 735: e9 42 ff ff ff jmp 67c + 73a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 740: 8b 08 mov (%eax),%ecx + 742: 89 0a mov %ecx,(%edx) + 744: eb b9 jmp 6ff diff --git a/argtest.d b/argtest.d new file mode 100644 index 0000000..2c57752 --- /dev/null +++ b/argtest.d @@ -0,0 +1 @@ +argtest.o: argtest.c /usr/include/stdc-predef.h types.h user.h diff --git a/argtest.o b/argtest.o new file mode 100644 index 0000000000000000000000000000000000000000..2afe6e0bee877a58df8358358fb0571c1f2b03dd GIT binary patch literal 3276 zcma)8TWDNG7@j$oO`1)UO{2!NO178SRNPHB4b`Ttt!*_%shz~;X#Ru`h7cbzGDEQ!uJ}M%D7mA2lpA?Jn`(|gdCy3M^X1@P6|IB~R zKmR$W?mT>#lu{Uy!WJz_hzspa%cz1Ou|cdCcSN<~;Otm&Fzyg%4{vdnzW;6cnJZH- z|M1X*lSh|+Za-5wbHZ8rTb|tVAw!)_ZW8B~M=wq;eJtl0<|%pU%JTB^(kF#o-=se( z{wJtiAsw3Cn=#!;t^?zGGMc2*MowC7>j<*_G9b4Wla+JF0d0;Ogo$WhgMF=SxjCq8 z>TPmsgcSj#%sDW3JPkg-OogM?f)n(WuYZTRbC9glMU8b{tSw-Pbk@_vy*n|wIDLuH z9SG?v&z+EXdS^GL`!IyV0F;Dvi4%7fa*N34Z_nFZP;`s@MrWcIXLJR@xm&y-Pl0iJ zXW&fUjq^;xOUA32G)@4t>M5r}< zh#fbn`1#ci6TLlhU2gyN&nd@FSD5eXOHLeqru(>|N6%0*}Mu$**;N3BFSqhnV3q%*eL zj!#{5b{~+F;s&g-)VkIde8h$}fHB*teT$qErrv>*lVrQ1dbk_M;Jl}|t;wrrt)v99rzNzBD%B{sp zrM#oOy;xepn;s!x{|qekLalZI9<20pA_d?KvQM~$$N z#-%iTHV9`+i8oXCV;JLv>#B7xo;Rz5MkrPitIm6oSnz^SC~h&ro^t}J9^;hwaZ;{| z;RSy-@P^~L>B$rEk*HA{_Tt!&;{`uVMy_IQMQL$q>_=tvq49$U$BIK!GijKl`iYh* zsS+zEM@GuqN4IG;-~Kh6K=QcHJmrygeK*yRSsX9E=DaAy=wNi1Y+fEmA zg*GdFzL2xh;|1GFlcr~DX6YGn#AWuQ6|z@dBXkIqZkFt3Rj;UQw74wUs)4pNwm`$l zkSz)siSgOmT4ak}k=G(~TZjF#E6AfCtdO#`9<+L~`kkt>-VRTRD|9Q+Li0RGME6G9 zLIXv!AtD9U+|m25qYPY6#0B0&g!4A-r{ck%@wje}#``sf8jovSBBJZOqUAR(ufwQWVJu^Y-0R`6|`RE13fyl@>AzWKCBt$Rnf?=2Ic)k z_!of|P?X~n3%E?cBx>Tk;S&FNBFeK~;)(K19E)<)pg_+`xdPFzm+1qA7bWRpQ#0$& zq_ycFoNHjM;=P%f$Ul~~)*ID&5GM?Y7}_iH!kWKI6@|5bxz&TvH-T{w!%{u1D+ z>ixlQ1cStQDCZU8z8w2Bn)B_4JdRNHy$OW&UF-Masn$( zWBfu!ld;_kIUDaq#QOj`#%sec@ty#0)_@f$gs;hHGPVX}!_#!s5@K5W5R8rgHrajm zU^C{(eNo;k`!0buYru+k5U)r^ld+wGoQ-!l6OYf^v<5;(Z}^PytU%o^evq^W2Kes^o0z&uDlVPx~Y zfP8shm@j*^$u}DdYO#oT-vZeO`8}Z@pATc1y9QPqL7kd!DP_hX^c-6 literal 0 HcmV?d00001 diff --git a/argtest.sym b/argtest.sym new file mode 100644 index 0000000..69f8e8c --- /dev/null +++ b/argtest.sym @@ -0,0 +1,50 @@ +00000000 argtest.c +00000000 ulib.c +00000000 printf.c +00000370 printint +000007b4 digits.0 +00000000 umalloc.c +00000a68 freep +00000a6c base +00000050 strcpy +00000420 printf +0000034b greeting +00000270 memmove +0000031b mknod +00000170 gets +000002eb getpid +0000035b screen +00000650 malloc +000002fb sleep +000002b3 pipe +00000343 getch +00000313 write +000002d3 fstat +000002c3 kill +000002db chdir +000002cb exec +000002ab wait +000002bb read +00000323 unlink +0000029b fork +000002f3 sbrk +00000303 uptime +00000a68 __bss_start +00000110 memset +00000000 main +00000080 strcmp +00000353 shutdown +000002e3 dup +000001e0 stat +00000a68 _edata +00000a74 _end +0000032b link +000002a3 exit +00000230 atoi +00000363 cls +000000e0 strlen +0000030b open +00000130 strchr +00000333 mkdir +0000033b close +000005c0 free diff --git a/bio.d b/bio.d new file mode 100644 index 0000000..b4bbd30 --- /dev/null +++ b/bio.d @@ -0,0 +1,2 @@ +bio.o: bio.c /usr/include/stdc-predef.h types.h defs.h param.h spinlock.h \ + sleeplock.h fs.h buf.h diff --git a/bio.o b/bio.o new file mode 100644 index 0000000000000000000000000000000000000000..23624393981f3cb9db1e329e718baf83de4afa09 GIT binary patch literal 7012 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 literal 0 HcmV?d00001 diff --git a/bootasm.d b/bootasm.d new file mode 100644 index 0000000..3b3dc19 --- /dev/null +++ b/bootasm.d @@ -0,0 +1 @@ +bootasm.o: bootasm.S asm.h memlayout.h mmu.h diff --git a/bootasm.o b/bootasm.o new file mode 100644 index 0000000000000000000000000000000000000000..0db07ccdd1f1cac0a1de6af735c79864c42a55b5 GIT binary patch literal 1708 zcma)6OH30{6ur|Hzt9#TV8loTNr;~r+8To~CXo1vK@ADIz^E{_(~qGo=?n%|YTTNJ zxOC~tr3)7 z>}VpfSl~JB!>DviQnu60#>Ymp@%~HxWn^jl)rXCI$Ube%Cyc(5BvQ@7lXpg9sQEQ5 zd!(?Ilpvz8Cerxa*nGoun?G8u*0-OlK?RXk3+(xNfX~*YU#4NWi`5}9ISxdp-{V~b z_J{>C=(ig&1|x~c5m;rEAL)qj8|^fPEz8PU)|i#%Cp&w7YVyt$Y*SWx_IBhbQdkuy zU$!l`FgLT}PSaupjUNg=!!EuRYU0?_CZxdM#DMeb9F ze~7qW{9cH>58~O-&r=$>RD_CwNAC{peZ)?YLm_e^sqZ2pC`sg%neIx(vvWYN9$-na zy0c(<&ax+F-u7%UbFM2Ujd>@xRGeEVR~@+8d=7ECzg#WUl;6(f>dph*YuD{+(Lur> z0b~DH2H86n&qCpUfh(#LfpM1U`6U_7Q2Aoo!C zo6+lzqb_r^F3+dx&V#EMP`L%Amn0PBd*CLb@Nhr)o;T!37OQ@TKjdd~7?YfV_ znNOW}6$*8bRksLSZfne>?iVWhhU5Pw-Lu FegQg&ySo4Y literal 0 HcmV?d00001 diff --git a/bootblock b/bootblock new file mode 100644 index 0000000000000000000000000000000000000000..ccebab4e51219d356eaa3c71debb09e5867b6800 GIT binary patch literal 512 zcmexmc%bh_-+{ghPf}JemHygr@mUI#b^locKciSi4Zp&HwB{3x{7MI28P;$xr0o!3 zfaplu!NAb>pzp;Vh8hNj7Y`U17+(LI03^ZS|9>Dg>pTOPo^+l;oFM?HYS(v028K7y z4-VKkl>Rsz+W9m*xI32T#nb=)|L*|GFzosSB;W1&3?w^myz9Ji@CC=NFCZZhQ()Iu z7*nG8#DiVmK)f9aAZ;LH-@TXzG^V?jV`l?M=mSvb&*$9e_*k$#VZqIBc)DXbx=RH* z?=#o(bbe6%4^*Lf_~1Lv=3|VO_sgW3-*AKlzeoof(s-DGiGcwq+: +# with %cs=0 %ip=7c00. + +.code16 # Assemble for 16-bit mode +.globl start +start: + cli # BIOS enabled interrupts; disable + 7c00: fa cli + + # Zero data segment registers DS, ES, and SS. + xorw %ax,%ax # Set %ax to zero + 7c01: 31 c0 xor %eax,%eax + movw %ax,%ds # -> Data Segment + 7c03: 8e d8 mov %eax,%ds + movw %ax,%es # -> Extra Segment + 7c05: 8e c0 mov %eax,%es + movw %ax,%ss # -> Stack Segment + 7c07: 8e d0 mov %eax,%ss + +00007c09 : + + # Physical address line A20 is tied to zero so that the first PCs + # with 2 MB would run software that assumed 1 MB. Undo that. +seta20.1: + inb $0x64,%al # Wait for not busy + 7c09: e4 64 in $0x64,%al + testb $0x2,%al + 7c0b: a8 02 test $0x2,%al + jnz seta20.1 + 7c0d: 75 fa jne 7c09 + + movb $0xd1,%al # 0xd1 -> port 0x64 + 7c0f: b0 d1 mov $0xd1,%al + outb %al,$0x64 + 7c11: e6 64 out %al,$0x64 + +00007c13 : + +seta20.2: + inb $0x64,%al # Wait for not busy + 7c13: e4 64 in $0x64,%al + testb $0x2,%al + 7c15: a8 02 test $0x2,%al + jnz seta20.2 + 7c17: 75 fa jne 7c13 + + movb $0xdf,%al # 0xdf -> port 0x60 + 7c19: b0 df mov $0xdf,%al + outb %al,$0x60 + 7c1b: e6 60 out %al,$0x60 + + # Switch from real to protected mode. Use a bootstrap GDT that makes + # virtual addresses map directly to physical addresses so that the + # effective memory map doesn't change during the transition. + lgdt gdtdesc + 7c1d: 0f 01 16 lgdtl (%esi) + 7c20: 68 7c 0f 20 c0 push $0xc0200f7c + movl %cr0, %eax + orl $CR0_PE, %eax + 7c25: 66 83 c8 01 or $0x1,%ax + movl %eax, %cr0 + 7c29: 0f 22 c0 mov %eax,%cr0 + + # Complete the transition to 32-bit protected mode by using a long jmp + # to reload %cs and %eip. The segment descriptors are set up with no + # translation, so that the mapping is still the identity mapping. + ljmp $(SEG_KCODE<<3), $start32 + 7c2c: ea .byte 0xea + 7c2d: 31 7c 08 00 xor %edi,0x0(%eax,%ecx,1) + +00007c31 : + +.code32 # Tell assembler to generate 32-bit code now. +start32: + # Set up the protected-mode data segment registers + movw $(SEG_KDATA<<3), %ax # Our data segment selector + 7c31: 66 b8 10 00 mov $0x10,%ax + movw %ax, %ds # -> DS: Data Segment + 7c35: 8e d8 mov %eax,%ds + movw %ax, %es # -> ES: Extra Segment + 7c37: 8e c0 mov %eax,%es + movw %ax, %ss # -> SS: Stack Segment + 7c39: 8e d0 mov %eax,%ss + movw $0, %ax # Zero segments not ready for use + 7c3b: 66 b8 00 00 mov $0x0,%ax + movw %ax, %fs # -> FS + 7c3f: 8e e0 mov %eax,%fs + movw %ax, %gs # -> GS + 7c41: 8e e8 mov %eax,%gs + + # Set up the stack pointer and call into C. + movl $start, %esp + 7c43: bc 00 7c 00 00 mov $0x7c00,%esp + call bootmain + 7c48: e8 e0 00 00 00 call 7d2d + +00007c4d : + + # If bootmain returns (it shouldn't), loop. +spin: + jmp spin + 7c4d: eb fe jmp 7c4d + 7c4f: 90 nop + +00007c50 : + ... + 7c58: ff (bad) + 7c59: ff 00 incl (%eax) + 7c5b: 00 00 add %al,(%eax) + 7c5d: 9a cf 00 ff ff 00 00 lcall $0x0,$0xffff00cf + 7c64: 00 .byte 0x0 + 7c65: 92 xchg %eax,%edx + 7c66: cf iret + ... + +00007c68 : + 7c68: 17 pop %ss + 7c69: 00 50 7c add %dl,0x7c(%eax) + ... + +00007c6e : +// Routines to let C code use special x86 instructions. + +static inline uchar inb(ushort port) { + uchar data; + + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); + 7c6e: ba f7 01 00 00 mov $0x1f7,%edx + 7c73: ec in (%dx),%al + entry(); +} + +void waitdisk(void) { + // Wait for disk ready. + while ((inb(0x1F7) & 0xC0) != 0x40) { + 7c74: 83 e0 c0 and $0xffffffc0,%eax + 7c77: 3c 40 cmp $0x40,%al + 7c79: 75 f8 jne 7c73 + ; + } +} + 7c7b: c3 ret + +00007c7c : + +// Read a single sector at offset into dst. +void readsect(void *dst, uint offset) { + 7c7c: 55 push %ebp + 7c7d: 89 e5 mov %esp,%ebp + 7c7f: 57 push %edi + 7c80: 53 push %ebx + 7c81: 8b 5d 0c mov 0xc(%ebp),%ebx + // Issue command. + waitdisk(); + 7c84: e8 e5 ff ff ff call 7c6e + "d" (port), "0" (addr), "1" (cnt) : + "memory", "cc"); +} + +static inline void outb(ushort port, uchar data) { + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); + 7c89: b8 01 00 00 00 mov $0x1,%eax + 7c8e: ba f2 01 00 00 mov $0x1f2,%edx + 7c93: ee out %al,(%dx) + 7c94: ba f3 01 00 00 mov $0x1f3,%edx + 7c99: 89 d8 mov %ebx,%eax + 7c9b: ee out %al,(%dx) + outb(0x1F2, 1); // count = 1 + outb(0x1F3, offset); + outb(0x1F4, offset >> 8); + 7c9c: 89 d8 mov %ebx,%eax + 7c9e: c1 e8 08 shr $0x8,%eax + 7ca1: ba f4 01 00 00 mov $0x1f4,%edx + 7ca6: ee out %al,(%dx) + outb(0x1F5, offset >> 16); + 7ca7: 89 d8 mov %ebx,%eax + 7ca9: c1 e8 10 shr $0x10,%eax + 7cac: ba f5 01 00 00 mov $0x1f5,%edx + 7cb1: ee out %al,(%dx) + outb(0x1F6, (offset >> 24) | 0xE0); + 7cb2: 89 d8 mov %ebx,%eax + 7cb4: c1 e8 18 shr $0x18,%eax + 7cb7: 83 c8 e0 or $0xffffffe0,%eax + 7cba: ba f6 01 00 00 mov $0x1f6,%edx + 7cbf: ee out %al,(%dx) + 7cc0: b8 20 00 00 00 mov $0x20,%eax + 7cc5: ba f7 01 00 00 mov $0x1f7,%edx + 7cca: ee out %al,(%dx) + outb(0x1F7, 0x20); // cmd 0x20 - read sectors + + // Read data. + waitdisk(); + 7ccb: e8 9e ff ff ff call 7c6e + asm volatile ("cld; rep insl" : + 7cd0: 8b 7d 08 mov 0x8(%ebp),%edi + 7cd3: b9 80 00 00 00 mov $0x80,%ecx + 7cd8: ba f0 01 00 00 mov $0x1f0,%edx + 7cdd: fc cld + 7cde: f3 6d rep insl (%dx),%es:(%edi) + insl(0x1F0, dst, SECTSIZE / 4); +} + 7ce0: 5b pop %ebx + 7ce1: 5f pop %edi + 7ce2: 5d pop %ebp + 7ce3: c3 ret + +00007ce4 : + +// Read 'count' bytes at 'offset' from kernel into physical address 'pa'. +// Might copy more than asked. + +void readseg(uchar* pa, uint count, uint offset) { + 7ce4: 55 push %ebp + 7ce5: 89 e5 mov %esp,%ebp + 7ce7: 57 push %edi + 7ce8: 56 push %esi + 7ce9: 53 push %ebx + 7cea: 83 ec 0c sub $0xc,%esp + 7ced: 8b 5d 08 mov 0x8(%ebp),%ebx + 7cf0: 8b 75 10 mov 0x10(%ebp),%esi + uchar* epa; + + epa = pa + count; + 7cf3: 89 df mov %ebx,%edi + 7cf5: 03 7d 0c add 0xc(%ebp),%edi + + // Round down to sector boundary. + pa -= offset % SECTSIZE; + 7cf8: 89 f0 mov %esi,%eax + 7cfa: 25 ff 01 00 00 and $0x1ff,%eax + 7cff: 29 c3 sub %eax,%ebx + + // Translate from bytes to sectors; kernel starts at sector 1. + offset = (offset / SECTSIZE) + 1; + 7d01: c1 ee 09 shr $0x9,%esi + 7d04: 83 c6 01 add $0x1,%esi + + // If this is too slow, we could read lots of sectors at a time. + // We'd write more to memory than asked, but it doesn't matter -- + // we load in increasing order. + for (; pa < epa; pa += SECTSIZE, offset++) { + 7d07: 39 df cmp %ebx,%edi + 7d09: 76 1a jbe 7d25 + readsect(pa, offset); + 7d0b: 83 ec 08 sub $0x8,%esp + 7d0e: 56 push %esi + 7d0f: 53 push %ebx + 7d10: e8 67 ff ff ff call 7c7c + for (; pa < epa; pa += SECTSIZE, offset++) { + 7d15: 81 c3 00 02 00 00 add $0x200,%ebx + 7d1b: 83 c6 01 add $0x1,%esi + 7d1e: 83 c4 10 add $0x10,%esp + 7d21: 39 df cmp %ebx,%edi + 7d23: 77 e6 ja 7d0b + } +} + 7d25: 8d 65 f4 lea -0xc(%ebp),%esp + 7d28: 5b pop %ebx + 7d29: 5e pop %esi + 7d2a: 5f pop %edi + 7d2b: 5d pop %ebp + 7d2c: c3 ret + +00007d2d : +void bootmain(void) { + 7d2d: 55 push %ebp + 7d2e: 89 e5 mov %esp,%ebp + 7d30: 57 push %edi + 7d31: 56 push %esi + 7d32: 53 push %ebx + 7d33: 83 ec 10 sub $0x10,%esp + readseg((uchar*)elf, 4096, 0); + 7d36: 6a 00 push $0x0 + 7d38: 68 00 10 00 00 push $0x1000 + 7d3d: 68 00 00 01 00 push $0x10000 + 7d42: e8 9d ff ff ff call 7ce4 + if (elf->magic != ELF_MAGIC) { + 7d47: 83 c4 10 add $0x10,%esp + 7d4a: 81 3d 00 00 01 00 7f cmpl $0x464c457f,0x10000 + 7d51: 45 4c 46 + 7d54: 75 21 jne 7d77 + ph = (struct proghdr*)((uchar*)elf + elf->phoff); + 7d56: a1 1c 00 01 00 mov 0x1001c,%eax + 7d5b: 8d 98 00 00 01 00 lea 0x10000(%eax),%ebx + eph = ph + elf->phnum; + 7d61: 0f b7 35 2c 00 01 00 movzwl 0x1002c,%esi + 7d68: c1 e6 05 shl $0x5,%esi + 7d6b: 01 de add %ebx,%esi + for (; ph < eph; ph++) { + 7d6d: 39 f3 cmp %esi,%ebx + 7d6f: 72 15 jb 7d86 + entry(); + 7d71: ff 15 18 00 01 00 call *0x10018 +} + 7d77: 8d 65 f4 lea -0xc(%ebp),%esp + 7d7a: 5b pop %ebx + 7d7b: 5e pop %esi + 7d7c: 5f pop %edi + 7d7d: 5d pop %ebp + 7d7e: c3 ret + for (; ph < eph; ph++) { + 7d7f: 83 c3 20 add $0x20,%ebx + 7d82: 39 de cmp %ebx,%esi + 7d84: 76 eb jbe 7d71 + pa = (uchar*)ph->paddr; + 7d86: 8b 7b 0c mov 0xc(%ebx),%edi + readseg(pa, ph->filesz, ph->off); + 7d89: 83 ec 04 sub $0x4,%esp + 7d8c: ff 73 04 push 0x4(%ebx) + 7d8f: ff 73 10 push 0x10(%ebx) + 7d92: 57 push %edi + 7d93: e8 4c ff ff ff call 7ce4 + if (ph->memsz > ph->filesz) { + 7d98: 8b 4b 14 mov 0x14(%ebx),%ecx + 7d9b: 8b 43 10 mov 0x10(%ebx),%eax + 7d9e: 83 c4 10 add $0x10,%esp + 7da1: 39 c1 cmp %eax,%ecx + 7da3: 76 da jbe 7d7f + stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz); + 7da5: 01 c7 add %eax,%edi + 7da7: 29 c1 sub %eax,%ecx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 7da9: b8 00 00 00 00 mov $0x0,%eax + 7dae: fc cld + 7daf: f3 aa rep stos %al,%es:(%edi) + "=D" (addr), "=c" (cnt) : + "0" (addr), "1" (cnt), "a" (data) : + "memory", "cc"); +} + 7db1: eb cc jmp 7d7f diff --git a/bootblock.o b/bootblock.o new file mode 100644 index 0000000000000000000000000000000000000000..485cd592cf16cba8b689852e740f7773ca3912ca GIT binary patch literal 5688 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 literal 0 HcmV?d00001 diff --git a/bootblockother.o b/bootblockother.o new file mode 100644 index 0000000000000000000000000000000000000000..83514b1b631c7a68469c442e0d855eab51888f4a GIT binary patch literal 1268 zcma)6&ubG=5T3Vbv?|ReT3exF*VbZD%-W=&NYm1T3Pwa|6(WVWF`FM^ez9)nDW?H0&!#?EB$;@b6RI&Q7P>**3+H-!`poWo=WKW8KOJ z3+jHVY$PcVR5pk@yPfx@wY#>NG{<(|d~Fe#V>?(hAV{oY)$@s;sP&G1L;Uy)J)2g2yrQ3@e2Akr?2_Cj|!>Wk`k?HB93KLlr1)@ch^@F>c#-wvfxuujhgC_Eau6 zTbRui=4$s13j^Gy?=83dn(L(($Zojhx?{^qaba2B^jcNhks-neDWFIbs$ z_ToR3dxr9+_L|yqSn8uMy#%nYPLYd(h7kFS1t!!h-HGsVG=fuSg`m@jD`7tgp8bno z0)HCmp9AOPVPic-_S>Rr*)O~D9!cNv{A`9~yWZp?6^kV)i>gdTx9s>1QnO5ymdg#_ zDIxn_kZT(G?h~KVWw-RGT68?8S#_nR^=74|u~RB}?qkg!)SIrx7^ESW@pv!T_Gx#Yjiu7h8nA?L`G{_({J>wd< z#@w0&xyv9l-MbCWn4izK4ss!YDsqqA3A5I{MUiioHm&0v+|{7-35C~y2jKhQd@jk5 ehkrw0L@%&tPN5+19JUlZs(T0BL)8g_*8K)Z6SWrr literal 0 HcmV?d00001 diff --git a/bootmain.d b/bootmain.d new file mode 100644 index 0000000..b32eaf5 --- /dev/null +++ b/bootmain.d @@ -0,0 +1 @@ +bootmain.o: bootmain.c types.h elf.h x86.h memlayout.h diff --git a/bootmain.o b/bootmain.o new file mode 100644 index 0000000000000000000000000000000000000000..0734b9195426bedc42a394220e273f57b5df7316 GIT binary patch literal 6804 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 literal 0 HcmV?d00001 diff --git a/cat.asm b/cat.asm new file mode 100644 index 0000000..c6fa4ab --- /dev/null +++ b/cat.asm @@ -0,0 +1,1268 @@ + +_cat: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: + printf(1, "cat: read error\n"); + exit(); + } +} + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: be 01 00 00 00 mov $0x1,%esi + 14: 53 push %ebx + 15: 51 push %ecx + 16: 83 ec 18 sub $0x18,%esp + 19: 8b 01 mov (%ecx),%eax + 1b: 8b 59 04 mov 0x4(%ecx),%ebx + 1e: 89 45 e4 mov %eax,-0x1c(%ebp) + 21: 83 c3 04 add $0x4,%ebx + int fd, i; + + if (argc <= 1) { + 24: 83 f8 01 cmp $0x1,%eax + 27: 7e 54 jle 7d + 29: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + cat(0); + exit(); + } + + for (i = 1; i < argc; i++) { + if ((fd = open(argv[i], 0)) < 0) { + 30: 83 ec 08 sub $0x8,%esp + 33: 6a 00 push $0x0 + 35: ff 33 push (%ebx) + 37: e8 8f 03 00 00 call 3cb + 3c: 83 c4 10 add $0x10,%esp + 3f: 89 c7 mov %eax,%edi + 41: 85 c0 test %eax,%eax + 43: 78 24 js 69 + printf(1, "cat: cannot open %s\n", argv[i]); + exit(); + } + cat(fd); + 45: 83 ec 0c sub $0xc,%esp + for (i = 1; i < argc; i++) { + 48: 83 c6 01 add $0x1,%esi + 4b: 83 c3 04 add $0x4,%ebx + cat(fd); + 4e: 50 push %eax + 4f: e8 3c 00 00 00 call 90 + close(fd); + 54: 89 3c 24 mov %edi,(%esp) + 57: e8 9f 03 00 00 call 3fb + for (i = 1; i < argc; i++) { + 5c: 83 c4 10 add $0x10,%esp + 5f: 39 75 e4 cmp %esi,-0x1c(%ebp) + 62: 75 cc jne 30 + } + exit(); + 64: e8 fa 02 00 00 call 363 + printf(1, "cat: cannot open %s\n", argv[i]); + 69: 50 push %eax + 6a: ff 33 push (%ebx) + 6c: 68 2b 08 00 00 push $0x82b + 71: 6a 01 push $0x1 + 73: e8 68 04 00 00 call 4e0 + exit(); + 78: e8 e6 02 00 00 call 363 + cat(0); + 7d: 83 ec 0c sub $0xc,%esp + 80: 6a 00 push $0x0 + 82: e8 09 00 00 00 call 90 + exit(); + 87: e8 d7 02 00 00 call 363 + 8c: 66 90 xchg %ax,%ax + 8e: 66 90 xchg %ax,%ax + +00000090 : +void cat(int fd) { + 90: 55 push %ebp + 91: 89 e5 mov %esp,%ebp + 93: 56 push %esi + 94: 8b 75 08 mov 0x8(%ebp),%esi + 97: 53 push %ebx + while ((n = read(fd, buf, sizeof(buf))) > 0) { + 98: eb 1d jmp b7 + 9a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (write(1, buf, n) != n) { + a0: 83 ec 04 sub $0x4,%esp + a3: 53 push %ebx + a4: 68 a0 0b 00 00 push $0xba0 + a9: 6a 01 push $0x1 + ab: e8 23 03 00 00 call 3d3 + b0: 83 c4 10 add $0x10,%esp + b3: 39 d8 cmp %ebx,%eax + b5: 75 25 jne dc + while ((n = read(fd, buf, sizeof(buf))) > 0) { + b7: 83 ec 04 sub $0x4,%esp + ba: 68 00 02 00 00 push $0x200 + bf: 68 a0 0b 00 00 push $0xba0 + c4: 56 push %esi + c5: e8 b1 02 00 00 call 37b + ca: 83 c4 10 add $0x10,%esp + cd: 89 c3 mov %eax,%ebx + cf: 85 c0 test %eax,%eax + d1: 7f cd jg a0 + if (n < 0) { + d3: 75 1b jne f0 +} + d5: 8d 65 f8 lea -0x8(%ebp),%esp + d8: 5b pop %ebx + d9: 5e pop %esi + da: 5d pop %ebp + db: c3 ret + printf(1, "cat: write error\n"); + dc: 83 ec 08 sub $0x8,%esp + df: 68 08 08 00 00 push $0x808 + e4: 6a 01 push $0x1 + e6: e8 f5 03 00 00 call 4e0 + exit(); + eb: e8 73 02 00 00 call 363 + printf(1, "cat: read error\n"); + f0: 50 push %eax + f1: 50 push %eax + f2: 68 1a 08 00 00 push $0x81a + f7: 6a 01 push $0x1 + f9: e8 e2 03 00 00 call 4e0 + exit(); + fe: e8 60 02 00 00 call 363 + 103: 66 90 xchg %ax,%ax + 105: 66 90 xchg %ax,%ax + 107: 66 90 xchg %ax,%ax + 109: 66 90 xchg %ax,%ax + 10b: 66 90 xchg %ax,%ax + 10d: 66 90 xchg %ax,%ax + 10f: 90 nop + +00000110 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 110: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 111: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 113: 89 e5 mov %esp,%ebp + 115: 53 push %ebx + 116: 8b 4d 08 mov 0x8(%ebp),%ecx + 119: 8b 5d 0c mov 0xc(%ebp),%ebx + 11c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 120: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 124: 88 14 01 mov %dl,(%ecx,%eax,1) + 127: 83 c0 01 add $0x1,%eax + 12a: 84 d2 test %dl,%dl + 12c: 75 f2 jne 120 + ; + } + return os; +} + 12e: 8b 5d fc mov -0x4(%ebp),%ebx + 131: 89 c8 mov %ecx,%eax + 133: c9 leave + 134: c3 ret + 135: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 13c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000140 : + +int strcmp(const char *p, const char *q) { + 140: 55 push %ebp + 141: 89 e5 mov %esp,%ebp + 143: 53 push %ebx + 144: 8b 55 08 mov 0x8(%ebp),%edx + 147: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 14a: 0f b6 02 movzbl (%edx),%eax + 14d: 84 c0 test %al,%al + 14f: 75 17 jne 168 + 151: eb 3a jmp 18d + 153: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 157: 90 nop + 158: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 15c: 83 c2 01 add $0x1,%edx + 15f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 162: 84 c0 test %al,%al + 164: 74 1a je 180 + p++, q++; + 166: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 168: 0f b6 19 movzbl (%ecx),%ebx + 16b: 38 c3 cmp %al,%bl + 16d: 74 e9 je 158 + } + return (uchar) * p - (uchar) * q; + 16f: 29 d8 sub %ebx,%eax +} + 171: 8b 5d fc mov -0x4(%ebp),%ebx + 174: c9 leave + 175: c3 ret + 176: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 17d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 180: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 184: 31 c0 xor %eax,%eax + 186: 29 d8 sub %ebx,%eax +} + 188: 8b 5d fc mov -0x4(%ebp),%ebx + 18b: c9 leave + 18c: c3 ret + return (uchar) * p - (uchar) * q; + 18d: 0f b6 19 movzbl (%ecx),%ebx + 190: 31 c0 xor %eax,%eax + 192: eb db jmp 16f + 194: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 19b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 19f: 90 nop + +000001a0 : + +uint strlen(const char *s) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 1a6: 80 3a 00 cmpb $0x0,(%edx) + 1a9: 74 15 je 1c0 + 1ab: 31 c0 xor %eax,%eax + 1ad: 8d 76 00 lea 0x0(%esi),%esi + 1b0: 83 c0 01 add $0x1,%eax + 1b3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 1b7: 89 c1 mov %eax,%ecx + 1b9: 75 f5 jne 1b0 + ; + } + return n; +} + 1bb: 89 c8 mov %ecx,%eax + 1bd: 5d pop %ebp + 1be: c3 ret + 1bf: 90 nop + for (n = 0; s[n]; n++) { + 1c0: 31 c9 xor %ecx,%ecx +} + 1c2: 5d pop %ebp + 1c3: 89 c8 mov %ecx,%eax + 1c5: c3 ret + 1c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1cd: 8d 76 00 lea 0x0(%esi),%esi + +000001d0 : + +void* memset(void *dst, int c, uint n) { + 1d0: 55 push %ebp + 1d1: 89 e5 mov %esp,%ebp + 1d3: 57 push %edi + 1d4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 1d7: 8b 4d 10 mov 0x10(%ebp),%ecx + 1da: 8b 45 0c mov 0xc(%ebp),%eax + 1dd: 89 d7 mov %edx,%edi + 1df: fc cld + 1e0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 1e2: 8b 7d fc mov -0x4(%ebp),%edi + 1e5: 89 d0 mov %edx,%eax + 1e7: c9 leave + 1e8: c3 ret + 1e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000001f0 : + +char* strchr(const char *s, char c) { + 1f0: 55 push %ebp + 1f1: 89 e5 mov %esp,%ebp + 1f3: 8b 45 08 mov 0x8(%ebp),%eax + 1f6: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 1fa: 0f b6 10 movzbl (%eax),%edx + 1fd: 84 d2 test %dl,%dl + 1ff: 75 12 jne 213 + 201: eb 1d jmp 220 + 203: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 207: 90 nop + 208: 0f b6 50 01 movzbl 0x1(%eax),%edx + 20c: 83 c0 01 add $0x1,%eax + 20f: 84 d2 test %dl,%dl + 211: 74 0d je 220 + if (*s == c) { + 213: 38 d1 cmp %dl,%cl + 215: 75 f1 jne 208 + return (char*)s; + } + } + return 0; +} + 217: 5d pop %ebp + 218: c3 ret + 219: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 220: 31 c0 xor %eax,%eax +} + 222: 5d pop %ebp + 223: c3 ret + 224: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 22b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 22f: 90 nop + +00000230 : + +char* gets(char *buf, int max) { + 230: 55 push %ebp + 231: 89 e5 mov %esp,%ebp + 233: 57 push %edi + 234: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 235: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 238: 53 push %ebx + for (i = 0; i + 1 < max;) { + 239: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 23b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 23e: eb 27 jmp 267 + cc = read(0, &c, 1); + 240: 83 ec 04 sub $0x4,%esp + 243: 6a 01 push $0x1 + 245: 57 push %edi + 246: 6a 00 push $0x0 + 248: e8 2e 01 00 00 call 37b + if (cc < 1) { + 24d: 83 c4 10 add $0x10,%esp + 250: 85 c0 test %eax,%eax + 252: 7e 1d jle 271 + break; + } + buf[i++] = c; + 254: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 258: 8b 55 08 mov 0x8(%ebp),%edx + 25b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 25f: 3c 0a cmp $0xa,%al + 261: 74 1d je 280 + 263: 3c 0d cmp $0xd,%al + 265: 74 19 je 280 + for (i = 0; i + 1 < max;) { + 267: 89 de mov %ebx,%esi + 269: 83 c3 01 add $0x1,%ebx + 26c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 26f: 7c cf jl 240 + break; + } + } + buf[i] = '\0'; + 271: 8b 45 08 mov 0x8(%ebp),%eax + 274: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 278: 8d 65 f4 lea -0xc(%ebp),%esp + 27b: 5b pop %ebx + 27c: 5e pop %esi + 27d: 5f pop %edi + 27e: 5d pop %ebp + 27f: c3 ret + buf[i] = '\0'; + 280: 8b 45 08 mov 0x8(%ebp),%eax + 283: 89 de mov %ebx,%esi + 285: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 289: 8d 65 f4 lea -0xc(%ebp),%esp + 28c: 5b pop %ebx + 28d: 5e pop %esi + 28e: 5f pop %edi + 28f: 5d pop %ebp + 290: c3 ret + 291: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 298: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29f: 90 nop + +000002a0 : + +int stat(const char *n, struct stat *st) { + 2a0: 55 push %ebp + 2a1: 89 e5 mov %esp,%ebp + 2a3: 56 push %esi + 2a4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 2a5: 83 ec 08 sub $0x8,%esp + 2a8: 6a 00 push $0x0 + 2aa: ff 75 08 push 0x8(%ebp) + 2ad: e8 19 01 00 00 call 3cb + if (fd < 0) { + 2b2: 83 c4 10 add $0x10,%esp + 2b5: 85 c0 test %eax,%eax + 2b7: 78 27 js 2e0 + return -1; + } + r = fstat(fd, st); + 2b9: 83 ec 08 sub $0x8,%esp + 2bc: ff 75 0c push 0xc(%ebp) + 2bf: 89 c3 mov %eax,%ebx + 2c1: 50 push %eax + 2c2: e8 cc 00 00 00 call 393 + close(fd); + 2c7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 2ca: 89 c6 mov %eax,%esi + close(fd); + 2cc: e8 2a 01 00 00 call 3fb + return r; + 2d1: 83 c4 10 add $0x10,%esp +} + 2d4: 8d 65 f8 lea -0x8(%ebp),%esp + 2d7: 89 f0 mov %esi,%eax + 2d9: 5b pop %ebx + 2da: 5e pop %esi + 2db: 5d pop %ebp + 2dc: c3 ret + 2dd: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 2e0: be ff ff ff ff mov $0xffffffff,%esi + 2e5: eb ed jmp 2d4 + 2e7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2ee: 66 90 xchg %ax,%ax + +000002f0 : + +int atoi(const char *s) { + 2f0: 55 push %ebp + 2f1: 89 e5 mov %esp,%ebp + 2f3: 53 push %ebx + 2f4: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 2f7: 0f be 02 movsbl (%edx),%eax + 2fa: 8d 48 d0 lea -0x30(%eax),%ecx + 2fd: 80 f9 09 cmp $0x9,%cl + n = 0; + 300: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 305: 77 1e ja 325 + 307: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 30e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 310: 83 c2 01 add $0x1,%edx + 313: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 316: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 31a: 0f be 02 movsbl (%edx),%eax + 31d: 8d 58 d0 lea -0x30(%eax),%ebx + 320: 80 fb 09 cmp $0x9,%bl + 323: 76 eb jbe 310 + } + return n; +} + 325: 8b 5d fc mov -0x4(%ebp),%ebx + 328: 89 c8 mov %ecx,%eax + 32a: c9 leave + 32b: c3 ret + 32c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000330 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 330: 55 push %ebp + 331: 89 e5 mov %esp,%ebp + 333: 57 push %edi + 334: 8b 45 10 mov 0x10(%ebp),%eax + 337: 8b 55 08 mov 0x8(%ebp),%edx + 33a: 56 push %esi + 33b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 33e: 85 c0 test %eax,%eax + 340: 7e 13 jle 355 + 342: 01 d0 add %edx,%eax + dst = vdst; + 344: 89 d7 mov %edx,%edi + 346: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 34d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 350: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 351: 39 f8 cmp %edi,%eax + 353: 75 fb jne 350 + } + return vdst; +} + 355: 5e pop %esi + 356: 89 d0 mov %edx,%eax + 358: 5f pop %edi + 359: 5d pop %ebp + 35a: c3 ret + +0000035b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 35b: b8 01 00 00 00 mov $0x1,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(exit) + 363: b8 02 00 00 00 mov $0x2,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(wait) + 36b: b8 03 00 00 00 mov $0x3,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(pipe) + 373: b8 04 00 00 00 mov $0x4,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(read) + 37b: b8 05 00 00 00 mov $0x5,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(kill) + 383: b8 06 00 00 00 mov $0x6,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(exec) + 38b: b8 07 00 00 00 mov $0x7,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(fstat) + 393: b8 08 00 00 00 mov $0x8,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(chdir) + 39b: b8 09 00 00 00 mov $0x9,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(dup) + 3a3: b8 0a 00 00 00 mov $0xa,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + +000003ab : +SYSCALL(getpid) + 3ab: b8 0b 00 00 00 mov $0xb,%eax + 3b0: cd 40 int $0x40 + 3b2: c3 ret + +000003b3 : +SYSCALL(sbrk) + 3b3: b8 0c 00 00 00 mov $0xc,%eax + 3b8: cd 40 int $0x40 + 3ba: c3 ret + +000003bb : +SYSCALL(sleep) + 3bb: b8 0d 00 00 00 mov $0xd,%eax + 3c0: cd 40 int $0x40 + 3c2: c3 ret + +000003c3 : +SYSCALL(uptime) + 3c3: b8 0e 00 00 00 mov $0xe,%eax + 3c8: cd 40 int $0x40 + 3ca: c3 ret + +000003cb : +SYSCALL(open) + 3cb: b8 0f 00 00 00 mov $0xf,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(write) + 3d3: b8 10 00 00 00 mov $0x10,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(mknod) + 3db: b8 11 00 00 00 mov $0x11,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(unlink) + 3e3: b8 12 00 00 00 mov $0x12,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(link) + 3eb: b8 13 00 00 00 mov $0x13,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(mkdir) + 3f3: b8 14 00 00 00 mov $0x14,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + +000003fb : +SYSCALL(close) + 3fb: b8 15 00 00 00 mov $0x15,%eax + 400: cd 40 int $0x40 + 402: c3 ret + +00000403 : +SYSCALL(getch) + 403: b8 16 00 00 00 mov $0x16,%eax + 408: cd 40 int $0x40 + 40a: c3 ret + +0000040b : +SYSCALL(greeting) + 40b: b8 17 00 00 00 mov $0x17,%eax + 410: cd 40 int $0x40 + 412: c3 ret + +00000413 : +SYSCALL(shutdown) + 413: b8 18 00 00 00 mov $0x18,%eax + 418: cd 40 int $0x40 + 41a: c3 ret + +0000041b : +SYSCALL(screen) + 41b: b8 19 00 00 00 mov $0x19,%eax + 420: cd 40 int $0x40 + 422: c3 ret + +00000423 : +SYSCALL(cls) + 423: b8 1a 00 00 00 mov $0x1a,%eax + 428: cd 40 int $0x40 + 42a: c3 ret + 42b: 66 90 xchg %ax,%ax + 42d: 66 90 xchg %ax,%ax + 42f: 90 nop + +00000430 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 430: 55 push %ebp + 431: 89 e5 mov %esp,%ebp + 433: 57 push %edi + 434: 56 push %esi + 435: 53 push %ebx + 436: 83 ec 3c sub $0x3c,%esp + 439: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 43c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 43e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 441: 85 d2 test %edx,%edx + 443: 0f 89 7f 00 00 00 jns 4c8 + 449: f6 45 08 01 testb $0x1,0x8(%ebp) + 44d: 74 79 je 4c8 + neg = 1; + 44f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 456: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 458: 31 db xor %ebx,%ebx + 45a: 8d 75 d7 lea -0x29(%ebp),%esi + 45d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 460: 89 c8 mov %ecx,%eax + 462: 31 d2 xor %edx,%edx + 464: 89 cf mov %ecx,%edi + 466: f7 75 c4 divl -0x3c(%ebp) + 469: 0f b6 92 a0 08 00 00 movzbl 0x8a0(%edx),%edx + 470: 89 45 c0 mov %eax,-0x40(%ebp) + 473: 89 d8 mov %ebx,%eax + 475: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 478: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 47b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 47e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 481: 76 dd jbe 460 + if (neg) { + 483: 8b 4d bc mov -0x44(%ebp),%ecx + 486: 85 c9 test %ecx,%ecx + 488: 74 0c je 496 + buf[i++] = '-'; + 48a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 48f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 491: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 496: 8b 7d b8 mov -0x48(%ebp),%edi + 499: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 49d: eb 07 jmp 4a6 + 49f: 90 nop + putc(fd, buf[i]); + 4a0: 0f b6 13 movzbl (%ebx),%edx + 4a3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 4a6: 83 ec 04 sub $0x4,%esp + 4a9: 88 55 d7 mov %dl,-0x29(%ebp) + 4ac: 6a 01 push $0x1 + 4ae: 56 push %esi + 4af: 57 push %edi + 4b0: e8 1e ff ff ff call 3d3 + while (--i >= 0) { + 4b5: 83 c4 10 add $0x10,%esp + 4b8: 39 de cmp %ebx,%esi + 4ba: 75 e4 jne 4a0 + } +} + 4bc: 8d 65 f4 lea -0xc(%ebp),%esp + 4bf: 5b pop %ebx + 4c0: 5e pop %esi + 4c1: 5f pop %edi + 4c2: 5d pop %ebp + 4c3: c3 ret + 4c4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 4c8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 4cf: eb 87 jmp 458 + 4d1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4df: 90 nop + +000004e0 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 4e0: 55 push %ebp + 4e1: 89 e5 mov %esp,%ebp + 4e3: 57 push %edi + 4e4: 56 push %esi + 4e5: 53 push %ebx + 4e6: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 4e9: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 4ec: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 4ef: 0f b6 13 movzbl (%ebx),%edx + 4f2: 84 d2 test %dl,%dl + 4f4: 74 6a je 560 + ap = (uint*)(void*)&fmt + 1; + 4f6: 8d 45 10 lea 0x10(%ebp),%eax + 4f9: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 4fc: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 4ff: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 501: 89 45 d0 mov %eax,-0x30(%ebp) + 504: eb 36 jmp 53c + 506: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 50d: 8d 76 00 lea 0x0(%esi),%esi + 510: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 513: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 518: 83 f8 25 cmp $0x25,%eax + 51b: 74 15 je 532 + write(fd, &c, 1); + 51d: 83 ec 04 sub $0x4,%esp + 520: 88 55 e7 mov %dl,-0x19(%ebp) + 523: 6a 01 push $0x1 + 525: 57 push %edi + 526: 56 push %esi + 527: e8 a7 fe ff ff call 3d3 + 52c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 52f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 532: 0f b6 13 movzbl (%ebx),%edx + 535: 83 c3 01 add $0x1,%ebx + 538: 84 d2 test %dl,%dl + 53a: 74 24 je 560 + c = fmt[i] & 0xff; + 53c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 53f: 85 c9 test %ecx,%ecx + 541: 74 cd je 510 + } + } + else if (state == '%') { + 543: 83 f9 25 cmp $0x25,%ecx + 546: 75 ea jne 532 + if (c == 'd') { + 548: 83 f8 25 cmp $0x25,%eax + 54b: 0f 84 07 01 00 00 je 658 + 551: 83 e8 63 sub $0x63,%eax + 554: 83 f8 15 cmp $0x15,%eax + 557: 77 17 ja 570 + 559: ff 24 85 48 08 00 00 jmp *0x848(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 560: 8d 65 f4 lea -0xc(%ebp),%esp + 563: 5b pop %ebx + 564: 5e pop %esi + 565: 5f pop %edi + 566: 5d pop %ebp + 567: c3 ret + 568: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 56f: 90 nop + write(fd, &c, 1); + 570: 83 ec 04 sub $0x4,%esp + 573: 88 55 d4 mov %dl,-0x2c(%ebp) + 576: 6a 01 push $0x1 + 578: 57 push %edi + 579: 56 push %esi + 57a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 57e: e8 50 fe ff ff call 3d3 + putc(fd, c); + 583: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 587: 83 c4 0c add $0xc,%esp + 58a: 88 55 e7 mov %dl,-0x19(%ebp) + 58d: 6a 01 push $0x1 + 58f: 57 push %edi + 590: 56 push %esi + 591: e8 3d fe ff ff call 3d3 + putc(fd, c); + 596: 83 c4 10 add $0x10,%esp + state = 0; + 599: 31 c9 xor %ecx,%ecx + 59b: eb 95 jmp 532 + 59d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 5a0: 83 ec 0c sub $0xc,%esp + 5a3: b9 10 00 00 00 mov $0x10,%ecx + 5a8: 6a 00 push $0x0 + 5aa: 8b 45 d0 mov -0x30(%ebp),%eax + 5ad: 8b 10 mov (%eax),%edx + 5af: 89 f0 mov %esi,%eax + 5b1: e8 7a fe ff ff call 430 + ap++; + 5b6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5ba: 83 c4 10 add $0x10,%esp + state = 0; + 5bd: 31 c9 xor %ecx,%ecx + 5bf: e9 6e ff ff ff jmp 532 + 5c4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 5c8: 8b 45 d0 mov -0x30(%ebp),%eax + 5cb: 8b 10 mov (%eax),%edx + ap++; + 5cd: 83 c0 04 add $0x4,%eax + 5d0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 5d3: 85 d2 test %edx,%edx + 5d5: 0f 84 8d 00 00 00 je 668 + while (*s != 0) { + 5db: 0f b6 02 movzbl (%edx),%eax + state = 0; + 5de: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 5e0: 84 c0 test %al,%al + 5e2: 0f 84 4a ff ff ff je 532 + 5e8: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5eb: 89 d3 mov %edx,%ebx + 5ed: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 5f0: 83 ec 04 sub $0x4,%esp + s++; + 5f3: 83 c3 01 add $0x1,%ebx + 5f6: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 5f9: 6a 01 push $0x1 + 5fb: 57 push %edi + 5fc: 56 push %esi + 5fd: e8 d1 fd ff ff call 3d3 + while (*s != 0) { + 602: 0f b6 03 movzbl (%ebx),%eax + 605: 83 c4 10 add $0x10,%esp + 608: 84 c0 test %al,%al + 60a: 75 e4 jne 5f0 + state = 0; + 60c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 60f: 31 c9 xor %ecx,%ecx + 611: e9 1c ff ff ff jmp 532 + 616: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 61d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 620: 83 ec 0c sub $0xc,%esp + 623: b9 0a 00 00 00 mov $0xa,%ecx + 628: 6a 01 push $0x1 + 62a: e9 7b ff ff ff jmp 5aa + 62f: 90 nop + putc(fd, *ap); + 630: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 633: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 636: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 638: 6a 01 push $0x1 + 63a: 57 push %edi + 63b: 56 push %esi + putc(fd, *ap); + 63c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 63f: e8 8f fd ff ff call 3d3 + ap++; + 644: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 648: 83 c4 10 add $0x10,%esp + state = 0; + 64b: 31 c9 xor %ecx,%ecx + 64d: e9 e0 fe ff ff jmp 532 + 652: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 658: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 65b: 83 ec 04 sub $0x4,%esp + 65e: e9 2a ff ff ff jmp 58d + 663: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 667: 90 nop + s = "(null)"; + 668: ba 40 08 00 00 mov $0x840,%edx + while (*s != 0) { + 66d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 670: b8 28 00 00 00 mov $0x28,%eax + 675: 89 d3 mov %edx,%ebx + 677: e9 74 ff ff ff jmp 5f0 + 67c: 66 90 xchg %ax,%ax + 67e: 66 90 xchg %ax,%ax + +00000680 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 680: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 681: a1 a0 0d 00 00 mov 0xda0,%eax +void free(void *ap) { + 686: 89 e5 mov %esp,%ebp + 688: 57 push %edi + 689: 56 push %esi + 68a: 53 push %ebx + 68b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 68e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 691: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 698: 89 c2 mov %eax,%edx + 69a: 8b 00 mov (%eax),%eax + 69c: 39 ca cmp %ecx,%edx + 69e: 73 30 jae 6d0 + 6a0: 39 c1 cmp %eax,%ecx + 6a2: 72 04 jb 6a8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 6a4: 39 c2 cmp %eax,%edx + 6a6: 72 f0 jb 698 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 6a8: 8b 73 fc mov -0x4(%ebx),%esi + 6ab: 8d 3c f1 lea (%ecx,%esi,8),%edi + 6ae: 39 f8 cmp %edi,%eax + 6b0: 74 30 je 6e2 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 6b2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 6b5: 8b 42 04 mov 0x4(%edx),%eax + 6b8: 8d 34 c2 lea (%edx,%eax,8),%esi + 6bb: 39 f1 cmp %esi,%ecx + 6bd: 74 3a je 6f9 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 6bf: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 6c1: 5b pop %ebx + freep = p; + 6c2: 89 15 a0 0d 00 00 mov %edx,0xda0 +} + 6c8: 5e pop %esi + 6c9: 5f pop %edi + 6ca: 5d pop %ebp + 6cb: c3 ret + 6cc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 6d0: 39 c2 cmp %eax,%edx + 6d2: 72 c4 jb 698 + 6d4: 39 c1 cmp %eax,%ecx + 6d6: 73 c0 jae 698 + if (bp + bp->s.size == p->s.ptr) { + 6d8: 8b 73 fc mov -0x4(%ebx),%esi + 6db: 8d 3c f1 lea (%ecx,%esi,8),%edi + 6de: 39 f8 cmp %edi,%eax + 6e0: 75 d0 jne 6b2 + bp->s.size += p->s.ptr->s.size; + 6e2: 03 70 04 add 0x4(%eax),%esi + 6e5: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 6e8: 8b 02 mov (%edx),%eax + 6ea: 8b 00 mov (%eax),%eax + 6ec: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 6ef: 8b 42 04 mov 0x4(%edx),%eax + 6f2: 8d 34 c2 lea (%edx,%eax,8),%esi + 6f5: 39 f1 cmp %esi,%ecx + 6f7: 75 c6 jne 6bf + p->s.size += bp->s.size; + 6f9: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 6fc: 89 15 a0 0d 00 00 mov %edx,0xda0 + p->s.size += bp->s.size; + 702: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 705: 8b 4b f8 mov -0x8(%ebx),%ecx + 708: 89 0a mov %ecx,(%edx) +} + 70a: 5b pop %ebx + 70b: 5e pop %esi + 70c: 5f pop %edi + 70d: 5d pop %ebp + 70e: c3 ret + 70f: 90 nop + +00000710 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 710: 55 push %ebp + 711: 89 e5 mov %esp,%ebp + 713: 57 push %edi + 714: 56 push %esi + 715: 53 push %ebx + 716: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 719: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 71c: 8b 3d a0 0d 00 00 mov 0xda0,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 722: 8d 70 07 lea 0x7(%eax),%esi + 725: c1 ee 03 shr $0x3,%esi + 728: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 72b: 85 ff test %edi,%edi + 72d: 0f 84 9d 00 00 00 je 7d0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 733: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 735: 8b 4a 04 mov 0x4(%edx),%ecx + 738: 39 f1 cmp %esi,%ecx + 73a: 73 6a jae 7a6 + 73c: bb 00 10 00 00 mov $0x1000,%ebx + 741: 39 de cmp %ebx,%esi + 743: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 746: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 74d: 89 45 e4 mov %eax,-0x1c(%ebp) + 750: eb 17 jmp 769 + 752: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 758: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 75a: 8b 48 04 mov 0x4(%eax),%ecx + 75d: 39 f1 cmp %esi,%ecx + 75f: 73 4f jae 7b0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 761: 8b 3d a0 0d 00 00 mov 0xda0,%edi + 767: 89 c2 mov %eax,%edx + 769: 39 d7 cmp %edx,%edi + 76b: 75 eb jne 758 + p = sbrk(nu * sizeof(Header)); + 76d: 83 ec 0c sub $0xc,%esp + 770: ff 75 e4 push -0x1c(%ebp) + 773: e8 3b fc ff ff call 3b3 + if (p == (char*)-1) { + 778: 83 c4 10 add $0x10,%esp + 77b: 83 f8 ff cmp $0xffffffff,%eax + 77e: 74 1c je 79c + hp->s.size = nu; + 780: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 783: 83 ec 0c sub $0xc,%esp + 786: 83 c0 08 add $0x8,%eax + 789: 50 push %eax + 78a: e8 f1 fe ff ff call 680 + return freep; + 78f: 8b 15 a0 0d 00 00 mov 0xda0,%edx + if ((p = morecore(nunits)) == 0) { + 795: 83 c4 10 add $0x10,%esp + 798: 85 d2 test %edx,%edx + 79a: 75 bc jne 758 + return 0; + } + } + } +} + 79c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 79f: 31 c0 xor %eax,%eax +} + 7a1: 5b pop %ebx + 7a2: 5e pop %esi + 7a3: 5f pop %edi + 7a4: 5d pop %ebp + 7a5: c3 ret + if (p->s.size >= nunits) { + 7a6: 89 d0 mov %edx,%eax + 7a8: 89 fa mov %edi,%edx + 7aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 7b0: 39 ce cmp %ecx,%esi + 7b2: 74 4c je 800 + p->s.size -= nunits; + 7b4: 29 f1 sub %esi,%ecx + 7b6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 7b9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 7bc: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 7bf: 89 15 a0 0d 00 00 mov %edx,0xda0 +} + 7c5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 7c8: 83 c0 08 add $0x8,%eax +} + 7cb: 5b pop %ebx + 7cc: 5e pop %esi + 7cd: 5f pop %edi + 7ce: 5d pop %ebp + 7cf: c3 ret + base.s.ptr = freep = prevp = &base; + 7d0: c7 05 a0 0d 00 00 a4 movl $0xda4,0xda0 + 7d7: 0d 00 00 + base.s.size = 0; + 7da: bf a4 0d 00 00 mov $0xda4,%edi + base.s.ptr = freep = prevp = &base; + 7df: c7 05 a4 0d 00 00 a4 movl $0xda4,0xda4 + 7e6: 0d 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 7e9: 89 fa mov %edi,%edx + base.s.size = 0; + 7eb: c7 05 a8 0d 00 00 00 movl $0x0,0xda8 + 7f2: 00 00 00 + if (p->s.size >= nunits) { + 7f5: e9 42 ff ff ff jmp 73c + 7fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 800: 8b 08 mov (%eax),%ecx + 802: 89 0a mov %ecx,(%edx) + 804: eb b9 jmp 7bf diff --git a/cat.d b/cat.d new file mode 100644 index 0000000..8f55acc --- /dev/null +++ b/cat.d @@ -0,0 +1 @@ +cat.o: cat.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/cat.o b/cat.o new file mode 100644 index 0000000000000000000000000000000000000000..226c1c046100942597be7b85511957eeca5aacdf GIT binary patch literal 4964 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 literal 0 HcmV?d00001 diff --git a/cat.sym b/cat.sym new file mode 100644 index 0000000..633343e --- /dev/null +++ b/cat.sym @@ -0,0 +1,52 @@ +00000000 cat.c +00000000 ulib.c +00000000 printf.c +00000430 printint +000008a0 digits.0 +00000000 umalloc.c +00000da0 freep +00000da4 base +00000110 strcpy +000004e0 printf +0000040b greeting +00000330 memmove +000003db mknod +00000230 gets +000003ab getpid +00000090 cat +0000041b screen +00000710 malloc +000003bb sleep +00000373 pipe +00000403 getch +000003d3 write +00000393 fstat +00000383 kill +0000039b chdir +0000038b exec +0000036b wait +0000037b read +000003e3 unlink +0000035b fork +000003b3 sbrk +000003c3 uptime +00000b84 __bss_start +000001d0 memset +00000000 main +00000140 strcmp +00000413 shutdown +000003a3 dup +00000ba0 buf +000002a0 stat +00000b84 _edata +00000dac _end +000003eb link +00000363 exit +000002f0 atoi +00000423 cls +000001a0 strlen +000003cb open +000001f0 strchr +000003f3 mkdir +000003fb close +00000680 free diff --git a/cls.asm b/cls.asm new file mode 100644 index 0000000..5463e0d --- /dev/null +++ b/cls.asm @@ -0,0 +1,1142 @@ + +_cls: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 55 push %ebp + 1: 89 e5 mov %esp,%ebp + 3: 83 e4 f0 and $0xfffffff0,%esp + cls(); + 6: e8 18 03 00 00 call 323 + //printf(1, "$ "); + exit(); + b: e8 53 02 00 00 call 263 + +00000010 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 10: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 11: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 13: 89 e5 mov %esp,%ebp + 15: 53 push %ebx + 16: 8b 4d 08 mov 0x8(%ebp),%ecx + 19: 8b 5d 0c mov 0xc(%ebp),%ebx + 1c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 20: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 24: 88 14 01 mov %dl,(%ecx,%eax,1) + 27: 83 c0 01 add $0x1,%eax + 2a: 84 d2 test %dl,%dl + 2c: 75 f2 jne 20 + ; + } + return os; +} + 2e: 8b 5d fc mov -0x4(%ebp),%ebx + 31: 89 c8 mov %ecx,%eax + 33: c9 leave + 34: c3 ret + 35: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000040 : + +int strcmp(const char *p, const char *q) { + 40: 55 push %ebp + 41: 89 e5 mov %esp,%ebp + 43: 53 push %ebx + 44: 8b 55 08 mov 0x8(%ebp),%edx + 47: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 4a: 0f b6 02 movzbl (%edx),%eax + 4d: 84 c0 test %al,%al + 4f: 75 17 jne 68 + 51: eb 3a jmp 8d + 53: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 57: 90 nop + 58: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 5c: 83 c2 01 add $0x1,%edx + 5f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 62: 84 c0 test %al,%al + 64: 74 1a je 80 + p++, q++; + 66: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 68: 0f b6 19 movzbl (%ecx),%ebx + 6b: 38 c3 cmp %al,%bl + 6d: 74 e9 je 58 + } + return (uchar) * p - (uchar) * q; + 6f: 29 d8 sub %ebx,%eax +} + 71: 8b 5d fc mov -0x4(%ebp),%ebx + 74: c9 leave + 75: c3 ret + 76: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 7d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 80: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 84: 31 c0 xor %eax,%eax + 86: 29 d8 sub %ebx,%eax +} + 88: 8b 5d fc mov -0x4(%ebp),%ebx + 8b: c9 leave + 8c: c3 ret + return (uchar) * p - (uchar) * q; + 8d: 0f b6 19 movzbl (%ecx),%ebx + 90: 31 c0 xor %eax,%eax + 92: eb db jmp 6f + 94: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 9b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 9f: 90 nop + +000000a0 : + +uint strlen(const char *s) { + a0: 55 push %ebp + a1: 89 e5 mov %esp,%ebp + a3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + a6: 80 3a 00 cmpb $0x0,(%edx) + a9: 74 15 je c0 + ab: 31 c0 xor %eax,%eax + ad: 8d 76 00 lea 0x0(%esi),%esi + b0: 83 c0 01 add $0x1,%eax + b3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + b7: 89 c1 mov %eax,%ecx + b9: 75 f5 jne b0 + ; + } + return n; +} + bb: 89 c8 mov %ecx,%eax + bd: 5d pop %ebp + be: c3 ret + bf: 90 nop + for (n = 0; s[n]; n++) { + c0: 31 c9 xor %ecx,%ecx +} + c2: 5d pop %ebp + c3: 89 c8 mov %ecx,%eax + c5: c3 ret + c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + cd: 8d 76 00 lea 0x0(%esi),%esi + +000000d0 : + +void* memset(void *dst, int c, uint n) { + d0: 55 push %ebp + d1: 89 e5 mov %esp,%ebp + d3: 57 push %edi + d4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + d7: 8b 4d 10 mov 0x10(%ebp),%ecx + da: 8b 45 0c mov 0xc(%ebp),%eax + dd: 89 d7 mov %edx,%edi + df: fc cld + e0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + e2: 8b 7d fc mov -0x4(%ebp),%edi + e5: 89 d0 mov %edx,%eax + e7: c9 leave + e8: c3 ret + e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000000f0 : + +char* strchr(const char *s, char c) { + f0: 55 push %ebp + f1: 89 e5 mov %esp,%ebp + f3: 8b 45 08 mov 0x8(%ebp),%eax + f6: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + fa: 0f b6 10 movzbl (%eax),%edx + fd: 84 d2 test %dl,%dl + ff: 75 12 jne 113 + 101: eb 1d jmp 120 + 103: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 107: 90 nop + 108: 0f b6 50 01 movzbl 0x1(%eax),%edx + 10c: 83 c0 01 add $0x1,%eax + 10f: 84 d2 test %dl,%dl + 111: 74 0d je 120 + if (*s == c) { + 113: 38 d1 cmp %dl,%cl + 115: 75 f1 jne 108 + return (char*)s; + } + } + return 0; +} + 117: 5d pop %ebp + 118: c3 ret + 119: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 120: 31 c0 xor %eax,%eax +} + 122: 5d pop %ebp + 123: c3 ret + 124: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 12b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 12f: 90 nop + +00000130 : + +char* gets(char *buf, int max) { + 130: 55 push %ebp + 131: 89 e5 mov %esp,%ebp + 133: 57 push %edi + 134: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 135: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 138: 53 push %ebx + for (i = 0; i + 1 < max;) { + 139: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 13b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 13e: eb 27 jmp 167 + cc = read(0, &c, 1); + 140: 83 ec 04 sub $0x4,%esp + 143: 6a 01 push $0x1 + 145: 57 push %edi + 146: 6a 00 push $0x0 + 148: e8 2e 01 00 00 call 27b + if (cc < 1) { + 14d: 83 c4 10 add $0x10,%esp + 150: 85 c0 test %eax,%eax + 152: 7e 1d jle 171 + break; + } + buf[i++] = c; + 154: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 158: 8b 55 08 mov 0x8(%ebp),%edx + 15b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 15f: 3c 0a cmp $0xa,%al + 161: 74 1d je 180 + 163: 3c 0d cmp $0xd,%al + 165: 74 19 je 180 + for (i = 0; i + 1 < max;) { + 167: 89 de mov %ebx,%esi + 169: 83 c3 01 add $0x1,%ebx + 16c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 16f: 7c cf jl 140 + break; + } + } + buf[i] = '\0'; + 171: 8b 45 08 mov 0x8(%ebp),%eax + 174: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 178: 8d 65 f4 lea -0xc(%ebp),%esp + 17b: 5b pop %ebx + 17c: 5e pop %esi + 17d: 5f pop %edi + 17e: 5d pop %ebp + 17f: c3 ret + buf[i] = '\0'; + 180: 8b 45 08 mov 0x8(%ebp),%eax + 183: 89 de mov %ebx,%esi + 185: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 189: 8d 65 f4 lea -0xc(%ebp),%esp + 18c: 5b pop %ebx + 18d: 5e pop %esi + 18e: 5f pop %edi + 18f: 5d pop %ebp + 190: c3 ret + 191: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 198: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 19f: 90 nop + +000001a0 : + +int stat(const char *n, struct stat *st) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 56 push %esi + 1a4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 1a5: 83 ec 08 sub $0x8,%esp + 1a8: 6a 00 push $0x0 + 1aa: ff 75 08 push 0x8(%ebp) + 1ad: e8 19 01 00 00 call 2cb + if (fd < 0) { + 1b2: 83 c4 10 add $0x10,%esp + 1b5: 85 c0 test %eax,%eax + 1b7: 78 27 js 1e0 + return -1; + } + r = fstat(fd, st); + 1b9: 83 ec 08 sub $0x8,%esp + 1bc: ff 75 0c push 0xc(%ebp) + 1bf: 89 c3 mov %eax,%ebx + 1c1: 50 push %eax + 1c2: e8 cc 00 00 00 call 293 + close(fd); + 1c7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 1ca: 89 c6 mov %eax,%esi + close(fd); + 1cc: e8 2a 01 00 00 call 2fb + return r; + 1d1: 83 c4 10 add $0x10,%esp +} + 1d4: 8d 65 f8 lea -0x8(%ebp),%esp + 1d7: 89 f0 mov %esi,%eax + 1d9: 5b pop %ebx + 1da: 5e pop %esi + 1db: 5d pop %ebp + 1dc: c3 ret + 1dd: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 1e0: be ff ff ff ff mov $0xffffffff,%esi + 1e5: eb ed jmp 1d4 + 1e7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ee: 66 90 xchg %ax,%ax + +000001f0 : + +int atoi(const char *s) { + 1f0: 55 push %ebp + 1f1: 89 e5 mov %esp,%ebp + 1f3: 53 push %ebx + 1f4: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 1f7: 0f be 02 movsbl (%edx),%eax + 1fa: 8d 48 d0 lea -0x30(%eax),%ecx + 1fd: 80 f9 09 cmp $0x9,%cl + n = 0; + 200: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 205: 77 1e ja 225 + 207: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 210: 83 c2 01 add $0x1,%edx + 213: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 216: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 21a: 0f be 02 movsbl (%edx),%eax + 21d: 8d 58 d0 lea -0x30(%eax),%ebx + 220: 80 fb 09 cmp $0x9,%bl + 223: 76 eb jbe 210 + } + return n; +} + 225: 8b 5d fc mov -0x4(%ebp),%ebx + 228: 89 c8 mov %ecx,%eax + 22a: c9 leave + 22b: c3 ret + 22c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000230 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 230: 55 push %ebp + 231: 89 e5 mov %esp,%ebp + 233: 57 push %edi + 234: 8b 45 10 mov 0x10(%ebp),%eax + 237: 8b 55 08 mov 0x8(%ebp),%edx + 23a: 56 push %esi + 23b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 23e: 85 c0 test %eax,%eax + 240: 7e 13 jle 255 + 242: 01 d0 add %edx,%eax + dst = vdst; + 244: 89 d7 mov %edx,%edi + 246: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 24d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 250: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 251: 39 f8 cmp %edi,%eax + 253: 75 fb jne 250 + } + return vdst; +} + 255: 5e pop %esi + 256: 89 d0 mov %edx,%eax + 258: 5f pop %edi + 259: 5d pop %ebp + 25a: c3 ret + +0000025b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 25b: b8 01 00 00 00 mov $0x1,%eax + 260: cd 40 int $0x40 + 262: c3 ret + +00000263 : +SYSCALL(exit) + 263: b8 02 00 00 00 mov $0x2,%eax + 268: cd 40 int $0x40 + 26a: c3 ret + +0000026b : +SYSCALL(wait) + 26b: b8 03 00 00 00 mov $0x3,%eax + 270: cd 40 int $0x40 + 272: c3 ret + +00000273 : +SYSCALL(pipe) + 273: b8 04 00 00 00 mov $0x4,%eax + 278: cd 40 int $0x40 + 27a: c3 ret + +0000027b : +SYSCALL(read) + 27b: b8 05 00 00 00 mov $0x5,%eax + 280: cd 40 int $0x40 + 282: c3 ret + +00000283 : +SYSCALL(kill) + 283: b8 06 00 00 00 mov $0x6,%eax + 288: cd 40 int $0x40 + 28a: c3 ret + +0000028b : +SYSCALL(exec) + 28b: b8 07 00 00 00 mov $0x7,%eax + 290: cd 40 int $0x40 + 292: c3 ret + +00000293 : +SYSCALL(fstat) + 293: b8 08 00 00 00 mov $0x8,%eax + 298: cd 40 int $0x40 + 29a: c3 ret + +0000029b : +SYSCALL(chdir) + 29b: b8 09 00 00 00 mov $0x9,%eax + 2a0: cd 40 int $0x40 + 2a2: c3 ret + +000002a3 : +SYSCALL(dup) + 2a3: b8 0a 00 00 00 mov $0xa,%eax + 2a8: cd 40 int $0x40 + 2aa: c3 ret + +000002ab : +SYSCALL(getpid) + 2ab: b8 0b 00 00 00 mov $0xb,%eax + 2b0: cd 40 int $0x40 + 2b2: c3 ret + +000002b3 : +SYSCALL(sbrk) + 2b3: b8 0c 00 00 00 mov $0xc,%eax + 2b8: cd 40 int $0x40 + 2ba: c3 ret + +000002bb : +SYSCALL(sleep) + 2bb: b8 0d 00 00 00 mov $0xd,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(uptime) + 2c3: b8 0e 00 00 00 mov $0xe,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(open) + 2cb: b8 0f 00 00 00 mov $0xf,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(write) + 2d3: b8 10 00 00 00 mov $0x10,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(mknod) + 2db: b8 11 00 00 00 mov $0x11,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(unlink) + 2e3: b8 12 00 00 00 mov $0x12,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(link) + 2eb: b8 13 00 00 00 mov $0x13,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(mkdir) + 2f3: b8 14 00 00 00 mov $0x14,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(close) + 2fb: b8 15 00 00 00 mov $0x15,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(getch) + 303: b8 16 00 00 00 mov $0x16,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(greeting) + 30b: b8 17 00 00 00 mov $0x17,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(shutdown) + 313: b8 18 00 00 00 mov $0x18,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(screen) + 31b: b8 19 00 00 00 mov $0x19,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(cls) + 323: b8 1a 00 00 00 mov $0x1a,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + 32b: 66 90 xchg %ax,%ax + 32d: 66 90 xchg %ax,%ax + 32f: 90 nop + +00000330 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 330: 55 push %ebp + 331: 89 e5 mov %esp,%ebp + 333: 57 push %edi + 334: 56 push %esi + 335: 53 push %ebx + 336: 83 ec 3c sub $0x3c,%esp + 339: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 33c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 33e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 341: 85 d2 test %edx,%edx + 343: 0f 89 7f 00 00 00 jns 3c8 + 349: f6 45 08 01 testb $0x1,0x8(%ebp) + 34d: 74 79 je 3c8 + neg = 1; + 34f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 356: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 358: 31 db xor %ebx,%ebx + 35a: 8d 75 d7 lea -0x29(%ebp),%esi + 35d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 360: 89 c8 mov %ecx,%eax + 362: 31 d2 xor %edx,%edx + 364: 89 cf mov %ecx,%edi + 366: f7 75 c4 divl -0x3c(%ebp) + 369: 0f b6 92 68 07 00 00 movzbl 0x768(%edx),%edx + 370: 89 45 c0 mov %eax,-0x40(%ebp) + 373: 89 d8 mov %ebx,%eax + 375: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 378: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 37b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 37e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 381: 76 dd jbe 360 + if (neg) { + 383: 8b 4d bc mov -0x44(%ebp),%ecx + 386: 85 c9 test %ecx,%ecx + 388: 74 0c je 396 + buf[i++] = '-'; + 38a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 38f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 391: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 396: 8b 7d b8 mov -0x48(%ebp),%edi + 399: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 39d: eb 07 jmp 3a6 + 39f: 90 nop + putc(fd, buf[i]); + 3a0: 0f b6 13 movzbl (%ebx),%edx + 3a3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3a6: 83 ec 04 sub $0x4,%esp + 3a9: 88 55 d7 mov %dl,-0x29(%ebp) + 3ac: 6a 01 push $0x1 + 3ae: 56 push %esi + 3af: 57 push %edi + 3b0: e8 1e ff ff ff call 2d3 + while (--i >= 0) { + 3b5: 83 c4 10 add $0x10,%esp + 3b8: 39 de cmp %ebx,%esi + 3ba: 75 e4 jne 3a0 + } +} + 3bc: 8d 65 f4 lea -0xc(%ebp),%esp + 3bf: 5b pop %ebx + 3c0: 5e pop %esi + 3c1: 5f pop %edi + 3c2: 5d pop %ebp + 3c3: c3 ret + 3c4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 3c8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 3cf: eb 87 jmp 358 + 3d1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3df: 90 nop + +000003e0 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 3e0: 55 push %ebp + 3e1: 89 e5 mov %esp,%ebp + 3e3: 57 push %edi + 3e4: 56 push %esi + 3e5: 53 push %ebx + 3e6: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 3e9: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 3ec: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 3ef: 0f b6 13 movzbl (%ebx),%edx + 3f2: 84 d2 test %dl,%dl + 3f4: 74 6a je 460 + ap = (uint*)(void*)&fmt + 1; + 3f6: 8d 45 10 lea 0x10(%ebp),%eax + 3f9: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 3fc: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 3ff: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 401: 89 45 d0 mov %eax,-0x30(%ebp) + 404: eb 36 jmp 43c + 406: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 40d: 8d 76 00 lea 0x0(%esi),%esi + 410: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 413: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 418: 83 f8 25 cmp $0x25,%eax + 41b: 74 15 je 432 + write(fd, &c, 1); + 41d: 83 ec 04 sub $0x4,%esp + 420: 88 55 e7 mov %dl,-0x19(%ebp) + 423: 6a 01 push $0x1 + 425: 57 push %edi + 426: 56 push %esi + 427: e8 a7 fe ff ff call 2d3 + 42c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 42f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 432: 0f b6 13 movzbl (%ebx),%edx + 435: 83 c3 01 add $0x1,%ebx + 438: 84 d2 test %dl,%dl + 43a: 74 24 je 460 + c = fmt[i] & 0xff; + 43c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 43f: 85 c9 test %ecx,%ecx + 441: 74 cd je 410 + } + } + else if (state == '%') { + 443: 83 f9 25 cmp $0x25,%ecx + 446: 75 ea jne 432 + if (c == 'd') { + 448: 83 f8 25 cmp $0x25,%eax + 44b: 0f 84 07 01 00 00 je 558 + 451: 83 e8 63 sub $0x63,%eax + 454: 83 f8 15 cmp $0x15,%eax + 457: 77 17 ja 470 + 459: ff 24 85 10 07 00 00 jmp *0x710(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 460: 8d 65 f4 lea -0xc(%ebp),%esp + 463: 5b pop %ebx + 464: 5e pop %esi + 465: 5f pop %edi + 466: 5d pop %ebp + 467: c3 ret + 468: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 46f: 90 nop + write(fd, &c, 1); + 470: 83 ec 04 sub $0x4,%esp + 473: 88 55 d4 mov %dl,-0x2c(%ebp) + 476: 6a 01 push $0x1 + 478: 57 push %edi + 479: 56 push %esi + 47a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 47e: e8 50 fe ff ff call 2d3 + putc(fd, c); + 483: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 487: 83 c4 0c add $0xc,%esp + 48a: 88 55 e7 mov %dl,-0x19(%ebp) + 48d: 6a 01 push $0x1 + 48f: 57 push %edi + 490: 56 push %esi + 491: e8 3d fe ff ff call 2d3 + putc(fd, c); + 496: 83 c4 10 add $0x10,%esp + state = 0; + 499: 31 c9 xor %ecx,%ecx + 49b: eb 95 jmp 432 + 49d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 4a0: 83 ec 0c sub $0xc,%esp + 4a3: b9 10 00 00 00 mov $0x10,%ecx + 4a8: 6a 00 push $0x0 + 4aa: 8b 45 d0 mov -0x30(%ebp),%eax + 4ad: 8b 10 mov (%eax),%edx + 4af: 89 f0 mov %esi,%eax + 4b1: e8 7a fe ff ff call 330 + ap++; + 4b6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 4ba: 83 c4 10 add $0x10,%esp + state = 0; + 4bd: 31 c9 xor %ecx,%ecx + 4bf: e9 6e ff ff ff jmp 432 + 4c4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 4c8: 8b 45 d0 mov -0x30(%ebp),%eax + 4cb: 8b 10 mov (%eax),%edx + ap++; + 4cd: 83 c0 04 add $0x4,%eax + 4d0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 4d3: 85 d2 test %edx,%edx + 4d5: 0f 84 8d 00 00 00 je 568 + while (*s != 0) { + 4db: 0f b6 02 movzbl (%edx),%eax + state = 0; + 4de: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 4e0: 84 c0 test %al,%al + 4e2: 0f 84 4a ff ff ff je 432 + 4e8: 89 5d d4 mov %ebx,-0x2c(%ebp) + 4eb: 89 d3 mov %edx,%ebx + 4ed: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 4f0: 83 ec 04 sub $0x4,%esp + s++; + 4f3: 83 c3 01 add $0x1,%ebx + 4f6: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 4f9: 6a 01 push $0x1 + 4fb: 57 push %edi + 4fc: 56 push %esi + 4fd: e8 d1 fd ff ff call 2d3 + while (*s != 0) { + 502: 0f b6 03 movzbl (%ebx),%eax + 505: 83 c4 10 add $0x10,%esp + 508: 84 c0 test %al,%al + 50a: 75 e4 jne 4f0 + state = 0; + 50c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 50f: 31 c9 xor %ecx,%ecx + 511: e9 1c ff ff ff jmp 432 + 516: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 51d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 520: 83 ec 0c sub $0xc,%esp + 523: b9 0a 00 00 00 mov $0xa,%ecx + 528: 6a 01 push $0x1 + 52a: e9 7b ff ff ff jmp 4aa + 52f: 90 nop + putc(fd, *ap); + 530: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 533: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 536: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 538: 6a 01 push $0x1 + 53a: 57 push %edi + 53b: 56 push %esi + putc(fd, *ap); + 53c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 53f: e8 8f fd ff ff call 2d3 + ap++; + 544: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 548: 83 c4 10 add $0x10,%esp + state = 0; + 54b: 31 c9 xor %ecx,%ecx + 54d: e9 e0 fe ff ff jmp 432 + 552: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 558: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 55b: 83 ec 04 sub $0x4,%esp + 55e: e9 2a ff ff ff jmp 48d + 563: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 567: 90 nop + s = "(null)"; + 568: ba 08 07 00 00 mov $0x708,%edx + while (*s != 0) { + 56d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 570: b8 28 00 00 00 mov $0x28,%eax + 575: 89 d3 mov %edx,%ebx + 577: e9 74 ff ff ff jmp 4f0 + 57c: 66 90 xchg %ax,%ax + 57e: 66 90 xchg %ax,%ax + +00000580 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 580: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 581: a1 08 0a 00 00 mov 0xa08,%eax +void free(void *ap) { + 586: 89 e5 mov %esp,%ebp + 588: 57 push %edi + 589: 56 push %esi + 58a: 53 push %ebx + 58b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 58e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 591: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 598: 89 c2 mov %eax,%edx + 59a: 8b 00 mov (%eax),%eax + 59c: 39 ca cmp %ecx,%edx + 59e: 73 30 jae 5d0 + 5a0: 39 c1 cmp %eax,%ecx + 5a2: 72 04 jb 5a8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5a4: 39 c2 cmp %eax,%edx + 5a6: 72 f0 jb 598 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 5a8: 8b 73 fc mov -0x4(%ebx),%esi + 5ab: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5ae: 39 f8 cmp %edi,%eax + 5b0: 74 30 je 5e2 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 5b2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 5b5: 8b 42 04 mov 0x4(%edx),%eax + 5b8: 8d 34 c2 lea (%edx,%eax,8),%esi + 5bb: 39 f1 cmp %esi,%ecx + 5bd: 74 3a je 5f9 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 5bf: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 5c1: 5b pop %ebx + freep = p; + 5c2: 89 15 08 0a 00 00 mov %edx,0xa08 +} + 5c8: 5e pop %esi + 5c9: 5f pop %edi + 5ca: 5d pop %ebp + 5cb: c3 ret + 5cc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5d0: 39 c2 cmp %eax,%edx + 5d2: 72 c4 jb 598 + 5d4: 39 c1 cmp %eax,%ecx + 5d6: 73 c0 jae 598 + if (bp + bp->s.size == p->s.ptr) { + 5d8: 8b 73 fc mov -0x4(%ebx),%esi + 5db: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5de: 39 f8 cmp %edi,%eax + 5e0: 75 d0 jne 5b2 + bp->s.size += p->s.ptr->s.size; + 5e2: 03 70 04 add 0x4(%eax),%esi + 5e5: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 5e8: 8b 02 mov (%edx),%eax + 5ea: 8b 00 mov (%eax),%eax + 5ec: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 5ef: 8b 42 04 mov 0x4(%edx),%eax + 5f2: 8d 34 c2 lea (%edx,%eax,8),%esi + 5f5: 39 f1 cmp %esi,%ecx + 5f7: 75 c6 jne 5bf + p->s.size += bp->s.size; + 5f9: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 5fc: 89 15 08 0a 00 00 mov %edx,0xa08 + p->s.size += bp->s.size; + 602: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 605: 8b 4b f8 mov -0x8(%ebx),%ecx + 608: 89 0a mov %ecx,(%edx) +} + 60a: 5b pop %ebx + 60b: 5e pop %esi + 60c: 5f pop %edi + 60d: 5d pop %ebp + 60e: c3 ret + 60f: 90 nop + +00000610 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 610: 55 push %ebp + 611: 89 e5 mov %esp,%ebp + 613: 57 push %edi + 614: 56 push %esi + 615: 53 push %ebx + 616: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 619: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 61c: 8b 3d 08 0a 00 00 mov 0xa08,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 622: 8d 70 07 lea 0x7(%eax),%esi + 625: c1 ee 03 shr $0x3,%esi + 628: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 62b: 85 ff test %edi,%edi + 62d: 0f 84 9d 00 00 00 je 6d0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 633: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 635: 8b 4a 04 mov 0x4(%edx),%ecx + 638: 39 f1 cmp %esi,%ecx + 63a: 73 6a jae 6a6 + 63c: bb 00 10 00 00 mov $0x1000,%ebx + 641: 39 de cmp %ebx,%esi + 643: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 646: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 64d: 89 45 e4 mov %eax,-0x1c(%ebp) + 650: eb 17 jmp 669 + 652: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 658: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 65a: 8b 48 04 mov 0x4(%eax),%ecx + 65d: 39 f1 cmp %esi,%ecx + 65f: 73 4f jae 6b0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 661: 8b 3d 08 0a 00 00 mov 0xa08,%edi + 667: 89 c2 mov %eax,%edx + 669: 39 d7 cmp %edx,%edi + 66b: 75 eb jne 658 + p = sbrk(nu * sizeof(Header)); + 66d: 83 ec 0c sub $0xc,%esp + 670: ff 75 e4 push -0x1c(%ebp) + 673: e8 3b fc ff ff call 2b3 + if (p == (char*)-1) { + 678: 83 c4 10 add $0x10,%esp + 67b: 83 f8 ff cmp $0xffffffff,%eax + 67e: 74 1c je 69c + hp->s.size = nu; + 680: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 683: 83 ec 0c sub $0xc,%esp + 686: 83 c0 08 add $0x8,%eax + 689: 50 push %eax + 68a: e8 f1 fe ff ff call 580 + return freep; + 68f: 8b 15 08 0a 00 00 mov 0xa08,%edx + if ((p = morecore(nunits)) == 0) { + 695: 83 c4 10 add $0x10,%esp + 698: 85 d2 test %edx,%edx + 69a: 75 bc jne 658 + return 0; + } + } + } +} + 69c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 69f: 31 c0 xor %eax,%eax +} + 6a1: 5b pop %ebx + 6a2: 5e pop %esi + 6a3: 5f pop %edi + 6a4: 5d pop %ebp + 6a5: c3 ret + if (p->s.size >= nunits) { + 6a6: 89 d0 mov %edx,%eax + 6a8: 89 fa mov %edi,%edx + 6aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 6b0: 39 ce cmp %ecx,%esi + 6b2: 74 4c je 700 + p->s.size -= nunits; + 6b4: 29 f1 sub %esi,%ecx + 6b6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 6b9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 6bc: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 6bf: 89 15 08 0a 00 00 mov %edx,0xa08 +} + 6c5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 6c8: 83 c0 08 add $0x8,%eax +} + 6cb: 5b pop %ebx + 6cc: 5e pop %esi + 6cd: 5f pop %edi + 6ce: 5d pop %ebp + 6cf: c3 ret + base.s.ptr = freep = prevp = &base; + 6d0: c7 05 08 0a 00 00 0c movl $0xa0c,0xa08 + 6d7: 0a 00 00 + base.s.size = 0; + 6da: bf 0c 0a 00 00 mov $0xa0c,%edi + base.s.ptr = freep = prevp = &base; + 6df: c7 05 0c 0a 00 00 0c movl $0xa0c,0xa0c + 6e6: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6e9: 89 fa mov %edi,%edx + base.s.size = 0; + 6eb: c7 05 10 0a 00 00 00 movl $0x0,0xa10 + 6f2: 00 00 00 + if (p->s.size >= nunits) { + 6f5: e9 42 ff ff ff jmp 63c + 6fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 700: 8b 08 mov (%eax),%ecx + 702: 89 0a mov %ecx,(%edx) + 704: eb b9 jmp 6bf diff --git a/cls.d b/cls.d new file mode 100644 index 0000000..e190e0d --- /dev/null +++ b/cls.d @@ -0,0 +1 @@ +cls.o: cls.c /usr/include/stdc-predef.h types.h user.h diff --git a/cls.o b/cls.o new file mode 100644 index 0000000000000000000000000000000000000000..de9d3b9877e718d8cf9c72e0bc8ecb66c534bdd4 GIT binary patch literal 2620 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 U@+I|iU#7=h@|t{!GcE4_0CyGl@&Et; literal 0 HcmV?d00001 diff --git a/count.asm b/count.asm new file mode 100644 index 0000000..0681283 --- /dev/null +++ b/count.asm @@ -0,0 +1,1275 @@ + +_count: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "user.h" + +// Simple user app to do a count from 0 to the given number (1000 by defaulf) +// for testing concurrency +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 18 sub $0x18,%esp + 14: 8b 01 mov (%ecx),%eax + 16: 8b 71 04 mov 0x4(%ecx),%esi + 19: 89 45 e4 mov %eax,-0x1c(%ebp) + int countto = 1000; + + for (int i = 1; i < argc; i++) { + 1c: 83 f8 01 cmp $0x1,%eax + 1f: 0f 8e f5 00 00 00 jle 11a + 25: bf 01 00 00 00 mov $0x1,%edi + int countto = 1000; + 2a: bb e8 03 00 00 mov $0x3e8,%ebx + 2f: eb 20 jmp 51 + 31: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (strcmp(argv[i], "-c") == 0) { + countto = atoi(argv[i + 1]); + 38: 83 ec 0c sub $0xc,%esp + 3b: ff 74 be 04 push 0x4(%esi,%edi,4) + 3f: e8 dc 02 00 00 call 320 + 44: 83 c4 10 add $0x10,%esp + 47: 89 c3 mov %eax,%ebx + for (int i = 1; i < argc; i++) { + 49: 83 c7 01 add $0x1,%edi + 4c: 39 7d e4 cmp %edi,-0x1c(%ebp) + 4f: 74 6b je bc + if (strcmp(argv[i], "-c") == 0) { + 51: 83 ec 08 sub $0x8,%esp + 54: 68 38 08 00 00 push $0x838 + 59: ff 34 be push (%esi,%edi,4) + 5c: e8 0f 01 00 00 call 170 + 61: 83 c4 10 add $0x10,%esp + 64: 85 c0 test %eax,%eax + 66: 74 d0 je 38 + } + else if (strcmp(argv[i], "-help") == 0) + 68: 83 ec 08 sub $0x8,%esp + 6b: 68 3b 08 00 00 push $0x83b + 70: ff 34 be push (%esi,%edi,4) + 73: e8 f8 00 00 00 call 170 + 78: 83 c4 10 add $0x10,%esp + 7b: 85 c0 test %eax,%eax + 7d: 75 ca jne 49 + { + printf(1, "Counts from 0 to the given number.\n"); + 7f: 51 push %ecx + 80: 51 push %ecx + 81: 68 78 08 00 00 push $0x878 + 86: 6a 01 push $0x1 + 88: e8 83 04 00 00 call 510 + printf(1, "Default: 1000\n"); + 8d: 5b pop %ebx + 8e: 5e pop %esi + 8f: 68 41 08 00 00 push $0x841 + 94: 6a 01 push $0x1 + 96: e8 75 04 00 00 call 510 + printf(1, "Options:\n"); + 9b: 5f pop %edi + 9c: 58 pop %eax + 9d: 68 50 08 00 00 push $0x850 + a2: 6a 01 push $0x1 + a4: e8 67 04 00 00 call 510 + printf(1, "-c [Number] : Sets the value to count upto.\n"); + a9: 58 pop %eax + aa: 5a pop %edx + ab: 68 9c 08 00 00 push $0x89c + b0: 6a 01 push $0x1 + b2: e8 59 04 00 00 call 510 + exit(); + b7: e8 d7 02 00 00 call 393 + return 0; + } + } + + cls(); + bc: e8 92 03 00 00 call 453 + printf(1, "Start Count\n"); + c1: 50 push %eax + c2: 50 push %eax + c3: 68 5a 08 00 00 push $0x85a + c8: 6a 01 push $0x1 + ca: e8 41 04 00 00 call 510 + for (int i = 0; i < countto; i++) + cf: 83 c4 10 add $0x10,%esp + d2: 85 db test %ebx,%ebx + d4: 7e 30 jle 106 + d6: 31 f6 xor %esi,%esi + d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + df: 90 nop + { + printf(1, "%d\n", i); + e0: 83 ec 04 sub $0x4,%esp + e3: 56 push %esi + for (int i = 0; i < countto; i++) + e4: 83 c6 01 add $0x1,%esi + printf(1, "%d\n", i); + e7: 68 67 08 00 00 push $0x867 + ec: 6a 01 push $0x1 + ee: e8 1d 04 00 00 call 510 + sleep(10); + f3: c7 04 24 0a 00 00 00 movl $0xa,(%esp) + fa: e8 ec 02 00 00 call 3eb + for (int i = 0; i < countto; i++) + ff: 83 c4 10 add $0x10,%esp + 102: 39 f3 cmp %esi,%ebx + 104: 7f da jg e0 + } + printf(1, "Count Ended\n"); + 106: 83 ec 08 sub $0x8,%esp + 109: 68 6b 08 00 00 push $0x86b + 10e: 6a 01 push $0x1 + 110: e8 fb 03 00 00 call 510 + exit(); + 115: e8 79 02 00 00 call 393 + cls(); + 11a: e8 34 03 00 00 call 453 + int countto = 1000; + 11f: bb e8 03 00 00 mov $0x3e8,%ebx + printf(1, "Start Count\n"); + 124: 52 push %edx + 125: 52 push %edx + 126: 68 5a 08 00 00 push $0x85a + 12b: 6a 01 push $0x1 + 12d: e8 de 03 00 00 call 510 + 132: 83 c4 10 add $0x10,%esp + 135: eb 9f jmp d6 + 137: 66 90 xchg %ax,%ax + 139: 66 90 xchg %ax,%ax + 13b: 66 90 xchg %ax,%ax + 13d: 66 90 xchg %ax,%ax + 13f: 90 nop + +00000140 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 140: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 141: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 143: 89 e5 mov %esp,%ebp + 145: 53 push %ebx + 146: 8b 4d 08 mov 0x8(%ebp),%ecx + 149: 8b 5d 0c mov 0xc(%ebp),%ebx + 14c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 150: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 154: 88 14 01 mov %dl,(%ecx,%eax,1) + 157: 83 c0 01 add $0x1,%eax + 15a: 84 d2 test %dl,%dl + 15c: 75 f2 jne 150 + ; + } + return os; +} + 15e: 8b 5d fc mov -0x4(%ebp),%ebx + 161: 89 c8 mov %ecx,%eax + 163: c9 leave + 164: c3 ret + 165: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 16c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000170 : + +int strcmp(const char *p, const char *q) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 53 push %ebx + 174: 8b 55 08 mov 0x8(%ebp),%edx + 177: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 17a: 0f b6 02 movzbl (%edx),%eax + 17d: 84 c0 test %al,%al + 17f: 75 17 jne 198 + 181: eb 3a jmp 1bd + 183: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 187: 90 nop + 188: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 18c: 83 c2 01 add $0x1,%edx + 18f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 192: 84 c0 test %al,%al + 194: 74 1a je 1b0 + p++, q++; + 196: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 198: 0f b6 19 movzbl (%ecx),%ebx + 19b: 38 c3 cmp %al,%bl + 19d: 74 e9 je 188 + } + return (uchar) * p - (uchar) * q; + 19f: 29 d8 sub %ebx,%eax +} + 1a1: 8b 5d fc mov -0x4(%ebp),%ebx + 1a4: c9 leave + 1a5: c3 ret + 1a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ad: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 1b0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 1b4: 31 c0 xor %eax,%eax + 1b6: 29 d8 sub %ebx,%eax +} + 1b8: 8b 5d fc mov -0x4(%ebp),%ebx + 1bb: c9 leave + 1bc: c3 ret + return (uchar) * p - (uchar) * q; + 1bd: 0f b6 19 movzbl (%ecx),%ebx + 1c0: 31 c0 xor %eax,%eax + 1c2: eb db jmp 19f + 1c4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1cb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1cf: 90 nop + +000001d0 : + +uint strlen(const char *s) { + 1d0: 55 push %ebp + 1d1: 89 e5 mov %esp,%ebp + 1d3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 1d6: 80 3a 00 cmpb $0x0,(%edx) + 1d9: 74 15 je 1f0 + 1db: 31 c0 xor %eax,%eax + 1dd: 8d 76 00 lea 0x0(%esi),%esi + 1e0: 83 c0 01 add $0x1,%eax + 1e3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 1e7: 89 c1 mov %eax,%ecx + 1e9: 75 f5 jne 1e0 + ; + } + return n; +} + 1eb: 89 c8 mov %ecx,%eax + 1ed: 5d pop %ebp + 1ee: c3 ret + 1ef: 90 nop + for (n = 0; s[n]; n++) { + 1f0: 31 c9 xor %ecx,%ecx +} + 1f2: 5d pop %ebp + 1f3: 89 c8 mov %ecx,%eax + 1f5: c3 ret + 1f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1fd: 8d 76 00 lea 0x0(%esi),%esi + +00000200 : + +void* memset(void *dst, int c, uint n) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 57 push %edi + 204: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 207: 8b 4d 10 mov 0x10(%ebp),%ecx + 20a: 8b 45 0c mov 0xc(%ebp),%eax + 20d: 89 d7 mov %edx,%edi + 20f: fc cld + 210: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 212: 8b 7d fc mov -0x4(%ebp),%edi + 215: 89 d0 mov %edx,%eax + 217: c9 leave + 218: c3 ret + 219: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000220 : + +char* strchr(const char *s, char c) { + 220: 55 push %ebp + 221: 89 e5 mov %esp,%ebp + 223: 8b 45 08 mov 0x8(%ebp),%eax + 226: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 22a: 0f b6 10 movzbl (%eax),%edx + 22d: 84 d2 test %dl,%dl + 22f: 75 12 jne 243 + 231: eb 1d jmp 250 + 233: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 237: 90 nop + 238: 0f b6 50 01 movzbl 0x1(%eax),%edx + 23c: 83 c0 01 add $0x1,%eax + 23f: 84 d2 test %dl,%dl + 241: 74 0d je 250 + if (*s == c) { + 243: 38 d1 cmp %dl,%cl + 245: 75 f1 jne 238 + return (char*)s; + } + } + return 0; +} + 247: 5d pop %ebp + 248: c3 ret + 249: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 250: 31 c0 xor %eax,%eax +} + 252: 5d pop %ebp + 253: c3 ret + 254: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 25f: 90 nop + +00000260 : + +char* gets(char *buf, int max) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 57 push %edi + 264: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 265: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 268: 53 push %ebx + for (i = 0; i + 1 < max;) { + 269: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 26b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 26e: eb 27 jmp 297 + cc = read(0, &c, 1); + 270: 83 ec 04 sub $0x4,%esp + 273: 6a 01 push $0x1 + 275: 57 push %edi + 276: 6a 00 push $0x0 + 278: e8 2e 01 00 00 call 3ab + if (cc < 1) { + 27d: 83 c4 10 add $0x10,%esp + 280: 85 c0 test %eax,%eax + 282: 7e 1d jle 2a1 + break; + } + buf[i++] = c; + 284: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 288: 8b 55 08 mov 0x8(%ebp),%edx + 28b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 28f: 3c 0a cmp $0xa,%al + 291: 74 1d je 2b0 + 293: 3c 0d cmp $0xd,%al + 295: 74 19 je 2b0 + for (i = 0; i + 1 < max;) { + 297: 89 de mov %ebx,%esi + 299: 83 c3 01 add $0x1,%ebx + 29c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 29f: 7c cf jl 270 + break; + } + } + buf[i] = '\0'; + 2a1: 8b 45 08 mov 0x8(%ebp),%eax + 2a4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 2a8: 8d 65 f4 lea -0xc(%ebp),%esp + 2ab: 5b pop %ebx + 2ac: 5e pop %esi + 2ad: 5f pop %edi + 2ae: 5d pop %ebp + 2af: c3 ret + buf[i] = '\0'; + 2b0: 8b 45 08 mov 0x8(%ebp),%eax + 2b3: 89 de mov %ebx,%esi + 2b5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 2b9: 8d 65 f4 lea -0xc(%ebp),%esp + 2bc: 5b pop %ebx + 2bd: 5e pop %esi + 2be: 5f pop %edi + 2bf: 5d pop %ebp + 2c0: c3 ret + 2c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2cf: 90 nop + +000002d0 : + +int stat(const char *n, struct stat *st) { + 2d0: 55 push %ebp + 2d1: 89 e5 mov %esp,%ebp + 2d3: 56 push %esi + 2d4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 2d5: 83 ec 08 sub $0x8,%esp + 2d8: 6a 00 push $0x0 + 2da: ff 75 08 push 0x8(%ebp) + 2dd: e8 19 01 00 00 call 3fb + if (fd < 0) { + 2e2: 83 c4 10 add $0x10,%esp + 2e5: 85 c0 test %eax,%eax + 2e7: 78 27 js 310 + return -1; + } + r = fstat(fd, st); + 2e9: 83 ec 08 sub $0x8,%esp + 2ec: ff 75 0c push 0xc(%ebp) + 2ef: 89 c3 mov %eax,%ebx + 2f1: 50 push %eax + 2f2: e8 cc 00 00 00 call 3c3 + close(fd); + 2f7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 2fa: 89 c6 mov %eax,%esi + close(fd); + 2fc: e8 2a 01 00 00 call 42b + return r; + 301: 83 c4 10 add $0x10,%esp +} + 304: 8d 65 f8 lea -0x8(%ebp),%esp + 307: 89 f0 mov %esi,%eax + 309: 5b pop %ebx + 30a: 5e pop %esi + 30b: 5d pop %ebp + 30c: c3 ret + 30d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 310: be ff ff ff ff mov $0xffffffff,%esi + 315: eb ed jmp 304 + 317: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 31e: 66 90 xchg %ax,%ax + +00000320 : + +int atoi(const char *s) { + 320: 55 push %ebp + 321: 89 e5 mov %esp,%ebp + 323: 53 push %ebx + 324: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 327: 0f be 02 movsbl (%edx),%eax + 32a: 8d 48 d0 lea -0x30(%eax),%ecx + 32d: 80 f9 09 cmp $0x9,%cl + n = 0; + 330: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 335: 77 1e ja 355 + 337: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 33e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 340: 83 c2 01 add $0x1,%edx + 343: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 346: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 34a: 0f be 02 movsbl (%edx),%eax + 34d: 8d 58 d0 lea -0x30(%eax),%ebx + 350: 80 fb 09 cmp $0x9,%bl + 353: 76 eb jbe 340 + } + return n; +} + 355: 8b 5d fc mov -0x4(%ebp),%ebx + 358: 89 c8 mov %ecx,%eax + 35a: c9 leave + 35b: c3 ret + 35c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000360 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 360: 55 push %ebp + 361: 89 e5 mov %esp,%ebp + 363: 57 push %edi + 364: 8b 45 10 mov 0x10(%ebp),%eax + 367: 8b 55 08 mov 0x8(%ebp),%edx + 36a: 56 push %esi + 36b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 36e: 85 c0 test %eax,%eax + 370: 7e 13 jle 385 + 372: 01 d0 add %edx,%eax + dst = vdst; + 374: 89 d7 mov %edx,%edi + 376: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 37d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 380: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 381: 39 f8 cmp %edi,%eax + 383: 75 fb jne 380 + } + return vdst; +} + 385: 5e pop %esi + 386: 89 d0 mov %edx,%eax + 388: 5f pop %edi + 389: 5d pop %ebp + 38a: c3 ret + +0000038b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 38b: b8 01 00 00 00 mov $0x1,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(exit) + 393: b8 02 00 00 00 mov $0x2,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(wait) + 39b: b8 03 00 00 00 mov $0x3,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(pipe) + 3a3: b8 04 00 00 00 mov $0x4,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + +000003ab : +SYSCALL(read) + 3ab: b8 05 00 00 00 mov $0x5,%eax + 3b0: cd 40 int $0x40 + 3b2: c3 ret + +000003b3 : +SYSCALL(kill) + 3b3: b8 06 00 00 00 mov $0x6,%eax + 3b8: cd 40 int $0x40 + 3ba: c3 ret + +000003bb : +SYSCALL(exec) + 3bb: b8 07 00 00 00 mov $0x7,%eax + 3c0: cd 40 int $0x40 + 3c2: c3 ret + +000003c3 : +SYSCALL(fstat) + 3c3: b8 08 00 00 00 mov $0x8,%eax + 3c8: cd 40 int $0x40 + 3ca: c3 ret + +000003cb : +SYSCALL(chdir) + 3cb: b8 09 00 00 00 mov $0x9,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(dup) + 3d3: b8 0a 00 00 00 mov $0xa,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(getpid) + 3db: b8 0b 00 00 00 mov $0xb,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(sbrk) + 3e3: b8 0c 00 00 00 mov $0xc,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(sleep) + 3eb: b8 0d 00 00 00 mov $0xd,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(uptime) + 3f3: b8 0e 00 00 00 mov $0xe,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + +000003fb : +SYSCALL(open) + 3fb: b8 0f 00 00 00 mov $0xf,%eax + 400: cd 40 int $0x40 + 402: c3 ret + +00000403 : +SYSCALL(write) + 403: b8 10 00 00 00 mov $0x10,%eax + 408: cd 40 int $0x40 + 40a: c3 ret + +0000040b : +SYSCALL(mknod) + 40b: b8 11 00 00 00 mov $0x11,%eax + 410: cd 40 int $0x40 + 412: c3 ret + +00000413 : +SYSCALL(unlink) + 413: b8 12 00 00 00 mov $0x12,%eax + 418: cd 40 int $0x40 + 41a: c3 ret + +0000041b : +SYSCALL(link) + 41b: b8 13 00 00 00 mov $0x13,%eax + 420: cd 40 int $0x40 + 422: c3 ret + +00000423 : +SYSCALL(mkdir) + 423: b8 14 00 00 00 mov $0x14,%eax + 428: cd 40 int $0x40 + 42a: c3 ret + +0000042b : +SYSCALL(close) + 42b: b8 15 00 00 00 mov $0x15,%eax + 430: cd 40 int $0x40 + 432: c3 ret + +00000433 : +SYSCALL(getch) + 433: b8 16 00 00 00 mov $0x16,%eax + 438: cd 40 int $0x40 + 43a: c3 ret + +0000043b : +SYSCALL(greeting) + 43b: b8 17 00 00 00 mov $0x17,%eax + 440: cd 40 int $0x40 + 442: c3 ret + +00000443 : +SYSCALL(shutdown) + 443: b8 18 00 00 00 mov $0x18,%eax + 448: cd 40 int $0x40 + 44a: c3 ret + +0000044b : +SYSCALL(screen) + 44b: b8 19 00 00 00 mov $0x19,%eax + 450: cd 40 int $0x40 + 452: c3 ret + +00000453 : +SYSCALL(cls) + 453: b8 1a 00 00 00 mov $0x1a,%eax + 458: cd 40 int $0x40 + 45a: c3 ret + 45b: 66 90 xchg %ax,%ax + 45d: 66 90 xchg %ax,%ax + 45f: 90 nop + +00000460 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 460: 55 push %ebp + 461: 89 e5 mov %esp,%ebp + 463: 57 push %edi + 464: 56 push %esi + 465: 53 push %ebx + 466: 83 ec 3c sub $0x3c,%esp + 469: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 46c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 46e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 471: 85 d2 test %edx,%edx + 473: 0f 89 7f 00 00 00 jns 4f8 + 479: f6 45 08 01 testb $0x1,0x8(%ebp) + 47d: 74 79 je 4f8 + neg = 1; + 47f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 486: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 488: 31 db xor %ebx,%ebx + 48a: 8d 75 d7 lea -0x29(%ebp),%esi + 48d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 490: 89 c8 mov %ecx,%eax + 492: 31 d2 xor %edx,%edx + 494: 89 cf mov %ecx,%edi + 496: f7 75 c4 divl -0x3c(%ebp) + 499: 0f b6 92 28 09 00 00 movzbl 0x928(%edx),%edx + 4a0: 89 45 c0 mov %eax,-0x40(%ebp) + 4a3: 89 d8 mov %ebx,%eax + 4a5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 4a8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 4ab: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 4ae: 39 7d c4 cmp %edi,-0x3c(%ebp) + 4b1: 76 dd jbe 490 + if (neg) { + 4b3: 8b 4d bc mov -0x44(%ebp),%ecx + 4b6: 85 c9 test %ecx,%ecx + 4b8: 74 0c je 4c6 + buf[i++] = '-'; + 4ba: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 4bf: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 4c1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 4c6: 8b 7d b8 mov -0x48(%ebp),%edi + 4c9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 4cd: eb 07 jmp 4d6 + 4cf: 90 nop + putc(fd, buf[i]); + 4d0: 0f b6 13 movzbl (%ebx),%edx + 4d3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 4d6: 83 ec 04 sub $0x4,%esp + 4d9: 88 55 d7 mov %dl,-0x29(%ebp) + 4dc: 6a 01 push $0x1 + 4de: 56 push %esi + 4df: 57 push %edi + 4e0: e8 1e ff ff ff call 403 + while (--i >= 0) { + 4e5: 83 c4 10 add $0x10,%esp + 4e8: 39 de cmp %ebx,%esi + 4ea: 75 e4 jne 4d0 + } +} + 4ec: 8d 65 f4 lea -0xc(%ebp),%esp + 4ef: 5b pop %ebx + 4f0: 5e pop %esi + 4f1: 5f pop %edi + 4f2: 5d pop %ebp + 4f3: c3 ret + 4f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 4f8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 4ff: eb 87 jmp 488 + 501: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 508: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 50f: 90 nop + +00000510 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 510: 55 push %ebp + 511: 89 e5 mov %esp,%ebp + 513: 57 push %edi + 514: 56 push %esi + 515: 53 push %ebx + 516: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 519: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 51c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 51f: 0f b6 13 movzbl (%ebx),%edx + 522: 84 d2 test %dl,%dl + 524: 74 6a je 590 + ap = (uint*)(void*)&fmt + 1; + 526: 8d 45 10 lea 0x10(%ebp),%eax + 529: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 52c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 52f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 531: 89 45 d0 mov %eax,-0x30(%ebp) + 534: eb 36 jmp 56c + 536: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 53d: 8d 76 00 lea 0x0(%esi),%esi + 540: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 543: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 548: 83 f8 25 cmp $0x25,%eax + 54b: 74 15 je 562 + write(fd, &c, 1); + 54d: 83 ec 04 sub $0x4,%esp + 550: 88 55 e7 mov %dl,-0x19(%ebp) + 553: 6a 01 push $0x1 + 555: 57 push %edi + 556: 56 push %esi + 557: e8 a7 fe ff ff call 403 + 55c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 55f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 562: 0f b6 13 movzbl (%ebx),%edx + 565: 83 c3 01 add $0x1,%ebx + 568: 84 d2 test %dl,%dl + 56a: 74 24 je 590 + c = fmt[i] & 0xff; + 56c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 56f: 85 c9 test %ecx,%ecx + 571: 74 cd je 540 + } + } + else if (state == '%') { + 573: 83 f9 25 cmp $0x25,%ecx + 576: 75 ea jne 562 + if (c == 'd') { + 578: 83 f8 25 cmp $0x25,%eax + 57b: 0f 84 07 01 00 00 je 688 + 581: 83 e8 63 sub $0x63,%eax + 584: 83 f8 15 cmp $0x15,%eax + 587: 77 17 ja 5a0 + 589: ff 24 85 d0 08 00 00 jmp *0x8d0(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 590: 8d 65 f4 lea -0xc(%ebp),%esp + 593: 5b pop %ebx + 594: 5e pop %esi + 595: 5f pop %edi + 596: 5d pop %ebp + 597: c3 ret + 598: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 59f: 90 nop + write(fd, &c, 1); + 5a0: 83 ec 04 sub $0x4,%esp + 5a3: 88 55 d4 mov %dl,-0x2c(%ebp) + 5a6: 6a 01 push $0x1 + 5a8: 57 push %edi + 5a9: 56 push %esi + 5aa: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 5ae: e8 50 fe ff ff call 403 + putc(fd, c); + 5b3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 5b7: 83 c4 0c add $0xc,%esp + 5ba: 88 55 e7 mov %dl,-0x19(%ebp) + 5bd: 6a 01 push $0x1 + 5bf: 57 push %edi + 5c0: 56 push %esi + 5c1: e8 3d fe ff ff call 403 + putc(fd, c); + 5c6: 83 c4 10 add $0x10,%esp + state = 0; + 5c9: 31 c9 xor %ecx,%ecx + 5cb: eb 95 jmp 562 + 5cd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 5d0: 83 ec 0c sub $0xc,%esp + 5d3: b9 10 00 00 00 mov $0x10,%ecx + 5d8: 6a 00 push $0x0 + 5da: 8b 45 d0 mov -0x30(%ebp),%eax + 5dd: 8b 10 mov (%eax),%edx + 5df: 89 f0 mov %esi,%eax + 5e1: e8 7a fe ff ff call 460 + ap++; + 5e6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5ea: 83 c4 10 add $0x10,%esp + state = 0; + 5ed: 31 c9 xor %ecx,%ecx + 5ef: e9 6e ff ff ff jmp 562 + 5f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 5f8: 8b 45 d0 mov -0x30(%ebp),%eax + 5fb: 8b 10 mov (%eax),%edx + ap++; + 5fd: 83 c0 04 add $0x4,%eax + 600: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 603: 85 d2 test %edx,%edx + 605: 0f 84 8d 00 00 00 je 698 + while (*s != 0) { + 60b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 60e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 610: 84 c0 test %al,%al + 612: 0f 84 4a ff ff ff je 562 + 618: 89 5d d4 mov %ebx,-0x2c(%ebp) + 61b: 89 d3 mov %edx,%ebx + 61d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 620: 83 ec 04 sub $0x4,%esp + s++; + 623: 83 c3 01 add $0x1,%ebx + 626: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 629: 6a 01 push $0x1 + 62b: 57 push %edi + 62c: 56 push %esi + 62d: e8 d1 fd ff ff call 403 + while (*s != 0) { + 632: 0f b6 03 movzbl (%ebx),%eax + 635: 83 c4 10 add $0x10,%esp + 638: 84 c0 test %al,%al + 63a: 75 e4 jne 620 + state = 0; + 63c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 63f: 31 c9 xor %ecx,%ecx + 641: e9 1c ff ff ff jmp 562 + 646: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 64d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 650: 83 ec 0c sub $0xc,%esp + 653: b9 0a 00 00 00 mov $0xa,%ecx + 658: 6a 01 push $0x1 + 65a: e9 7b ff ff ff jmp 5da + 65f: 90 nop + putc(fd, *ap); + 660: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 663: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 666: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 668: 6a 01 push $0x1 + 66a: 57 push %edi + 66b: 56 push %esi + putc(fd, *ap); + 66c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 66f: e8 8f fd ff ff call 403 + ap++; + 674: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 678: 83 c4 10 add $0x10,%esp + state = 0; + 67b: 31 c9 xor %ecx,%ecx + 67d: e9 e0 fe ff ff jmp 562 + 682: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 688: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 68b: 83 ec 04 sub $0x4,%esp + 68e: e9 2a ff ff ff jmp 5bd + 693: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 697: 90 nop + s = "(null)"; + 698: ba c9 08 00 00 mov $0x8c9,%edx + while (*s != 0) { + 69d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 6a0: b8 28 00 00 00 mov $0x28,%eax + 6a5: 89 d3 mov %edx,%ebx + 6a7: e9 74 ff ff ff jmp 620 + 6ac: 66 90 xchg %ax,%ax + 6ae: 66 90 xchg %ax,%ax + +000006b0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 6b0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 6b1: a1 dc 0b 00 00 mov 0xbdc,%eax +void free(void *ap) { + 6b6: 89 e5 mov %esp,%ebp + 6b8: 57 push %edi + 6b9: 56 push %esi + 6ba: 53 push %ebx + 6bb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 6be: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 6c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6c8: 89 c2 mov %eax,%edx + 6ca: 8b 00 mov (%eax),%eax + 6cc: 39 ca cmp %ecx,%edx + 6ce: 73 30 jae 700 + 6d0: 39 c1 cmp %eax,%ecx + 6d2: 72 04 jb 6d8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 6d4: 39 c2 cmp %eax,%edx + 6d6: 72 f0 jb 6c8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 6d8: 8b 73 fc mov -0x4(%ebx),%esi + 6db: 8d 3c f1 lea (%ecx,%esi,8),%edi + 6de: 39 f8 cmp %edi,%eax + 6e0: 74 30 je 712 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 6e2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 6e5: 8b 42 04 mov 0x4(%edx),%eax + 6e8: 8d 34 c2 lea (%edx,%eax,8),%esi + 6eb: 39 f1 cmp %esi,%ecx + 6ed: 74 3a je 729 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 6ef: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 6f1: 5b pop %ebx + freep = p; + 6f2: 89 15 dc 0b 00 00 mov %edx,0xbdc +} + 6f8: 5e pop %esi + 6f9: 5f pop %edi + 6fa: 5d pop %ebp + 6fb: c3 ret + 6fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 700: 39 c2 cmp %eax,%edx + 702: 72 c4 jb 6c8 + 704: 39 c1 cmp %eax,%ecx + 706: 73 c0 jae 6c8 + if (bp + bp->s.size == p->s.ptr) { + 708: 8b 73 fc mov -0x4(%ebx),%esi + 70b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 70e: 39 f8 cmp %edi,%eax + 710: 75 d0 jne 6e2 + bp->s.size += p->s.ptr->s.size; + 712: 03 70 04 add 0x4(%eax),%esi + 715: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 718: 8b 02 mov (%edx),%eax + 71a: 8b 00 mov (%eax),%eax + 71c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 71f: 8b 42 04 mov 0x4(%edx),%eax + 722: 8d 34 c2 lea (%edx,%eax,8),%esi + 725: 39 f1 cmp %esi,%ecx + 727: 75 c6 jne 6ef + p->s.size += bp->s.size; + 729: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 72c: 89 15 dc 0b 00 00 mov %edx,0xbdc + p->s.size += bp->s.size; + 732: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 735: 8b 4b f8 mov -0x8(%ebx),%ecx + 738: 89 0a mov %ecx,(%edx) +} + 73a: 5b pop %ebx + 73b: 5e pop %esi + 73c: 5f pop %edi + 73d: 5d pop %ebp + 73e: c3 ret + 73f: 90 nop + +00000740 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 740: 55 push %ebp + 741: 89 e5 mov %esp,%ebp + 743: 57 push %edi + 744: 56 push %esi + 745: 53 push %ebx + 746: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 749: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 74c: 8b 3d dc 0b 00 00 mov 0xbdc,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 752: 8d 70 07 lea 0x7(%eax),%esi + 755: c1 ee 03 shr $0x3,%esi + 758: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 75b: 85 ff test %edi,%edi + 75d: 0f 84 9d 00 00 00 je 800 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 763: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 765: 8b 4a 04 mov 0x4(%edx),%ecx + 768: 39 f1 cmp %esi,%ecx + 76a: 73 6a jae 7d6 + 76c: bb 00 10 00 00 mov $0x1000,%ebx + 771: 39 de cmp %ebx,%esi + 773: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 776: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 77d: 89 45 e4 mov %eax,-0x1c(%ebp) + 780: eb 17 jmp 799 + 782: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 788: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 78a: 8b 48 04 mov 0x4(%eax),%ecx + 78d: 39 f1 cmp %esi,%ecx + 78f: 73 4f jae 7e0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 791: 8b 3d dc 0b 00 00 mov 0xbdc,%edi + 797: 89 c2 mov %eax,%edx + 799: 39 d7 cmp %edx,%edi + 79b: 75 eb jne 788 + p = sbrk(nu * sizeof(Header)); + 79d: 83 ec 0c sub $0xc,%esp + 7a0: ff 75 e4 push -0x1c(%ebp) + 7a3: e8 3b fc ff ff call 3e3 + if (p == (char*)-1) { + 7a8: 83 c4 10 add $0x10,%esp + 7ab: 83 f8 ff cmp $0xffffffff,%eax + 7ae: 74 1c je 7cc + hp->s.size = nu; + 7b0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 7b3: 83 ec 0c sub $0xc,%esp + 7b6: 83 c0 08 add $0x8,%eax + 7b9: 50 push %eax + 7ba: e8 f1 fe ff ff call 6b0 + return freep; + 7bf: 8b 15 dc 0b 00 00 mov 0xbdc,%edx + if ((p = morecore(nunits)) == 0) { + 7c5: 83 c4 10 add $0x10,%esp + 7c8: 85 d2 test %edx,%edx + 7ca: 75 bc jne 788 + return 0; + } + } + } +} + 7cc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 7cf: 31 c0 xor %eax,%eax +} + 7d1: 5b pop %ebx + 7d2: 5e pop %esi + 7d3: 5f pop %edi + 7d4: 5d pop %ebp + 7d5: c3 ret + if (p->s.size >= nunits) { + 7d6: 89 d0 mov %edx,%eax + 7d8: 89 fa mov %edi,%edx + 7da: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 7e0: 39 ce cmp %ecx,%esi + 7e2: 74 4c je 830 + p->s.size -= nunits; + 7e4: 29 f1 sub %esi,%ecx + 7e6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 7e9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 7ec: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 7ef: 89 15 dc 0b 00 00 mov %edx,0xbdc +} + 7f5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 7f8: 83 c0 08 add $0x8,%eax +} + 7fb: 5b pop %ebx + 7fc: 5e pop %esi + 7fd: 5f pop %edi + 7fe: 5d pop %ebp + 7ff: c3 ret + base.s.ptr = freep = prevp = &base; + 800: c7 05 dc 0b 00 00 e0 movl $0xbe0,0xbdc + 807: 0b 00 00 + base.s.size = 0; + 80a: bf e0 0b 00 00 mov $0xbe0,%edi + base.s.ptr = freep = prevp = &base; + 80f: c7 05 e0 0b 00 00 e0 movl $0xbe0,0xbe0 + 816: 0b 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 819: 89 fa mov %edi,%edx + base.s.size = 0; + 81b: c7 05 e4 0b 00 00 00 movl $0x0,0xbe4 + 822: 00 00 00 + if (p->s.size >= nunits) { + 825: e9 42 ff ff ff jmp 76c + 82a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 830: 8b 08 mov (%eax),%ecx + 832: 89 0a mov %ecx,(%edx) + 834: eb b9 jmp 7ef diff --git a/count.d b/count.d new file mode 100644 index 0000000..c289379 --- /dev/null +++ b/count.d @@ -0,0 +1 @@ +count.o: count.c /usr/include/stdc-predef.h types.h user.h diff --git a/count.o b/count.o new file mode 100644 index 0000000000000000000000000000000000000000..d00400c54fc27e9c21ae08413f07033472b0763e GIT binary patch literal 4788 zcma)Ad2Ae48GmmsA8W6#QrkJ2agyc|yWVxI9B$eMl8{4DF4u`eTEgynygPJvcC$0% zI8mEOSfNBAQBr|Gp-Mn)|3JWB908FQ5Gm!5pddt~AW@JKDOD|w6i};{n&0>4z4h7% z(NB8s_ucQBckG_tw)( zFDzx9YO)z^*hlsV;R$=l9(Dp>cui!Ap+g}#%58_0pbY0aI=_3lF?IWIGsoT=IeX{O z!QuT=(>>?-xnsuJZMUc1=4}`L3FjZu2!C)_XY5V;{I^$7_|$aEOz^UC_q~~!nW-D? zXMZyFD&P3@?cm9&>Ba&%%nZJ)jAwonyhduo&sB%N*uP&me~Js=BcCWV!AD9*M+-f( z(&)zv%V#CwE~O1 zYiB)Xvx`9=I54k?H?RH~Gh#AsAci%jQ7wLeSkS5nM6DYQgu2$yOTZgr2s8c-zGp8g zDjHR+$uM0nV9mLr&$K?1bg}!$Y6-q&8RE3n)@Mj1qKIo{=Cc5uTMxh-KL_4;8&yAf zd>ut2FJ`o&T1C1WC_)z*+IkVjqZVLc>q&g>7V7p7L*!OmG9xxL*L*sVF(}>QTSF=UnC}jin_)p6>}bpN187y=4*<%rkLwsvM9`2 zgzEXIg$2~~^C(|H;cuZ5X=cDYgu?ibQ5_`a*QkW;Lx>d20x*=2F99Qb2Be9ZuY)sb zG8x~&p5~{!Fli>+3DB3bSnQFQ9>=66`J=she5g-*D7LZBT-m#`Yf~?WkJ-jzeFk}3 zF+S2ws)j+PHxBi2@{I57(z>sGv>RVd2Y)c$71Nh2Tr$$#!P}u~lKC4MYfducZybst zC>CYMCn1#aS>-dlcN4y>7TFo;9Cf6X_D+0-=y=;)hn-y=ywlp;b5iuU-DDVuh(+fR z)iFmA^|ljZn01PD>{n>PWMU7{bV;%Z4Q6PU48urk$536?NVu$B(MY_aT_c%ka|6;w z^IiR_k-otBuyLLLp5QWEg}T;?%%0ZLaD9&RLy_wt;R7$H{MD>2~of-;VZyve2Lbk(;i{Fsd|hmb15@LSGrBJ z>pruYo88=8YPIdUXLg@4;}^}QgJ!FB%j~weX*12xtoO}s!cAt=VOY4?a?gxg$IVW# z9rvJ_xM|te&#BzBMorV|K73QAjaz})gjn7Bin&bSj!1rlgi)ahBg-|>2sS@?2bATG zJ~?{WY_fEZo2K45YN@QI)q#z}dFc6W-gCxmI^z7Gnk!Y9GwFgalyU3LF=wjz9NWHU z#NLu#Z>Q7AwaJv7D6Jhp6@;GiaNhBps+)tDspbj~yX!WrvlIFJSk_MLh10lKPGm#3 z7`R>}pgA`eBr-)e2`1`8me1FFG9p5iGUN8`4O6ESGmuMH>p^rxb zZrbfzwhY;;MzVMdgmQWl=}?I2Qv(CZ)Zl8VrcaP=AR>P90OLpu4$=3o$Y6h`6T3!wZKp>n9s8%A zbS6%Kno4IlE$c{UbDlSNoyF>`IKx@nJh@|@j1#+#bj$+1Nr-5yooFBDe~sF~)kl!L zpk~EY3chciOnY7t+1DrmNOEnF#Rn37M$xvB--*~g^j3(zuFVM1aLbPXInInHNJb~c z)eD&xfaFh;9gncHBx4#bk_C;ytD_YozF?UB<+_az98|N62B{v zp7GTF&m{gvBAy;Xze8du@db&r<2bem;4nlN_NeY1-zof!S zq#1LvVg9J=jhB&1@R@A3>P*yIi{)I=^#f`FIiy!L+>s;Za&FSnxWIVv&wrC3rQ z6>_dzqEnkCJzObCTx$t&RYXlWg`?sQ!aRIHS_nTZS?vTIoEJwnqCOPjv2_LgFTa(r z;&b}Hequf0Hz2YxM)@{No`Bk-LeFkO zQ0%FBel6G|zoh_4%I_rP`gVWUf_%_XyXZo#-Dkn87_jV*$Y&EHN!jT9s?YZi#=V!*QZkuODzBxU<5jwS3Hbh@cddbe~}f ig&(aW: +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 08 sub $0x8,%esp + 14: 8b 31 mov (%ecx),%esi + 16: 8b 79 04 mov 0x4(%ecx),%edi + int i; + + for (i = 1; i < argc; i++) { + 19: 83 fe 01 cmp $0x1,%esi + 1c: 7e 47 jle 65 + 1e: bb 01 00 00 00 mov $0x1,%ebx + printf(1, "%s%s", argv[i], i + 1 < argc ? " " : "\n"); + 23: 83 c3 01 add $0x1,%ebx + 26: 8b 44 9f fc mov -0x4(%edi,%ebx,4),%eax + 2a: 39 f3 cmp %esi,%ebx + 2c: 74 22 je 50 + 2e: 66 90 xchg %ax,%ax + 30: 68 68 07 00 00 push $0x768 + 35: 83 c3 01 add $0x1,%ebx + 38: 50 push %eax + 39: 68 6a 07 00 00 push $0x76a + 3e: 6a 01 push $0x1 + 40: e8 fb 03 00 00 call 440 + 45: 8b 44 9f fc mov -0x4(%edi,%ebx,4),%eax + 49: 83 c4 10 add $0x10,%esp + 4c: 39 f3 cmp %esi,%ebx + 4e: 75 e0 jne 30 + 50: 68 6f 07 00 00 push $0x76f + 55: 50 push %eax + 56: 68 6a 07 00 00 push $0x76a + 5b: 6a 01 push $0x1 + 5d: e8 de 03 00 00 call 440 + 62: 83 c4 10 add $0x10,%esp + } + exit(); + 65: e8 59 02 00 00 call 2c3 + 6a: 66 90 xchg %ax,%ax + 6c: 66 90 xchg %ax,%ax + 6e: 66 90 xchg %ax,%ax + +00000070 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 70: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 71: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 73: 89 e5 mov %esp,%ebp + 75: 53 push %ebx + 76: 8b 4d 08 mov 0x8(%ebp),%ecx + 79: 8b 5d 0c mov 0xc(%ebp),%ebx + 7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 80: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 84: 88 14 01 mov %dl,(%ecx,%eax,1) + 87: 83 c0 01 add $0x1,%eax + 8a: 84 d2 test %dl,%dl + 8c: 75 f2 jne 80 + ; + } + return os; +} + 8e: 8b 5d fc mov -0x4(%ebp),%ebx + 91: 89 c8 mov %ecx,%eax + 93: c9 leave + 94: c3 ret + 95: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 9c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000000a0 : + +int strcmp(const char *p, const char *q) { + a0: 55 push %ebp + a1: 89 e5 mov %esp,%ebp + a3: 53 push %ebx + a4: 8b 55 08 mov 0x8(%ebp),%edx + a7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + aa: 0f b6 02 movzbl (%edx),%eax + ad: 84 c0 test %al,%al + af: 75 17 jne c8 + b1: eb 3a jmp ed + b3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + b7: 90 nop + b8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + bc: 83 c2 01 add $0x1,%edx + bf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + c2: 84 c0 test %al,%al + c4: 74 1a je e0 + p++, q++; + c6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + c8: 0f b6 19 movzbl (%ecx),%ebx + cb: 38 c3 cmp %al,%bl + cd: 74 e9 je b8 + } + return (uchar) * p - (uchar) * q; + cf: 29 d8 sub %ebx,%eax +} + d1: 8b 5d fc mov -0x4(%ebp),%ebx + d4: c9 leave + d5: c3 ret + d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + dd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + e0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + e4: 31 c0 xor %eax,%eax + e6: 29 d8 sub %ebx,%eax +} + e8: 8b 5d fc mov -0x4(%ebp),%ebx + eb: c9 leave + ec: c3 ret + return (uchar) * p - (uchar) * q; + ed: 0f b6 19 movzbl (%ecx),%ebx + f0: 31 c0 xor %eax,%eax + f2: eb db jmp cf + f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ff: 90 nop + +00000100 : + +uint strlen(const char *s) { + 100: 55 push %ebp + 101: 89 e5 mov %esp,%ebp + 103: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 106: 80 3a 00 cmpb $0x0,(%edx) + 109: 74 15 je 120 + 10b: 31 c0 xor %eax,%eax + 10d: 8d 76 00 lea 0x0(%esi),%esi + 110: 83 c0 01 add $0x1,%eax + 113: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 117: 89 c1 mov %eax,%ecx + 119: 75 f5 jne 110 + ; + } + return n; +} + 11b: 89 c8 mov %ecx,%eax + 11d: 5d pop %ebp + 11e: c3 ret + 11f: 90 nop + for (n = 0; s[n]; n++) { + 120: 31 c9 xor %ecx,%ecx +} + 122: 5d pop %ebp + 123: 89 c8 mov %ecx,%eax + 125: c3 ret + 126: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 12d: 8d 76 00 lea 0x0(%esi),%esi + +00000130 : + +void* memset(void *dst, int c, uint n) { + 130: 55 push %ebp + 131: 89 e5 mov %esp,%ebp + 133: 57 push %edi + 134: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 137: 8b 4d 10 mov 0x10(%ebp),%ecx + 13a: 8b 45 0c mov 0xc(%ebp),%eax + 13d: 89 d7 mov %edx,%edi + 13f: fc cld + 140: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 142: 8b 7d fc mov -0x4(%ebp),%edi + 145: 89 d0 mov %edx,%eax + 147: c9 leave + 148: c3 ret + 149: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000150 : + +char* strchr(const char *s, char c) { + 150: 55 push %ebp + 151: 89 e5 mov %esp,%ebp + 153: 8b 45 08 mov 0x8(%ebp),%eax + 156: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 15a: 0f b6 10 movzbl (%eax),%edx + 15d: 84 d2 test %dl,%dl + 15f: 75 12 jne 173 + 161: eb 1d jmp 180 + 163: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 167: 90 nop + 168: 0f b6 50 01 movzbl 0x1(%eax),%edx + 16c: 83 c0 01 add $0x1,%eax + 16f: 84 d2 test %dl,%dl + 171: 74 0d je 180 + if (*s == c) { + 173: 38 d1 cmp %dl,%cl + 175: 75 f1 jne 168 + return (char*)s; + } + } + return 0; +} + 177: 5d pop %ebp + 178: c3 ret + 179: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 180: 31 c0 xor %eax,%eax +} + 182: 5d pop %ebp + 183: c3 ret + 184: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 18b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 18f: 90 nop + +00000190 : + +char* gets(char *buf, int max) { + 190: 55 push %ebp + 191: 89 e5 mov %esp,%ebp + 193: 57 push %edi + 194: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 195: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 198: 53 push %ebx + for (i = 0; i + 1 < max;) { + 199: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 19b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 19e: eb 27 jmp 1c7 + cc = read(0, &c, 1); + 1a0: 83 ec 04 sub $0x4,%esp + 1a3: 6a 01 push $0x1 + 1a5: 57 push %edi + 1a6: 6a 00 push $0x0 + 1a8: e8 2e 01 00 00 call 2db + if (cc < 1) { + 1ad: 83 c4 10 add $0x10,%esp + 1b0: 85 c0 test %eax,%eax + 1b2: 7e 1d jle 1d1 + break; + } + buf[i++] = c; + 1b4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1b8: 8b 55 08 mov 0x8(%ebp),%edx + 1bb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1bf: 3c 0a cmp $0xa,%al + 1c1: 74 1d je 1e0 + 1c3: 3c 0d cmp $0xd,%al + 1c5: 74 19 je 1e0 + for (i = 0; i + 1 < max;) { + 1c7: 89 de mov %ebx,%esi + 1c9: 83 c3 01 add $0x1,%ebx + 1cc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1cf: 7c cf jl 1a0 + break; + } + } + buf[i] = '\0'; + 1d1: 8b 45 08 mov 0x8(%ebp),%eax + 1d4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1d8: 8d 65 f4 lea -0xc(%ebp),%esp + 1db: 5b pop %ebx + 1dc: 5e pop %esi + 1dd: 5f pop %edi + 1de: 5d pop %ebp + 1df: c3 ret + buf[i] = '\0'; + 1e0: 8b 45 08 mov 0x8(%ebp),%eax + 1e3: 89 de mov %ebx,%esi + 1e5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1e9: 8d 65 f4 lea -0xc(%ebp),%esp + 1ec: 5b pop %ebx + 1ed: 5e pop %esi + 1ee: 5f pop %edi + 1ef: 5d pop %ebp + 1f0: c3 ret + 1f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ff: 90 nop + +00000200 : + +int stat(const char *n, struct stat *st) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 56 push %esi + 204: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 205: 83 ec 08 sub $0x8,%esp + 208: 6a 00 push $0x0 + 20a: ff 75 08 push 0x8(%ebp) + 20d: e8 19 01 00 00 call 32b + if (fd < 0) { + 212: 83 c4 10 add $0x10,%esp + 215: 85 c0 test %eax,%eax + 217: 78 27 js 240 + return -1; + } + r = fstat(fd, st); + 219: 83 ec 08 sub $0x8,%esp + 21c: ff 75 0c push 0xc(%ebp) + 21f: 89 c3 mov %eax,%ebx + 221: 50 push %eax + 222: e8 cc 00 00 00 call 2f3 + close(fd); + 227: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 22a: 89 c6 mov %eax,%esi + close(fd); + 22c: e8 2a 01 00 00 call 35b + return r; + 231: 83 c4 10 add $0x10,%esp +} + 234: 8d 65 f8 lea -0x8(%ebp),%esp + 237: 89 f0 mov %esi,%eax + 239: 5b pop %ebx + 23a: 5e pop %esi + 23b: 5d pop %ebp + 23c: c3 ret + 23d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 240: be ff ff ff ff mov $0xffffffff,%esi + 245: eb ed jmp 234 + 247: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 24e: 66 90 xchg %ax,%ax + +00000250 : + +int atoi(const char *s) { + 250: 55 push %ebp + 251: 89 e5 mov %esp,%ebp + 253: 53 push %ebx + 254: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 257: 0f be 02 movsbl (%edx),%eax + 25a: 8d 48 d0 lea -0x30(%eax),%ecx + 25d: 80 f9 09 cmp $0x9,%cl + n = 0; + 260: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 265: 77 1e ja 285 + 267: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 270: 83 c2 01 add $0x1,%edx + 273: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 276: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 27a: 0f be 02 movsbl (%edx),%eax + 27d: 8d 58 d0 lea -0x30(%eax),%ebx + 280: 80 fb 09 cmp $0x9,%bl + 283: 76 eb jbe 270 + } + return n; +} + 285: 8b 5d fc mov -0x4(%ebp),%ebx + 288: 89 c8 mov %ecx,%eax + 28a: c9 leave + 28b: c3 ret + 28c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000290 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 290: 55 push %ebp + 291: 89 e5 mov %esp,%ebp + 293: 57 push %edi + 294: 8b 45 10 mov 0x10(%ebp),%eax + 297: 8b 55 08 mov 0x8(%ebp),%edx + 29a: 56 push %esi + 29b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 29e: 85 c0 test %eax,%eax + 2a0: 7e 13 jle 2b5 + 2a2: 01 d0 add %edx,%eax + dst = vdst; + 2a4: 89 d7 mov %edx,%edi + 2a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2ad: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2b0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2b1: 39 f8 cmp %edi,%eax + 2b3: 75 fb jne 2b0 + } + return vdst; +} + 2b5: 5e pop %esi + 2b6: 89 d0 mov %edx,%eax + 2b8: 5f pop %edi + 2b9: 5d pop %ebp + 2ba: c3 ret + +000002bb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2bb: b8 01 00 00 00 mov $0x1,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(exit) + 2c3: b8 02 00 00 00 mov $0x2,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(wait) + 2cb: b8 03 00 00 00 mov $0x3,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(pipe) + 2d3: b8 04 00 00 00 mov $0x4,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(read) + 2db: b8 05 00 00 00 mov $0x5,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(kill) + 2e3: b8 06 00 00 00 mov $0x6,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(exec) + 2eb: b8 07 00 00 00 mov $0x7,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(fstat) + 2f3: b8 08 00 00 00 mov $0x8,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(chdir) + 2fb: b8 09 00 00 00 mov $0x9,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(dup) + 303: b8 0a 00 00 00 mov $0xa,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(getpid) + 30b: b8 0b 00 00 00 mov $0xb,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(sbrk) + 313: b8 0c 00 00 00 mov $0xc,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(sleep) + 31b: b8 0d 00 00 00 mov $0xd,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(uptime) + 323: b8 0e 00 00 00 mov $0xe,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(open) + 32b: b8 0f 00 00 00 mov $0xf,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(write) + 333: b8 10 00 00 00 mov $0x10,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(mknod) + 33b: b8 11 00 00 00 mov $0x11,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(unlink) + 343: b8 12 00 00 00 mov $0x12,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(link) + 34b: b8 13 00 00 00 mov $0x13,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(mkdir) + 353: b8 14 00 00 00 mov $0x14,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(close) + 35b: b8 15 00 00 00 mov $0x15,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(getch) + 363: b8 16 00 00 00 mov $0x16,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(greeting) + 36b: b8 17 00 00 00 mov $0x17,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(shutdown) + 373: b8 18 00 00 00 mov $0x18,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(screen) + 37b: b8 19 00 00 00 mov $0x19,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(cls) + 383: b8 1a 00 00 00 mov $0x1a,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + 38b: 66 90 xchg %ax,%ax + 38d: 66 90 xchg %ax,%ax + 38f: 90 nop + +00000390 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 390: 55 push %ebp + 391: 89 e5 mov %esp,%ebp + 393: 57 push %edi + 394: 56 push %esi + 395: 53 push %ebx + 396: 83 ec 3c sub $0x3c,%esp + 399: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 39c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 39e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 3a1: 85 d2 test %edx,%edx + 3a3: 0f 89 7f 00 00 00 jns 428 + 3a9: f6 45 08 01 testb $0x1,0x8(%ebp) + 3ad: 74 79 je 428 + neg = 1; + 3af: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3b6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3b8: 31 db xor %ebx,%ebx + 3ba: 8d 75 d7 lea -0x29(%ebp),%esi + 3bd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3c0: 89 c8 mov %ecx,%eax + 3c2: 31 d2 xor %edx,%edx + 3c4: 89 cf mov %ecx,%edi + 3c6: f7 75 c4 divl -0x3c(%ebp) + 3c9: 0f b6 92 d0 07 00 00 movzbl 0x7d0(%edx),%edx + 3d0: 89 45 c0 mov %eax,-0x40(%ebp) + 3d3: 89 d8 mov %ebx,%eax + 3d5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3d8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3db: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3de: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3e1: 76 dd jbe 3c0 + if (neg) { + 3e3: 8b 4d bc mov -0x44(%ebp),%ecx + 3e6: 85 c9 test %ecx,%ecx + 3e8: 74 0c je 3f6 + buf[i++] = '-'; + 3ea: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3ef: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3f1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3f6: 8b 7d b8 mov -0x48(%ebp),%edi + 3f9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3fd: eb 07 jmp 406 + 3ff: 90 nop + putc(fd, buf[i]); + 400: 0f b6 13 movzbl (%ebx),%edx + 403: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 406: 83 ec 04 sub $0x4,%esp + 409: 88 55 d7 mov %dl,-0x29(%ebp) + 40c: 6a 01 push $0x1 + 40e: 56 push %esi + 40f: 57 push %edi + 410: e8 1e ff ff ff call 333 + while (--i >= 0) { + 415: 83 c4 10 add $0x10,%esp + 418: 39 de cmp %ebx,%esi + 41a: 75 e4 jne 400 + } +} + 41c: 8d 65 f4 lea -0xc(%ebp),%esp + 41f: 5b pop %ebx + 420: 5e pop %esi + 421: 5f pop %edi + 422: 5d pop %ebp + 423: c3 ret + 424: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 428: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 42f: eb 87 jmp 3b8 + 431: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 438: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 43f: 90 nop + +00000440 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 440: 55 push %ebp + 441: 89 e5 mov %esp,%ebp + 443: 57 push %edi + 444: 56 push %esi + 445: 53 push %ebx + 446: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 449: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 44c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 44f: 0f b6 13 movzbl (%ebx),%edx + 452: 84 d2 test %dl,%dl + 454: 74 6a je 4c0 + ap = (uint*)(void*)&fmt + 1; + 456: 8d 45 10 lea 0x10(%ebp),%eax + 459: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 45c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 45f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 461: 89 45 d0 mov %eax,-0x30(%ebp) + 464: eb 36 jmp 49c + 466: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 46d: 8d 76 00 lea 0x0(%esi),%esi + 470: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 473: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 478: 83 f8 25 cmp $0x25,%eax + 47b: 74 15 je 492 + write(fd, &c, 1); + 47d: 83 ec 04 sub $0x4,%esp + 480: 88 55 e7 mov %dl,-0x19(%ebp) + 483: 6a 01 push $0x1 + 485: 57 push %edi + 486: 56 push %esi + 487: e8 a7 fe ff ff call 333 + 48c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 48f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 492: 0f b6 13 movzbl (%ebx),%edx + 495: 83 c3 01 add $0x1,%ebx + 498: 84 d2 test %dl,%dl + 49a: 74 24 je 4c0 + c = fmt[i] & 0xff; + 49c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 49f: 85 c9 test %ecx,%ecx + 4a1: 74 cd je 470 + } + } + else if (state == '%') { + 4a3: 83 f9 25 cmp $0x25,%ecx + 4a6: 75 ea jne 492 + if (c == 'd') { + 4a8: 83 f8 25 cmp $0x25,%eax + 4ab: 0f 84 07 01 00 00 je 5b8 + 4b1: 83 e8 63 sub $0x63,%eax + 4b4: 83 f8 15 cmp $0x15,%eax + 4b7: 77 17 ja 4d0 + 4b9: ff 24 85 78 07 00 00 jmp *0x778(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4c0: 8d 65 f4 lea -0xc(%ebp),%esp + 4c3: 5b pop %ebx + 4c4: 5e pop %esi + 4c5: 5f pop %edi + 4c6: 5d pop %ebp + 4c7: c3 ret + 4c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4cf: 90 nop + write(fd, &c, 1); + 4d0: 83 ec 04 sub $0x4,%esp + 4d3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4d6: 6a 01 push $0x1 + 4d8: 57 push %edi + 4d9: 56 push %esi + 4da: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4de: e8 50 fe ff ff call 333 + putc(fd, c); + 4e3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4e7: 83 c4 0c add $0xc,%esp + 4ea: 88 55 e7 mov %dl,-0x19(%ebp) + 4ed: 6a 01 push $0x1 + 4ef: 57 push %edi + 4f0: 56 push %esi + 4f1: e8 3d fe ff ff call 333 + putc(fd, c); + 4f6: 83 c4 10 add $0x10,%esp + state = 0; + 4f9: 31 c9 xor %ecx,%ecx + 4fb: eb 95 jmp 492 + 4fd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 500: 83 ec 0c sub $0xc,%esp + 503: b9 10 00 00 00 mov $0x10,%ecx + 508: 6a 00 push $0x0 + 50a: 8b 45 d0 mov -0x30(%ebp),%eax + 50d: 8b 10 mov (%eax),%edx + 50f: 89 f0 mov %esi,%eax + 511: e8 7a fe ff ff call 390 + ap++; + 516: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 51a: 83 c4 10 add $0x10,%esp + state = 0; + 51d: 31 c9 xor %ecx,%ecx + 51f: e9 6e ff ff ff jmp 492 + 524: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 528: 8b 45 d0 mov -0x30(%ebp),%eax + 52b: 8b 10 mov (%eax),%edx + ap++; + 52d: 83 c0 04 add $0x4,%eax + 530: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 533: 85 d2 test %edx,%edx + 535: 0f 84 8d 00 00 00 je 5c8 + while (*s != 0) { + 53b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 53e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 540: 84 c0 test %al,%al + 542: 0f 84 4a ff ff ff je 492 + 548: 89 5d d4 mov %ebx,-0x2c(%ebp) + 54b: 89 d3 mov %edx,%ebx + 54d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 550: 83 ec 04 sub $0x4,%esp + s++; + 553: 83 c3 01 add $0x1,%ebx + 556: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 559: 6a 01 push $0x1 + 55b: 57 push %edi + 55c: 56 push %esi + 55d: e8 d1 fd ff ff call 333 + while (*s != 0) { + 562: 0f b6 03 movzbl (%ebx),%eax + 565: 83 c4 10 add $0x10,%esp + 568: 84 c0 test %al,%al + 56a: 75 e4 jne 550 + state = 0; + 56c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 56f: 31 c9 xor %ecx,%ecx + 571: e9 1c ff ff ff jmp 492 + 576: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 57d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 580: 83 ec 0c sub $0xc,%esp + 583: b9 0a 00 00 00 mov $0xa,%ecx + 588: 6a 01 push $0x1 + 58a: e9 7b ff ff ff jmp 50a + 58f: 90 nop + putc(fd, *ap); + 590: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 593: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 596: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 598: 6a 01 push $0x1 + 59a: 57 push %edi + 59b: 56 push %esi + putc(fd, *ap); + 59c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 59f: e8 8f fd ff ff call 333 + ap++; + 5a4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5a8: 83 c4 10 add $0x10,%esp + state = 0; + 5ab: 31 c9 xor %ecx,%ecx + 5ad: e9 e0 fe ff ff jmp 492 + 5b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5b8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5bb: 83 ec 04 sub $0x4,%esp + 5be: e9 2a ff ff ff jmp 4ed + 5c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5c7: 90 nop + s = "(null)"; + 5c8: ba 71 07 00 00 mov $0x771,%edx + while (*s != 0) { + 5cd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5d0: b8 28 00 00 00 mov $0x28,%eax + 5d5: 89 d3 mov %edx,%ebx + 5d7: e9 74 ff ff ff jmp 550 + 5dc: 66 90 xchg %ax,%ax + 5de: 66 90 xchg %ax,%ax + +000005e0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5e0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5e1: a1 84 0a 00 00 mov 0xa84,%eax +void free(void *ap) { + 5e6: 89 e5 mov %esp,%ebp + 5e8: 57 push %edi + 5e9: 56 push %esi + 5ea: 53 push %ebx + 5eb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5ee: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5f8: 89 c2 mov %eax,%edx + 5fa: 8b 00 mov (%eax),%eax + 5fc: 39 ca cmp %ecx,%edx + 5fe: 73 30 jae 630 + 600: 39 c1 cmp %eax,%ecx + 602: 72 04 jb 608 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 604: 39 c2 cmp %eax,%edx + 606: 72 f0 jb 5f8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 608: 8b 73 fc mov -0x4(%ebx),%esi + 60b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 60e: 39 f8 cmp %edi,%eax + 610: 74 30 je 642 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 612: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 615: 8b 42 04 mov 0x4(%edx),%eax + 618: 8d 34 c2 lea (%edx,%eax,8),%esi + 61b: 39 f1 cmp %esi,%ecx + 61d: 74 3a je 659 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 61f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 621: 5b pop %ebx + freep = p; + 622: 89 15 84 0a 00 00 mov %edx,0xa84 +} + 628: 5e pop %esi + 629: 5f pop %edi + 62a: 5d pop %ebp + 62b: c3 ret + 62c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 630: 39 c2 cmp %eax,%edx + 632: 72 c4 jb 5f8 + 634: 39 c1 cmp %eax,%ecx + 636: 73 c0 jae 5f8 + if (bp + bp->s.size == p->s.ptr) { + 638: 8b 73 fc mov -0x4(%ebx),%esi + 63b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 63e: 39 f8 cmp %edi,%eax + 640: 75 d0 jne 612 + bp->s.size += p->s.ptr->s.size; + 642: 03 70 04 add 0x4(%eax),%esi + 645: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 648: 8b 02 mov (%edx),%eax + 64a: 8b 00 mov (%eax),%eax + 64c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 64f: 8b 42 04 mov 0x4(%edx),%eax + 652: 8d 34 c2 lea (%edx,%eax,8),%esi + 655: 39 f1 cmp %esi,%ecx + 657: 75 c6 jne 61f + p->s.size += bp->s.size; + 659: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 65c: 89 15 84 0a 00 00 mov %edx,0xa84 + p->s.size += bp->s.size; + 662: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 665: 8b 4b f8 mov -0x8(%ebx),%ecx + 668: 89 0a mov %ecx,(%edx) +} + 66a: 5b pop %ebx + 66b: 5e pop %esi + 66c: 5f pop %edi + 66d: 5d pop %ebp + 66e: c3 ret + 66f: 90 nop + +00000670 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 670: 55 push %ebp + 671: 89 e5 mov %esp,%ebp + 673: 57 push %edi + 674: 56 push %esi + 675: 53 push %ebx + 676: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 679: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 67c: 8b 3d 84 0a 00 00 mov 0xa84,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 682: 8d 70 07 lea 0x7(%eax),%esi + 685: c1 ee 03 shr $0x3,%esi + 688: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 68b: 85 ff test %edi,%edi + 68d: 0f 84 9d 00 00 00 je 730 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 693: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 695: 8b 4a 04 mov 0x4(%edx),%ecx + 698: 39 f1 cmp %esi,%ecx + 69a: 73 6a jae 706 + 69c: bb 00 10 00 00 mov $0x1000,%ebx + 6a1: 39 de cmp %ebx,%esi + 6a3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 6a6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 6ad: 89 45 e4 mov %eax,-0x1c(%ebp) + 6b0: eb 17 jmp 6c9 + 6b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6b8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6ba: 8b 48 04 mov 0x4(%eax),%ecx + 6bd: 39 f1 cmp %esi,%ecx + 6bf: 73 4f jae 710 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6c1: 8b 3d 84 0a 00 00 mov 0xa84,%edi + 6c7: 89 c2 mov %eax,%edx + 6c9: 39 d7 cmp %edx,%edi + 6cb: 75 eb jne 6b8 + p = sbrk(nu * sizeof(Header)); + 6cd: 83 ec 0c sub $0xc,%esp + 6d0: ff 75 e4 push -0x1c(%ebp) + 6d3: e8 3b fc ff ff call 313 + if (p == (char*)-1) { + 6d8: 83 c4 10 add $0x10,%esp + 6db: 83 f8 ff cmp $0xffffffff,%eax + 6de: 74 1c je 6fc + hp->s.size = nu; + 6e0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6e3: 83 ec 0c sub $0xc,%esp + 6e6: 83 c0 08 add $0x8,%eax + 6e9: 50 push %eax + 6ea: e8 f1 fe ff ff call 5e0 + return freep; + 6ef: 8b 15 84 0a 00 00 mov 0xa84,%edx + if ((p = morecore(nunits)) == 0) { + 6f5: 83 c4 10 add $0x10,%esp + 6f8: 85 d2 test %edx,%edx + 6fa: 75 bc jne 6b8 + return 0; + } + } + } +} + 6fc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6ff: 31 c0 xor %eax,%eax +} + 701: 5b pop %ebx + 702: 5e pop %esi + 703: 5f pop %edi + 704: 5d pop %ebp + 705: c3 ret + if (p->s.size >= nunits) { + 706: 89 d0 mov %edx,%eax + 708: 89 fa mov %edi,%edx + 70a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 710: 39 ce cmp %ecx,%esi + 712: 74 4c je 760 + p->s.size -= nunits; + 714: 29 f1 sub %esi,%ecx + 716: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 719: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 71c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 71f: 89 15 84 0a 00 00 mov %edx,0xa84 +} + 725: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 728: 83 c0 08 add $0x8,%eax +} + 72b: 5b pop %ebx + 72c: 5e pop %esi + 72d: 5f pop %edi + 72e: 5d pop %ebp + 72f: c3 ret + base.s.ptr = freep = prevp = &base; + 730: c7 05 84 0a 00 00 88 movl $0xa88,0xa84 + 737: 0a 00 00 + base.s.size = 0; + 73a: bf 88 0a 00 00 mov $0xa88,%edi + base.s.ptr = freep = prevp = &base; + 73f: c7 05 88 0a 00 00 88 movl $0xa88,0xa88 + 746: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 749: 89 fa mov %edi,%edx + base.s.size = 0; + 74b: c7 05 8c 0a 00 00 00 movl $0x0,0xa8c + 752: 00 00 00 + if (p->s.size >= nunits) { + 755: e9 42 ff ff ff jmp 69c + 75a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 760: 8b 08 mov (%eax),%ecx + 762: 89 0a mov %ecx,(%edx) + 764: eb b9 jmp 71f diff --git a/echo.d b/echo.d new file mode 100644 index 0000000..16a6098 --- /dev/null +++ b/echo.d @@ -0,0 +1 @@ +echo.o: echo.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/echo.o b/echo.o new file mode 100644 index 0000000000000000000000000000000000000000..9e85697a5be8bd383512d2543eb1e094b2e71f1e GIT binary patch literal 3304 zcma)8TWnNC82;z%Ior$j$`YV0+NDx%akt$1jT6HBDz&yjckyxhPtSeQq&vt2Gq!|YX?`F)8E~jJ^f(h%J;{Q z9X&GrbN$uq)hToOZ*gJYN1ST<6LEFV%?DfVhdtx36?qUmhl>W33Gu^&+1XhRPk-9B z<$g3%tb=<&5CKWLhk!-G1d!E-?vY1Xg)~(`_QK=@B#gR645I#bX<5C1xM{gwNOjH7 zjkvWNP@lvKjkWPIbdwz>YYk*f0fdM*Al&FfPnghzB?rNz368(@Bl@Nm8EN6s#&v4$ zlx8P~cnQ3?7MGBU2?J>B&|-Vhjj)o_3TGTfBjYZ2JSmBllt}DI#9H8JrNjzzIEf+q z>1A;difIwsR=enJNhV_5UEL!~+eO<_>{N}z$E(ZG&W>2i*2K2Nmc;6g;p8i#W3U4| z&xl(8V241ehGm$vag|J)SV$O7wu?paUCYi%Vv|KW=Wx=%sOANZrMGuu6)hVmR$rYM zq^ge&Udan z5vvmCQ}Rh_X@#Pvla(<+SCoru2&Mm5OEUw$8W%p4Zo$Q3h;E}bHUy2H;_e7{Ru5Tn zwk2`YLj1sDD=Dm=co*79EWjCd=+06P(e=1#GKY%WbJZF2s z@f_dH!?gW;al5;5^Tt%VP#DXl(uY7A_bTaJ~{gib!JDCeZ>AZiCwUcTs8yh;?LBkv{G8%u|FuH*y=1|g5j zm+YXZN4ph|=607a+CG(S*CVOfej!hjJ|-R~=x3;}?2Nf~Uobv;bSgOPR|F+ds<`BWW24;h|aggjp%G!%!tA&bH3-2 z(_+#uvs!12Ex00VTeV@>vYO|7F+5te601JXbFLWS4XKeBwbfXhpC7AviBXc&(=Ye7 z2=nv1sf9=Db77y%rp{P?PxTdLNh6*`6Sz8C6+Qtp@HXl^yp|EXeubM9?oh~gnd8S4MhY(~e3daq^ro`kRro$5UaH#) zKU4UH!Y>&y?i+UJ*YJ7;R6rAof!1|g?J4#o0quiz|j`Cj2)w36#NIx!ZaRd$a`J6|dDt)`5JM<#=Z zE-fFA>Qqi~RK7~s_`^vTXneoqj|;H+|7CuxzI!VakB^k)zj&(=<68Vbp8S5`@ee%< z=R>*83D3)Ir$W8HU9cz6w8;AeV;dTe--X6f#DL8}{-Nd_&6W$Tj%=#I*;i`W4VL^>()tNv&!vb zg_?I02~NPLMf1LbgLTdO13a!tEt>Z&9IR`3Y~jz#TUNtORer(iwOkEI*;u z?)O&B`7J?A@3%G=k1HYH3=scFDS^g3J|E7d?;2D(h&pAC7QOa%IBIzxV%|SB38;Dh E02IHN+5i9m literal 0 HcmV?d00001 diff --git a/echo.sym b/echo.sym new file mode 100644 index 0000000..555493c --- /dev/null +++ b/echo.sym @@ -0,0 +1,50 @@ +00000000 echo.c +00000000 ulib.c +00000000 printf.c +00000390 printint +000007d0 digits.0 +00000000 umalloc.c +00000a84 freep +00000a88 base +00000070 strcpy +00000440 printf +0000036b greeting +00000290 memmove +0000033b mknod +00000190 gets +0000030b getpid +0000037b screen +00000670 malloc +0000031b sleep +000002d3 pipe +00000363 getch +00000333 write +000002f3 fstat +000002e3 kill +000002fb chdir +000002eb exec +000002cb wait +000002db read +00000343 unlink +000002bb fork +00000313 sbrk +00000323 uptime +00000a84 __bss_start +00000130 memset +00000000 main +000000a0 strcmp +00000373 shutdown +00000303 dup +00000200 stat +00000a84 _edata +00000a90 _end +0000034b link +000002c3 exit +00000250 atoi +00000383 cls +00000100 strlen +0000032b open +00000150 strchr +00000353 mkdir +0000035b close +000005e0 free diff --git a/entry.o b/entry.o new file mode 100644 index 0000000000000000000000000000000000000000..a61fc4a025c151d170d745ec15117da1cbf4a032 GIT binary patch literal 1432 zcma)5Id2m|6n^7PLV(0aKqx2(EK7+vq%|@iQQ(kB98ClfhQdv(UA(a^e8BDoVF?LK zwEP7A00j~y1%*pGTFMj@)U+VN_s#5>H3jgbcOUa+-kTRUw{9t=#DWq>erqDjj`3X9 z?5yM^Cz*F|SE&BHd+$rGxc~BFK3Cd*55p)|`kX6{7ey4r@drc;?Q*bR1$E>!s8Zjv zi=g^Y9Hk`a$KlYeF;HYSvjFP2s#;yIuUG5Wcj}o8!b`Ab7$7r~{!CLM^RTV~)kqa2 zKUYvo%E_)|SF^`vnLs!NOwzSZV$&(x9?HF-+40KJZlgAgw!=ZI>_t%!MLh&mFssnjz1X0jdtKQgHRe#?1iy;3_~Bcnw?N!e)vdwUZ>Br6F`Ob z&ygPyamkO0Tp-7A=E$)(9Hg3IZ^nK+;mhQ>E@whsOt{X&kZioT(XbbLK6o4&-nLR0 zblo_37K_{TVozK@io~U{8TfmxMz_-s(t4-AJ3y%RdA=V8Pt#s6^!lv;1xx_WKu7-v zd~@z2dna(G(tCyLYv70B#5c5t7~GTZfWM;i8OJqVP4wj3NgH|^?C$fe8UL?1_F{8b zhxIloBw&5qjdXuo=#TZ;A2-wXcLTD`fhcc){CXCwZv%#Oz5A%gKf`+b3AWxgWSav~ zJ^{HW7Oc;Q!OHY~1r{kJz+MSE!1TGVa4z?W=VDbS=RSeVdb~Gb9!kZCn$l+xB_?nU o#xb-kkTd5!Sf6LwSwNH@h`T}|0oEcEfa$o`DE?e~46$*)0PZV(Jpcdz literal 0 HcmV?d00001 diff --git a/entryother b/entryother new file mode 100644 index 0000000000000000000000000000000000000000..0e1f31a69373cac02f1c858730d63f9f9b89c29b GIT binary patch literal 122 zcmexmc%bh_-+{gh{ET8H1^fyJ(wa{&@+%!kd!: +# This code combines elements of bootasm.S and entry.S. + +.code16 +.globl start +start: + cli + 7000: fa cli + + # Zero data segment registers DS, ES, and SS. + xorw %ax,%ax + 7001: 31 c0 xor %eax,%eax + movw %ax,%ds + 7003: 8e d8 mov %eax,%ds + movw %ax,%es + 7005: 8e c0 mov %eax,%es + movw %ax,%ss + 7007: 8e d0 mov %eax,%ss + + # Switch from real to protected mode. Use a bootstrap GDT that makes + # virtual addresses map directly to physical addresses so that the + # effective memory map doesn't change during the transition. + lgdt gdtdesc + 7009: 0f 01 16 lgdtl (%esi) + 700c: 74 70 je 707e <_end+0x2> + movl %cr0, %eax + 700e: 0f 20 c0 mov %cr0,%eax + orl $CR0_PE, %eax + 7011: 66 83 c8 01 or $0x1,%ax + movl %eax, %cr0 + 7015: 0f 22 c0 mov %eax,%cr0 + + # Complete the transition to 32-bit protected mode by using a long jmp + # to reload %cs and %eip. The segment descriptors are set up with no + # translation, so that the mapping is still the identity mapping. + ljmpl $(SEG_KCODE<<3), $(start32) + 7018: 66 ea 20 70 00 00 ljmpw $0x0,$0x7020 + 701e: 08 00 or %al,(%eax) + +00007020 : + + +.code32 # Tell assembler to generate 32-bit code now. +start32: + # Set up the protected-mode data segment registers + movw $(SEG_KDATA<<3), %ax # Our data segment selector + 7020: 66 b8 10 00 mov $0x10,%ax + movw %ax, %ds # -> DS: Data Segment + 7024: 8e d8 mov %eax,%ds + movw %ax, %es # -> ES: Extra Segment + 7026: 8e c0 mov %eax,%es + movw %ax, %ss # -> SS: Stack Segment + 7028: 8e d0 mov %eax,%ss + movw $0, %ax # Zero segments not ready for use + 702a: 66 b8 00 00 mov $0x0,%ax + movw %ax, %fs # -> FS + 702e: 8e e0 mov %eax,%fs + movw %ax, %gs # -> GS + 7030: 8e e8 mov %eax,%gs + + # Turn on page size extension for 4Mbyte pages + movl %cr4, %eax + 7032: 0f 20 e0 mov %cr4,%eax + orl $(CR4_PSE), %eax + 7035: 83 c8 10 or $0x10,%eax + movl %eax, %cr4 + 7038: 0f 22 e0 mov %eax,%cr4 + # Use entrypgdir as our initial page table + movl (start-12), %eax + 703b: a1 f4 6f 00 00 mov 0x6ff4,%eax + movl %eax, %cr3 + 7040: 0f 22 d8 mov %eax,%cr3 + # Turn on paging. + movl %cr0, %eax + 7043: 0f 20 c0 mov %cr0,%eax + orl $(CR0_PE|CR0_PG|CR0_WP), %eax + 7046: 0d 01 00 01 80 or $0x80010001,%eax + movl %eax, %cr0 + 704b: 0f 22 c0 mov %eax,%cr0 + + # Switch to the stack allocated by startothers() + movl (start-4), %esp + 704e: 8b 25 fc 6f 00 00 mov 0x6ffc,%esp + # Call mpenter() + call *(start-8) + 7054: ff 15 f8 6f 00 00 call *0x6ff8 + +0000705a : + + # We should never return. +spin: + jmp spin + 705a: eb fe jmp 705a + +0000705c : + ... + 7064: ff (bad) + 7065: ff 00 incl (%eax) + 7067: 00 00 add %al,(%eax) + 7069: 9a cf 00 ff ff 00 00 lcall $0x0,$0xffff00cf + 7070: 00 .byte 0x0 + 7071: 92 xchg %eax,%edx + 7072: cf iret + ... + +00007074 : + 7074: 17 pop %ss + 7075: 00 5c 70 00 add %bl,0x0(%eax,%esi,2) + ... diff --git a/entryother.d b/entryother.d new file mode 100644 index 0000000..a140303 --- /dev/null +++ b/entryother.d @@ -0,0 +1 @@ +entryother.o: entryother.S asm.h memlayout.h mmu.h diff --git a/entryother.o b/entryother.o new file mode 100644 index 0000000000000000000000000000000000000000..ffdaa2ef84c6083eb9b92c0a1958e30a333f9aec GIT binary patch literal 1660 zcma)6%}Z2K6hC*KmVG#HEYrxy$CMBiGpRuaX}ZV)BLpij0)5lG8Ao)C_g<22GTa2k zELugY`UhIOoTWQkv~cNCYTF_znts3c?wy_x)q!)*?|j_zaqoTa>GfOVN+~g<#FF2d z$VV&oT#Ce5>5z#x_gYxUX(TXltEJN44~rn0m3(kBN|ZBp9ENE}ew5UK6dc5P>8 zeKTWcciw$zG#Ykx8=Kmds5R_*(f0$k#<8zhKL3oXi8LBOZ?E10Sx3;X_0e~ z==yuQor3*>0eYj>Q>r&*r%u5t=ebC0imP>8ozCa;gVVzkW6vjmCi4Bm!z0rp!_(L1 z=2H$5dv(qAg)-5~ISV9~3F1A@h0SqkSoKR2~kaacrD3(GW5Z7mXUQ98 zmtoVbTw+0bHd#Br>VxJuR2DKTC-rFKF4X{0=J-C{92K$o!O0~3P{BEJ(d&^0$>$}ymhlFtg?)_itW$$3lLgF{R8liYG zFR}+J-^XZdmJK}Ei@<3x_cM;?*Qa&;%aHfblf+mOzX!(uD~|n`J%CZZSprSQ$6k{C z?V>*iHulGtXZjlj<{rkA(omA03Vq}|T0%rL4&xc4Kr)6j2~O5+!$9U-IG?FI3vBiP z$~=@#0!_xpn=_cMH7E{&Cgvnn!O6NqsGEU}^Wqa|)_n%dd}iLaP%c9^M4w?CS(CP5 ltV6TGCLi;&rnxgfd9BZxn8aKpemlvyn^0axo_H~FzW}F!yW;== literal 0 HcmV?d00001 diff --git a/exec.d b/exec.d new file mode 100644 index 0000000..0400275 --- /dev/null +++ b/exec.d @@ -0,0 +1,2 @@ +exec.o: exec.c /usr/include/stdc-predef.h types.h param.h memlayout.h \ + mmu.h proc.h defs.h x86.h elf.h diff --git a/exec.o b/exec.o new file mode 100644 index 0000000000000000000000000000000000000000..bd83b063bd57ad5686b22bffa3f8934ca042ead4 GIT binary patch literal 10848 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 literal 0 HcmV?d00001 diff --git a/file.d b/file.d new file mode 100644 index 0000000..fea73d1 --- /dev/null +++ b/file.d @@ -0,0 +1,2 @@ +file.o: file.c /usr/include/stdc-predef.h types.h defs.h param.h fs.h \ + spinlock.h sleeplock.h file.h diff --git a/file.o b/file.o new file mode 100644 index 0000000000000000000000000000000000000000..c01e7b37c064c0dae93cc5df28ced388bc42bbfb GIT binary patch literal 9992 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 literal 0 HcmV?d00001 diff --git a/forktest.asm b/forktest.asm new file mode 100644 index 0000000..cce18a5 --- /dev/null +++ b/forktest.asm @@ -0,0 +1,685 @@ + +_forktest: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: + } + + printf(1, "fork test OK\n"); +} + +int main(void) { + 0: 55 push %ebp + 1: 89 e5 mov %esp,%ebp + 3: 83 e4 f0 and $0xfffffff0,%esp + forktest(); + 6: e8 35 00 00 00 call 40 + exit(); + b: e8 63 03 00 00 call 373 + +00000010 : +void printf(int fd, const char *s, ...) { + 10: 55 push %ebp + 11: 89 e5 mov %esp,%ebp + 13: 53 push %ebx + 14: 83 ec 10 sub $0x10,%esp + 17: 8b 5d 0c mov 0xc(%ebp),%ebx + write(fd, s, strlen(s)); + 1a: 53 push %ebx + 1b: e8 90 01 00 00 call 1b0 + 20: 83 c4 0c add $0xc,%esp + 23: 50 push %eax + 24: 53 push %ebx + 25: ff 75 08 push 0x8(%ebp) + 28: e8 b6 03 00 00 call 3e3 +} + 2d: 8b 5d fc mov -0x4(%ebp),%ebx + 30: 83 c4 10 add $0x10,%esp + 33: c9 leave + 34: c3 ret + 35: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000040 : +void forktest(void) { + 40: 55 push %ebp + 41: 89 e5 mov %esp,%ebp + 43: 53 push %ebx + for (n = 0; n < N; n++) { + 44: 31 db xor %ebx,%ebx +void forktest(void) { + 46: 83 ec 10 sub $0x10,%esp + write(fd, s, strlen(s)); + 49: 68 3c 04 00 00 push $0x43c + 4e: e8 5d 01 00 00 call 1b0 + 53: 83 c4 0c add $0xc,%esp + 56: 50 push %eax + 57: 68 3c 04 00 00 push $0x43c + 5c: 6a 01 push $0x1 + 5e: e8 80 03 00 00 call 3e3 + 63: 83 c4 10 add $0x10,%esp + 66: eb 19 jmp 81 + 68: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6f: 90 nop + if (pid == 0) { + 70: 74 58 je ca + for (n = 0; n < N; n++) { + 72: 83 c3 01 add $0x1,%ebx + 75: 81 fb e8 03 00 00 cmp $0x3e8,%ebx + 7b: 0f 84 83 00 00 00 je 104 + pid = fork(); + 81: e8 e5 02 00 00 call 36b + if (pid < 0) { + 86: 85 c0 test %eax,%eax + 88: 79 e6 jns 70 + for (; n > 0; n--) { + 8a: 85 db test %ebx,%ebx + 8c: 74 10 je 9e + 8e: 66 90 xchg %ax,%ax + if (wait() < 0) { + 90: e8 e6 02 00 00 call 37b + 95: 85 c0 test %eax,%eax + 97: 78 36 js cf + for (; n > 0; n--) { + 99: 83 eb 01 sub $0x1,%ebx + 9c: 75 f2 jne 90 + if (wait() != -1) { + 9e: e8 d8 02 00 00 call 37b + a3: 83 f8 ff cmp $0xffffffff,%eax + a6: 75 49 jne f1 + write(fd, s, strlen(s)); + a8: 83 ec 0c sub $0xc,%esp + ab: 68 6e 04 00 00 push $0x46e + b0: e8 fb 00 00 00 call 1b0 + b5: 83 c4 0c add $0xc,%esp + b8: 50 push %eax + b9: 68 6e 04 00 00 push $0x46e + be: 6a 01 push $0x1 + c0: e8 1e 03 00 00 call 3e3 +} + c5: 8b 5d fc mov -0x4(%ebp),%ebx + c8: c9 leave + c9: c3 ret + exit(); + ca: e8 a4 02 00 00 call 373 + write(fd, s, strlen(s)); + cf: 83 ec 0c sub $0xc,%esp + d2: 68 47 04 00 00 push $0x447 + d7: e8 d4 00 00 00 call 1b0 + dc: 83 c4 0c add $0xc,%esp + df: 50 push %eax + e0: 68 47 04 00 00 push $0x447 + e5: 6a 01 push $0x1 + e7: e8 f7 02 00 00 call 3e3 + exit(); + ec: e8 82 02 00 00 call 373 + printf(1, "wait got too many\n"); + f1: 52 push %edx + f2: 52 push %edx + f3: 68 5b 04 00 00 push $0x45b + f8: 6a 01 push $0x1 + fa: e8 11 ff ff ff call 10 + exit(); + ff: e8 6f 02 00 00 call 373 + printf(1, "fork claimed to work N times!\n", N); + 104: 50 push %eax + 105: 68 e8 03 00 00 push $0x3e8 + 10a: 68 7c 04 00 00 push $0x47c + 10f: 6a 01 push $0x1 + 111: e8 fa fe ff ff call 10 + exit(); + 116: e8 58 02 00 00 call 373 + 11b: 66 90 xchg %ax,%ax + 11d: 66 90 xchg %ax,%ax + 11f: 90 nop + +00000120 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 120: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 121: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 123: 89 e5 mov %esp,%ebp + 125: 53 push %ebx + 126: 8b 4d 08 mov 0x8(%ebp),%ecx + 129: 8b 5d 0c mov 0xc(%ebp),%ebx + 12c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 130: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 134: 88 14 01 mov %dl,(%ecx,%eax,1) + 137: 83 c0 01 add $0x1,%eax + 13a: 84 d2 test %dl,%dl + 13c: 75 f2 jne 130 + ; + } + return os; +} + 13e: 8b 5d fc mov -0x4(%ebp),%ebx + 141: 89 c8 mov %ecx,%eax + 143: c9 leave + 144: c3 ret + 145: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 14c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000150 : + +int strcmp(const char *p, const char *q) { + 150: 55 push %ebp + 151: 89 e5 mov %esp,%ebp + 153: 53 push %ebx + 154: 8b 55 08 mov 0x8(%ebp),%edx + 157: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 15a: 0f b6 02 movzbl (%edx),%eax + 15d: 84 c0 test %al,%al + 15f: 75 17 jne 178 + 161: eb 3a jmp 19d + 163: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 167: 90 nop + 168: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 16c: 83 c2 01 add $0x1,%edx + 16f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 172: 84 c0 test %al,%al + 174: 74 1a je 190 + p++, q++; + 176: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 178: 0f b6 19 movzbl (%ecx),%ebx + 17b: 38 c3 cmp %al,%bl + 17d: 74 e9 je 168 + } + return (uchar) * p - (uchar) * q; + 17f: 29 d8 sub %ebx,%eax +} + 181: 8b 5d fc mov -0x4(%ebp),%ebx + 184: c9 leave + 185: c3 ret + 186: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 18d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 190: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 194: 31 c0 xor %eax,%eax + 196: 29 d8 sub %ebx,%eax +} + 198: 8b 5d fc mov -0x4(%ebp),%ebx + 19b: c9 leave + 19c: c3 ret + return (uchar) * p - (uchar) * q; + 19d: 0f b6 19 movzbl (%ecx),%ebx + 1a0: 31 c0 xor %eax,%eax + 1a2: eb db jmp 17f + 1a4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1af: 90 nop + +000001b0 : + +uint strlen(const char *s) { + 1b0: 55 push %ebp + 1b1: 89 e5 mov %esp,%ebp + 1b3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 1b6: 80 3a 00 cmpb $0x0,(%edx) + 1b9: 74 15 je 1d0 + 1bb: 31 c0 xor %eax,%eax + 1bd: 8d 76 00 lea 0x0(%esi),%esi + 1c0: 83 c0 01 add $0x1,%eax + 1c3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 1c7: 89 c1 mov %eax,%ecx + 1c9: 75 f5 jne 1c0 + ; + } + return n; +} + 1cb: 89 c8 mov %ecx,%eax + 1cd: 5d pop %ebp + 1ce: c3 ret + 1cf: 90 nop + for (n = 0; s[n]; n++) { + 1d0: 31 c9 xor %ecx,%ecx +} + 1d2: 5d pop %ebp + 1d3: 89 c8 mov %ecx,%eax + 1d5: c3 ret + 1d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1dd: 8d 76 00 lea 0x0(%esi),%esi + +000001e0 : + +void* memset(void *dst, int c, uint n) { + 1e0: 55 push %ebp + 1e1: 89 e5 mov %esp,%ebp + 1e3: 57 push %edi + 1e4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 1e7: 8b 4d 10 mov 0x10(%ebp),%ecx + 1ea: 8b 45 0c mov 0xc(%ebp),%eax + 1ed: 89 d7 mov %edx,%edi + 1ef: fc cld + 1f0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 1f2: 8b 7d fc mov -0x4(%ebp),%edi + 1f5: 89 d0 mov %edx,%eax + 1f7: c9 leave + 1f8: c3 ret + 1f9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000200 : + +char* strchr(const char *s, char c) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 8b 45 08 mov 0x8(%ebp),%eax + 206: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 20a: 0f b6 10 movzbl (%eax),%edx + 20d: 84 d2 test %dl,%dl + 20f: 75 12 jne 223 + 211: eb 1d jmp 230 + 213: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 217: 90 nop + 218: 0f b6 50 01 movzbl 0x1(%eax),%edx + 21c: 83 c0 01 add $0x1,%eax + 21f: 84 d2 test %dl,%dl + 221: 74 0d je 230 + if (*s == c) { + 223: 38 d1 cmp %dl,%cl + 225: 75 f1 jne 218 + return (char*)s; + } + } + return 0; +} + 227: 5d pop %ebp + 228: c3 ret + 229: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 230: 31 c0 xor %eax,%eax +} + 232: 5d pop %ebp + 233: c3 ret + 234: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 23b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 23f: 90 nop + +00000240 : + +char* gets(char *buf, int max) { + 240: 55 push %ebp + 241: 89 e5 mov %esp,%ebp + 243: 57 push %edi + 244: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 245: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 248: 53 push %ebx + for (i = 0; i + 1 < max;) { + 249: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 24b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 24e: eb 27 jmp 277 + cc = read(0, &c, 1); + 250: 83 ec 04 sub $0x4,%esp + 253: 6a 01 push $0x1 + 255: 57 push %edi + 256: 6a 00 push $0x0 + 258: e8 2e 01 00 00 call 38b + if (cc < 1) { + 25d: 83 c4 10 add $0x10,%esp + 260: 85 c0 test %eax,%eax + 262: 7e 1d jle 281 + break; + } + buf[i++] = c; + 264: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 268: 8b 55 08 mov 0x8(%ebp),%edx + 26b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 26f: 3c 0a cmp $0xa,%al + 271: 74 1d je 290 + 273: 3c 0d cmp $0xd,%al + 275: 74 19 je 290 + for (i = 0; i + 1 < max;) { + 277: 89 de mov %ebx,%esi + 279: 83 c3 01 add $0x1,%ebx + 27c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 27f: 7c cf jl 250 + break; + } + } + buf[i] = '\0'; + 281: 8b 45 08 mov 0x8(%ebp),%eax + 284: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 288: 8d 65 f4 lea -0xc(%ebp),%esp + 28b: 5b pop %ebx + 28c: 5e pop %esi + 28d: 5f pop %edi + 28e: 5d pop %ebp + 28f: c3 ret + buf[i] = '\0'; + 290: 8b 45 08 mov 0x8(%ebp),%eax + 293: 89 de mov %ebx,%esi + 295: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 299: 8d 65 f4 lea -0xc(%ebp),%esp + 29c: 5b pop %ebx + 29d: 5e pop %esi + 29e: 5f pop %edi + 29f: 5d pop %ebp + 2a0: c3 ret + 2a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2af: 90 nop + +000002b0 : + +int stat(const char *n, struct stat *st) { + 2b0: 55 push %ebp + 2b1: 89 e5 mov %esp,%ebp + 2b3: 56 push %esi + 2b4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 2b5: 83 ec 08 sub $0x8,%esp + 2b8: 6a 00 push $0x0 + 2ba: ff 75 08 push 0x8(%ebp) + 2bd: e8 19 01 00 00 call 3db + if (fd < 0) { + 2c2: 83 c4 10 add $0x10,%esp + 2c5: 85 c0 test %eax,%eax + 2c7: 78 27 js 2f0 + return -1; + } + r = fstat(fd, st); + 2c9: 83 ec 08 sub $0x8,%esp + 2cc: ff 75 0c push 0xc(%ebp) + 2cf: 89 c3 mov %eax,%ebx + 2d1: 50 push %eax + 2d2: e8 cc 00 00 00 call 3a3 + close(fd); + 2d7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 2da: 89 c6 mov %eax,%esi + close(fd); + 2dc: e8 2a 01 00 00 call 40b + return r; + 2e1: 83 c4 10 add $0x10,%esp +} + 2e4: 8d 65 f8 lea -0x8(%ebp),%esp + 2e7: 89 f0 mov %esi,%eax + 2e9: 5b pop %ebx + 2ea: 5e pop %esi + 2eb: 5d pop %ebp + 2ec: c3 ret + 2ed: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 2f0: be ff ff ff ff mov $0xffffffff,%esi + 2f5: eb ed jmp 2e4 + 2f7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2fe: 66 90 xchg %ax,%ax + +00000300 : + +int atoi(const char *s) { + 300: 55 push %ebp + 301: 89 e5 mov %esp,%ebp + 303: 53 push %ebx + 304: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 307: 0f be 02 movsbl (%edx),%eax + 30a: 8d 48 d0 lea -0x30(%eax),%ecx + 30d: 80 f9 09 cmp $0x9,%cl + n = 0; + 310: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 315: 77 1e ja 335 + 317: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 31e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 320: 83 c2 01 add $0x1,%edx + 323: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 326: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 32a: 0f be 02 movsbl (%edx),%eax + 32d: 8d 58 d0 lea -0x30(%eax),%ebx + 330: 80 fb 09 cmp $0x9,%bl + 333: 76 eb jbe 320 + } + return n; +} + 335: 8b 5d fc mov -0x4(%ebp),%ebx + 338: 89 c8 mov %ecx,%eax + 33a: c9 leave + 33b: c3 ret + 33c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000340 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 340: 55 push %ebp + 341: 89 e5 mov %esp,%ebp + 343: 57 push %edi + 344: 8b 45 10 mov 0x10(%ebp),%eax + 347: 8b 55 08 mov 0x8(%ebp),%edx + 34a: 56 push %esi + 34b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 34e: 85 c0 test %eax,%eax + 350: 7e 13 jle 365 + 352: 01 d0 add %edx,%eax + dst = vdst; + 354: 89 d7 mov %edx,%edi + 356: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 35d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 360: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 361: 39 f8 cmp %edi,%eax + 363: 75 fb jne 360 + } + return vdst; +} + 365: 5e pop %esi + 366: 89 d0 mov %edx,%eax + 368: 5f pop %edi + 369: 5d pop %ebp + 36a: c3 ret + +0000036b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 36b: b8 01 00 00 00 mov $0x1,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(exit) + 373: b8 02 00 00 00 mov $0x2,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(wait) + 37b: b8 03 00 00 00 mov $0x3,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(pipe) + 383: b8 04 00 00 00 mov $0x4,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(read) + 38b: b8 05 00 00 00 mov $0x5,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(kill) + 393: b8 06 00 00 00 mov $0x6,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(exec) + 39b: b8 07 00 00 00 mov $0x7,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(fstat) + 3a3: b8 08 00 00 00 mov $0x8,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + +000003ab : +SYSCALL(chdir) + 3ab: b8 09 00 00 00 mov $0x9,%eax + 3b0: cd 40 int $0x40 + 3b2: c3 ret + +000003b3 : +SYSCALL(dup) + 3b3: b8 0a 00 00 00 mov $0xa,%eax + 3b8: cd 40 int $0x40 + 3ba: c3 ret + +000003bb : +SYSCALL(getpid) + 3bb: b8 0b 00 00 00 mov $0xb,%eax + 3c0: cd 40 int $0x40 + 3c2: c3 ret + +000003c3 : +SYSCALL(sbrk) + 3c3: b8 0c 00 00 00 mov $0xc,%eax + 3c8: cd 40 int $0x40 + 3ca: c3 ret + +000003cb : +SYSCALL(sleep) + 3cb: b8 0d 00 00 00 mov $0xd,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(uptime) + 3d3: b8 0e 00 00 00 mov $0xe,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(open) + 3db: b8 0f 00 00 00 mov $0xf,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(write) + 3e3: b8 10 00 00 00 mov $0x10,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(mknod) + 3eb: b8 11 00 00 00 mov $0x11,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(unlink) + 3f3: b8 12 00 00 00 mov $0x12,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + +000003fb : +SYSCALL(link) + 3fb: b8 13 00 00 00 mov $0x13,%eax + 400: cd 40 int $0x40 + 402: c3 ret + +00000403 : +SYSCALL(mkdir) + 403: b8 14 00 00 00 mov $0x14,%eax + 408: cd 40 int $0x40 + 40a: c3 ret + +0000040b : +SYSCALL(close) + 40b: b8 15 00 00 00 mov $0x15,%eax + 410: cd 40 int $0x40 + 412: c3 ret + +00000413 : +SYSCALL(getch) + 413: b8 16 00 00 00 mov $0x16,%eax + 418: cd 40 int $0x40 + 41a: c3 ret + +0000041b : +SYSCALL(greeting) + 41b: b8 17 00 00 00 mov $0x17,%eax + 420: cd 40 int $0x40 + 422: c3 ret + +00000423 : +SYSCALL(shutdown) + 423: b8 18 00 00 00 mov $0x18,%eax + 428: cd 40 int $0x40 + 42a: c3 ret + +0000042b : +SYSCALL(screen) + 42b: b8 19 00 00 00 mov $0x19,%eax + 430: cd 40 int $0x40 + 432: c3 ret + +00000433 : +SYSCALL(cls) + 433: b8 1a 00 00 00 mov $0x1a,%eax + 438: cd 40 int $0x40 + 43a: c3 ret diff --git a/forktest.d b/forktest.d new file mode 100644 index 0000000..d31a0c2 --- /dev/null +++ b/forktest.d @@ -0,0 +1 @@ +forktest.o: forktest.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/forktest.o b/forktest.o new file mode 100644 index 0000000000000000000000000000000000000000..8cf0db7823e49d860defb4ee1684695eac8de0a8 GIT binary patch literal 5480 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 literal 0 HcmV?d00001 diff --git a/fs.d b/fs.d new file mode 100644 index 0000000..a1d05cc --- /dev/null +++ b/fs.d @@ -0,0 +1,2 @@ +fs.o: fs.c /usr/include/stdc-predef.h types.h defs.h param.h stat.h mmu.h \ + proc.h spinlock.h sleeplock.h fs.h buf.h file.h diff --git a/fs.img b/fs.img new file mode 100644 index 0000000..dbeb48f --- /dev/null +++ b/fs.img @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a162f597afbb5a554ac7f7d58d0c9f2b6b0bedb572f62c50ce4a4b5299b879c1 +size 512000 diff --git a/fs.o b/fs.o new file mode 100644 index 0000000000000000000000000000000000000000..9b77b26a32c39b49d2998d8d14b362656ac36c64 GIT binary patch literal 31148 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 V3ba?GOlQ9BVf: + memmove(buf, p, m); + } + } +} + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 18 sub $0x18,%esp + 14: 8b 01 mov (%ecx),%eax + 16: 8b 59 04 mov 0x4(%ecx),%ebx + 19: 89 45 e4 mov %eax,-0x1c(%ebp) + int fd, i; + char *pattern; + + if (argc <= 1) { + 1c: 83 f8 01 cmp $0x1,%eax + 1f: 7e 6f jle 90 + printf(2, "usage: grep pattern [file ...]\n"); + exit(); + } + pattern = argv[1]; + 21: 8b 43 04 mov 0x4(%ebx),%eax + 24: 83 c3 08 add $0x8,%ebx + + if (argc <= 2) { + 27: 83 7d e4 02 cmpl $0x2,-0x1c(%ebp) + grep(pattern, 0); + exit(); + } + + for (i = 2; i < argc; i++) { + 2b: be 02 00 00 00 mov $0x2,%esi + pattern = argv[1]; + 30: 89 45 e0 mov %eax,-0x20(%ebp) + if (argc <= 2) { + 33: 75 2d jne 62 + 35: eb 6c jmp a3 + 37: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3e: 66 90 xchg %ax,%ax + if ((fd = open(argv[i], 0)) < 0) { + printf(1, "grep: cannot open %s\n", argv[i]); + exit(); + } + grep(pattern, fd); + 40: 83 ec 08 sub $0x8,%esp + for (i = 2; i < argc; i++) { + 43: 83 c6 01 add $0x1,%esi + 46: 83 c3 04 add $0x4,%ebx + grep(pattern, fd); + 49: 50 push %eax + 4a: ff 75 e0 push -0x20(%ebp) + 4d: e8 7e 01 00 00 call 1d0 + close(fd); + 52: 89 3c 24 mov %edi,(%esp) + 55: e8 01 06 00 00 call 65b + for (i = 2; i < argc; i++) { + 5a: 83 c4 10 add $0x10,%esp + 5d: 39 75 e4 cmp %esi,-0x1c(%ebp) + 60: 7e 29 jle 8b + if ((fd = open(argv[i], 0)) < 0) { + 62: 83 ec 08 sub $0x8,%esp + 65: 6a 00 push $0x0 + 67: ff 33 push (%ebx) + 69: e8 bd 05 00 00 call 62b + 6e: 83 c4 10 add $0x10,%esp + 71: 89 c7 mov %eax,%edi + 73: 85 c0 test %eax,%eax + 75: 79 c9 jns 40 + printf(1, "grep: cannot open %s\n", argv[i]); + 77: 50 push %eax + 78: ff 33 push (%ebx) + 7a: 68 88 0a 00 00 push $0xa88 + 7f: 6a 01 push $0x1 + 81: e8 ba 06 00 00 call 740 + exit(); + 86: e8 38 05 00 00 call 5c3 + } + exit(); + 8b: e8 33 05 00 00 call 5c3 + printf(2, "usage: grep pattern [file ...]\n"); + 90: 51 push %ecx + 91: 51 push %ecx + 92: 68 68 0a 00 00 push $0xa68 + 97: 6a 02 push $0x2 + 99: e8 a2 06 00 00 call 740 + exit(); + 9e: e8 20 05 00 00 call 5c3 + grep(pattern, 0); + a3: 52 push %edx + a4: 52 push %edx + a5: 6a 00 push $0x0 + a7: 50 push %eax + a8: e8 23 01 00 00 call 1d0 + exit(); + ad: e8 11 05 00 00 call 5c3 + b2: 66 90 xchg %ax,%ax + b4: 66 90 xchg %ax,%ax + b6: 66 90 xchg %ax,%ax + b8: 66 90 xchg %ax,%ax + ba: 66 90 xchg %ax,%ax + bc: 66 90 xchg %ax,%ax + be: 66 90 xchg %ax,%ax + +000000c0 : + while (*text++ != '\0'); + return 0; +} + +// matchhere: search for re at beginning of text +int matchhere(char *re, char *text){ + c0: 55 push %ebp + c1: 89 e5 mov %esp,%ebp + c3: 57 push %edi + c4: 56 push %esi + c5: 53 push %ebx + c6: 83 ec 0c sub $0xc,%esp + c9: 8b 75 08 mov 0x8(%ebp),%esi + cc: 8b 7d 0c mov 0xc(%ebp),%edi + if (re[0] == '\0') { + cf: 0f b6 06 movzbl (%esi),%eax + d2: 84 c0 test %al,%al + d4: 75 2d jne 103 + d6: e9 7d 00 00 00 jmp 158 + db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + df: 90 nop + } + if (re[1] == '*') { + return matchstar(re[0], re + 2, text); + } + if (re[0] == '$' && re[1] == '\0') { + return *text == '\0'; + e0: 0f b6 0f movzbl (%edi),%ecx + if (re[0] == '$' && re[1] == '\0') { + e3: 80 fb 24 cmp $0x24,%bl + e6: 75 04 jne ec + e8: 84 c0 test %al,%al + ea: 74 79 je 165 + } + if (*text != '\0' && (re[0] == '.' || re[0] == *text)) { + ec: 84 c9 test %cl,%cl + ee: 74 58 je 148 + f0: 38 d9 cmp %bl,%cl + f2: 74 05 je f9 + f4: 80 fb 2e cmp $0x2e,%bl + f7: 75 4f jne 148 + return matchhere(re + 1, text + 1); + f9: 83 c7 01 add $0x1,%edi + fc: 83 c6 01 add $0x1,%esi + if (re[0] == '\0') { + ff: 84 c0 test %al,%al + 101: 74 55 je 158 + if (re[1] == '*') { + 103: 0f be d8 movsbl %al,%ebx + 106: 0f b6 46 01 movzbl 0x1(%esi),%eax + 10a: 3c 2a cmp $0x2a,%al + 10c: 75 d2 jne e0 + return matchstar(re[0], re + 2, text); + 10e: 83 c6 02 add $0x2,%esi + } + return 0; +} + +// matchstar: search for c*re at beginning of text +int matchstar(int c, char *re, char *text) { + 111: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + do { // a * matches zero or more instances + if (matchhere(re, text)) { + 118: 83 ec 08 sub $0x8,%esp + 11b: 57 push %edi + 11c: 56 push %esi + 11d: e8 9e ff ff ff call c0 + 122: 83 c4 10 add $0x10,%esp + 125: 85 c0 test %eax,%eax + 127: 75 2f jne 158 + return 1; + } + } + while (*text != '\0' && (*text++ == c || c == '.')); + 129: 0f be 17 movsbl (%edi),%edx + 12c: 84 d2 test %dl,%dl + 12e: 74 0c je 13c + 130: 83 c7 01 add $0x1,%edi + 133: 83 fb 2e cmp $0x2e,%ebx + 136: 74 e0 je 118 + 138: 39 da cmp %ebx,%edx + 13a: 74 dc je 118 +} + 13c: 8d 65 f4 lea -0xc(%ebp),%esp + 13f: 5b pop %ebx + 140: 5e pop %esi + 141: 5f pop %edi + 142: 5d pop %ebp + 143: c3 ret + 144: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 148: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 14b: 31 c0 xor %eax,%eax +} + 14d: 5b pop %ebx + 14e: 5e pop %esi + 14f: 5f pop %edi + 150: 5d pop %ebp + 151: c3 ret + 152: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + 158: 8d 65 f4 lea -0xc(%ebp),%esp + return 1; + 15b: b8 01 00 00 00 mov $0x1,%eax +} + 160: 5b pop %ebx + 161: 5e pop %esi + 162: 5f pop %edi + 163: 5d pop %ebp + 164: c3 ret + return *text == '\0'; + 165: 31 c0 xor %eax,%eax + 167: 84 c9 test %cl,%cl + 169: 0f 94 c0 sete %al + 16c: eb ce jmp 13c + 16e: 66 90 xchg %ax,%ax + +00000170 : +int match(char *re, char *text) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 56 push %esi + 174: 53 push %ebx + 175: 8b 5d 08 mov 0x8(%ebp),%ebx + 178: 8b 75 0c mov 0xc(%ebp),%esi + if (re[0] == '^') { + 17b: 80 3b 5e cmpb $0x5e,(%ebx) + 17e: 75 11 jne 191 + 180: eb 2e jmp 1b0 + 182: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + while (*text++ != '\0'); + 188: 83 c6 01 add $0x1,%esi + 18b: 80 7e ff 00 cmpb $0x0,-0x1(%esi) + 18f: 74 16 je 1a7 + if (matchhere(re, text)) { + 191: 83 ec 08 sub $0x8,%esp + 194: 56 push %esi + 195: 53 push %ebx + 196: e8 25 ff ff ff call c0 + 19b: 83 c4 10 add $0x10,%esp + 19e: 85 c0 test %eax,%eax + 1a0: 74 e6 je 188 + return 1; + 1a2: b8 01 00 00 00 mov $0x1,%eax +} + 1a7: 8d 65 f8 lea -0x8(%ebp),%esp + 1aa: 5b pop %ebx + 1ab: 5e pop %esi + 1ac: 5d pop %ebp + 1ad: c3 ret + 1ae: 66 90 xchg %ax,%ax + return matchhere(re + 1, text); + 1b0: 83 c3 01 add $0x1,%ebx + 1b3: 89 5d 08 mov %ebx,0x8(%ebp) +} + 1b6: 8d 65 f8 lea -0x8(%ebp),%esp + 1b9: 5b pop %ebx + 1ba: 5e pop %esi + 1bb: 5d pop %ebp + return matchhere(re + 1, text); + 1bc: e9 ff fe ff ff jmp c0 + 1c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1cf: 90 nop + +000001d0 : +void grep(char *pattern, int fd) { + 1d0: 55 push %ebp + 1d1: 89 e5 mov %esp,%ebp + 1d3: 57 push %edi + 1d4: 56 push %esi + 1d5: 53 push %ebx + 1d6: 83 ec 1c sub $0x1c,%esp + 1d9: 8b 7d 08 mov 0x8(%ebp),%edi + m = 0; + 1dc: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) + return matchhere(re + 1, text); + 1e3: 8d 47 01 lea 0x1(%edi),%eax + 1e6: 89 45 d8 mov %eax,-0x28(%ebp) + 1e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + while ((n = read(fd, buf + m, sizeof(buf) - m - 1)) > 0) { + 1f0: 8b 4d dc mov -0x24(%ebp),%ecx + 1f3: b8 ff 03 00 00 mov $0x3ff,%eax + 1f8: 83 ec 04 sub $0x4,%esp + 1fb: 29 c8 sub %ecx,%eax + 1fd: 50 push %eax + 1fe: 8d 81 a0 0e 00 00 lea 0xea0(%ecx),%eax + 204: 50 push %eax + 205: ff 75 0c push 0xc(%ebp) + 208: e8 ce 03 00 00 call 5db + 20d: 83 c4 10 add $0x10,%esp + 210: 85 c0 test %eax,%eax + 212: 0f 8e e5 00 00 00 jle 2fd + m += n; + 218: 01 45 dc add %eax,-0x24(%ebp) + 21b: 8b 4d dc mov -0x24(%ebp),%ecx + p = buf; + 21e: c7 45 e4 a0 0e 00 00 movl $0xea0,-0x1c(%ebp) + buf[m] = '\0'; + 225: c6 81 a0 0e 00 00 00 movb $0x0,0xea0(%ecx) + while ((q = strchr(p, '\n')) != 0) { + 22c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 230: 83 ec 08 sub $0x8,%esp + 233: 6a 0a push $0xa + 235: ff 75 e4 push -0x1c(%ebp) + 238: e8 13 02 00 00 call 450 + 23d: 83 c4 10 add $0x10,%esp + 240: 89 c3 mov %eax,%ebx + 242: 85 c0 test %eax,%eax + 244: 74 72 je 2b8 + *q = 0; + 246: c6 03 00 movb $0x0,(%ebx) + write(1, p, q + 1 - p); + 249: 8d 43 01 lea 0x1(%ebx),%eax + if (re[0] == '^') { + 24c: 80 3f 5e cmpb $0x5e,(%edi) + write(1, p, q + 1 - p); + 24f: 89 45 e0 mov %eax,-0x20(%ebp) + 252: 8b 75 e4 mov -0x1c(%ebp),%esi + if (re[0] == '^') { + 255: 75 12 jne 269 + 257: eb 47 jmp 2a0 + 259: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + while (*text++ != '\0'); + 260: 83 c6 01 add $0x1,%esi + 263: 80 7e ff 00 cmpb $0x0,-0x1(%esi) + 267: 74 2b je 294 + if (matchhere(re, text)) { + 269: 83 ec 08 sub $0x8,%esp + 26c: 56 push %esi + 26d: 57 push %edi + 26e: e8 4d fe ff ff call c0 + 273: 83 c4 10 add $0x10,%esp + 276: 85 c0 test %eax,%eax + 278: 74 e6 je 260 + write(1, p, q + 1 - p); + 27a: 8b 55 e4 mov -0x1c(%ebp),%edx + 27d: 8b 45 e0 mov -0x20(%ebp),%eax + 280: 83 ec 04 sub $0x4,%esp + *q = '\n'; + 283: c6 03 0a movb $0xa,(%ebx) + write(1, p, q + 1 - p); + 286: 29 d0 sub %edx,%eax + 288: 50 push %eax + 289: 52 push %edx + 28a: 6a 01 push $0x1 + 28c: e8 a2 03 00 00 call 633 + 291: 83 c4 10 add $0x10,%esp + p = q + 1; + 294: 8b 45 e0 mov -0x20(%ebp),%eax + 297: 89 45 e4 mov %eax,-0x1c(%ebp) + 29a: eb 94 jmp 230 + 29c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + return matchhere(re + 1, text); + 2a0: 83 ec 08 sub $0x8,%esp + 2a3: 56 push %esi + 2a4: ff 75 d8 push -0x28(%ebp) + 2a7: e8 14 fe ff ff call c0 + 2ac: 83 c4 10 add $0x10,%esp + if (match(pattern, p)) { + 2af: 85 c0 test %eax,%eax + 2b1: 74 e1 je 294 + 2b3: eb c5 jmp 27a + 2b5: 8d 76 00 lea 0x0(%esi),%esi + if (p == buf) { + 2b8: 8b 55 e4 mov -0x1c(%ebp),%edx + 2bb: 81 fa a0 0e 00 00 cmp $0xea0,%edx + 2c1: 74 2e je 2f1 + if (m > 0) { + 2c3: 8b 4d dc mov -0x24(%ebp),%ecx + 2c6: 85 c9 test %ecx,%ecx + 2c8: 0f 8e 22 ff ff ff jle 1f0 + m -= p - buf; + 2ce: 89 d0 mov %edx,%eax + memmove(buf, p, m); + 2d0: 83 ec 04 sub $0x4,%esp + m -= p - buf; + 2d3: 2d a0 0e 00 00 sub $0xea0,%eax + 2d8: 29 c1 sub %eax,%ecx + memmove(buf, p, m); + 2da: 51 push %ecx + 2db: 52 push %edx + 2dc: 68 a0 0e 00 00 push $0xea0 + m -= p - buf; + 2e1: 89 4d dc mov %ecx,-0x24(%ebp) + memmove(buf, p, m); + 2e4: e8 a7 02 00 00 call 590 + 2e9: 83 c4 10 add $0x10,%esp + 2ec: e9 ff fe ff ff jmp 1f0 + m = 0; + 2f1: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) + 2f8: e9 f3 fe ff ff jmp 1f0 +} + 2fd: 8d 65 f4 lea -0xc(%ebp),%esp + 300: 5b pop %ebx + 301: 5e pop %esi + 302: 5f pop %edi + 303: 5d pop %ebp + 304: c3 ret + 305: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 30c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000310 : +int matchstar(int c, char *re, char *text) { + 310: 55 push %ebp + 311: 89 e5 mov %esp,%ebp + 313: 57 push %edi + 314: 56 push %esi + 315: 53 push %ebx + 316: 83 ec 0c sub $0xc,%esp + 319: 8b 5d 08 mov 0x8(%ebp),%ebx + 31c: 8b 75 0c mov 0xc(%ebp),%esi + 31f: 8b 7d 10 mov 0x10(%ebp),%edi + 322: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (matchhere(re, text)) { + 328: 83 ec 08 sub $0x8,%esp + 32b: 57 push %edi + 32c: 56 push %esi + 32d: e8 8e fd ff ff call c0 + 332: 83 c4 10 add $0x10,%esp + 335: 85 c0 test %eax,%eax + 337: 75 1f jne 358 + while (*text != '\0' && (*text++ == c || c == '.')); + 339: 0f be 17 movsbl (%edi),%edx + 33c: 84 d2 test %dl,%dl + 33e: 74 0c je 34c + 340: 83 c7 01 add $0x1,%edi + 343: 39 da cmp %ebx,%edx + 345: 74 e1 je 328 + 347: 83 fb 2e cmp $0x2e,%ebx + 34a: 74 dc je 328 +} + 34c: 8d 65 f4 lea -0xc(%ebp),%esp + 34f: 5b pop %ebx + 350: 5e pop %esi + 351: 5f pop %edi + 352: 5d pop %ebp + 353: c3 ret + 354: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 358: 8d 65 f4 lea -0xc(%ebp),%esp + return 1; + 35b: b8 01 00 00 00 mov $0x1,%eax +} + 360: 5b pop %ebx + 361: 5e pop %esi + 362: 5f pop %edi + 363: 5d pop %ebp + 364: c3 ret + 365: 66 90 xchg %ax,%ax + 367: 66 90 xchg %ax,%ax + 369: 66 90 xchg %ax,%ax + 36b: 66 90 xchg %ax,%ax + 36d: 66 90 xchg %ax,%ax + 36f: 90 nop + +00000370 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 370: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 371: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 373: 89 e5 mov %esp,%ebp + 375: 53 push %ebx + 376: 8b 4d 08 mov 0x8(%ebp),%ecx + 379: 8b 5d 0c mov 0xc(%ebp),%ebx + 37c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 380: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 384: 88 14 01 mov %dl,(%ecx,%eax,1) + 387: 83 c0 01 add $0x1,%eax + 38a: 84 d2 test %dl,%dl + 38c: 75 f2 jne 380 + ; + } + return os; +} + 38e: 8b 5d fc mov -0x4(%ebp),%ebx + 391: 89 c8 mov %ecx,%eax + 393: c9 leave + 394: c3 ret + 395: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 39c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000003a0 : + +int strcmp(const char *p, const char *q) { + 3a0: 55 push %ebp + 3a1: 89 e5 mov %esp,%ebp + 3a3: 53 push %ebx + 3a4: 8b 55 08 mov 0x8(%ebp),%edx + 3a7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 3aa: 0f b6 02 movzbl (%edx),%eax + 3ad: 84 c0 test %al,%al + 3af: 75 17 jne 3c8 + 3b1: eb 3a jmp 3ed + 3b3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 3b7: 90 nop + 3b8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 3bc: 83 c2 01 add $0x1,%edx + 3bf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 3c2: 84 c0 test %al,%al + 3c4: 74 1a je 3e0 + p++, q++; + 3c6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 3c8: 0f b6 19 movzbl (%ecx),%ebx + 3cb: 38 c3 cmp %al,%bl + 3cd: 74 e9 je 3b8 + } + return (uchar) * p - (uchar) * q; + 3cf: 29 d8 sub %ebx,%eax +} + 3d1: 8b 5d fc mov -0x4(%ebp),%ebx + 3d4: c9 leave + 3d5: c3 ret + 3d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3dd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 3e0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 3e4: 31 c0 xor %eax,%eax + 3e6: 29 d8 sub %ebx,%eax +} + 3e8: 8b 5d fc mov -0x4(%ebp),%ebx + 3eb: c9 leave + 3ec: c3 ret + return (uchar) * p - (uchar) * q; + 3ed: 0f b6 19 movzbl (%ecx),%ebx + 3f0: 31 c0 xor %eax,%eax + 3f2: eb db jmp 3cf + 3f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 3ff: 90 nop + +00000400 : + +uint strlen(const char *s) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 406: 80 3a 00 cmpb $0x0,(%edx) + 409: 74 15 je 420 + 40b: 31 c0 xor %eax,%eax + 40d: 8d 76 00 lea 0x0(%esi),%esi + 410: 83 c0 01 add $0x1,%eax + 413: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 417: 89 c1 mov %eax,%ecx + 419: 75 f5 jne 410 + ; + } + return n; +} + 41b: 89 c8 mov %ecx,%eax + 41d: 5d pop %ebp + 41e: c3 ret + 41f: 90 nop + for (n = 0; s[n]; n++) { + 420: 31 c9 xor %ecx,%ecx +} + 422: 5d pop %ebp + 423: 89 c8 mov %ecx,%eax + 425: c3 ret + 426: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42d: 8d 76 00 lea 0x0(%esi),%esi + +00000430 : + +void* memset(void *dst, int c, uint n) { + 430: 55 push %ebp + 431: 89 e5 mov %esp,%ebp + 433: 57 push %edi + 434: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 437: 8b 4d 10 mov 0x10(%ebp),%ecx + 43a: 8b 45 0c mov 0xc(%ebp),%eax + 43d: 89 d7 mov %edx,%edi + 43f: fc cld + 440: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 442: 8b 7d fc mov -0x4(%ebp),%edi + 445: 89 d0 mov %edx,%eax + 447: c9 leave + 448: c3 ret + 449: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000450 : + +char* strchr(const char *s, char c) { + 450: 55 push %ebp + 451: 89 e5 mov %esp,%ebp + 453: 8b 45 08 mov 0x8(%ebp),%eax + 456: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 45a: 0f b6 10 movzbl (%eax),%edx + 45d: 84 d2 test %dl,%dl + 45f: 75 12 jne 473 + 461: eb 1d jmp 480 + 463: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 467: 90 nop + 468: 0f b6 50 01 movzbl 0x1(%eax),%edx + 46c: 83 c0 01 add $0x1,%eax + 46f: 84 d2 test %dl,%dl + 471: 74 0d je 480 + if (*s == c) { + 473: 38 d1 cmp %dl,%cl + 475: 75 f1 jne 468 + return (char*)s; + } + } + return 0; +} + 477: 5d pop %ebp + 478: c3 ret + 479: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 480: 31 c0 xor %eax,%eax +} + 482: 5d pop %ebp + 483: c3 ret + 484: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 48b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 48f: 90 nop + +00000490 : + +char* gets(char *buf, int max) { + 490: 55 push %ebp + 491: 89 e5 mov %esp,%ebp + 493: 57 push %edi + 494: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 495: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 498: 53 push %ebx + for (i = 0; i + 1 < max;) { + 499: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 49b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 49e: eb 27 jmp 4c7 + cc = read(0, &c, 1); + 4a0: 83 ec 04 sub $0x4,%esp + 4a3: 6a 01 push $0x1 + 4a5: 57 push %edi + 4a6: 6a 00 push $0x0 + 4a8: e8 2e 01 00 00 call 5db + if (cc < 1) { + 4ad: 83 c4 10 add $0x10,%esp + 4b0: 85 c0 test %eax,%eax + 4b2: 7e 1d jle 4d1 + break; + } + buf[i++] = c; + 4b4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 4b8: 8b 55 08 mov 0x8(%ebp),%edx + 4bb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 4bf: 3c 0a cmp $0xa,%al + 4c1: 74 1d je 4e0 + 4c3: 3c 0d cmp $0xd,%al + 4c5: 74 19 je 4e0 + for (i = 0; i + 1 < max;) { + 4c7: 89 de mov %ebx,%esi + 4c9: 83 c3 01 add $0x1,%ebx + 4cc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 4cf: 7c cf jl 4a0 + break; + } + } + buf[i] = '\0'; + 4d1: 8b 45 08 mov 0x8(%ebp),%eax + 4d4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 4d8: 8d 65 f4 lea -0xc(%ebp),%esp + 4db: 5b pop %ebx + 4dc: 5e pop %esi + 4dd: 5f pop %edi + 4de: 5d pop %ebp + 4df: c3 ret + buf[i] = '\0'; + 4e0: 8b 45 08 mov 0x8(%ebp),%eax + 4e3: 89 de mov %ebx,%esi + 4e5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 4e9: 8d 65 f4 lea -0xc(%ebp),%esp + 4ec: 5b pop %ebx + 4ed: 5e pop %esi + 4ee: 5f pop %edi + 4ef: 5d pop %ebp + 4f0: c3 ret + 4f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4ff: 90 nop + +00000500 : + +int stat(const char *n, struct stat *st) { + 500: 55 push %ebp + 501: 89 e5 mov %esp,%ebp + 503: 56 push %esi + 504: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 505: 83 ec 08 sub $0x8,%esp + 508: 6a 00 push $0x0 + 50a: ff 75 08 push 0x8(%ebp) + 50d: e8 19 01 00 00 call 62b + if (fd < 0) { + 512: 83 c4 10 add $0x10,%esp + 515: 85 c0 test %eax,%eax + 517: 78 27 js 540 + return -1; + } + r = fstat(fd, st); + 519: 83 ec 08 sub $0x8,%esp + 51c: ff 75 0c push 0xc(%ebp) + 51f: 89 c3 mov %eax,%ebx + 521: 50 push %eax + 522: e8 cc 00 00 00 call 5f3 + close(fd); + 527: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 52a: 89 c6 mov %eax,%esi + close(fd); + 52c: e8 2a 01 00 00 call 65b + return r; + 531: 83 c4 10 add $0x10,%esp +} + 534: 8d 65 f8 lea -0x8(%ebp),%esp + 537: 89 f0 mov %esi,%eax + 539: 5b pop %ebx + 53a: 5e pop %esi + 53b: 5d pop %ebp + 53c: c3 ret + 53d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 540: be ff ff ff ff mov $0xffffffff,%esi + 545: eb ed jmp 534 + 547: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 54e: 66 90 xchg %ax,%ax + +00000550 : + +int atoi(const char *s) { + 550: 55 push %ebp + 551: 89 e5 mov %esp,%ebp + 553: 53 push %ebx + 554: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 557: 0f be 02 movsbl (%edx),%eax + 55a: 8d 48 d0 lea -0x30(%eax),%ecx + 55d: 80 f9 09 cmp $0x9,%cl + n = 0; + 560: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 565: 77 1e ja 585 + 567: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 56e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 570: 83 c2 01 add $0x1,%edx + 573: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 576: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 57a: 0f be 02 movsbl (%edx),%eax + 57d: 8d 58 d0 lea -0x30(%eax),%ebx + 580: 80 fb 09 cmp $0x9,%bl + 583: 76 eb jbe 570 + } + return n; +} + 585: 8b 5d fc mov -0x4(%ebp),%ebx + 588: 89 c8 mov %ecx,%eax + 58a: c9 leave + 58b: c3 ret + 58c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000590 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 590: 55 push %ebp + 591: 89 e5 mov %esp,%ebp + 593: 57 push %edi + 594: 8b 45 10 mov 0x10(%ebp),%eax + 597: 8b 55 08 mov 0x8(%ebp),%edx + 59a: 56 push %esi + 59b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 59e: 85 c0 test %eax,%eax + 5a0: 7e 13 jle 5b5 + 5a2: 01 d0 add %edx,%eax + dst = vdst; + 5a4: 89 d7 mov %edx,%edi + 5a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5ad: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 5b0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 5b1: 39 f8 cmp %edi,%eax + 5b3: 75 fb jne 5b0 + } + return vdst; +} + 5b5: 5e pop %esi + 5b6: 89 d0 mov %edx,%eax + 5b8: 5f pop %edi + 5b9: 5d pop %ebp + 5ba: c3 ret + +000005bb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 5bb: b8 01 00 00 00 mov $0x1,%eax + 5c0: cd 40 int $0x40 + 5c2: c3 ret + +000005c3 : +SYSCALL(exit) + 5c3: b8 02 00 00 00 mov $0x2,%eax + 5c8: cd 40 int $0x40 + 5ca: c3 ret + +000005cb : +SYSCALL(wait) + 5cb: b8 03 00 00 00 mov $0x3,%eax + 5d0: cd 40 int $0x40 + 5d2: c3 ret + +000005d3 : +SYSCALL(pipe) + 5d3: b8 04 00 00 00 mov $0x4,%eax + 5d8: cd 40 int $0x40 + 5da: c3 ret + +000005db : +SYSCALL(read) + 5db: b8 05 00 00 00 mov $0x5,%eax + 5e0: cd 40 int $0x40 + 5e2: c3 ret + +000005e3 : +SYSCALL(kill) + 5e3: b8 06 00 00 00 mov $0x6,%eax + 5e8: cd 40 int $0x40 + 5ea: c3 ret + +000005eb : +SYSCALL(exec) + 5eb: b8 07 00 00 00 mov $0x7,%eax + 5f0: cd 40 int $0x40 + 5f2: c3 ret + +000005f3 : +SYSCALL(fstat) + 5f3: b8 08 00 00 00 mov $0x8,%eax + 5f8: cd 40 int $0x40 + 5fa: c3 ret + +000005fb : +SYSCALL(chdir) + 5fb: b8 09 00 00 00 mov $0x9,%eax + 600: cd 40 int $0x40 + 602: c3 ret + +00000603 : +SYSCALL(dup) + 603: b8 0a 00 00 00 mov $0xa,%eax + 608: cd 40 int $0x40 + 60a: c3 ret + +0000060b : +SYSCALL(getpid) + 60b: b8 0b 00 00 00 mov $0xb,%eax + 610: cd 40 int $0x40 + 612: c3 ret + +00000613 : +SYSCALL(sbrk) + 613: b8 0c 00 00 00 mov $0xc,%eax + 618: cd 40 int $0x40 + 61a: c3 ret + +0000061b : +SYSCALL(sleep) + 61b: b8 0d 00 00 00 mov $0xd,%eax + 620: cd 40 int $0x40 + 622: c3 ret + +00000623 : +SYSCALL(uptime) + 623: b8 0e 00 00 00 mov $0xe,%eax + 628: cd 40 int $0x40 + 62a: c3 ret + +0000062b : +SYSCALL(open) + 62b: b8 0f 00 00 00 mov $0xf,%eax + 630: cd 40 int $0x40 + 632: c3 ret + +00000633 : +SYSCALL(write) + 633: b8 10 00 00 00 mov $0x10,%eax + 638: cd 40 int $0x40 + 63a: c3 ret + +0000063b : +SYSCALL(mknod) + 63b: b8 11 00 00 00 mov $0x11,%eax + 640: cd 40 int $0x40 + 642: c3 ret + +00000643 : +SYSCALL(unlink) + 643: b8 12 00 00 00 mov $0x12,%eax + 648: cd 40 int $0x40 + 64a: c3 ret + +0000064b : +SYSCALL(link) + 64b: b8 13 00 00 00 mov $0x13,%eax + 650: cd 40 int $0x40 + 652: c3 ret + +00000653 : +SYSCALL(mkdir) + 653: b8 14 00 00 00 mov $0x14,%eax + 658: cd 40 int $0x40 + 65a: c3 ret + +0000065b : +SYSCALL(close) + 65b: b8 15 00 00 00 mov $0x15,%eax + 660: cd 40 int $0x40 + 662: c3 ret + +00000663 : +SYSCALL(getch) + 663: b8 16 00 00 00 mov $0x16,%eax + 668: cd 40 int $0x40 + 66a: c3 ret + +0000066b : +SYSCALL(greeting) + 66b: b8 17 00 00 00 mov $0x17,%eax + 670: cd 40 int $0x40 + 672: c3 ret + +00000673 : +SYSCALL(shutdown) + 673: b8 18 00 00 00 mov $0x18,%eax + 678: cd 40 int $0x40 + 67a: c3 ret + +0000067b : +SYSCALL(screen) + 67b: b8 19 00 00 00 mov $0x19,%eax + 680: cd 40 int $0x40 + 682: c3 ret + +00000683 : +SYSCALL(cls) + 683: b8 1a 00 00 00 mov $0x1a,%eax + 688: cd 40 int $0x40 + 68a: c3 ret + 68b: 66 90 xchg %ax,%ax + 68d: 66 90 xchg %ax,%ax + 68f: 90 nop + +00000690 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 690: 55 push %ebp + 691: 89 e5 mov %esp,%ebp + 693: 57 push %edi + 694: 56 push %esi + 695: 53 push %ebx + 696: 83 ec 3c sub $0x3c,%esp + 699: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 69c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 69e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 6a1: 85 d2 test %edx,%edx + 6a3: 0f 89 7f 00 00 00 jns 728 + 6a9: f6 45 08 01 testb $0x1,0x8(%ebp) + 6ad: 74 79 je 728 + neg = 1; + 6af: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 6b6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 6b8: 31 db xor %ebx,%ebx + 6ba: 8d 75 d7 lea -0x29(%ebp),%esi + 6bd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 6c0: 89 c8 mov %ecx,%eax + 6c2: 31 d2 xor %edx,%edx + 6c4: 89 cf mov %ecx,%edi + 6c6: f7 75 c4 divl -0x3c(%ebp) + 6c9: 0f b6 92 00 0b 00 00 movzbl 0xb00(%edx),%edx + 6d0: 89 45 c0 mov %eax,-0x40(%ebp) + 6d3: 89 d8 mov %ebx,%eax + 6d5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 6d8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 6db: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 6de: 39 7d c4 cmp %edi,-0x3c(%ebp) + 6e1: 76 dd jbe 6c0 + if (neg) { + 6e3: 8b 4d bc mov -0x44(%ebp),%ecx + 6e6: 85 c9 test %ecx,%ecx + 6e8: 74 0c je 6f6 + buf[i++] = '-'; + 6ea: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 6ef: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 6f1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 6f6: 8b 7d b8 mov -0x48(%ebp),%edi + 6f9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 6fd: eb 07 jmp 706 + 6ff: 90 nop + putc(fd, buf[i]); + 700: 0f b6 13 movzbl (%ebx),%edx + 703: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 706: 83 ec 04 sub $0x4,%esp + 709: 88 55 d7 mov %dl,-0x29(%ebp) + 70c: 6a 01 push $0x1 + 70e: 56 push %esi + 70f: 57 push %edi + 710: e8 1e ff ff ff call 633 + while (--i >= 0) { + 715: 83 c4 10 add $0x10,%esp + 718: 39 de cmp %ebx,%esi + 71a: 75 e4 jne 700 + } +} + 71c: 8d 65 f4 lea -0xc(%ebp),%esp + 71f: 5b pop %ebx + 720: 5e pop %esi + 721: 5f pop %edi + 722: 5d pop %ebp + 723: c3 ret + 724: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 728: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 72f: eb 87 jmp 6b8 + 731: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 738: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 73f: 90 nop + +00000740 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 740: 55 push %ebp + 741: 89 e5 mov %esp,%ebp + 743: 57 push %edi + 744: 56 push %esi + 745: 53 push %ebx + 746: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 749: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 74c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 74f: 0f b6 13 movzbl (%ebx),%edx + 752: 84 d2 test %dl,%dl + 754: 74 6a je 7c0 + ap = (uint*)(void*)&fmt + 1; + 756: 8d 45 10 lea 0x10(%ebp),%eax + 759: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 75c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 75f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 761: 89 45 d0 mov %eax,-0x30(%ebp) + 764: eb 36 jmp 79c + 766: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 76d: 8d 76 00 lea 0x0(%esi),%esi + 770: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 773: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 778: 83 f8 25 cmp $0x25,%eax + 77b: 74 15 je 792 + write(fd, &c, 1); + 77d: 83 ec 04 sub $0x4,%esp + 780: 88 55 e7 mov %dl,-0x19(%ebp) + 783: 6a 01 push $0x1 + 785: 57 push %edi + 786: 56 push %esi + 787: e8 a7 fe ff ff call 633 + 78c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 78f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 792: 0f b6 13 movzbl (%ebx),%edx + 795: 83 c3 01 add $0x1,%ebx + 798: 84 d2 test %dl,%dl + 79a: 74 24 je 7c0 + c = fmt[i] & 0xff; + 79c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 79f: 85 c9 test %ecx,%ecx + 7a1: 74 cd je 770 + } + } + else if (state == '%') { + 7a3: 83 f9 25 cmp $0x25,%ecx + 7a6: 75 ea jne 792 + if (c == 'd') { + 7a8: 83 f8 25 cmp $0x25,%eax + 7ab: 0f 84 07 01 00 00 je 8b8 + 7b1: 83 e8 63 sub $0x63,%eax + 7b4: 83 f8 15 cmp $0x15,%eax + 7b7: 77 17 ja 7d0 + 7b9: ff 24 85 a8 0a 00 00 jmp *0xaa8(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 7c0: 8d 65 f4 lea -0xc(%ebp),%esp + 7c3: 5b pop %ebx + 7c4: 5e pop %esi + 7c5: 5f pop %edi + 7c6: 5d pop %ebp + 7c7: c3 ret + 7c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 7cf: 90 nop + write(fd, &c, 1); + 7d0: 83 ec 04 sub $0x4,%esp + 7d3: 88 55 d4 mov %dl,-0x2c(%ebp) + 7d6: 6a 01 push $0x1 + 7d8: 57 push %edi + 7d9: 56 push %esi + 7da: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 7de: e8 50 fe ff ff call 633 + putc(fd, c); + 7e3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 7e7: 83 c4 0c add $0xc,%esp + 7ea: 88 55 e7 mov %dl,-0x19(%ebp) + 7ed: 6a 01 push $0x1 + 7ef: 57 push %edi + 7f0: 56 push %esi + 7f1: e8 3d fe ff ff call 633 + putc(fd, c); + 7f6: 83 c4 10 add $0x10,%esp + state = 0; + 7f9: 31 c9 xor %ecx,%ecx + 7fb: eb 95 jmp 792 + 7fd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 800: 83 ec 0c sub $0xc,%esp + 803: b9 10 00 00 00 mov $0x10,%ecx + 808: 6a 00 push $0x0 + 80a: 8b 45 d0 mov -0x30(%ebp),%eax + 80d: 8b 10 mov (%eax),%edx + 80f: 89 f0 mov %esi,%eax + 811: e8 7a fe ff ff call 690 + ap++; + 816: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 81a: 83 c4 10 add $0x10,%esp + state = 0; + 81d: 31 c9 xor %ecx,%ecx + 81f: e9 6e ff ff ff jmp 792 + 824: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 828: 8b 45 d0 mov -0x30(%ebp),%eax + 82b: 8b 10 mov (%eax),%edx + ap++; + 82d: 83 c0 04 add $0x4,%eax + 830: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 833: 85 d2 test %edx,%edx + 835: 0f 84 8d 00 00 00 je 8c8 + while (*s != 0) { + 83b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 83e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 840: 84 c0 test %al,%al + 842: 0f 84 4a ff ff ff je 792 + 848: 89 5d d4 mov %ebx,-0x2c(%ebp) + 84b: 89 d3 mov %edx,%ebx + 84d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 850: 83 ec 04 sub $0x4,%esp + s++; + 853: 83 c3 01 add $0x1,%ebx + 856: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 859: 6a 01 push $0x1 + 85b: 57 push %edi + 85c: 56 push %esi + 85d: e8 d1 fd ff ff call 633 + while (*s != 0) { + 862: 0f b6 03 movzbl (%ebx),%eax + 865: 83 c4 10 add $0x10,%esp + 868: 84 c0 test %al,%al + 86a: 75 e4 jne 850 + state = 0; + 86c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 86f: 31 c9 xor %ecx,%ecx + 871: e9 1c ff ff ff jmp 792 + 876: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 87d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 880: 83 ec 0c sub $0xc,%esp + 883: b9 0a 00 00 00 mov $0xa,%ecx + 888: 6a 01 push $0x1 + 88a: e9 7b ff ff ff jmp 80a + 88f: 90 nop + putc(fd, *ap); + 890: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 893: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 896: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 898: 6a 01 push $0x1 + 89a: 57 push %edi + 89b: 56 push %esi + putc(fd, *ap); + 89c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 89f: e8 8f fd ff ff call 633 + ap++; + 8a4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 8a8: 83 c4 10 add $0x10,%esp + state = 0; + 8ab: 31 c9 xor %ecx,%ecx + 8ad: e9 e0 fe ff ff jmp 792 + 8b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 8b8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 8bb: 83 ec 04 sub $0x4,%esp + 8be: e9 2a ff ff ff jmp 7ed + 8c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 8c7: 90 nop + s = "(null)"; + 8c8: ba 9e 0a 00 00 mov $0xa9e,%edx + while (*s != 0) { + 8cd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 8d0: b8 28 00 00 00 mov $0x28,%eax + 8d5: 89 d3 mov %edx,%ebx + 8d7: e9 74 ff ff ff jmp 850 + 8dc: 66 90 xchg %ax,%ax + 8de: 66 90 xchg %ax,%ax + +000008e0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 8e0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 8e1: a1 a0 12 00 00 mov 0x12a0,%eax +void free(void *ap) { + 8e6: 89 e5 mov %esp,%ebp + 8e8: 57 push %edi + 8e9: 56 push %esi + 8ea: 53 push %ebx + 8eb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 8ee: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 8f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 8f8: 89 c2 mov %eax,%edx + 8fa: 8b 00 mov (%eax),%eax + 8fc: 39 ca cmp %ecx,%edx + 8fe: 73 30 jae 930 + 900: 39 c1 cmp %eax,%ecx + 902: 72 04 jb 908 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 904: 39 c2 cmp %eax,%edx + 906: 72 f0 jb 8f8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 908: 8b 73 fc mov -0x4(%ebx),%esi + 90b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 90e: 39 f8 cmp %edi,%eax + 910: 74 30 je 942 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 912: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 915: 8b 42 04 mov 0x4(%edx),%eax + 918: 8d 34 c2 lea (%edx,%eax,8),%esi + 91b: 39 f1 cmp %esi,%ecx + 91d: 74 3a je 959 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 91f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 921: 5b pop %ebx + freep = p; + 922: 89 15 a0 12 00 00 mov %edx,0x12a0 +} + 928: 5e pop %esi + 929: 5f pop %edi + 92a: 5d pop %ebp + 92b: c3 ret + 92c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 930: 39 c2 cmp %eax,%edx + 932: 72 c4 jb 8f8 + 934: 39 c1 cmp %eax,%ecx + 936: 73 c0 jae 8f8 + if (bp + bp->s.size == p->s.ptr) { + 938: 8b 73 fc mov -0x4(%ebx),%esi + 93b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 93e: 39 f8 cmp %edi,%eax + 940: 75 d0 jne 912 + bp->s.size += p->s.ptr->s.size; + 942: 03 70 04 add 0x4(%eax),%esi + 945: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 948: 8b 02 mov (%edx),%eax + 94a: 8b 00 mov (%eax),%eax + 94c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 94f: 8b 42 04 mov 0x4(%edx),%eax + 952: 8d 34 c2 lea (%edx,%eax,8),%esi + 955: 39 f1 cmp %esi,%ecx + 957: 75 c6 jne 91f + p->s.size += bp->s.size; + 959: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 95c: 89 15 a0 12 00 00 mov %edx,0x12a0 + p->s.size += bp->s.size; + 962: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 965: 8b 4b f8 mov -0x8(%ebx),%ecx + 968: 89 0a mov %ecx,(%edx) +} + 96a: 5b pop %ebx + 96b: 5e pop %esi + 96c: 5f pop %edi + 96d: 5d pop %ebp + 96e: c3 ret + 96f: 90 nop + +00000970 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 970: 55 push %ebp + 971: 89 e5 mov %esp,%ebp + 973: 57 push %edi + 974: 56 push %esi + 975: 53 push %ebx + 976: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 979: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 97c: 8b 3d a0 12 00 00 mov 0x12a0,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 982: 8d 70 07 lea 0x7(%eax),%esi + 985: c1 ee 03 shr $0x3,%esi + 988: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 98b: 85 ff test %edi,%edi + 98d: 0f 84 9d 00 00 00 je a30 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 993: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 995: 8b 4a 04 mov 0x4(%edx),%ecx + 998: 39 f1 cmp %esi,%ecx + 99a: 73 6a jae a06 + 99c: bb 00 10 00 00 mov $0x1000,%ebx + 9a1: 39 de cmp %ebx,%esi + 9a3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 9a6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 9ad: 89 45 e4 mov %eax,-0x1c(%ebp) + 9b0: eb 17 jmp 9c9 + 9b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 9b8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 9ba: 8b 48 04 mov 0x4(%eax),%ecx + 9bd: 39 f1 cmp %esi,%ecx + 9bf: 73 4f jae a10 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 9c1: 8b 3d a0 12 00 00 mov 0x12a0,%edi + 9c7: 89 c2 mov %eax,%edx + 9c9: 39 d7 cmp %edx,%edi + 9cb: 75 eb jne 9b8 + p = sbrk(nu * sizeof(Header)); + 9cd: 83 ec 0c sub $0xc,%esp + 9d0: ff 75 e4 push -0x1c(%ebp) + 9d3: e8 3b fc ff ff call 613 + if (p == (char*)-1) { + 9d8: 83 c4 10 add $0x10,%esp + 9db: 83 f8 ff cmp $0xffffffff,%eax + 9de: 74 1c je 9fc + hp->s.size = nu; + 9e0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 9e3: 83 ec 0c sub $0xc,%esp + 9e6: 83 c0 08 add $0x8,%eax + 9e9: 50 push %eax + 9ea: e8 f1 fe ff ff call 8e0 + return freep; + 9ef: 8b 15 a0 12 00 00 mov 0x12a0,%edx + if ((p = morecore(nunits)) == 0) { + 9f5: 83 c4 10 add $0x10,%esp + 9f8: 85 d2 test %edx,%edx + 9fa: 75 bc jne 9b8 + return 0; + } + } + } +} + 9fc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 9ff: 31 c0 xor %eax,%eax +} + a01: 5b pop %ebx + a02: 5e pop %esi + a03: 5f pop %edi + a04: 5d pop %ebp + a05: c3 ret + if (p->s.size >= nunits) { + a06: 89 d0 mov %edx,%eax + a08: 89 fa mov %edi,%edx + a0a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + a10: 39 ce cmp %ecx,%esi + a12: 74 4c je a60 + p->s.size -= nunits; + a14: 29 f1 sub %esi,%ecx + a16: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + a19: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + a1c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + a1f: 89 15 a0 12 00 00 mov %edx,0x12a0 +} + a25: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + a28: 83 c0 08 add $0x8,%eax +} + a2b: 5b pop %ebx + a2c: 5e pop %esi + a2d: 5f pop %edi + a2e: 5d pop %ebp + a2f: c3 ret + base.s.ptr = freep = prevp = &base; + a30: c7 05 a0 12 00 00 a4 movl $0x12a4,0x12a0 + a37: 12 00 00 + base.s.size = 0; + a3a: bf a4 12 00 00 mov $0x12a4,%edi + base.s.ptr = freep = prevp = &base; + a3f: c7 05 a4 12 00 00 a4 movl $0x12a4,0x12a4 + a46: 12 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + a49: 89 fa mov %edi,%edx + base.s.size = 0; + a4b: c7 05 a8 12 00 00 00 movl $0x0,0x12a8 + a52: 00 00 00 + if (p->s.size >= nunits) { + a55: e9 42 ff ff ff jmp 99c + a5a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + a60: 8b 08 mov (%eax),%ecx + a62: 89 0a mov %ecx,(%edx) + a64: eb b9 jmp a1f diff --git a/grep.d b/grep.d new file mode 100644 index 0000000..15fc65b --- /dev/null +++ b/grep.d @@ -0,0 +1 @@ +grep.o: grep.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/grep.o b/grep.o new file mode 100644 index 0000000000000000000000000000000000000000..33f12c9c3b36369b1ac29f0dad8756aa2e90441c GIT binary patch literal 8728 zcma)B3vgW3c|K?FJ=ZJkN-Jq)8~K4&Miw|mYYPK@AU|cDw~q?E!dQdnYw6Jlg`PIIG%>%?p^%QMxueelDb zJDLYB2Zyr$p##CtN$2orw)W!#P!78_VkC4j^uU+ZS^My)yZ`W6w`IvcyXt{2quDzK z-joBUCB)l9ue~2SxlY!9Bm2(4Y2WZmHFP|1*}rqguf7@^8yk3|o9Toiyt@m>vKKx3!Ba;@-SlZo3^&LJR_+;WyfBo#m@T`s-pivI*L;p^ zr`HN?J{sD7aj5YE;y7&;&O5hx>)q1RLOj@b@zP_=E1QjF-}h8#_`#*05BCeSe(--7 zn;S)(N6v;GorAd=JO_WZ6wiBo%hqlZgSVac8tZ(SqD^t#}?`Ann}}2{n)Z4C-+T=wr;&!Y@T4Bv4v1V;weOEEgpJ@PXWN^F%#x}x+?AYv`!j>V#Oq_YxKn6mP=Y^RV@oDHBA*1HgPDVhe< z8j!=NJ`%$A<58@Ie@&r&Xw8%u_^Dgb#^-4Lv=yZ1Ip=6c6KyT9Pg1kIWYgaZ*%__XKaQJ_27Mz!vL!bf2zgdG$< z2*TekI>Kc9>A2{aMSlUNsH29Y2u{bdS@#X@c~p7)cM#2hwQQcMyFV(5*rK_T977AD z&SckHKxj_3lvr5^c7flCYJC$-2Z%N@ZD3L$dQl}M3=DY+02bBn3)A-+a(GpP7BB>PZRXNRaMp#ELdw87?t73tx$XlKa!cIBbmg5i$p$z$IB#!@OYNQh)4VYgjPN2NuC3t{V--4 z3q7B+W9+2RDFNI>@;DcNF(WC|gU4vDM(DEeYKFQ9@&%|WDFS*ho50*kL9Yk|X^{l8 zhk`y4)Fb&Zn7^Um9uW+2Xdj@yhg!gS9YmGYXg9U=Ja&RL6+;c6DpZTaTvSenw!Q#s zQIFcF-tnv#LwOUbwr&8i8dY9~rJhyE{&UoAptwQg0T9zr<=c4ZQO`r0PoWZ(4C+T9 zxRm7aJ|sgs-T{M6s5-z$KpaHXF@3^jSD`klPFiyWqo}W->Zbn+;yu)egzH=+{{nMO zRdLmBhH^V3^7tICOk`Xy*8+@Ca+F-iwIHsgAPr;PRLEP!0eOEI4V2gbu#~6^`=8^Y|otO_YvpsbZ*M^ zxC6OiudMLF)6}TYDbhm5{jjX4ufW1EaT<9pZ__!!S0On89EUu7X6W=7hjceHKR*Gc z2OAo_7BBORax*h~vitlLTs_HW&b%^;wC5W|IO~UG1t-2LUn#^Ky#N^LN~{zmuo}Ns z97=34Abm$|dq5tRKG$y_mPa*zR36j(G5M6{pOQ~&{%QF?&$Sp>9&jYf8>FMF5Ww;$yG`$1|0 zeFECzB_Csb$@jNDBqpcev0;l!SbrkFka9Da$;C9S@GU%HS8Vhh-DcmuTW+y;KL%gh z?8kiH^@01Y?-|WL=VKS!OcyQup3v!XdUQ9!!PE(H!WP}Wqr2_yJ}V@PxHR3B8rnAvw+M$O?5vQ-@qarl<5g z7| z#ob|x`S!AUq4-{~g<}Uxg}O%1L6P0rX(xK@)SpZHRr!{jkZX>&O!2hR@S+qUvxgTz zijUAQi;D=HI8+doaxQ3}tn`Jf22i;hDkBi8TE9Q>N_a;|rNXM(DIHOPF6FORO89K) zoL40p!)hAw7Nwl;D8D1sbzpr>s=zs_O28_|>hIJF<=mzMPQCI|xzSSw>$9pLtcqY7 zJfmhfx2qt?8TIO#CN;l)L`myj>9(k#Rag(YKicG~63ZnWY@s9TzKEKJ7FCXQ_p^>{ zL5Iu1lq&ynRqmWqrO=flXeXA}P5DM8TWM-#;iH_f)YD~wY>L4By^$6*$3X^or?DEC zfN*&jqM{KsWfcsTx@Xi<$GTOjMQ~qwNG+;YrBSu?GX(S;1}W=7EC&%*B^i*}u&QZN zQ(;?kMoq0(HBk&Wmx3bLDQlq&t4hb(B9-4-P_HVjEy$C#pc6xQ=?@N}2~um5L_ z&$qu@1@BNr)_%^!3cW@OxOg0^@Qj+Jsl_Tx#4re}wd`n4XWe%wrE!~So=3?`_d^l-tMN1urCpZHkR3+MD(d-Dx0azChtuoJ8IonTTeU#WyWQ@ z_MTX#+iRUjB{5RBy<4>Rq%!dw-5tjlQY_uoF4FN>hsboN(r#o@j{4FFr;|4Q!hFq( z_`U>^r)`-=e$eOKq1&`(qwQirZ@eQBTafA8+q^%sIi2cS5X)rZnM`jy>E7^vXz39y z3}iF$bhKND^$iWnBG+wi%O>5dnTguEtY+&D-f%;7;f?c*Sd{ZXLy`Aw74lntIWuV6 z-^Rwi6|z}cllx2*tBd_dd~1r-x`(ZY>;dJwxA4^J)2rWH{c|*E46MuJ)(1A^ajOGj zA^ae!@q7QcuQd-@19rbQrkjR96Md2t*Teoes`ueE-p2HAT_-2{haK(TLS^A6m{=Q> zVnd1YWyRW%g)30W6kqmRC5|tOG1>P&xV$kiW$+ zoVPNJf0f}0)UUgO-*^ST^$MPMEpJ{KueUw)rq&xdx4rdt3a@>iCvkmfl-G?bm64CB<_7@U@H*w!IA?_wl7vfKW{Hfs(c}(ELM0|cdV(>fE z;|lbBqvy4f`X3VE?|H*>ZAdIhbR{H~9@mBp;xo=5e;<-qqH~D&adI9Jb_)$IHn_rI zt3j8DaqTz!qXwTd_)~*#8~n^5f4`#tn+iOM@R6{11b_Huzg2{QsVa{-%K@&M`Qjh^@ZN@V6S=N<%jle51i_23ria5@FwE zFl+D;qaQK&J%dje{3{~b&E$Fq@@Gk6++d%gcfB$CqAZ%z?V{nPVwFY+@)awuQ>xREzu+Zc)>gAR3;MImMv|qkM7?(ar&<011 zmd`b~+~7uoJkx1Ehlum$dV_TaZ#KA!2!CtLI1Vu$w2MIQ1KnfrFAbg}LeJL%^&* zZz9>5644wTYimo#`}4IusrH^k#$^xiVXV@zWLJEWD4p#3npsaG8TT9`E{~*mujboR zy}V3{DE>%_M{z~3)z{u!SMlz>`aX?Z{69-2?2x|ko69QD-nTo*@f!%&Ft&FDwy=OwSOFP8bJ*rMZhnxGR?A_f-%+2#hr(=OuCKsKR% zr9saw0z1Cfyh0mRy%vGqO>GtIUi6HBT;nW!7w3<6E#AX-LB{d&R_Bek12p}51b54Jp3(w!HpuILA#R2#W|AF!Hu95Gr8XrDOAfvxBRL|d8(DcW?SVnNK z>&xqaBym7po7jL}zz91Ga: +#include "types.h" +#include "user.h" + +// User app that was from one of the tutorial but i have since changed it to provide useful information about the current process and console +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 08 sub $0x8,%esp + 14: 8b 31 mov (%ecx),%esi + 16: 8b 79 04 mov 0x4(%ecx),%edi + + for (int i = 1; i < argc; i++) { + 19: 83 fe 01 cmp $0x1,%esi + 1c: 7e 3b jle 59 + 1e: bb 01 00 00 00 mov $0x1,%ebx + 23: eb 0a jmp 2f + 25: 8d 76 00 lea 0x0(%esi),%esi + 28: 83 c3 01 add $0x1,%ebx + 2b: 39 de cmp %ebx,%esi + 2d: 74 2a je 59 + if (strcmp(argv[i], "-help") == 0) + 2f: 83 ec 08 sub $0x8,%esp + 32: 68 68 07 00 00 push $0x768 + 37: ff 34 9f push (%edi,%ebx,4) + 3a: e8 61 00 00 00 call a0 + 3f: 83 c4 10 add $0x10,%esp + 42: 85 c0 test %eax,%eax + 44: 75 e2 jne 28 + { + printf(1, "Does a system call that returns the current process and console information, used for debugging.\n"); + 46: 50 push %eax + 47: 50 push %eax + 48: 68 70 07 00 00 push $0x770 + 4d: 6a 01 push $0x1 + 4f: e8 ec 03 00 00 call 440 + exit(); + 54: e8 6a 02 00 00 call 2c3 + return 0; + } + } + + greeting(); + 59: e8 0d 03 00 00 call 36b + exit(); + 5e: e8 60 02 00 00 call 2c3 + 63: 66 90 xchg %ax,%ax + 65: 66 90 xchg %ax,%ax + 67: 66 90 xchg %ax,%ax + 69: 66 90 xchg %ax,%ax + 6b: 66 90 xchg %ax,%ax + 6d: 66 90 xchg %ax,%ax + 6f: 90 nop + +00000070 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 70: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 71: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 73: 89 e5 mov %esp,%ebp + 75: 53 push %ebx + 76: 8b 4d 08 mov 0x8(%ebp),%ecx + 79: 8b 5d 0c mov 0xc(%ebp),%ebx + 7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 80: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 84: 88 14 01 mov %dl,(%ecx,%eax,1) + 87: 83 c0 01 add $0x1,%eax + 8a: 84 d2 test %dl,%dl + 8c: 75 f2 jne 80 + ; + } + return os; +} + 8e: 8b 5d fc mov -0x4(%ebp),%ebx + 91: 89 c8 mov %ecx,%eax + 93: c9 leave + 94: c3 ret + 95: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 9c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000000a0 : + +int strcmp(const char *p, const char *q) { + a0: 55 push %ebp + a1: 89 e5 mov %esp,%ebp + a3: 53 push %ebx + a4: 8b 55 08 mov 0x8(%ebp),%edx + a7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + aa: 0f b6 02 movzbl (%edx),%eax + ad: 84 c0 test %al,%al + af: 75 17 jne c8 + b1: eb 3a jmp ed + b3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + b7: 90 nop + b8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + bc: 83 c2 01 add $0x1,%edx + bf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + c2: 84 c0 test %al,%al + c4: 74 1a je e0 + p++, q++; + c6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + c8: 0f b6 19 movzbl (%ecx),%ebx + cb: 38 c3 cmp %al,%bl + cd: 74 e9 je b8 + } + return (uchar) * p - (uchar) * q; + cf: 29 d8 sub %ebx,%eax +} + d1: 8b 5d fc mov -0x4(%ebp),%ebx + d4: c9 leave + d5: c3 ret + d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + dd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + e0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + e4: 31 c0 xor %eax,%eax + e6: 29 d8 sub %ebx,%eax +} + e8: 8b 5d fc mov -0x4(%ebp),%ebx + eb: c9 leave + ec: c3 ret + return (uchar) * p - (uchar) * q; + ed: 0f b6 19 movzbl (%ecx),%ebx + f0: 31 c0 xor %eax,%eax + f2: eb db jmp cf + f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ff: 90 nop + +00000100 : + +uint strlen(const char *s) { + 100: 55 push %ebp + 101: 89 e5 mov %esp,%ebp + 103: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 106: 80 3a 00 cmpb $0x0,(%edx) + 109: 74 15 je 120 + 10b: 31 c0 xor %eax,%eax + 10d: 8d 76 00 lea 0x0(%esi),%esi + 110: 83 c0 01 add $0x1,%eax + 113: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 117: 89 c1 mov %eax,%ecx + 119: 75 f5 jne 110 + ; + } + return n; +} + 11b: 89 c8 mov %ecx,%eax + 11d: 5d pop %ebp + 11e: c3 ret + 11f: 90 nop + for (n = 0; s[n]; n++) { + 120: 31 c9 xor %ecx,%ecx +} + 122: 5d pop %ebp + 123: 89 c8 mov %ecx,%eax + 125: c3 ret + 126: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 12d: 8d 76 00 lea 0x0(%esi),%esi + +00000130 : + +void* memset(void *dst, int c, uint n) { + 130: 55 push %ebp + 131: 89 e5 mov %esp,%ebp + 133: 57 push %edi + 134: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 137: 8b 4d 10 mov 0x10(%ebp),%ecx + 13a: 8b 45 0c mov 0xc(%ebp),%eax + 13d: 89 d7 mov %edx,%edi + 13f: fc cld + 140: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 142: 8b 7d fc mov -0x4(%ebp),%edi + 145: 89 d0 mov %edx,%eax + 147: c9 leave + 148: c3 ret + 149: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000150 : + +char* strchr(const char *s, char c) { + 150: 55 push %ebp + 151: 89 e5 mov %esp,%ebp + 153: 8b 45 08 mov 0x8(%ebp),%eax + 156: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 15a: 0f b6 10 movzbl (%eax),%edx + 15d: 84 d2 test %dl,%dl + 15f: 75 12 jne 173 + 161: eb 1d jmp 180 + 163: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 167: 90 nop + 168: 0f b6 50 01 movzbl 0x1(%eax),%edx + 16c: 83 c0 01 add $0x1,%eax + 16f: 84 d2 test %dl,%dl + 171: 74 0d je 180 + if (*s == c) { + 173: 38 d1 cmp %dl,%cl + 175: 75 f1 jne 168 + return (char*)s; + } + } + return 0; +} + 177: 5d pop %ebp + 178: c3 ret + 179: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 180: 31 c0 xor %eax,%eax +} + 182: 5d pop %ebp + 183: c3 ret + 184: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 18b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 18f: 90 nop + +00000190 : + +char* gets(char *buf, int max) { + 190: 55 push %ebp + 191: 89 e5 mov %esp,%ebp + 193: 57 push %edi + 194: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 195: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 198: 53 push %ebx + for (i = 0; i + 1 < max;) { + 199: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 19b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 19e: eb 27 jmp 1c7 + cc = read(0, &c, 1); + 1a0: 83 ec 04 sub $0x4,%esp + 1a3: 6a 01 push $0x1 + 1a5: 57 push %edi + 1a6: 6a 00 push $0x0 + 1a8: e8 2e 01 00 00 call 2db + if (cc < 1) { + 1ad: 83 c4 10 add $0x10,%esp + 1b0: 85 c0 test %eax,%eax + 1b2: 7e 1d jle 1d1 + break; + } + buf[i++] = c; + 1b4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1b8: 8b 55 08 mov 0x8(%ebp),%edx + 1bb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1bf: 3c 0a cmp $0xa,%al + 1c1: 74 1d je 1e0 + 1c3: 3c 0d cmp $0xd,%al + 1c5: 74 19 je 1e0 + for (i = 0; i + 1 < max;) { + 1c7: 89 de mov %ebx,%esi + 1c9: 83 c3 01 add $0x1,%ebx + 1cc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1cf: 7c cf jl 1a0 + break; + } + } + buf[i] = '\0'; + 1d1: 8b 45 08 mov 0x8(%ebp),%eax + 1d4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1d8: 8d 65 f4 lea -0xc(%ebp),%esp + 1db: 5b pop %ebx + 1dc: 5e pop %esi + 1dd: 5f pop %edi + 1de: 5d pop %ebp + 1df: c3 ret + buf[i] = '\0'; + 1e0: 8b 45 08 mov 0x8(%ebp),%eax + 1e3: 89 de mov %ebx,%esi + 1e5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1e9: 8d 65 f4 lea -0xc(%ebp),%esp + 1ec: 5b pop %ebx + 1ed: 5e pop %esi + 1ee: 5f pop %edi + 1ef: 5d pop %ebp + 1f0: c3 ret + 1f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ff: 90 nop + +00000200 : + +int stat(const char *n, struct stat *st) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 56 push %esi + 204: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 205: 83 ec 08 sub $0x8,%esp + 208: 6a 00 push $0x0 + 20a: ff 75 08 push 0x8(%ebp) + 20d: e8 19 01 00 00 call 32b + if (fd < 0) { + 212: 83 c4 10 add $0x10,%esp + 215: 85 c0 test %eax,%eax + 217: 78 27 js 240 + return -1; + } + r = fstat(fd, st); + 219: 83 ec 08 sub $0x8,%esp + 21c: ff 75 0c push 0xc(%ebp) + 21f: 89 c3 mov %eax,%ebx + 221: 50 push %eax + 222: e8 cc 00 00 00 call 2f3 + close(fd); + 227: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 22a: 89 c6 mov %eax,%esi + close(fd); + 22c: e8 2a 01 00 00 call 35b + return r; + 231: 83 c4 10 add $0x10,%esp +} + 234: 8d 65 f8 lea -0x8(%ebp),%esp + 237: 89 f0 mov %esi,%eax + 239: 5b pop %ebx + 23a: 5e pop %esi + 23b: 5d pop %ebp + 23c: c3 ret + 23d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 240: be ff ff ff ff mov $0xffffffff,%esi + 245: eb ed jmp 234 + 247: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 24e: 66 90 xchg %ax,%ax + +00000250 : + +int atoi(const char *s) { + 250: 55 push %ebp + 251: 89 e5 mov %esp,%ebp + 253: 53 push %ebx + 254: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 257: 0f be 02 movsbl (%edx),%eax + 25a: 8d 48 d0 lea -0x30(%eax),%ecx + 25d: 80 f9 09 cmp $0x9,%cl + n = 0; + 260: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 265: 77 1e ja 285 + 267: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 270: 83 c2 01 add $0x1,%edx + 273: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 276: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 27a: 0f be 02 movsbl (%edx),%eax + 27d: 8d 58 d0 lea -0x30(%eax),%ebx + 280: 80 fb 09 cmp $0x9,%bl + 283: 76 eb jbe 270 + } + return n; +} + 285: 8b 5d fc mov -0x4(%ebp),%ebx + 288: 89 c8 mov %ecx,%eax + 28a: c9 leave + 28b: c3 ret + 28c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000290 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 290: 55 push %ebp + 291: 89 e5 mov %esp,%ebp + 293: 57 push %edi + 294: 8b 45 10 mov 0x10(%ebp),%eax + 297: 8b 55 08 mov 0x8(%ebp),%edx + 29a: 56 push %esi + 29b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 29e: 85 c0 test %eax,%eax + 2a0: 7e 13 jle 2b5 + 2a2: 01 d0 add %edx,%eax + dst = vdst; + 2a4: 89 d7 mov %edx,%edi + 2a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2ad: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2b0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2b1: 39 f8 cmp %edi,%eax + 2b3: 75 fb jne 2b0 + } + return vdst; +} + 2b5: 5e pop %esi + 2b6: 89 d0 mov %edx,%eax + 2b8: 5f pop %edi + 2b9: 5d pop %ebp + 2ba: c3 ret + +000002bb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2bb: b8 01 00 00 00 mov $0x1,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(exit) + 2c3: b8 02 00 00 00 mov $0x2,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(wait) + 2cb: b8 03 00 00 00 mov $0x3,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(pipe) + 2d3: b8 04 00 00 00 mov $0x4,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(read) + 2db: b8 05 00 00 00 mov $0x5,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(kill) + 2e3: b8 06 00 00 00 mov $0x6,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(exec) + 2eb: b8 07 00 00 00 mov $0x7,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(fstat) + 2f3: b8 08 00 00 00 mov $0x8,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(chdir) + 2fb: b8 09 00 00 00 mov $0x9,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(dup) + 303: b8 0a 00 00 00 mov $0xa,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(getpid) + 30b: b8 0b 00 00 00 mov $0xb,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(sbrk) + 313: b8 0c 00 00 00 mov $0xc,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(sleep) + 31b: b8 0d 00 00 00 mov $0xd,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(uptime) + 323: b8 0e 00 00 00 mov $0xe,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(open) + 32b: b8 0f 00 00 00 mov $0xf,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(write) + 333: b8 10 00 00 00 mov $0x10,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(mknod) + 33b: b8 11 00 00 00 mov $0x11,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(unlink) + 343: b8 12 00 00 00 mov $0x12,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(link) + 34b: b8 13 00 00 00 mov $0x13,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(mkdir) + 353: b8 14 00 00 00 mov $0x14,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(close) + 35b: b8 15 00 00 00 mov $0x15,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(getch) + 363: b8 16 00 00 00 mov $0x16,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(greeting) + 36b: b8 17 00 00 00 mov $0x17,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(shutdown) + 373: b8 18 00 00 00 mov $0x18,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(screen) + 37b: b8 19 00 00 00 mov $0x19,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(cls) + 383: b8 1a 00 00 00 mov $0x1a,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + 38b: 66 90 xchg %ax,%ax + 38d: 66 90 xchg %ax,%ax + 38f: 90 nop + +00000390 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 390: 55 push %ebp + 391: 89 e5 mov %esp,%ebp + 393: 57 push %edi + 394: 56 push %esi + 395: 53 push %ebx + 396: 83 ec 3c sub $0x3c,%esp + 399: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 39c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 39e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 3a1: 85 d2 test %edx,%edx + 3a3: 0f 89 7f 00 00 00 jns 428 + 3a9: f6 45 08 01 testb $0x1,0x8(%ebp) + 3ad: 74 79 je 428 + neg = 1; + 3af: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3b6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3b8: 31 db xor %ebx,%ebx + 3ba: 8d 75 d7 lea -0x29(%ebp),%esi + 3bd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3c0: 89 c8 mov %ecx,%eax + 3c2: 31 d2 xor %edx,%edx + 3c4: 89 cf mov %ecx,%edi + 3c6: f7 75 c4 divl -0x3c(%ebp) + 3c9: 0f b6 92 34 08 00 00 movzbl 0x834(%edx),%edx + 3d0: 89 45 c0 mov %eax,-0x40(%ebp) + 3d3: 89 d8 mov %ebx,%eax + 3d5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3d8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3db: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3de: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3e1: 76 dd jbe 3c0 + if (neg) { + 3e3: 8b 4d bc mov -0x44(%ebp),%ecx + 3e6: 85 c9 test %ecx,%ecx + 3e8: 74 0c je 3f6 + buf[i++] = '-'; + 3ea: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3ef: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3f1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3f6: 8b 7d b8 mov -0x48(%ebp),%edi + 3f9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3fd: eb 07 jmp 406 + 3ff: 90 nop + putc(fd, buf[i]); + 400: 0f b6 13 movzbl (%ebx),%edx + 403: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 406: 83 ec 04 sub $0x4,%esp + 409: 88 55 d7 mov %dl,-0x29(%ebp) + 40c: 6a 01 push $0x1 + 40e: 56 push %esi + 40f: 57 push %edi + 410: e8 1e ff ff ff call 333 + while (--i >= 0) { + 415: 83 c4 10 add $0x10,%esp + 418: 39 de cmp %ebx,%esi + 41a: 75 e4 jne 400 + } +} + 41c: 8d 65 f4 lea -0xc(%ebp),%esp + 41f: 5b pop %ebx + 420: 5e pop %esi + 421: 5f pop %edi + 422: 5d pop %ebp + 423: c3 ret + 424: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 428: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 42f: eb 87 jmp 3b8 + 431: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 438: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 43f: 90 nop + +00000440 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 440: 55 push %ebp + 441: 89 e5 mov %esp,%ebp + 443: 57 push %edi + 444: 56 push %esi + 445: 53 push %ebx + 446: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 449: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 44c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 44f: 0f b6 13 movzbl (%ebx),%edx + 452: 84 d2 test %dl,%dl + 454: 74 6a je 4c0 + ap = (uint*)(void*)&fmt + 1; + 456: 8d 45 10 lea 0x10(%ebp),%eax + 459: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 45c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 45f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 461: 89 45 d0 mov %eax,-0x30(%ebp) + 464: eb 36 jmp 49c + 466: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 46d: 8d 76 00 lea 0x0(%esi),%esi + 470: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 473: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 478: 83 f8 25 cmp $0x25,%eax + 47b: 74 15 je 492 + write(fd, &c, 1); + 47d: 83 ec 04 sub $0x4,%esp + 480: 88 55 e7 mov %dl,-0x19(%ebp) + 483: 6a 01 push $0x1 + 485: 57 push %edi + 486: 56 push %esi + 487: e8 a7 fe ff ff call 333 + 48c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 48f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 492: 0f b6 13 movzbl (%ebx),%edx + 495: 83 c3 01 add $0x1,%ebx + 498: 84 d2 test %dl,%dl + 49a: 74 24 je 4c0 + c = fmt[i] & 0xff; + 49c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 49f: 85 c9 test %ecx,%ecx + 4a1: 74 cd je 470 + } + } + else if (state == '%') { + 4a3: 83 f9 25 cmp $0x25,%ecx + 4a6: 75 ea jne 492 + if (c == 'd') { + 4a8: 83 f8 25 cmp $0x25,%eax + 4ab: 0f 84 07 01 00 00 je 5b8 + 4b1: 83 e8 63 sub $0x63,%eax + 4b4: 83 f8 15 cmp $0x15,%eax + 4b7: 77 17 ja 4d0 + 4b9: ff 24 85 dc 07 00 00 jmp *0x7dc(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4c0: 8d 65 f4 lea -0xc(%ebp),%esp + 4c3: 5b pop %ebx + 4c4: 5e pop %esi + 4c5: 5f pop %edi + 4c6: 5d pop %ebp + 4c7: c3 ret + 4c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4cf: 90 nop + write(fd, &c, 1); + 4d0: 83 ec 04 sub $0x4,%esp + 4d3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4d6: 6a 01 push $0x1 + 4d8: 57 push %edi + 4d9: 56 push %esi + 4da: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4de: e8 50 fe ff ff call 333 + putc(fd, c); + 4e3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4e7: 83 c4 0c add $0xc,%esp + 4ea: 88 55 e7 mov %dl,-0x19(%ebp) + 4ed: 6a 01 push $0x1 + 4ef: 57 push %edi + 4f0: 56 push %esi + 4f1: e8 3d fe ff ff call 333 + putc(fd, c); + 4f6: 83 c4 10 add $0x10,%esp + state = 0; + 4f9: 31 c9 xor %ecx,%ecx + 4fb: eb 95 jmp 492 + 4fd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 500: 83 ec 0c sub $0xc,%esp + 503: b9 10 00 00 00 mov $0x10,%ecx + 508: 6a 00 push $0x0 + 50a: 8b 45 d0 mov -0x30(%ebp),%eax + 50d: 8b 10 mov (%eax),%edx + 50f: 89 f0 mov %esi,%eax + 511: e8 7a fe ff ff call 390 + ap++; + 516: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 51a: 83 c4 10 add $0x10,%esp + state = 0; + 51d: 31 c9 xor %ecx,%ecx + 51f: e9 6e ff ff ff jmp 492 + 524: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 528: 8b 45 d0 mov -0x30(%ebp),%eax + 52b: 8b 10 mov (%eax),%edx + ap++; + 52d: 83 c0 04 add $0x4,%eax + 530: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 533: 85 d2 test %edx,%edx + 535: 0f 84 8d 00 00 00 je 5c8 + while (*s != 0) { + 53b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 53e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 540: 84 c0 test %al,%al + 542: 0f 84 4a ff ff ff je 492 + 548: 89 5d d4 mov %ebx,-0x2c(%ebp) + 54b: 89 d3 mov %edx,%ebx + 54d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 550: 83 ec 04 sub $0x4,%esp + s++; + 553: 83 c3 01 add $0x1,%ebx + 556: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 559: 6a 01 push $0x1 + 55b: 57 push %edi + 55c: 56 push %esi + 55d: e8 d1 fd ff ff call 333 + while (*s != 0) { + 562: 0f b6 03 movzbl (%ebx),%eax + 565: 83 c4 10 add $0x10,%esp + 568: 84 c0 test %al,%al + 56a: 75 e4 jne 550 + state = 0; + 56c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 56f: 31 c9 xor %ecx,%ecx + 571: e9 1c ff ff ff jmp 492 + 576: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 57d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 580: 83 ec 0c sub $0xc,%esp + 583: b9 0a 00 00 00 mov $0xa,%ecx + 588: 6a 01 push $0x1 + 58a: e9 7b ff ff ff jmp 50a + 58f: 90 nop + putc(fd, *ap); + 590: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 593: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 596: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 598: 6a 01 push $0x1 + 59a: 57 push %edi + 59b: 56 push %esi + putc(fd, *ap); + 59c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 59f: e8 8f fd ff ff call 333 + ap++; + 5a4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5a8: 83 c4 10 add $0x10,%esp + state = 0; + 5ab: 31 c9 xor %ecx,%ecx + 5ad: e9 e0 fe ff ff jmp 492 + 5b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5b8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5bb: 83 ec 04 sub $0x4,%esp + 5be: e9 2a ff ff ff jmp 4ed + 5c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5c7: 90 nop + s = "(null)"; + 5c8: ba d2 07 00 00 mov $0x7d2,%edx + while (*s != 0) { + 5cd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5d0: b8 28 00 00 00 mov $0x28,%eax + 5d5: 89 d3 mov %edx,%ebx + 5d7: e9 74 ff ff ff jmp 550 + 5dc: 66 90 xchg %ax,%ax + 5de: 66 90 xchg %ax,%ax + +000005e0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5e0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5e1: a1 e8 0a 00 00 mov 0xae8,%eax +void free(void *ap) { + 5e6: 89 e5 mov %esp,%ebp + 5e8: 57 push %edi + 5e9: 56 push %esi + 5ea: 53 push %ebx + 5eb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5ee: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5f8: 89 c2 mov %eax,%edx + 5fa: 8b 00 mov (%eax),%eax + 5fc: 39 ca cmp %ecx,%edx + 5fe: 73 30 jae 630 + 600: 39 c1 cmp %eax,%ecx + 602: 72 04 jb 608 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 604: 39 c2 cmp %eax,%edx + 606: 72 f0 jb 5f8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 608: 8b 73 fc mov -0x4(%ebx),%esi + 60b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 60e: 39 f8 cmp %edi,%eax + 610: 74 30 je 642 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 612: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 615: 8b 42 04 mov 0x4(%edx),%eax + 618: 8d 34 c2 lea (%edx,%eax,8),%esi + 61b: 39 f1 cmp %esi,%ecx + 61d: 74 3a je 659 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 61f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 621: 5b pop %ebx + freep = p; + 622: 89 15 e8 0a 00 00 mov %edx,0xae8 +} + 628: 5e pop %esi + 629: 5f pop %edi + 62a: 5d pop %ebp + 62b: c3 ret + 62c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 630: 39 c2 cmp %eax,%edx + 632: 72 c4 jb 5f8 + 634: 39 c1 cmp %eax,%ecx + 636: 73 c0 jae 5f8 + if (bp + bp->s.size == p->s.ptr) { + 638: 8b 73 fc mov -0x4(%ebx),%esi + 63b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 63e: 39 f8 cmp %edi,%eax + 640: 75 d0 jne 612 + bp->s.size += p->s.ptr->s.size; + 642: 03 70 04 add 0x4(%eax),%esi + 645: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 648: 8b 02 mov (%edx),%eax + 64a: 8b 00 mov (%eax),%eax + 64c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 64f: 8b 42 04 mov 0x4(%edx),%eax + 652: 8d 34 c2 lea (%edx,%eax,8),%esi + 655: 39 f1 cmp %esi,%ecx + 657: 75 c6 jne 61f + p->s.size += bp->s.size; + 659: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 65c: 89 15 e8 0a 00 00 mov %edx,0xae8 + p->s.size += bp->s.size; + 662: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 665: 8b 4b f8 mov -0x8(%ebx),%ecx + 668: 89 0a mov %ecx,(%edx) +} + 66a: 5b pop %ebx + 66b: 5e pop %esi + 66c: 5f pop %edi + 66d: 5d pop %ebp + 66e: c3 ret + 66f: 90 nop + +00000670 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 670: 55 push %ebp + 671: 89 e5 mov %esp,%ebp + 673: 57 push %edi + 674: 56 push %esi + 675: 53 push %ebx + 676: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 679: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 67c: 8b 3d e8 0a 00 00 mov 0xae8,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 682: 8d 70 07 lea 0x7(%eax),%esi + 685: c1 ee 03 shr $0x3,%esi + 688: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 68b: 85 ff test %edi,%edi + 68d: 0f 84 9d 00 00 00 je 730 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 693: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 695: 8b 4a 04 mov 0x4(%edx),%ecx + 698: 39 f1 cmp %esi,%ecx + 69a: 73 6a jae 706 + 69c: bb 00 10 00 00 mov $0x1000,%ebx + 6a1: 39 de cmp %ebx,%esi + 6a3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 6a6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 6ad: 89 45 e4 mov %eax,-0x1c(%ebp) + 6b0: eb 17 jmp 6c9 + 6b2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6b8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6ba: 8b 48 04 mov 0x4(%eax),%ecx + 6bd: 39 f1 cmp %esi,%ecx + 6bf: 73 4f jae 710 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6c1: 8b 3d e8 0a 00 00 mov 0xae8,%edi + 6c7: 89 c2 mov %eax,%edx + 6c9: 39 d7 cmp %edx,%edi + 6cb: 75 eb jne 6b8 + p = sbrk(nu * sizeof(Header)); + 6cd: 83 ec 0c sub $0xc,%esp + 6d0: ff 75 e4 push -0x1c(%ebp) + 6d3: e8 3b fc ff ff call 313 + if (p == (char*)-1) { + 6d8: 83 c4 10 add $0x10,%esp + 6db: 83 f8 ff cmp $0xffffffff,%eax + 6de: 74 1c je 6fc + hp->s.size = nu; + 6e0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6e3: 83 ec 0c sub $0xc,%esp + 6e6: 83 c0 08 add $0x8,%eax + 6e9: 50 push %eax + 6ea: e8 f1 fe ff ff call 5e0 + return freep; + 6ef: 8b 15 e8 0a 00 00 mov 0xae8,%edx + if ((p = morecore(nunits)) == 0) { + 6f5: 83 c4 10 add $0x10,%esp + 6f8: 85 d2 test %edx,%edx + 6fa: 75 bc jne 6b8 + return 0; + } + } + } +} + 6fc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6ff: 31 c0 xor %eax,%eax +} + 701: 5b pop %ebx + 702: 5e pop %esi + 703: 5f pop %edi + 704: 5d pop %ebp + 705: c3 ret + if (p->s.size >= nunits) { + 706: 89 d0 mov %edx,%eax + 708: 89 fa mov %edi,%edx + 70a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 710: 39 ce cmp %ecx,%esi + 712: 74 4c je 760 + p->s.size -= nunits; + 714: 29 f1 sub %esi,%ecx + 716: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 719: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 71c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 71f: 89 15 e8 0a 00 00 mov %edx,0xae8 +} + 725: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 728: 83 c0 08 add $0x8,%eax +} + 72b: 5b pop %ebx + 72c: 5e pop %esi + 72d: 5f pop %edi + 72e: 5d pop %ebp + 72f: c3 ret + base.s.ptr = freep = prevp = &base; + 730: c7 05 e8 0a 00 00 ec movl $0xaec,0xae8 + 737: 0a 00 00 + base.s.size = 0; + 73a: bf ec 0a 00 00 mov $0xaec,%edi + base.s.ptr = freep = prevp = &base; + 73f: c7 05 ec 0a 00 00 ec movl $0xaec,0xaec + 746: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 749: 89 fa mov %edi,%edx + base.s.size = 0; + 74b: c7 05 f0 0a 00 00 00 movl $0x0,0xaf0 + 752: 00 00 00 + if (p->s.size >= nunits) { + 755: e9 42 ff ff ff jmp 69c + 75a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 760: 8b 08 mov (%eax),%ecx + 762: 89 0a mov %ecx,(%edx) + 764: eb b9 jmp 71f diff --git a/hello.d b/hello.d new file mode 100644 index 0000000..8d6eb56 --- /dev/null +++ b/hello.d @@ -0,0 +1 @@ +hello.o: hello.c /usr/include/stdc-predef.h types.h user.h diff --git a/hello.o b/hello.o new file mode 100644 index 0000000000000000000000000000000000000000..ecfd49ae2cebe8b89f3953433655f4ccebe9c539 GIT binary patch literal 3664 zcma)8TWlOx89rxrW_?*-)^Vuoy2z8LZj&fG$vP%&bDwlT%sKz;3tv3{sFYF|k)kB-XhM8E()TPWI3Vs7bE4J?+db&Z-7s~1H{DFL zu;T`PyX|HzKXa2X%ab^T61qX2Bw?Jny`&q2DZ=A*H|WM`w;j4sywOcMein7(!)~62 z>n?P6J#6I7W)wHQQH=4*`TOjx_dni#_LJ2g{Q0Y2x%A}LN5e1IU*5F0{w=Sce3MiC z%jhdt#MW=+!+*>U!Q0|Yx0h~w@X7Y}_SWyJ-}_Der;8Vr^;=RIcQuER#1YbFKj#FR z&yo$}xtm0bWe<^A*3f=}9OkB#XUXTBbATb+iQ-HQ@1?1%Oe3?1u@06Km`aQ(k&O!b zI%8ycFWi;qz{kdEIG{Sc4yxi*BgQ8YBpu~~M+A7}YYQ+=e2&zaU}Ec4G3lznd+6E& z(-@vAn>{d0MM4g#NDr1nc;q8!wn&~r^9;#lG#Bs)`3*EDNjRD^*@uwD=3Iq*OngVa zFpWX)6P3#6E2Rlc*bytR*ps5N&n9!GS^`OQJN~pE#oXPPIXfP{)Sb0x7exg>AiR+xCL> zESdluS8Cu}uOnQe#jAYMV7U~!V;=9^?1c(d#&xvsY zUJ|b_$h^EC+>-OwWN8^poM*##Eu8(rQ6t~wID4H@>C8xHf4TbjZD-~gXX0tc6_#z4 zUw3ARr<{>5IpbyNjNJxYd9VDmFD@F$K6`9 zx!!PVPatR`?$#Q4)JFQgf^nlDtNHE7PcdZQ*zH7FZ6onJVXfE2?83wZ`@y$sC`MTr zWGFT&T`vkj{B$!8T1hwV=4maDpNr!4TIM&}sByK8G-JP@?WZl%8&yjT78bPpM0ETp z7K-%}jJYAO)GGqTvfcFpaikNjNB)s?W9`yrdNJuXkN9bdlGs6cT>KQT$zc%1GVxH- z&YeAb!acCs$m1;6ds(aJO08dCT=b4E9n@yNcUC5fy!K@wpC6WUW48SgPRn7~cp53{ z1TK$Bu~K!cTr5wP@?N<*WaZCS%T|81TC(!2A9<(cp)+EOzik^%EEP_7Usq>&5K`)2 znu5;4dq+wrmqjUwN>N4r$zA%?E*;mmASLXA{-mk3?!ow|UjwOveP*Dc1b~~pp_%$V z5-rpRuUH)beGl{z*m)g7Lu=Nox37YU-+Sr z*b-KFiLJOx<2^(K@#7@1z=K4@9o6`t##0)f(D*ft*EGJU@rK4<5N#oDYW;1E?-Egp z-qZL8BF6u#)^BV4I}!a=RRWH%IsvCO-fMInr^*@pETs}hh5O5RwQeB32TE7##QJ%5 zxes-X$2FcIBHjgBK;fmE9b9K%mh`b@SQcK*gtzWzzVI4pD!imig^_iyzEfR-8n!)l zf!|NEyw|s=zb$M0OM_JW3$x}o8cBGi=xuj{c9dou0XcM3;>XQ!hbf7h{}tAb;?N|< zybPszP3b|m!%8B&7`4qqeXXgQ)gLNst*K&&efU3xUmv`h!R=hy)sH^PK0M_7#8LiN z+yn6O41ZdjdY_0}#6w{|^;uO~e=Ls2`$IHwJl738M)=CoE zB{2DZ56(WUhm_NB@Sm~~QaxQlKyKti#1+N( z{skjBUcZu$5cino1g?Yf4?M;7-okqEQ|rY)*1>vmV1W0(uB=S@e@<2oym1h--h#)2^2$N)z41}3+9z3iH7!d(M zP^z@oB~aT+>x0&+Al_C`6kpd?z4hAay~U+gy|VEAsJ7*P-#-5dfv&q&&syhv|9k)Y z-+Q04=bTwJZRU5i*2+J$vegMrsoi5d%~%5?RfQ_|O%2Xl|8CP|bGwh`uRTz7c)Wj~x5bcC!8Uh2g#a z`D2@+pI>>^!Ua!ldKA3cSL;b1TMgWlp1=QNc>e9Pgl~n6J9D9W|8K{SA14FaV8ithLI?8Sv%ghR#q+0QM~yRY|sjJPJpwU>Z$k9^#{A(I#L~&M{rjOz`7o26i6}8hA-&W_QRhtjTxZ44uCnU zH#5X%fTtX>wrDyNNo75K}562UkFg4LOUkXWQ zEZz~$B*JaRoTl&yx5d&+!gaP@r?R$p;E5W%vOchSxOB)tyd<;AmCBfjf*ZH zhifGlT#1wO3}#r_UqM^t7gA#7Xc(7W0B2)?-6$FdS;=v+~EL*k+l(lk?vh4;ei<^i zOS-s?%u>TRRytj)+<5-EbkYs*cN2yQ=|L!qo6MtsKFsQrd$rLNYp!fJWtcv?l4faR zRtB?rOlO5jXQ&m8tWfSs!;G|| ztzfP(%xEjx2Il*QskNdlV6HXHSSy-FwChZ?@z8*|-Y|{O#FV?rm`y|gFsltS6&mHP zF{xds`!LTN3^T*RAiLd$o~fItxY01P&^6_*HS}yfKb_Y?#Ze zb|}^xx>;wb*kG6|tPUtP8hXAygNj=WbCuQAmQn5|!z|JZSlG>mX|W)`)sSuaSM=Co zn0DoGv`=@2a;E+=U%(>Ks$4d>EijA?TIp+4V7ReX zdMi^LkzdDUs=r}YBh8u(YTnQSqsqR4N4}MewW+`vCi!B$lbSP4@?}=0T?Iz>-yBe? zT(cj6YEz;?`aN3Jn28$Jza=xq_z%_FXja?jcKD36T9+eoUFkz$I?YWZP#@Y0rb{oT zSwp`U!Cb5FWq`4vm%*%74tq8%N_}BIt2_J}bR)-MUjtPEcBXJT%B^ri#K;wHgr!wj z0NO76U(inBOR#s96M@M24$Mn*U^pCdd9#~orP&=b5?0o$lNkwXnPE5*No6fJOi*VL z%JP;SMgr@}@|In(S!tHH?8?jt*xQv zR$+N-Yd9C3<*lue=H_5|YwHXyA@+E9xhuAGnLEPy3Hhfp;^w>?S`45oXMzb!9A!X zPcsjTl(QRjzgtn|emSiD17Hg{0EbW5^m`l?bto_zJ~WJXsdA=3Q!pHkU;4samD_>7 zP0X>zA)t8#<;Ww*>RN(1(KpR@%*@KkF;jcInaw%gx@^SL&OI9@Bk=rH^R1u`9%P`` zAPQP$!YZpRx=aPVsE+Q&1PVH)_d&ggjN6atY`T?XG%qd~8+4?y$LBm|C zAE!^QVVd>z^afeZvRc0l)XbHROcOcj>B#7m}2StFCau{LMPVl)qO1Nq!P|u5U*nu;WpmNJgE}@vu zZB_I`TsB3>GmI))flRhvP2NN-x)IWCYfkV-VKnCs@{DgTs_0G_-FcsHLbu)jgzS8pzvUC$4pE{UHd$T{ z%il6AhpKr9rPdel?x$YCsqfl_;-c6WRI%rWA$kO7=>ycwGBdvPY0?*abPeg*9$k+r z=}Qc4ictj}f9o~5Pom8e#VA7K1vpJH_$$lic$#7iq8MjiN=z|EfE$JrM@|j8Hvxpj z3qq=9_X~hM74k8#sm5uK2QwbTI64`ZsdV8b59j6XNPuyf0*gt$%S;e6dR(~5EM8cn zE8Hu67w%Q&`7R4VETBs<6KkSNDK1yK8+>y`R;Fgmo>0h z<-2SEaWh>^3ybN(*|oqu>YM)n+S`3|?u&j#bJM~NAT%#*p*431N@}|OYgll1V=DCo zh~MmXjEOYt|DHakIBBXC)iyP4*LP>Oe<@l zI}#$BOKm0$X5chSt_j3EoMx6`H?6FCSesea4sjdKzLc0*mIlYCAP!UNawg2(`UJO$ z(K*AegZ}$CP2JXm;EyO(%oTkW6S@#wW5F#n=eoWF+HE-dQf?Z#2iz|D$h2fmQ*psq zswwUhemf7qgtsfx&SM~W%Tn$axbWubvg5p~sxgyr(ZkK1U2`mg{fwZz3s9Rf&F2sRqJmhvI3__bCsfnw!ULr^#H7WkC#?&JBCgw1ak-kPkE z(Oem7;ET9~*nQ6=H26f=&?r6L2SIo8{7EQ@*=%2a1MVRTy^z#_#@5m4UY ztag6vT3eNKpL>j`w8gsvmck#MBTm3<_;!GL*Kv}ss~y0jj*}wwn0we2J6_L79+HoX%HPZ!IcN}{EWX8$egG#lP7p)%P|%hhVikoZgHn8St698U%FBFSI(S*i zONN)#yl^M3++p64jtVEda@fRdroAJ z8X2Ni_%hetyQ+o)*fg7j_O5CS)8~2dd8AjI7ew~3A7^;L_GGU8$f_BLGaP)gJG$M3 zdPG9KhytL$=;Q*E?t?ucU2VUr^bB_Yn!Anep%Xd?Uy=sBP9uK*0Ltklx_?z8I)@0z zz(nYn@pRx>w=96VAHe|FF;hkeid;7qcsE$-=GzHRmM7I;(1-}Eef!C^uROW-0o0?= zD|M5pzNz#m?UtHB4A@QD&NMTdLCSKhfPEHJq_klh(Zm?^uCIN8Y2J&TPpg8!_s}Qe z4%h8(Dlp4$0bQ%tNZ%eB?1Lfi3$oC4w*_{(`S1v~V^*wi3qiVpwVtR30bG0QDrUl7 zz4rh03NE|cK4wTT&@)WC+x$W87qCAxb$9I_tZIA~u?p>vIEMo@rCxjIx`p2XdwI;n z2sWd!tet3n&PAQdFc<>^2RMU)MHx4Az8l;E>phsYNV^&2?PfakMR9Zn?29j;{|Ma# zI_nNV?$Fp-w~A203mgX+Y<8;xGhlW;nq)?GCQ@}^o!bw5H8Z)~t^R|@)wul{-D<9$ z`N%Bmy3<*e6?daGd*!F3S7x4m8e2-Or(HC8&gB>5qe}uGS?0`}HEYu3nbTBjXS8(* z-+=bl#87Rf|ZmSIxSc5c4gV_i{&S7)_q zd1Og6n}mIeUu`n63>0a66-uNQCZnl^=G%~366@;1XCP0GPNch3S1i6nc^R0L>Khi; zjYEebaTQB2iD*31f>>G81;lS_!>6NqpJ?!ju`1aXU6}FNaXxX5Pt>W-$TGao#=`tGd+x0>9;{SSD&F0ZNzR_{ZWH|9P|K&7C%ttm$$R z^TV$~U9FdbQE*z|n_eo~6~&Cfm}M{^>VjGG!c*$b4%gMyG}P3FtCu#^KEc+Ienl-1u?f>W+@KmT>jOFlvt{s#~(Lu1qZMG3gAfGu4rSuYMqjuJ7q5@o#L(AUgS z`r4o#nD01z57Y=5cT+rG;bl@`aIH1D!2Rwz`zEK`wbq87n)J-1!;_wd!v%TsdvTNa zYl6Pq#2mrNmn=R0)>3+?kq}*ra}nC&YoH#zAAjSC@Z2ixrVX}s$B2F|Q@d?zN9gIN z5O4+?J>}qb%Re0T$#I`1p8U@d^4PKUI&AC{bA)IAEo|KQJ~)hXEKckUd;VQQPx4hj z(moHe=dcytZ1*~B^Wy7-z*czQ+Uu|t-m>&MZ0{RVkHj|F^svakM4fqpHQGAxM{u(K zeURZfK>uK0%*Im$fezU|GjV! zXrW`z3ICGt?+JgDh?h^FP>y#OUy;WTbsIIau(0?wgnGW4B_=4xi!**ZCV!*gOO)f4 z#H+%;CwP={{N67@4Xpu~cR>10738Ny#+xO4Qt(E>4bn75;yPzn6$Sg6tpOf^%kSzCI!r;k}R`Qp8IFW!3@SuBj1X$9YHl^8~*qI9qUm zV2fZzaJAqjL4F=!oP&b@A^1nZcLhsWKiG{DoFT|p>Xf$%CI$KKoANsa`O2F7Zw2`p znmoRN8C;D%lK-LLLxQHRkiR4R-v#?)%xFJG@DjnR1o`!fdVT{Z-Ys~a;A4V=FlN+` z6`UkEOR!ULjo@a%e-qp-_@vREf_S@T={6er0w?xJtC^$>-O2IXPKNoyZ@L9pH1nnFz&LF{a1ZN7i3#J8E3vLqpk>I_8 z4-397_zn?c@PY7O2>*@n0W1va^N8rrFu{p}a|BxiQ-U`L-YIy$;ID|7JI@mFTzgUQ zPlEp=_%;!CM+LtS{D)u;9x2oh6dWp8E!apzzLSJ+CZfIhf>DuQC;S@04I;mln2+bT z$nO%|CGuYg|DfQ0BJz1c^e>706~Q+I|19{v;8DR(iSYkc(80Zke1TwpBKmWh@MjUx zpK}Dy6a5Uq%LH2lQ$)nuK!o3B!8=8M7ZLsasmOmW_@K!53jes^VItzaDEMcQzb$xF z@MFPmh_F8{*atZ?b%ta3~S>qXZj8 zK2dPG;6;K>MA*+K;#?x~gy0InYX#Q|t{1$O2>)=qHJMn&2$KIfCVxC z!IdJvLHL^lw-VuZhv3ge{(#`4g8Kyz5MlqE;HyN`>m9*w1zpG}FA*Fgc#hyS!8wBS z1v>>d3I0&9md}0Mf6aaZh{uA`xJO`XWAdpYVxKZvko#it;{?AWI8kt#;0!^2NTfaY z!^F!4TZ!oJ8{8KF!{GVCe39U4!TSYOO?u^0{JsTdQXY2t6gH$a=1oG4d0|u2g8wts zq!MIkT~|{F7B+3smTbquSiC)~kMdBU!zm_i8y(54#fvYIGTMYcx+e9-gFp{@h}CoOnd`*iD2T z$JRf>LYR34x?XtNbqY;jJf2eo0p{2ZyPsih`iI}{`4IH($7&?J9f`0XoU?vE%zX2m zfwQpDE=ElM@Z&`w@M-F<>Z{Zt%s>C|b=+U~ZnwO~TN`Yba=+ayXx|5OhOJ{ z$KR8^AeF;p?`8_i3u`gIzw8lEc?+1K+#d@o1Oh!G5sZ zem{N!nm!yq9(xBV_0}o%qka$0-geu=_?H=E{y`njCj|X?!z#Ud$*FeFik&aN1a`d- z#^UiNPSXBRT?)GwsgT3(`s?6(_jf1y8-|SiEyL;ew|6XvRk%v20}$dTrMU;vj%$gr fdX+&PIbFUdLC%A5c$DDmZFd0e{>5m#i*NUTX$-56 literal 0 HcmV?d00001 diff --git a/init.asm b/init.asm new file mode 100644 index 0000000..3783efa --- /dev/null +++ b/init.asm @@ -0,0 +1,1238 @@ + +_init: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "user.h" +#include "fcntl.h" + +char *argv[] = { "sh", 0 }; + +int main(void) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 53 push %ebx + e: 51 push %ecx + int pid, wpid; + + if (open("console", O_RDWR) < 0) { + f: 83 ec 08 sub $0x8,%esp + 12: 6a 02 push $0x2 + 14: 68 d8 07 00 00 push $0x7d8 + 19: e8 7d 03 00 00 call 39b + 1e: 83 c4 10 add $0x10,%esp + 21: 85 c0 test %eax,%eax + 23: 0f 88 8d 00 00 00 js b6 + mknod("console", 1, 1); + open("console", O_RDWR); + } + dup(0); // stdout + 29: 83 ec 0c sub $0xc,%esp + 2c: 6a 00 push $0x0 + 2e: e8 40 03 00 00 call 373 + dup(0); // stderr + 33: c7 04 24 00 00 00 00 movl $0x0,(%esp) + 3a: e8 34 03 00 00 call 373 + 3f: 83 c4 10 add $0x10,%esp + 42: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + + for (;;) { + printf(1, "init: starting sh\n"); + 48: 83 ec 08 sub $0x8,%esp + 4b: 68 e0 07 00 00 push $0x7e0 + 50: 6a 01 push $0x1 + 52: e8 59 04 00 00 call 4b0 + pid = fork(); + 57: e8 cf 02 00 00 call 32b + if (pid < 0) { + 5c: 83 c4 10 add $0x10,%esp + pid = fork(); + 5f: 89 c3 mov %eax,%ebx + if (pid < 0) { + 61: 85 c0 test %eax,%eax + 63: 78 1a js 7f + printf(1, "init: fork failed\n"); + exit(); + } + if (pid == 0) { + 65: 74 2b je 92 + 67: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6e: 66 90 xchg %ax,%ax + exec("sh", argv); + printf(1, "init: exec sh failed\n"); + exit(); + } + while ((wpid = wait()) >= 0 && wpid != pid) { + 70: e8 c6 02 00 00 call 33b + 75: 85 c0 test %eax,%eax + 77: 78 cf js 48 + 79: 39 c3 cmp %eax,%ebx + 7b: 75 f3 jne 70 + 7d: eb c9 jmp 48 + printf(1, "init: fork failed\n"); + 7f: 53 push %ebx + 80: 53 push %ebx + 81: 68 f3 07 00 00 push $0x7f3 + 86: 6a 01 push $0x1 + 88: e8 23 04 00 00 call 4b0 + exit(); + 8d: e8 a1 02 00 00 call 333 + exec("sh", argv); + 92: 50 push %eax + 93: 50 push %eax + 94: 68 2c 0b 00 00 push $0xb2c + 99: 68 06 08 00 00 push $0x806 + 9e: e8 b8 02 00 00 call 35b + printf(1, "init: exec sh failed\n"); + a3: 5a pop %edx + a4: 59 pop %ecx + a5: 68 09 08 00 00 push $0x809 + aa: 6a 01 push $0x1 + ac: e8 ff 03 00 00 call 4b0 + exit(); + b1: e8 7d 02 00 00 call 333 + mknod("console", 1, 1); + b6: 50 push %eax + b7: 6a 01 push $0x1 + b9: 6a 01 push $0x1 + bb: 68 d8 07 00 00 push $0x7d8 + c0: e8 e6 02 00 00 call 3ab + open("console", O_RDWR); + c5: 58 pop %eax + c6: 5a pop %edx + c7: 6a 02 push $0x2 + c9: 68 d8 07 00 00 push $0x7d8 + ce: e8 c8 02 00 00 call 39b + d3: 83 c4 10 add $0x10,%esp + d6: e9 4e ff ff ff jmp 29 + db: 66 90 xchg %ax,%ax + dd: 66 90 xchg %ax,%ax + df: 90 nop + +000000e0 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + e0: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + e1: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + e3: 89 e5 mov %esp,%ebp + e5: 53 push %ebx + e6: 8b 4d 08 mov 0x8(%ebp),%ecx + e9: 8b 5d 0c mov 0xc(%ebp),%ebx + ec: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + f0: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + f4: 88 14 01 mov %dl,(%ecx,%eax,1) + f7: 83 c0 01 add $0x1,%eax + fa: 84 d2 test %dl,%dl + fc: 75 f2 jne f0 + ; + } + return os; +} + fe: 8b 5d fc mov -0x4(%ebp),%ebx + 101: 89 c8 mov %ecx,%eax + 103: c9 leave + 104: c3 ret + 105: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 10c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000110 : + +int strcmp(const char *p, const char *q) { + 110: 55 push %ebp + 111: 89 e5 mov %esp,%ebp + 113: 53 push %ebx + 114: 8b 55 08 mov 0x8(%ebp),%edx + 117: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 11a: 0f b6 02 movzbl (%edx),%eax + 11d: 84 c0 test %al,%al + 11f: 75 17 jne 138 + 121: eb 3a jmp 15d + 123: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 127: 90 nop + 128: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 12c: 83 c2 01 add $0x1,%edx + 12f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 132: 84 c0 test %al,%al + 134: 74 1a je 150 + p++, q++; + 136: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 138: 0f b6 19 movzbl (%ecx),%ebx + 13b: 38 c3 cmp %al,%bl + 13d: 74 e9 je 128 + } + return (uchar) * p - (uchar) * q; + 13f: 29 d8 sub %ebx,%eax +} + 141: 8b 5d fc mov -0x4(%ebp),%ebx + 144: c9 leave + 145: c3 ret + 146: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 14d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 150: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 154: 31 c0 xor %eax,%eax + 156: 29 d8 sub %ebx,%eax +} + 158: 8b 5d fc mov -0x4(%ebp),%ebx + 15b: c9 leave + 15c: c3 ret + return (uchar) * p - (uchar) * q; + 15d: 0f b6 19 movzbl (%ecx),%ebx + 160: 31 c0 xor %eax,%eax + 162: eb db jmp 13f + 164: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 16b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 16f: 90 nop + +00000170 : + +uint strlen(const char *s) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 176: 80 3a 00 cmpb $0x0,(%edx) + 179: 74 15 je 190 + 17b: 31 c0 xor %eax,%eax + 17d: 8d 76 00 lea 0x0(%esi),%esi + 180: 83 c0 01 add $0x1,%eax + 183: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 187: 89 c1 mov %eax,%ecx + 189: 75 f5 jne 180 + ; + } + return n; +} + 18b: 89 c8 mov %ecx,%eax + 18d: 5d pop %ebp + 18e: c3 ret + 18f: 90 nop + for (n = 0; s[n]; n++) { + 190: 31 c9 xor %ecx,%ecx +} + 192: 5d pop %ebp + 193: 89 c8 mov %ecx,%eax + 195: c3 ret + 196: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 19d: 8d 76 00 lea 0x0(%esi),%esi + +000001a0 : + +void* memset(void *dst, int c, uint n) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 57 push %edi + 1a4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 1a7: 8b 4d 10 mov 0x10(%ebp),%ecx + 1aa: 8b 45 0c mov 0xc(%ebp),%eax + 1ad: 89 d7 mov %edx,%edi + 1af: fc cld + 1b0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 1b2: 8b 7d fc mov -0x4(%ebp),%edi + 1b5: 89 d0 mov %edx,%eax + 1b7: c9 leave + 1b8: c3 ret + 1b9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000001c0 : + +char* strchr(const char *s, char c) { + 1c0: 55 push %ebp + 1c1: 89 e5 mov %esp,%ebp + 1c3: 8b 45 08 mov 0x8(%ebp),%eax + 1c6: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 1ca: 0f b6 10 movzbl (%eax),%edx + 1cd: 84 d2 test %dl,%dl + 1cf: 75 12 jne 1e3 + 1d1: eb 1d jmp 1f0 + 1d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1d7: 90 nop + 1d8: 0f b6 50 01 movzbl 0x1(%eax),%edx + 1dc: 83 c0 01 add $0x1,%eax + 1df: 84 d2 test %dl,%dl + 1e1: 74 0d je 1f0 + if (*s == c) { + 1e3: 38 d1 cmp %dl,%cl + 1e5: 75 f1 jne 1d8 + return (char*)s; + } + } + return 0; +} + 1e7: 5d pop %ebp + 1e8: c3 ret + 1e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 1f0: 31 c0 xor %eax,%eax +} + 1f2: 5d pop %ebp + 1f3: c3 ret + 1f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1ff: 90 nop + +00000200 : + +char* gets(char *buf, int max) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 57 push %edi + 204: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 205: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 208: 53 push %ebx + for (i = 0; i + 1 < max;) { + 209: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 20b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 20e: eb 27 jmp 237 + cc = read(0, &c, 1); + 210: 83 ec 04 sub $0x4,%esp + 213: 6a 01 push $0x1 + 215: 57 push %edi + 216: 6a 00 push $0x0 + 218: e8 2e 01 00 00 call 34b + if (cc < 1) { + 21d: 83 c4 10 add $0x10,%esp + 220: 85 c0 test %eax,%eax + 222: 7e 1d jle 241 + break; + } + buf[i++] = c; + 224: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 228: 8b 55 08 mov 0x8(%ebp),%edx + 22b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 22f: 3c 0a cmp $0xa,%al + 231: 74 1d je 250 + 233: 3c 0d cmp $0xd,%al + 235: 74 19 je 250 + for (i = 0; i + 1 < max;) { + 237: 89 de mov %ebx,%esi + 239: 83 c3 01 add $0x1,%ebx + 23c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 23f: 7c cf jl 210 + break; + } + } + buf[i] = '\0'; + 241: 8b 45 08 mov 0x8(%ebp),%eax + 244: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 248: 8d 65 f4 lea -0xc(%ebp),%esp + 24b: 5b pop %ebx + 24c: 5e pop %esi + 24d: 5f pop %edi + 24e: 5d pop %ebp + 24f: c3 ret + buf[i] = '\0'; + 250: 8b 45 08 mov 0x8(%ebp),%eax + 253: 89 de mov %ebx,%esi + 255: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 259: 8d 65 f4 lea -0xc(%ebp),%esp + 25c: 5b pop %ebx + 25d: 5e pop %esi + 25e: 5f pop %edi + 25f: 5d pop %ebp + 260: c3 ret + 261: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 268: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26f: 90 nop + +00000270 : + +int stat(const char *n, struct stat *st) { + 270: 55 push %ebp + 271: 89 e5 mov %esp,%ebp + 273: 56 push %esi + 274: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 275: 83 ec 08 sub $0x8,%esp + 278: 6a 00 push $0x0 + 27a: ff 75 08 push 0x8(%ebp) + 27d: e8 19 01 00 00 call 39b + if (fd < 0) { + 282: 83 c4 10 add $0x10,%esp + 285: 85 c0 test %eax,%eax + 287: 78 27 js 2b0 + return -1; + } + r = fstat(fd, st); + 289: 83 ec 08 sub $0x8,%esp + 28c: ff 75 0c push 0xc(%ebp) + 28f: 89 c3 mov %eax,%ebx + 291: 50 push %eax + 292: e8 cc 00 00 00 call 363 + close(fd); + 297: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 29a: 89 c6 mov %eax,%esi + close(fd); + 29c: e8 2a 01 00 00 call 3cb + return r; + 2a1: 83 c4 10 add $0x10,%esp +} + 2a4: 8d 65 f8 lea -0x8(%ebp),%esp + 2a7: 89 f0 mov %esi,%eax + 2a9: 5b pop %ebx + 2aa: 5e pop %esi + 2ab: 5d pop %ebp + 2ac: c3 ret + 2ad: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 2b0: be ff ff ff ff mov $0xffffffff,%esi + 2b5: eb ed jmp 2a4 + 2b7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2be: 66 90 xchg %ax,%ax + +000002c0 : + +int atoi(const char *s) { + 2c0: 55 push %ebp + 2c1: 89 e5 mov %esp,%ebp + 2c3: 53 push %ebx + 2c4: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 2c7: 0f be 02 movsbl (%edx),%eax + 2ca: 8d 48 d0 lea -0x30(%eax),%ecx + 2cd: 80 f9 09 cmp $0x9,%cl + n = 0; + 2d0: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 2d5: 77 1e ja 2f5 + 2d7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2de: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 2e0: 83 c2 01 add $0x1,%edx + 2e3: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 2e6: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 2ea: 0f be 02 movsbl (%edx),%eax + 2ed: 8d 58 d0 lea -0x30(%eax),%ebx + 2f0: 80 fb 09 cmp $0x9,%bl + 2f3: 76 eb jbe 2e0 + } + return n; +} + 2f5: 8b 5d fc mov -0x4(%ebp),%ebx + 2f8: 89 c8 mov %ecx,%eax + 2fa: c9 leave + 2fb: c3 ret + 2fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000300 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 300: 55 push %ebp + 301: 89 e5 mov %esp,%ebp + 303: 57 push %edi + 304: 8b 45 10 mov 0x10(%ebp),%eax + 307: 8b 55 08 mov 0x8(%ebp),%edx + 30a: 56 push %esi + 30b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 30e: 85 c0 test %eax,%eax + 310: 7e 13 jle 325 + 312: 01 d0 add %edx,%eax + dst = vdst; + 314: 89 d7 mov %edx,%edi + 316: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 31d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 320: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 321: 39 f8 cmp %edi,%eax + 323: 75 fb jne 320 + } + return vdst; +} + 325: 5e pop %esi + 326: 89 d0 mov %edx,%eax + 328: 5f pop %edi + 329: 5d pop %ebp + 32a: c3 ret + +0000032b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 32b: b8 01 00 00 00 mov $0x1,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(exit) + 333: b8 02 00 00 00 mov $0x2,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(wait) + 33b: b8 03 00 00 00 mov $0x3,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(pipe) + 343: b8 04 00 00 00 mov $0x4,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(read) + 34b: b8 05 00 00 00 mov $0x5,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(kill) + 353: b8 06 00 00 00 mov $0x6,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(exec) + 35b: b8 07 00 00 00 mov $0x7,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(fstat) + 363: b8 08 00 00 00 mov $0x8,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(chdir) + 36b: b8 09 00 00 00 mov $0x9,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(dup) + 373: b8 0a 00 00 00 mov $0xa,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(getpid) + 37b: b8 0b 00 00 00 mov $0xb,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(sbrk) + 383: b8 0c 00 00 00 mov $0xc,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(sleep) + 38b: b8 0d 00 00 00 mov $0xd,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(uptime) + 393: b8 0e 00 00 00 mov $0xe,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(open) + 39b: b8 0f 00 00 00 mov $0xf,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(write) + 3a3: b8 10 00 00 00 mov $0x10,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + +000003ab : +SYSCALL(mknod) + 3ab: b8 11 00 00 00 mov $0x11,%eax + 3b0: cd 40 int $0x40 + 3b2: c3 ret + +000003b3 : +SYSCALL(unlink) + 3b3: b8 12 00 00 00 mov $0x12,%eax + 3b8: cd 40 int $0x40 + 3ba: c3 ret + +000003bb : +SYSCALL(link) + 3bb: b8 13 00 00 00 mov $0x13,%eax + 3c0: cd 40 int $0x40 + 3c2: c3 ret + +000003c3 : +SYSCALL(mkdir) + 3c3: b8 14 00 00 00 mov $0x14,%eax + 3c8: cd 40 int $0x40 + 3ca: c3 ret + +000003cb : +SYSCALL(close) + 3cb: b8 15 00 00 00 mov $0x15,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(getch) + 3d3: b8 16 00 00 00 mov $0x16,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(greeting) + 3db: b8 17 00 00 00 mov $0x17,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(shutdown) + 3e3: b8 18 00 00 00 mov $0x18,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(screen) + 3eb: b8 19 00 00 00 mov $0x19,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(cls) + 3f3: b8 1a 00 00 00 mov $0x1a,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + 3fb: 66 90 xchg %ax,%ax + 3fd: 66 90 xchg %ax,%ax + 3ff: 90 nop + +00000400 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 57 push %edi + 404: 56 push %esi + 405: 53 push %ebx + 406: 83 ec 3c sub $0x3c,%esp + 409: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 40c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 40e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 411: 85 d2 test %edx,%edx + 413: 0f 89 7f 00 00 00 jns 498 + 419: f6 45 08 01 testb $0x1,0x8(%ebp) + 41d: 74 79 je 498 + neg = 1; + 41f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 426: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 428: 31 db xor %ebx,%ebx + 42a: 8d 75 d7 lea -0x29(%ebp),%esi + 42d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 430: 89 c8 mov %ecx,%eax + 432: 31 d2 xor %edx,%edx + 434: 89 cf mov %ecx,%edi + 436: f7 75 c4 divl -0x3c(%ebp) + 439: 0f b6 92 80 08 00 00 movzbl 0x880(%edx),%edx + 440: 89 45 c0 mov %eax,-0x40(%ebp) + 443: 89 d8 mov %ebx,%eax + 445: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 448: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 44b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 44e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 451: 76 dd jbe 430 + if (neg) { + 453: 8b 4d bc mov -0x44(%ebp),%ecx + 456: 85 c9 test %ecx,%ecx + 458: 74 0c je 466 + buf[i++] = '-'; + 45a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 45f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 461: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 466: 8b 7d b8 mov -0x48(%ebp),%edi + 469: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 46d: eb 07 jmp 476 + 46f: 90 nop + putc(fd, buf[i]); + 470: 0f b6 13 movzbl (%ebx),%edx + 473: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 476: 83 ec 04 sub $0x4,%esp + 479: 88 55 d7 mov %dl,-0x29(%ebp) + 47c: 6a 01 push $0x1 + 47e: 56 push %esi + 47f: 57 push %edi + 480: e8 1e ff ff ff call 3a3 + while (--i >= 0) { + 485: 83 c4 10 add $0x10,%esp + 488: 39 de cmp %ebx,%esi + 48a: 75 e4 jne 470 + } +} + 48c: 8d 65 f4 lea -0xc(%ebp),%esp + 48f: 5b pop %ebx + 490: 5e pop %esi + 491: 5f pop %edi + 492: 5d pop %ebp + 493: c3 ret + 494: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 498: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 49f: eb 87 jmp 428 + 4a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4af: 90 nop + +000004b0 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 4b0: 55 push %ebp + 4b1: 89 e5 mov %esp,%ebp + 4b3: 57 push %edi + 4b4: 56 push %esi + 4b5: 53 push %ebx + 4b6: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 4b9: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 4bc: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 4bf: 0f b6 13 movzbl (%ebx),%edx + 4c2: 84 d2 test %dl,%dl + 4c4: 74 6a je 530 + ap = (uint*)(void*)&fmt + 1; + 4c6: 8d 45 10 lea 0x10(%ebp),%eax + 4c9: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 4cc: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 4cf: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 4d1: 89 45 d0 mov %eax,-0x30(%ebp) + 4d4: eb 36 jmp 50c + 4d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4dd: 8d 76 00 lea 0x0(%esi),%esi + 4e0: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 4e3: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 4e8: 83 f8 25 cmp $0x25,%eax + 4eb: 74 15 je 502 + write(fd, &c, 1); + 4ed: 83 ec 04 sub $0x4,%esp + 4f0: 88 55 e7 mov %dl,-0x19(%ebp) + 4f3: 6a 01 push $0x1 + 4f5: 57 push %edi + 4f6: 56 push %esi + 4f7: e8 a7 fe ff ff call 3a3 + 4fc: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 4ff: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 502: 0f b6 13 movzbl (%ebx),%edx + 505: 83 c3 01 add $0x1,%ebx + 508: 84 d2 test %dl,%dl + 50a: 74 24 je 530 + c = fmt[i] & 0xff; + 50c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 50f: 85 c9 test %ecx,%ecx + 511: 74 cd je 4e0 + } + } + else if (state == '%') { + 513: 83 f9 25 cmp $0x25,%ecx + 516: 75 ea jne 502 + if (c == 'd') { + 518: 83 f8 25 cmp $0x25,%eax + 51b: 0f 84 07 01 00 00 je 628 + 521: 83 e8 63 sub $0x63,%eax + 524: 83 f8 15 cmp $0x15,%eax + 527: 77 17 ja 540 + 529: ff 24 85 28 08 00 00 jmp *0x828(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 530: 8d 65 f4 lea -0xc(%ebp),%esp + 533: 5b pop %ebx + 534: 5e pop %esi + 535: 5f pop %edi + 536: 5d pop %ebp + 537: c3 ret + 538: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 53f: 90 nop + write(fd, &c, 1); + 540: 83 ec 04 sub $0x4,%esp + 543: 88 55 d4 mov %dl,-0x2c(%ebp) + 546: 6a 01 push $0x1 + 548: 57 push %edi + 549: 56 push %esi + 54a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 54e: e8 50 fe ff ff call 3a3 + putc(fd, c); + 553: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 557: 83 c4 0c add $0xc,%esp + 55a: 88 55 e7 mov %dl,-0x19(%ebp) + 55d: 6a 01 push $0x1 + 55f: 57 push %edi + 560: 56 push %esi + 561: e8 3d fe ff ff call 3a3 + putc(fd, c); + 566: 83 c4 10 add $0x10,%esp + state = 0; + 569: 31 c9 xor %ecx,%ecx + 56b: eb 95 jmp 502 + 56d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 570: 83 ec 0c sub $0xc,%esp + 573: b9 10 00 00 00 mov $0x10,%ecx + 578: 6a 00 push $0x0 + 57a: 8b 45 d0 mov -0x30(%ebp),%eax + 57d: 8b 10 mov (%eax),%edx + 57f: 89 f0 mov %esi,%eax + 581: e8 7a fe ff ff call 400 + ap++; + 586: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 58a: 83 c4 10 add $0x10,%esp + state = 0; + 58d: 31 c9 xor %ecx,%ecx + 58f: e9 6e ff ff ff jmp 502 + 594: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 598: 8b 45 d0 mov -0x30(%ebp),%eax + 59b: 8b 10 mov (%eax),%edx + ap++; + 59d: 83 c0 04 add $0x4,%eax + 5a0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 5a3: 85 d2 test %edx,%edx + 5a5: 0f 84 8d 00 00 00 je 638 + while (*s != 0) { + 5ab: 0f b6 02 movzbl (%edx),%eax + state = 0; + 5ae: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 5b0: 84 c0 test %al,%al + 5b2: 0f 84 4a ff ff ff je 502 + 5b8: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5bb: 89 d3 mov %edx,%ebx + 5bd: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 5c0: 83 ec 04 sub $0x4,%esp + s++; + 5c3: 83 c3 01 add $0x1,%ebx + 5c6: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 5c9: 6a 01 push $0x1 + 5cb: 57 push %edi + 5cc: 56 push %esi + 5cd: e8 d1 fd ff ff call 3a3 + while (*s != 0) { + 5d2: 0f b6 03 movzbl (%ebx),%eax + 5d5: 83 c4 10 add $0x10,%esp + 5d8: 84 c0 test %al,%al + 5da: 75 e4 jne 5c0 + state = 0; + 5dc: 8b 5d d4 mov -0x2c(%ebp),%ebx + 5df: 31 c9 xor %ecx,%ecx + 5e1: e9 1c ff ff ff jmp 502 + 5e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5ed: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 5f0: 83 ec 0c sub $0xc,%esp + 5f3: b9 0a 00 00 00 mov $0xa,%ecx + 5f8: 6a 01 push $0x1 + 5fa: e9 7b ff ff ff jmp 57a + 5ff: 90 nop + putc(fd, *ap); + 600: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 603: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 606: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 608: 6a 01 push $0x1 + 60a: 57 push %edi + 60b: 56 push %esi + putc(fd, *ap); + 60c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 60f: e8 8f fd ff ff call 3a3 + ap++; + 614: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 618: 83 c4 10 add $0x10,%esp + state = 0; + 61b: 31 c9 xor %ecx,%ecx + 61d: e9 e0 fe ff ff jmp 502 + 622: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 628: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 62b: 83 ec 04 sub $0x4,%esp + 62e: e9 2a ff ff ff jmp 55d + 633: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 637: 90 nop + s = "(null)"; + 638: ba 1f 08 00 00 mov $0x81f,%edx + while (*s != 0) { + 63d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 640: b8 28 00 00 00 mov $0x28,%eax + 645: 89 d3 mov %edx,%ebx + 647: e9 74 ff ff ff jmp 5c0 + 64c: 66 90 xchg %ax,%ax + 64e: 66 90 xchg %ax,%ax + +00000650 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 650: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 651: a1 34 0b 00 00 mov 0xb34,%eax +void free(void *ap) { + 656: 89 e5 mov %esp,%ebp + 658: 57 push %edi + 659: 56 push %esi + 65a: 53 push %ebx + 65b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 65e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 661: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 668: 89 c2 mov %eax,%edx + 66a: 8b 00 mov (%eax),%eax + 66c: 39 ca cmp %ecx,%edx + 66e: 73 30 jae 6a0 + 670: 39 c1 cmp %eax,%ecx + 672: 72 04 jb 678 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 674: 39 c2 cmp %eax,%edx + 676: 72 f0 jb 668 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 678: 8b 73 fc mov -0x4(%ebx),%esi + 67b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 67e: 39 f8 cmp %edi,%eax + 680: 74 30 je 6b2 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 682: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 685: 8b 42 04 mov 0x4(%edx),%eax + 688: 8d 34 c2 lea (%edx,%eax,8),%esi + 68b: 39 f1 cmp %esi,%ecx + 68d: 74 3a je 6c9 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 68f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 691: 5b pop %ebx + freep = p; + 692: 89 15 34 0b 00 00 mov %edx,0xb34 +} + 698: 5e pop %esi + 699: 5f pop %edi + 69a: 5d pop %ebp + 69b: c3 ret + 69c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 6a0: 39 c2 cmp %eax,%edx + 6a2: 72 c4 jb 668 + 6a4: 39 c1 cmp %eax,%ecx + 6a6: 73 c0 jae 668 + if (bp + bp->s.size == p->s.ptr) { + 6a8: 8b 73 fc mov -0x4(%ebx),%esi + 6ab: 8d 3c f1 lea (%ecx,%esi,8),%edi + 6ae: 39 f8 cmp %edi,%eax + 6b0: 75 d0 jne 682 + bp->s.size += p->s.ptr->s.size; + 6b2: 03 70 04 add 0x4(%eax),%esi + 6b5: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 6b8: 8b 02 mov (%edx),%eax + 6ba: 8b 00 mov (%eax),%eax + 6bc: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 6bf: 8b 42 04 mov 0x4(%edx),%eax + 6c2: 8d 34 c2 lea (%edx,%eax,8),%esi + 6c5: 39 f1 cmp %esi,%ecx + 6c7: 75 c6 jne 68f + p->s.size += bp->s.size; + 6c9: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 6cc: 89 15 34 0b 00 00 mov %edx,0xb34 + p->s.size += bp->s.size; + 6d2: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 6d5: 8b 4b f8 mov -0x8(%ebx),%ecx + 6d8: 89 0a mov %ecx,(%edx) +} + 6da: 5b pop %ebx + 6db: 5e pop %esi + 6dc: 5f pop %edi + 6dd: 5d pop %ebp + 6de: c3 ret + 6df: 90 nop + +000006e0 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 6e0: 55 push %ebp + 6e1: 89 e5 mov %esp,%ebp + 6e3: 57 push %edi + 6e4: 56 push %esi + 6e5: 53 push %ebx + 6e6: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 6e9: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 6ec: 8b 3d 34 0b 00 00 mov 0xb34,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 6f2: 8d 70 07 lea 0x7(%eax),%esi + 6f5: c1 ee 03 shr $0x3,%esi + 6f8: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 6fb: 85 ff test %edi,%edi + 6fd: 0f 84 9d 00 00 00 je 7a0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 703: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 705: 8b 4a 04 mov 0x4(%edx),%ecx + 708: 39 f1 cmp %esi,%ecx + 70a: 73 6a jae 776 + 70c: bb 00 10 00 00 mov $0x1000,%ebx + 711: 39 de cmp %ebx,%esi + 713: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 716: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 71d: 89 45 e4 mov %eax,-0x1c(%ebp) + 720: eb 17 jmp 739 + 722: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 728: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 72a: 8b 48 04 mov 0x4(%eax),%ecx + 72d: 39 f1 cmp %esi,%ecx + 72f: 73 4f jae 780 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 731: 8b 3d 34 0b 00 00 mov 0xb34,%edi + 737: 89 c2 mov %eax,%edx + 739: 39 d7 cmp %edx,%edi + 73b: 75 eb jne 728 + p = sbrk(nu * sizeof(Header)); + 73d: 83 ec 0c sub $0xc,%esp + 740: ff 75 e4 push -0x1c(%ebp) + 743: e8 3b fc ff ff call 383 + if (p == (char*)-1) { + 748: 83 c4 10 add $0x10,%esp + 74b: 83 f8 ff cmp $0xffffffff,%eax + 74e: 74 1c je 76c + hp->s.size = nu; + 750: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 753: 83 ec 0c sub $0xc,%esp + 756: 83 c0 08 add $0x8,%eax + 759: 50 push %eax + 75a: e8 f1 fe ff ff call 650 + return freep; + 75f: 8b 15 34 0b 00 00 mov 0xb34,%edx + if ((p = morecore(nunits)) == 0) { + 765: 83 c4 10 add $0x10,%esp + 768: 85 d2 test %edx,%edx + 76a: 75 bc jne 728 + return 0; + } + } + } +} + 76c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 76f: 31 c0 xor %eax,%eax +} + 771: 5b pop %ebx + 772: 5e pop %esi + 773: 5f pop %edi + 774: 5d pop %ebp + 775: c3 ret + if (p->s.size >= nunits) { + 776: 89 d0 mov %edx,%eax + 778: 89 fa mov %edi,%edx + 77a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 780: 39 ce cmp %ecx,%esi + 782: 74 4c je 7d0 + p->s.size -= nunits; + 784: 29 f1 sub %esi,%ecx + 786: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 789: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 78c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 78f: 89 15 34 0b 00 00 mov %edx,0xb34 +} + 795: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 798: 83 c0 08 add $0x8,%eax +} + 79b: 5b pop %ebx + 79c: 5e pop %esi + 79d: 5f pop %edi + 79e: 5d pop %ebp + 79f: c3 ret + base.s.ptr = freep = prevp = &base; + 7a0: c7 05 34 0b 00 00 38 movl $0xb38,0xb34 + 7a7: 0b 00 00 + base.s.size = 0; + 7aa: bf 38 0b 00 00 mov $0xb38,%edi + base.s.ptr = freep = prevp = &base; + 7af: c7 05 38 0b 00 00 38 movl $0xb38,0xb38 + 7b6: 0b 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 7b9: 89 fa mov %edi,%edx + base.s.size = 0; + 7bb: c7 05 3c 0b 00 00 00 movl $0x0,0xb3c + 7c2: 00 00 00 + if (p->s.size >= nunits) { + 7c5: e9 42 ff ff ff jmp 70c + 7ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 7d0: 8b 08 mov (%eax),%ecx + 7d2: 89 0a mov %ecx,(%edx) + 7d4: eb b9 jmp 78f diff --git a/init.d b/init.d new file mode 100644 index 0000000..ee304c8 --- /dev/null +++ b/init.d @@ -0,0 +1 @@ +init.o: init.c /usr/include/stdc-predef.h types.h stat.h user.h fcntl.h diff --git a/init.o b/init.o new file mode 100644 index 0000000000000000000000000000000000000000..144d129a0faa0b8d59aedc2f42a75db6a47f7442 GIT binary patch literal 4292 zcma)9Yit}>6~1?NXT0|MvG%r2T$f~xoHQZbwbu!Gx3S{3!BvzxH5N%g4ddPM?%3-Y zcW1V7sy-yFlIBNHgeVfIq7pA55GbuGkP1jer6Bl0Do_=nO8iO$h=O?hY$Wr2cki_) z?hiQ9-tWBbx%ZwqbMEX5kDPo|N+}FUkrEq{5Y_IsWuJmw;yy7XO4_*+22t4Xgdh0v z;X)L<&DalWg{a=8Rr6tUu`uuY4X@fIqPo_4D_#Xo>jty5!Ye07(yKTBx%SlU*~_

bPw3WY3k0c$g{Fo9Z)-%8bsV17)m*0Nz zt(AM@Jy+h?Nw4{<$^hN(_Z|<$dmKy}a3HK`zLRZJs%| zY14l_h0VW*yxKyhF;{djpC3~k2AyMyB9-p2308*#|CG!OE6E;(lu6ru5R1;UQ1REr zLr9T+k}lF21!T#07vL;29aG@#6b9i8VCXnb`92Iibdw^WEwJfZ=mE+%ygRnoO2Ys`gt7aadl>^cM>ZNsL-AYOH zZ^0nDR4~f#Q+#D$*{=$j?WD^+_%UC37Ol*xAO|3S5R49liN%YWvXk z*)9Dths0!bT-0@^lv8=m?i$9DqgiZar&_yvpTHtntdX6{9~-o`;+g6Nl#=USl7mMF zk$=4-t#9w94--UASu*V~8$0d4bHY@gQFUiV>d4}p)4r6T2axdXf5SUlkUE`HZ4_48a$dK05c}<|N|bH!jNRj; zR=#oLvyOB!`5Sg;YWd79>mKYVT=oLd3L?K2c+~=5`3tTeizU|&1iR;ktx|WJLJcQQ z%@!uh2MXnKX>Vz)P+ZzOjv;OZ-h(wS@S1)FqT8(0AN2Ph++QfxYSpq>J1)8n-;LPNl}EVb$Hn=kyW|y@Lu|=w8fUk%SX^#~u~&&htz7m!Sl#Gi zP^mY=AZ$g&R&c=&s>RryYj_cixGpfS(r}}?neB&xSXvCis<^-xKB|Y!xNt`rmYZ04 zUbxNL(}I@^vVpv`9hoNHM5T%tUGl2FI~vWOpSc)KH^bVf8%16eEqOsa{y(fbgoak+ zHA`shCnhHk7k16gwSu^%Q(P>!lvsX#e7rQaZ?{&XXzpU=faEhz2>EPA4t1x~FQL>% zpkw`#RLwrzEyYyMwp!wNU#hj@QVpfWzt#*-OtpLIx+*1{b-ry!w@6S* zbR{ItNAE~b3T-_}Dbb%4;g6=1pcGDPR^XWiuzpX%&i8R(lgt)wh<0@kY6azw8zYeN z{hQ0VyBLFFzvQY1jdbfCG=~_}{q+TyoORBWgJJzm5PM7EacWb;C zXyN{0FR^gYBN|U?JDZh-#(##0R6a$-CcdEUm$m&%M5Oj*>XD$YYrDFXk>c-anZ1kg zUMIr;XIlRY$|$toYWX^4?29>(xL)}TWM@0~5|5lYCvyK1jgdK)aNe!`#xx$#_>e|d z}ij>gwC{#4^XG@{bge)vtneT@OmY>vEA;Q0* zv8C~Ojh8fD)%Z1y-_-a6jc;iDxyD~MHiRQ{D5(@jdjDt-byS=O|Ma^y0I%tb5R5_q(JX-sob{G4+?x{ zqkP-`-dwA8-Vf$OQK~B5ottZVPbaO7u+s3Om?61B+pFmYHSZ2pGpK#Ut>Fir35<;x zmg@6Lu7peMsiG91{g-eB6;)erFXh$GtNQ|n|Nm$RZg>pq9jyJIV`DCDB;MBKnN|}0 zOb?=Lz6^%Jqtw*1puPZse)wKd-w^bpyho#ncNB7x%)06wfni)5>31UGNI(82HJVO* z6*7CHA=VO!-=@j^?Sk+<=(s=5HT#pNv;X z#N+#C;;EjQnEx&e=I*81#QQ4vWV|uNGj)I#y&msJi8)}!O~hkAGi2g@ABtqWgNU~a zI-a*5KeN9#!E+AlhV(M}@*xuhGFkrK(P;dBhlkJm!;tZN4+`?eZzuXV`;Q^x_a`XG z8+rnMNiw#7LrLD!#!tg: + + +# exec(init, argv) +.globl start +start: + pushl $argv + 0: 68 24 00 00 00 push $0x24 + pushl $init + 5: 68 1c 00 00 00 push $0x1c + pushl $0 // where caller pc would be + a: 6a 00 push $0x0 + movl $SYS_exec, %eax + c: b8 07 00 00 00 mov $0x7,%eax + int $T_SYSCALL + 11: cd 40 int $0x40 + +00000013 : + +# for(;;) exit(); +exit: + movl $SYS_exit, %eax + 13: b8 02 00 00 00 mov $0x2,%eax + int $T_SYSCALL + 18: cd 40 int $0x40 + jmp exit + 1a: eb f7 jmp 13 + +0000001c : + 1c: 2f das + 1d: 69 6e 69 74 00 00 90 imul $0x90000074,0x69(%esi),%ebp + +00000024 : + 24: 1c 00 sbb $0x0,%al + 26: 00 00 add %al,(%eax) + 28: 00 00 add %al,(%eax) + ... diff --git a/initcode.d b/initcode.d new file mode 100644 index 0000000..ab1af4d --- /dev/null +++ b/initcode.d @@ -0,0 +1 @@ +initcode.o: initcode.S syscall.h traps.h diff --git a/initcode.o b/initcode.o new file mode 100644 index 0000000000000000000000000000000000000000..0e6fa21e0e3aa4c0fa3fc558f9fb94215cb6c6b6 GIT binary patch literal 1508 zcma)5yKWOf6uskhcm(;CAczRUD?}t-+64oWktj^Tqll0tL*dF<V-<- z3Zim@A6a2P@m5W@8+IGru&{>Wa1sy3QJC)bI!9?cnGM4zP2)73#M7)H9Q=AVh=Wev z^w~^Ik?j`yx=rsKgu~2xgH2tmnYD^n-YjpG*H;iFf6D>f6?U0(a?}1!>)DG}{^O3{ z2<|nt&!05^JUR0B&SB&f4E>kf0a>rRY;H$3;>npshK47rzxmwR5}xqzmhhy6(_NxU zHc>J>us>AdL!4}yMG4N=^5ij+A2m5sU!?{O{wwOcPCs;cGBj9JqQ>}|i(jBVD{{$c z-Ua%$KWLMey*5F5G|8gA1ZkGc^+>HG-V3t$Fq2>qWswB^G?jqCLEL{k?Cp)GF;WY= zhjsbArx zL%5!G{C``{cTZDx;OD_w;ueJU|EeP&T?5nh+os{5xjXRl{Mz8>BSwC_S<0^kn`>B4 ze1UL=f;q}dr#1c!2JexAHAEYdpSzE_?9I8{pU&NZt!rRP5zcuU4w~c1sm;^|9G`{* zdlFMfe(q`A6%10UjxUQUCw| literal 0 HcmV?d00001 diff --git a/initcode.out b/initcode.out new file mode 100644 index 0000000000000000000000000000000000000000..ee27f9d0b6a62faefa467291f8db2cb71b2b5e94 GIT binary patch literal 1136 zcmah|J#Q015S=~S0s=U85>BB_X~O$1M(BC{zi z#Ba+*SqS-8x&e5v^mD)}d~co0H7xJsgu&CT(B^dO`_Fikj&hM>W@*IY2<|M5{nT0@ zH8CNn_X-E%CL(v>=EyXqakXid7Ay7D`px=s4bf*|Usdk1!kAz6%LI0SgRF&Sky(ot zqw9!DSfm#2Qduy)Ufk>S;%EuQyz<*g;@Vw_$1WM!*zfkchyGr;|X49ebDo5$=M7bRdGPkel{U~+H(MT!7I6j-X@xLi&!FlpCr187e*--0O#~H9r z?Fgi$0(idU_kpu@U!c$4%~|fzT-{gb6}X!Ac#eQ_=DxvqNJ`V(8)$N#Pg{q0P|&b4 zN4F(vT@OM2C2CqnEPw5g`i#Ia*abNMAI_yw>IzV81)DZh0NIDeZ*sP78+9K-rdYJ@ E52p2ci~s-t literal 0 HcmV?d00001 diff --git a/ioapic.d b/ioapic.d new file mode 100644 index 0000000..997e68a --- /dev/null +++ b/ioapic.d @@ -0,0 +1 @@ +ioapic.o: ioapic.c /usr/include/stdc-predef.h types.h defs.h traps.h diff --git a/ioapic.o b/ioapic.o new file mode 100644 index 0000000000000000000000000000000000000000..9ed5690ca6a4c635c5ad1770356c56b04ddb845d GIT binary patch literal 5040 zcma)9YiwM_8J*dCXJdQ)*!3oU#4%Z$qz=&C#Ca7vcH+bV5}?FQa7dsuUhm$u7wp~5 z?%hBr5L(lymTM^pP+v$XQd_C5)VBapDgvRTDlHWi5`9QirA0z2LZLsZN+8m6=FZrg z_75Y?obPdF=9|ZznS1KGo3EEr3Y(;G#Ih#D#g@RcRl^3+A=)if9v{+`Em_B)s$CrAwC< zGlN%t}a?%{1JK zqWcPpCjH%@n}8rUp>W(4b%fB0ZJ0ZE9SUb34YF=GAksy{q1aByjjqZUe9^QX@=Cd; z?opsBdsCuY4^frUS#iaWV04=gpp_Ui7aew`SNigcedXFOXv~Nz7ICJGZCn6 z=qM)SJY0hNXph=O?{V0gp*AAR9F)}%+K@#D>2Ffni!4W#<|ZLugWO3jqTp6yB;vcs z@(I?d%Zqw;xdV9{a$Pm$}2VAp+3k}=nF+55UVmTtY)eSKU=amCdn^)^wFn$)|7Bxp+X z$3yK;@4-hL>X!ZSgYua@k@5B;J@RPewg`vktP_#Q&WMARaodE`JlGT35gF*|*bkp- z5>DMU-Yh2x`9=wA=-4jCK$HS4#QG+G<4KX zYJ_u&{mMzl#;6U!tU=d4@qj!9=b97-5)7lSGocrvyS8mCYAs`bJb{MAFOZecrwkpHa{?qO+(>VzUkk${p-sB|IeA*jL#(c)gE&as(`c4%>{crC z(kaWc?mVnuu7QybxOBwXzR#NUjaFxYt1vx3IX4 z#W5DDT__!{bB$CgzEZV^TU6tfN`=p=CX5R8%wYMoMzPIFGJ zE32jcP-t`}DdxiAmj3+XsGF-XkikazjS!C0GTHJ8Ucw)5wQ;Gim)Rxqy zL~?e^W)yz4;0;fC1+SdXKuwo3)5H1g*KSWFr>3%#iR1y0a)n}YvYMaq^MydE_+b0V z^h`co$rq*qV{ta`Cv)ZWtd}em5rkK^UJ9M%#RxVC$Ojjyir84Uk{LO}*%6wc}5Ci!B$&yz|O^d9T zBZwPDM+Xxd#wV)|Tj2K$K^3eR^5 z(ikv=_r_u4KVk5U!JiqtVDJrtoISi~^sGosT`P4=0N;>AKE)(X>|P?sJl@IMVsOyl zE`vHA_!$p*8H1+{e%&DFmg72S^gkQ?tHFN|(Qk_o%1i8YIbE3Y zUqmE1r1_ZEGsRh+!XkyAP%ni`E2%Gnpc`-cn7&~!&X1ecf{0~Z zIvScRnq<{$U?bo1_$yp{ z3|n~6K7_3a+Kf!ye#$d%W@YVMFTlCAhXTQ9S?7VynGV9RC^gAr#glz;mMdlwE zw7evO&%tJs4DBJWrC!;1=-ydP4Y?uBVcoQ`|j)UoS^q(zs`Ps Ai~s-t literal 0 HcmV?d00001 diff --git a/kalloc.d b/kalloc.d new file mode 100644 index 0000000..512c5db --- /dev/null +++ b/kalloc.d @@ -0,0 +1,2 @@ +kalloc.o: kalloc.c /usr/include/stdc-predef.h types.h defs.h param.h \ + memlayout.h mmu.h spinlock.h diff --git a/kalloc.o b/kalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..ad9293f51165a19d0dc6e60b43252c0980a897c9 GIT binary patch literal 6744 zcmbtY3vg7`89wK}vSE{uWyyiTenTK6pf4 z6Qa;+#Tgu63QnED>1Z8w>{zkU`lxl3={S9$PFverrBkfTV8J&1zO(0UHe#op>6tnA z`(Nij|NozJ&po?48&=;Wr4(M1!W4s?5M8Ai&1?lVqC%8=rV1Mm{&8K;1*>JFEK&eVmt!QYSw!5&HuFfgFg4OJMP-pPj`p^Z-4J4 zKX}DvrmV8(d1$=r5N*!|Uz-Dq!Q_zz^3RNgLVRgDWBy|vnD+~_sXD5nquiBh5%!)< z74;S$Ea4ht^6l64LEb$VCJsiU%m-KTY|7W`J6NdJ?p&%AQ5Zg> z$LM-FQjUYzJOoabl&qo3oI$2Ee+6K+Swf~vjhZLMOdwZo{uN-OQbOeMada_!7<>qa zF7h_v@jzo%IJO47c{;!UG%hBu6<@I1j)>tLr5G2|2>L{ZdIdx#waK=%3W9CmyV0#BV0u98 zMlWXa`Hhf#4}@COTDW70(0tp0m22^cf|JKwte~2^GIwspya|KX(I;{49T*|UaL9Q3 z4vbOr{~7%I=xTmHEb`EcX{F|$1a36PoyH?GzuXLxODrbS>j@BiapbXTreGY&`29Kz zZbMgISl%t@@?98eFE@*C$(=zAu*FJ%St!h+1^yfS^ZhG>^ZW?N7Ii_R?3txy*rOAL z-+!auEW*YdF8oy%N92X&q6&@-#So1s%}E>QjZPGA$jG2Hi~RmfNf=ZKGDlrXgNUuZ0%t}Q3O56i z@+wrdLWQjBw+OYsu>lXhTo0pzGM62LA=#2Is$lqIb@7y+>WY=YOijlP74Mh2)|Er$ zD}%YU4xto2Z$y`F0n^~-Xr%*TOIxxgNyPd!#HADFBvZzMheR(tSj;+b@xvU8^s+@kIL1EH*X6~s&pc!zmP6*l zW+s-0%~KqB$~;Yh7t0Cx5z1s)AIXnpCTX3Yw7xH&kwemZMn2EFJulyu8JBO%^Aax4 z%XcY&OP)D6K+v*rWk1xEPC)k-(z+xsvxZlsbrrQ0)7wSDV}GZO2){X@c|*i*1q`?VElb_=Gi{=WR%BGYil!!#{NyiedNVat*QlYFpEz}tLa+^iwx~d$nSko9< zR(E}L>z9yGmb>J)OIC0Q*JcXsfArJ z7ura2dpz2f=!|!!leOvi)>yo`HWg`Vcau;ePmGJUN0M#c=vZf5B)ej9l}|TsuPkUH z5^r@yEFMcK`4&=jLcuH%cekO?Y7N3sF{8t6jzwl9TQ;rRo?M&gY@HEFCf#JR!;PnA z{TFT4NtWw3qjo#`<9|_rq?fKbj#L{9+OlUxhwszt3FWV|}ZC$^rQzGE)=| zDnXe7m%N;2^0#$PGetlQ(>&`w0>^r;1!-^1XhwcC3AB3j06q;NGP+UEntP4>OpgJQ z=g*B3=v+6>w-|U4omYSI`~~E#0eSUBfsBpg`Efa`Yft^)p3fWsd|C8SqmCW#{P2#c z!SgBeI_cL(zf6NKSLQU!|fOU>l)wD_&1H0fSmsy znjg?ugikU3j@39GXrQq7G9Dmzn8Y^ZPLlYI&!3MHo1|3ZC?dv;C&HK)0NTyb$bCV6 znZ{c*-l>swq5i1G-)g+9(PEs?2Q*e{oUY@q)BH^u`MZer-5PnGkbgwu4~U5OCq%qX zKh^k(mcOO(H$;qkU-OrVu)nG?4?f8IH5L=mD>Sl>AWz} zL3Tt$9Z?Wv1|{OH*O;`&;;yI1lpaa(CdEfPJNVHT;W+LkVcd;s)qNu~joY?KU1X5! z|Jo{Hh*u)}Wm*i{`wI|c_WQx_1h$!2jLvodXWm7iI!Az5LUq*M*m7qmA9q__+Is!8bP>D2k{34wcIH}OmIeE_=Ld22B5 zJjj>_Ugzw*r$Ey;*N^S70{mI$O$MGM`wumGc5~o_xp~dAdjSH{p53Fc;~C*K&+b(S zNPF!ZgUV^1?mT3qy%c{5yAN{gSUqB2T+fvlvJ-Q1ruX*u7JjCt*=KYgr1oZ6w4Wf(PlK=n! literal 0 HcmV?d00001 diff --git a/kbd.d b/kbd.d new file mode 100644 index 0000000..92532ba --- /dev/null +++ b/kbd.d @@ -0,0 +1 @@ +kbd.o: kbd.c /usr/include/stdc-predef.h types.h x86.h defs.h kbd.h diff --git a/kbd.o b/kbd.o new file mode 100644 index 0000000000000000000000000000000000000000..fffe14c2d244087c7aea9d509766c1981ef5b203 GIT binary patch literal 6072 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 l0pib@ygQK}y&uY@*E~cP26&})5dVQs>A>Q literal 0 HcmV?d00001 diff --git a/kernel b/kernel new file mode 100644 index 0000000000000000000000000000000000000000..9f946d66ead630645db2f9fc45f88fa253cbe317 GIT binary patch literal 235032 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 z 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

#nt)h^VabW})&;@M2jLBSrIOs&{Qs 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 literal 0 HcmV?d00001 diff --git a/kernel.asm b/kernel.asm new file mode 100644 index 0000000..30b987d --- /dev/null +++ b/kernel.asm @@ -0,0 +1,18368 @@ + +kernel: file format elf32-i386 + + +Disassembly of section .text: + +80100000 : +80100000: 02 b0 ad 1b 00 00 add 0x1bad(%eax),%dh +80100006: 00 00 add %al,(%eax) +80100008: fe 4f 52 decb 0x52(%edi) +8010000b: e4 .byte 0xe4 + +8010000c : + +# Entering xv6 on boot processor, with paging off. +.globl entry +entry: + # Turn on page size extension for 4Mbyte pages + movl %cr4, %eax +8010000c: 0f 20 e0 mov %cr4,%eax + orl $(CR4_PSE), %eax +8010000f: 83 c8 10 or $0x10,%eax + movl %eax, %cr4 +80100012: 0f 22 e0 mov %eax,%cr4 + # Set page directory + movl $(V2P_WO(entrypgdir)), %eax +80100015: b8 00 b0 10 00 mov $0x10b000,%eax + movl %eax, %cr3 +8010001a: 0f 22 d8 mov %eax,%cr3 + # Turn on paging. + movl %cr0, %eax +8010001d: 0f 20 c0 mov %cr0,%eax + orl $(CR0_PG|CR0_WP), %eax +80100020: 0d 00 00 01 80 or $0x80010000,%eax + movl %eax, %cr0 +80100025: 0f 22 c0 mov %eax,%cr0 + + # Set up the stack pointer. + movl $(stack + KSTACKSIZE), %esp +80100028: bc 50 22 12 80 mov $0x80122250,%esp + + # Jump to main(), and switch to executing at + # high addresses. The indirect call is needed because + # the assembler produces a PC-relative instruction + # for a direct jump. + mov $main, %eax +8010002d: b8 50 45 10 80 mov $0x80104550,%eax + jmp *%eax +80100032: ff e0 jmp *%eax +80100034: 66 90 xchg %ax,%ax +80100036: 66 90 xchg %ax,%ax +80100038: 66 90 xchg %ax,%ax +8010003a: 66 90 xchg %ax,%ax +8010003c: 66 90 xchg %ax,%ax +8010003e: 66 90 xchg %ax,%ax + +80100040 : + // Linked list of all buffers, through prev/next. + // head.next is most recently used. + struct buf head; +} bcache; + +void binit(void) { +80100040: 55 push %ebp +80100041: 89 e5 mov %esp,%ebp +80100043: 53 push %ebx + initlock(&bcache.lock, "bcache"); + + // Create linked list of buffers + bcache.head.prev = &bcache.head; + bcache.head.next = &bcache.head; + for (b = bcache.buf; b < bcache.buf + NBUF; b++) { +80100044: bb 54 c5 10 80 mov $0x8010c554,%ebx +void binit(void) { +80100049: 83 ec 0c sub $0xc,%esp + initlock(&bcache.lock, "bcache"); +8010004c: 68 60 89 10 80 push $0x80108960 +80100051: 68 20 c5 10 80 push $0x8010c520 +80100056: e8 55 59 00 00 call 801059b0 + bcache.head.next = &bcache.head; +8010005b: 83 c4 10 add $0x10,%esp +8010005e: b8 1c 0c 11 80 mov $0x80110c1c,%eax + bcache.head.prev = &bcache.head; +80100063: c7 05 6c 0c 11 80 1c movl $0x80110c1c,0x80110c6c +8010006a: 0c 11 80 + bcache.head.next = &bcache.head; +8010006d: c7 05 70 0c 11 80 1c movl $0x80110c1c,0x80110c70 +80100074: 0c 11 80 + for (b = bcache.buf; b < bcache.buf + NBUF; b++) { +80100077: eb 09 jmp 80100082 +80100079: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100080: 89 d3 mov %edx,%ebx + b->next = bcache.head.next; +80100082: 89 43 54 mov %eax,0x54(%ebx) + b->prev = &bcache.head; + initsleeplock(&b->lock, "buffer"); +80100085: 83 ec 08 sub $0x8,%esp +80100088: 8d 43 0c lea 0xc(%ebx),%eax + b->prev = &bcache.head; +8010008b: c7 43 50 1c 0c 11 80 movl $0x80110c1c,0x50(%ebx) + initsleeplock(&b->lock, "buffer"); +80100092: 68 67 89 10 80 push $0x80108967 +80100097: 50 push %eax +80100098: e8 e3 57 00 00 call 80105880 + bcache.head.next->prev = b; +8010009d: a1 70 0c 11 80 mov 0x80110c70,%eax + for (b = bcache.buf; b < bcache.buf + NBUF; b++) { +801000a2: 8d 93 5c 02 00 00 lea 0x25c(%ebx),%edx +801000a8: 83 c4 10 add $0x10,%esp + bcache.head.next->prev = b; +801000ab: 89 58 50 mov %ebx,0x50(%eax) + bcache.head.next = b; +801000ae: 89 d8 mov %ebx,%eax +801000b0: 89 1d 70 0c 11 80 mov %ebx,0x80110c70 + for (b = bcache.buf; b < bcache.buf + NBUF; b++) { +801000b6: 81 fb c0 09 11 80 cmp $0x801109c0,%ebx +801000bc: 75 c2 jne 80100080 + } +} +801000be: 8b 5d fc mov -0x4(%ebp),%ebx +801000c1: c9 leave +801000c2: c3 ret +801000c3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801000ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +801000d0 : + panic("bget: no buffers"); +} + +// Return a locked buf with the contents of the indicated block. + +struct buf*bread(uint dev, uint blockno) { +801000d0: 55 push %ebp +801000d1: 89 e5 mov %esp,%ebp +801000d3: 57 push %edi +801000d4: 56 push %esi +801000d5: 53 push %ebx +801000d6: 83 ec 18 sub $0x18,%esp +801000d9: 8b 75 08 mov 0x8(%ebp),%esi +801000dc: 8b 7d 0c mov 0xc(%ebp),%edi + acquire(&bcache.lock); +801000df: 68 20 c5 10 80 push $0x8010c520 +801000e4: e8 97 5a 00 00 call 80105b80 + for (b = bcache.head.next; b != &bcache.head; b = b->next) { +801000e9: 8b 1d 70 0c 11 80 mov 0x80110c70,%ebx +801000ef: 83 c4 10 add $0x10,%esp +801000f2: 81 fb 1c 0c 11 80 cmp $0x80110c1c,%ebx +801000f8: 75 11 jne 8010010b +801000fa: eb 24 jmp 80100120 +801000fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80100100: 8b 5b 54 mov 0x54(%ebx),%ebx +80100103: 81 fb 1c 0c 11 80 cmp $0x80110c1c,%ebx +80100109: 74 15 je 80100120 + if (b->dev == dev && b->blockno == blockno) { +8010010b: 3b 73 04 cmp 0x4(%ebx),%esi +8010010e: 75 f0 jne 80100100 +80100110: 3b 7b 08 cmp 0x8(%ebx),%edi +80100113: 75 eb jne 80100100 + b->refcnt++; +80100115: 83 43 4c 01 addl $0x1,0x4c(%ebx) + release(&bcache.lock); +80100119: eb 3f jmp 8010015a +8010011b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010011f: 90 nop + for (b = bcache.head.prev; b != &bcache.head; b = b->prev) { +80100120: 8b 1d 6c 0c 11 80 mov 0x80110c6c,%ebx +80100126: 81 fb 1c 0c 11 80 cmp $0x80110c1c,%ebx +8010012c: 75 0d jne 8010013b +8010012e: eb 6e jmp 8010019e +80100130: 8b 5b 50 mov 0x50(%ebx),%ebx +80100133: 81 fb 1c 0c 11 80 cmp $0x80110c1c,%ebx +80100139: 74 63 je 8010019e + if (b->refcnt == 0 && (b->flags & B_DIRTY) == 0) { +8010013b: 8b 43 4c mov 0x4c(%ebx),%eax +8010013e: 85 c0 test %eax,%eax +80100140: 75 ee jne 80100130 +80100142: f6 03 04 testb $0x4,(%ebx) +80100145: 75 e9 jne 80100130 + b->dev = dev; +80100147: 89 73 04 mov %esi,0x4(%ebx) + b->blockno = blockno; +8010014a: 89 7b 08 mov %edi,0x8(%ebx) + b->flags = 0; +8010014d: c7 03 00 00 00 00 movl $0x0,(%ebx) + b->refcnt = 1; +80100153: c7 43 4c 01 00 00 00 movl $0x1,0x4c(%ebx) + release(&bcache.lock); +8010015a: 83 ec 0c sub $0xc,%esp +8010015d: 68 20 c5 10 80 push $0x8010c520 +80100162: e8 b9 59 00 00 call 80105b20 + acquiresleep(&b->lock); +80100167: 8d 43 0c lea 0xc(%ebx),%eax +8010016a: 89 04 24 mov %eax,(%esp) +8010016d: e8 4e 57 00 00 call 801058c0 + return b; +80100172: 83 c4 10 add $0x10,%esp + struct buf *b; + + b = bget(dev, blockno); + if ((b->flags & B_VALID) == 0) { +80100175: f6 03 02 testb $0x2,(%ebx) +80100178: 74 0e je 80100188 + iderw(b); + } + return b; +} +8010017a: 8d 65 f4 lea -0xc(%ebp),%esp +8010017d: 89 d8 mov %ebx,%eax +8010017f: 5b pop %ebx +80100180: 5e pop %esi +80100181: 5f pop %edi +80100182: 5d pop %ebp +80100183: c3 ret +80100184: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + iderw(b); +80100188: 83 ec 0c sub $0xc,%esp +8010018b: 53 push %ebx +8010018c: e8 3f 36 00 00 call 801037d0 +80100191: 83 c4 10 add $0x10,%esp +} +80100194: 8d 65 f4 lea -0xc(%ebp),%esp +80100197: 89 d8 mov %ebx,%eax +80100199: 5b pop %ebx +8010019a: 5e pop %esi +8010019b: 5f pop %edi +8010019c: 5d pop %ebp +8010019d: c3 ret + panic("bget: no buffers"); +8010019e: 83 ec 0c sub $0xc,%esp +801001a1: 68 6e 89 10 80 push $0x8010896e +801001a6: e8 d5 02 00 00 call 80100480 +801001ab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801001af: 90 nop + +801001b0 : + +// Write b's contents to disk. Must be locked. + +void bwrite(struct buf *b) { +801001b0: 55 push %ebp +801001b1: 89 e5 mov %esp,%ebp +801001b3: 53 push %ebx +801001b4: 83 ec 10 sub $0x10,%esp +801001b7: 8b 5d 08 mov 0x8(%ebp),%ebx + if (!holdingsleep(&b->lock)) { +801001ba: 8d 43 0c lea 0xc(%ebx),%eax +801001bd: 50 push %eax +801001be: e8 9d 57 00 00 call 80105960 +801001c3: 83 c4 10 add $0x10,%esp +801001c6: 85 c0 test %eax,%eax +801001c8: 74 0f je 801001d9 + panic("bwrite"); + } + b->flags |= B_DIRTY; +801001ca: 83 0b 04 orl $0x4,(%ebx) + iderw(b); +801001cd: 89 5d 08 mov %ebx,0x8(%ebp) +} +801001d0: 8b 5d fc mov -0x4(%ebp),%ebx +801001d3: c9 leave + iderw(b); +801001d4: e9 f7 35 00 00 jmp 801037d0 + panic("bwrite"); +801001d9: 83 ec 0c sub $0xc,%esp +801001dc: 68 7f 89 10 80 push $0x8010897f +801001e1: e8 9a 02 00 00 call 80100480 +801001e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801001ed: 8d 76 00 lea 0x0(%esi),%esi + +801001f0 : + +// Release a locked buffer. +// Move to the head of the MRU list. + +void brelse(struct buf *b) { +801001f0: 55 push %ebp +801001f1: 89 e5 mov %esp,%ebp +801001f3: 56 push %esi +801001f4: 53 push %ebx +801001f5: 8b 5d 08 mov 0x8(%ebp),%ebx + if (!holdingsleep(&b->lock)) { +801001f8: 8d 73 0c lea 0xc(%ebx),%esi +801001fb: 83 ec 0c sub $0xc,%esp +801001fe: 56 push %esi +801001ff: e8 5c 57 00 00 call 80105960 +80100204: 83 c4 10 add $0x10,%esp +80100207: 85 c0 test %eax,%eax +80100209: 74 66 je 80100271 + panic("brelse"); + } + + releasesleep(&b->lock); +8010020b: 83 ec 0c sub $0xc,%esp +8010020e: 56 push %esi +8010020f: e8 0c 57 00 00 call 80105920 + + acquire(&bcache.lock); +80100214: c7 04 24 20 c5 10 80 movl $0x8010c520,(%esp) +8010021b: e8 60 59 00 00 call 80105b80 + b->refcnt--; +80100220: 8b 43 4c mov 0x4c(%ebx),%eax + if (b->refcnt == 0) { +80100223: 83 c4 10 add $0x10,%esp + b->refcnt--; +80100226: 83 e8 01 sub $0x1,%eax +80100229: 89 43 4c mov %eax,0x4c(%ebx) + if (b->refcnt == 0) { +8010022c: 85 c0 test %eax,%eax +8010022e: 75 2f jne 8010025f + // no one is waiting for it. + b->next->prev = b->prev; +80100230: 8b 43 54 mov 0x54(%ebx),%eax +80100233: 8b 53 50 mov 0x50(%ebx),%edx +80100236: 89 50 50 mov %edx,0x50(%eax) + b->prev->next = b->next; +80100239: 8b 43 50 mov 0x50(%ebx),%eax +8010023c: 8b 53 54 mov 0x54(%ebx),%edx +8010023f: 89 50 54 mov %edx,0x54(%eax) + b->next = bcache.head.next; +80100242: a1 70 0c 11 80 mov 0x80110c70,%eax + b->prev = &bcache.head; +80100247: c7 43 50 1c 0c 11 80 movl $0x80110c1c,0x50(%ebx) + b->next = bcache.head.next; +8010024e: 89 43 54 mov %eax,0x54(%ebx) + bcache.head.next->prev = b; +80100251: a1 70 0c 11 80 mov 0x80110c70,%eax +80100256: 89 58 50 mov %ebx,0x50(%eax) + bcache.head.next = b; +80100259: 89 1d 70 0c 11 80 mov %ebx,0x80110c70 + } + + release(&bcache.lock); +8010025f: c7 45 08 20 c5 10 80 movl $0x8010c520,0x8(%ebp) +} +80100266: 8d 65 f8 lea -0x8(%ebp),%esp +80100269: 5b pop %ebx +8010026a: 5e pop %esi +8010026b: 5d pop %ebp + release(&bcache.lock); +8010026c: e9 af 58 00 00 jmp 80105b20 + panic("brelse"); +80100271: 83 ec 0c sub $0xc,%esp +80100274: 68 86 89 10 80 push $0x80108986 +80100279: e8 02 02 00 00 call 80100480 +8010027e: 66 90 xchg %ax,%ax + +80100280 : + menuactive = 1; +} + +// Function that handles the moving of the highlight bar for the menu +static void navigatemenu(int dir) +{ +80100280: 55 push %ebp + int resultcount = 0; +80100281: 31 d2 xor %edx,%edx +{ +80100283: 89 e5 mov %esp,%ebp +80100285: 53 push %ebx + int pos = 0; + int newindex = currentmenuitem + dir; +80100286: 8b 1d c0 b6 11 80 mov 0x8011b6c0,%ebx +8010028c: 8d 0c 03 lea (%ebx,%eax,1),%ecx + for (int i = 0; i < MAXVCONSOLES; i++) +8010028f: b8 0c 1f 11 80 mov $0x80111f0c,%eax +80100294: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + resultcount++; +80100298: 83 38 01 cmpl $0x1,(%eax) +8010029b: 83 da ff sbb $0xffffffff,%edx + for (int i = 0; i < MAXVCONSOLES; i++) +8010029e: 05 b0 10 00 00 add $0x10b0,%eax +801002a3: 3d ec c5 11 80 cmp $0x8011c5ec,%eax +801002a8: 75 ee jne 80100298 + int totalactiveconsoles = getcurrentactiveconsolecount(); + + if (newindex < 0) +801002aa: 85 c9 test %ecx,%ecx +801002ac: 78 62 js 80100310 + { + newindex = 0; + } + else if (newindex >= totalactiveconsoles) + { + newindex = totalactiveconsoles - 1; +801002ae: 8d 42 ff lea -0x1(%edx),%eax +801002b1: 39 d1 cmp %edx,%ecx +801002b3: 0f 4d c8 cmovge %eax,%ecx + } + + // make sure the new index isnt just the same as the current selected menu item, we then change the background bits around + // which saves us from redrawing the menu every time the selected item changes + if (newindex != currentmenuitem) +801002b6: 39 cb cmp %ecx,%ebx +801002b8: 74 48 je 80100302 + { + // change the background bits of the last selected item to black + pos = TITLEOFF + ((currentmenuitem + 1) * SCRWIDTH); +801002ba: 8d 54 9b 0a lea 0xa(%ebx,%ebx,4),%edx +801002be: c1 e2 04 shl $0x4,%edx + for (int x = 2; x < MENUWIDTH - 2; x++) +801002c1: 8d 84 12 04 80 0b 80 lea -0x7ff47ffc(%edx,%edx,1),%eax +801002c8: 8d 94 12 32 80 0b 80 lea -0x7ff47fce(%edx,%edx,1),%edx +801002cf: 90 nop + { + crt[pos + x] = (crt[pos + x] & 0x00FF) | 0x0700; +801002d0: c6 40 01 07 movb $0x7,0x1(%eax) + for (int x = 2; x < MENUWIDTH - 2; x++) +801002d4: 83 c0 02 add $0x2,%eax +801002d7: 39 d0 cmp %edx,%eax +801002d9: 75 f5 jne 801002d0 + } + + // change the background bits of the new selected item to the highlight color + pos = TITLEOFF + ((newindex + 1) * SCRWIDTH); +801002db: 8d 54 89 0a lea 0xa(%ecx,%ecx,4),%edx +801002df: c1 e2 04 shl $0x4,%edx + for (int x = 2; x < MENUWIDTH - 2; x++) +801002e2: 8d 84 12 04 80 0b 80 lea -0x7ff47ffc(%edx,%edx,1),%eax +801002e9: 8d 94 12 32 80 0b 80 lea -0x7ff47fce(%edx,%edx,1),%edx + { + crt[pos + x] = crt[pos + x] | 0xCF00; +801002f0: 66 81 08 00 cf orw $0xcf00,(%eax) + for (int x = 2; x < MENUWIDTH - 2; x++) +801002f5: 83 c0 02 add $0x2,%eax +801002f8: 39 c2 cmp %eax,%edx +801002fa: 75 f4 jne 801002f0 + } + + currentmenuitem = newindex; +801002fc: 89 0d c0 b6 11 80 mov %ecx,0x8011b6c0 + } +} +80100302: 8b 5d fc mov -0x4(%ebp),%ebx +80100305: c9 leave +80100306: c3 ret +80100307: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010030e: 66 90 xchg %ax,%ax + newindex = 0; +80100310: 31 c9 xor %ecx,%ecx +80100312: eb a2 jmp 801002b6 +80100314: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010031b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010031f: 90 nop + +80100320 : + } + } +} + +int consoleread(struct inode *ip, char *dst, int n) +{ +80100320: 55 push %ebp +80100321: 89 e5 mov %esp,%ebp +80100323: 57 push %edi +80100324: 56 push %esi +80100325: 53 push %ebx +80100326: 83 ec 1c sub $0x1c,%esp + if (myproc() == 0x0) +80100329: e8 82 4b 00 00 call 80104eb0 +8010032e: 85 c0 test %eax,%eax +80100330: 0f 84 aa 00 00 00 je 801003e0 + inconsoleptr = myproc()->consoleptr; +80100336: e8 75 4b 00 00 call 80104eb0 +8010033b: 8b 58 7c mov 0x7c(%eax),%ebx + if (inconsoleptr == 0) +8010033e: 85 db test %ebx,%ebx +80100340: 0f 84 9a 00 00 00 je 801003e0 + uint target; + int c; + struct vconsole* inconsoleptr = getvalidprocessconsoleptr(); + struct kbdbuffer* consolekbdbuffer = &inconsoleptr->keybuffer; + + iunlock(ip); +80100346: 83 ec 0c sub $0xc,%esp +80100349: ff 75 08 push 0x8(%ebp) + target = n; + acquire(&inconsoleptr->lock); +8010034c: 8d 73 04 lea 0x4(%ebx),%esi + { + release(&inconsoleptr->lock); + ilock(ip); + return -1; + } + sleep(&(consolekbdbuffer->r), &inconsoleptr->lock); +8010034f: 8d bb 5c 10 00 00 lea 0x105c(%ebx),%edi + iunlock(ip); +80100355: e8 f6 29 00 00 call 80102d50 + target = n; +8010035a: 8b 45 10 mov 0x10(%ebp),%eax + acquire(&inconsoleptr->lock); +8010035d: 89 34 24 mov %esi,(%esp) + target = n; +80100360: 89 45 e4 mov %eax,-0x1c(%ebp) + acquire(&inconsoleptr->lock); +80100363: e8 18 58 00 00 call 80105b80 + while (n > 0) +80100368: 83 c4 10 add $0x10,%esp +8010036b: 8b 55 10 mov 0x10(%ebp),%edx +8010036e: 85 d2 test %edx,%edx +80100370: 0f 8e bc 00 00 00 jle 80100432 + while (consolekbdbuffer->r == consolekbdbuffer->w) +80100376: 8b 83 5c 10 00 00 mov 0x105c(%ebx),%eax +8010037c: 3b 83 60 10 00 00 cmp 0x1060(%ebx),%eax +80100382: 74 27 je 801003ab +80100384: eb 7a jmp 80100400 +80100386: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010038d: 8d 76 00 lea 0x0(%esi),%esi + sleep(&(consolekbdbuffer->r), &inconsoleptr->lock); +80100390: 83 ec 08 sub $0x8,%esp +80100393: 56 push %esi +80100394: 57 push %edi +80100395: e8 46 52 00 00 call 801055e0 + while (consolekbdbuffer->r == consolekbdbuffer->w) +8010039a: 8b 83 5c 10 00 00 mov 0x105c(%ebx),%eax +801003a0: 83 c4 10 add $0x10,%esp +801003a3: 3b 83 60 10 00 00 cmp 0x1060(%ebx),%eax +801003a9: 75 55 jne 80100400 + if (myproc()->killed) +801003ab: e8 00 4b 00 00 call 80104eb0 +801003b0: 8b 40 24 mov 0x24(%eax),%eax +801003b3: 85 c0 test %eax,%eax +801003b5: 74 d9 je 80100390 + release(&inconsoleptr->lock); +801003b7: 83 ec 0c sub $0xc,%esp +801003ba: 56 push %esi +801003bb: e8 60 57 00 00 call 80105b20 + ilock(ip); +801003c0: 59 pop %ecx +801003c1: ff 75 08 push 0x8(%ebp) +801003c4: e8 a7 28 00 00 call 80102c70 + return -1; +801003c9: 83 c4 10 add $0x10,%esp + } + release(&inconsoleptr->lock); + ilock(ip); + + return target - n; +} +801003cc: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +801003cf: b8 ff ff ff ff mov $0xffffffff,%eax +} +801003d4: 5b pop %ebx +801003d5: 5e pop %esi +801003d6: 5f pop %edi +801003d7: 5d pop %ebp +801003d8: c3 ret +801003d9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + inconsoleptr = currentconsole; +801003e0: 8b 1d 80 0e 11 80 mov 0x80110e80,%ebx + if (inconsoleptr == 0) +801003e6: 85 db test %ebx,%ebx +801003e8: 0f 85 58 ff ff ff jne 80100346 + inconsoleptr = &consoles[0]; +801003ee: bb a0 0e 11 80 mov $0x80110ea0,%ebx +801003f3: e9 4e ff ff ff jmp 80100346 +801003f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801003ff: 90 nop + c = consolekbdbuffer->buf[consolekbdbuffer->r++ % INPUT_BUF]; +80100400: 8d 50 01 lea 0x1(%eax),%edx +80100403: 89 93 5c 10 00 00 mov %edx,0x105c(%ebx) +80100409: 89 c2 mov %eax,%edx +8010040b: 83 e2 7f and $0x7f,%edx +8010040e: 0f be 8c 13 dc 0f 00 movsbl 0xfdc(%ebx,%edx,1),%ecx +80100415: 00 + if (c == C('D')) +80100416: 80 f9 04 cmp $0x4,%cl +80100419: 74 3a je 80100455 + *dst++ = c; +8010041b: 83 45 0c 01 addl $0x1,0xc(%ebp) +8010041f: 8b 45 0c mov 0xc(%ebp),%eax + --n; +80100422: 83 6d 10 01 subl $0x1,0x10(%ebp) + *dst++ = c; +80100426: 88 48 ff mov %cl,-0x1(%eax) + if (c == '\n') +80100429: 83 f9 0a cmp $0xa,%ecx +8010042c: 0f 85 39 ff ff ff jne 8010036b + release(&inconsoleptr->lock); +80100432: 83 ec 0c sub $0xc,%esp +80100435: 56 push %esi +80100436: e8 e5 56 00 00 call 80105b20 + ilock(ip); +8010043b: 58 pop %eax +8010043c: ff 75 08 push 0x8(%ebp) +8010043f: e8 2c 28 00 00 call 80102c70 + return target - n; +80100444: 8b 45 e4 mov -0x1c(%ebp),%eax +80100447: 83 c4 10 add $0x10,%esp +8010044a: 2b 45 10 sub 0x10(%ebp),%eax +} +8010044d: 8d 65 f4 lea -0xc(%ebp),%esp +80100450: 5b pop %ebx +80100451: 5e pop %esi +80100452: 5f pop %edi +80100453: 5d pop %ebp +80100454: c3 ret + if (n < target) +80100455: 8b 4d e4 mov -0x1c(%ebp),%ecx +80100458: 39 4d 10 cmp %ecx,0x10(%ebp) +8010045b: 73 d5 jae 80100432 + consolekbdbuffer->r--; +8010045d: 89 83 5c 10 00 00 mov %eax,0x105c(%ebx) +80100463: eb cd jmp 80100432 +80100465: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010046c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80100470 : +{ +80100470: 55 push %ebp +80100471: 89 e5 mov %esp,%ebp + return consolein->consoleindex; +80100473: 8b 45 08 mov 0x8(%ebp),%eax +} +80100476: 5d pop %ebp + return consolein->consoleindex; +80100477: 8b 00 mov (%eax),%eax +} +80100479: c3 ret +8010047a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80100480 : +{ +80100480: 55 push %ebp +80100481: 89 e5 mov %esp,%ebp +80100483: 56 push %esi +80100484: 53 push %ebx +80100485: 83 ec 30 sub $0x30,%esp +static inline void loadgs(ushort v) { + asm volatile ("movw %0, %%gs" : : "r" (v)); +} + +static inline void cli(void) { + asm volatile ("cli"); +80100488: fa cli + cons.locking = 0; +80100489: c7 05 b4 b6 11 80 00 movl $0x0,0x8011b6b4 +80100490: 00 00 00 + getcallerpcs(&s, pcs); +80100493: 8d 5d d0 lea -0x30(%ebp),%ebx +80100496: 8d 75 f8 lea -0x8(%ebp),%esi + cprintf("lapicid %d: panic: ", lapicid()); +80100499: e8 42 39 00 00 call 80103de0 +8010049e: 83 ec 08 sub $0x8,%esp +801004a1: 50 push %eax +801004a2: 68 8d 89 10 80 push $0x8010898d +801004a7: e8 e4 03 00 00 call 80100890 + cprintf(s); +801004ac: 58 pop %eax +801004ad: ff 75 08 push 0x8(%ebp) +801004b0: e8 db 03 00 00 call 80100890 + cprintf("\n"); +801004b5: c7 04 24 b3 94 10 80 movl $0x801094b3,(%esp) +801004bc: e8 cf 03 00 00 call 80100890 + getcallerpcs(&s, pcs); +801004c1: 8d 45 08 lea 0x8(%ebp),%eax +801004c4: 5a pop %edx +801004c5: 59 pop %ecx +801004c6: 53 push %ebx +801004c7: 50 push %eax +801004c8: e8 03 55 00 00 call 801059d0 + for (i = 0; i < 10; i++) +801004cd: 83 c4 10 add $0x10,%esp + cprintf(" %p", pcs[i]); +801004d0: 83 ec 08 sub $0x8,%esp +801004d3: ff 33 push (%ebx) + for (i = 0; i < 10; i++) +801004d5: 83 c3 04 add $0x4,%ebx + cprintf(" %p", pcs[i]); +801004d8: 68 a1 89 10 80 push $0x801089a1 +801004dd: e8 ae 03 00 00 call 80100890 + for (i = 0; i < 10; i++) +801004e2: 83 c4 10 add $0x10,%esp +801004e5: 39 f3 cmp %esi,%ebx +801004e7: 75 e7 jne 801004d0 + panicked = 1; // freeze other CPU +801004e9: c7 05 b8 b6 11 80 01 movl $0x1,0x8011b6b8 +801004f0: 00 00 00 + for (;;) +801004f3: eb fe jmp 801004f3 +801004f5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801004fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80100500 : +{ +80100500: 55 push %ebp +80100501: 89 e5 mov %esp,%ebp +80100503: 57 push %edi +80100504: 56 push %esi +80100505: 89 c6 mov %eax,%esi +80100507: 53 push %ebx +80100508: 83 ec 2c sub $0x2c,%esp + if (myproc() == 0x0) +8010050b: e8 a0 49 00 00 call 80104eb0 +80100510: 85 c0 test %eax,%eax +80100512: 0f 84 f8 00 00 00 je 80100610 + inconsoleptr = myproc()->consoleptr; +80100518: e8 93 49 00 00 call 80104eb0 +8010051d: 8b 78 7c mov 0x7c(%eax),%edi + if (inconsoleptr == 0) +80100520: 85 ff test %edi,%edi +80100522: 0f 84 e8 00 00 00 je 80100610 + if (inconsoleptr->inuse) +80100528: 8b 8f 70 10 00 00 mov 0x1070(%edi),%ecx + ushort *currentbuffer = inconsoleptr->screenbuffer; +8010052e: 8d 47 3c lea 0x3c(%edi),%eax +80100531: 89 45 e4 mov %eax,-0x1c(%ebp) + if (inconsoleptr->inuse) +80100534: 85 c9 test %ecx,%ecx +80100536: 0f 84 04 01 00 00 je 80100640 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +8010053c: bb d4 03 00 00 mov $0x3d4,%ebx +80100541: b8 0e 00 00 00 mov $0xe,%eax +80100546: 89 da mov %ebx,%edx +80100548: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80100549: ba d5 03 00 00 mov $0x3d5,%edx +8010054e: ec in (%dx),%al + pos = inb(CRTPORT + 1) << 8; +8010054f: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80100552: 89 da mov %ebx,%edx +80100554: c1 e0 08 shl $0x8,%eax +80100557: 89 45 e0 mov %eax,-0x20(%ebp) +8010055a: b8 0f 00 00 00 mov $0xf,%eax +8010055f: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80100560: ba d5 03 00 00 mov $0x3d5,%edx +80100565: ec in (%dx),%al + pos |= inb(CRTPORT + 1); +80100566: 0f b6 d8 movzbl %al,%ebx +80100569: 0b 5d e0 or -0x20(%ebp),%ebx + if (c == '\n') +8010056c: 83 fe 0a cmp $0xa,%esi +8010056f: 0f 84 da 00 00 00 je 8010064f + else if (c == BACKSPACE) +80100575: 81 fe 00 01 00 00 cmp $0x100,%esi +8010057b: 0f 84 ef 00 00 00 je 80100670 + crt[pos] = (c & 0xff) | 0x0700; // black on white +80100581: 89 f2 mov %esi,%edx + currentbuffer[pos] = 0; // Clear the character from the buffer +80100583: 8d 04 1b lea (%ebx,%ebx,1),%eax + crt[pos] = (c & 0xff) | 0x0700; // black on white +80100586: 0f b6 f2 movzbl %dl,%esi +80100589: 66 81 ce 00 07 or $0x700,%si + if (inconsoleptr->inuse) +8010058e: 85 c9 test %ecx,%ecx +80100590: 74 07 je 80100599 + crt[pos] = (c & 0xff) | 0x0700; // black on white +80100592: 66 89 b0 00 80 0b 80 mov %si,-0x7ff48000(%eax) + currentbuffer[pos] = (c & 0xff) | 0x0700; // black on white +80100599: 8b 4d e4 mov -0x1c(%ebp),%ecx + pos++; +8010059c: 83 c3 01 add $0x1,%ebx + currentbuffer[pos] = (c & 0xff) | 0x0700; // black on white +8010059f: 66 89 34 01 mov %si,(%ecx,%eax,1) + if (pos < TITLEOFF || pos > SCRHEIGHT * SCRWIDTH) +801005a3: 8d 73 b0 lea -0x50(%ebx),%esi +801005a6: 81 fe 80 07 00 00 cmp $0x780,%esi +801005ac: 0f 87 1f 02 00 00 ja 801007d1 + if ((pos / 80) >= 24) +801005b2: 81 fb 7f 07 00 00 cmp $0x77f,%ebx +801005b8: 0f 8f d2 00 00 00 jg 80100690 + if (inconsoleptr->inuse) +801005be: 8b 87 70 10 00 00 mov 0x1070(%edi),%eax + inconsoleptr->pos = pos; +801005c4: 89 9f 68 10 00 00 mov %ebx,0x1068(%edi) + if (inconsoleptr->inuse) +801005ca: 85 c0 test %eax,%eax +801005cc: 74 34 je 80100602 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +801005ce: be d4 03 00 00 mov $0x3d4,%esi +801005d3: b8 0e 00 00 00 mov $0xe,%eax +801005d8: 89 f2 mov %esi,%edx +801005da: ee out %al,(%dx) +801005db: b9 d5 03 00 00 mov $0x3d5,%ecx + outb(CRTPORT + 1, pos >> 8); +801005e0: 89 d8 mov %ebx,%eax +801005e2: c1 f8 08 sar $0x8,%eax +801005e5: 89 ca mov %ecx,%edx +801005e7: ee out %al,(%dx) +801005e8: b8 0f 00 00 00 mov $0xf,%eax +801005ed: 89 f2 mov %esi,%edx +801005ef: ee out %al,(%dx) +801005f0: 89 d8 mov %ebx,%eax +801005f2: 89 ca mov %ecx,%edx +801005f4: ee out %al,(%dx) + crt[pos] = ' ' | 0x0700; +801005f5: b8 20 07 00 00 mov $0x720,%eax +801005fa: 66 89 84 1b 00 80 0b mov %ax,-0x7ff48000(%ebx,%ebx,1) +80100601: 80 +} +80100602: 8d 65 f4 lea -0xc(%ebp),%esp +80100605: 5b pop %ebx +80100606: 5e pop %esi +80100607: 5f pop %edi +80100608: 5d pop %ebp +80100609: c3 ret +8010060a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + inconsoleptr = currentconsole; +80100610: 8b 3d 80 0e 11 80 mov 0x80110e80,%edi + if (inconsoleptr == 0) +80100616: 85 ff test %edi,%edi +80100618: 0f 85 0a ff ff ff jne 80100528 + inconsoleptr = &consoles[0]; +8010061e: bf a0 0e 11 80 mov $0x80110ea0,%edi + if (inconsoleptr->inuse) +80100623: 8b 8f 70 10 00 00 mov 0x1070(%edi),%ecx + ushort *currentbuffer = inconsoleptr->screenbuffer; +80100629: 8d 47 3c lea 0x3c(%edi),%eax +8010062c: 89 45 e4 mov %eax,-0x1c(%ebp) + if (inconsoleptr->inuse) +8010062f: 85 c9 test %ecx,%ecx +80100631: 0f 85 05 ff ff ff jne 8010053c +80100637: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010063e: 66 90 xchg %ax,%ax + pos = inconsoleptr->pos; +80100640: 8b 9f 68 10 00 00 mov 0x1068(%edi),%ebx + if (c == '\n') +80100646: 83 fe 0a cmp $0xa,%esi +80100649: 0f 85 26 ff ff ff jne 80100575 + pos += SCRWIDTH - pos % SCRWIDTH; +8010064f: 89 d8 mov %ebx,%eax +80100651: ba 67 66 66 66 mov $0x66666667,%edx +80100656: c1 fb 1f sar $0x1f,%ebx +80100659: f7 ea imul %edx +8010065b: c1 fa 05 sar $0x5,%edx +8010065e: 29 da sub %ebx,%edx +80100660: 8d 04 92 lea (%edx,%edx,4),%eax +80100663: c1 e0 04 shl $0x4,%eax +80100666: 8d 58 50 lea 0x50(%eax),%ebx +80100669: e9 35 ff ff ff jmp 801005a3 +8010066e: 66 90 xchg %ax,%ax + if (pos > (TITLEOFF)) +80100670: 83 fb 50 cmp $0x50,%ebx +80100673: 0f 8e 2a ff ff ff jle 801005a3 + currentbuffer[pos] = 0; // Clear the character from the buffer +80100679: 8b 45 e4 mov -0x1c(%ebp),%eax +8010067c: 31 f6 xor %esi,%esi +8010067e: 66 89 34 58 mov %si,(%eax,%ebx,2) + --pos; +80100682: 83 eb 01 sub $0x1,%ebx +80100685: e9 19 ff ff ff jmp 801005a3 +8010068a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + memmove(currentbuffer + TITLEOFF, currentbuffer + (SCRWIDTH + TITLEOFF), sizeof(crt[0]) * (SCRHEIGHT - 1) * SCRWIDTH); +80100690: 83 ec 04 sub $0x4,%esp +80100693: 8d 87 7c 01 00 00 lea 0x17c(%edi),%eax + pos -= 80; +80100699: 89 f3 mov %esi,%ebx + memmove(currentbuffer + TITLEOFF, currentbuffer + (SCRWIDTH + TITLEOFF), sizeof(crt[0]) * (SCRHEIGHT - 1) * SCRWIDTH); +8010069b: 68 00 0f 00 00 push $0xf00 +801006a0: 50 push %eax +801006a1: 8d 87 dc 00 00 00 lea 0xdc(%edi),%eax +801006a7: 50 push %eax +801006a8: e8 33 56 00 00 call 80105ce0 + memset(currentbuffer + pos, 0, sizeof(crt[0]) * (SCRHEIGHT * SCRWIDTH - pos)); +801006ad: b8 d0 07 00 00 mov $0x7d0,%eax +801006b2: 83 c4 0c add $0xc,%esp +801006b5: 8d 0c 36 lea (%esi,%esi,1),%ecx +801006b8: 29 f0 sub %esi,%eax +801006ba: 89 4d dc mov %ecx,-0x24(%ebp) +801006bd: 01 c0 add %eax,%eax +801006bf: 50 push %eax +801006c0: 89 45 e0 mov %eax,-0x20(%ebp) +801006c3: 8b 45 e4 mov -0x1c(%ebp),%eax +801006c6: 6a 00 push $0x0 +801006c8: 01 c8 add %ecx,%eax +801006ca: 50 push %eax +801006cb: e8 70 55 00 00 call 80105c40 + if (inconsoleptr->inuse) +801006d0: 8b 8f 70 10 00 00 mov 0x1070(%edi),%ecx +801006d6: 83 c4 10 add $0x10,%esp +801006d9: 85 c9 test %ecx,%ecx +801006db: 0f 84 c7 00 00 00 je 801007a8 + if (menuactive) +801006e1: 8b 15 bc b6 11 80 mov 0x8011b6bc,%edx +801006e7: 85 d2 test %edx,%edx +801006e9: 0f 84 d1 00 00 00 je 801007c0 +801006ef: b8 0c 1f 11 80 mov $0x80111f0c,%eax + int resultcount = 0; +801006f4: 31 d2 xor %edx,%edx +801006f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801006fd: 8d 76 00 lea 0x0(%esi),%esi + resultcount++; +80100700: 83 38 01 cmpl $0x1,(%eax) +80100703: 83 da ff sbb $0xffffffff,%edx + for (int i = 0; i < MAXVCONSOLES; i++) +80100706: 05 b0 10 00 00 add $0x10b0,%eax +8010070b: 3d ec c5 11 80 cmp $0x8011c5ec,%eax +80100710: 75 ee jne 80100700 + for (int y = 0; y < menuitems; y++) +80100712: 89 55 d8 mov %edx,-0x28(%ebp) + int menuitems = getcurrentactiveconsolecount() + 3; +80100715: be d6 80 0b 80 mov $0x800b80d6,%esi +8010071a: 8d 42 03 lea 0x3(%edx),%eax + for (int y = 0; y < menuitems; y++) +8010071d: 31 c9 xor %ecx,%ecx +8010071f: 89 5d e4 mov %ebx,-0x1c(%ebp) +80100722: 89 cb mov %ecx,%ebx +80100724: 89 7d d4 mov %edi,-0x2c(%ebp) +80100727: 89 f7 mov %esi,%edi +80100729: 89 c6 mov %eax,%esi +8010072b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010072f: 90 nop + memmove(crt + menuoffset + TITLEOFF + MENUWIDTH, crt + menuoffset + (SCRWIDTH + TITLEOFF) + MENUWIDTH, sizeof(crt[0]) * (SCRWIDTH - MENUWIDTH)); +80100730: 83 ec 04 sub $0x4,%esp +80100733: 89 f8 mov %edi,%eax +80100735: 81 c7 a0 00 00 00 add $0xa0,%edi + for (int y = 0; y < menuitems; y++) +8010073b: 83 c3 01 add $0x1,%ebx + memmove(crt + menuoffset + TITLEOFF + MENUWIDTH, crt + menuoffset + (SCRWIDTH + TITLEOFF) + MENUWIDTH, sizeof(crt[0]) * (SCRWIDTH - MENUWIDTH)); +8010073e: 6a 6a push $0x6a +80100740: 57 push %edi +80100741: 50 push %eax +80100742: e8 99 55 00 00 call 80105ce0 + for (int y = 0; y < menuitems; y++) +80100747: 83 c4 10 add $0x10,%esp +8010074a: 39 de cmp %ebx,%esi +8010074c: 75 e2 jne 80100730 +8010074e: 8b 55 d8 mov -0x28(%ebp),%edx +80100751: 8b 5d e4 mov -0x1c(%ebp),%ebx +80100754: 8b 7d d4 mov -0x2c(%ebp),%edi +80100757: 8d 04 92 lea (%edx,%edx,4),%eax + memmove(crt + TITLEOFF + menuoffset, crt + (SCRWIDTH + TITLEOFF) + menuoffset, (sizeof(crt[0]) * (SCRHEIGHT - 1) * SCRWIDTH) - menuoffset); +8010075a: ba 10 0e 00 00 mov $0xe10,%edx +8010075f: c1 e0 04 shl $0x4,%eax +80100762: 29 c2 sub %eax,%edx +80100764: 8d 84 00 20 03 00 00 lea 0x320(%eax,%eax,1),%eax +8010076b: 8d 88 00 80 0b 80 lea -0x7ff48000(%eax),%ecx +80100771: 2d a0 80 f4 7f sub $0x7ff480a0,%eax +80100776: 83 ec 04 sub $0x4,%esp +80100779: 52 push %edx +8010077a: 51 push %ecx +8010077b: 50 push %eax +8010077c: e8 5f 55 00 00 call 80105ce0 + memset(crt + pos, 0, sizeof(crt[0]) * (SCRHEIGHT * SCRWIDTH - pos)); +80100781: 8b 45 dc mov -0x24(%ebp),%eax +80100784: 83 c4 0c add $0xc,%esp +80100787: ff 75 e0 push -0x20(%ebp) +8010078a: 6a 00 push $0x0 +8010078c: 2d 00 80 f4 7f sub $0x7ff48000,%eax +80100791: 50 push %eax +80100792: e8 a9 54 00 00 call 80105c40 + if (inconsoleptr->inuse) +80100797: 8b 87 70 10 00 00 mov 0x1070(%edi),%eax +8010079d: 83 c4 10 add $0x10,%esp +801007a0: e9 1f fe ff ff jmp 801005c4 +801007a5: 8d 76 00 lea 0x0(%esi),%esi + inconsoleptr->pos = pos; +801007a8: 89 b7 68 10 00 00 mov %esi,0x1068(%edi) +} +801007ae: 8d 65 f4 lea -0xc(%ebp),%esp +801007b1: 5b pop %ebx +801007b2: 5e pop %esi +801007b3: 5f pop %edi +801007b4: 5d pop %ebp +801007b5: c3 ret +801007b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801007bd: 8d 76 00 lea 0x0(%esi),%esi +801007c0: b8 a0 80 0b 80 mov $0x800b80a0,%eax +801007c5: b9 40 81 0b 80 mov $0x800b8140,%ecx +801007ca: ba 00 0f 00 00 mov $0xf00,%edx +801007cf: eb a5 jmp 80100776 + panic("pos under/overflow"); +801007d1: 83 ec 0c sub $0xc,%esp +801007d4: 68 a5 89 10 80 push $0x801089a5 +801007d9: e8 a2 fc ff ff call 80100480 +801007de: 66 90 xchg %ax,%ax + +801007e0 : + +int consolewrite(struct inode *ip, char *buf, int n) +{ +801007e0: 55 push %ebp +801007e1: 89 e5 mov %esp,%ebp +801007e3: 57 push %edi +801007e4: 56 push %esi +801007e5: 53 push %ebx +801007e6: 83 ec 1c sub $0x1c,%esp + if (myproc() == 0x0) +801007e9: e8 c2 46 00 00 call 80104eb0 +801007ee: 85 c0 test %eax,%eax +801007f0: 74 4e je 80100840 + inconsoleptr = myproc()->consoleptr; +801007f2: e8 b9 46 00 00 call 80104eb0 +801007f7: 8b 58 7c mov 0x7c(%eax),%ebx + if (inconsoleptr == 0) +801007fa: 85 db test %ebx,%ebx +801007fc: 74 42 je 80100840 + int i; + struct vconsole* inconsoleptr = getvalidprocessconsoleptr(); + + iunlock(ip); +801007fe: 83 ec 0c sub $0xc,%esp +80100801: ff 75 08 push 0x8(%ebp) + acquire(&inconsoleptr->lock); +80100804: 83 c3 04 add $0x4,%ebx + iunlock(ip); +80100807: e8 44 25 00 00 call 80102d50 + acquire(&inconsoleptr->lock); +8010080c: 89 1c 24 mov %ebx,(%esp) +8010080f: e8 6c 53 00 00 call 80105b80 + for (i = 0; i < n; i++) +80100814: 8b 4d 10 mov 0x10(%ebp),%ecx +80100817: 83 c4 10 add $0x10,%esp +8010081a: 85 c9 test %ecx,%ecx +8010081c: 7e 51 jle 8010086f +8010081e: 8b 75 0c mov 0xc(%ebp),%esi +80100821: 8b 7d 10 mov 0x10(%ebp),%edi +80100824: 01 f7 add %esi,%edi + if (panicked) +80100826: 8b 15 b8 b6 11 80 mov 0x8011b6b8,%edx + { + consputc(buf[i] & 0xff); +8010082c: 0f b6 06 movzbl (%esi),%eax + if (panicked) +8010082f: 85 d2 test %edx,%edx +80100831: 74 1e je 80100851 + asm volatile ("cli"); +80100833: fa cli + for (;;) +80100834: eb fe jmp 80100834 +80100836: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010083d: 8d 76 00 lea 0x0(%esi),%esi + inconsoleptr = currentconsole; +80100840: 8b 1d 80 0e 11 80 mov 0x80110e80,%ebx + if (inconsoleptr == 0) +80100846: 85 db test %ebx,%ebx +80100848: 75 b4 jne 801007fe + inconsoleptr = &consoles[0]; +8010084a: bb a0 0e 11 80 mov $0x80110ea0,%ebx +8010084f: eb ad jmp 801007fe + uartputc(c); +80100851: 83 ec 0c sub $0xc,%esp +80100854: 89 45 e4 mov %eax,-0x1c(%ebp) + for (i = 0; i < n; i++) +80100857: 83 c6 01 add $0x1,%esi + uartputc(c); +8010085a: 50 push %eax +8010085b: e8 f0 6b 00 00 call 80107450 + cgaputc(c); +80100860: 8b 45 e4 mov -0x1c(%ebp),%eax +80100863: e8 98 fc ff ff call 80100500 + for (i = 0; i < n; i++) +80100868: 83 c4 10 add $0x10,%esp +8010086b: 39 f7 cmp %esi,%edi +8010086d: 75 b7 jne 80100826 + } + release(&inconsoleptr->lock); +8010086f: 83 ec 0c sub $0xc,%esp +80100872: 53 push %ebx +80100873: e8 a8 52 00 00 call 80105b20 + ilock(ip); +80100878: 58 pop %eax +80100879: ff 75 08 push 0x8(%ebp) +8010087c: e8 ef 23 00 00 call 80102c70 + + return n; +} +80100881: 8b 45 10 mov 0x10(%ebp),%eax +80100884: 8d 65 f4 lea -0xc(%ebp),%esp +80100887: 5b pop %ebx +80100888: 5e pop %esi +80100889: 5f pop %edi +8010088a: 5d pop %ebp +8010088b: c3 ret +8010088c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80100890 : +{ +80100890: 55 push %ebp +80100891: 89 e5 mov %esp,%ebp +80100893: 57 push %edi +80100894: 56 push %esi +80100895: 53 push %ebx +80100896: 83 ec 3c sub $0x3c,%esp + if (myproc() == 0x0) +80100899: e8 12 46 00 00 call 80104eb0 +8010089e: 85 c0 test %eax,%eax +801008a0: 0f 84 7a 01 00 00 je 80100a20 + inconsoleptr = myproc()->consoleptr; +801008a6: e8 05 46 00 00 call 80104eb0 +801008ab: 8b 40 7c mov 0x7c(%eax),%eax +801008ae: 89 45 cc mov %eax,-0x34(%ebp) + if (inconsoleptr == 0) +801008b1: 85 c0 test %eax,%eax +801008b3: 0f 84 67 01 00 00 je 80100a20 + locking = cons.locking; +801008b9: a1 b4 b6 11 80 mov 0x8011b6b4,%eax +801008be: 89 45 c4 mov %eax,-0x3c(%ebp) + if (locking) +801008c1: 85 c0 test %eax,%eax +801008c3: 0f 85 87 01 00 00 jne 80100a50 + if (fmt == 0) +801008c9: 8b 45 08 mov 0x8(%ebp),%eax +801008cc: 89 45 d0 mov %eax,-0x30(%ebp) +801008cf: 85 c0 test %eax,%eax +801008d1: 0f 84 10 03 00 00 je 80100be7 + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +801008d7: 0f b6 18 movzbl (%eax),%ebx + argp = (uint *)(void *)(&fmt + 1); +801008da: 8d 45 0c lea 0xc(%ebp),%eax + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +801008dd: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) + argp = (uint *)(void *)(&fmt + 1); +801008e4: 89 45 c8 mov %eax,-0x38(%ebp) + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +801008e7: 85 db test %ebx,%ebx +801008e9: 0f 84 e2 01 00 00 je 80100ad1 + if (c != '%') +801008ef: 83 fb 25 cmp $0x25,%ebx +801008f2: 0f 85 78 01 00 00 jne 80100a70 + c = fmt[++i] & 0xff; +801008f8: 83 45 d4 01 addl $0x1,-0x2c(%ebp) +801008fc: 8b 75 d0 mov -0x30(%ebp),%esi +801008ff: 8b 45 d4 mov -0x2c(%ebp),%eax +80100902: 0f b6 1c 06 movzbl (%esi,%eax,1),%ebx + if (c == 0) +80100906: 85 db test %ebx,%ebx +80100908: 0f 84 c3 01 00 00 je 80100ad1 + switch (c) +8010090e: 83 fb 70 cmp $0x70,%ebx +80100911: 0f 84 c2 00 00 00 je 801009d9 +80100917: 7f 7f jg 80100998 +80100919: 83 fb 25 cmp $0x25,%ebx +8010091c: 0f 84 c6 01 00 00 je 80100ae8 +80100922: 83 fb 64 cmp $0x64,%ebx +80100925: 0f 85 d5 01 00 00 jne 80100b00 + printint(*argp++, 10, 1); +8010092b: 8b 45 c8 mov -0x38(%ebp),%eax +8010092e: 8b 08 mov (%eax),%ecx + x = -xx; +80100930: 89 c8 mov %ecx,%eax + printint(*argp++, 10, 1); +80100932: 89 4d c0 mov %ecx,-0x40(%ebp) + x = -xx; +80100935: f7 d8 neg %eax +80100937: 0f 49 c8 cmovns %eax,%ecx + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +8010093a: 31 db xor %ebx,%ebx +8010093c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + buf[i++] = digits[x % base]; +80100940: b8 cd cc cc cc mov $0xcccccccd,%eax +80100945: 89 cf mov %ecx,%edi +80100947: 89 de mov %ebx,%esi +80100949: f7 e1 mul %ecx +8010094b: 8d 5b 01 lea 0x1(%ebx),%ebx +8010094e: c1 ea 03 shr $0x3,%edx +80100951: 8d 04 92 lea (%edx,%edx,4),%eax +80100954: 01 c0 add %eax,%eax +80100956: 29 c7 sub %eax,%edi +80100958: 0f b6 87 90 8a 10 80 movzbl -0x7fef7570(%edi),%eax +8010095f: 88 44 1d d7 mov %al,-0x29(%ebp,%ebx,1) + } while ((x /= base) != 0); +80100963: 89 c8 mov %ecx,%eax +80100965: 89 d1 mov %edx,%ecx +80100967: 83 f8 09 cmp $0x9,%eax +8010096a: 77 d4 ja 80100940 + if (sign) +8010096c: 8b 7d c0 mov -0x40(%ebp),%edi +8010096f: 85 ff test %edi,%edi +80100971: 79 07 jns 8010097a + buf[i++] = '-'; +80100973: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; +80100978: 89 de mov %ebx,%esi + while (--i >= 0) +8010097a: 8d 45 d8 lea -0x28(%ebp),%eax +8010097d: 01 c6 add %eax,%esi + if (panicked) +8010097f: 8b 0d b8 b6 11 80 mov 0x8011b6b8,%ecx + consputc(buf[i]); +80100985: 0f be 1e movsbl (%esi),%ebx + if (panicked) +80100988: 85 c9 test %ecx,%ecx +8010098a: 0f 84 88 01 00 00 je 80100b18 +80100990: fa cli + for (;;) +80100991: eb fe jmp 80100991 +80100993: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80100997: 90 nop + switch (c) +80100998: 83 fb 73 cmp $0x73,%ebx +8010099b: 75 33 jne 801009d0 + if ((s = (char *)*argp++) == 0) +8010099d: 8b 45 c8 mov -0x38(%ebp),%eax +801009a0: 8b 30 mov (%eax),%esi +801009a2: 8d 58 04 lea 0x4(%eax),%ebx +801009a5: 85 f6 test %esi,%esi +801009a7: 0f 84 02 02 00 00 je 80100baf + for (; *s; s++) +801009ad: 0f b6 06 movzbl (%esi),%eax +801009b0: 84 c0 test %al,%al +801009b2: 0f 84 ac 01 00 00 je 80100b64 + if (panicked) +801009b8: 8b 3d b8 b6 11 80 mov 0x8011b6b8,%edi +801009be: 85 ff test %edi,%edi +801009c0: 0f 84 7a 01 00 00 je 80100b40 +801009c6: fa cli + for (;;) +801009c7: eb fe jmp 801009c7 +801009c9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + switch (c) +801009d0: 83 fb 78 cmp $0x78,%ebx +801009d3: 0f 85 27 01 00 00 jne 80100b00 + printint(*argp++, 16, 0); +801009d9: 8b 45 c8 mov -0x38(%ebp),%eax +801009dc: 8b 08 mov (%eax),%ecx + i = 0; +801009de: 31 c0 xor %eax,%eax + buf[i++] = digits[x % base]; +801009e0: 89 ca mov %ecx,%edx +801009e2: 89 c3 mov %eax,%ebx +801009e4: 83 c0 01 add $0x1,%eax +801009e7: 83 e2 0f and $0xf,%edx +801009ea: 0f b6 92 90 8a 10 80 movzbl -0x7fef7570(%edx),%edx +801009f1: 88 54 05 d7 mov %dl,-0x29(%ebp,%eax,1) + } while ((x /= base) != 0); +801009f5: 89 ca mov %ecx,%edx +801009f7: c1 e9 04 shr $0x4,%ecx +801009fa: 83 fa 0f cmp $0xf,%edx +801009fd: 77 e1 ja 801009e0 +801009ff: 8d 45 d8 lea -0x28(%ebp),%eax +80100a02: 01 c3 add %eax,%ebx + if (panicked) +80100a04: 8b 15 b8 b6 11 80 mov 0x8011b6b8,%edx + consputc(buf[i]); +80100a0a: 0f b6 03 movzbl (%ebx),%eax + if (panicked) +80100a0d: 85 d2 test %edx,%edx +80100a0f: 0f 84 57 01 00 00 je 80100b6c +80100a15: fa cli + for (;;) +80100a16: eb fe jmp 80100a16 +80100a18: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100a1f: 90 nop + inconsoleptr = currentconsole; +80100a20: a1 80 0e 11 80 mov 0x80110e80,%eax +80100a25: 89 45 cc mov %eax,-0x34(%ebp) + if (inconsoleptr == 0) +80100a28: 85 c0 test %eax,%eax +80100a2a: 0f 85 89 fe ff ff jne 801008b9 + locking = cons.locking; +80100a30: a1 b4 b6 11 80 mov 0x8011b6b4,%eax + inconsoleptr = &consoles[0]; +80100a35: c7 45 cc a0 0e 11 80 movl $0x80110ea0,-0x34(%ebp) + locking = cons.locking; +80100a3c: 89 45 c4 mov %eax,-0x3c(%ebp) + if (locking) +80100a3f: 85 c0 test %eax,%eax +80100a41: 0f 84 82 fe ff ff je 801008c9 +80100a47: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100a4e: 66 90 xchg %ax,%ax + acquire(&inconsoleptr->lock); +80100a50: 8b 45 cc mov -0x34(%ebp),%eax +80100a53: 83 ec 0c sub $0xc,%esp +80100a56: 83 c0 04 add $0x4,%eax +80100a59: 50 push %eax +80100a5a: e8 21 51 00 00 call 80105b80 +80100a5f: 83 c4 10 add $0x10,%esp +80100a62: e9 62 fe ff ff jmp 801008c9 +80100a67: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100a6e: 66 90 xchg %ax,%ax + if (panicked) +80100a70: a1 b8 b6 11 80 mov 0x8011b6b8,%eax +80100a75: 85 c0 test %eax,%eax +80100a77: 74 2f je 80100aa8 +80100a79: fa cli + for (;;) +80100a7a: eb fe jmp 80100a7a +80100a7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + uartputc(c); +80100a80: 83 ec 0c sub $0xc,%esp +80100a83: 6a 25 push $0x25 +80100a85: e8 c6 69 00 00 call 80107450 + cgaputc(c); +80100a8a: b8 25 00 00 00 mov $0x25,%eax +80100a8f: e8 6c fa ff ff call 80100500 + if (panicked) +80100a94: a1 b8 b6 11 80 mov 0x8011b6b8,%eax +80100a99: 83 c4 10 add $0x10,%esp +80100a9c: 85 c0 test %eax,%eax +80100a9e: 0f 85 23 01 00 00 jne 80100bc7 +80100aa4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + uartputc(c); +80100aa8: 83 ec 0c sub $0xc,%esp +80100aab: 53 push %ebx +80100aac: e8 9f 69 00 00 call 80107450 + cgaputc(c); +80100ab1: 89 d8 mov %ebx,%eax +80100ab3: e8 48 fa ff ff call 80100500 +} +80100ab8: 83 c4 10 add $0x10,%esp + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100abb: 83 45 d4 01 addl $0x1,-0x2c(%ebp) +80100abf: 8b 75 d0 mov -0x30(%ebp),%esi +80100ac2: 8b 45 d4 mov -0x2c(%ebp),%eax +80100ac5: 0f b6 1c 06 movzbl (%esi,%eax,1),%ebx +80100ac9: 85 db test %ebx,%ebx +80100acb: 0f 85 1e fe ff ff jne 801008ef + if (locking) +80100ad1: 8b 45 c4 mov -0x3c(%ebp),%eax +80100ad4: 85 c0 test %eax,%eax +80100ad6: 0f 85 f4 00 00 00 jne 80100bd0 +} +80100adc: 8d 65 f4 lea -0xc(%ebp),%esp +80100adf: 5b pop %ebx +80100ae0: 5e pop %esi +80100ae1: 5f pop %edi +80100ae2: 5d pop %ebp +80100ae3: c3 ret +80100ae4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (panicked) +80100ae8: 8b 0d b8 b6 11 80 mov 0x8011b6b8,%ecx +80100aee: 85 c9 test %ecx,%ecx +80100af0: 0f 84 9d 00 00 00 je 80100b93 +80100af6: fa cli + for (;;) +80100af7: eb fe jmp 80100af7 +80100af9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (panicked) +80100b00: 8b 15 b8 b6 11 80 mov 0x8011b6b8,%edx +80100b06: 85 d2 test %edx,%edx +80100b08: 0f 84 72 ff ff ff je 80100a80 +80100b0e: fa cli + for (;;) +80100b0f: eb fe jmp 80100b0f +80100b11: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + uartputc(c); +80100b18: 83 ec 0c sub $0xc,%esp + while (--i >= 0) +80100b1b: 8d 7d d8 lea -0x28(%ebp),%edi + uartputc(c); +80100b1e: 53 push %ebx +80100b1f: e8 2c 69 00 00 call 80107450 + cgaputc(c); +80100b24: 89 d8 mov %ebx,%eax +80100b26: e8 d5 f9 ff ff call 80100500 + while (--i >= 0) +80100b2b: 8d 46 ff lea -0x1(%esi),%eax +80100b2e: 83 c4 10 add $0x10,%esp +80100b31: 39 f7 cmp %esi,%edi +80100b33: 0f 84 85 00 00 00 je 80100bbe +80100b39: 89 c6 mov %eax,%esi +80100b3b: e9 3f fe ff ff jmp 8010097f + uartputc(c); +80100b40: 83 ec 0c sub $0xc,%esp + consputc(*s); +80100b43: 0f be f8 movsbl %al,%edi + for (; *s; s++) +80100b46: 83 c6 01 add $0x1,%esi + uartputc(c); +80100b49: 57 push %edi +80100b4a: e8 01 69 00 00 call 80107450 + cgaputc(c); +80100b4f: 89 f8 mov %edi,%eax +80100b51: e8 aa f9 ff ff call 80100500 + for (; *s; s++) +80100b56: 0f b6 06 movzbl (%esi),%eax +80100b59: 83 c4 10 add $0x10,%esp +80100b5c: 84 c0 test %al,%al +80100b5e: 0f 85 54 fe ff ff jne 801009b8 + if ((s = (char *)*argp++) == 0) +80100b64: 89 5d c8 mov %ebx,-0x38(%ebp) +80100b67: e9 4f ff ff ff jmp 80100abb + uartputc(c); +80100b6c: 83 ec 0c sub $0xc,%esp + consputc(buf[i]); +80100b6f: 0f be f0 movsbl %al,%esi + while (--i >= 0) +80100b72: 8d 7d d8 lea -0x28(%ebp),%edi + uartputc(c); +80100b75: 56 push %esi +80100b76: e8 d5 68 00 00 call 80107450 + cgaputc(c); +80100b7b: 89 f0 mov %esi,%eax +80100b7d: e8 7e f9 ff ff call 80100500 + while (--i >= 0) +80100b82: 8d 43 ff lea -0x1(%ebx),%eax +80100b85: 83 c4 10 add $0x10,%esp +80100b88: 39 df cmp %ebx,%edi +80100b8a: 74 32 je 80100bbe +80100b8c: 89 c3 mov %eax,%ebx +80100b8e: e9 71 fe ff ff jmp 80100a04 + uartputc(c); +80100b93: 83 ec 0c sub $0xc,%esp +80100b96: 6a 25 push $0x25 +80100b98: e8 b3 68 00 00 call 80107450 + cgaputc(c); +80100b9d: b8 25 00 00 00 mov $0x25,%eax +80100ba2: e8 59 f9 ff ff call 80100500 +} +80100ba7: 83 c4 10 add $0x10,%esp +80100baa: e9 0c ff ff ff jmp 80100abb + s = "(null)"; +80100baf: be b8 89 10 80 mov $0x801089b8,%esi + for (; *s; s++) +80100bb4: b8 28 00 00 00 mov $0x28,%eax +80100bb9: e9 fa fd ff ff jmp 801009b8 + printint(*argp++, 16, 0); +80100bbe: 83 45 c8 04 addl $0x4,-0x38(%ebp) +} +80100bc2: e9 f4 fe ff ff jmp 80100abb +80100bc7: fa cli + for (;;) +80100bc8: eb fe jmp 80100bc8 +80100bca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + release(&inconsoleptr->lock); +80100bd0: 8b 45 cc mov -0x34(%ebp),%eax +80100bd3: 83 ec 0c sub $0xc,%esp +80100bd6: 83 c0 04 add $0x4,%eax +80100bd9: 50 push %eax +80100bda: e8 41 4f 00 00 call 80105b20 +80100bdf: 83 c4 10 add $0x10,%esp +} +80100be2: e9 f5 fe ff ff jmp 80100adc + panic("null fmt"); +80100be7: 83 ec 0c sub $0xc,%esp +80100bea: 68 bf 89 10 80 push $0x801089bf +80100bef: e8 8c f8 ff ff call 80100480 +80100bf4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100bfb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80100bff: 90 nop + +80100c00 : +{ +80100c00: 55 push %ebp +80100c01: 89 e5 mov %esp,%ebp +80100c03: 57 push %edi +80100c04: 56 push %esi +80100c05: 53 push %ebx +80100c06: 83 ec 3c sub $0x3c,%esp + if (fmt == 0) +80100c09: 8b 45 0c mov 0xc(%ebp),%eax +80100c0c: 89 45 d0 mov %eax,-0x30(%ebp) +80100c0f: 85 c0 test %eax,%eax +80100c11: 0f 84 69 02 00 00 je 80100e80 + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100c17: 0f b6 00 movzbl (%eax),%eax + argp = (uint *)(void *)(&fmt + 1); +80100c1a: 8d 75 10 lea 0x10(%ebp),%esi + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100c1d: 31 ff xor %edi,%edi + si = 0; +80100c1f: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) +80100c26: 89 f3 mov %esi,%ebx +80100c28: 89 fe mov %edi,%esi + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100c2a: 89 c2 mov %eax,%edx +80100c2c: 85 c0 test %eax,%eax +80100c2e: 75 2b jne 80100c5b +80100c30: e9 21 01 00 00 jmp 80100d56 +80100c35: 8d 76 00 lea 0x0(%esi),%esi + strbuffer[si] = c; +80100c38: 8b 45 d4 mov -0x2c(%ebp),%eax +80100c3b: 8b 7d 08 mov 0x8(%ebp),%edi +80100c3e: 88 14 07 mov %dl,(%edi,%eax,1) + si++; +80100c41: 83 c0 01 add $0x1,%eax +80100c44: 89 45 d4 mov %eax,-0x2c(%ebp) + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100c47: 8b 45 d0 mov -0x30(%ebp),%eax +80100c4a: 83 c6 01 add $0x1,%esi +80100c4d: 0f b6 04 30 movzbl (%eax,%esi,1),%eax +80100c51: 89 c2 mov %eax,%edx +80100c53: 85 c0 test %eax,%eax +80100c55: 0f 84 f5 00 00 00 je 80100d50 + if (c != '%') +80100c5b: 83 f8 25 cmp $0x25,%eax +80100c5e: 75 d8 jne 80100c38 + c = fmt[++i] & 0xff; +80100c60: 8b 45 d0 mov -0x30(%ebp),%eax +80100c63: 83 c6 01 add $0x1,%esi +80100c66: 0f b6 04 30 movzbl (%eax,%esi,1),%eax +80100c6a: 89 c2 mov %eax,%edx + if (c == 0) +80100c6c: 85 c0 test %eax,%eax +80100c6e: 0f 84 dc 00 00 00 je 80100d50 + switch (c) +80100c74: 83 f8 70 cmp $0x70,%eax +80100c77: 0f 84 58 01 00 00 je 80100dd5 +80100c7d: 0f 8f e5 00 00 00 jg 80100d68 +80100c83: 83 f8 25 cmp $0x25,%eax +80100c86: 0f 84 e4 01 00 00 je 80100e70 +80100c8c: 83 f8 64 cmp $0x64,%eax +80100c8f: 0f 85 ba 01 00 00 jne 80100e4f + memset(buf, 0, sizeof buf); +80100c95: 83 ec 04 sub $0x4,%esp +80100c98: 8d 45 d8 lea -0x28(%ebp),%eax +80100c9b: 6a 10 push $0x10 +80100c9d: 6a 00 push $0x0 +80100c9f: 50 push %eax +80100ca0: e8 9b 4f 00 00 call 80105c40 + x = itoa(*argp++, 10, 1, buf); +80100ca5: 8b 0b mov (%ebx),%ecx +80100ca7: 8d 43 04 lea 0x4(%ebx),%eax + buf[i++] = digits[x % base]; +80100caa: 89 75 c4 mov %esi,-0x3c(%ebp) + x = itoa(*argp++, 10, 1, buf); +80100cad: 89 45 c0 mov %eax,-0x40(%ebp) + if (sign && (sign = xx < 0)) +80100cb0: 83 c4 10 add $0x10,%esp + x = -xx; +80100cb3: 89 c8 mov %ecx,%eax + x = itoa(*argp++, 10, 1, buf); +80100cb5: 89 4d c8 mov %ecx,-0x38(%ebp) + x = -xx; +80100cb8: f7 d8 neg %eax +80100cba: 0f 49 c8 cmovns %eax,%ecx + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100cbd: 31 db xor %ebx,%ebx +80100cbf: 90 nop + buf[i++] = digits[x % base]; +80100cc0: b8 cd cc cc cc mov $0xcccccccd,%eax +80100cc5: 89 cf mov %ecx,%edi +80100cc7: 89 de mov %ebx,%esi +80100cc9: f7 e1 mul %ecx +80100ccb: 8d 5b 01 lea 0x1(%ebx),%ebx +80100cce: c1 ea 03 shr $0x3,%edx +80100cd1: 8d 04 92 lea (%edx,%edx,4),%eax +80100cd4: 01 c0 add %eax,%eax +80100cd6: 29 c7 sub %eax,%edi +80100cd8: 0f b6 87 90 8a 10 80 movzbl -0x7fef7570(%edi),%eax +80100cdf: 88 44 1d d7 mov %al,-0x29(%ebp,%ebx,1) + } while ((x /= base) != 0); +80100ce3: 89 c8 mov %ecx,%eax +80100ce5: 89 d1 mov %edx,%ecx +80100ce7: 83 f8 09 cmp $0x9,%eax +80100cea: 77 d4 ja 80100cc0 + if (sign) +80100cec: 8b 45 c8 mov -0x38(%ebp),%eax +80100cef: 89 75 cc mov %esi,-0x34(%ebp) +80100cf2: 8b 75 c4 mov -0x3c(%ebp),%esi +80100cf5: 85 c0 test %eax,%eax +80100cf7: 79 08 jns 80100d01 + buf[i++] = '-'; +80100cf9: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; +80100cfe: 89 5d cc mov %ebx,-0x34(%ebp) + while (--x >= 0) +80100d01: 8b 55 d4 mov -0x2c(%ebp),%edx +80100d04: 8d 45 d8 lea -0x28(%ebp),%eax +80100d07: 03 55 08 add 0x8(%ebp),%edx +80100d0a: 03 45 cc add -0x34(%ebp),%eax +80100d0d: 8d 76 00 lea 0x0(%esi),%esi + strbuffer[si] = buf[x]; +80100d10: 0f b6 08 movzbl (%eax),%ecx + while (--x >= 0) +80100d13: 8d 7d d8 lea -0x28(%ebp),%edi +80100d16: 83 c2 01 add $0x1,%edx + strbuffer[si] = buf[x]; +80100d19: 88 4a ff mov %cl,-0x1(%edx) + while (--x >= 0) +80100d1c: 89 c1 mov %eax,%ecx +80100d1e: 83 e8 01 sub $0x1,%eax +80100d21: 39 cf cmp %ecx,%edi +80100d23: 75 eb jne 80100d10 + si++; +80100d25: 8b 45 d4 mov -0x2c(%ebp),%eax +80100d28: 8b 7d cc mov -0x34(%ebp),%edi + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100d2b: 83 c6 01 add $0x1,%esi + x = itoa(*argp++, 10, 1, buf); +80100d2e: 8b 5d c0 mov -0x40(%ebp),%ebx + si++; +80100d31: 8d 44 38 01 lea 0x1(%eax,%edi,1),%eax +80100d35: 89 45 d4 mov %eax,-0x2c(%ebp) + for (i = 0; (c = fmt[i] & 0xff) != 0; i++) +80100d38: 8b 45 d0 mov -0x30(%ebp),%eax +80100d3b: 0f b6 04 30 movzbl (%eax,%esi,1),%eax +80100d3f: 89 c2 mov %eax,%edx +80100d41: 85 c0 test %eax,%eax +80100d43: 0f 85 12 ff ff ff jne 80100c5b +80100d49: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + strbuffer[si] = '\0'; +80100d50: 8b 45 d4 mov -0x2c(%ebp),%eax +80100d53: 01 45 08 add %eax,0x8(%ebp) +80100d56: 8b 45 08 mov 0x8(%ebp),%eax +80100d59: c6 00 00 movb $0x0,(%eax) +} +80100d5c: 8d 65 f4 lea -0xc(%ebp),%esp +80100d5f: 5b pop %ebx +80100d60: 5e pop %esi +80100d61: 5f pop %edi +80100d62: 5d pop %ebp +80100d63: c3 ret +80100d64: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + switch (c) +80100d68: 83 f8 73 cmp $0x73,%eax +80100d6b: 75 63 jne 80100dd0 + if ((s = (char *)*argp++) == 0) +80100d6d: 8b 13 mov (%ebx),%edx +80100d6f: 8d 43 04 lea 0x4(%ebx),%eax + strbuffer[si] = s[sli]; +80100d72: 8b 4d 08 mov 0x8(%ebp),%ecx +80100d75: 89 75 c4 mov %esi,-0x3c(%ebp) + if ((s = (char *)*argp++) == 0) +80100d78: 89 45 c8 mov %eax,-0x38(%ebp) +80100d7b: b8 b8 89 10 80 mov $0x801089b8,%eax +80100d80: 85 d2 test %edx,%edx +80100d82: 0f 45 c2 cmovne %edx,%eax + for (int sli = 0; sli < strlen(s); sli++) +80100d85: 31 ff xor %edi,%edi + if ((s = (char *)*argp++) == 0) +80100d87: 89 c3 mov %eax,%ebx + strbuffer[si] = s[sli]; +80100d89: 8b 45 d4 mov -0x2c(%ebp),%eax +80100d8c: 01 c1 add %eax,%ecx +80100d8e: 89 c6 mov %eax,%esi +80100d90: 89 f8 mov %edi,%eax +80100d92: 89 df mov %ebx,%edi +80100d94: 89 4d cc mov %ecx,-0x34(%ebp) +80100d97: 89 c3 mov %eax,%ebx + for (int sli = 0; sli < strlen(s); sli++) +80100d99: eb 12 jmp 80100dad +80100d9b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80100d9f: 90 nop + strbuffer[si] = s[sli]; +80100da0: 0f b6 04 1f movzbl (%edi,%ebx,1),%eax +80100da4: 8b 4d cc mov -0x34(%ebp),%ecx +80100da7: 88 04 19 mov %al,(%ecx,%ebx,1) + for (int sli = 0; sli < strlen(s); sli++) +80100daa: 83 c3 01 add $0x1,%ebx +80100dad: 83 ec 0c sub $0xc,%esp +80100db0: 8d 04 33 lea (%ebx,%esi,1),%eax +80100db3: 57 push %edi +80100db4: 89 45 d4 mov %eax,-0x2c(%ebp) +80100db7: e8 84 50 00 00 call 80105e40 +80100dbc: 83 c4 10 add $0x10,%esp +80100dbf: 39 d8 cmp %ebx,%eax +80100dc1: 7f dd jg 80100da0 + if ((s = (char *)*argp++) == 0) +80100dc3: 8b 75 c4 mov -0x3c(%ebp),%esi +80100dc6: 8b 5d c8 mov -0x38(%ebp),%ebx +80100dc9: e9 79 fe ff ff jmp 80100c47 +80100dce: 66 90 xchg %ax,%ax + switch (c) +80100dd0: 83 f8 78 cmp $0x78,%eax +80100dd3: 75 7a jne 80100e4f + memset(buf, 0, sizeof buf); +80100dd5: 83 ec 04 sub $0x4,%esp +80100dd8: 8d 45 d8 lea -0x28(%ebp),%eax +80100ddb: 6a 10 push $0x10 +80100ddd: 6a 00 push $0x0 +80100ddf: 50 push %eax +80100de0: e8 5b 4e 00 00 call 80105c40 + x = itoa(*argp++, 16, 0, buf); +80100de5: 8d 43 04 lea 0x4(%ebx),%eax +80100de8: 83 c4 10 add $0x10,%esp + i = 0; +80100deb: 31 d2 xor %edx,%edx + x = itoa(*argp++, 16, 0, buf); +80100ded: 89 45 cc mov %eax,-0x34(%ebp) +80100df0: 8b 03 mov (%ebx),%eax + i = 0; +80100df2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + buf[i++] = digits[x % base]; +80100df8: 89 c3 mov %eax,%ebx +80100dfa: 89 d1 mov %edx,%ecx +80100dfc: 8d 52 01 lea 0x1(%edx),%edx +80100dff: 83 e3 0f and $0xf,%ebx +80100e02: 0f b6 9b 90 8a 10 80 movzbl -0x7fef7570(%ebx),%ebx +80100e09: 88 5c 15 d7 mov %bl,-0x29(%ebp,%edx,1) + } while ((x /= base) != 0); +80100e0d: 89 c3 mov %eax,%ebx +80100e0f: c1 e8 04 shr $0x4,%eax +80100e12: 83 fb 0f cmp $0xf,%ebx +80100e15: 77 e1 ja 80100df8 +80100e17: 8d 45 d8 lea -0x28(%ebp),%eax +80100e1a: 8b 55 d4 mov -0x2c(%ebp),%edx +80100e1d: 03 55 08 add 0x8(%ebp),%edx +80100e20: 01 c8 add %ecx,%eax +80100e22: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + strbuffer[si] = buf[x]; +80100e28: 0f b6 18 movzbl (%eax),%ebx + while (--x >= 0) +80100e2b: 8d 7d d8 lea -0x28(%ebp),%edi +80100e2e: 83 c2 01 add $0x1,%edx + strbuffer[si] = buf[x]; +80100e31: 88 5a ff mov %bl,-0x1(%edx) + while (--x >= 0) +80100e34: 89 c3 mov %eax,%ebx +80100e36: 83 e8 01 sub $0x1,%eax +80100e39: 39 df cmp %ebx,%edi +80100e3b: 75 eb jne 80100e28 + si++; +80100e3d: 8b 45 d4 mov -0x2c(%ebp),%eax + x = itoa(*argp++, 16, 0, buf); +80100e40: 8b 5d cc mov -0x34(%ebp),%ebx + si++; +80100e43: 8d 44 01 01 lea 0x1(%ecx,%eax,1),%eax +80100e47: 89 45 d4 mov %eax,-0x2c(%ebp) +80100e4a: e9 f8 fd ff ff jmp 80100c47 + strbuffer[si] = '%'; +80100e4f: 8b 45 d4 mov -0x2c(%ebp),%eax +80100e52: 8b 7d 08 mov 0x8(%ebp),%edi +80100e55: c6 04 07 25 movb $0x25,(%edi,%eax,1) + strbuffer[si] = c; +80100e59: 88 54 07 01 mov %dl,0x1(%edi,%eax,1) + si++; +80100e5d: 83 c0 02 add $0x2,%eax +80100e60: 89 45 d4 mov %eax,-0x2c(%ebp) + break; +80100e63: e9 df fd ff ff jmp 80100c47 +80100e68: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100e6f: 90 nop + strbuffer[i] = '%'; +80100e70: 8b 45 08 mov 0x8(%ebp),%eax + si++; +80100e73: 83 45 d4 01 addl $0x1,-0x2c(%ebp) + strbuffer[i] = '%'; +80100e77: c6 04 30 25 movb $0x25,(%eax,%esi,1) + break; +80100e7b: e9 c7 fd ff ff jmp 80100c47 + panic("null fmt"); +80100e80: 83 ec 0c sub $0xc,%esp +80100e83: 68 bf 89 10 80 push $0x801089bf +80100e88: e8 f3 f5 ff ff call 80100480 +80100e8d: 8d 76 00 lea 0x0(%esi),%esi + +80100e90 : +{ +80100e90: 55 push %ebp +80100e91: 89 e5 mov %esp,%ebp +80100e93: 53 push %ebx +80100e94: 83 ec 24 sub $0x24,%esp + if (myproc() == 0x0) +80100e97: e8 14 40 00 00 call 80104eb0 +80100e9c: 85 c0 test %eax,%eax +80100e9e: 0f 84 9d 00 00 00 je 80100f41 + inconsoleptr = myproc()->consoleptr; +80100ea4: e8 07 40 00 00 call 80104eb0 +80100ea9: 8b 58 7c mov 0x7c(%eax),%ebx + if (inconsoleptr == 0) +80100eac: 85 db test %ebx,%ebx +80100eae: 0f 84 8d 00 00 00 je 80100f41 + char menutext[] = "(M)enu"; +80100eb4: b8 6e 75 00 00 mov $0x756e,%eax + sprintf(consoletitletext, "Console %d", inconsoleptr->consoleindex); +80100eb9: 83 ec 04 sub $0x4,%esp +80100ebc: ff 33 push (%ebx) + char menutext[] = "(M)enu"; +80100ebe: 66 89 45 eb mov %ax,-0x15(%ebp) + sprintf(consoletitletext, "Console %d", inconsoleptr->consoleindex); +80100ec2: 8d 45 ee lea -0x12(%ebp),%eax +80100ec5: 68 c8 89 10 80 push $0x801089c8 +80100eca: 50 push %eax + char menutext[] = "(M)enu"; +80100ecb: c7 45 e7 28 4d 29 65 movl $0x65294d28,-0x19(%ebp) +80100ed2: c6 45 ed 00 movb $0x0,-0x13(%ebp) + sprintf(consoletitletext, "Console %d", inconsoleptr->consoleindex); +80100ed6: e8 25 fd ff ff call 80100c00 + crt[pos] = (c & 0xff) | inconsoleptr->titlebgcol; +80100edb: 8b 8b 74 10 00 00 mov 0x1074(%ebx),%ecx +80100ee1: 83 c4 10 add $0x10,%esp + for (pos = 0; pos < SCRWIDTH; pos++) +80100ee4: 31 c0 xor %eax,%eax +80100ee6: eb 4d jmp 80100f35 +80100ee8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100eef: 90 nop + else if (pos >= 10 && pos < 20) +80100ef0: 8d 50 f6 lea -0xa(%eax),%edx +80100ef3: 83 fa 09 cmp $0x9,%edx +80100ef6: 76 6d jbe 80100f65 + else if (pos >= 25 && pos < 45) +80100ef8: 8d 50 e7 lea -0x19(%eax),%edx +80100efb: 83 fa 13 cmp $0x13,%edx +80100efe: 76 76 jbe 80100f76 + else if (pos >= 50 && pos < 80) +80100f00: 8d 50 ce lea -0x32(%eax),%edx +80100f03: 83 fa 1d cmp $0x1d,%edx +80100f06: 76 64 jbe 80100f6c +80100f08: ba 20 00 00 00 mov $0x20,%edx + if (inconsoleptr->inuse) +80100f0d: 83 bb 70 10 00 00 00 cmpl $0x0,0x1070(%ebx) +80100f14: 74 10 je 80100f26 + crt[pos] = (c & 0xff) | inconsoleptr->titlebgcol; +80100f16: 09 d1 or %edx,%ecx +80100f18: 66 89 8c 00 00 80 0b mov %cx,-0x7ff48000(%eax,%eax,1) +80100f1f: 80 + inconsoleptr->screenbuffer[pos] = (c & 0xff) | inconsoleptr->titlebgcol; +80100f20: 8b 8b 74 10 00 00 mov 0x1074(%ebx),%ecx +80100f26: 09 ca or %ecx,%edx +80100f28: 66 89 54 43 3c mov %dx,0x3c(%ebx,%eax,2) + for (pos = 0; pos < SCRWIDTH; pos++) +80100f2d: 83 c0 01 add $0x1,%eax +80100f30: 83 f8 50 cmp $0x50,%eax +80100f33: 74 2b je 80100f60 + if (pos < 6) { +80100f35: 83 f8 05 cmp $0x5,%eax +80100f38: 7f b6 jg 80100ef0 + crt[pos] = (c & 0xff) | inconsoleptr->titlebgcol; +80100f3a: 0f b6 54 05 e7 movzbl -0x19(%ebp,%eax,1),%edx +80100f3f: eb cc jmp 80100f0d + inconsoleptr = currentconsole; +80100f41: 8b 1d 80 0e 11 80 mov 0x80110e80,%ebx + if (inconsoleptr == 0) +80100f47: 85 db test %ebx,%ebx +80100f49: 0f 85 65 ff ff ff jne 80100eb4 + inconsoleptr = &consoles[0]; +80100f4f: bb a0 0e 11 80 mov $0x80110ea0,%ebx +80100f54: e9 5b ff ff ff jmp 80100eb4 +80100f59: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +} +80100f60: 8b 5d fc mov -0x4(%ebp),%ebx +80100f63: c9 leave +80100f64: c3 ret + crt[pos] = (c & 0xff) | inconsoleptr->titlebgcol; +80100f65: 0f b6 54 05 e4 movzbl -0x1c(%ebp,%eax,1),%edx +80100f6a: eb a1 jmp 80100f0d +80100f6c: 0f b6 94 03 5e 10 00 movzbl 0x105e(%ebx,%eax,1),%edx +80100f73: 00 +80100f74: eb 97 jmp 80100f0d +80100f76: 0f b6 94 03 5f 10 00 movzbl 0x105f(%ebx,%eax,1),%edx +80100f7d: 00 +80100f7e: eb 8d jmp 80100f0d + +80100f80 : +{ +80100f80: 55 push %ebp +80100f81: 89 e5 mov %esp,%ebp +80100f83: 83 ec 08 sub $0x8,%esp + if (myproc() == 0x0) +80100f86: e8 25 3f 00 00 call 80104eb0 +80100f8b: 85 c0 test %eax,%eax +80100f8d: 74 11 je 80100fa0 + inconsoleptr = myproc()->consoleptr; +80100f8f: e8 1c 3f 00 00 call 80104eb0 +80100f94: 8b 40 7c mov 0x7c(%eax),%eax + if (inconsoleptr == 0) +80100f97: 85 c0 test %eax,%eax +80100f99: 74 05 je 80100fa0 +} +80100f9b: c9 leave +80100f9c: c3 ret +80100f9d: 8d 76 00 lea 0x0(%esi),%esi + inconsoleptr = currentconsole; +80100fa0: a1 80 0e 11 80 mov 0x80110e80,%eax + if (inconsoleptr == 0) +80100fa5: 85 c0 test %eax,%eax +80100fa7: 75 f2 jne 80100f9b +} +80100fa9: c9 leave + inconsoleptr = &consoles[0]; +80100faa: b8 a0 0e 11 80 mov $0x80110ea0,%eax +} +80100faf: c3 ret + +80100fb0 : +{ +80100fb0: 55 push %ebp +80100fb1: 89 e5 mov %esp,%ebp +80100fb3: 83 ec 24 sub $0x24,%esp + acquire(&cons.lock); +80100fb6: 68 80 b6 11 80 push $0x8011b680 +80100fbb: e8 c0 4b 00 00 call 80105b80 + while ((c = kbdgetc()) <= 0) +80100fc0: 83 c4 10 add $0x10,%esp +80100fc3: eb 05 jmp 80100fca +80100fc5: 8d 76 00 lea 0x0(%esi),%esi + if (c == 0) +80100fc8: 74 26 je 80100ff0 + while ((c = kbdgetc()) <= 0) +80100fca: e8 11 2c 00 00 call 80103be0 +80100fcf: 85 c0 test %eax,%eax +80100fd1: 7e f5 jle 80100fc8 + release(&cons.lock); +80100fd3: 83 ec 0c sub $0xc,%esp +80100fd6: 89 45 f4 mov %eax,-0xc(%ebp) +80100fd9: 68 80 b6 11 80 push $0x8011b680 +80100fde: e8 3d 4b 00 00 call 80105b20 +} +80100fe3: 8b 45 f4 mov -0xc(%ebp),%eax +80100fe6: c9 leave +80100fe7: c3 ret +80100fe8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100fef: 90 nop + c = kbdgetc(); +80100ff0: e8 eb 2b 00 00 call 80103be0 +80100ff5: eb d3 jmp 80100fca +80100ff7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80100ffe: 66 90 xchg %ax,%ax + +80101000 : + +// Function to flood a buffer with A-Z characters looping (for testing initially) +void testfillbuffer(ushort *bufferin) +{ +80101000: 55 push %ebp + ushort firstchar = 65; + ushort lastchar = 90; + ushort currentchar = firstchar; +80101001: ba 41 00 00 00 mov $0x41,%edx +{ +80101006: 89 e5 mov %esp,%ebp +80101008: 53 push %ebx +80101009: 8b 45 08 mov 0x8(%ebp),%eax +8010100c: 8d 98 a0 0f 00 00 lea 0xfa0(%eax),%ebx +80101012: eb 17 jmp 8010102b +80101014: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (currentchar > lastchar) + { + currentchar = firstchar; + } + + bufferin[i] = (currentchar & 0xff) | 0x0700; +80101018: 89 d1 mov %edx,%ecx + for (int i = 0; i < (SCRHEIGHT * SCRWIDTH); i++) +8010101a: 83 c0 02 add $0x2,%eax + + currentchar++; +8010101d: 83 c2 01 add $0x1,%edx + bufferin[i] = (currentchar & 0xff) | 0x0700; +80101020: 80 cd 07 or $0x7,%ch +80101023: 66 89 48 fe mov %cx,-0x2(%eax) + for (int i = 0; i < (SCRHEIGHT * SCRWIDTH); i++) +80101027: 39 c3 cmp %eax,%ebx +80101029: 74 1b je 80101046 + if (currentchar > lastchar) +8010102b: 66 83 fa 5b cmp $0x5b,%dx +8010102f: 75 e7 jne 80101018 +80101031: b9 41 07 00 00 mov $0x741,%ecx + for (int i = 0; i < (SCRHEIGHT * SCRWIDTH); i++) +80101036: 83 c0 02 add $0x2,%eax +80101039: ba 42 00 00 00 mov $0x42,%edx + bufferin[i] = (currentchar & 0xff) | 0x0700; +8010103e: 66 89 48 fe mov %cx,-0x2(%eax) + for (int i = 0; i < (SCRHEIGHT * SCRWIDTH); i++) +80101042: 39 c3 cmp %eax,%ebx +80101044: 75 e5 jne 8010102b + } +} +80101046: 8b 5d fc mov -0x4(%ebp),%ebx +80101049: c9 leave +8010104a: c3 ret +8010104b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010104f: 90 nop + +80101050 : + +// Function to get a pointer to the base console +struct vconsole* getbaseconsoleptr(void) +{ + return &consoles[0]; +} +80101050: b8 a0 0e 11 80 mov $0x80110ea0,%eax +80101055: c3 ret +80101056: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010105d: 8d 76 00 lea 0x0(%esi),%esi + +80101060 : + +// Function to clear a given buffer using its pointer/address +void clearconsole(ushort *bufferin) +{ +80101060: 55 push %ebp +80101061: 89 e5 mov %esp,%ebp +80101063: 83 ec 0c sub $0xc,%esp + // Flood the screen buffer with blank spaces + memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101066: 68 a0 0f 00 00 push $0xfa0 +8010106b: 6a 00 push $0x0 +8010106d: ff 75 08 push 0x8(%ebp) +80101070: e8 cb 4b 00 00 call 80105c40 +} +80101075: 83 c4 10 add $0x10,%esp +80101078: c9 leave +80101079: c3 ret +8010107a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80101080 : + +// Function for loading an entire buffer into the screen memory using its pointer/address +void loadscreenbuffer(ushort *bufferin) +{ +80101080: 55 push %ebp +80101081: 89 e5 mov %esp,%ebp +80101083: 83 ec 0c sub $0xc,%esp + // Copy the memory from the console buffer to the crt buffer + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101086: 68 a0 0f 00 00 push $0xfa0 +8010108b: ff 75 08 push 0x8(%ebp) +8010108e: 68 00 80 0b 80 push $0x800b8000 +80101093: e8 48 4c 00 00 call 80105ce0 +} +80101098: 83 c4 10 add $0x10,%esp +8010109b: c9 leave +8010109c: c3 ret +8010109d: 8d 76 00 lea 0x0(%esi),%esi + +801010a0 : + +// Function for saving the current screen memory into a given buffer +void savescreenbuffer(ushort *bufferin) +{ +801010a0: 55 push %ebp +801010a1: 89 e5 mov %esp,%ebp +801010a3: 83 ec 0c sub $0xc,%esp + // Copy the memory from the console buffer to the crt buffer + memmove(bufferin, crt, sizeof(crt[0]) * SCRHEIGHT * SCRWIDTH); +801010a6: 68 a0 0f 00 00 push $0xfa0 +801010ab: 68 00 80 0b 80 push $0x800b8000 +801010b0: ff 75 08 push 0x8(%ebp) +801010b3: e8 28 4c 00 00 call 80105ce0 +} +801010b8: 83 c4 10 add $0x10,%esp +801010bb: c9 leave +801010bc: c3 ret +801010bd: 8d 76 00 lea 0x0(%esi),%esi + +801010c0 : + +// Function for clearing the current screen/buffer +void clearscreen(int prelocked) +{ +801010c0: 55 push %ebp +801010c1: 89 e5 mov %esp,%ebp +801010c3: 57 push %edi +801010c4: 56 push %esi +801010c5: 53 push %ebx +801010c6: 83 ec 0c sub $0xc,%esp +801010c9: 8b 7d 08 mov 0x8(%ebp),%edi + if (myproc() == 0x0) +801010cc: e8 df 3d 00 00 call 80104eb0 +801010d1: 85 c0 test %eax,%eax +801010d3: 74 4b je 80101120 + inconsoleptr = myproc()->consoleptr; +801010d5: e8 d6 3d 00 00 call 80104eb0 +801010da: 8b 58 7c mov 0x7c(%eax),%ebx + if (inconsoleptr == 0) +801010dd: 85 db test %ebx,%ebx +801010df: 74 3f je 80101120 + if (!prelocked) + { + acquire(&cons.lock); + } + int pos = TITLEOFF; + clearconsole(inconsoleptr->screenbuffer); +801010e1: 8d 73 3c lea 0x3c(%ebx),%esi + if (!prelocked) +801010e4: 85 ff test %edi,%edi +801010e6: 74 58 je 80101140 + memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +801010e8: 83 ec 04 sub $0x4,%esp +801010eb: 68 a0 0f 00 00 push $0xfa0 +801010f0: 6a 00 push $0x0 +801010f2: 56 push %esi +801010f3: e8 48 4b 00 00 call 80105c40 + inconsoleptr->pos = pos; + + // If the console is in use load the blank buffer into screen memory and set the cursor position + if (inconsoleptr->inuse) +801010f8: 8b 83 70 10 00 00 mov 0x1070(%ebx),%eax +801010fe: 83 c4 10 add $0x10,%esp + inconsoleptr->pos = pos; +80101101: c7 83 68 10 00 00 50 movl $0x50,0x1068(%ebx) +80101108: 00 00 00 + if (inconsoleptr->inuse) +8010110b: 85 c0 test %eax,%eax +8010110d: 0f 85 7d 00 00 00 jne 80101190 + drawtitle(); + if (!prelocked) + { + release(&cons.lock); + } +} +80101113: 8d 65 f4 lea -0xc(%ebp),%esp +80101116: 5b pop %ebx +80101117: 5e pop %esi +80101118: 5f pop %edi +80101119: 5d pop %ebp + drawtitle(); +8010111a: e9 71 fd ff ff jmp 80100e90 +8010111f: 90 nop + inconsoleptr = currentconsole; +80101120: 8b 1d 80 0e 11 80 mov 0x80110e80,%ebx + if (inconsoleptr == 0) +80101126: 85 db test %ebx,%ebx +80101128: 75 b7 jne 801010e1 + inconsoleptr = &consoles[0]; +8010112a: bb a0 0e 11 80 mov $0x80110ea0,%ebx + clearconsole(inconsoleptr->screenbuffer); +8010112f: 8d 73 3c lea 0x3c(%ebx),%esi + if (!prelocked) +80101132: 85 ff test %edi,%edi +80101134: 75 b2 jne 801010e8 +80101136: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010113d: 8d 76 00 lea 0x0(%esi),%esi + acquire(&cons.lock); +80101140: 83 ec 0c sub $0xc,%esp +80101143: 68 80 b6 11 80 push $0x8011b680 +80101148: e8 33 4a 00 00 call 80105b80 + memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +8010114d: 83 c4 0c add $0xc,%esp +80101150: 68 a0 0f 00 00 push $0xfa0 +80101155: 6a 00 push $0x0 +80101157: 56 push %esi +80101158: e8 e3 4a 00 00 call 80105c40 + if (inconsoleptr->inuse) +8010115d: 8b 93 70 10 00 00 mov 0x1070(%ebx),%edx +80101163: 83 c4 10 add $0x10,%esp + inconsoleptr->pos = pos; +80101166: c7 83 68 10 00 00 50 movl $0x50,0x1068(%ebx) +8010116d: 00 00 00 + if (inconsoleptr->inuse) +80101170: 85 d2 test %edx,%edx +80101172: 75 1c jne 80101190 + drawtitle(); +80101174: e8 17 fd ff ff call 80100e90 + release(&cons.lock); +80101179: c7 45 08 80 b6 11 80 movl $0x8011b680,0x8(%ebp) +} +80101180: 8d 65 f4 lea -0xc(%ebp),%esp +80101183: 5b pop %ebx +80101184: 5e pop %esi +80101185: 5f pop %edi +80101186: 5d pop %ebp + release(&cons.lock); +80101187: e9 94 49 00 00 jmp 80105b20 +8010118c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101190: 83 ec 04 sub $0x4,%esp + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80101193: bb d4 03 00 00 mov $0x3d4,%ebx +80101198: 68 a0 0f 00 00 push $0xfa0 +8010119d: 56 push %esi +8010119e: 68 00 80 0b 80 push $0x800b8000 +801011a3: e8 38 4b 00 00 call 80105ce0 +801011a8: b8 0e 00 00 00 mov $0xe,%eax +801011ad: 89 da mov %ebx,%edx +801011af: ee out %al,(%dx) +801011b0: b9 d5 03 00 00 mov $0x3d5,%ecx +801011b5: 31 c0 xor %eax,%eax +801011b7: 89 ca mov %ecx,%edx +801011b9: ee out %al,(%dx) +801011ba: b8 0f 00 00 00 mov $0xf,%eax +801011bf: 89 da mov %ebx,%edx +801011c1: ee out %al,(%dx) +801011c2: b8 50 00 00 00 mov $0x50,%eax +801011c7: 89 ca mov %ecx,%edx +801011c9: ee out %al,(%dx) + drawtitle(); +801011ca: e8 c1 fc ff ff call 80100e90 + if (!prelocked) +801011cf: 83 c4 10 add $0x10,%esp +801011d2: 85 ff test %edi,%edi +801011d4: 74 a3 je 80101179 +} +801011d6: 8d 65 f4 lea -0xc(%ebp),%esp +801011d9: 5b pop %ebx +801011da: 5e pop %esi +801011db: 5f pop %edi +801011dc: 5d pop %ebp +801011dd: c3 ret +801011de: 66 90 xchg %ax,%ax + +801011e0 : + +void consoleinit(void) +{ +801011e0: 55 push %ebp +801011e1: 89 e5 mov %esp,%ebp +801011e3: 57 push %edi +801011e4: 56 push %esi +801011e5: 8d 7d e0 lea -0x20(%ebp),%edi + initlock(&cons.lock, "console"); + initlock(&vcons.lock, "vconglobal"); + + // Init all of the virtual console buffers + for (int i = 0; i < MAXVCONSOLES; i++) +801011e8: 31 f6 xor %esi,%esi +{ +801011ea: 53 push %ebx +801011eb: bb a4 0e 11 80 mov $0x80110ea4,%ebx +801011f0: 83 ec 24 sub $0x24,%esp + initlock(&cons.lock, "console"); +801011f3: 68 d3 89 10 80 push $0x801089d3 +801011f8: 68 80 b6 11 80 push $0x8011b680 +801011fd: e8 ae 47 00 00 call 801059b0 + initlock(&vcons.lock, "vconglobal"); +80101202: 58 pop %eax +80101203: 5a pop %edx +80101204: 68 db 89 10 80 push $0x801089db +80101209: 68 40 b6 11 80 push $0x8011b640 +8010120e: e8 9d 47 00 00 call 801059b0 + for (int i = 0; i < MAXVCONSOLES; i++) +80101213: 83 c4 10 add $0x10,%esp +80101216: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010121d: 8d 76 00 lea 0x0(%esi),%esi + consoles[i].active = 0; + consoles[i].inuse = 0; + consoles[i].titlebgcol = 0x4F00; + + char lockname[8]; + sprintf(lockname, "vconsole%d", i); +80101220: 83 ec 04 sub $0x4,%esp + consoles[i].consoleindex = i; +80101223: 89 73 fc mov %esi,-0x4(%ebx) + sprintf(lockname, "vconsole%d", i); +80101226: 56 push %esi + for (int i = 0; i < MAXVCONSOLES; i++) +80101227: 83 c6 01 add $0x1,%esi + sprintf(lockname, "vconsole%d", i); +8010122a: 68 e6 89 10 80 push $0x801089e6 +8010122f: 57 push %edi + consoles[i].processowner = 0; +80101230: c7 43 34 00 00 00 00 movl $0x0,0x34(%ebx) + consoles[i].pos = 0; +80101237: c7 83 64 10 00 00 00 movl $0x0,0x1064(%ebx) +8010123e: 00 00 00 + consoles[i].active = 0; +80101241: c7 83 68 10 00 00 00 movl $0x0,0x1068(%ebx) +80101248: 00 00 00 + consoles[i].inuse = 0; +8010124b: c7 83 6c 10 00 00 00 movl $0x0,0x106c(%ebx) +80101252: 00 00 00 + consoles[i].titlebgcol = 0x4F00; +80101255: c7 83 70 10 00 00 00 movl $0x4f00,0x1070(%ebx) +8010125c: 4f 00 00 + sprintf(lockname, "vconsole%d", i); +8010125f: e8 9c f9 ff ff call 80100c00 + initlock(&consoles[i].lock, lockname); +80101264: 59 pop %ecx +80101265: 58 pop %eax +80101266: 57 push %edi +80101267: 53 push %ebx + for (int i = 0; i < MAXVCONSOLES; i++) +80101268: 81 c3 b0 10 00 00 add $0x10b0,%ebx + initlock(&consoles[i].lock, lockname); +8010126e: e8 3d 47 00 00 call 801059b0 + for (int i = 0; i < MAXVCONSOLES; i++) +80101273: 83 c4 10 add $0x10,%esp +80101276: 83 fe 0a cmp $0xa,%esi +80101279: 75 a5 jne 80101220 + } + + // Initialise pointer to point to our console input buffer + currentconsole = &consoles[0]; +8010127b: c7 05 80 0e 11 80 a0 movl $0x80110ea0,0x80110e80 +80101282: 0e 11 80 + devsw[CONSOLE].write = consolewrite; + devsw[CONSOLE].read = consoleread; + cons.locking = 1; + + // Clear the screen and print the welcome message + clearscreen(0); +80101285: 83 ec 0c sub $0xc,%esp +80101288: 6a 00 push $0x0 + currentconsole->active = 1; +8010128a: c7 05 0c 1f 11 80 01 movl $0x1,0x80111f0c +80101291: 00 00 00 + currentconsole->inuse = 1; +80101294: c7 05 10 1f 11 80 01 movl $0x1,0x80111f10 +8010129b: 00 00 00 + input = ¤tconsole->keybuffer; +8010129e: c7 05 80 b5 11 80 7c movl $0x80111e7c,0x8011b580 +801012a5: 1e 11 80 + devsw[CONSOLE].write = consolewrite; +801012a8: c7 05 8c c0 11 80 e0 movl $0x801007e0,0x8011c08c +801012af: 07 10 80 + devsw[CONSOLE].read = consoleread; +801012b2: c7 05 88 c0 11 80 20 movl $0x80100320,0x8011c088 +801012b9: 03 10 80 + cons.locking = 1; +801012bc: c7 05 b4 b6 11 80 01 movl $0x1,0x8011b6b4 +801012c3: 00 00 00 + clearscreen(0); +801012c6: e8 f5 fd ff ff call 801010c0 + cprintf("Welcome! you are currently in the base console\n"); +801012cb: c7 04 24 10 8a 10 80 movl $0x80108a10,(%esp) +801012d2: e8 b9 f5 ff ff call 80100890 + + ioapicenable(IRQ_KBD, 0); +801012d7: 58 pop %eax +801012d8: 5a pop %edx +801012d9: 6a 00 push $0x0 +801012db: 6a 01 push $0x1 +801012dd: e8 8e 26 00 00 call 80103970 +} +801012e2: 83 c4 10 add $0x10,%esp +801012e5: 8d 65 f4 lea -0xc(%ebp),%esp +801012e8: 5b pop %ebx +801012e9: 5e pop %esi +801012ea: 5f pop %edi +801012eb: 5d pop %ebp +801012ec: c3 ret +801012ed: 8d 76 00 lea 0x0(%esi),%esi + +801012f0 : + +// Function for "creating" a new console, in reality it sets the first non active console to active and setups the struct +// if none are free it returns a nullptr/zero for the calling function to handle +struct vconsole* newconsole(char* title, int bgpreset) +{ +801012f0: 55 push %ebp +801012f1: 89 e5 mov %esp,%ebp +801012f3: 57 push %edi +801012f4: 56 push %esi +801012f5: 53 push %ebx + struct vconsole* result = 0; + + acquire(&vcons.lock); + for (int i = 1; i < MAXVCONSOLES; i++) +801012f6: bb 01 00 00 00 mov $0x1,%ebx +{ +801012fb: 83 ec 28 sub $0x28,%esp + acquire(&vcons.lock); +801012fe: 68 40 b6 11 80 push $0x8011b640 +80101303: e8 78 48 00 00 call 80105b80 + for (int i = 1; i < MAXVCONSOLES; i++) +80101308: b8 bc 2f 11 80 mov $0x80112fbc,%eax +8010130d: 83 c4 10 add $0x10,%esp + { + if (!consoles[i].active) +80101310: 8b 30 mov (%eax),%esi +80101312: 85 f6 test %esi,%esi +80101314: 74 2a je 80101340 + for (int i = 1; i < MAXVCONSOLES; i++) +80101316: 83 c3 01 add $0x1,%ebx +80101319: 05 b0 10 00 00 add $0x10b0,%eax +8010131e: 83 fb 0a cmp $0xa,%ebx +80101321: 75 ed jne 80101310 + struct vconsole* result = 0; +80101323: 31 ff xor %edi,%edi + + result = &consoles[i]; + break; + } + } + release(&vcons.lock); +80101325: 83 ec 0c sub $0xc,%esp +80101328: 68 40 b6 11 80 push $0x8011b640 +8010132d: e8 ee 47 00 00 call 80105b20 + + return result; +} +80101332: 8d 65 f4 lea -0xc(%ebp),%esp +80101335: 89 f8 mov %edi,%eax +80101337: 5b pop %ebx +80101338: 5e pop %esi +80101339: 5f pop %edi +8010133a: 5d pop %ebp +8010133b: c3 ret +8010133c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + consoles[i].processowner = myproc(); +80101340: e8 6b 3b 00 00 call 80104eb0 +80101345: 69 d3 b0 10 00 00 imul $0x10b0,%ebx,%edx + if (strlen(title) > 0) +8010134b: 83 ec 0c sub $0xc,%esp + consoles[i].processowner = myproc(); +8010134e: 8d ba a0 0e 11 80 lea -0x7feef160(%edx),%edi +80101354: 89 55 e4 mov %edx,-0x1c(%ebp) +80101357: 89 47 38 mov %eax,0x38(%edi) + consoles[i].titlebgcol = bgpreset; +8010135a: 8b 45 0c mov 0xc(%ebp),%eax +8010135d: 89 87 74 10 00 00 mov %eax,0x1074(%edi) + if (strlen(title) > 0) +80101363: ff 75 08 push 0x8(%ebp) +80101366: e8 d5 4a 00 00 call 80105e40 +8010136b: 83 c4 10 add $0x10,%esp +8010136e: 85 c0 test %eax,%eax +80101370: 7f 0e jg 80101380 + consoles[i].titlelocked = 1; +80101372: 69 db b0 10 00 00 imul $0x10b0,%ebx,%ebx +80101378: 89 b3 2c 1f 11 80 mov %esi,-0x7feee0d4(%ebx) + break; +8010137e: eb a5 jmp 80101325 + memset(consoles[i].proctitle, 0, sizeof(consoles[i].proctitle[0]) * sizeof(consoles[i].proctitle)); +80101380: 8b 55 e4 mov -0x1c(%ebp),%edx +80101383: 83 ec 04 sub $0x4,%esp + consoles[i].titlelocked = 1; +80101386: 69 db b0 10 00 00 imul $0x10b0,%ebx,%ebx + memset(consoles[i].proctitle, 0, sizeof(consoles[i].proctitle[0]) * sizeof(consoles[i].proctitle)); +8010138c: 6a 14 push $0x14 +8010138e: 8d b2 18 1f 11 80 lea -0x7feee0e8(%edx),%esi +80101394: 6a 00 push $0x0 +80101396: 56 push %esi +80101397: e8 a4 48 00 00 call 80105c40 + safestrcpy(consoles[i].proctitle, title, sizeof(consoles[i].proctitle)); +8010139c: 83 c4 0c add $0xc,%esp +8010139f: 6a 14 push $0x14 +801013a1: ff 75 08 push 0x8(%ebp) +801013a4: 56 push %esi +801013a5: be 01 00 00 00 mov $0x1,%esi +801013aa: e8 51 4a 00 00 call 80105e00 + consoles[i].titlelocked = 1; +801013af: 89 b3 2c 1f 11 80 mov %esi,-0x7feee0d4(%ebx) + break; +801013b5: 83 c4 10 add $0x10,%esp +801013b8: e9 68 ff ff ff jmp 80101325 +801013bd: 8d 76 00 lea 0x0(%esi),%esi + +801013c0 : + +// Function to "release" all consoles from inuse, this is to stop the chance of one not clearing and causing an issue with 2 being inuse +void releaseallconsoles(void) +{ + for (int i = 0; i < MAXVCONSOLES; i++) +801013c0: b8 10 1f 11 80 mov $0x80111f10,%eax +801013c5: 8d 76 00 lea 0x0(%esi),%esi + { + consoles[i].inuse = 0; +801013c8: c7 00 00 00 00 00 movl $0x0,(%eax) + for (int i = 0; i < MAXVCONSOLES; i++) +801013ce: 05 b0 10 00 00 add $0x10b0,%eax +801013d3: 3d f0 c5 11 80 cmp $0x8011c5f0,%eax +801013d8: 75 ee jne 801013c8 + } +} +801013da: c3 ret +801013db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801013df: 90 nop + +801013e0 : + +// Function for switching to another console using the given pointer +int switchtoconsole(struct vconsole* consoleptr) +{ +801013e0: 55 push %ebp +801013e1: 89 e5 mov %esp,%ebp +801013e3: 57 push %edi +801013e4: 56 push %esi +801013e5: 53 push %ebx +801013e6: bb a0 0e 11 80 mov $0x80110ea0,%ebx +801013eb: 83 ec 18 sub $0x18,%esp +801013ee: 8b 75 08 mov 0x8(%ebp),%esi + int pos; + + acquire(&vcons.lock); +801013f1: 68 40 b6 11 80 push $0x8011b640 +801013f6: e8 85 47 00 00 call 80105b80 + for (int i = 0; i < MAXVCONSOLES; i++) +801013fb: b8 10 1f 11 80 mov $0x80111f10,%eax +80101400: 83 c4 10 add $0x10,%esp +80101403: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80101407: 90 nop + consoles[i].inuse = 0; +80101408: c7 00 00 00 00 00 movl $0x0,(%eax) + for (int i = 0; i < MAXVCONSOLES; i++) +8010140e: 05 b0 10 00 00 add $0x10b0,%eax +80101413: 3d f0 c5 11 80 cmp $0x8011c5f0,%eax +80101418: 75 ee jne 80101408 + // Release all consoles before setting the new one to inuse + releaseallconsoles(); + currentconsole = consoleptr; + currentconsole->inuse = 1; + + acquire(&cons.lock); +8010141a: 83 ec 0c sub $0xc,%esp + currentconsole = consoleptr; +8010141d: 89 35 80 0e 11 80 mov %esi,0x80110e80 + currentconsole->inuse = 1; +80101423: c7 86 70 10 00 00 01 movl $0x1,0x1070(%esi) +8010142a: 00 00 00 + acquire(&cons.lock); +8010142d: 68 80 b6 11 80 push $0x8011b680 +80101432: e8 49 47 00 00 call 80105b80 + // Load the next console into screen memory + loadscreenbuffer(currentconsole->screenbuffer); +80101437: a1 80 0e 11 80 mov 0x80110e80,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +8010143c: 83 c4 0c add $0xc,%esp +8010143f: 68 a0 0f 00 00 push $0xfa0 + loadscreenbuffer(currentconsole->screenbuffer); +80101444: 83 c0 3c add $0x3c,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101447: 50 push %eax +80101448: 68 00 80 0b 80 push $0x800b8000 +8010144d: e8 8e 48 00 00 call 80105ce0 + + // Checks if the console was active, if not its most likely the first switch to this so we clear and print the welcome message + if (!currentconsole->active) +80101452: 8b 0d 80 0e 11 80 mov 0x80110e80,%ecx +80101458: 83 c4 10 add $0x10,%esp +8010145b: 8b b9 6c 10 00 00 mov 0x106c(%ecx),%edi +80101461: 85 ff test %edi,%edi +80101463: 0f 84 8f 00 00 00 je 801014f8 +80101469: bf d4 03 00 00 mov $0x3d4,%edi +8010146e: b8 0e 00 00 00 mov $0xe,%eax +80101473: 89 fa mov %edi,%edx +80101475: ee out %al,(%dx) + { + // If it was already active we just set the cursor position to the one saved in the console struct + pos = currentconsole->pos; + + outb(CRTPORT, 14); + outb(CRTPORT + 1, pos >> 8); +80101476: 8b 81 68 10 00 00 mov 0x1068(%ecx),%eax +8010147c: be d5 03 00 00 mov $0x3d5,%esi +80101481: 89 f2 mov %esi,%edx +80101483: c1 f8 08 sar $0x8,%eax +80101486: ee out %al,(%dx) +80101487: b8 0f 00 00 00 mov $0xf,%eax +8010148c: 89 fa mov %edi,%edx +8010148e: ee out %al,(%dx) +8010148f: 0f b6 81 68 10 00 00 movzbl 0x1068(%ecx),%eax +80101496: 89 f2 mov %esi,%edx +80101498: ee out %al,(%dx) + outb(CRTPORT, 15); + outb(CRTPORT + 1, pos); + } + + // Remove the menu if it was active and set the console as the current menu item + menuactive = 0; +80101499: c7 05 bc b6 11 80 00 movl $0x0,0x8011b6bc +801014a0: 00 00 00 + int resultcount = 0; +801014a3: 31 c0 xor %eax,%eax +801014a5: eb 17 jmp 801014be +801014a7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801014ae: 66 90 xchg %ax,%ax + resultcount++; +801014b0: 83 c0 01 add $0x1,%eax + for (int i = 0; i < MAXVCONSOLES; i++) +801014b3: 81 c3 b0 10 00 00 add $0x10b0,%ebx +801014b9: 83 f8 0a cmp $0xa,%eax +801014bc: 74 0e je 801014cc + if (&consoles[i] == consolein && consoles[i].active) +801014be: 39 d9 cmp %ebx,%ecx +801014c0: 75 ee jne 801014b0 +801014c2: 8b 91 6c 10 00 00 mov 0x106c(%ecx),%edx +801014c8: 85 d2 test %edx,%edx +801014ca: 74 e4 je 801014b0 + currentmenuitem = getconsolemenuindex(currentconsole); + release(&cons.lock); +801014cc: 83 ec 0c sub $0xc,%esp + currentmenuitem = getconsolemenuindex(currentconsole); +801014cf: a3 c0 b6 11 80 mov %eax,0x8011b6c0 + release(&cons.lock); +801014d4: 68 80 b6 11 80 push $0x8011b680 +801014d9: e8 42 46 00 00 call 80105b20 + release(&vcons.lock); +801014de: c7 04 24 40 b6 11 80 movl $0x8011b640,(%esp) +801014e5: e8 36 46 00 00 call 80105b20 + return 0; +} +801014ea: 8d 65 f4 lea -0xc(%ebp),%esp +801014ed: 31 c0 xor %eax,%eax +801014ef: 5b pop %ebx +801014f0: 5e pop %esi +801014f1: 5f pop %edi +801014f2: 5d pop %ebp +801014f3: c3 ret +801014f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + clearscreen(1); +801014f8: 83 ec 0c sub $0xc,%esp +801014fb: 6a 01 push $0x1 +801014fd: e8 be fb ff ff call 801010c0 + cprintf("Welcome to Console: %d\n", currentconsole->consoleindex); +80101502: a1 80 0e 11 80 mov 0x80110e80,%eax +80101507: 59 pop %ecx +80101508: 5e pop %esi +80101509: ff 30 push (%eax) +8010150b: 68 f1 89 10 80 push $0x801089f1 +80101510: e8 7b f3 ff ff call 80100890 + currentconsole->active = 1; +80101515: 8b 0d 80 0e 11 80 mov 0x80110e80,%ecx +8010151b: 83 c4 10 add $0x10,%esp +8010151e: c7 81 6c 10 00 00 01 movl $0x1,0x106c(%ecx) +80101525: 00 00 00 +80101528: e9 6c ff ff ff jmp 80101499 +8010152d: 8d 76 00 lea 0x0(%esi),%esi + +80101530 : +{ +80101530: 55 push %ebp +80101531: 89 e5 mov %esp,%ebp +80101533: 57 push %edi +80101534: 56 push %esi +80101535: 53 push %ebx +80101536: 81 ec 3c 01 00 00 sub $0x13c,%esp +8010153c: 8b 45 08 mov 0x8(%ebp),%eax +8010153f: 89 85 e8 fe ff ff mov %eax,-0x118(%ebp) + if (myproc() == 0x0) +80101545: e8 66 39 00 00 call 80104eb0 +8010154a: 85 c0 test %eax,%eax +8010154c: 0f 84 8e 00 00 00 je 801015e0 + inconsoleptr = myproc()->consoleptr; +80101552: e8 59 39 00 00 call 80104eb0 +80101557: 8b 40 7c mov 0x7c(%eax),%eax +8010155a: 89 85 c4 fe ff ff mov %eax,-0x13c(%ebp) + if (inconsoleptr == 0) +80101560: 85 c0 test %eax,%eax +80101562: 74 7c je 801015e0 + acquire(&cons.lock); +80101564: 83 ec 0c sub $0xc,%esp +80101567: 68 80 b6 11 80 push $0x8011b680 +8010156c: e8 0f 46 00 00 call 80105b80 + struct kbdbuffer* consolekbdbuffer = ¤tconsole->keybuffer; +80101571: a1 80 0e 11 80 mov 0x80110e80,%eax + while ((c = getc()) >= 0) +80101576: 83 c4 10 add $0x10,%esp + int doconsolehome = 0; +80101579: c7 85 d4 fe ff ff 00 movl $0x0,-0x12c(%ebp) +80101580: 00 00 00 + int switchto = -1; +80101583: c7 85 c0 fe ff ff ff movl $0xffffffff,-0x140(%ebp) +8010158a: ff ff ff + struct kbdbuffer* consolekbdbuffer = ¤tconsole->keybuffer; +8010158d: 89 85 d8 fe ff ff mov %eax,-0x128(%ebp) + int doconsoleswitch = 0; +80101593: c7 85 d0 fe ff ff 00 movl $0x0,-0x130(%ebp) +8010159a: 00 00 00 + int doprocdump = 0; +8010159d: c7 85 cc fe ff ff 00 movl $0x0,-0x134(%ebp) +801015a4: 00 00 00 + while ((c = getc()) >= 0) +801015a7: 8b 85 e8 fe ff ff mov -0x118(%ebp),%eax +801015ad: ff d0 call *%eax +801015af: 89 c3 mov %eax,%ebx +801015b1: 85 c0 test %eax,%eax +801015b3: 0f 88 97 00 00 00 js 80101650 + switch (c) +801015b9: 83 fb 1b cmp $0x1b,%ebx +801015bc: 7f 4a jg 80101608 +801015be: 83 fb 07 cmp $0x7,%ebx +801015c1: 0f 8e 19 01 00 00 jle 801016e0 +801015c7: 8d 43 f8 lea -0x8(%ebx),%eax +801015ca: 83 f8 13 cmp $0x13,%eax +801015cd: 0f 87 0d 01 00 00 ja 801016e0 +801015d3: ff 24 85 40 8a 10 80 jmp *-0x7fef75c0(,%eax,4) +801015da: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + inconsoleptr = currentconsole; +801015e0: a1 80 0e 11 80 mov 0x80110e80,%eax +801015e5: 89 85 c4 fe ff ff mov %eax,-0x13c(%ebp) + if (inconsoleptr == 0) +801015eb: 85 c0 test %eax,%eax +801015ed: 0f 85 71 ff ff ff jne 80101564 + inconsoleptr = &consoles[0]; +801015f3: c7 85 c4 fe ff ff a0 movl $0x80110ea0,-0x13c(%ebp) +801015fa: 0e 11 80 +801015fd: e9 62 ff ff ff jmp 80101564 +80101602: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + switch (c) +80101608: 81 fb e2 00 00 00 cmp $0xe2,%ebx +8010160e: 0f 84 a4 04 00 00 je 80101ab8 +80101614: 81 fb e3 00 00 00 cmp $0xe3,%ebx +8010161a: 0f 85 86 00 00 00 jne 801016a6 + if (menuactive) +80101620: 8b 15 bc b6 11 80 mov 0x8011b6bc,%edx +80101626: 85 d2 test %edx,%edx +80101628: 0f 84 79 ff ff ff je 801015a7 + navigatemenu(1); +8010162e: b8 01 00 00 00 mov $0x1,%eax +80101633: e8 48 ec ff ff call 80100280 + while ((c = getc()) >= 0) +80101638: 8b 85 e8 fe ff ff mov -0x118(%ebp),%eax +8010163e: ff d0 call *%eax +80101640: 89 c3 mov %eax,%ebx +80101642: 85 c0 test %eax,%eax +80101644: 0f 89 6f ff ff ff jns 801015b9 +8010164a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + release(&cons.lock); +80101650: 83 ec 0c sub $0xc,%esp +80101653: 68 80 b6 11 80 push $0x8011b680 +80101658: e8 c3 44 00 00 call 80105b20 + if (doprocdump && !menuactive) +8010165d: 8b 85 cc fe ff ff mov -0x134(%ebp),%eax +80101663: 83 c4 10 add $0x10,%esp +80101666: 85 c0 test %eax,%eax +80101668: 74 0d je 80101677 +8010166a: a1 bc b6 11 80 mov 0x8011b6bc,%eax +8010166f: 85 c0 test %eax,%eax +80101671: 0f 84 5a 05 00 00 je 80101bd1 + if (doconsolehome) +80101677: 8b 85 d4 fe ff ff mov -0x12c(%ebp),%eax +8010167d: 85 c0 test %eax,%eax +8010167f: 74 0f je 80101690 + if (currentconsole->consoleindex != 0) +80101681: a1 80 0e 11 80 mov 0x80110e80,%eax +80101686: 8b 00 mov (%eax),%eax +80101688: 85 c0 test %eax,%eax +8010168a: 0f 85 4b 05 00 00 jne 80101bdb + if (doconsoleswitch) +80101690: 8b 85 d0 fe ff ff mov -0x130(%ebp),%eax +80101696: 85 c0 test %eax,%eax +80101698: 0f 85 82 04 00 00 jne 80101b20 +} +8010169e: 8d 65 f4 lea -0xc(%ebp),%esp +801016a1: 5b pop %ebx +801016a2: 5e pop %esi +801016a3: 5f pop %edi +801016a4: 5d pop %ebp +801016a5: c3 ret + switch (c) +801016a6: 83 fb 7f cmp $0x7f,%ebx +801016a9: 75 35 jne 801016e0 + if (consolekbdbuffer->e != consolekbdbuffer->w) +801016ab: 8b bd d8 fe ff ff mov -0x128(%ebp),%edi +801016b1: 8b 87 64 10 00 00 mov 0x1064(%edi),%eax +801016b7: 3b 87 60 10 00 00 cmp 0x1060(%edi),%eax +801016bd: 0f 84 e4 fe ff ff je 801015a7 + consolekbdbuffer->e--; +801016c3: 83 e8 01 sub $0x1,%eax +801016c6: 89 87 64 10 00 00 mov %eax,0x1064(%edi) + if (panicked) +801016cc: a1 b8 b6 11 80 mov 0x8011b6b8,%eax +801016d1: 85 c0 test %eax,%eax +801016d3: 0f 84 17 05 00 00 je 80101bf0 + asm volatile ("cli"); +801016d9: fa cli + for (;;) +801016da: eb fe jmp 801016da +801016dc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (!menuactive) +801016e0: 8b 35 bc b6 11 80 mov 0x8011b6bc,%esi +801016e6: 85 f6 test %esi,%esi +801016e8: 0f 85 b9 fe ff ff jne 801015a7 +801016ee: e9 d8 02 00 00 jmp 801019cb + if (menuactive) +801016f3: 8b 1d bc b6 11 80 mov 0x8011b6bc,%ebx +801016f9: 85 db test %ebx,%ebx +801016fb: 0f 84 a6 fe ff ff je 801015a7 + loadscreenbuffer(currentconsole->screenbuffer); +80101701: a1 80 0e 11 80 mov 0x80110e80,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101706: 83 ec 04 sub $0x4,%esp + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80101709: be d4 03 00 00 mov $0x3d4,%esi +8010170e: 68 a0 0f 00 00 push $0xfa0 + loadscreenbuffer(currentconsole->screenbuffer); +80101713: 83 c0 3c add $0x3c,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101716: 50 push %eax +80101717: 68 00 80 0b 80 push $0x800b8000 +8010171c: e8 bf 45 00 00 call 80105ce0 + int pos = currentconsole->pos; +80101721: a1 80 0e 11 80 mov 0x80110e80,%eax +80101726: 89 f2 mov %esi,%edx +80101728: 8b 88 68 10 00 00 mov 0x1068(%eax),%ecx +8010172e: b8 0e 00 00 00 mov $0xe,%eax +80101733: ee out %al,(%dx) +80101734: bb d5 03 00 00 mov $0x3d5,%ebx + outb(CRTPORT + 1, pos >> 8); +80101739: 89 c8 mov %ecx,%eax +8010173b: c1 f8 08 sar $0x8,%eax +8010173e: 89 da mov %ebx,%edx +80101740: ee out %al,(%dx) +80101741: b8 0f 00 00 00 mov $0xf,%eax +80101746: 89 f2 mov %esi,%edx +80101748: ee out %al,(%dx) +80101749: 89 c8 mov %ecx,%eax +8010174b: 89 da mov %ebx,%edx +8010174d: ee out %al,(%dx) + menuactive = 0; +8010174e: c7 05 bc b6 11 80 00 movl $0x0,0x8011b6bc +80101755: 00 00 00 +} +80101758: 83 c4 10 add $0x10,%esp +8010175b: e9 47 fe ff ff jmp 801015a7 + while (consolekbdbuffer->e != consolekbdbuffer->w && +80101760: 8b bd d8 fe ff ff mov -0x128(%ebp),%edi +80101766: 8b 9d d8 fe ff ff mov -0x128(%ebp),%ebx +8010176c: 8b 87 64 10 00 00 mov 0x1064(%edi),%eax +80101772: 39 87 60 10 00 00 cmp %eax,0x1060(%edi) +80101778: 0f 84 29 fe ff ff je 801015a7 + consolekbdbuffer->buf[(consolekbdbuffer->e - 1) % INPUT_BUF] != '\n') +8010177e: 83 e8 01 sub $0x1,%eax +80101781: 89 c2 mov %eax,%edx +80101783: 83 e2 7f and $0x7f,%edx + while (consolekbdbuffer->e != consolekbdbuffer->w && +80101786: 80 bc 13 dc 0f 00 00 cmpb $0xa,0xfdc(%ebx,%edx,1) +8010178d: 0a +8010178e: 0f 84 13 fe ff ff je 801015a7 + consolekbdbuffer->e--; +80101794: 89 83 64 10 00 00 mov %eax,0x1064(%ebx) + if (panicked) +8010179a: a1 b8 b6 11 80 mov 0x8011b6b8,%eax +8010179f: 85 c0 test %eax,%eax +801017a1: 0f 84 2e 03 00 00 je 80101ad5 + asm volatile ("cli"); +801017a7: fa cli + for (;;) +801017a8: eb fe jmp 801017a8 +801017aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (!menuactive) +801017b0: a1 bc b6 11 80 mov 0x8011b6bc,%eax +801017b5: 85 c0 test %eax,%eax +801017b7: 0f 85 44 ff ff ff jne 80101701 + if (myproc() == 0x0) +801017bd: e8 ee 36 00 00 call 80104eb0 +801017c2: 85 c0 test %eax,%eax +801017c4: 0f 84 ef 03 00 00 je 80101bb9 + inconsoleptr = myproc()->consoleptr; +801017ca: e8 e1 36 00 00 call 80104eb0 +801017cf: 8b 70 7c mov 0x7c(%eax),%esi + if (inconsoleptr == 0) +801017d2: 85 f6 test %esi,%esi +801017d4: 0f 84 df 03 00 00 je 80101bb9 + for (int i = 0; i < MAXVCONSOLES; i++) +801017da: b8 0c 1f 11 80 mov $0x80111f0c,%eax +801017df: ba ec c5 11 80 mov $0x8011c5ec,%edx + int resultcount = 0; +801017e4: 31 ff xor %edi,%edi +801017e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801017ed: 8d 76 00 lea 0x0(%esi),%esi + resultcount++; +801017f0: 83 38 01 cmpl $0x1,(%eax) +801017f3: 83 df ff sbb $0xffffffff,%edi + for (int i = 0; i < MAXVCONSOLES; i++) +801017f6: 05 b0 10 00 00 add $0x10b0,%eax +801017fb: 39 c2 cmp %eax,%edx +801017fd: 75 f1 jne 801017f0 + int menuindex = 0; +801017ff: 31 d2 xor %edx,%edx +80101801: 89 b5 f0 fe ff ff mov %esi,-0x110(%ebp) +80101807: bb 18 1f 11 80 mov $0x80111f18,%ebx +8010180c: 89 bd f4 fe ff ff mov %edi,-0x10c(%ebp) +80101812: 89 d6 mov %edx,%esi +80101814: eb 18 jmp 8010182e +80101816: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010181d: 8d 76 00 lea 0x0(%esi),%esi + for (int i = 0; i < MAXVCONSOLES; i++) +80101820: 81 c3 b0 10 00 00 add $0x10b0,%ebx +80101826: 81 fb f8 c5 11 80 cmp $0x8011c5f8,%ebx +8010182c: 74 51 je 8010187f + if (consoles[i].active) +8010182e: 8b 43 f4 mov -0xc(%ebx),%eax +80101831: 85 c0 test %eax,%eax +80101833: 74 eb je 80101820 + memset(menulines[menuindex], 0, sizeof(menulines[i][0]) * sizeof(menulines[i])); +80101835: 8d 04 76 lea (%esi,%esi,2),%eax +80101838: 83 ec 04 sub $0x4,%esp +8010183b: 8d bc c5 f8 fe ff ff lea -0x108(%ebp,%eax,8),%edi +80101842: 6a 18 push $0x18 +80101844: 6a 00 push $0x0 +80101846: 57 push %edi +80101847: e8 f4 43 00 00 call 80105c40 + sprintf(menulines[menuindex], "%d: %s", consoles[i].consoleindex, consoles[i].proctitle); +8010184c: 53 push %ebx +8010184d: ff b3 88 ef ff ff push -0x1078(%ebx) +80101853: 68 09 8a 10 80 push $0x80108a09 +80101858: 57 push %edi +80101859: e8 a2 f3 ff ff call 80100c00 + if (consoles[i].inuse) +8010185e: 8b 43 f8 mov -0x8(%ebx),%eax +80101861: 83 c4 20 add $0x20,%esp +80101864: 85 c0 test %eax,%eax +80101866: 74 06 je 8010186e + currentmenuitem = menuindex; +80101868: 89 35 c0 b6 11 80 mov %esi,0x8011b6c0 + for (int i = 0; i < MAXVCONSOLES; i++) +8010186e: 81 c3 b0 10 00 00 add $0x10b0,%ebx + menuindex++; +80101874: 83 c6 01 add $0x1,%esi + for (int i = 0; i < MAXVCONSOLES; i++) +80101877: 81 fb f8 c5 11 80 cmp $0x8011c5f8,%ebx +8010187d: 75 af jne 8010182e + if (currentmenuitem == (y - 1)) +8010187f: a1 c0 b6 11 80 mov 0x8011b6c0,%eax +80101884: 8b bd f4 fe ff ff mov -0x10c(%ebp),%edi +8010188a: 31 db xor %ebx,%ebx +8010188c: c7 85 e0 fe ff ff 50 movl $0x50,-0x120(%ebp) +80101893: 00 00 00 +80101896: 8b b5 f0 fe ff ff mov -0x110(%ebp),%esi +8010189c: 89 85 dc fe ff ff mov %eax,-0x124(%ebp) +801018a2: 8d 85 f8 fe ff ff lea -0x108(%ebp),%eax +801018a8: 89 85 e4 fe ff ff mov %eax,-0x11c(%ebp) +801018ae: 8d 47 03 lea 0x3(%edi),%eax +801018b1: 89 85 c8 fe ff ff mov %eax,-0x138(%ebp) +801018b7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801018be: 66 90 xchg %ax,%ax + for (int x = 0; x < MENUWIDTH; x++) +801018c0: 8b 85 e0 fe ff ff mov -0x120(%ebp),%eax +801018c6: 89 b5 f4 fe ff ff mov %esi,-0x10c(%ebp) +801018cc: 8d 8c 00 00 80 0b 80 lea -0x7ff48000(%eax,%eax,1),%ecx +801018d3: 31 c0 xor %eax,%eax +801018d5: eb 77 jmp 8010194e +801018d7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801018de: 66 90 xchg %ax,%ax + if (y == 0 || y == (rows - 2)) +801018e0: 8d 57 01 lea 0x1(%edi),%edx +801018e3: 39 da cmp %ebx,%edx +801018e5: 74 6b je 80101952 + else if (y == (rows - 1)) +801018e7: 8d 57 02 lea 0x2(%edi),%edx +801018ea: 39 da cmp %ebx,%edx +801018ec: 74 73 je 80101961 + if (x == 0 || x == (MENUWIDTH - 1)) +801018ee: be 01 00 00 04 mov $0x4000001,%esi +801018f3: 0f a3 c6 bt %eax,%esi +801018f6: 72 69 jb 80101961 + else if (x == 1 || x == (MENUWIDTH - 2)) +801018f8: be 02 00 00 02 mov $0x2000002,%esi +801018fd: ba 20 07 00 00 mov $0x720,%edx +80101902: 0f a3 c6 bt %eax,%esi +80101905: 72 39 jb 80101940 + c = (c & 0xff); +80101907: 8b b5 e4 fe ff ff mov -0x11c(%ebp),%esi +8010190d: 0f b6 54 06 e6 movzbl -0x1a(%esi,%eax,1),%edx + if (currentmenuitem == (y - 1)) +80101912: 8d 73 ff lea -0x1(%ebx),%esi +80101915: 89 b5 f0 fe ff ff mov %esi,-0x110(%ebp) + crt[pos] = c; +8010191b: 89 d6 mov %edx,%esi +8010191d: 80 ce cf or $0xcf,%dh +80101920: 81 ce 00 07 00 00 or $0x700,%esi +80101926: 89 b5 ec fe ff ff mov %esi,-0x114(%ebp) +8010192c: 8b b5 f0 fe ff ff mov -0x110(%ebp),%esi +80101932: 39 b5 dc fe ff ff cmp %esi,-0x124(%ebp) +80101938: 66 0f 45 95 ec fe ff cmovne -0x114(%ebp),%dx +8010193f: ff + for (int x = 0; x < MENUWIDTH; x++) +80101940: 83 c0 01 add $0x1,%eax + crt[pos] = c; +80101943: 66 89 11 mov %dx,(%ecx) + for (int x = 0; x < MENUWIDTH; x++) +80101946: 83 c1 02 add $0x2,%ecx +80101949: 83 f8 1b cmp $0x1b,%eax +8010194c: 74 32 je 80101980 + if (y == 0 || y == (rows - 2)) +8010194e: 85 db test %ebx,%ebx +80101950: 75 8e jne 801018e0 + if (x == 0 || x == (MENUWIDTH - 1)) +80101952: be 01 00 00 04 mov $0x4000001,%esi +80101957: ba 20 07 00 00 mov $0x720,%edx +8010195c: 0f a3 c6 bt %eax,%esi +8010195f: 73 df jae 80101940 + crt[pos] = c; +80101961: 8b b5 f4 fe ff ff mov -0x10c(%ebp),%esi + for (int x = 0; x < MENUWIDTH; x++) +80101967: 83 c0 01 add $0x1,%eax +8010196a: 83 c1 02 add $0x2,%ecx + crt[pos] = c; +8010196d: 0f b7 96 74 10 00 00 movzwl 0x1074(%esi),%edx +80101974: 80 ca b2 or $0xb2,%dl +80101977: 66 89 51 fe mov %dx,-0x2(%ecx) + for (int x = 0; x < MENUWIDTH; x++) +8010197b: 83 f8 1b cmp $0x1b,%eax +8010197e: 75 ce jne 8010194e + for (int y = 0; y < rows; y++) +80101980: 83 85 e0 fe ff ff 50 addl $0x50,-0x120(%ebp) +80101987: 8b b5 f4 fe ff ff mov -0x10c(%ebp),%esi +8010198d: 83 c3 01 add $0x1,%ebx +80101990: 83 85 e4 fe ff ff 18 addl $0x18,-0x11c(%ebp) +80101997: 3b 9d c8 fe ff ff cmp -0x138(%ebp),%ebx +8010199d: 0f 85 1d ff ff ff jne 801018c0 + menuactive = 1; +801019a3: c7 05 bc b6 11 80 01 movl $0x1,0x8011b6bc +801019aa: 00 00 00 +} +801019ad: e9 f5 fb ff ff jmp 801015a7 + doconsolehome = 1; +801019b2: c7 85 d4 fe ff ff 01 movl $0x1,-0x12c(%ebp) +801019b9: 00 00 00 + break; +801019bc: e9 e6 fb ff ff jmp 801015a7 + if (menuactive) +801019c1: 8b 3d bc b6 11 80 mov 0x8011b6bc,%edi +801019c7: 85 ff test %edi,%edi +801019c9: 75 65 jne 80101a30 + if (c != 0 && consolekbdbuffer->e - consolekbdbuffer->r < INPUT_BUF) +801019cb: 8b 85 c4 fe ff ff mov -0x13c(%ebp),%eax +801019d1: 8b 88 70 10 00 00 mov 0x1070(%eax),%ecx +801019d7: 85 c9 test %ecx,%ecx +801019d9: 0f 84 c8 fb ff ff je 801015a7 +801019df: 85 db test %ebx,%ebx +801019e1: 0f 84 c0 fb ff ff je 801015a7 +801019e7: 8b bd d8 fe ff ff mov -0x128(%ebp),%edi +801019ed: 8b 87 64 10 00 00 mov 0x1064(%edi),%eax +801019f3: 89 c2 mov %eax,%edx +801019f5: 2b 97 5c 10 00 00 sub 0x105c(%edi),%edx +801019fb: 83 fa 7f cmp $0x7f,%edx +801019fe: 0f 87 a3 fb ff ff ja 801015a7 + consolekbdbuffer->buf[consolekbdbuffer->e++ % INPUT_BUF] = c; +80101a04: 8d 50 01 lea 0x1(%eax),%edx +80101a07: 83 e0 7f and $0x7f,%eax +80101a0a: 89 97 64 10 00 00 mov %edx,0x1064(%edi) + if (panicked) +80101a10: 8b 15 b8 b6 11 80 mov 0x8011b6b8,%edx + consolekbdbuffer->buf[consolekbdbuffer->e++ % INPUT_BUF] = c; +80101a16: 88 9c 07 dc 0f 00 00 mov %bl,0xfdc(%edi,%eax,1) + if (panicked) +80101a1d: 85 d2 test %edx,%edx +80101a1f: 0f 84 65 02 00 00 je 80101c8a +80101a25: fa cli + for (;;) +80101a26: eb fe jmp 80101a26 +80101a28: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101a2f: 90 nop + loadscreenbuffer(currentconsole->screenbuffer); +80101a30: a1 80 0e 11 80 mov 0x80110e80,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101a35: 83 ec 04 sub $0x4,%esp + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80101a38: be d4 03 00 00 mov $0x3d4,%esi +80101a3d: 68 a0 0f 00 00 push $0xfa0 + loadscreenbuffer(currentconsole->screenbuffer); +80101a42: 83 c0 3c add $0x3c,%eax + memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101a45: 50 push %eax +80101a46: 68 00 80 0b 80 push $0x800b8000 +80101a4b: e8 90 42 00 00 call 80105ce0 + int pos = currentconsole->pos; +80101a50: a1 80 0e 11 80 mov 0x80110e80,%eax +80101a55: 89 f2 mov %esi,%edx +80101a57: 8b 88 68 10 00 00 mov 0x1068(%eax),%ecx +80101a5d: b8 0e 00 00 00 mov $0xe,%eax +80101a62: ee out %al,(%dx) +80101a63: bb d5 03 00 00 mov $0x3d5,%ebx + outb(CRTPORT + 1, pos >> 8); +80101a68: 89 c8 mov %ecx,%eax +80101a6a: c1 f8 08 sar $0x8,%eax +80101a6d: 89 da mov %ebx,%edx +80101a6f: ee out %al,(%dx) +80101a70: b8 0f 00 00 00 mov $0xf,%eax +80101a75: 89 f2 mov %esi,%edx +80101a77: ee out %al,(%dx) +80101a78: 89 c8 mov %ecx,%eax +80101a7a: 89 da mov %ebx,%edx +80101a7c: ee out %al,(%dx) + switchto = currentmenuitem; +80101a7d: a1 c0 b6 11 80 mov 0x8011b6c0,%eax + break; +80101a82: 83 c4 10 add $0x10,%esp + menuactive = 0; +80101a85: c7 05 bc b6 11 80 00 movl $0x0,0x8011b6bc +80101a8c: 00 00 00 + switchto = currentmenuitem; +80101a8f: 89 85 c0 fe ff ff mov %eax,-0x140(%ebp) + doconsoleswitch = 1; +80101a95: c7 85 d0 fe ff ff 01 movl $0x1,-0x130(%ebp) +80101a9c: 00 00 00 + break; +80101a9f: e9 03 fb ff ff jmp 801015a7 + doprocdump = 1; +80101aa4: c7 85 cc fe ff ff 01 movl $0x1,-0x134(%ebp) +80101aab: 00 00 00 +80101aae: e9 f4 fa ff ff jmp 801015a7 +80101ab3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80101ab7: 90 nop + if (menuactive) +80101ab8: 8b 0d bc b6 11 80 mov 0x8011b6bc,%ecx +80101abe: 85 c9 test %ecx,%ecx +80101ac0: 0f 84 e1 fa ff ff je 801015a7 + navigatemenu(-1); +80101ac6: b8 ff ff ff ff mov $0xffffffff,%eax +80101acb: e8 b0 e7 ff ff call 80100280 +80101ad0: e9 d2 fa ff ff jmp 801015a7 + uartputc('\b'); +80101ad5: 83 ec 0c sub $0xc,%esp +80101ad8: 6a 08 push $0x8 +80101ada: e8 71 59 00 00 call 80107450 + uartputc(' '); +80101adf: c7 04 24 20 00 00 00 movl $0x20,(%esp) +80101ae6: e8 65 59 00 00 call 80107450 + uartputc('\b'); +80101aeb: c7 04 24 08 00 00 00 movl $0x8,(%esp) +80101af2: e8 59 59 00 00 call 80107450 + cgaputc(c); +80101af7: b8 00 01 00 00 mov $0x100,%eax +80101afc: e8 ff e9 ff ff call 80100500 + while (consolekbdbuffer->e != consolekbdbuffer->w && +80101b01: 8b 83 64 10 00 00 mov 0x1064(%ebx),%eax +80101b07: 83 c4 10 add $0x10,%esp +80101b0a: 3b 83 60 10 00 00 cmp 0x1060(%ebx),%eax +80101b10: 0f 85 68 fc ff ff jne 8010177e +80101b16: e9 8c fa ff ff jmp 801015a7 +80101b1b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80101b1f: 90 nop + acquire(&vcons.lock); +80101b20: 83 ec 0c sub $0xc,%esp +80101b23: 68 40 b6 11 80 push $0x8011b640 +80101b28: e8 53 40 00 00 call 80105b80 + acquire(&cons.lock); +80101b2d: c7 04 24 80 b6 11 80 movl $0x8011b680,(%esp) +80101b34: e8 47 40 00 00 call 80105b80 + if (switchto == -1) +80101b39: 83 c4 10 add $0x10,%esp + int resultcount = 0; +80101b3c: 31 c9 xor %ecx,%ecx + for (int i = 0; i < MAXVCONSOLES; i++) +80101b3e: 31 c0 xor %eax,%eax + if (switchto == -1) +80101b40: 83 bd c0 fe ff ff ff cmpl $0xffffffff,-0x140(%ebp) +80101b47: 8b 9d c0 fe ff ff mov -0x140(%ebp),%ebx +80101b4d: 0f 84 d1 00 00 00 je 80101c24 +80101b53: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80101b57: 90 nop + if (consoles[i].active) +80101b58: 69 d0 b0 10 00 00 imul $0x10b0,%eax,%edx +80101b5e: 8b b2 0c 1f 11 80 mov -0x7feee0f4(%edx),%esi +80101b64: 85 f6 test %esi,%esi +80101b66: 74 0b je 80101b73 + if (resultcount == menuindex) +80101b68: 39 cb cmp %ecx,%ebx +80101b6a: 0f 84 05 01 00 00 je 80101c75 + resultcount++; +80101b70: 83 c1 01 add $0x1,%ecx + for (int i = 0; i < MAXVCONSOLES; i++) +80101b73: 83 c0 01 add $0x1,%eax +80101b76: 83 f8 0a cmp $0xa,%eax +80101b79: 75 dd jne 80101b58 + toconsole = getbaseconsoleptr(); +80101b7b: bb a0 0e 11 80 mov $0x80110ea0,%ebx + release(&cons.lock); +80101b80: 83 ec 0c sub $0xc,%esp +80101b83: 68 80 b6 11 80 push $0x8011b680 +80101b88: e8 93 3f 00 00 call 80105b20 + release(&vcons.lock); +80101b8d: c7 04 24 40 b6 11 80 movl $0x8011b640,(%esp) +80101b94: e8 87 3f 00 00 call 80105b20 + if (!toconsole->inuse) +80101b99: 8b 83 70 10 00 00 mov 0x1070(%ebx),%eax +80101b9f: 83 c4 10 add $0x10,%esp +80101ba2: 85 c0 test %eax,%eax +80101ba4: 0f 85 f4 fa ff ff jne 8010169e + switchtoconsole(toconsole); +80101baa: 89 5d 08 mov %ebx,0x8(%ebp) +} +80101bad: 8d 65 f4 lea -0xc(%ebp),%esp +80101bb0: 5b pop %ebx +80101bb1: 5e pop %esi +80101bb2: 5f pop %edi +80101bb3: 5d pop %ebp + switchtoconsole(toconsole); +80101bb4: e9 27 f8 ff ff jmp 801013e0 + inconsoleptr = currentconsole; +80101bb9: 8b 35 80 0e 11 80 mov 0x80110e80,%esi + if (inconsoleptr == 0) +80101bbf: 85 f6 test %esi,%esi +80101bc1: 0f 85 13 fc ff ff jne 801017da + inconsoleptr = &consoles[0]; +80101bc7: be a0 0e 11 80 mov $0x80110ea0,%esi +80101bcc: e9 09 fc ff ff jmp 801017da + procdump(); // now call procdump() wo. cons.lock held +80101bd1: e8 aa 3b 00 00 call 80105780 +80101bd6: e9 9c fa ff ff jmp 80101677 + switchtoconsole(getbaseconsoleptr()); +80101bdb: 83 ec 0c sub $0xc,%esp +80101bde: 68 a0 0e 11 80 push $0x80110ea0 +80101be3: e8 f8 f7 ff ff call 801013e0 +80101be8: 83 c4 10 add $0x10,%esp +80101beb: e9 a0 fa ff ff jmp 80101690 + uartputc('\b'); +80101bf0: 83 ec 0c sub $0xc,%esp +80101bf3: 6a 08 push $0x8 +80101bf5: e8 56 58 00 00 call 80107450 + uartputc(' '); +80101bfa: c7 04 24 20 00 00 00 movl $0x20,(%esp) +80101c01: e8 4a 58 00 00 call 80107450 + uartputc('\b'); +80101c06: c7 04 24 08 00 00 00 movl $0x8,(%esp) +80101c0d: e8 3e 58 00 00 call 80107450 + cgaputc(c); +80101c12: b8 00 01 00 00 mov $0x100,%eax +80101c17: e8 e4 e8 ff ff call 80100500 +} +80101c1c: 83 c4 10 add $0x10,%esp +80101c1f: e9 83 f9 ff ff jmp 801015a7 + for (int i = (currentconsole->consoleindex + 1); i < MAXVCONSOLES; i++) +80101c24: a1 80 0e 11 80 mov 0x80110e80,%eax +80101c29: 8b 10 mov (%eax),%edx +80101c2b: 8d 42 01 lea 0x1(%edx),%eax +80101c2e: 83 f8 09 cmp $0x9,%eax +80101c31: 0f 8f 44 ff ff ff jg 80101b7b +80101c37: 69 d2 b0 10 00 00 imul $0x10b0,%edx,%edx +80101c3d: 81 c2 a0 0e 11 80 add $0x80110ea0,%edx +80101c43: eb 15 jmp 80101c5a +80101c45: 8d 76 00 lea 0x0(%esi),%esi +80101c48: 83 c0 01 add $0x1,%eax +80101c4b: 81 c2 b0 10 00 00 add $0x10b0,%edx +80101c51: 83 f8 0a cmp $0xa,%eax +80101c54: 0f 84 21 ff ff ff je 80101b7b + if (consoles[i].active) +80101c5a: 8b ba 1c 21 00 00 mov 0x211c(%edx),%edi +80101c60: 85 ff test %edi,%edi +80101c62: 74 e4 je 80101c48 + toconsole = &consoles[i]; +80101c64: 69 c0 b0 10 00 00 imul $0x10b0,%eax,%eax +80101c6a: 8d 98 a0 0e 11 80 lea -0x7feef160(%eax),%ebx + if (toconsole == 0) +80101c70: e9 0b ff ff ff jmp 80101b80 + toconsole = &consoles[getmenuindexconsole(switchto)]; +80101c75: 69 9a a0 0e 11 80 b0 imul $0x10b0,-0x7feef160(%edx),%ebx +80101c7c: 10 00 00 +80101c7f: 81 c3 a0 0e 11 80 add $0x80110ea0,%ebx + break; +80101c85: e9 f6 fe ff ff jmp 80101b80 + if (c == BACKSPACE) +80101c8a: 81 fb 00 01 00 00 cmp $0x100,%ebx +80101c90: 74 61 je 80101cf3 + uartputc(c); +80101c92: 83 ec 0c sub $0xc,%esp +80101c95: 53 push %ebx +80101c96: e8 b5 57 00 00 call 80107450 + cgaputc(c); +80101c9b: 89 d8 mov %ebx,%eax +80101c9d: e8 5e e8 ff ff call 80100500 + if (c == '\n' || c == C('D') || consolekbdbuffer->e == consolekbdbuffer->r + INPUT_BUF) +80101ca2: 83 c4 10 add $0x10,%esp +80101ca5: 83 fb 0a cmp $0xa,%ebx +80101ca8: 74 7a je 80101d24 +80101caa: 83 fb 04 cmp $0x4,%ebx +80101cad: 74 75 je 80101d24 +80101caf: 8b bd d8 fe ff ff mov -0x128(%ebp),%edi +80101cb5: 8b 87 5c 10 00 00 mov 0x105c(%edi),%eax +80101cbb: 89 85 f4 fe ff ff mov %eax,-0x10c(%ebp) +80101cc1: 83 e8 80 sub $0xffffff80,%eax +80101cc4: 39 87 64 10 00 00 cmp %eax,0x1064(%edi) +80101cca: 0f 85 d7 f8 ff ff jne 801015a7 + consolekbdbuffer->w = consolekbdbuffer->e; +80101cd0: 8b bd d8 fe ff ff mov -0x128(%ebp),%edi + wakeup(&(consolekbdbuffer->r)); +80101cd6: 83 ec 0c sub $0xc,%esp + consolekbdbuffer->w = consolekbdbuffer->e; +80101cd9: 89 87 60 10 00 00 mov %eax,0x1060(%edi) + wakeup(&(consolekbdbuffer->r)); +80101cdf: 8d 87 5c 10 00 00 lea 0x105c(%edi),%eax +80101ce5: 50 push %eax +80101ce6: e8 b5 39 00 00 call 801056a0 +80101ceb: 83 c4 10 add $0x10,%esp +80101cee: e9 b4 f8 ff ff jmp 801015a7 + uartputc('\b'); +80101cf3: 83 ec 0c sub $0xc,%esp +80101cf6: 6a 08 push $0x8 +80101cf8: e8 53 57 00 00 call 80107450 + uartputc(' '); +80101cfd: c7 04 24 20 00 00 00 movl $0x20,(%esp) +80101d04: e8 47 57 00 00 call 80107450 + uartputc('\b'); +80101d09: c7 04 24 08 00 00 00 movl $0x8,(%esp) +80101d10: e8 3b 57 00 00 call 80107450 + cgaputc(c); +80101d15: b8 00 01 00 00 mov $0x100,%eax +80101d1a: e8 e1 e7 ff ff call 80100500 +80101d1f: 83 c4 10 add $0x10,%esp +80101d22: eb 8b jmp 80101caf + consolekbdbuffer->w = consolekbdbuffer->e; +80101d24: 8b 85 d8 fe ff ff mov -0x128(%ebp),%eax +80101d2a: 8b 80 64 10 00 00 mov 0x1064(%eax),%eax +80101d30: eb 9e jmp 80101cd0 +80101d32: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101d39: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80101d40 : + +// Function for closing the current console +int closeconsole(void) +{ +80101d40: 55 push %ebp +80101d41: 89 e5 mov %esp,%ebp +80101d43: 53 push %ebx +80101d44: 83 ec 04 sub $0x4,%esp + struct vconsole* consoleptr = myproc()->consoleptr; +80101d47: e8 64 31 00 00 call 80104eb0 + + acquire(&vcons.lock); +80101d4c: 83 ec 0c sub $0xc,%esp + struct vconsole* consoleptr = myproc()->consoleptr; +80101d4f: 8b 58 7c mov 0x7c(%eax),%ebx + acquire(&vcons.lock); +80101d52: 68 40 b6 11 80 push $0x8011b640 +80101d57: e8 24 3e 00 00 call 80105b80 + // Check if the process exiting is the consoles parent process we clear the buffer and set the active to 0 + if (myproc() == consoleptr->processowner) +80101d5c: e8 4f 31 00 00 call 80104eb0 +80101d61: 83 c4 10 add $0x10,%esp +80101d64: 39 43 38 cmp %eax,0x38(%ebx) +80101d67: 74 17 je 80101d80 + release(&vcons.lock); + switchtoconsole(&consoles[0]); + return 1; + } + } + release(&vcons.lock); +80101d69: 83 ec 0c sub $0xc,%esp +80101d6c: 68 40 b6 11 80 push $0x8011b640 +80101d71: e8 aa 3d 00 00 call 80105b20 + return 0; +80101d76: 83 c4 10 add $0x10,%esp +80101d79: 31 c0 xor %eax,%eax +} +80101d7b: 8b 5d fc mov -0x4(%ebp),%ebx +80101d7e: c9 leave +80101d7f: c3 ret + memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101d80: 83 ec 04 sub $0x4,%esp + clearconsole(consoleptr->screenbuffer); +80101d83: 8d 43 3c lea 0x3c(%ebx),%eax + memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH); +80101d86: 68 a0 0f 00 00 push $0xfa0 +80101d8b: 6a 00 push $0x0 +80101d8d: 50 push %eax +80101d8e: e8 ad 3e 00 00 call 80105c40 + if (consoleptr->inuse) +80101d93: 8b 83 70 10 00 00 mov 0x1070(%ebx),%eax +80101d99: 83 c4 10 add $0x10,%esp + consoleptr->active = 0; +80101d9c: c7 83 6c 10 00 00 00 movl $0x0,0x106c(%ebx) +80101da3: 00 00 00 + if (consoleptr->inuse) +80101da6: 85 c0 test %eax,%eax +80101da8: 74 bf je 80101d69 + consoleptr->inuse = 0; +80101daa: c7 83 70 10 00 00 00 movl $0x0,0x1070(%ebx) +80101db1: 00 00 00 + release(&vcons.lock); +80101db4: 83 ec 0c sub $0xc,%esp +80101db7: 68 40 b6 11 80 push $0x8011b640 +80101dbc: e8 5f 3d 00 00 call 80105b20 + switchtoconsole(&consoles[0]); +80101dc1: c7 04 24 a0 0e 11 80 movl $0x80110ea0,(%esp) +80101dc8: e8 13 f6 ff ff call 801013e0 + return 1; +80101dcd: 83 c4 10 add $0x10,%esp +80101dd0: b8 01 00 00 00 mov $0x1,%eax +80101dd5: eb a4 jmp 80101d7b +80101dd7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101dde: 66 90 xchg %ax,%ax + +80101de0 : + +// Function for getting the console index of the current inuse console +int getcurrentconsoleindex(void) +{ +80101de0: 55 push %ebp +80101de1: 89 e5 mov %esp,%ebp +80101de3: 53 push %ebx + acquire(&vcons.lock); + for (int i = 0; i < MAXVCONSOLES; i++) +80101de4: 31 db xor %ebx,%ebx +{ +80101de6: 83 ec 10 sub $0x10,%esp + acquire(&vcons.lock); +80101de9: 68 40 b6 11 80 push $0x8011b640 +80101dee: e8 8d 3d 00 00 call 80105b80 + for (int i = 0; i < MAXVCONSOLES; i++) +80101df3: b8 10 1f 11 80 mov $0x80111f10,%eax +80101df8: 83 c4 10 add $0x10,%esp +80101dfb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80101dff: 90 nop + { + if (consoles[i].inuse) +80101e00: 8b 10 mov (%eax),%edx +80101e02: 85 d2 test %edx,%edx +80101e04: 75 2a jne 80101e30 + for (int i = 0; i < MAXVCONSOLES; i++) +80101e06: 83 c3 01 add $0x1,%ebx +80101e09: 05 b0 10 00 00 add $0x10b0,%eax +80101e0e: 83 fb 0a cmp $0xa,%ebx +80101e11: 75 ed jne 80101e00 + { + release(&vcons.lock); + return consoles[i].consoleindex; + } + } + release(&vcons.lock); +80101e13: 83 ec 0c sub $0xc,%esp +80101e16: 68 40 b6 11 80 push $0x8011b640 +80101e1b: e8 00 3d 00 00 call 80105b20 + return -1; +} +80101e20: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80101e23: 83 c4 10 add $0x10,%esp +80101e26: b8 ff ff ff ff mov $0xffffffff,%eax +} +80101e2b: c9 leave +80101e2c: c3 ret +80101e2d: 8d 76 00 lea 0x0(%esi),%esi + release(&vcons.lock); +80101e30: 83 ec 0c sub $0xc,%esp + return consoles[i].consoleindex; +80101e33: 69 db b0 10 00 00 imul $0x10b0,%ebx,%ebx + release(&vcons.lock); +80101e39: 68 40 b6 11 80 push $0x8011b640 +80101e3e: e8 dd 3c 00 00 call 80105b20 + return consoles[i].consoleindex; +80101e43: 8b 83 a0 0e 11 80 mov -0x7feef160(%ebx),%eax +80101e49: 83 c4 10 add $0x10,%esp +} +80101e4c: 8b 5d fc mov -0x4(%ebp),%ebx +80101e4f: c9 leave +80101e50: c3 ret +80101e51: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101e58: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101e5f: 90 nop + +80101e60 : + +// Function for setting the title of a console for the title bar and menu +void setconsoleproctitle(struct vconsole* consoleptr, char* newtitle) +{ +80101e60: 55 push %ebp +80101e61: 89 e5 mov %esp,%ebp +80101e63: 56 push %esi +80101e64: 53 push %ebx +80101e65: 8b 5d 08 mov 0x8(%ebp),%ebx +80101e68: 8b 75 0c mov 0xc(%ebp),%esi + if (!consoleptr->titlelocked) +80101e6b: 8b 83 8c 10 00 00 mov 0x108c(%ebx),%eax +80101e71: 85 c0 test %eax,%eax +80101e73: 74 0b je 80101e80 + //Redraw the title since its been updated now + drawtitle(); + + release(&vcons.lock); + } +80101e75: 8d 65 f8 lea -0x8(%ebp),%esp +80101e78: 5b pop %ebx +80101e79: 5e pop %esi +80101e7a: 5d pop %ebp +80101e7b: c3 ret +80101e7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + acquire(&vcons.lock); +80101e80: 83 ec 0c sub $0xc,%esp + memset(consoleptr->proctitle, 0, sizeof(consoleptr->proctitle[0]) * sizeof(consoleptr->proctitle)); +80101e83: 81 c3 78 10 00 00 add $0x1078,%ebx + acquire(&vcons.lock); +80101e89: 68 40 b6 11 80 push $0x8011b640 +80101e8e: e8 ed 3c 00 00 call 80105b80 + memset(consoleptr->proctitle, 0, sizeof(consoleptr->proctitle[0]) * sizeof(consoleptr->proctitle)); +80101e93: 83 c4 0c add $0xc,%esp +80101e96: 6a 14 push $0x14 +80101e98: 6a 00 push $0x0 +80101e9a: 53 push %ebx +80101e9b: e8 a0 3d 00 00 call 80105c40 + safestrcpy(consoleptr->proctitle, newtitle, sizeof(consoleptr->proctitle)); +80101ea0: 83 c4 0c add $0xc,%esp +80101ea3: 6a 14 push $0x14 +80101ea5: 56 push %esi +80101ea6: 53 push %ebx +80101ea7: e8 54 3f 00 00 call 80105e00 + drawtitle(); +80101eac: e8 df ef ff ff call 80100e90 + release(&vcons.lock); +80101eb1: c7 45 08 40 b6 11 80 movl $0x8011b640,0x8(%ebp) +80101eb8: 83 c4 10 add $0x10,%esp +80101ebb: 8d 65 f8 lea -0x8(%ebp),%esp +80101ebe: 5b pop %ebx +80101ebf: 5e pop %esi +80101ec0: 5d pop %ebp + release(&vcons.lock); +80101ec1: e9 5a 3c 00 00 jmp 80105b20 +80101ec6: 66 90 xchg %ax,%ax +80101ec8: 66 90 xchg %ax,%ax +80101eca: 66 90 xchg %ax,%ax +80101ecc: 66 90 xchg %ax,%ax +80101ece: 66 90 xchg %ax,%ax + +80101ed0 : +#include "proc.h" +#include "defs.h" +#include "x86.h" +#include "elf.h" + +void cleanupexec(pde_t * pgdir, struct inode *ip) { +80101ed0: 55 push %ebp +80101ed1: 89 e5 mov %esp,%ebp +80101ed3: 53 push %ebx +80101ed4: 83 ec 04 sub $0x4,%esp +80101ed7: 8b 45 08 mov 0x8(%ebp),%eax +80101eda: 8b 5d 0c mov 0xc(%ebp),%ebx + if (pgdir) { +80101edd: 85 c0 test %eax,%eax +80101edf: 74 0c je 80101eed + freevm(pgdir); +80101ee1: 83 ec 0c sub $0xc,%esp +80101ee4: 50 push %eax +80101ee5: e8 76 66 00 00 call 80108560 +80101eea: 83 c4 10 add $0x10,%esp + } + if (ip) { +80101eed: 85 db test %ebx,%ebx +80101eef: 74 1f je 80101f10 + iunlockput(ip); +80101ef1: 83 ec 0c sub $0xc,%esp +80101ef4: 53 push %ebx +80101ef5: e8 06 10 00 00 call 80102f00 + end_op(); + } +} +80101efa: 8b 5d fc mov -0x4(%ebp),%ebx + end_op(); +80101efd: 83 c4 10 add $0x10,%esp +} +80101f00: c9 leave + end_op(); +80101f01: e9 ba 23 00 00 jmp 801042c0 +80101f06: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101f0d: 8d 76 00 lea 0x0(%esi),%esi +} +80101f10: 8b 5d fc mov -0x4(%ebp),%ebx +80101f13: c9 leave +80101f14: c3 ret +80101f15: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80101f1c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80101f20 : + +int exec(char *path, char **argv) { +80101f20: 55 push %ebp +80101f21: 89 e5 mov %esp,%ebp +80101f23: 57 push %edi +80101f24: 56 push %esi +80101f25: 53 push %ebx +80101f26: 81 ec 0c 01 00 00 sub $0x10c,%esp + uint argc, sz, sp, ustack[3 + MAXARG + 1]; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pde_t *pgdir, *oldpgdir; + struct proc *curproc = myproc(); +80101f2c: e8 7f 2f 00 00 call 80104eb0 +80101f31: 89 85 ec fe ff ff mov %eax,-0x114(%ebp) + + begin_op(); +80101f37: e8 14 23 00 00 call 80104250 + + if ((ip = namei(path)) == 0) { +80101f3c: 83 ec 0c sub $0xc,%esp +80101f3f: ff 75 08 push 0x8(%ebp) +80101f42: e8 49 16 00 00 call 80103590 +80101f47: 83 c4 10 add $0x10,%esp +80101f4a: 85 c0 test %eax,%eax +80101f4c: 0f 84 6b 03 00 00 je 801022bd + end_op(); + cprintf("exec: fail\n"); + return -1; + } + ilock(ip); +80101f52: 83 ec 0c sub $0xc,%esp +80101f55: 89 c7 mov %eax,%edi +80101f57: 50 push %eax +80101f58: e8 13 0d 00 00 call 80102c70 + pgdir = 0; + + // Check ELF header + if (readi(ip, (char*)&elf, 0, sizeof(elf)) != sizeof(elf)) { +80101f5d: 8d 85 24 ff ff ff lea -0xdc(%ebp),%eax +80101f63: 6a 34 push $0x34 +80101f65: 6a 00 push $0x0 +80101f67: 50 push %eax +80101f68: 57 push %edi +80101f69: e8 12 10 00 00 call 80102f80 +80101f6e: 83 c4 20 add $0x20,%esp +80101f71: 83 f8 34 cmp $0x34,%eax +80101f74: 0f 85 f8 02 00 00 jne 80102272 + cleanupexec(pgdir, ip); + return -1; + } + if (elf.magic != ELF_MAGIC) { +80101f7a: 81 bd 24 ff ff ff 7f cmpl $0x464c457f,-0xdc(%ebp) +80101f81: 45 4c 46 +80101f84: 0f 85 e8 02 00 00 jne 80102272 + cleanupexec(pgdir, ip); + return -1; + } + + if ((pgdir = setupkvm()) == 0) { +80101f8a: e8 51 66 00 00 call 801085e0 +80101f8f: 89 85 f4 fe ff ff mov %eax,-0x10c(%ebp) +80101f95: 85 c0 test %eax,%eax +80101f97: 0f 84 d5 02 00 00 je 80102272 + return -1; + } + + // Load program into memory. + sz = 0; + for (i = 0, off = elf.phoff; i < elf.phnum; i++, off += sizeof(ph)) { +80101f9d: 66 83 bd 50 ff ff ff cmpw $0x0,-0xb0(%ebp) +80101fa4: 00 +80101fa5: 8b 9d 40 ff ff ff mov -0xc0(%ebp),%ebx +80101fab: 0f 84 dc 02 00 00 je 8010228d + sz = 0; +80101fb1: c7 85 f0 fe ff ff 00 movl $0x0,-0x110(%ebp) +80101fb8: 00 00 00 + for (i = 0, off = elf.phoff; i < elf.phnum; i++, off += sizeof(ph)) { +80101fbb: 31 f6 xor %esi,%esi +80101fbd: e9 8c 00 00 00 jmp 8010204e +80101fc2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (readi(ip, (char*)&ph, off, sizeof(ph)) != sizeof(ph)) { + cleanupexec(pgdir, ip); + return -1; + } + if (ph.type != ELF_PROG_LOAD) { +80101fc8: 83 bd 04 ff ff ff 01 cmpl $0x1,-0xfc(%ebp) +80101fcf: 75 6c jne 8010203d + continue; + } + if (ph.memsz < ph.filesz) { +80101fd1: 8b 85 18 ff ff ff mov -0xe8(%ebp),%eax +80101fd7: 3b 85 14 ff ff ff cmp -0xec(%ebp),%eax +80101fdd: 0f 82 87 00 00 00 jb 8010206a + cleanupexec(pgdir, ip); + return -1; + } + if (ph.vaddr + ph.memsz < ph.vaddr) { +80101fe3: 03 85 0c ff ff ff add -0xf4(%ebp),%eax +80101fe9: 72 7f jb 8010206a + cleanupexec(pgdir, ip); + return -1; + } + if ((sz = allocuvm(pgdir, sz, ph.vaddr + ph.memsz)) == 0) { +80101feb: 83 ec 04 sub $0x4,%esp +80101fee: 50 push %eax +80101fef: ff b5 f0 fe ff ff push -0x110(%ebp) +80101ff5: ff b5 f4 fe ff ff push -0x10c(%ebp) +80101ffb: e8 00 64 00 00 call 80108400 +80102000: 83 c4 10 add $0x10,%esp +80102003: 89 85 f0 fe ff ff mov %eax,-0x110(%ebp) +80102009: 85 c0 test %eax,%eax +8010200b: 74 5d je 8010206a + cleanupexec(pgdir, ip); + return -1; + } + if (ph.vaddr % PGSIZE != 0) { +8010200d: 8b 85 0c ff ff ff mov -0xf4(%ebp),%eax +80102013: a9 ff 0f 00 00 test $0xfff,%eax +80102018: 75 50 jne 8010206a + cleanupexec(pgdir, ip); + return -1; + } + if (loaduvm(pgdir, (char*)ph.vaddr, ip, ph.off, ph.filesz) < 0) { +8010201a: 83 ec 0c sub $0xc,%esp +8010201d: ff b5 14 ff ff ff push -0xec(%ebp) +80102023: ff b5 08 ff ff ff push -0xf8(%ebp) +80102029: 57 push %edi +8010202a: 50 push %eax +8010202b: ff b5 f4 fe ff ff push -0x10c(%ebp) +80102031: e8 da 62 00 00 call 80108310 +80102036: 83 c4 20 add $0x20,%esp +80102039: 85 c0 test %eax,%eax +8010203b: 78 2d js 8010206a + for (i = 0, off = elf.phoff; i < elf.phnum; i++, off += sizeof(ph)) { +8010203d: 0f b7 85 50 ff ff ff movzwl -0xb0(%ebp),%eax +80102044: 83 c6 01 add $0x1,%esi +80102047: 83 c3 20 add $0x20,%ebx +8010204a: 39 f0 cmp %esi,%eax +8010204c: 7e 4a jle 80102098 + if (readi(ip, (char*)&ph, off, sizeof(ph)) != sizeof(ph)) { +8010204e: 8d 85 04 ff ff ff lea -0xfc(%ebp),%eax +80102054: 6a 20 push $0x20 +80102056: 53 push %ebx +80102057: 50 push %eax +80102058: 57 push %edi +80102059: e8 22 0f 00 00 call 80102f80 +8010205e: 83 c4 10 add $0x10,%esp +80102061: 83 f8 20 cmp $0x20,%eax +80102064: 0f 84 5e ff ff ff je 80101fc8 + freevm(pgdir); +8010206a: 83 ec 0c sub $0xc,%esp +8010206d: ff b5 f4 fe ff ff push -0x10c(%ebp) +80102073: e8 e8 64 00 00 call 80108560 + iunlockput(ip); +80102078: 89 3c 24 mov %edi,(%esp) +8010207b: e8 80 0e 00 00 call 80102f00 + end_op(); +80102080: e8 3b 22 00 00 call 801042c0 +} +80102085: 83 c4 10 add $0x10,%esp + cleanupexec(pgdir, ip); + return -1; +80102088: b8 ff ff ff ff mov $0xffffffff,%eax + curproc->tf->eip = elf.entry; // main + curproc->tf->esp = sp; + switchuvm(curproc); + freevm(oldpgdir); + return 0; +} +8010208d: 8d 65 f4 lea -0xc(%ebp),%esp +80102090: 5b pop %ebx +80102091: 5e pop %esi +80102092: 5f pop %edi +80102093: 5d pop %ebp +80102094: c3 ret +80102095: 8d 76 00 lea 0x0(%esi),%esi + sz = PGROUNDUP(sz); +80102098: 8b b5 f0 fe ff ff mov -0x110(%ebp),%esi +8010209e: 81 c6 ff 0f 00 00 add $0xfff,%esi +801020a4: 81 e6 00 f0 ff ff and $0xfffff000,%esi + if ((sz = allocuvm(pgdir, sz, sz + 2 * PGSIZE)) == 0) { +801020aa: 8d 9e 00 20 00 00 lea 0x2000(%esi),%ebx + iunlockput(ip); +801020b0: 83 ec 0c sub $0xc,%esp +801020b3: 57 push %edi +801020b4: e8 47 0e 00 00 call 80102f00 + end_op(); +801020b9: e8 02 22 00 00 call 801042c0 + if ((sz = allocuvm(pgdir, sz, sz + 2 * PGSIZE)) == 0) { +801020be: 83 c4 0c add $0xc,%esp +801020c1: 53 push %ebx +801020c2: 56 push %esi +801020c3: ff b5 f4 fe ff ff push -0x10c(%ebp) +801020c9: e8 32 63 00 00 call 80108400 +801020ce: 83 c4 10 add $0x10,%esp +801020d1: 89 c7 mov %eax,%edi +801020d3: 85 c0 test %eax,%eax +801020d5: 0f 84 87 00 00 00 je 80102162 + clearpteu(pgdir, (char*)(sz - 2 * PGSIZE)); +801020db: 83 ec 08 sub $0x8,%esp +801020de: 8d 80 00 e0 ff ff lea -0x2000(%eax),%eax + for (argc = 0; argv[argc]; argc++) { +801020e4: 89 fb mov %edi,%ebx +801020e6: 31 f6 xor %esi,%esi + clearpteu(pgdir, (char*)(sz - 2 * PGSIZE)); +801020e8: 50 push %eax +801020e9: ff b5 f4 fe ff ff push -0x10c(%ebp) +801020ef: e8 8c 65 00 00 call 80108680 + for (argc = 0; argv[argc]; argc++) { +801020f4: 8b 45 0c mov 0xc(%ebp),%eax +801020f7: 83 c4 10 add $0x10,%esp +801020fa: 8b 08 mov (%eax),%ecx +801020fc: 85 c9 test %ecx,%ecx +801020fe: 0f 84 95 01 00 00 je 80102299 +80102104: 89 bd f0 fe ff ff mov %edi,-0x110(%ebp) +8010210a: 8b 7d 0c mov 0xc(%ebp),%edi +8010210d: eb 1f jmp 8010212e +8010210f: 90 nop +80102110: 8d 46 01 lea 0x1(%esi),%eax + ustack[3 + argc] = sp; +80102113: 89 9c b5 64 ff ff ff mov %ebx,-0x9c(%ebp,%esi,4) +8010211a: 8d 95 58 ff ff ff lea -0xa8(%ebp),%edx + for (argc = 0; argv[argc]; argc++) { +80102120: 8b 0c 87 mov (%edi,%eax,4),%ecx +80102123: 85 c9 test %ecx,%ecx +80102125: 74 59 je 80102180 + if (argc >= MAXARG) { +80102127: 83 f8 20 cmp $0x20,%eax +8010212a: 74 36 je 80102162 +8010212c: 89 c6 mov %eax,%esi + sp = (sp - (strlen(argv[argc]) + 1)) & ~3; +8010212e: 83 ec 0c sub $0xc,%esp +80102131: 51 push %ecx +80102132: e8 09 3d 00 00 call 80105e40 + if (copyout(pgdir, sp, argv[argc], strlen(argv[argc]) + 1) < 0) { +80102137: 5a pop %edx +80102138: ff 34 b7 push (%edi,%esi,4) + sp = (sp - (strlen(argv[argc]) + 1)) & ~3; +8010213b: 29 c3 sub %eax,%ebx +8010213d: 83 eb 01 sub $0x1,%ebx + if (copyout(pgdir, sp, argv[argc], strlen(argv[argc]) + 1) < 0) { +80102140: e8 fb 3c 00 00 call 80105e40 + sp = (sp - (strlen(argv[argc]) + 1)) & ~3; +80102145: 83 e3 fc and $0xfffffffc,%ebx + if (copyout(pgdir, sp, argv[argc], strlen(argv[argc]) + 1) < 0) { +80102148: 83 c0 01 add $0x1,%eax +8010214b: 50 push %eax +8010214c: ff 34 b7 push (%edi,%esi,4) +8010214f: 53 push %ebx +80102150: ff b5 f4 fe ff ff push -0x10c(%ebp) +80102156: e8 15 67 00 00 call 80108870 +8010215b: 83 c4 20 add $0x20,%esp +8010215e: 85 c0 test %eax,%eax +80102160: 79 ae jns 80102110 + freevm(pgdir); +80102162: 83 ec 0c sub $0xc,%esp +80102165: ff b5 f4 fe ff ff push -0x10c(%ebp) +8010216b: e8 f0 63 00 00 call 80108560 +} +80102170: 83 c4 10 add $0x10,%esp +} +80102173: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +80102176: b8 ff ff ff ff mov $0xffffffff,%eax +} +8010217b: 5b pop %ebx +8010217c: 5e pop %esi +8010217d: 5f pop %edi +8010217e: 5d pop %ebp +8010217f: c3 ret + ustack[2] = sp - (argc + 1) * 4; // argv pointer +80102180: 8d 0c b5 08 00 00 00 lea 0x8(,%esi,4),%ecx + ustack[3 + argc] = 0; +80102187: 8b bd f0 fe ff ff mov -0x110(%ebp),%edi +8010218d: 89 85 f0 fe ff ff mov %eax,-0x110(%ebp) +80102193: 8d 46 04 lea 0x4(%esi),%eax + sp -= (3 + argc + 1) * 4; +80102196: 8d 71 0c lea 0xc(%ecx),%esi + ustack[3 + argc] = 0; +80102199: c7 84 85 58 ff ff ff movl $0x0,-0xa8(%ebp,%eax,4) +801021a0: 00 00 00 00 + ustack[1] = argc; +801021a4: 8b 85 f0 fe ff ff mov -0x110(%ebp),%eax + if (copyout(pgdir, sp, ustack, (3 + argc + 1) * 4) < 0) { +801021aa: 56 push %esi + ustack[1] = argc; +801021ab: 89 85 5c ff ff ff mov %eax,-0xa4(%ebp) + ustack[2] = sp - (argc + 1) * 4; // argv pointer +801021b1: 89 d8 mov %ebx,%eax + sp -= (3 + argc + 1) * 4; +801021b3: 29 f3 sub %esi,%ebx + if (copyout(pgdir, sp, ustack, (3 + argc + 1) * 4) < 0) { +801021b5: 52 push %edx + ustack[2] = sp - (argc + 1) * 4; // argv pointer +801021b6: 29 c8 sub %ecx,%eax + if (copyout(pgdir, sp, ustack, (3 + argc + 1) * 4) < 0) { +801021b8: 53 push %ebx +801021b9: ff b5 f4 fe ff ff push -0x10c(%ebp) + ustack[0] = 0xffffffff; // fake return PC +801021bf: c7 85 58 ff ff ff ff movl $0xffffffff,-0xa8(%ebp) +801021c6: ff ff ff + ustack[2] = sp - (argc + 1) * 4; // argv pointer +801021c9: 89 85 60 ff ff ff mov %eax,-0xa0(%ebp) + if (copyout(pgdir, sp, ustack, (3 + argc + 1) * 4) < 0) { +801021cf: e8 9c 66 00 00 call 80108870 +801021d4: 83 c4 10 add $0x10,%esp +801021d7: 85 c0 test %eax,%eax +801021d9: 0f 88 fd 00 00 00 js 801022dc + for (last = s = path; *s; s++) { +801021df: 8b 45 08 mov 0x8(%ebp),%eax +801021e2: 8b 55 08 mov 0x8(%ebp),%edx +801021e5: 8b 4d 08 mov 0x8(%ebp),%ecx +801021e8: 0f b6 00 movzbl (%eax),%eax +801021eb: 84 c0 test %al,%al +801021ed: 74 10 je 801021ff +801021ef: 90 nop + last = s + 1; +801021f0: 83 c1 01 add $0x1,%ecx +801021f3: 3c 2f cmp $0x2f,%al + for (last = s = path; *s; s++) { +801021f5: 0f b6 01 movzbl (%ecx),%eax + last = s + 1; +801021f8: 0f 44 d1 cmove %ecx,%edx + for (last = s = path; *s; s++) { +801021fb: 84 c0 test %al,%al +801021fd: 75 f1 jne 801021f0 + safestrcpy(curproc->name, last, sizeof(curproc->name)); +801021ff: 8b 85 ec fe ff ff mov -0x114(%ebp),%eax +80102205: 83 ec 04 sub $0x4,%esp +80102208: 6a 10 push $0x10 +8010220a: 8d 70 6c lea 0x6c(%eax),%esi +8010220d: 52 push %edx +8010220e: 56 push %esi +8010220f: e8 ec 3b 00 00 call 80105e00 + if (curproc->consoleptr != 0) +80102214: 8b 85 ec fe ff ff mov -0x114(%ebp),%eax +8010221a: 83 c4 10 add $0x10,%esp +8010221d: 8b 40 7c mov 0x7c(%eax),%eax +80102220: 85 c0 test %eax,%eax +80102222: 74 0d je 80102231 + setconsoleproctitle(curproc->consoleptr, curproc->name); +80102224: 83 ec 08 sub $0x8,%esp +80102227: 56 push %esi +80102228: 50 push %eax +80102229: e8 32 fc ff ff call 80101e60 +8010222e: 83 c4 10 add $0x10,%esp + oldpgdir = curproc->pgdir; +80102231: 8b 8d ec fe ff ff mov -0x114(%ebp),%ecx + curproc->pgdir = pgdir; +80102237: 8b 95 f4 fe ff ff mov -0x10c(%ebp),%edx + switchuvm(curproc); +8010223d: 83 ec 0c sub $0xc,%esp + oldpgdir = curproc->pgdir; +80102240: 8b 71 04 mov 0x4(%ecx),%esi + curproc->tf->eip = elf.entry; // main +80102243: 8b 41 18 mov 0x18(%ecx),%eax + curproc->pgdir = pgdir; +80102246: 89 51 04 mov %edx,0x4(%ecx) + curproc->sz = sz; +80102249: 89 39 mov %edi,(%ecx) + curproc->tf->eip = elf.entry; // main +8010224b: 8b 95 3c ff ff ff mov -0xc4(%ebp),%edx +80102251: 89 50 38 mov %edx,0x38(%eax) + curproc->tf->esp = sp; +80102254: 8b 41 18 mov 0x18(%ecx),%eax +80102257: 89 58 44 mov %ebx,0x44(%eax) + switchuvm(curproc); +8010225a: 51 push %ecx +8010225b: e8 20 5f 00 00 call 80108180 + freevm(oldpgdir); +80102260: 89 34 24 mov %esi,(%esp) +80102263: e8 f8 62 00 00 call 80108560 + return 0; +80102268: 83 c4 10 add $0x10,%esp +8010226b: 31 c0 xor %eax,%eax +8010226d: e9 1b fe ff ff jmp 8010208d + iunlockput(ip); +80102272: 83 ec 0c sub $0xc,%esp +80102275: 57 push %edi +80102276: e8 85 0c 00 00 call 80102f00 + end_op(); +8010227b: e8 40 20 00 00 call 801042c0 +} +80102280: 83 c4 10 add $0x10,%esp + return -1; +80102283: b8 ff ff ff ff mov $0xffffffff,%eax +} +80102288: e9 00 fe ff ff jmp 8010208d + for (i = 0, off = elf.phoff; i < elf.phnum; i++, off += sizeof(ph)) { +8010228d: bb 00 20 00 00 mov $0x2000,%ebx +80102292: 31 f6 xor %esi,%esi +80102294: e9 17 fe ff ff jmp 801020b0 + for (argc = 0; argv[argc]; argc++) { +80102299: be 10 00 00 00 mov $0x10,%esi +8010229e: b9 04 00 00 00 mov $0x4,%ecx +801022a3: b8 03 00 00 00 mov $0x3,%eax +801022a8: c7 85 f0 fe ff ff 00 movl $0x0,-0x110(%ebp) +801022af: 00 00 00 +801022b2: 8d 95 58 ff ff ff lea -0xa8(%ebp),%edx +801022b8: e9 dc fe ff ff jmp 80102199 + end_op(); +801022bd: e8 fe 1f 00 00 call 801042c0 + cprintf("exec: fail\n"); +801022c2: 83 ec 0c sub $0xc,%esp +801022c5: 68 a1 8a 10 80 push $0x80108aa1 +801022ca: e8 c1 e5 ff ff call 80100890 + return -1; +801022cf: 83 c4 10 add $0x10,%esp +801022d2: b8 ff ff ff ff mov $0xffffffff,%eax +801022d7: e9 b1 fd ff ff jmp 8010208d + cleanupexec(pgdir, ip); +801022dc: 50 push %eax +801022dd: 50 push %eax +801022de: 6a 00 push $0x0 +801022e0: ff b5 f4 fe ff ff push -0x10c(%ebp) +801022e6: e8 e5 fb ff ff call 80101ed0 + return -1; +801022eb: 83 c4 10 add $0x10,%esp +801022ee: 83 c8 ff or $0xffffffff,%eax +801022f1: e9 97 fd ff ff jmp 8010208d +801022f6: 66 90 xchg %ax,%ax +801022f8: 66 90 xchg %ax,%ax +801022fa: 66 90 xchg %ax,%ax +801022fc: 66 90 xchg %ax,%ax +801022fe: 66 90 xchg %ax,%ax + +80102300 : +struct { + struct spinlock lock; + struct file file[NFILE]; +} ftable; + +void fileinit(void) { +80102300: 55 push %ebp +80102301: 89 e5 mov %esp,%ebp +80102303: 83 ec 10 sub $0x10,%esp + initlock(&ftable.lock, "ftable"); +80102306: 68 ad 8a 10 80 push $0x80108aad +8010230b: 68 e0 b6 11 80 push $0x8011b6e0 +80102310: e8 9b 36 00 00 call 801059b0 +} +80102315: 83 c4 10 add $0x10,%esp +80102318: c9 leave +80102319: c3 ret +8010231a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80102320 : + +// Allocate a file structure. +struct file* filealloc(void) { +80102320: 55 push %ebp +80102321: 89 e5 mov %esp,%ebp +80102323: 53 push %ebx + struct file *f; + + acquire(&ftable.lock); + for (f = ftable.file; f < ftable.file + NFILE; f++) { +80102324: bb 14 b7 11 80 mov $0x8011b714,%ebx +struct file* filealloc(void) { +80102329: 83 ec 10 sub $0x10,%esp + acquire(&ftable.lock); +8010232c: 68 e0 b6 11 80 push $0x8011b6e0 +80102331: e8 4a 38 00 00 call 80105b80 +80102336: 83 c4 10 add $0x10,%esp +80102339: eb 10 jmp 8010234b +8010233b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010233f: 90 nop + for (f = ftable.file; f < ftable.file + NFILE; f++) { +80102340: 83 c3 18 add $0x18,%ebx +80102343: 81 fb 74 c0 11 80 cmp $0x8011c074,%ebx +80102349: 74 25 je 80102370 + if (f->ref == 0) { +8010234b: 8b 43 04 mov 0x4(%ebx),%eax +8010234e: 85 c0 test %eax,%eax +80102350: 75 ee jne 80102340 + f->ref = 1; + release(&ftable.lock); +80102352: 83 ec 0c sub $0xc,%esp + f->ref = 1; +80102355: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx) + release(&ftable.lock); +8010235c: 68 e0 b6 11 80 push $0x8011b6e0 +80102361: e8 ba 37 00 00 call 80105b20 + return f; + } + } + release(&ftable.lock); + return 0; +} +80102366: 89 d8 mov %ebx,%eax + return f; +80102368: 83 c4 10 add $0x10,%esp +} +8010236b: 8b 5d fc mov -0x4(%ebp),%ebx +8010236e: c9 leave +8010236f: c3 ret + release(&ftable.lock); +80102370: 83 ec 0c sub $0xc,%esp + return 0; +80102373: 31 db xor %ebx,%ebx + release(&ftable.lock); +80102375: 68 e0 b6 11 80 push $0x8011b6e0 +8010237a: e8 a1 37 00 00 call 80105b20 +} +8010237f: 89 d8 mov %ebx,%eax + return 0; +80102381: 83 c4 10 add $0x10,%esp +} +80102384: 8b 5d fc mov -0x4(%ebp),%ebx +80102387: c9 leave +80102388: c3 ret +80102389: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80102390 : + +// Increment ref count for file f. +struct file* filedup(struct file *f) { +80102390: 55 push %ebp +80102391: 89 e5 mov %esp,%ebp +80102393: 53 push %ebx +80102394: 83 ec 10 sub $0x10,%esp +80102397: 8b 5d 08 mov 0x8(%ebp),%ebx + acquire(&ftable.lock); +8010239a: 68 e0 b6 11 80 push $0x8011b6e0 +8010239f: e8 dc 37 00 00 call 80105b80 + if (f->ref < 1) { +801023a4: 8b 43 04 mov 0x4(%ebx),%eax +801023a7: 83 c4 10 add $0x10,%esp +801023aa: 85 c0 test %eax,%eax +801023ac: 7e 1a jle 801023c8 + panic("filedup"); + } + f->ref++; +801023ae: 83 c0 01 add $0x1,%eax + release(&ftable.lock); +801023b1: 83 ec 0c sub $0xc,%esp + f->ref++; +801023b4: 89 43 04 mov %eax,0x4(%ebx) + release(&ftable.lock); +801023b7: 68 e0 b6 11 80 push $0x8011b6e0 +801023bc: e8 5f 37 00 00 call 80105b20 + return f; +} +801023c1: 89 d8 mov %ebx,%eax +801023c3: 8b 5d fc mov -0x4(%ebp),%ebx +801023c6: c9 leave +801023c7: c3 ret + panic("filedup"); +801023c8: 83 ec 0c sub $0xc,%esp +801023cb: 68 b4 8a 10 80 push $0x80108ab4 +801023d0: e8 ab e0 ff ff call 80100480 +801023d5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801023dc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +801023e0 : + +// Close file f. (Decrement ref count, close when reaches 0.) +void fileclose(struct file *f) { +801023e0: 55 push %ebp +801023e1: 89 e5 mov %esp,%ebp +801023e3: 57 push %edi +801023e4: 56 push %esi +801023e5: 53 push %ebx +801023e6: 83 ec 28 sub $0x28,%esp +801023e9: 8b 5d 08 mov 0x8(%ebp),%ebx + struct file ff; + + acquire(&ftable.lock); +801023ec: 68 e0 b6 11 80 push $0x8011b6e0 +801023f1: e8 8a 37 00 00 call 80105b80 + if (f->ref < 1) { +801023f6: 8b 53 04 mov 0x4(%ebx),%edx +801023f9: 83 c4 10 add $0x10,%esp +801023fc: 85 d2 test %edx,%edx +801023fe: 0f 8e a5 00 00 00 jle 801024a9 + panic("fileclose"); + } + if (--f->ref > 0) { +80102404: 83 ea 01 sub $0x1,%edx +80102407: 89 53 04 mov %edx,0x4(%ebx) +8010240a: 75 44 jne 80102450 + release(&ftable.lock); + return; + } + ff = *f; +8010240c: 0f b6 43 09 movzbl 0x9(%ebx),%eax + f->ref = 0; + f->type = FD_NONE; + release(&ftable.lock); +80102410: 83 ec 0c sub $0xc,%esp + ff = *f; +80102413: 8b 3b mov (%ebx),%edi + f->type = FD_NONE; +80102415: c7 03 00 00 00 00 movl $0x0,(%ebx) + ff = *f; +8010241b: 8b 73 0c mov 0xc(%ebx),%esi +8010241e: 88 45 e7 mov %al,-0x19(%ebp) +80102421: 8b 43 10 mov 0x10(%ebx),%eax + release(&ftable.lock); +80102424: 68 e0 b6 11 80 push $0x8011b6e0 + ff = *f; +80102429: 89 45 e0 mov %eax,-0x20(%ebp) + release(&ftable.lock); +8010242c: e8 ef 36 00 00 call 80105b20 + + if (ff.type == FD_PIPE) { +80102431: 83 c4 10 add $0x10,%esp +80102434: 83 ff 01 cmp $0x1,%edi +80102437: 74 57 je 80102490 + pipeclose(ff.pipe, ff.writable); + } + else if (ff.type == FD_INODE) { +80102439: 83 ff 02 cmp $0x2,%edi +8010243c: 74 2a je 80102468 + begin_op(); + iput(ff.ip); + end_op(); + } +} +8010243e: 8d 65 f4 lea -0xc(%ebp),%esp +80102441: 5b pop %ebx +80102442: 5e pop %esi +80102443: 5f pop %edi +80102444: 5d pop %ebp +80102445: c3 ret +80102446: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010244d: 8d 76 00 lea 0x0(%esi),%esi + release(&ftable.lock); +80102450: c7 45 08 e0 b6 11 80 movl $0x8011b6e0,0x8(%ebp) +} +80102457: 8d 65 f4 lea -0xc(%ebp),%esp +8010245a: 5b pop %ebx +8010245b: 5e pop %esi +8010245c: 5f pop %edi +8010245d: 5d pop %ebp + release(&ftable.lock); +8010245e: e9 bd 36 00 00 jmp 80105b20 +80102463: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102467: 90 nop + begin_op(); +80102468: e8 e3 1d 00 00 call 80104250 + iput(ff.ip); +8010246d: 83 ec 0c sub $0xc,%esp +80102470: ff 75 e0 push -0x20(%ebp) +80102473: e8 28 09 00 00 call 80102da0 + end_op(); +80102478: 83 c4 10 add $0x10,%esp +} +8010247b: 8d 65 f4 lea -0xc(%ebp),%esp +8010247e: 5b pop %ebx +8010247f: 5e pop %esi +80102480: 5f pop %edi +80102481: 5d pop %ebp + end_op(); +80102482: e9 39 1e 00 00 jmp 801042c0 +80102487: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010248e: 66 90 xchg %ax,%ax + pipeclose(ff.pipe, ff.writable); +80102490: 0f be 5d e7 movsbl -0x19(%ebp),%ebx +80102494: 83 ec 08 sub $0x8,%esp +80102497: 53 push %ebx +80102498: 56 push %esi +80102499: e8 c2 25 00 00 call 80104a60 +8010249e: 83 c4 10 add $0x10,%esp +} +801024a1: 8d 65 f4 lea -0xc(%ebp),%esp +801024a4: 5b pop %ebx +801024a5: 5e pop %esi +801024a6: 5f pop %edi +801024a7: 5d pop %ebp +801024a8: c3 ret + panic("fileclose"); +801024a9: 83 ec 0c sub $0xc,%esp +801024ac: 68 bc 8a 10 80 push $0x80108abc +801024b1: e8 ca df ff ff call 80100480 +801024b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801024bd: 8d 76 00 lea 0x0(%esi),%esi + +801024c0 : + +// Get metadata about file f. +int filestat(struct file *f, struct stat *st) { +801024c0: 55 push %ebp +801024c1: 89 e5 mov %esp,%ebp +801024c3: 53 push %ebx +801024c4: 83 ec 04 sub $0x4,%esp +801024c7: 8b 5d 08 mov 0x8(%ebp),%ebx + if (f->type == FD_INODE) { +801024ca: 83 3b 02 cmpl $0x2,(%ebx) +801024cd: 75 31 jne 80102500 + ilock(f->ip); +801024cf: 83 ec 0c sub $0xc,%esp +801024d2: ff 73 10 push 0x10(%ebx) +801024d5: e8 96 07 00 00 call 80102c70 + stati(f->ip, st); +801024da: 58 pop %eax +801024db: 5a pop %edx +801024dc: ff 75 0c push 0xc(%ebp) +801024df: ff 73 10 push 0x10(%ebx) +801024e2: e8 69 0a 00 00 call 80102f50 + iunlock(f->ip); +801024e7: 59 pop %ecx +801024e8: ff 73 10 push 0x10(%ebx) +801024eb: e8 60 08 00 00 call 80102d50 + return 0; + } + return -1; +} +801024f0: 8b 5d fc mov -0x4(%ebp),%ebx + return 0; +801024f3: 83 c4 10 add $0x10,%esp +801024f6: 31 c0 xor %eax,%eax +} +801024f8: c9 leave +801024f9: c3 ret +801024fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +80102500: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80102503: b8 ff ff ff ff mov $0xffffffff,%eax +} +80102508: c9 leave +80102509: c3 ret +8010250a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80102510 : + +// Read from file f. +int fileread(struct file *f, char *addr, int n) { +80102510: 55 push %ebp +80102511: 89 e5 mov %esp,%ebp +80102513: 57 push %edi +80102514: 56 push %esi +80102515: 53 push %ebx +80102516: 83 ec 0c sub $0xc,%esp +80102519: 8b 5d 08 mov 0x8(%ebp),%ebx +8010251c: 8b 75 0c mov 0xc(%ebp),%esi +8010251f: 8b 7d 10 mov 0x10(%ebp),%edi + int r; + + if (f->readable == 0) { +80102522: 80 7b 08 00 cmpb $0x0,0x8(%ebx) +80102526: 74 60 je 80102588 + return -1; + } + if (f->type == FD_PIPE) { +80102528: 8b 03 mov (%ebx),%eax +8010252a: 83 f8 01 cmp $0x1,%eax +8010252d: 74 41 je 80102570 + return piperead(f->pipe, addr, n); + } + if (f->type == FD_INODE) { +8010252f: 83 f8 02 cmp $0x2,%eax +80102532: 75 5b jne 8010258f + ilock(f->ip); +80102534: 83 ec 0c sub $0xc,%esp +80102537: ff 73 10 push 0x10(%ebx) +8010253a: e8 31 07 00 00 call 80102c70 + if ((r = readi(f->ip, addr, f->off, n)) > 0) { +8010253f: 57 push %edi +80102540: ff 73 14 push 0x14(%ebx) +80102543: 56 push %esi +80102544: ff 73 10 push 0x10(%ebx) +80102547: e8 34 0a 00 00 call 80102f80 +8010254c: 83 c4 20 add $0x20,%esp +8010254f: 89 c6 mov %eax,%esi +80102551: 85 c0 test %eax,%eax +80102553: 7e 03 jle 80102558 + f->off += r; +80102555: 01 43 14 add %eax,0x14(%ebx) + } + iunlock(f->ip); +80102558: 83 ec 0c sub $0xc,%esp +8010255b: ff 73 10 push 0x10(%ebx) +8010255e: e8 ed 07 00 00 call 80102d50 + return r; +80102563: 83 c4 10 add $0x10,%esp + } + panic("fileread"); +} +80102566: 8d 65 f4 lea -0xc(%ebp),%esp +80102569: 89 f0 mov %esi,%eax +8010256b: 5b pop %ebx +8010256c: 5e pop %esi +8010256d: 5f pop %edi +8010256e: 5d pop %ebp +8010256f: c3 ret + return piperead(f->pipe, addr, n); +80102570: 8b 43 0c mov 0xc(%ebx),%eax +80102573: 89 45 08 mov %eax,0x8(%ebp) +} +80102576: 8d 65 f4 lea -0xc(%ebp),%esp +80102579: 5b pop %ebx +8010257a: 5e pop %esi +8010257b: 5f pop %edi +8010257c: 5d pop %ebp + return piperead(f->pipe, addr, n); +8010257d: e9 7e 26 00 00 jmp 80104c00 +80102582: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return -1; +80102588: be ff ff ff ff mov $0xffffffff,%esi +8010258d: eb d7 jmp 80102566 + panic("fileread"); +8010258f: 83 ec 0c sub $0xc,%esp +80102592: 68 c6 8a 10 80 push $0x80108ac6 +80102597: e8 e4 de ff ff call 80100480 +8010259c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +801025a0 : + + +// Write to file f. +int filewrite(struct file *f, char *addr, int n) { +801025a0: 55 push %ebp +801025a1: 89 e5 mov %esp,%ebp +801025a3: 57 push %edi +801025a4: 56 push %esi +801025a5: 53 push %ebx +801025a6: 83 ec 1c sub $0x1c,%esp +801025a9: 8b 45 0c mov 0xc(%ebp),%eax +801025ac: 8b 5d 08 mov 0x8(%ebp),%ebx +801025af: 89 45 dc mov %eax,-0x24(%ebp) +801025b2: 8b 45 10 mov 0x10(%ebp),%eax + int r; + + if (f->writable == 0) { +801025b5: 80 7b 09 00 cmpb $0x0,0x9(%ebx) +int filewrite(struct file *f, char *addr, int n) { +801025b9: 89 45 e4 mov %eax,-0x1c(%ebp) + if (f->writable == 0) { +801025bc: 0f 84 bd 00 00 00 je 8010267f + return -1; + } + if (f->type == FD_PIPE) { +801025c2: 8b 03 mov (%ebx),%eax +801025c4: 83 f8 01 cmp $0x1,%eax +801025c7: 0f 84 bf 00 00 00 je 8010268c + return pipewrite(f->pipe, addr, n); + } + if (f->type == FD_INODE) { +801025cd: 83 f8 02 cmp $0x2,%eax +801025d0: 0f 85 c8 00 00 00 jne 8010269e + // and 2 blocks of slop for non-aligned writes. + // this really belongs lower down, since writei() + // might be writing a device like the console. + int max = ((MAXOPBLOCKS - 1 - 1 - 2) / 2) * 512; + int i = 0; + while (i < n) { +801025d6: 8b 45 e4 mov -0x1c(%ebp),%eax + int i = 0; +801025d9: 31 f6 xor %esi,%esi + while (i < n) { +801025db: 85 c0 test %eax,%eax +801025dd: 7f 30 jg 8010260f +801025df: e9 94 00 00 00 jmp 80102678 +801025e4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + } + + begin_op(); + ilock(f->ip); + if ((r = writei(f->ip, addr + i, f->off, n1)) > 0) { + f->off += r; +801025e8: 01 43 14 add %eax,0x14(%ebx) + } + iunlock(f->ip); +801025eb: 83 ec 0c sub $0xc,%esp +801025ee: ff 73 10 push 0x10(%ebx) + f->off += r; +801025f1: 89 45 e0 mov %eax,-0x20(%ebp) + iunlock(f->ip); +801025f4: e8 57 07 00 00 call 80102d50 + end_op(); +801025f9: e8 c2 1c 00 00 call 801042c0 + + if (r < 0) { + break; + } + if (r != n1) { +801025fe: 8b 45 e0 mov -0x20(%ebp),%eax +80102601: 83 c4 10 add $0x10,%esp +80102604: 39 c7 cmp %eax,%edi +80102606: 75 5c jne 80102664 + panic("short filewrite"); + } + i += r; +80102608: 01 fe add %edi,%esi + while (i < n) { +8010260a: 39 75 e4 cmp %esi,-0x1c(%ebp) +8010260d: 7e 69 jle 80102678 + int n1 = n - i; +8010260f: 8b 7d e4 mov -0x1c(%ebp),%edi +80102612: b8 00 06 00 00 mov $0x600,%eax +80102617: 29 f7 sub %esi,%edi +80102619: 39 c7 cmp %eax,%edi +8010261b: 0f 4f f8 cmovg %eax,%edi + begin_op(); +8010261e: e8 2d 1c 00 00 call 80104250 + ilock(f->ip); +80102623: 83 ec 0c sub $0xc,%esp +80102626: ff 73 10 push 0x10(%ebx) +80102629: e8 42 06 00 00 call 80102c70 + if ((r = writei(f->ip, addr + i, f->off, n1)) > 0) { +8010262e: 8b 45 dc mov -0x24(%ebp),%eax +80102631: 57 push %edi +80102632: ff 73 14 push 0x14(%ebx) +80102635: 01 f0 add %esi,%eax +80102637: 50 push %eax +80102638: ff 73 10 push 0x10(%ebx) +8010263b: e8 40 0a 00 00 call 80103080 +80102640: 83 c4 20 add $0x20,%esp +80102643: 85 c0 test %eax,%eax +80102645: 7f a1 jg 801025e8 + iunlock(f->ip); +80102647: 83 ec 0c sub $0xc,%esp +8010264a: ff 73 10 push 0x10(%ebx) +8010264d: 89 45 e4 mov %eax,-0x1c(%ebp) +80102650: e8 fb 06 00 00 call 80102d50 + end_op(); +80102655: e8 66 1c 00 00 call 801042c0 + if (r < 0) { +8010265a: 8b 45 e4 mov -0x1c(%ebp),%eax +8010265d: 83 c4 10 add $0x10,%esp +80102660: 85 c0 test %eax,%eax +80102662: 75 1b jne 8010267f + panic("short filewrite"); +80102664: 83 ec 0c sub $0xc,%esp +80102667: 68 cf 8a 10 80 push $0x80108acf +8010266c: e8 0f de ff ff call 80100480 +80102671: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + } + return i == n ? n : -1; +80102678: 89 f0 mov %esi,%eax +8010267a: 3b 75 e4 cmp -0x1c(%ebp),%esi +8010267d: 74 05 je 80102684 +8010267f: b8 ff ff ff ff mov $0xffffffff,%eax + } + panic("filewrite"); +} +80102684: 8d 65 f4 lea -0xc(%ebp),%esp +80102687: 5b pop %ebx +80102688: 5e pop %esi +80102689: 5f pop %edi +8010268a: 5d pop %ebp +8010268b: c3 ret + return pipewrite(f->pipe, addr, n); +8010268c: 8b 43 0c mov 0xc(%ebx),%eax +8010268f: 89 45 08 mov %eax,0x8(%ebp) +} +80102692: 8d 65 f4 lea -0xc(%ebp),%esp +80102695: 5b pop %ebx +80102696: 5e pop %esi +80102697: 5f pop %edi +80102698: 5d pop %ebp + return pipewrite(f->pipe, addr, n); +80102699: e9 62 24 00 00 jmp 80104b00 + panic("filewrite"); +8010269e: 83 ec 0c sub $0xc,%esp +801026a1: 68 d5 8a 10 80 push $0x80108ad5 +801026a6: e8 d5 dd ff ff call 80100480 +801026ab: 66 90 xchg %ax,%ax +801026ad: 66 90 xchg %ax,%ax +801026af: 90 nop + +801026b0 : + } + panic("balloc: out of blocks"); +} + +// Free a disk block. +static void bfree(int dev, uint b) { +801026b0: 55 push %ebp +801026b1: 89 c1 mov %eax,%ecx + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); +801026b3: 89 d0 mov %edx,%eax +801026b5: c1 e8 0c shr $0xc,%eax +801026b8: 03 05 4c dd 11 80 add 0x8011dd4c,%eax +static void bfree(int dev, uint b) { +801026be: 89 e5 mov %esp,%ebp +801026c0: 56 push %esi +801026c1: 53 push %ebx +801026c2: 89 d3 mov %edx,%ebx + bp = bread(dev, BBLOCK(b, sb)); +801026c4: 83 ec 08 sub $0x8,%esp +801026c7: 50 push %eax +801026c8: 51 push %ecx +801026c9: e8 02 da ff ff call 801000d0 + bi = b % BPB; + m = 1 << (bi % 8); +801026ce: 89 d9 mov %ebx,%ecx + if ((bp->data[bi / 8] & m) == 0) { +801026d0: c1 fb 03 sar $0x3,%ebx +801026d3: 83 c4 10 add $0x10,%esp + bp = bread(dev, BBLOCK(b, sb)); +801026d6: 89 c6 mov %eax,%esi + m = 1 << (bi % 8); +801026d8: 83 e1 07 and $0x7,%ecx +801026db: b8 01 00 00 00 mov $0x1,%eax + if ((bp->data[bi / 8] & m) == 0) { +801026e0: 81 e3 ff 01 00 00 and $0x1ff,%ebx + m = 1 << (bi % 8); +801026e6: d3 e0 shl %cl,%eax + if ((bp->data[bi / 8] & m) == 0) { +801026e8: 0f b6 4c 1e 5c movzbl 0x5c(%esi,%ebx,1),%ecx +801026ed: 85 c1 test %eax,%ecx +801026ef: 74 23 je 80102714 + panic("freeing free block"); + } + bp->data[bi / 8] &= ~m; +801026f1: f7 d0 not %eax + log_write(bp); +801026f3: 83 ec 0c sub $0xc,%esp + bp->data[bi / 8] &= ~m; +801026f6: 21 c8 and %ecx,%eax +801026f8: 88 44 1e 5c mov %al,0x5c(%esi,%ebx,1) + log_write(bp); +801026fc: 56 push %esi +801026fd: e8 2e 1d 00 00 call 80104430 + brelse(bp); +80102702: 89 34 24 mov %esi,(%esp) +80102705: e8 e6 da ff ff call 801001f0 +} +8010270a: 83 c4 10 add $0x10,%esp +8010270d: 8d 65 f8 lea -0x8(%ebp),%esp +80102710: 5b pop %ebx +80102711: 5e pop %esi +80102712: 5d pop %ebp +80102713: c3 ret + panic("freeing free block"); +80102714: 83 ec 0c sub $0xc,%esp +80102717: 68 df 8a 10 80 push $0x80108adf +8010271c: e8 5f dd ff ff call 80100480 +80102721: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102728: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010272f: 90 nop + +80102730 : +static uint balloc(uint dev) { +80102730: 55 push %ebp +80102731: 89 e5 mov %esp,%ebp +80102733: 57 push %edi +80102734: 56 push %esi +80102735: 53 push %ebx +80102736: 83 ec 1c sub $0x1c,%esp + for (b = 0; b < sb.size; b += BPB) { +80102739: 8b 0d 34 dd 11 80 mov 0x8011dd34,%ecx +static uint balloc(uint dev) { +8010273f: 89 45 d8 mov %eax,-0x28(%ebp) + for (b = 0; b < sb.size; b += BPB) { +80102742: 85 c9 test %ecx,%ecx +80102744: 0f 84 87 00 00 00 je 801027d1 +8010274a: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) + bp = bread(dev, BBLOCK(b, sb)); +80102751: 8b 75 dc mov -0x24(%ebp),%esi +80102754: 83 ec 08 sub $0x8,%esp +80102757: 89 f0 mov %esi,%eax +80102759: c1 f8 0c sar $0xc,%eax +8010275c: 03 05 4c dd 11 80 add 0x8011dd4c,%eax +80102762: 50 push %eax +80102763: ff 75 d8 push -0x28(%ebp) +80102766: e8 65 d9 ff ff call 801000d0 +8010276b: 83 c4 10 add $0x10,%esp +8010276e: 89 45 e4 mov %eax,-0x1c(%ebp) + for (bi = 0; bi < BPB && b + bi < sb.size; bi++) { +80102771: a1 34 dd 11 80 mov 0x8011dd34,%eax +80102776: 89 45 e0 mov %eax,-0x20(%ebp) +80102779: 31 c0 xor %eax,%eax +8010277b: eb 2f jmp 801027ac +8010277d: 8d 76 00 lea 0x0(%esi),%esi + m = 1 << (bi % 8); +80102780: 89 c1 mov %eax,%ecx +80102782: bb 01 00 00 00 mov $0x1,%ebx + if ((bp->data[bi / 8] & m) == 0) { // Is block free? +80102787: 8b 55 e4 mov -0x1c(%ebp),%edx + m = 1 << (bi % 8); +8010278a: 83 e1 07 and $0x7,%ecx +8010278d: d3 e3 shl %cl,%ebx + if ((bp->data[bi / 8] & m) == 0) { // Is block free? +8010278f: 89 c1 mov %eax,%ecx +80102791: c1 f9 03 sar $0x3,%ecx +80102794: 0f b6 7c 0a 5c movzbl 0x5c(%edx,%ecx,1),%edi +80102799: 89 fa mov %edi,%edx +8010279b: 85 df test %ebx,%edi +8010279d: 74 41 je 801027e0 + for (bi = 0; bi < BPB && b + bi < sb.size; bi++) { +8010279f: 83 c0 01 add $0x1,%eax +801027a2: 83 c6 01 add $0x1,%esi +801027a5: 3d 00 10 00 00 cmp $0x1000,%eax +801027aa: 74 05 je 801027b1 +801027ac: 39 75 e0 cmp %esi,-0x20(%ebp) +801027af: 77 cf ja 80102780 + brelse(bp); +801027b1: 83 ec 0c sub $0xc,%esp +801027b4: ff 75 e4 push -0x1c(%ebp) +801027b7: e8 34 da ff ff call 801001f0 + for (b = 0; b < sb.size; b += BPB) { +801027bc: 81 45 dc 00 10 00 00 addl $0x1000,-0x24(%ebp) +801027c3: 83 c4 10 add $0x10,%esp +801027c6: 8b 45 dc mov -0x24(%ebp),%eax +801027c9: 39 05 34 dd 11 80 cmp %eax,0x8011dd34 +801027cf: 77 80 ja 80102751 + panic("balloc: out of blocks"); +801027d1: 83 ec 0c sub $0xc,%esp +801027d4: 68 f2 8a 10 80 push $0x80108af2 +801027d9: e8 a2 dc ff ff call 80100480 +801027de: 66 90 xchg %ax,%ax + bp->data[bi / 8] |= m; // Mark block in use. +801027e0: 8b 7d e4 mov -0x1c(%ebp),%edi + log_write(bp); +801027e3: 83 ec 0c sub $0xc,%esp + bp->data[bi / 8] |= m; // Mark block in use. +801027e6: 09 da or %ebx,%edx +801027e8: 88 54 0f 5c mov %dl,0x5c(%edi,%ecx,1) + log_write(bp); +801027ec: 57 push %edi +801027ed: e8 3e 1c 00 00 call 80104430 + brelse(bp); +801027f2: 89 3c 24 mov %edi,(%esp) +801027f5: e8 f6 d9 ff ff call 801001f0 + bp = bread(dev, bno); +801027fa: 58 pop %eax +801027fb: 5a pop %edx +801027fc: 56 push %esi +801027fd: ff 75 d8 push -0x28(%ebp) +80102800: e8 cb d8 ff ff call 801000d0 + memset(bp->data, 0, BSIZE); +80102805: 83 c4 0c add $0xc,%esp + bp = bread(dev, bno); +80102808: 89 c3 mov %eax,%ebx + memset(bp->data, 0, BSIZE); +8010280a: 8d 40 5c lea 0x5c(%eax),%eax +8010280d: 68 00 02 00 00 push $0x200 +80102812: 6a 00 push $0x0 +80102814: 50 push %eax +80102815: e8 26 34 00 00 call 80105c40 + log_write(bp); +8010281a: 89 1c 24 mov %ebx,(%esp) +8010281d: e8 0e 1c 00 00 call 80104430 + brelse(bp); +80102822: 89 1c 24 mov %ebx,(%esp) +80102825: e8 c6 d9 ff ff call 801001f0 +} +8010282a: 8d 65 f4 lea -0xc(%ebp),%esp +8010282d: 89 f0 mov %esi,%eax +8010282f: 5b pop %ebx +80102830: 5e pop %esi +80102831: 5f pop %edi +80102832: 5d pop %ebp +80102833: c3 ret +80102834: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010283b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010283f: 90 nop + +80102840 : +} + +// Find the inode with number inum on device dev +// and return the in-memory copy. Does not lock +// the inode and does not read it from disk. +static struct inode* iget(uint dev, uint inum) { +80102840: 55 push %ebp +80102841: 89 e5 mov %esp,%ebp +80102843: 57 push %edi +80102844: 89 c7 mov %eax,%edi +80102846: 56 push %esi + struct inode *ip, *empty; + + acquire(&icache.lock); + + // Is the inode already cached? + empty = 0; +80102847: 31 f6 xor %esi,%esi +static struct inode* iget(uint dev, uint inum) { +80102849: 53 push %ebx + for (ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++) { +8010284a: bb 14 c1 11 80 mov $0x8011c114,%ebx +static struct inode* iget(uint dev, uint inum) { +8010284f: 83 ec 28 sub $0x28,%esp +80102852: 89 55 e4 mov %edx,-0x1c(%ebp) + acquire(&icache.lock); +80102855: 68 e0 c0 11 80 push $0x8011c0e0 +8010285a: e8 21 33 00 00 call 80105b80 + for (ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++) { +8010285f: 8b 55 e4 mov -0x1c(%ebp),%edx + acquire(&icache.lock); +80102862: 83 c4 10 add $0x10,%esp +80102865: eb 1b jmp 80102882 +80102867: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010286e: 66 90 xchg %ax,%ax + if (ip->ref > 0 && ip->dev == dev && ip->inum == inum) { +80102870: 39 3b cmp %edi,(%ebx) +80102872: 74 6c je 801028e0 + for (ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++) { +80102874: 81 c3 90 00 00 00 add $0x90,%ebx +8010287a: 81 fb 34 dd 11 80 cmp $0x8011dd34,%ebx +80102880: 73 26 jae 801028a8 + if (ip->ref > 0 && ip->dev == dev && ip->inum == inum) { +80102882: 8b 43 08 mov 0x8(%ebx),%eax +80102885: 85 c0 test %eax,%eax +80102887: 7f e7 jg 80102870 + ip->ref++; + release(&icache.lock); + return ip; + } + if (empty == 0 && ip->ref == 0) { // Remember empty slot. +80102889: 85 f6 test %esi,%esi +8010288b: 75 e7 jne 80102874 +8010288d: 85 c0 test %eax,%eax +8010288f: 75 76 jne 80102907 +80102891: 89 de mov %ebx,%esi + for (ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++) { +80102893: 81 c3 90 00 00 00 add $0x90,%ebx +80102899: 81 fb 34 dd 11 80 cmp $0x8011dd34,%ebx +8010289f: 72 e1 jb 80102882 +801028a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + empty = ip; + } + } + + // Recycle an inode cache entry. + if (empty == 0) { +801028a8: 85 f6 test %esi,%esi +801028aa: 74 79 je 80102925 + ip = empty; + ip->dev = dev; + ip->inum = inum; + ip->ref = 1; + ip->valid = 0; + release(&icache.lock); +801028ac: 83 ec 0c sub $0xc,%esp + ip->dev = dev; +801028af: 89 3e mov %edi,(%esi) + ip->inum = inum; +801028b1: 89 56 04 mov %edx,0x4(%esi) + ip->ref = 1; +801028b4: c7 46 08 01 00 00 00 movl $0x1,0x8(%esi) + ip->valid = 0; +801028bb: c7 46 4c 00 00 00 00 movl $0x0,0x4c(%esi) + release(&icache.lock); +801028c2: 68 e0 c0 11 80 push $0x8011c0e0 +801028c7: e8 54 32 00 00 call 80105b20 + + return ip; +801028cc: 83 c4 10 add $0x10,%esp +} +801028cf: 8d 65 f4 lea -0xc(%ebp),%esp +801028d2: 89 f0 mov %esi,%eax +801028d4: 5b pop %ebx +801028d5: 5e pop %esi +801028d6: 5f pop %edi +801028d7: 5d pop %ebp +801028d8: c3 ret +801028d9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (ip->ref > 0 && ip->dev == dev && ip->inum == inum) { +801028e0: 39 53 04 cmp %edx,0x4(%ebx) +801028e3: 75 8f jne 80102874 + release(&icache.lock); +801028e5: 83 ec 0c sub $0xc,%esp + ip->ref++; +801028e8: 83 c0 01 add $0x1,%eax + return ip; +801028eb: 89 de mov %ebx,%esi + release(&icache.lock); +801028ed: 68 e0 c0 11 80 push $0x8011c0e0 + ip->ref++; +801028f2: 89 43 08 mov %eax,0x8(%ebx) + release(&icache.lock); +801028f5: e8 26 32 00 00 call 80105b20 + return ip; +801028fa: 83 c4 10 add $0x10,%esp +} +801028fd: 8d 65 f4 lea -0xc(%ebp),%esp +80102900: 89 f0 mov %esi,%eax +80102902: 5b pop %ebx +80102903: 5e pop %esi +80102904: 5f pop %edi +80102905: 5d pop %ebp +80102906: c3 ret + for (ip = &icache.inode[0]; ip < &icache.inode[NINODE]; ip++) { +80102907: 81 c3 90 00 00 00 add $0x90,%ebx +8010290d: 81 fb 34 dd 11 80 cmp $0x8011dd34,%ebx +80102913: 73 10 jae 80102925 + if (ip->ref > 0 && ip->dev == dev && ip->inum == inum) { +80102915: 8b 43 08 mov 0x8(%ebx),%eax +80102918: 85 c0 test %eax,%eax +8010291a: 0f 8f 50 ff ff ff jg 80102870 +80102920: e9 68 ff ff ff jmp 8010288d + panic("iget: no inodes"); +80102925: 83 ec 0c sub $0xc,%esp +80102928: 68 08 8b 10 80 push $0x80108b08 +8010292d: e8 4e db ff ff call 80100480 +80102932: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102939: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80102940 : +// are listed in ip->addrs[]. The next NINDIRECT blocks are +// listed in block ip->addrs[NDIRECT]. + +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +static uint bmap(struct inode *ip, uint bn) { +80102940: 55 push %ebp +80102941: 89 e5 mov %esp,%ebp +80102943: 57 push %edi +80102944: 56 push %esi +80102945: 89 c6 mov %eax,%esi +80102947: 53 push %ebx +80102948: 83 ec 1c sub $0x1c,%esp + uint addr, *a; + struct buf *bp; + + if (bn < NDIRECT) { +8010294b: 83 fa 0b cmp $0xb,%edx +8010294e: 0f 86 8c 00 00 00 jbe 801029e0 + if ((addr = ip->addrs[bn]) == 0) { + ip->addrs[bn] = addr = balloc(ip->dev); + } + return addr; + } + bn -= NDIRECT; +80102954: 8d 5a f4 lea -0xc(%edx),%ebx + + if (bn < NINDIRECT) { +80102957: 83 fb 7f cmp $0x7f,%ebx +8010295a: 0f 87 a2 00 00 00 ja 80102a02 + // Load indirect block, allocating if necessary. + if ((addr = ip->addrs[NDIRECT]) == 0) { +80102960: 8b 80 8c 00 00 00 mov 0x8c(%eax),%eax +80102966: 85 c0 test %eax,%eax +80102968: 74 5e je 801029c8 + ip->addrs[NDIRECT] = addr = balloc(ip->dev); + } + bp = bread(ip->dev, addr); +8010296a: 83 ec 08 sub $0x8,%esp +8010296d: 50 push %eax +8010296e: ff 36 push (%esi) +80102970: e8 5b d7 ff ff call 801000d0 + a = (uint*)bp->data; + if ((addr = a[bn]) == 0) { +80102975: 83 c4 10 add $0x10,%esp +80102978: 8d 5c 98 5c lea 0x5c(%eax,%ebx,4),%ebx + bp = bread(ip->dev, addr); +8010297c: 89 c2 mov %eax,%edx + if ((addr = a[bn]) == 0) { +8010297e: 8b 3b mov (%ebx),%edi +80102980: 85 ff test %edi,%edi +80102982: 74 1c je 801029a0 + a[bn] = addr = balloc(ip->dev); + log_write(bp); + } + brelse(bp); +80102984: 83 ec 0c sub $0xc,%esp +80102987: 52 push %edx +80102988: e8 63 d8 ff ff call 801001f0 +8010298d: 83 c4 10 add $0x10,%esp + return addr; + } + + panic("bmap: out of range"); +} +80102990: 8d 65 f4 lea -0xc(%ebp),%esp +80102993: 89 f8 mov %edi,%eax +80102995: 5b pop %ebx +80102996: 5e pop %esi +80102997: 5f pop %edi +80102998: 5d pop %ebp +80102999: c3 ret +8010299a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +801029a0: 89 45 e4 mov %eax,-0x1c(%ebp) + a[bn] = addr = balloc(ip->dev); +801029a3: 8b 06 mov (%esi),%eax +801029a5: e8 86 fd ff ff call 80102730 + log_write(bp); +801029aa: 8b 55 e4 mov -0x1c(%ebp),%edx +801029ad: 83 ec 0c sub $0xc,%esp + a[bn] = addr = balloc(ip->dev); +801029b0: 89 03 mov %eax,(%ebx) +801029b2: 89 c7 mov %eax,%edi + log_write(bp); +801029b4: 52 push %edx +801029b5: e8 76 1a 00 00 call 80104430 +801029ba: 8b 55 e4 mov -0x1c(%ebp),%edx +801029bd: 83 c4 10 add $0x10,%esp +801029c0: eb c2 jmp 80102984 +801029c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + ip->addrs[NDIRECT] = addr = balloc(ip->dev); +801029c8: 8b 06 mov (%esi),%eax +801029ca: e8 61 fd ff ff call 80102730 +801029cf: 89 86 8c 00 00 00 mov %eax,0x8c(%esi) +801029d5: eb 93 jmp 8010296a +801029d7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801029de: 66 90 xchg %ax,%ax + if ((addr = ip->addrs[bn]) == 0) { +801029e0: 8d 5a 14 lea 0x14(%edx),%ebx +801029e3: 8b 7c 98 0c mov 0xc(%eax,%ebx,4),%edi +801029e7: 85 ff test %edi,%edi +801029e9: 75 a5 jne 80102990 + ip->addrs[bn] = addr = balloc(ip->dev); +801029eb: 8b 00 mov (%eax),%eax +801029ed: e8 3e fd ff ff call 80102730 +801029f2: 89 44 9e 0c mov %eax,0xc(%esi,%ebx,4) +801029f6: 89 c7 mov %eax,%edi +} +801029f8: 8d 65 f4 lea -0xc(%ebp),%esp +801029fb: 5b pop %ebx +801029fc: 89 f8 mov %edi,%eax +801029fe: 5e pop %esi +801029ff: 5f pop %edi +80102a00: 5d pop %ebp +80102a01: c3 ret + panic("bmap: out of range"); +80102a02: 83 ec 0c sub $0xc,%esp +80102a05: 68 18 8b 10 80 push $0x80108b18 +80102a0a: e8 71 da ff ff call 80100480 +80102a0f: 90 nop + +80102a10 : +void readsb(int dev, struct superblock *sb) { +80102a10: 55 push %ebp +80102a11: 89 e5 mov %esp,%ebp +80102a13: 56 push %esi +80102a14: 53 push %ebx +80102a15: 8b 75 0c mov 0xc(%ebp),%esi + bp = bread(dev, 1); +80102a18: 83 ec 08 sub $0x8,%esp +80102a1b: 6a 01 push $0x1 +80102a1d: ff 75 08 push 0x8(%ebp) +80102a20: e8 ab d6 ff ff call 801000d0 + memmove(sb, bp->data, sizeof(*sb)); +80102a25: 83 c4 0c add $0xc,%esp + bp = bread(dev, 1); +80102a28: 89 c3 mov %eax,%ebx + memmove(sb, bp->data, sizeof(*sb)); +80102a2a: 8d 40 5c lea 0x5c(%eax),%eax +80102a2d: 6a 1c push $0x1c +80102a2f: 50 push %eax +80102a30: 56 push %esi +80102a31: e8 aa 32 00 00 call 80105ce0 + brelse(bp); +80102a36: 89 5d 08 mov %ebx,0x8(%ebp) +80102a39: 83 c4 10 add $0x10,%esp +} +80102a3c: 8d 65 f8 lea -0x8(%ebp),%esp +80102a3f: 5b pop %ebx +80102a40: 5e pop %esi +80102a41: 5d pop %ebp + brelse(bp); +80102a42: e9 a9 d7 ff ff jmp 801001f0 +80102a47: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102a4e: 66 90 xchg %ax,%ax + +80102a50 : +void iinit(int dev) { +80102a50: 55 push %ebp +80102a51: 89 e5 mov %esp,%ebp +80102a53: 53 push %ebx +80102a54: bb 20 c1 11 80 mov $0x8011c120,%ebx +80102a59: 83 ec 0c sub $0xc,%esp + initlock(&icache.lock, "icache"); +80102a5c: 68 2b 8b 10 80 push $0x80108b2b +80102a61: 68 e0 c0 11 80 push $0x8011c0e0 +80102a66: e8 45 2f 00 00 call 801059b0 + for (i = 0; i < NINODE; i++) { +80102a6b: 83 c4 10 add $0x10,%esp +80102a6e: 66 90 xchg %ax,%ax + initsleeplock(&icache.inode[i].lock, "inode"); +80102a70: 83 ec 08 sub $0x8,%esp +80102a73: 68 32 8b 10 80 push $0x80108b32 +80102a78: 53 push %ebx + for (i = 0; i < NINODE; i++) { +80102a79: 81 c3 90 00 00 00 add $0x90,%ebx + initsleeplock(&icache.inode[i].lock, "inode"); +80102a7f: e8 fc 2d 00 00 call 80105880 + for (i = 0; i < NINODE; i++) { +80102a84: 83 c4 10 add $0x10,%esp +80102a87: 81 fb 40 dd 11 80 cmp $0x8011dd40,%ebx +80102a8d: 75 e1 jne 80102a70 + bp = bread(dev, 1); +80102a8f: 83 ec 08 sub $0x8,%esp +80102a92: 6a 01 push $0x1 +80102a94: ff 75 08 push 0x8(%ebp) +80102a97: e8 34 d6 ff ff call 801000d0 + memmove(sb, bp->data, sizeof(*sb)); +80102a9c: 83 c4 0c add $0xc,%esp + bp = bread(dev, 1); +80102a9f: 89 c3 mov %eax,%ebx + memmove(sb, bp->data, sizeof(*sb)); +80102aa1: 8d 40 5c lea 0x5c(%eax),%eax +80102aa4: 6a 1c push $0x1c +80102aa6: 50 push %eax +80102aa7: 68 34 dd 11 80 push $0x8011dd34 +80102aac: e8 2f 32 00 00 call 80105ce0 + brelse(bp); +80102ab1: 89 1c 24 mov %ebx,(%esp) +80102ab4: e8 37 d7 ff ff call 801001f0 + cprintf("sb: size %d nblocks %d ninodes %d nlog %d logstart %d\ +80102ab9: ff 35 4c dd 11 80 push 0x8011dd4c +80102abf: ff 35 48 dd 11 80 push 0x8011dd48 +80102ac5: ff 35 44 dd 11 80 push 0x8011dd44 +80102acb: ff 35 40 dd 11 80 push 0x8011dd40 +80102ad1: ff 35 3c dd 11 80 push 0x8011dd3c +80102ad7: ff 35 38 dd 11 80 push 0x8011dd38 +80102add: ff 35 34 dd 11 80 push 0x8011dd34 +80102ae3: 68 98 8b 10 80 push $0x80108b98 +80102ae8: e8 a3 dd ff ff call 80100890 +} +80102aed: 8b 5d fc mov -0x4(%ebp),%ebx +80102af0: 83 c4 30 add $0x30,%esp +80102af3: c9 leave +80102af4: c3 ret +80102af5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102afc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80102b00 : +struct inode* ialloc(uint dev, short type) { +80102b00: 55 push %ebp +80102b01: 89 e5 mov %esp,%ebp +80102b03: 57 push %edi +80102b04: 56 push %esi +80102b05: 53 push %ebx +80102b06: 83 ec 1c sub $0x1c,%esp +80102b09: 8b 45 0c mov 0xc(%ebp),%eax + for (inum = 1; inum < sb.ninodes; inum++) { +80102b0c: 83 3d 3c dd 11 80 01 cmpl $0x1,0x8011dd3c +struct inode* ialloc(uint dev, short type) { +80102b13: 8b 75 08 mov 0x8(%ebp),%esi +80102b16: 89 45 e4 mov %eax,-0x1c(%ebp) + for (inum = 1; inum < sb.ninodes; inum++) { +80102b19: 0f 86 91 00 00 00 jbe 80102bb0 +80102b1f: bf 01 00 00 00 mov $0x1,%edi +80102b24: eb 21 jmp 80102b47 +80102b26: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102b2d: 8d 76 00 lea 0x0(%esi),%esi + brelse(bp); +80102b30: 83 ec 0c sub $0xc,%esp + for (inum = 1; inum < sb.ninodes; inum++) { +80102b33: 83 c7 01 add $0x1,%edi + brelse(bp); +80102b36: 53 push %ebx +80102b37: e8 b4 d6 ff ff call 801001f0 + for (inum = 1; inum < sb.ninodes; inum++) { +80102b3c: 83 c4 10 add $0x10,%esp +80102b3f: 3b 3d 3c dd 11 80 cmp 0x8011dd3c,%edi +80102b45: 73 69 jae 80102bb0 + bp = bread(dev, IBLOCK(inum, sb)); +80102b47: 89 f8 mov %edi,%eax +80102b49: 83 ec 08 sub $0x8,%esp +80102b4c: c1 e8 03 shr $0x3,%eax +80102b4f: 03 05 48 dd 11 80 add 0x8011dd48,%eax +80102b55: 50 push %eax +80102b56: 56 push %esi +80102b57: e8 74 d5 ff ff call 801000d0 + if (dip->type == 0) { // a free inode +80102b5c: 83 c4 10 add $0x10,%esp + bp = bread(dev, IBLOCK(inum, sb)); +80102b5f: 89 c3 mov %eax,%ebx + dip = (struct dinode*)bp->data + inum % IPB; +80102b61: 89 f8 mov %edi,%eax +80102b63: 83 e0 07 and $0x7,%eax +80102b66: c1 e0 06 shl $0x6,%eax +80102b69: 8d 4c 03 5c lea 0x5c(%ebx,%eax,1),%ecx + if (dip->type == 0) { // a free inode +80102b6d: 66 83 39 00 cmpw $0x0,(%ecx) +80102b71: 75 bd jne 80102b30 + memset(dip, 0, sizeof(*dip)); +80102b73: 83 ec 04 sub $0x4,%esp +80102b76: 89 4d e0 mov %ecx,-0x20(%ebp) +80102b79: 6a 40 push $0x40 +80102b7b: 6a 00 push $0x0 +80102b7d: 51 push %ecx +80102b7e: e8 bd 30 00 00 call 80105c40 + dip->type = type; +80102b83: 0f b7 45 e4 movzwl -0x1c(%ebp),%eax +80102b87: 8b 4d e0 mov -0x20(%ebp),%ecx +80102b8a: 66 89 01 mov %ax,(%ecx) + log_write(bp); // mark it allocated on the disk +80102b8d: 89 1c 24 mov %ebx,(%esp) +80102b90: e8 9b 18 00 00 call 80104430 + brelse(bp); +80102b95: 89 1c 24 mov %ebx,(%esp) +80102b98: e8 53 d6 ff ff call 801001f0 + return iget(dev, inum); +80102b9d: 83 c4 10 add $0x10,%esp +} +80102ba0: 8d 65 f4 lea -0xc(%ebp),%esp + return iget(dev, inum); +80102ba3: 89 fa mov %edi,%edx +} +80102ba5: 5b pop %ebx + return iget(dev, inum); +80102ba6: 89 f0 mov %esi,%eax +} +80102ba8: 5e pop %esi +80102ba9: 5f pop %edi +80102baa: 5d pop %ebp + return iget(dev, inum); +80102bab: e9 90 fc ff ff jmp 80102840 + panic("ialloc: no inodes"); +80102bb0: 83 ec 0c sub $0xc,%esp +80102bb3: 68 38 8b 10 80 push $0x80108b38 +80102bb8: e8 c3 d8 ff ff call 80100480 +80102bbd: 8d 76 00 lea 0x0(%esi),%esi + +80102bc0 : +void iupdate(struct inode *ip) { +80102bc0: 55 push %ebp +80102bc1: 89 e5 mov %esp,%ebp +80102bc3: 56 push %esi +80102bc4: 53 push %ebx +80102bc5: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); +80102bc8: 8b 43 04 mov 0x4(%ebx),%eax + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); +80102bcb: 83 c3 5c add $0x5c,%ebx + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); +80102bce: 83 ec 08 sub $0x8,%esp +80102bd1: c1 e8 03 shr $0x3,%eax +80102bd4: 03 05 48 dd 11 80 add 0x8011dd48,%eax +80102bda: 50 push %eax +80102bdb: ff 73 a4 push -0x5c(%ebx) +80102bde: e8 ed d4 ff ff call 801000d0 + dip->type = ip->type; +80102be3: 0f b7 53 f4 movzwl -0xc(%ebx),%edx + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); +80102be7: 83 c4 0c add $0xc,%esp + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); +80102bea: 89 c6 mov %eax,%esi + dip = (struct dinode*)bp->data + ip->inum % IPB; +80102bec: 8b 43 a8 mov -0x58(%ebx),%eax +80102bef: 83 e0 07 and $0x7,%eax +80102bf2: c1 e0 06 shl $0x6,%eax +80102bf5: 8d 44 06 5c lea 0x5c(%esi,%eax,1),%eax + dip->type = ip->type; +80102bf9: 66 89 10 mov %dx,(%eax) + dip->major = ip->major; +80102bfc: 0f b7 53 f6 movzwl -0xa(%ebx),%edx + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); +80102c00: 83 c0 0c add $0xc,%eax + dip->major = ip->major; +80102c03: 66 89 50 f6 mov %dx,-0xa(%eax) + dip->minor = ip->minor; +80102c07: 0f b7 53 f8 movzwl -0x8(%ebx),%edx +80102c0b: 66 89 50 f8 mov %dx,-0x8(%eax) + dip->nlink = ip->nlink; +80102c0f: 0f b7 53 fa movzwl -0x6(%ebx),%edx +80102c13: 66 89 50 fa mov %dx,-0x6(%eax) + dip->size = ip->size; +80102c17: 8b 53 fc mov -0x4(%ebx),%edx +80102c1a: 89 50 fc mov %edx,-0x4(%eax) + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); +80102c1d: 6a 34 push $0x34 +80102c1f: 53 push %ebx +80102c20: 50 push %eax +80102c21: e8 ba 30 00 00 call 80105ce0 + log_write(bp); +80102c26: 89 34 24 mov %esi,(%esp) +80102c29: e8 02 18 00 00 call 80104430 + brelse(bp); +80102c2e: 89 75 08 mov %esi,0x8(%ebp) +80102c31: 83 c4 10 add $0x10,%esp +} +80102c34: 8d 65 f8 lea -0x8(%ebp),%esp +80102c37: 5b pop %ebx +80102c38: 5e pop %esi +80102c39: 5d pop %ebp + brelse(bp); +80102c3a: e9 b1 d5 ff ff jmp 801001f0 +80102c3f: 90 nop + +80102c40 : +struct inode* idup(struct inode *ip) { +80102c40: 55 push %ebp +80102c41: 89 e5 mov %esp,%ebp +80102c43: 53 push %ebx +80102c44: 83 ec 10 sub $0x10,%esp +80102c47: 8b 5d 08 mov 0x8(%ebp),%ebx + acquire(&icache.lock); +80102c4a: 68 e0 c0 11 80 push $0x8011c0e0 +80102c4f: e8 2c 2f 00 00 call 80105b80 + ip->ref++; +80102c54: 83 43 08 01 addl $0x1,0x8(%ebx) + release(&icache.lock); +80102c58: c7 04 24 e0 c0 11 80 movl $0x8011c0e0,(%esp) +80102c5f: e8 bc 2e 00 00 call 80105b20 +} +80102c64: 89 d8 mov %ebx,%eax +80102c66: 8b 5d fc mov -0x4(%ebp),%ebx +80102c69: c9 leave +80102c6a: c3 ret +80102c6b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102c6f: 90 nop + +80102c70 : +void ilock(struct inode *ip) { +80102c70: 55 push %ebp +80102c71: 89 e5 mov %esp,%ebp +80102c73: 56 push %esi +80102c74: 53 push %ebx +80102c75: 8b 5d 08 mov 0x8(%ebp),%ebx + if (ip == 0 || ip->ref < 1) { +80102c78: 85 db test %ebx,%ebx +80102c7a: 0f 84 b7 00 00 00 je 80102d37 +80102c80: 8b 53 08 mov 0x8(%ebx),%edx +80102c83: 85 d2 test %edx,%edx +80102c85: 0f 8e ac 00 00 00 jle 80102d37 + acquiresleep(&ip->lock); +80102c8b: 83 ec 0c sub $0xc,%esp +80102c8e: 8d 43 0c lea 0xc(%ebx),%eax +80102c91: 50 push %eax +80102c92: e8 29 2c 00 00 call 801058c0 + if (ip->valid == 0) { +80102c97: 8b 43 4c mov 0x4c(%ebx),%eax +80102c9a: 83 c4 10 add $0x10,%esp +80102c9d: 85 c0 test %eax,%eax +80102c9f: 74 0f je 80102cb0 +} +80102ca1: 8d 65 f8 lea -0x8(%ebp),%esp +80102ca4: 5b pop %ebx +80102ca5: 5e pop %esi +80102ca6: 5d pop %ebp +80102ca7: c3 ret +80102ca8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102caf: 90 nop + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); +80102cb0: 8b 43 04 mov 0x4(%ebx),%eax +80102cb3: 83 ec 08 sub $0x8,%esp +80102cb6: c1 e8 03 shr $0x3,%eax +80102cb9: 03 05 48 dd 11 80 add 0x8011dd48,%eax +80102cbf: 50 push %eax +80102cc0: ff 33 push (%ebx) +80102cc2: e8 09 d4 ff ff call 801000d0 + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); +80102cc7: 83 c4 0c add $0xc,%esp + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); +80102cca: 89 c6 mov %eax,%esi + dip = (struct dinode*)bp->data + ip->inum % IPB; +80102ccc: 8b 43 04 mov 0x4(%ebx),%eax +80102ccf: 83 e0 07 and $0x7,%eax +80102cd2: c1 e0 06 shl $0x6,%eax +80102cd5: 8d 44 06 5c lea 0x5c(%esi,%eax,1),%eax + ip->type = dip->type; +80102cd9: 0f b7 10 movzwl (%eax),%edx + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); +80102cdc: 83 c0 0c add $0xc,%eax + ip->type = dip->type; +80102cdf: 66 89 53 50 mov %dx,0x50(%ebx) + ip->major = dip->major; +80102ce3: 0f b7 50 f6 movzwl -0xa(%eax),%edx +80102ce7: 66 89 53 52 mov %dx,0x52(%ebx) + ip->minor = dip->minor; +80102ceb: 0f b7 50 f8 movzwl -0x8(%eax),%edx +80102cef: 66 89 53 54 mov %dx,0x54(%ebx) + ip->nlink = dip->nlink; +80102cf3: 0f b7 50 fa movzwl -0x6(%eax),%edx +80102cf7: 66 89 53 56 mov %dx,0x56(%ebx) + ip->size = dip->size; +80102cfb: 8b 50 fc mov -0x4(%eax),%edx +80102cfe: 89 53 58 mov %edx,0x58(%ebx) + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); +80102d01: 6a 34 push $0x34 +80102d03: 50 push %eax +80102d04: 8d 43 5c lea 0x5c(%ebx),%eax +80102d07: 50 push %eax +80102d08: e8 d3 2f 00 00 call 80105ce0 + brelse(bp); +80102d0d: 89 34 24 mov %esi,(%esp) +80102d10: e8 db d4 ff ff call 801001f0 + if (ip->type == 0) { +80102d15: 83 c4 10 add $0x10,%esp +80102d18: 66 83 7b 50 00 cmpw $0x0,0x50(%ebx) + ip->valid = 1; +80102d1d: c7 43 4c 01 00 00 00 movl $0x1,0x4c(%ebx) + if (ip->type == 0) { +80102d24: 0f 85 77 ff ff ff jne 80102ca1 + panic("ilock: no type"); +80102d2a: 83 ec 0c sub $0xc,%esp +80102d2d: 68 50 8b 10 80 push $0x80108b50 +80102d32: e8 49 d7 ff ff call 80100480 + panic("ilock"); +80102d37: 83 ec 0c sub $0xc,%esp +80102d3a: 68 4a 8b 10 80 push $0x80108b4a +80102d3f: e8 3c d7 ff ff call 80100480 +80102d44: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102d4b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102d4f: 90 nop + +80102d50 : +void iunlock(struct inode *ip) { +80102d50: 55 push %ebp +80102d51: 89 e5 mov %esp,%ebp +80102d53: 56 push %esi +80102d54: 53 push %ebx +80102d55: 8b 5d 08 mov 0x8(%ebp),%ebx + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80102d58: 85 db test %ebx,%ebx +80102d5a: 74 28 je 80102d84 +80102d5c: 83 ec 0c sub $0xc,%esp +80102d5f: 8d 73 0c lea 0xc(%ebx),%esi +80102d62: 56 push %esi +80102d63: e8 f8 2b 00 00 call 80105960 +80102d68: 83 c4 10 add $0x10,%esp +80102d6b: 85 c0 test %eax,%eax +80102d6d: 74 15 je 80102d84 +80102d6f: 8b 43 08 mov 0x8(%ebx),%eax +80102d72: 85 c0 test %eax,%eax +80102d74: 7e 0e jle 80102d84 + releasesleep(&ip->lock); +80102d76: 89 75 08 mov %esi,0x8(%ebp) +} +80102d79: 8d 65 f8 lea -0x8(%ebp),%esp +80102d7c: 5b pop %ebx +80102d7d: 5e pop %esi +80102d7e: 5d pop %ebp + releasesleep(&ip->lock); +80102d7f: e9 9c 2b 00 00 jmp 80105920 + panic("iunlock"); +80102d84: 83 ec 0c sub $0xc,%esp +80102d87: 68 5f 8b 10 80 push $0x80108b5f +80102d8c: e8 ef d6 ff ff call 80100480 +80102d91: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102d98: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102d9f: 90 nop + +80102da0 : +void iput(struct inode *ip) { +80102da0: 55 push %ebp +80102da1: 89 e5 mov %esp,%ebp +80102da3: 57 push %edi +80102da4: 56 push %esi +80102da5: 53 push %ebx +80102da6: 83 ec 28 sub $0x28,%esp +80102da9: 8b 5d 08 mov 0x8(%ebp),%ebx + acquiresleep(&ip->lock); +80102dac: 8d 7b 0c lea 0xc(%ebx),%edi +80102daf: 57 push %edi +80102db0: e8 0b 2b 00 00 call 801058c0 + if (ip->valid && ip->nlink == 0) { +80102db5: 8b 53 4c mov 0x4c(%ebx),%edx +80102db8: 83 c4 10 add $0x10,%esp +80102dbb: 85 d2 test %edx,%edx +80102dbd: 74 07 je 80102dc6 +80102dbf: 66 83 7b 56 00 cmpw $0x0,0x56(%ebx) +80102dc4: 74 32 je 80102df8 + releasesleep(&ip->lock); +80102dc6: 83 ec 0c sub $0xc,%esp +80102dc9: 57 push %edi +80102dca: e8 51 2b 00 00 call 80105920 + acquire(&icache.lock); +80102dcf: c7 04 24 e0 c0 11 80 movl $0x8011c0e0,(%esp) +80102dd6: e8 a5 2d 00 00 call 80105b80 + ip->ref--; +80102ddb: 83 6b 08 01 subl $0x1,0x8(%ebx) + release(&icache.lock); +80102ddf: 83 c4 10 add $0x10,%esp +80102de2: c7 45 08 e0 c0 11 80 movl $0x8011c0e0,0x8(%ebp) +} +80102de9: 8d 65 f4 lea -0xc(%ebp),%esp +80102dec: 5b pop %ebx +80102ded: 5e pop %esi +80102dee: 5f pop %edi +80102def: 5d pop %ebp + release(&icache.lock); +80102df0: e9 2b 2d 00 00 jmp 80105b20 +80102df5: 8d 76 00 lea 0x0(%esi),%esi + acquire(&icache.lock); +80102df8: 83 ec 0c sub $0xc,%esp +80102dfb: 68 e0 c0 11 80 push $0x8011c0e0 +80102e00: e8 7b 2d 00 00 call 80105b80 + int r = ip->ref; +80102e05: 8b 73 08 mov 0x8(%ebx),%esi + release(&icache.lock); +80102e08: c7 04 24 e0 c0 11 80 movl $0x8011c0e0,(%esp) +80102e0f: e8 0c 2d 00 00 call 80105b20 + if (r == 1) { +80102e14: 83 c4 10 add $0x10,%esp +80102e17: 83 fe 01 cmp $0x1,%esi +80102e1a: 75 aa jne 80102dc6 +80102e1c: 8d 8b 8c 00 00 00 lea 0x8c(%ebx),%ecx +80102e22: 89 7d e4 mov %edi,-0x1c(%ebp) +80102e25: 8d 73 5c lea 0x5c(%ebx),%esi +80102e28: 89 cf mov %ecx,%edi +80102e2a: eb 0b jmp 80102e37 +80102e2c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +static void itrunc(struct inode *ip) { + int i, j; + struct buf *bp; + uint *a; + + for (i = 0; i < NDIRECT; i++) { +80102e30: 83 c6 04 add $0x4,%esi +80102e33: 39 fe cmp %edi,%esi +80102e35: 74 19 je 80102e50 + if (ip->addrs[i]) { +80102e37: 8b 16 mov (%esi),%edx +80102e39: 85 d2 test %edx,%edx +80102e3b: 74 f3 je 80102e30 + bfree(ip->dev, ip->addrs[i]); +80102e3d: 8b 03 mov (%ebx),%eax +80102e3f: e8 6c f8 ff ff call 801026b0 + ip->addrs[i] = 0; +80102e44: c7 06 00 00 00 00 movl $0x0,(%esi) +80102e4a: eb e4 jmp 80102e30 +80102e4c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + } + } + + if (ip->addrs[NDIRECT]) { +80102e50: 8b 83 8c 00 00 00 mov 0x8c(%ebx),%eax +80102e56: 8b 7d e4 mov -0x1c(%ebp),%edi +80102e59: 85 c0 test %eax,%eax +80102e5b: 75 2d jne 80102e8a + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; + iupdate(ip); +80102e5d: 83 ec 0c sub $0xc,%esp + ip->size = 0; +80102e60: c7 43 58 00 00 00 00 movl $0x0,0x58(%ebx) + iupdate(ip); +80102e67: 53 push %ebx +80102e68: e8 53 fd ff ff call 80102bc0 + ip->type = 0; +80102e6d: 31 c0 xor %eax,%eax +80102e6f: 66 89 43 50 mov %ax,0x50(%ebx) + iupdate(ip); +80102e73: 89 1c 24 mov %ebx,(%esp) +80102e76: e8 45 fd ff ff call 80102bc0 + ip->valid = 0; +80102e7b: c7 43 4c 00 00 00 00 movl $0x0,0x4c(%ebx) +80102e82: 83 c4 10 add $0x10,%esp +80102e85: e9 3c ff ff ff jmp 80102dc6 + bp = bread(ip->dev, ip->addrs[NDIRECT]); +80102e8a: 83 ec 08 sub $0x8,%esp +80102e8d: 50 push %eax +80102e8e: ff 33 push (%ebx) +80102e90: e8 3b d2 ff ff call 801000d0 +80102e95: 89 7d e0 mov %edi,-0x20(%ebp) +80102e98: 83 c4 10 add $0x10,%esp +80102e9b: 8d 88 5c 02 00 00 lea 0x25c(%eax),%ecx +80102ea1: 89 45 e4 mov %eax,-0x1c(%ebp) + for (j = 0; j < NINDIRECT; j++) { +80102ea4: 8d 70 5c lea 0x5c(%eax),%esi +80102ea7: 89 cf mov %ecx,%edi +80102ea9: eb 0c jmp 80102eb7 +80102eab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102eaf: 90 nop +80102eb0: 83 c6 04 add $0x4,%esi +80102eb3: 39 f7 cmp %esi,%edi +80102eb5: 74 0f je 80102ec6 + if (a[j]) { +80102eb7: 8b 16 mov (%esi),%edx +80102eb9: 85 d2 test %edx,%edx +80102ebb: 74 f3 je 80102eb0 + bfree(ip->dev, a[j]); +80102ebd: 8b 03 mov (%ebx),%eax +80102ebf: e8 ec f7 ff ff call 801026b0 +80102ec4: eb ea jmp 80102eb0 + brelse(bp); +80102ec6: 83 ec 0c sub $0xc,%esp +80102ec9: ff 75 e4 push -0x1c(%ebp) +80102ecc: 8b 7d e0 mov -0x20(%ebp),%edi +80102ecf: e8 1c d3 ff ff call 801001f0 + bfree(ip->dev, ip->addrs[NDIRECT]); +80102ed4: 8b 93 8c 00 00 00 mov 0x8c(%ebx),%edx +80102eda: 8b 03 mov (%ebx),%eax +80102edc: e8 cf f7 ff ff call 801026b0 + ip->addrs[NDIRECT] = 0; +80102ee1: 83 c4 10 add $0x10,%esp +80102ee4: c7 83 8c 00 00 00 00 movl $0x0,0x8c(%ebx) +80102eeb: 00 00 00 +80102eee: e9 6a ff ff ff jmp 80102e5d +80102ef3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80102efa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80102f00 : +void iunlockput(struct inode *ip) { +80102f00: 55 push %ebp +80102f01: 89 e5 mov %esp,%ebp +80102f03: 56 push %esi +80102f04: 53 push %ebx +80102f05: 8b 5d 08 mov 0x8(%ebp),%ebx + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80102f08: 85 db test %ebx,%ebx +80102f0a: 74 34 je 80102f40 +80102f0c: 83 ec 0c sub $0xc,%esp +80102f0f: 8d 73 0c lea 0xc(%ebx),%esi +80102f12: 56 push %esi +80102f13: e8 48 2a 00 00 call 80105960 +80102f18: 83 c4 10 add $0x10,%esp +80102f1b: 85 c0 test %eax,%eax +80102f1d: 74 21 je 80102f40 +80102f1f: 8b 43 08 mov 0x8(%ebx),%eax +80102f22: 85 c0 test %eax,%eax +80102f24: 7e 1a jle 80102f40 + releasesleep(&ip->lock); +80102f26: 83 ec 0c sub $0xc,%esp +80102f29: 56 push %esi +80102f2a: e8 f1 29 00 00 call 80105920 + iput(ip); +80102f2f: 89 5d 08 mov %ebx,0x8(%ebp) +80102f32: 83 c4 10 add $0x10,%esp +} +80102f35: 8d 65 f8 lea -0x8(%ebp),%esp +80102f38: 5b pop %ebx +80102f39: 5e pop %esi +80102f3a: 5d pop %ebp + iput(ip); +80102f3b: e9 60 fe ff ff jmp 80102da0 + panic("iunlock"); +80102f40: 83 ec 0c sub $0xc,%esp +80102f43: 68 5f 8b 10 80 push $0x80108b5f +80102f48: e8 33 d5 ff ff call 80100480 +80102f4d: 8d 76 00 lea 0x0(%esi),%esi + +80102f50 : +} + +// Copy stat information from inode. +// Caller must hold ip->lock. +void stati(struct inode *ip, struct stat *st) { +80102f50: 55 push %ebp +80102f51: 89 e5 mov %esp,%ebp +80102f53: 8b 55 08 mov 0x8(%ebp),%edx +80102f56: 8b 45 0c mov 0xc(%ebp),%eax + st->dev = ip->dev; +80102f59: 8b 0a mov (%edx),%ecx +80102f5b: 89 48 04 mov %ecx,0x4(%eax) + st->ino = ip->inum; +80102f5e: 8b 4a 04 mov 0x4(%edx),%ecx +80102f61: 89 48 08 mov %ecx,0x8(%eax) + st->type = ip->type; +80102f64: 0f b7 4a 50 movzwl 0x50(%edx),%ecx +80102f68: 66 89 08 mov %cx,(%eax) + st->nlink = ip->nlink; +80102f6b: 0f b7 4a 56 movzwl 0x56(%edx),%ecx +80102f6f: 66 89 48 0c mov %cx,0xc(%eax) + st->size = ip->size; +80102f73: 8b 52 58 mov 0x58(%edx),%edx +80102f76: 89 50 10 mov %edx,0x10(%eax) +} +80102f79: 5d pop %ebp +80102f7a: c3 ret +80102f7b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102f7f: 90 nop + +80102f80 : + + +// Read data from inode. +// Caller must hold ip->lock. +int readi(struct inode *ip, char *dst, uint off, uint n) { +80102f80: 55 push %ebp +80102f81: 89 e5 mov %esp,%ebp +80102f83: 57 push %edi +80102f84: 56 push %esi +80102f85: 53 push %ebx +80102f86: 83 ec 1c sub $0x1c,%esp +80102f89: 8b 7d 0c mov 0xc(%ebp),%edi +80102f8c: 8b 45 08 mov 0x8(%ebp),%eax +80102f8f: 8b 75 10 mov 0x10(%ebp),%esi +80102f92: 89 7d e0 mov %edi,-0x20(%ebp) +80102f95: 8b 7d 14 mov 0x14(%ebp),%edi + uint tot, m; + struct buf *bp; + + if (ip->type == T_DEV) { +80102f98: 66 83 78 50 03 cmpw $0x3,0x50(%eax) +int readi(struct inode *ip, char *dst, uint off, uint n) { +80102f9d: 89 45 d8 mov %eax,-0x28(%ebp) +80102fa0: 89 7d e4 mov %edi,-0x1c(%ebp) + if (ip->type == T_DEV) { +80102fa3: 0f 84 a7 00 00 00 je 80103050 + return -1; + } + return devsw[ip->major].read(ip, dst, n); + } + + if (off > ip->size || off + n < off) { +80102fa9: 8b 45 d8 mov -0x28(%ebp),%eax +80102fac: 8b 40 58 mov 0x58(%eax),%eax +80102faf: 39 c6 cmp %eax,%esi +80102fb1: 0f 87 ba 00 00 00 ja 80103071 +80102fb7: 8b 5d e4 mov -0x1c(%ebp),%ebx +80102fba: 31 c9 xor %ecx,%ecx +80102fbc: 89 da mov %ebx,%edx +80102fbe: 01 f2 add %esi,%edx +80102fc0: 0f 92 c1 setb %cl +80102fc3: 89 cf mov %ecx,%edi +80102fc5: 0f 82 a6 00 00 00 jb 80103071 + return -1; + } + if (off + n > ip->size) { + n = ip->size - off; +80102fcb: 89 c1 mov %eax,%ecx +80102fcd: 29 f1 sub %esi,%ecx +80102fcf: 39 d0 cmp %edx,%eax +80102fd1: 0f 43 cb cmovae %ebx,%ecx +80102fd4: 89 4d e4 mov %ecx,-0x1c(%ebp) + } + + for (tot = 0; tot < n; tot += m, off += m, dst += m) { +80102fd7: 85 c9 test %ecx,%ecx +80102fd9: 74 67 je 80103042 +80102fdb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80102fdf: 90 nop + bp = bread(ip->dev, bmap(ip, off / BSIZE)); +80102fe0: 8b 5d d8 mov -0x28(%ebp),%ebx +80102fe3: 89 f2 mov %esi,%edx +80102fe5: c1 ea 09 shr $0x9,%edx +80102fe8: 89 d8 mov %ebx,%eax +80102fea: e8 51 f9 ff ff call 80102940 +80102fef: 83 ec 08 sub $0x8,%esp +80102ff2: 50 push %eax +80102ff3: ff 33 push (%ebx) +80102ff5: e8 d6 d0 ff ff call 801000d0 + m = min(n - tot, BSIZE - off % BSIZE); +80102ffa: 8b 5d e4 mov -0x1c(%ebp),%ebx +80102ffd: b9 00 02 00 00 mov $0x200,%ecx + bp = bread(ip->dev, bmap(ip, off / BSIZE)); +80103002: 89 c2 mov %eax,%edx + m = min(n - tot, BSIZE - off % BSIZE); +80103004: 89 f0 mov %esi,%eax +80103006: 25 ff 01 00 00 and $0x1ff,%eax +8010300b: 29 fb sub %edi,%ebx + memmove(dst, bp->data + off % BSIZE, m); +8010300d: 89 55 dc mov %edx,-0x24(%ebp) + m = min(n - tot, BSIZE - off % BSIZE); +80103010: 29 c1 sub %eax,%ecx + memmove(dst, bp->data + off % BSIZE, m); +80103012: 8d 44 02 5c lea 0x5c(%edx,%eax,1),%eax + m = min(n - tot, BSIZE - off % BSIZE); +80103016: 39 d9 cmp %ebx,%ecx +80103018: 0f 46 d9 cmovbe %ecx,%ebx + memmove(dst, bp->data + off % BSIZE, m); +8010301b: 83 c4 0c add $0xc,%esp +8010301e: 53 push %ebx + for (tot = 0; tot < n; tot += m, off += m, dst += m) { +8010301f: 01 df add %ebx,%edi +80103021: 01 de add %ebx,%esi + memmove(dst, bp->data + off % BSIZE, m); +80103023: 50 push %eax +80103024: ff 75 e0 push -0x20(%ebp) +80103027: e8 b4 2c 00 00 call 80105ce0 + brelse(bp); +8010302c: 8b 55 dc mov -0x24(%ebp),%edx +8010302f: 89 14 24 mov %edx,(%esp) +80103032: e8 b9 d1 ff ff call 801001f0 + for (tot = 0; tot < n; tot += m, off += m, dst += m) { +80103037: 01 5d e0 add %ebx,-0x20(%ebp) +8010303a: 83 c4 10 add $0x10,%esp +8010303d: 39 7d e4 cmp %edi,-0x1c(%ebp) +80103040: 77 9e ja 80102fe0 + } + return n; +80103042: 8b 45 e4 mov -0x1c(%ebp),%eax +} +80103045: 8d 65 f4 lea -0xc(%ebp),%esp +80103048: 5b pop %ebx +80103049: 5e pop %esi +8010304a: 5f pop %edi +8010304b: 5d pop %ebp +8010304c: c3 ret +8010304d: 8d 76 00 lea 0x0(%esi),%esi + if (ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read) { +80103050: 0f bf 40 52 movswl 0x52(%eax),%eax +80103054: 66 83 f8 09 cmp $0x9,%ax +80103058: 77 17 ja 80103071 +8010305a: 8b 04 c5 80 c0 11 80 mov -0x7fee3f80(,%eax,8),%eax +80103061: 85 c0 test %eax,%eax +80103063: 74 0c je 80103071 + return devsw[ip->major].read(ip, dst, n); +80103065: 89 7d 10 mov %edi,0x10(%ebp) +} +80103068: 8d 65 f4 lea -0xc(%ebp),%esp +8010306b: 5b pop %ebx +8010306c: 5e pop %esi +8010306d: 5f pop %edi +8010306e: 5d pop %ebp + return devsw[ip->major].read(ip, dst, n); +8010306f: ff e0 jmp *%eax + return -1; +80103071: b8 ff ff ff ff mov $0xffffffff,%eax +80103076: eb cd jmp 80103045 +80103078: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010307f: 90 nop + +80103080 : + +// Write data to inode. +// Caller must hold ip->lock. +int writei(struct inode *ip, char *src, uint off, uint n) { +80103080: 55 push %ebp +80103081: 89 e5 mov %esp,%ebp +80103083: 57 push %edi +80103084: 56 push %esi +80103085: 53 push %ebx +80103086: 83 ec 1c sub $0x1c,%esp +80103089: 8b 45 08 mov 0x8(%ebp),%eax +8010308c: 8b 75 0c mov 0xc(%ebp),%esi +8010308f: 8b 55 14 mov 0x14(%ebp),%edx + uint tot, m; + struct buf *bp; + + if (ip->type == T_DEV) { +80103092: 66 83 78 50 03 cmpw $0x3,0x50(%eax) +int writei(struct inode *ip, char *src, uint off, uint n) { +80103097: 89 75 dc mov %esi,-0x24(%ebp) +8010309a: 89 45 d8 mov %eax,-0x28(%ebp) +8010309d: 8b 75 10 mov 0x10(%ebp),%esi +801030a0: 89 55 e0 mov %edx,-0x20(%ebp) + if (ip->type == T_DEV) { +801030a3: 0f 84 b7 00 00 00 je 80103160 + return -1; + } + return devsw[ip->major].write(ip, src, n); + } + + if (off > ip->size || off + n < off) { +801030a9: 8b 45 d8 mov -0x28(%ebp),%eax +801030ac: 3b 70 58 cmp 0x58(%eax),%esi +801030af: 0f 87 e7 00 00 00 ja 8010319c +801030b5: 8b 7d e0 mov -0x20(%ebp),%edi +801030b8: 31 d2 xor %edx,%edx +801030ba: 89 f8 mov %edi,%eax +801030bc: 01 f0 add %esi,%eax +801030be: 0f 92 c2 setb %dl + return -1; + } + if (off + n > MAXFILE * BSIZE) { +801030c1: 3d 00 18 01 00 cmp $0x11800,%eax +801030c6: 0f 87 d0 00 00 00 ja 8010319c +801030cc: 85 d2 test %edx,%edx +801030ce: 0f 85 c8 00 00 00 jne 8010319c + return -1; + } + + for (tot = 0; tot < n; tot += m, off += m, src += m) { +801030d4: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +801030db: 85 ff test %edi,%edi +801030dd: 74 72 je 80103151 +801030df: 90 nop + bp = bread(ip->dev, bmap(ip, off / BSIZE)); +801030e0: 8b 7d d8 mov -0x28(%ebp),%edi +801030e3: 89 f2 mov %esi,%edx +801030e5: c1 ea 09 shr $0x9,%edx +801030e8: 89 f8 mov %edi,%eax +801030ea: e8 51 f8 ff ff call 80102940 +801030ef: 83 ec 08 sub $0x8,%esp +801030f2: 50 push %eax +801030f3: ff 37 push (%edi) +801030f5: e8 d6 cf ff ff call 801000d0 + m = min(n - tot, BSIZE - off % BSIZE); +801030fa: b9 00 02 00 00 mov $0x200,%ecx +801030ff: 8b 5d e0 mov -0x20(%ebp),%ebx +80103102: 2b 5d e4 sub -0x1c(%ebp),%ebx + bp = bread(ip->dev, bmap(ip, off / BSIZE)); +80103105: 89 c7 mov %eax,%edi + m = min(n - tot, BSIZE - off % BSIZE); +80103107: 89 f0 mov %esi,%eax +80103109: 25 ff 01 00 00 and $0x1ff,%eax +8010310e: 29 c1 sub %eax,%ecx + memmove(bp->data + off % BSIZE, src, m); +80103110: 8d 44 07 5c lea 0x5c(%edi,%eax,1),%eax + m = min(n - tot, BSIZE - off % BSIZE); +80103114: 39 d9 cmp %ebx,%ecx +80103116: 0f 46 d9 cmovbe %ecx,%ebx + memmove(bp->data + off % BSIZE, src, m); +80103119: 83 c4 0c add $0xc,%esp +8010311c: 53 push %ebx + for (tot = 0; tot < n; tot += m, off += m, src += m) { +8010311d: 01 de add %ebx,%esi + memmove(bp->data + off % BSIZE, src, m); +8010311f: ff 75 dc push -0x24(%ebp) +80103122: 50 push %eax +80103123: e8 b8 2b 00 00 call 80105ce0 + log_write(bp); +80103128: 89 3c 24 mov %edi,(%esp) +8010312b: e8 00 13 00 00 call 80104430 + brelse(bp); +80103130: 89 3c 24 mov %edi,(%esp) +80103133: e8 b8 d0 ff ff call 801001f0 + for (tot = 0; tot < n; tot += m, off += m, src += m) { +80103138: 01 5d e4 add %ebx,-0x1c(%ebp) +8010313b: 83 c4 10 add $0x10,%esp +8010313e: 8b 45 e4 mov -0x1c(%ebp),%eax +80103141: 01 5d dc add %ebx,-0x24(%ebp) +80103144: 39 45 e0 cmp %eax,-0x20(%ebp) +80103147: 77 97 ja 801030e0 + } + + if (n > 0 && off > ip->size) { +80103149: 8b 45 d8 mov -0x28(%ebp),%eax +8010314c: 3b 70 58 cmp 0x58(%eax),%esi +8010314f: 77 37 ja 80103188 + ip->size = off; + iupdate(ip); + } + return n; +80103151: 8b 45 e0 mov -0x20(%ebp),%eax +} +80103154: 8d 65 f4 lea -0xc(%ebp),%esp +80103157: 5b pop %ebx +80103158: 5e pop %esi +80103159: 5f pop %edi +8010315a: 5d pop %ebp +8010315b: c3 ret +8010315c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write) { +80103160: 0f bf 40 52 movswl 0x52(%eax),%eax +80103164: 66 83 f8 09 cmp $0x9,%ax +80103168: 77 32 ja 8010319c +8010316a: 8b 04 c5 84 c0 11 80 mov -0x7fee3f7c(,%eax,8),%eax +80103171: 85 c0 test %eax,%eax +80103173: 74 27 je 8010319c + return devsw[ip->major].write(ip, src, n); +80103175: 89 55 10 mov %edx,0x10(%ebp) +} +80103178: 8d 65 f4 lea -0xc(%ebp),%esp +8010317b: 5b pop %ebx +8010317c: 5e pop %esi +8010317d: 5f pop %edi +8010317e: 5d pop %ebp + return devsw[ip->major].write(ip, src, n); +8010317f: ff e0 jmp *%eax +80103181: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ip->size = off; +80103188: 8b 45 d8 mov -0x28(%ebp),%eax + iupdate(ip); +8010318b: 83 ec 0c sub $0xc,%esp + ip->size = off; +8010318e: 89 70 58 mov %esi,0x58(%eax) + iupdate(ip); +80103191: 50 push %eax +80103192: e8 29 fa ff ff call 80102bc0 +80103197: 83 c4 10 add $0x10,%esp +8010319a: eb b5 jmp 80103151 + return -1; +8010319c: b8 ff ff ff ff mov $0xffffffff,%eax +801031a1: eb b1 jmp 80103154 +801031a3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801031aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +801031b0 : + + +// Directories + +int namecmp(const char *s, const char *t) { +801031b0: 55 push %ebp +801031b1: 89 e5 mov %esp,%ebp +801031b3: 83 ec 0c sub $0xc,%esp + return strncmp(s, t, DIRSIZ); +801031b6: 6a 0e push $0xe +801031b8: ff 75 0c push 0xc(%ebp) +801031bb: ff 75 08 push 0x8(%ebp) +801031be: e8 8d 2b 00 00 call 80105d50 +} +801031c3: c9 leave +801031c4: c3 ret +801031c5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801031cc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +801031d0 : + +// Look for a directory entry in a directory. +// If found, set *poff to byte offset of entry. +struct inode* dirlookup(struct inode *dp, char *name, uint *poff) { +801031d0: 55 push %ebp +801031d1: 89 e5 mov %esp,%ebp +801031d3: 57 push %edi +801031d4: 56 push %esi +801031d5: 53 push %ebx +801031d6: 83 ec 1c sub $0x1c,%esp +801031d9: 8b 5d 08 mov 0x8(%ebp),%ebx + uint off, inum; + struct dirent de; + + if (dp->type != T_DIR) { +801031dc: 66 83 7b 50 01 cmpw $0x1,0x50(%ebx) +801031e1: 0f 85 85 00 00 00 jne 8010326c + panic("dirlookup not DIR"); + } + + for (off = 0; off < dp->size; off += sizeof(de)) { +801031e7: 8b 53 58 mov 0x58(%ebx),%edx +801031ea: 31 ff xor %edi,%edi +801031ec: 8d 75 d8 lea -0x28(%ebp),%esi +801031ef: 85 d2 test %edx,%edx +801031f1: 74 3e je 80103231 +801031f3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801031f7: 90 nop + if (readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +801031f8: 6a 10 push $0x10 +801031fa: 57 push %edi +801031fb: 56 push %esi +801031fc: 53 push %ebx +801031fd: e8 7e fd ff ff call 80102f80 +80103202: 83 c4 10 add $0x10,%esp +80103205: 83 f8 10 cmp $0x10,%eax +80103208: 75 55 jne 8010325f + panic("dirlookup read"); + } + if (de.inum == 0) { +8010320a: 66 83 7d d8 00 cmpw $0x0,-0x28(%ebp) +8010320f: 74 18 je 80103229 + return strncmp(s, t, DIRSIZ); +80103211: 83 ec 04 sub $0x4,%esp +80103214: 8d 45 da lea -0x26(%ebp),%eax +80103217: 6a 0e push $0xe +80103219: 50 push %eax +8010321a: ff 75 0c push 0xc(%ebp) +8010321d: e8 2e 2b 00 00 call 80105d50 + continue; + } + if (namecmp(name, de.name) == 0) { +80103222: 83 c4 10 add $0x10,%esp +80103225: 85 c0 test %eax,%eax +80103227: 74 17 je 80103240 + for (off = 0; off < dp->size; off += sizeof(de)) { +80103229: 83 c7 10 add $0x10,%edi +8010322c: 3b 7b 58 cmp 0x58(%ebx),%edi +8010322f: 72 c7 jb 801031f8 + return iget(dp->dev, inum); + } + } + + return 0; +} +80103231: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +80103234: 31 c0 xor %eax,%eax +} +80103236: 5b pop %ebx +80103237: 5e pop %esi +80103238: 5f pop %edi +80103239: 5d pop %ebp +8010323a: c3 ret +8010323b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010323f: 90 nop + if (poff) { +80103240: 8b 45 10 mov 0x10(%ebp),%eax +80103243: 85 c0 test %eax,%eax +80103245: 74 05 je 8010324c + *poff = off; +80103247: 8b 45 10 mov 0x10(%ebp),%eax +8010324a: 89 38 mov %edi,(%eax) + inum = de.inum; +8010324c: 0f b7 55 d8 movzwl -0x28(%ebp),%edx + return iget(dp->dev, inum); +80103250: 8b 03 mov (%ebx),%eax +80103252: e8 e9 f5 ff ff call 80102840 +} +80103257: 8d 65 f4 lea -0xc(%ebp),%esp +8010325a: 5b pop %ebx +8010325b: 5e pop %esi +8010325c: 5f pop %edi +8010325d: 5d pop %ebp +8010325e: c3 ret + panic("dirlookup read"); +8010325f: 83 ec 0c sub $0xc,%esp +80103262: 68 79 8b 10 80 push $0x80108b79 +80103267: e8 14 d2 ff ff call 80100480 + panic("dirlookup not DIR"); +8010326c: 83 ec 0c sub $0xc,%esp +8010326f: 68 67 8b 10 80 push $0x80108b67 +80103274: e8 07 d2 ff ff call 80100480 +80103279: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80103280 : + +// Look up and return the inode for a path name. +// If parent != 0, return the inode for the parent and copy the final +// path element into name, which must have room for DIRSIZ bytes. +// Must be called inside a transaction since it calls iput(). +static struct inode* namex(char *path, int nameiparent, char *name) { +80103280: 55 push %ebp +80103281: 89 e5 mov %esp,%ebp +80103283: 57 push %edi +80103284: 56 push %esi +80103285: 53 push %ebx +80103286: 89 c3 mov %eax,%ebx +80103288: 83 ec 1c sub $0x1c,%esp + struct inode *ip, *next; + + if (*path == '/') { +8010328b: 80 38 2f cmpb $0x2f,(%eax) +static struct inode* namex(char *path, int nameiparent, char *name) { +8010328e: 89 55 dc mov %edx,-0x24(%ebp) +80103291: 89 4d e4 mov %ecx,-0x1c(%ebp) + if (*path == '/') { +80103294: 0f 84 64 01 00 00 je 801033fe + ip = iget(ROOTDEV, ROOTINO); + } + else { + ip = idup(myproc()->cwd); +8010329a: e8 11 1c 00 00 call 80104eb0 + acquire(&icache.lock); +8010329f: 83 ec 0c sub $0xc,%esp + ip = idup(myproc()->cwd); +801032a2: 8b 70 68 mov 0x68(%eax),%esi + acquire(&icache.lock); +801032a5: 68 e0 c0 11 80 push $0x8011c0e0 +801032aa: e8 d1 28 00 00 call 80105b80 + ip->ref++; +801032af: 83 46 08 01 addl $0x1,0x8(%esi) + release(&icache.lock); +801032b3: c7 04 24 e0 c0 11 80 movl $0x8011c0e0,(%esp) +801032ba: e8 61 28 00 00 call 80105b20 +801032bf: 83 c4 10 add $0x10,%esp +801032c2: eb 07 jmp 801032cb +801032c4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + path++; +801032c8: 83 c3 01 add $0x1,%ebx + while (*path == '/') { +801032cb: 0f b6 03 movzbl (%ebx),%eax +801032ce: 3c 2f cmp $0x2f,%al +801032d0: 74 f6 je 801032c8 + if (*path == 0) { +801032d2: 84 c0 test %al,%al +801032d4: 0f 84 06 01 00 00 je 801033e0 + while (*path != '/' && *path != 0) { +801032da: 0f b6 03 movzbl (%ebx),%eax +801032dd: 84 c0 test %al,%al +801032df: 0f 84 10 01 00 00 je 801033f5 +801032e5: 89 df mov %ebx,%edi +801032e7: 3c 2f cmp $0x2f,%al +801032e9: 0f 84 06 01 00 00 je 801033f5 +801032ef: 90 nop +801032f0: 0f b6 47 01 movzbl 0x1(%edi),%eax + path++; +801032f4: 83 c7 01 add $0x1,%edi + while (*path != '/' && *path != 0) { +801032f7: 3c 2f cmp $0x2f,%al +801032f9: 74 04 je 801032ff +801032fb: 84 c0 test %al,%al +801032fd: 75 f1 jne 801032f0 + len = path - s; +801032ff: 89 f8 mov %edi,%eax +80103301: 29 d8 sub %ebx,%eax + if (len >= DIRSIZ) { +80103303: 83 f8 0d cmp $0xd,%eax +80103306: 0f 8e ac 00 00 00 jle 801033b8 + memmove(name, s, DIRSIZ); +8010330c: 83 ec 04 sub $0x4,%esp +8010330f: 6a 0e push $0xe +80103311: 53 push %ebx + path++; +80103312: 89 fb mov %edi,%ebx + memmove(name, s, DIRSIZ); +80103314: ff 75 e4 push -0x1c(%ebp) +80103317: e8 c4 29 00 00 call 80105ce0 +8010331c: 83 c4 10 add $0x10,%esp + while (*path == '/') { +8010331f: 80 3f 2f cmpb $0x2f,(%edi) +80103322: 75 0c jne 80103330 +80103324: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + path++; +80103328: 83 c3 01 add $0x1,%ebx + while (*path == '/') { +8010332b: 80 3b 2f cmpb $0x2f,(%ebx) +8010332e: 74 f8 je 80103328 + } + + while ((path = skipelem(path, name)) != 0) { + ilock(ip); +80103330: 83 ec 0c sub $0xc,%esp +80103333: 56 push %esi +80103334: e8 37 f9 ff ff call 80102c70 + if (ip->type != T_DIR) { +80103339: 83 c4 10 add $0x10,%esp +8010333c: 66 83 7e 50 01 cmpw $0x1,0x50(%esi) +80103341: 0f 85 cd 00 00 00 jne 80103414 + iunlockput(ip); + return 0; + } + if (nameiparent && *path == '\0') { +80103347: 8b 45 dc mov -0x24(%ebp),%eax +8010334a: 85 c0 test %eax,%eax +8010334c: 74 09 je 80103357 +8010334e: 80 3b 00 cmpb $0x0,(%ebx) +80103351: 0f 84 22 01 00 00 je 80103479 + // Stop one level early. + iunlock(ip); + return ip; + } + if ((next = dirlookup(ip, name, 0)) == 0) { +80103357: 83 ec 04 sub $0x4,%esp +8010335a: 6a 00 push $0x0 +8010335c: ff 75 e4 push -0x1c(%ebp) +8010335f: 56 push %esi +80103360: e8 6b fe ff ff call 801031d0 + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80103365: 8d 56 0c lea 0xc(%esi),%edx + if ((next = dirlookup(ip, name, 0)) == 0) { +80103368: 83 c4 10 add $0x10,%esp +8010336b: 89 c7 mov %eax,%edi +8010336d: 85 c0 test %eax,%eax +8010336f: 0f 84 e1 00 00 00 je 80103456 + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80103375: 83 ec 0c sub $0xc,%esp +80103378: 89 55 e0 mov %edx,-0x20(%ebp) +8010337b: 52 push %edx +8010337c: e8 df 25 00 00 call 80105960 +80103381: 83 c4 10 add $0x10,%esp +80103384: 85 c0 test %eax,%eax +80103386: 0f 84 30 01 00 00 je 801034bc +8010338c: 8b 56 08 mov 0x8(%esi),%edx +8010338f: 85 d2 test %edx,%edx +80103391: 0f 8e 25 01 00 00 jle 801034bc + releasesleep(&ip->lock); +80103397: 8b 55 e0 mov -0x20(%ebp),%edx +8010339a: 83 ec 0c sub $0xc,%esp +8010339d: 52 push %edx +8010339e: e8 7d 25 00 00 call 80105920 + iput(ip); +801033a3: 89 34 24 mov %esi,(%esp) +801033a6: 89 fe mov %edi,%esi +801033a8: e8 f3 f9 ff ff call 80102da0 +801033ad: 83 c4 10 add $0x10,%esp +801033b0: e9 16 ff ff ff jmp 801032cb +801033b5: 8d 76 00 lea 0x0(%esi),%esi + name[len] = 0; +801033b8: 8b 4d e4 mov -0x1c(%ebp),%ecx +801033bb: 8d 14 01 lea (%ecx,%eax,1),%edx + memmove(name, s, len); +801033be: 83 ec 04 sub $0x4,%esp +801033c1: 89 55 e0 mov %edx,-0x20(%ebp) +801033c4: 50 push %eax +801033c5: 53 push %ebx + name[len] = 0; +801033c6: 89 fb mov %edi,%ebx + memmove(name, s, len); +801033c8: ff 75 e4 push -0x1c(%ebp) +801033cb: e8 10 29 00 00 call 80105ce0 + name[len] = 0; +801033d0: 8b 55 e0 mov -0x20(%ebp),%edx +801033d3: 83 c4 10 add $0x10,%esp +801033d6: c6 02 00 movb $0x0,(%edx) +801033d9: e9 41 ff ff ff jmp 8010331f +801033de: 66 90 xchg %ax,%ax + return 0; + } + iunlockput(ip); + ip = next; + } + if (nameiparent) { +801033e0: 8b 45 dc mov -0x24(%ebp),%eax +801033e3: 85 c0 test %eax,%eax +801033e5: 0f 85 be 00 00 00 jne 801034a9 + iput(ip); + return 0; + } + return ip; +} +801033eb: 8d 65 f4 lea -0xc(%ebp),%esp +801033ee: 89 f0 mov %esi,%eax +801033f0: 5b pop %ebx +801033f1: 5e pop %esi +801033f2: 5f pop %edi +801033f3: 5d pop %ebp +801033f4: c3 ret + while (*path != '/' && *path != 0) { +801033f5: 8b 55 e4 mov -0x1c(%ebp),%edx +801033f8: 89 df mov %ebx,%edi +801033fa: 31 c0 xor %eax,%eax +801033fc: eb c0 jmp 801033be + ip = iget(ROOTDEV, ROOTINO); +801033fe: ba 01 00 00 00 mov $0x1,%edx +80103403: b8 01 00 00 00 mov $0x1,%eax +80103408: e8 33 f4 ff ff call 80102840 +8010340d: 89 c6 mov %eax,%esi +8010340f: e9 b7 fe ff ff jmp 801032cb + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80103414: 83 ec 0c sub $0xc,%esp +80103417: 8d 5e 0c lea 0xc(%esi),%ebx +8010341a: 53 push %ebx +8010341b: e8 40 25 00 00 call 80105960 +80103420: 83 c4 10 add $0x10,%esp +80103423: 85 c0 test %eax,%eax +80103425: 0f 84 91 00 00 00 je 801034bc +8010342b: 8b 46 08 mov 0x8(%esi),%eax +8010342e: 85 c0 test %eax,%eax +80103430: 0f 8e 86 00 00 00 jle 801034bc + releasesleep(&ip->lock); +80103436: 83 ec 0c sub $0xc,%esp +80103439: 53 push %ebx +8010343a: e8 e1 24 00 00 call 80105920 + iput(ip); +8010343f: 89 34 24 mov %esi,(%esp) + return 0; +80103442: 31 f6 xor %esi,%esi + iput(ip); +80103444: e8 57 f9 ff ff call 80102da0 + return 0; +80103449: 83 c4 10 add $0x10,%esp +} +8010344c: 8d 65 f4 lea -0xc(%ebp),%esp +8010344f: 89 f0 mov %esi,%eax +80103451: 5b pop %ebx +80103452: 5e pop %esi +80103453: 5f pop %edi +80103454: 5d pop %ebp +80103455: c3 ret + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80103456: 83 ec 0c sub $0xc,%esp +80103459: 89 55 e4 mov %edx,-0x1c(%ebp) +8010345c: 52 push %edx +8010345d: e8 fe 24 00 00 call 80105960 +80103462: 83 c4 10 add $0x10,%esp +80103465: 85 c0 test %eax,%eax +80103467: 74 53 je 801034bc +80103469: 8b 4e 08 mov 0x8(%esi),%ecx +8010346c: 85 c9 test %ecx,%ecx +8010346e: 7e 4c jle 801034bc + releasesleep(&ip->lock); +80103470: 8b 55 e4 mov -0x1c(%ebp),%edx +80103473: 83 ec 0c sub $0xc,%esp +80103476: 52 push %edx +80103477: eb c1 jmp 8010343a + if (ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) { +80103479: 83 ec 0c sub $0xc,%esp +8010347c: 8d 5e 0c lea 0xc(%esi),%ebx +8010347f: 53 push %ebx +80103480: e8 db 24 00 00 call 80105960 +80103485: 83 c4 10 add $0x10,%esp +80103488: 85 c0 test %eax,%eax +8010348a: 74 30 je 801034bc +8010348c: 8b 7e 08 mov 0x8(%esi),%edi +8010348f: 85 ff test %edi,%edi +80103491: 7e 29 jle 801034bc + releasesleep(&ip->lock); +80103493: 83 ec 0c sub $0xc,%esp +80103496: 53 push %ebx +80103497: e8 84 24 00 00 call 80105920 +} +8010349c: 83 c4 10 add $0x10,%esp +} +8010349f: 8d 65 f4 lea -0xc(%ebp),%esp +801034a2: 89 f0 mov %esi,%eax +801034a4: 5b pop %ebx +801034a5: 5e pop %esi +801034a6: 5f pop %edi +801034a7: 5d pop %ebp +801034a8: c3 ret + iput(ip); +801034a9: 83 ec 0c sub $0xc,%esp +801034ac: 56 push %esi + return 0; +801034ad: 31 f6 xor %esi,%esi + iput(ip); +801034af: e8 ec f8 ff ff call 80102da0 + return 0; +801034b4: 83 c4 10 add $0x10,%esp +801034b7: e9 2f ff ff ff jmp 801033eb + panic("iunlock"); +801034bc: 83 ec 0c sub $0xc,%esp +801034bf: 68 5f 8b 10 80 push $0x80108b5f +801034c4: e8 b7 cf ff ff call 80100480 +801034c9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +801034d0 : +int dirlink(struct inode *dp, char *name, uint inum) { +801034d0: 55 push %ebp +801034d1: 89 e5 mov %esp,%ebp +801034d3: 57 push %edi +801034d4: 56 push %esi +801034d5: 53 push %ebx +801034d6: 83 ec 20 sub $0x20,%esp +801034d9: 8b 5d 08 mov 0x8(%ebp),%ebx + if ((ip = dirlookup(dp, name, 0)) != 0) { +801034dc: 6a 00 push $0x0 +801034de: ff 75 0c push 0xc(%ebp) +801034e1: 53 push %ebx +801034e2: e8 e9 fc ff ff call 801031d0 +801034e7: 83 c4 10 add $0x10,%esp +801034ea: 85 c0 test %eax,%eax +801034ec: 75 67 jne 80103555 + for (off = 0; off < dp->size; off += sizeof(de)) { +801034ee: 8b 7b 58 mov 0x58(%ebx),%edi +801034f1: 8d 75 d8 lea -0x28(%ebp),%esi +801034f4: 85 ff test %edi,%edi +801034f6: 74 29 je 80103521 +801034f8: 31 ff xor %edi,%edi +801034fa: 8d 75 d8 lea -0x28(%ebp),%esi +801034fd: eb 09 jmp 80103508 +801034ff: 90 nop +80103500: 83 c7 10 add $0x10,%edi +80103503: 3b 7b 58 cmp 0x58(%ebx),%edi +80103506: 73 19 jae 80103521 + if (readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +80103508: 6a 10 push $0x10 +8010350a: 57 push %edi +8010350b: 56 push %esi +8010350c: 53 push %ebx +8010350d: e8 6e fa ff ff call 80102f80 +80103512: 83 c4 10 add $0x10,%esp +80103515: 83 f8 10 cmp $0x10,%eax +80103518: 75 4e jne 80103568 + if (de.inum == 0) { +8010351a: 66 83 7d d8 00 cmpw $0x0,-0x28(%ebp) +8010351f: 75 df jne 80103500 + strncpy(de.name, name, DIRSIZ); +80103521: 83 ec 04 sub $0x4,%esp +80103524: 8d 45 da lea -0x26(%ebp),%eax +80103527: 6a 0e push $0xe +80103529: ff 75 0c push 0xc(%ebp) +8010352c: 50 push %eax +8010352d: e8 6e 28 00 00 call 80105da0 + if (writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +80103532: 6a 10 push $0x10 + de.inum = inum; +80103534: 8b 45 10 mov 0x10(%ebp),%eax + if (writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +80103537: 57 push %edi +80103538: 56 push %esi +80103539: 53 push %ebx + de.inum = inum; +8010353a: 66 89 45 d8 mov %ax,-0x28(%ebp) + if (writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +8010353e: e8 3d fb ff ff call 80103080 +80103543: 83 c4 20 add $0x20,%esp +80103546: 83 f8 10 cmp $0x10,%eax +80103549: 75 2a jne 80103575 + return 0; +8010354b: 31 c0 xor %eax,%eax +} +8010354d: 8d 65 f4 lea -0xc(%ebp),%esp +80103550: 5b pop %ebx +80103551: 5e pop %esi +80103552: 5f pop %edi +80103553: 5d pop %ebp +80103554: c3 ret + iput(ip); +80103555: 83 ec 0c sub $0xc,%esp +80103558: 50 push %eax +80103559: e8 42 f8 ff ff call 80102da0 + return -1; +8010355e: 83 c4 10 add $0x10,%esp +80103561: b8 ff ff ff ff mov $0xffffffff,%eax +80103566: eb e5 jmp 8010354d + panic("dirlink read"); +80103568: 83 ec 0c sub $0xc,%esp +8010356b: 68 88 8b 10 80 push $0x80108b88 +80103570: e8 0b cf ff ff call 80100480 + panic("dirlink"); +80103575: 83 ec 0c sub $0xc,%esp +80103578: 68 f2 91 10 80 push $0x801091f2 +8010357d: e8 fe ce ff ff call 80100480 +80103582: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103589: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80103590 : + +struct inode* namei(char *path) { +80103590: 55 push %ebp + char name[DIRSIZ]; + return namex(path, 0, name); +80103591: 31 d2 xor %edx,%edx +struct inode* namei(char *path) { +80103593: 89 e5 mov %esp,%ebp +80103595: 83 ec 18 sub $0x18,%esp + return namex(path, 0, name); +80103598: 8b 45 08 mov 0x8(%ebp),%eax +8010359b: 8d 4d ea lea -0x16(%ebp),%ecx +8010359e: e8 dd fc ff ff call 80103280 +} +801035a3: c9 leave +801035a4: c3 ret +801035a5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801035ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +801035b0 : + +struct inode*nameiparent(char *path, char *name) { +801035b0: 55 push %ebp + return namex(path, 1, name); +801035b1: ba 01 00 00 00 mov $0x1,%edx +struct inode*nameiparent(char *path, char *name) { +801035b6: 89 e5 mov %esp,%ebp + return namex(path, 1, name); +801035b8: 8b 4d 0c mov 0xc(%ebp),%ecx +801035bb: 8b 45 08 mov 0x8(%ebp),%eax +} +801035be: 5d pop %ebp + return namex(path, 1, name); +801035bf: e9 bc fc ff ff jmp 80103280 +801035c4: 66 90 xchg %ax,%ax +801035c6: 66 90 xchg %ax,%ax +801035c8: 66 90 xchg %ax,%ax +801035ca: 66 90 xchg %ax,%ax +801035cc: 66 90 xchg %ax,%ax +801035ce: 66 90 xchg %ax,%ax + +801035d0 : + // Switch back to disk 0. + outb(0x1f6, 0xe0 | (0 << 4)); +} + +// Start the request for b. Caller must hold idelock. +static void idestart(struct buf *b) { +801035d0: 55 push %ebp +801035d1: 89 e5 mov %esp,%ebp +801035d3: 57 push %edi +801035d4: 56 push %esi +801035d5: 53 push %ebx +801035d6: 83 ec 0c sub $0xc,%esp + if (b == 0) { +801035d9: 85 c0 test %eax,%eax +801035db: 0f 84 b4 00 00 00 je 80103695 + panic("idestart"); + } + if (b->blockno >= FSSIZE) { +801035e1: 8b 70 08 mov 0x8(%eax),%esi +801035e4: 89 c3 mov %eax,%ebx +801035e6: 81 fe e7 03 00 00 cmp $0x3e7,%esi +801035ec: 0f 87 96 00 00 00 ja 80103688 + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +801035f2: b9 f7 01 00 00 mov $0x1f7,%ecx +801035f7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801035fe: 66 90 xchg %ax,%ax +80103600: 89 ca mov %ecx,%edx +80103602: ec in (%dx),%al + while (((r = inb(0x1f7)) & (IDE_BSY | IDE_DRDY)) != IDE_DRDY) { +80103603: 83 e0 c0 and $0xffffffc0,%eax +80103606: 3c 40 cmp $0x40,%al +80103608: 75 f6 jne 80103600 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +8010360a: 31 ff xor %edi,%edi +8010360c: ba f6 03 00 00 mov $0x3f6,%edx +80103611: 89 f8 mov %edi,%eax +80103613: ee out %al,(%dx) +80103614: b8 01 00 00 00 mov $0x1,%eax +80103619: ba f2 01 00 00 mov $0x1f2,%edx +8010361e: ee out %al,(%dx) +8010361f: ba f3 01 00 00 mov $0x1f3,%edx +80103624: 89 f0 mov %esi,%eax +80103626: ee out %al,(%dx) + + idewait(0); + outb(0x3f6, 0); // generate interrupt + outb(0x1f2, sector_per_block); // number of sectors + outb(0x1f3, sector & 0xff); + outb(0x1f4, (sector >> 8) & 0xff); +80103627: 89 f0 mov %esi,%eax +80103629: ba f4 01 00 00 mov $0x1f4,%edx +8010362e: c1 f8 08 sar $0x8,%eax +80103631: ee out %al,(%dx) +80103632: ba f5 01 00 00 mov $0x1f5,%edx +80103637: 89 f8 mov %edi,%eax +80103639: ee out %al,(%dx) + outb(0x1f5, (sector >> 16) & 0xff); + outb(0x1f6, 0xe0 | ((b->dev & 1) << 4) | ((sector >> 24) & 0x0f)); +8010363a: 0f b6 43 04 movzbl 0x4(%ebx),%eax +8010363e: ba f6 01 00 00 mov $0x1f6,%edx +80103643: c1 e0 04 shl $0x4,%eax +80103646: 83 e0 10 and $0x10,%eax +80103649: 83 c8 e0 or $0xffffffe0,%eax +8010364c: ee out %al,(%dx) + if (b->flags & B_DIRTY) { +8010364d: f6 03 04 testb $0x4,(%ebx) +80103650: 75 16 jne 80103668 +80103652: b8 20 00 00 00 mov $0x20,%eax +80103657: 89 ca mov %ecx,%edx +80103659: ee out %al,(%dx) + outsl(0x1f0, b->data, BSIZE / 4); + } + else { + outb(0x1f7, read_cmd); + } +} +8010365a: 8d 65 f4 lea -0xc(%ebp),%esp +8010365d: 5b pop %ebx +8010365e: 5e pop %esi +8010365f: 5f pop %edi +80103660: 5d pop %ebp +80103661: c3 ret +80103662: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +80103668: b8 30 00 00 00 mov $0x30,%eax +8010366d: 89 ca mov %ecx,%edx +8010366f: ee out %al,(%dx) + asm volatile ("cld; rep outsl" : +80103670: b9 80 00 00 00 mov $0x80,%ecx + outsl(0x1f0, b->data, BSIZE / 4); +80103675: 8d 73 5c lea 0x5c(%ebx),%esi +80103678: ba f0 01 00 00 mov $0x1f0,%edx +8010367d: fc cld +8010367e: f3 6f rep outsl %ds:(%esi),(%dx) +} +80103680: 8d 65 f4 lea -0xc(%ebp),%esp +80103683: 5b pop %ebx +80103684: 5e pop %esi +80103685: 5f pop %edi +80103686: 5d pop %ebp +80103687: c3 ret + panic("incorrect blockno"); +80103688: 83 ec 0c sub $0xc,%esp +8010368b: 68 f4 8b 10 80 push $0x80108bf4 +80103690: e8 eb cd ff ff call 80100480 + panic("idestart"); +80103695: 83 ec 0c sub $0xc,%esp +80103698: 68 eb 8b 10 80 push $0x80108beb +8010369d: e8 de cd ff ff call 80100480 +801036a2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801036a9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +801036b0 : +void ideinit(void) { +801036b0: 55 push %ebp +801036b1: 89 e5 mov %esp,%ebp +801036b3: 83 ec 10 sub $0x10,%esp + initlock(&idelock, "ide"); +801036b6: 68 06 8c 10 80 push $0x80108c06 +801036bb: 68 80 dd 11 80 push $0x8011dd80 +801036c0: e8 eb 22 00 00 call 801059b0 + ioapicenable(IRQ_IDE, ncpu - 1); +801036c5: 58 pop %eax +801036c6: a1 04 df 11 80 mov 0x8011df04,%eax +801036cb: 5a pop %edx +801036cc: 83 e8 01 sub $0x1,%eax +801036cf: 50 push %eax +801036d0: 6a 0e push $0xe +801036d2: e8 99 02 00 00 call 80103970 + while (((r = inb(0x1f7)) & (IDE_BSY | IDE_DRDY)) != IDE_DRDY) { +801036d7: 83 c4 10 add $0x10,%esp + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +801036da: ba f7 01 00 00 mov $0x1f7,%edx +801036df: 90 nop +801036e0: ec in (%dx),%al +801036e1: 83 e0 c0 and $0xffffffc0,%eax +801036e4: 3c 40 cmp $0x40,%al +801036e6: 75 f8 jne 801036e0 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +801036e8: b8 f0 ff ff ff mov $0xfffffff0,%eax +801036ed: ba f6 01 00 00 mov $0x1f6,%edx +801036f2: ee out %al,(%dx) +801036f3: b9 e8 03 00 00 mov $0x3e8,%ecx + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +801036f8: ba f7 01 00 00 mov $0x1f7,%edx +801036fd: eb 06 jmp 80103705 +801036ff: 90 nop + for (i = 0; i < 1000; i++) { +80103700: 83 e9 01 sub $0x1,%ecx +80103703: 74 0f je 80103714 +80103705: ec in (%dx),%al + if (inb(0x1f7) != 0) { +80103706: 84 c0 test %al,%al +80103708: 74 f6 je 80103700 + havedisk1 = 1; +8010370a: c7 05 60 dd 11 80 01 movl $0x1,0x8011dd60 +80103711: 00 00 00 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103714: b8 e0 ff ff ff mov $0xffffffe0,%eax +80103719: ba f6 01 00 00 mov $0x1f6,%edx +8010371e: ee out %al,(%dx) +} +8010371f: c9 leave +80103720: c3 ret +80103721: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103728: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010372f: 90 nop + +80103730 : + +// Interrupt handler. +void ideintr(void) { +80103730: 55 push %ebp +80103731: 89 e5 mov %esp,%ebp +80103733: 57 push %edi +80103734: 56 push %esi +80103735: 53 push %ebx +80103736: 83 ec 18 sub $0x18,%esp + struct buf *b; + + // First queued buffer is the active request. + acquire(&idelock); +80103739: 68 80 dd 11 80 push $0x8011dd80 +8010373e: e8 3d 24 00 00 call 80105b80 + + if ((b = idequeue) == 0) { +80103743: 8b 1d 64 dd 11 80 mov 0x8011dd64,%ebx +80103749: 83 c4 10 add $0x10,%esp +8010374c: 85 db test %ebx,%ebx +8010374e: 74 63 je 801037b3 + release(&idelock); + return; + } + idequeue = b->qnext; +80103750: 8b 43 58 mov 0x58(%ebx),%eax +80103753: a3 64 dd 11 80 mov %eax,0x8011dd64 + + // Read data if needed. + if (!(b->flags & B_DIRTY) && idewait(1) >= 0) { +80103758: 8b 33 mov (%ebx),%esi +8010375a: f7 c6 04 00 00 00 test $0x4,%esi +80103760: 75 2f jne 80103791 + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103762: ba f7 01 00 00 mov $0x1f7,%edx +80103767: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010376e: 66 90 xchg %ax,%ax +80103770: ec in (%dx),%al + while (((r = inb(0x1f7)) & (IDE_BSY | IDE_DRDY)) != IDE_DRDY) { +80103771: 89 c1 mov %eax,%ecx +80103773: 83 e1 c0 and $0xffffffc0,%ecx +80103776: 80 f9 40 cmp $0x40,%cl +80103779: 75 f5 jne 80103770 + if (checkerr && (r & (IDE_DF | IDE_ERR)) != 0) { +8010377b: a8 21 test $0x21,%al +8010377d: 75 12 jne 80103791 + insl(0x1f0, b->data, BSIZE / 4); +8010377f: 8d 7b 5c lea 0x5c(%ebx),%edi + asm volatile ("cld; rep insl" : +80103782: b9 80 00 00 00 mov $0x80,%ecx +80103787: ba f0 01 00 00 mov $0x1f0,%edx +8010378c: fc cld +8010378d: f3 6d rep insl (%dx),%es:(%edi) + } + + // Wake process waiting for this buf. + b->flags |= B_VALID; +8010378f: 8b 33 mov (%ebx),%esi + b->flags &= ~B_DIRTY; +80103791: 83 e6 fb and $0xfffffffb,%esi + wakeup(b); +80103794: 83 ec 0c sub $0xc,%esp + b->flags &= ~B_DIRTY; +80103797: 83 ce 02 or $0x2,%esi +8010379a: 89 33 mov %esi,(%ebx) + wakeup(b); +8010379c: 53 push %ebx +8010379d: e8 fe 1e 00 00 call 801056a0 + + // Start disk on next buf in queue. + if (idequeue != 0) { +801037a2: a1 64 dd 11 80 mov 0x8011dd64,%eax +801037a7: 83 c4 10 add $0x10,%esp +801037aa: 85 c0 test %eax,%eax +801037ac: 74 05 je 801037b3 + idestart(idequeue); +801037ae: e8 1d fe ff ff call 801035d0 + release(&idelock); +801037b3: 83 ec 0c sub $0xc,%esp +801037b6: 68 80 dd 11 80 push $0x8011dd80 +801037bb: e8 60 23 00 00 call 80105b20 + } + + release(&idelock); +} +801037c0: 8d 65 f4 lea -0xc(%ebp),%esp +801037c3: 5b pop %ebx +801037c4: 5e pop %esi +801037c5: 5f pop %edi +801037c6: 5d pop %ebp +801037c7: c3 ret +801037c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801037cf: 90 nop + +801037d0 : + + +// Sync buf with disk. +// If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID. +// Else if B_VALID is not set, read buf from disk, set B_VALID. +void iderw(struct buf *b) { +801037d0: 55 push %ebp +801037d1: 89 e5 mov %esp,%ebp +801037d3: 53 push %ebx +801037d4: 83 ec 10 sub $0x10,%esp +801037d7: 8b 5d 08 mov 0x8(%ebp),%ebx + struct buf **pp; + + if (!holdingsleep(&b->lock)) { +801037da: 8d 43 0c lea 0xc(%ebx),%eax +801037dd: 50 push %eax +801037de: e8 7d 21 00 00 call 80105960 +801037e3: 83 c4 10 add $0x10,%esp +801037e6: 85 c0 test %eax,%eax +801037e8: 0f 84 c3 00 00 00 je 801038b1 + panic("iderw: buf not locked"); + } + if ((b->flags & (B_VALID | B_DIRTY)) == B_VALID) { +801037ee: 8b 03 mov (%ebx),%eax +801037f0: 83 e0 06 and $0x6,%eax +801037f3: 83 f8 02 cmp $0x2,%eax +801037f6: 0f 84 a8 00 00 00 je 801038a4 + panic("iderw: nothing to do"); + } + if (b->dev != 0 && !havedisk1) { +801037fc: 8b 53 04 mov 0x4(%ebx),%edx +801037ff: 85 d2 test %edx,%edx +80103801: 74 0d je 80103810 +80103803: a1 60 dd 11 80 mov 0x8011dd60,%eax +80103808: 85 c0 test %eax,%eax +8010380a: 0f 84 87 00 00 00 je 80103897 + panic("iderw: ide disk 1 not present"); + } + + acquire(&idelock); //DOC:acquire-lock +80103810: 83 ec 0c sub $0xc,%esp +80103813: 68 80 dd 11 80 push $0x8011dd80 +80103818: e8 63 23 00 00 call 80105b80 + + // Append b to idequeue. + b->qnext = 0; + for (pp = &idequeue; *pp; pp = &(*pp)->qnext) { //DOC:insert-queue +8010381d: a1 64 dd 11 80 mov 0x8011dd64,%eax + b->qnext = 0; +80103822: c7 43 58 00 00 00 00 movl $0x0,0x58(%ebx) + for (pp = &idequeue; *pp; pp = &(*pp)->qnext) { //DOC:insert-queue +80103829: 83 c4 10 add $0x10,%esp +8010382c: 85 c0 test %eax,%eax +8010382e: 74 60 je 80103890 +80103830: 89 c2 mov %eax,%edx +80103832: 8b 40 58 mov 0x58(%eax),%eax +80103835: 85 c0 test %eax,%eax +80103837: 75 f7 jne 80103830 +80103839: 83 c2 58 add $0x58,%edx + ; + } + *pp = b; +8010383c: 89 1a mov %ebx,(%edx) + + // Start disk if necessary. + if (idequeue == b) { +8010383e: 39 1d 64 dd 11 80 cmp %ebx,0x8011dd64 +80103844: 74 3a je 80103880 + idestart(b); + } + + // Wait for request to finish. + while ((b->flags & (B_VALID | B_DIRTY)) != B_VALID) { +80103846: 8b 03 mov (%ebx),%eax +80103848: 83 e0 06 and $0x6,%eax +8010384b: 83 f8 02 cmp $0x2,%eax +8010384e: 74 1b je 8010386b + sleep(b, &idelock); +80103850: 83 ec 08 sub $0x8,%esp +80103853: 68 80 dd 11 80 push $0x8011dd80 +80103858: 53 push %ebx +80103859: e8 82 1d 00 00 call 801055e0 + while ((b->flags & (B_VALID | B_DIRTY)) != B_VALID) { +8010385e: 8b 03 mov (%ebx),%eax +80103860: 83 c4 10 add $0x10,%esp +80103863: 83 e0 06 and $0x6,%eax +80103866: 83 f8 02 cmp $0x2,%eax +80103869: 75 e5 jne 80103850 + } + + release(&idelock); +8010386b: c7 45 08 80 dd 11 80 movl $0x8011dd80,0x8(%ebp) +} +80103872: 8b 5d fc mov -0x4(%ebp),%ebx +80103875: c9 leave + release(&idelock); +80103876: e9 a5 22 00 00 jmp 80105b20 +8010387b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010387f: 90 nop + idestart(b); +80103880: 89 d8 mov %ebx,%eax +80103882: e8 49 fd ff ff call 801035d0 +80103887: eb bd jmp 80103846 +80103889: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + for (pp = &idequeue; *pp; pp = &(*pp)->qnext) { //DOC:insert-queue +80103890: ba 64 dd 11 80 mov $0x8011dd64,%edx +80103895: eb a5 jmp 8010383c + panic("iderw: ide disk 1 not present"); +80103897: 83 ec 0c sub $0xc,%esp +8010389a: 68 35 8c 10 80 push $0x80108c35 +8010389f: e8 dc cb ff ff call 80100480 + panic("iderw: nothing to do"); +801038a4: 83 ec 0c sub $0xc,%esp +801038a7: 68 20 8c 10 80 push $0x80108c20 +801038ac: e8 cf cb ff ff call 80100480 + panic("iderw: buf not locked"); +801038b1: 83 ec 0c sub $0xc,%esp +801038b4: 68 0a 8c 10 80 push $0x80108c0a +801038b9: e8 c2 cb ff ff call 80100480 +801038be: 66 90 xchg %ax,%ax + +801038c0 : +static void ioapicwrite(int reg, uint data) { + ioapic->reg = reg; + ioapic->data = data; +} + +void ioapicinit(void) { +801038c0: 55 push %ebp + int i, id, maxintr; + + ioapic = (volatile struct ioapic*)IOAPIC; +801038c1: c7 05 b4 dd 11 80 00 movl $0xfec00000,0x8011ddb4 +801038c8: 00 c0 fe +void ioapicinit(void) { +801038cb: 89 e5 mov %esp,%ebp +801038cd: 56 push %esi +801038ce: 53 push %ebx + ioapic->reg = reg; +801038cf: c7 05 00 00 c0 fe 01 movl $0x1,0xfec00000 +801038d6: 00 00 00 + return ioapic->data; +801038d9: 8b 15 b4 dd 11 80 mov 0x8011ddb4,%edx +801038df: 8b 72 10 mov 0x10(%edx),%esi + ioapic->reg = reg; +801038e2: c7 02 00 00 00 00 movl $0x0,(%edx) + return ioapic->data; +801038e8: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx + maxintr = (ioapicread(REG_VER) >> 16) & 0xFF; + id = ioapicread(REG_ID) >> 24; + if (id != ioapicid) { +801038ee: 0f b6 15 00 df 11 80 movzbl 0x8011df00,%edx + maxintr = (ioapicread(REG_VER) >> 16) & 0xFF; +801038f5: c1 ee 10 shr $0x10,%esi +801038f8: 89 f0 mov %esi,%eax +801038fa: 0f b6 f0 movzbl %al,%esi + return ioapic->data; +801038fd: 8b 41 10 mov 0x10(%ecx),%eax + id = ioapicread(REG_ID) >> 24; +80103900: c1 e8 18 shr $0x18,%eax + if (id != ioapicid) { +80103903: 39 c2 cmp %eax,%edx +80103905: 74 16 je 8010391d + cprintf("ioapicinit: id isn't equal to ioapicid; not a MP\n"); +80103907: 83 ec 0c sub $0xc,%esp +8010390a: 68 54 8c 10 80 push $0x80108c54 +8010390f: e8 7c cf ff ff call 80100890 + ioapic->reg = reg; +80103914: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx +8010391a: 83 c4 10 add $0x10,%esp +8010391d: 83 c6 21 add $0x21,%esi +void ioapicinit(void) { +80103920: ba 10 00 00 00 mov $0x10,%edx +80103925: b8 20 00 00 00 mov $0x20,%eax +8010392a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + ioapic->reg = reg; +80103930: 89 11 mov %edx,(%ecx) + } + + // Mark all interrupts edge-triggered, active high, disabled, + // and not routed to any CPUs. + for (i = 0; i <= maxintr; i++) { + ioapicwrite(REG_TABLE + 2 * i, INT_DISABLED | (T_IRQ0 + i)); +80103932: 89 c3 mov %eax,%ebx + ioapic->data = data; +80103934: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx + for (i = 0; i <= maxintr; i++) { +8010393a: 83 c0 01 add $0x1,%eax + ioapicwrite(REG_TABLE + 2 * i, INT_DISABLED | (T_IRQ0 + i)); +8010393d: 81 cb 00 00 01 00 or $0x10000,%ebx + ioapic->data = data; +80103943: 89 59 10 mov %ebx,0x10(%ecx) + ioapic->reg = reg; +80103946: 8d 5a 01 lea 0x1(%edx),%ebx + for (i = 0; i <= maxintr; i++) { +80103949: 83 c2 02 add $0x2,%edx + ioapic->reg = reg; +8010394c: 89 19 mov %ebx,(%ecx) + ioapic->data = data; +8010394e: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx +80103954: c7 41 10 00 00 00 00 movl $0x0,0x10(%ecx) + for (i = 0; i <= maxintr; i++) { +8010395b: 39 f0 cmp %esi,%eax +8010395d: 75 d1 jne 80103930 + ioapicwrite(REG_TABLE + 2 * i + 1, 0); + } +} +8010395f: 8d 65 f8 lea -0x8(%ebp),%esp +80103962: 5b pop %ebx +80103963: 5e pop %esi +80103964: 5d pop %ebp +80103965: c3 ret +80103966: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010396d: 8d 76 00 lea 0x0(%esi),%esi + +80103970 : + +void ioapicenable(int irq, int cpunum) { +80103970: 55 push %ebp + ioapic->reg = reg; +80103971: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx +void ioapicenable(int irq, int cpunum) { +80103977: 89 e5 mov %esp,%ebp +80103979: 8b 45 08 mov 0x8(%ebp),%eax + // Mark interrupt edge-triggered, active high, + // enabled, and routed to the given cpunum, + // which happens to be that cpu's APIC ID. + ioapicwrite(REG_TABLE + 2 * irq, T_IRQ0 + irq); +8010397c: 8d 50 20 lea 0x20(%eax),%edx +8010397f: 8d 44 00 10 lea 0x10(%eax,%eax,1),%eax + ioapic->reg = reg; +80103983: 89 01 mov %eax,(%ecx) + ioapic->data = data; +80103985: 8b 0d b4 dd 11 80 mov 0x8011ddb4,%ecx + ioapicwrite(REG_TABLE + 2 * irq + 1, cpunum << 24); +8010398b: 83 c0 01 add $0x1,%eax + ioapic->data = data; +8010398e: 89 51 10 mov %edx,0x10(%ecx) + ioapicwrite(REG_TABLE + 2 * irq + 1, cpunum << 24); +80103991: 8b 55 0c mov 0xc(%ebp),%edx + ioapic->reg = reg; +80103994: 89 01 mov %eax,(%ecx) + ioapic->data = data; +80103996: a1 b4 dd 11 80 mov 0x8011ddb4,%eax + ioapicwrite(REG_TABLE + 2 * irq + 1, cpunum << 24); +8010399b: c1 e2 18 shl $0x18,%edx + ioapic->data = data; +8010399e: 89 50 10 mov %edx,0x10(%eax) +} +801039a1: 5d pop %ebp +801039a2: c3 ret +801039a3: 66 90 xchg %ax,%ax +801039a5: 66 90 xchg %ax,%ax +801039a7: 66 90 xchg %ax,%ax +801039a9: 66 90 xchg %ax,%ax +801039ab: 66 90 xchg %ax,%ax +801039ad: 66 90 xchg %ax,%ax +801039af: 90 nop + +801039b0 : + +// Free the page of physical memory pointed at by v, +// which normally should have been returned by a +// call to kalloc(). (The exception is when +// initializing the allocator; see kinit above.) +void kfree(char *v) { +801039b0: 55 push %ebp +801039b1: 89 e5 mov %esp,%ebp +801039b3: 53 push %ebx +801039b4: 83 ec 04 sub $0x4,%esp +801039b7: 8b 5d 08 mov 0x8(%ebp),%ebx + struct run *r; + + if ((uint)v % PGSIZE || v < end || V2P(v) >= PHYSTOP) { +801039ba: f7 c3 ff 0f 00 00 test $0xfff,%ebx +801039c0: 75 76 jne 80103a38 +801039c2: 81 fb 50 22 12 80 cmp $0x80122250,%ebx +801039c8: 72 6e jb 80103a38 +801039ca: 8d 83 00 00 00 80 lea -0x80000000(%ebx),%eax +801039d0: 3d ff ff ff 0d cmp $0xdffffff,%eax +801039d5: 77 61 ja 80103a38 + panic("kfree"); + } + + // Fill with junk to catch dangling refs. + memset(v, 1, PGSIZE); +801039d7: 83 ec 04 sub $0x4,%esp +801039da: 68 00 10 00 00 push $0x1000 +801039df: 6a 01 push $0x1 +801039e1: 53 push %ebx +801039e2: e8 59 22 00 00 call 80105c40 + + if (kmem.use_lock) { +801039e7: 8b 15 f4 dd 11 80 mov 0x8011ddf4,%edx +801039ed: 83 c4 10 add $0x10,%esp +801039f0: 85 d2 test %edx,%edx +801039f2: 75 1c jne 80103a10 + acquire(&kmem.lock); + } + r = (struct run*)v; + r->next = kmem.freelist; +801039f4: a1 f8 dd 11 80 mov 0x8011ddf8,%eax +801039f9: 89 03 mov %eax,(%ebx) + kmem.freelist = r; + if (kmem.use_lock) { +801039fb: a1 f4 dd 11 80 mov 0x8011ddf4,%eax + kmem.freelist = r; +80103a00: 89 1d f8 dd 11 80 mov %ebx,0x8011ddf8 + if (kmem.use_lock) { +80103a06: 85 c0 test %eax,%eax +80103a08: 75 1e jne 80103a28 + release(&kmem.lock); + } +} +80103a0a: 8b 5d fc mov -0x4(%ebp),%ebx +80103a0d: c9 leave +80103a0e: c3 ret +80103a0f: 90 nop + acquire(&kmem.lock); +80103a10: 83 ec 0c sub $0xc,%esp +80103a13: 68 c0 dd 11 80 push $0x8011ddc0 +80103a18: e8 63 21 00 00 call 80105b80 +80103a1d: 83 c4 10 add $0x10,%esp +80103a20: eb d2 jmp 801039f4 +80103a22: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + release(&kmem.lock); +80103a28: c7 45 08 c0 dd 11 80 movl $0x8011ddc0,0x8(%ebp) +} +80103a2f: 8b 5d fc mov -0x4(%ebp),%ebx +80103a32: c9 leave + release(&kmem.lock); +80103a33: e9 e8 20 00 00 jmp 80105b20 + panic("kfree"); +80103a38: 83 ec 0c sub $0xc,%esp +80103a3b: 68 86 8c 10 80 push $0x80108c86 +80103a40: e8 3b ca ff ff call 80100480 +80103a45: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103a4c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80103a50 : +void freerange(void *vstart, void *vend) { +80103a50: 55 push %ebp +80103a51: 89 e5 mov %esp,%ebp +80103a53: 56 push %esi + p = (char*)PGROUNDUP((uint)vstart); +80103a54: 8b 45 08 mov 0x8(%ebp),%eax +void freerange(void *vstart, void *vend) { +80103a57: 8b 75 0c mov 0xc(%ebp),%esi +80103a5a: 53 push %ebx + p = (char*)PGROUNDUP((uint)vstart); +80103a5b: 8d 98 ff 0f 00 00 lea 0xfff(%eax),%ebx +80103a61: 81 e3 00 f0 ff ff and $0xfffff000,%ebx + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103a67: 81 c3 00 10 00 00 add $0x1000,%ebx +80103a6d: 39 de cmp %ebx,%esi +80103a6f: 72 23 jb 80103a94 +80103a71: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + kfree(p); +80103a78: 83 ec 0c sub $0xc,%esp +80103a7b: 8d 83 00 f0 ff ff lea -0x1000(%ebx),%eax + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103a81: 81 c3 00 10 00 00 add $0x1000,%ebx + kfree(p); +80103a87: 50 push %eax +80103a88: e8 23 ff ff ff call 801039b0 + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103a8d: 83 c4 10 add $0x10,%esp +80103a90: 39 f3 cmp %esi,%ebx +80103a92: 76 e4 jbe 80103a78 +} +80103a94: 8d 65 f8 lea -0x8(%ebp),%esp +80103a97: 5b pop %ebx +80103a98: 5e pop %esi +80103a99: 5d pop %ebp +80103a9a: c3 ret +80103a9b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80103a9f: 90 nop + +80103aa0 : +void kinit2(void *vstart, void *vend) { +80103aa0: 55 push %ebp +80103aa1: 89 e5 mov %esp,%ebp +80103aa3: 56 push %esi + p = (char*)PGROUNDUP((uint)vstart); +80103aa4: 8b 45 08 mov 0x8(%ebp),%eax +void kinit2(void *vstart, void *vend) { +80103aa7: 8b 75 0c mov 0xc(%ebp),%esi +80103aaa: 53 push %ebx + p = (char*)PGROUNDUP((uint)vstart); +80103aab: 8d 98 ff 0f 00 00 lea 0xfff(%eax),%ebx +80103ab1: 81 e3 00 f0 ff ff and $0xfffff000,%ebx + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103ab7: 81 c3 00 10 00 00 add $0x1000,%ebx +80103abd: 39 de cmp %ebx,%esi +80103abf: 72 23 jb 80103ae4 +80103ac1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + kfree(p); +80103ac8: 83 ec 0c sub $0xc,%esp +80103acb: 8d 83 00 f0 ff ff lea -0x1000(%ebx),%eax + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103ad1: 81 c3 00 10 00 00 add $0x1000,%ebx + kfree(p); +80103ad7: 50 push %eax +80103ad8: e8 d3 fe ff ff call 801039b0 + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103add: 83 c4 10 add $0x10,%esp +80103ae0: 39 de cmp %ebx,%esi +80103ae2: 73 e4 jae 80103ac8 + kmem.use_lock = 1; +80103ae4: c7 05 f4 dd 11 80 01 movl $0x1,0x8011ddf4 +80103aeb: 00 00 00 +} +80103aee: 8d 65 f8 lea -0x8(%ebp),%esp +80103af1: 5b pop %ebx +80103af2: 5e pop %esi +80103af3: 5d pop %ebp +80103af4: c3 ret +80103af5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103afc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80103b00 : +void kinit1(void *vstart, void *vend) { +80103b00: 55 push %ebp +80103b01: 89 e5 mov %esp,%ebp +80103b03: 56 push %esi +80103b04: 53 push %ebx +80103b05: 8b 75 0c mov 0xc(%ebp),%esi + initlock(&kmem.lock, "kmem"); +80103b08: 83 ec 08 sub $0x8,%esp +80103b0b: 68 8c 8c 10 80 push $0x80108c8c +80103b10: 68 c0 dd 11 80 push $0x8011ddc0 +80103b15: e8 96 1e 00 00 call 801059b0 + p = (char*)PGROUNDUP((uint)vstart); +80103b1a: 8b 45 08 mov 0x8(%ebp),%eax + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103b1d: 83 c4 10 add $0x10,%esp + kmem.use_lock = 0; +80103b20: c7 05 f4 dd 11 80 00 movl $0x0,0x8011ddf4 +80103b27: 00 00 00 + p = (char*)PGROUNDUP((uint)vstart); +80103b2a: 8d 98 ff 0f 00 00 lea 0xfff(%eax),%ebx +80103b30: 81 e3 00 f0 ff ff and $0xfffff000,%ebx + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103b36: 81 c3 00 10 00 00 add $0x1000,%ebx +80103b3c: 39 de cmp %ebx,%esi +80103b3e: 72 1c jb 80103b5c + kfree(p); +80103b40: 83 ec 0c sub $0xc,%esp +80103b43: 8d 83 00 f0 ff ff lea -0x1000(%ebx),%eax + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103b49: 81 c3 00 10 00 00 add $0x1000,%ebx + kfree(p); +80103b4f: 50 push %eax +80103b50: e8 5b fe ff ff call 801039b0 + for (; p + PGSIZE <= (char*)vend; p += PGSIZE) { +80103b55: 83 c4 10 add $0x10,%esp +80103b58: 39 de cmp %ebx,%esi +80103b5a: 73 e4 jae 80103b40 +} +80103b5c: 8d 65 f8 lea -0x8(%ebp),%esp +80103b5f: 5b pop %ebx +80103b60: 5e pop %esi +80103b61: 5d pop %ebp +80103b62: c3 ret +80103b63: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103b6a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80103b70 : +// Returns a pointer that the kernel can use. +// Returns 0 if the memory cannot be allocated. +char* kalloc(void) { + struct run *r; + + if (kmem.use_lock) { +80103b70: a1 f4 dd 11 80 mov 0x8011ddf4,%eax +80103b75: 85 c0 test %eax,%eax +80103b77: 75 1f jne 80103b98 + acquire(&kmem.lock); + } + r = kmem.freelist; +80103b79: a1 f8 dd 11 80 mov 0x8011ddf8,%eax + if (r) { +80103b7e: 85 c0 test %eax,%eax +80103b80: 74 0e je 80103b90 + kmem.freelist = r->next; +80103b82: 8b 10 mov (%eax),%edx +80103b84: 89 15 f8 dd 11 80 mov %edx,0x8011ddf8 + } + if (kmem.use_lock) { +80103b8a: c3 ret +80103b8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80103b8f: 90 nop + release(&kmem.lock); + } + return (char*)r; +} +80103b90: c3 ret +80103b91: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +char* kalloc(void) { +80103b98: 55 push %ebp +80103b99: 89 e5 mov %esp,%ebp +80103b9b: 83 ec 24 sub $0x24,%esp + acquire(&kmem.lock); +80103b9e: 68 c0 dd 11 80 push $0x8011ddc0 +80103ba3: e8 d8 1f 00 00 call 80105b80 + r = kmem.freelist; +80103ba8: a1 f8 dd 11 80 mov 0x8011ddf8,%eax + if (kmem.use_lock) { +80103bad: 8b 15 f4 dd 11 80 mov 0x8011ddf4,%edx + if (r) { +80103bb3: 83 c4 10 add $0x10,%esp +80103bb6: 85 c0 test %eax,%eax +80103bb8: 74 08 je 80103bc2 + kmem.freelist = r->next; +80103bba: 8b 08 mov (%eax),%ecx +80103bbc: 89 0d f8 dd 11 80 mov %ecx,0x8011ddf8 + if (kmem.use_lock) { +80103bc2: 85 d2 test %edx,%edx +80103bc4: 74 16 je 80103bdc + release(&kmem.lock); +80103bc6: 83 ec 0c sub $0xc,%esp +80103bc9: 89 45 f4 mov %eax,-0xc(%ebp) +80103bcc: 68 c0 dd 11 80 push $0x8011ddc0 +80103bd1: e8 4a 1f 00 00 call 80105b20 + return (char*)r; +80103bd6: 8b 45 f4 mov -0xc(%ebp),%eax + release(&kmem.lock); +80103bd9: 83 c4 10 add $0x10,%esp +} +80103bdc: c9 leave +80103bdd: c3 ret +80103bde: 66 90 xchg %ax,%ax + +80103be0 : + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103be0: ba 64 00 00 00 mov $0x64,%edx +80103be5: ec in (%dx),%al + normalmap, shiftmap, ctlmap, ctlmap + }; + uint st, data, c; + + st = inb(KBSTATP); + if ((st & KBS_DIB) == 0) { +80103be6: a8 01 test $0x1,%al +80103be8: 0f 84 c2 00 00 00 je 80103cb0 +int kbdgetc(void) { +80103bee: 55 push %ebp +80103bef: ba 60 00 00 00 mov $0x60,%edx +80103bf4: 89 e5 mov %esp,%ebp +80103bf6: 53 push %ebx +80103bf7: ec in (%dx),%al + return -1; + } + data = inb(KBDATAP); + + if (data == 0xE0) { + shift |= E0ESC; +80103bf8: 8b 1d fc dd 11 80 mov 0x8011ddfc,%ebx + data = inb(KBDATAP); +80103bfe: 0f b6 c8 movzbl %al,%ecx + if (data == 0xE0) { +80103c01: 3c e0 cmp $0xe0,%al +80103c03: 74 5b je 80103c60 + return 0; + } + else if (data & 0x80) { + // Key released + data = (shift & E0ESC ? data : data & 0x7F); +80103c05: 89 da mov %ebx,%edx +80103c07: 83 e2 40 and $0x40,%edx + else if (data & 0x80) { +80103c0a: 84 c0 test %al,%al +80103c0c: 78 62 js 80103c70 + shift &= ~(shiftcode[data] | E0ESC); + return 0; + } + else if (shift & E0ESC) { +80103c0e: 85 d2 test %edx,%edx +80103c10: 74 09 je 80103c1b + // Last character was an E0 escape; or with 0x80 + data |= 0x80; +80103c12: 83 c8 80 or $0xffffff80,%eax + shift &= ~E0ESC; +80103c15: 83 e3 bf and $0xffffffbf,%ebx + data |= 0x80; +80103c18: 0f b6 c8 movzbl %al,%ecx + } + + shift |= shiftcode[data]; +80103c1b: 0f b6 91 c0 8d 10 80 movzbl -0x7fef7240(%ecx),%edx + shift ^= togglecode[data]; +80103c22: 0f b6 81 c0 8c 10 80 movzbl -0x7fef7340(%ecx),%eax + shift |= shiftcode[data]; +80103c29: 09 da or %ebx,%edx + shift ^= togglecode[data]; +80103c2b: 31 c2 xor %eax,%edx + c = charcode[shift & (CTL | SHIFT)][data]; +80103c2d: 89 d0 mov %edx,%eax + shift ^= togglecode[data]; +80103c2f: 89 15 fc dd 11 80 mov %edx,0x8011ddfc + c = charcode[shift & (CTL | SHIFT)][data]; +80103c35: 83 e0 03 and $0x3,%eax + if (shift & CAPSLOCK) { +80103c38: 83 e2 08 and $0x8,%edx + c = charcode[shift & (CTL | SHIFT)][data]; +80103c3b: 8b 04 85 a0 8c 10 80 mov -0x7fef7360(,%eax,4),%eax +80103c42: 0f b6 04 08 movzbl (%eax,%ecx,1),%eax + if (shift & CAPSLOCK) { +80103c46: 74 0b je 80103c53 + if ('a' <= c && c <= 'z') { +80103c48: 8d 50 9f lea -0x61(%eax),%edx +80103c4b: 83 fa 19 cmp $0x19,%edx +80103c4e: 77 48 ja 80103c98 + c += 'A' - 'a'; +80103c50: 83 e8 20 sub $0x20,%eax + else if ('A' <= c && c <= 'Z') { + c += 'a' - 'A'; + } + } + return c; +} +80103c53: 8b 5d fc mov -0x4(%ebp),%ebx +80103c56: c9 leave +80103c57: c3 ret +80103c58: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103c5f: 90 nop + shift |= E0ESC; +80103c60: 83 cb 40 or $0x40,%ebx + return 0; +80103c63: 31 c0 xor %eax,%eax + shift |= E0ESC; +80103c65: 89 1d fc dd 11 80 mov %ebx,0x8011ddfc +} +80103c6b: 8b 5d fc mov -0x4(%ebp),%ebx +80103c6e: c9 leave +80103c6f: c3 ret + data = (shift & E0ESC ? data : data & 0x7F); +80103c70: 83 e0 7f and $0x7f,%eax +80103c73: 85 d2 test %edx,%edx +80103c75: 0f 44 c8 cmove %eax,%ecx + shift &= ~(shiftcode[data] | E0ESC); +80103c78: 0f b6 81 c0 8d 10 80 movzbl -0x7fef7240(%ecx),%eax +80103c7f: 83 c8 40 or $0x40,%eax +80103c82: 0f b6 c0 movzbl %al,%eax +80103c85: f7 d0 not %eax +80103c87: 21 d8 and %ebx,%eax +} +80103c89: 8b 5d fc mov -0x4(%ebp),%ebx + shift &= ~(shiftcode[data] | E0ESC); +80103c8c: a3 fc dd 11 80 mov %eax,0x8011ddfc + return 0; +80103c91: 31 c0 xor %eax,%eax +} +80103c93: c9 leave +80103c94: c3 ret +80103c95: 8d 76 00 lea 0x0(%esi),%esi + else if ('A' <= c && c <= 'Z') { +80103c98: 8d 48 bf lea -0x41(%eax),%ecx + c += 'a' - 'A'; +80103c9b: 8d 50 20 lea 0x20(%eax),%edx +} +80103c9e: 8b 5d fc mov -0x4(%ebp),%ebx +80103ca1: c9 leave + c += 'a' - 'A'; +80103ca2: 83 f9 1a cmp $0x1a,%ecx +80103ca5: 0f 42 c2 cmovb %edx,%eax +} +80103ca8: c3 ret +80103ca9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return -1; +80103cb0: b8 ff ff ff ff mov $0xffffffff,%eax +} +80103cb5: c3 ret +80103cb6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103cbd: 8d 76 00 lea 0x0(%esi),%esi + +80103cc0 : + +void kbdintr(void) { +80103cc0: 55 push %ebp +80103cc1: 89 e5 mov %esp,%ebp +80103cc3: 83 ec 14 sub $0x14,%esp + consoleintr(kbdgetc); +80103cc6: 68 e0 3b 10 80 push $0x80103be0 +80103ccb: e8 60 d8 ff ff call 80101530 +} +80103cd0: 83 c4 10 add $0x10,%esp +80103cd3: c9 leave +80103cd4: c3 ret +80103cd5: 66 90 xchg %ax,%ax +80103cd7: 66 90 xchg %ax,%ax +80103cd9: 66 90 xchg %ax,%ax +80103cdb: 66 90 xchg %ax,%ax +80103cdd: 66 90 xchg %ax,%ax +80103cdf: 90 nop + +80103ce0 : + lapic[index] = value; + lapic[ID]; // wait for write to finish, by reading +} + +void lapicinit(void) { + if (!lapic) { +80103ce0: a1 00 de 11 80 mov 0x8011de00,%eax +80103ce5: 85 c0 test %eax,%eax +80103ce7: 0f 84 cb 00 00 00 je 80103db8 + lapic[index] = value; +80103ced: c7 80 f0 00 00 00 3f movl $0x13f,0xf0(%eax) +80103cf4: 01 00 00 + lapic[ID]; // wait for write to finish, by reading +80103cf7: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103cfa: c7 80 e0 03 00 00 0b movl $0xb,0x3e0(%eax) +80103d01: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d04: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d07: c7 80 20 03 00 00 20 movl $0x20020,0x320(%eax) +80103d0e: 00 02 00 + lapic[ID]; // wait for write to finish, by reading +80103d11: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d14: c7 80 80 03 00 00 80 movl $0x989680,0x380(%eax) +80103d1b: 96 98 00 + lapic[ID]; // wait for write to finish, by reading +80103d1e: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d21: c7 80 50 03 00 00 00 movl $0x10000,0x350(%eax) +80103d28: 00 01 00 + lapic[ID]; // wait for write to finish, by reading +80103d2b: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d2e: c7 80 60 03 00 00 00 movl $0x10000,0x360(%eax) +80103d35: 00 01 00 + lapic[ID]; // wait for write to finish, by reading +80103d38: 8b 50 20 mov 0x20(%eax),%edx + lapicw(LINT0, MASKED); + lapicw(LINT1, MASKED); + + // Disable performance counter overflow interrupts + // on machines that provide that interrupt entry. + if (((lapic[VER] >> 16) & 0xFF) >= 4) { +80103d3b: 8b 50 30 mov 0x30(%eax),%edx +80103d3e: c1 ea 10 shr $0x10,%edx +80103d41: 81 e2 fc 00 00 00 and $0xfc,%edx +80103d47: 75 77 jne 80103dc0 + lapic[index] = value; +80103d49: c7 80 70 03 00 00 33 movl $0x33,0x370(%eax) +80103d50: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d53: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d56: c7 80 80 02 00 00 00 movl $0x0,0x280(%eax) +80103d5d: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d60: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d63: c7 80 80 02 00 00 00 movl $0x0,0x280(%eax) +80103d6a: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d6d: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d70: c7 80 b0 00 00 00 00 movl $0x0,0xb0(%eax) +80103d77: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d7a: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d7d: c7 80 10 03 00 00 00 movl $0x0,0x310(%eax) +80103d84: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103d87: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103d8a: c7 80 00 03 00 00 00 movl $0x88500,0x300(%eax) +80103d91: 85 08 00 + lapic[ID]; // wait for write to finish, by reading +80103d94: 8b 50 20 mov 0x20(%eax),%edx +80103d97: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103d9e: 66 90 xchg %ax,%ax + lapicw(EOI, 0); + + // Send an Init Level De-Assert to synchronise arbitration ID's. + lapicw(ICRHI, 0); + lapicw(ICRLO, BCAST | INIT | LEVEL); + while (lapic[ICRLO] & DELIVS) { +80103da0: 8b 90 00 03 00 00 mov 0x300(%eax),%edx +80103da6: 80 e6 10 and $0x10,%dh +80103da9: 75 f5 jne 80103da0 + lapic[index] = value; +80103dab: c7 80 80 00 00 00 00 movl $0x0,0x80(%eax) +80103db2: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103db5: 8b 40 20 mov 0x20(%eax),%eax + ; + } + + // Enable interrupts on the APIC (but not on the processor). + lapicw(TPR, 0); +} +80103db8: c3 ret +80103db9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + lapic[index] = value; +80103dc0: c7 80 40 03 00 00 00 movl $0x10000,0x340(%eax) +80103dc7: 00 01 00 + lapic[ID]; // wait for write to finish, by reading +80103dca: 8b 50 20 mov 0x20(%eax),%edx +} +80103dcd: e9 77 ff ff ff jmp 80103d49 +80103dd2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103dd9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80103de0 : + +int lapicid(void) { + if (!lapic) { +80103de0: a1 00 de 11 80 mov 0x8011de00,%eax +80103de5: 85 c0 test %eax,%eax +80103de7: 74 07 je 80103df0 + return 0; + } + return lapic[ID] >> 24; +80103de9: 8b 40 20 mov 0x20(%eax),%eax +80103dec: c1 e8 18 shr $0x18,%eax +80103def: c3 ret + return 0; +80103df0: 31 c0 xor %eax,%eax +} +80103df2: c3 ret +80103df3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103dfa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80103e00 : + +// Acknowledge interrupt. +void lapiceoi(void) { + if (lapic) { +80103e00: a1 00 de 11 80 mov 0x8011de00,%eax +80103e05: 85 c0 test %eax,%eax +80103e07: 74 0d je 80103e16 + lapic[index] = value; +80103e09: c7 80 b0 00 00 00 00 movl $0x0,0xb0(%eax) +80103e10: 00 00 00 + lapic[ID]; // wait for write to finish, by reading +80103e13: 8b 40 20 mov 0x20(%eax),%eax + lapicw(EOI, 0); + } +} +80103e16: c3 ret +80103e17: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103e1e: 66 90 xchg %ax,%ax + +80103e20 : + +// Spin for a given number of microseconds. +// On real hardware would want to tune this dynamically. +void microdelay(int us) { +} +80103e20: c3 ret +80103e21: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103e28: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80103e2f: 90 nop + +80103e30 : +#define CMOS_PORT 0x70 +#define CMOS_RETURN 0x71 + +// Start additional processor running entry code at addr. +// See Appendix B of MultiProcessor Specification. +void lapicstartap(uchar apicid, uint addr) { +80103e30: 55 push %ebp + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103e31: b8 0f 00 00 00 mov $0xf,%eax +80103e36: ba 70 00 00 00 mov $0x70,%edx +80103e3b: 89 e5 mov %esp,%ebp +80103e3d: 53 push %ebx +80103e3e: 8b 4d 0c mov 0xc(%ebp),%ecx +80103e41: 8b 5d 08 mov 0x8(%ebp),%ebx +80103e44: ee out %al,(%dx) +80103e45: b8 0a 00 00 00 mov $0xa,%eax +80103e4a: ba 71 00 00 00 mov $0x71,%edx +80103e4f: ee out %al,(%dx) + // and the warm reset vector (DWORD based at 40:67) to point at + // the AP startup code prior to the [universal startup algorithm]." + outb(CMOS_PORT, 0xF); // offset 0xF is shutdown code + outb(CMOS_PORT + 1, 0x0A); + wrv = (ushort*)P2V((0x40 << 4 | 0x67)); // Warm reset vector + wrv[0] = 0; +80103e50: 31 c0 xor %eax,%eax + wrv[1] = addr >> 4; + + // "Universal startup algorithm." + // Send INIT (level-triggered) interrupt to reset other CPU. + lapicw(ICRHI, apicid << 24); +80103e52: c1 e3 18 shl $0x18,%ebx + wrv[0] = 0; +80103e55: 66 a3 67 04 00 80 mov %ax,0x80000467 + wrv[1] = addr >> 4; +80103e5b: 89 c8 mov %ecx,%eax + // when it is in the halted state due to an INIT. So the second + // should be ignored, but it is part of the official Intel algorithm. + // Bochs complains about the second one. Too bad for Bochs. + for (i = 0; i < 2; i++) { + lapicw(ICRHI, apicid << 24); + lapicw(ICRLO, STARTUP | (addr >> 12)); +80103e5d: c1 e9 0c shr $0xc,%ecx + lapicw(ICRHI, apicid << 24); +80103e60: 89 da mov %ebx,%edx + wrv[1] = addr >> 4; +80103e62: c1 e8 04 shr $0x4,%eax + lapicw(ICRLO, STARTUP | (addr >> 12)); +80103e65: 80 cd 06 or $0x6,%ch + wrv[1] = addr >> 4; +80103e68: 66 a3 69 04 00 80 mov %ax,0x80000469 + lapic[index] = value; +80103e6e: a1 00 de 11 80 mov 0x8011de00,%eax +80103e73: 89 98 10 03 00 00 mov %ebx,0x310(%eax) + lapic[ID]; // wait for write to finish, by reading +80103e79: 8b 58 20 mov 0x20(%eax),%ebx + lapic[index] = value; +80103e7c: c7 80 00 03 00 00 00 movl $0xc500,0x300(%eax) +80103e83: c5 00 00 + lapic[ID]; // wait for write to finish, by reading +80103e86: 8b 58 20 mov 0x20(%eax),%ebx + lapic[index] = value; +80103e89: c7 80 00 03 00 00 00 movl $0x8500,0x300(%eax) +80103e90: 85 00 00 + lapic[ID]; // wait for write to finish, by reading +80103e93: 8b 58 20 mov 0x20(%eax),%ebx + lapic[index] = value; +80103e96: 89 90 10 03 00 00 mov %edx,0x310(%eax) + lapic[ID]; // wait for write to finish, by reading +80103e9c: 8b 58 20 mov 0x20(%eax),%ebx + lapic[index] = value; +80103e9f: 89 88 00 03 00 00 mov %ecx,0x300(%eax) + lapic[ID]; // wait for write to finish, by reading +80103ea5: 8b 58 20 mov 0x20(%eax),%ebx + lapic[index] = value; +80103ea8: 89 90 10 03 00 00 mov %edx,0x310(%eax) + lapic[ID]; // wait for write to finish, by reading +80103eae: 8b 50 20 mov 0x20(%eax),%edx + lapic[index] = value; +80103eb1: 89 88 00 03 00 00 mov %ecx,0x300(%eax) + lapic[ID]; // wait for write to finish, by reading +80103eb7: 8b 40 20 mov 0x20(%eax),%eax + microdelay(200); + } +} +80103eba: 8b 5d fc mov -0x4(%ebp),%ebx +80103ebd: c9 leave +80103ebe: c3 ret +80103ebf: 90 nop + +80103ec0 : + r->month = cmos_read(MONTH); + r->year = cmos_read(YEAR); +} + +// qemu seems to use 24-hour GWT and the values are BCD encoded +void cmostime(struct rtcdate *r) { +80103ec0: 55 push %ebp +80103ec1: b8 0b 00 00 00 mov $0xb,%eax +80103ec6: ba 70 00 00 00 mov $0x70,%edx +80103ecb: 89 e5 mov %esp,%ebp +80103ecd: 57 push %edi +80103ece: 56 push %esi +80103ecf: 53 push %ebx +80103ed0: 83 ec 4c sub $0x4c,%esp +80103ed3: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103ed4: ba 71 00 00 00 mov $0x71,%edx +80103ed9: ec in (%dx),%al + struct rtcdate t1, t2; + int sb, bcd; + + sb = cmos_read(CMOS_STATB); + + bcd = (sb & (1 << 2)) == 0; +80103eda: 83 e0 04 and $0x4,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103edd: bb 70 00 00 00 mov $0x70,%ebx +80103ee2: 88 45 b3 mov %al,-0x4d(%ebp) +80103ee5: 8d 76 00 lea 0x0(%esi),%esi +80103ee8: 31 c0 xor %eax,%eax +80103eea: 89 da mov %ebx,%edx +80103eec: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103eed: b9 71 00 00 00 mov $0x71,%ecx +80103ef2: 89 ca mov %ecx,%edx +80103ef4: ec in (%dx),%al +80103ef5: 88 45 b7 mov %al,-0x49(%ebp) + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103ef8: 89 da mov %ebx,%edx +80103efa: b8 02 00 00 00 mov $0x2,%eax +80103eff: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f00: 89 ca mov %ecx,%edx +80103f02: ec in (%dx),%al +80103f03: 88 45 b6 mov %al,-0x4a(%ebp) + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f06: 89 da mov %ebx,%edx +80103f08: b8 04 00 00 00 mov $0x4,%eax +80103f0d: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f0e: 89 ca mov %ecx,%edx +80103f10: ec in (%dx),%al +80103f11: 88 45 b5 mov %al,-0x4b(%ebp) + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f14: 89 da mov %ebx,%edx +80103f16: b8 07 00 00 00 mov $0x7,%eax +80103f1b: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f1c: 89 ca mov %ecx,%edx +80103f1e: ec in (%dx),%al +80103f1f: 88 45 b4 mov %al,-0x4c(%ebp) + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f22: 89 da mov %ebx,%edx +80103f24: b8 08 00 00 00 mov $0x8,%eax +80103f29: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f2a: 89 ca mov %ecx,%edx +80103f2c: ec in (%dx),%al +80103f2d: 89 c7 mov %eax,%edi + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f2f: 89 da mov %ebx,%edx +80103f31: b8 09 00 00 00 mov $0x9,%eax +80103f36: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f37: 89 ca mov %ecx,%edx +80103f39: ec in (%dx),%al +80103f3a: 89 c6 mov %eax,%esi + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f3c: 89 da mov %ebx,%edx +80103f3e: b8 0a 00 00 00 mov $0xa,%eax +80103f43: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f44: 89 ca mov %ecx,%edx +80103f46: ec in (%dx),%al + + // make sure CMOS doesn't modify time while we read it + for (;;) { + fill_rtcdate(&t1); + if (cmos_read(CMOS_STATA) & CMOS_UIP) { +80103f47: 84 c0 test %al,%al +80103f49: 78 9d js 80103ee8 + return inb(CMOS_RETURN); +80103f4b: 0f b6 45 b7 movzbl -0x49(%ebp),%eax +80103f4f: 89 fa mov %edi,%edx +80103f51: 0f b6 fa movzbl %dl,%edi +80103f54: 89 f2 mov %esi,%edx +80103f56: 89 45 b8 mov %eax,-0x48(%ebp) +80103f59: 0f b6 45 b6 movzbl -0x4a(%ebp),%eax +80103f5d: 0f b6 f2 movzbl %dl,%esi + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f60: 89 da mov %ebx,%edx +80103f62: 89 7d c8 mov %edi,-0x38(%ebp) +80103f65: 89 45 bc mov %eax,-0x44(%ebp) +80103f68: 0f b6 45 b5 movzbl -0x4b(%ebp),%eax +80103f6c: 89 75 cc mov %esi,-0x34(%ebp) +80103f6f: 89 45 c0 mov %eax,-0x40(%ebp) +80103f72: 0f b6 45 b4 movzbl -0x4c(%ebp),%eax +80103f76: 89 45 c4 mov %eax,-0x3c(%ebp) +80103f79: 31 c0 xor %eax,%eax +80103f7b: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f7c: 89 ca mov %ecx,%edx +80103f7e: ec in (%dx),%al +80103f7f: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f82: 89 da mov %ebx,%edx +80103f84: 89 45 d0 mov %eax,-0x30(%ebp) +80103f87: b8 02 00 00 00 mov $0x2,%eax +80103f8c: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f8d: 89 ca mov %ecx,%edx +80103f8f: ec in (%dx),%al +80103f90: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103f93: 89 da mov %ebx,%edx +80103f95: 89 45 d4 mov %eax,-0x2c(%ebp) +80103f98: b8 04 00 00 00 mov $0x4,%eax +80103f9d: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103f9e: 89 ca mov %ecx,%edx +80103fa0: ec in (%dx),%al +80103fa1: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103fa4: 89 da mov %ebx,%edx +80103fa6: 89 45 d8 mov %eax,-0x28(%ebp) +80103fa9: b8 07 00 00 00 mov $0x7,%eax +80103fae: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103faf: 89 ca mov %ecx,%edx +80103fb1: ec in (%dx),%al +80103fb2: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103fb5: 89 da mov %ebx,%edx +80103fb7: 89 45 dc mov %eax,-0x24(%ebp) +80103fba: b8 08 00 00 00 mov $0x8,%eax +80103fbf: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103fc0: 89 ca mov %ecx,%edx +80103fc2: ec in (%dx),%al +80103fc3: 0f b6 c0 movzbl %al,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80103fc6: 89 da mov %ebx,%edx +80103fc8: 89 45 e0 mov %eax,-0x20(%ebp) +80103fcb: b8 09 00 00 00 mov $0x9,%eax +80103fd0: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80103fd1: 89 ca mov %ecx,%edx +80103fd3: ec in (%dx),%al +80103fd4: 0f b6 c0 movzbl %al,%eax + continue; + } + fill_rtcdate(&t2); + if (memcmp(&t1, &t2, sizeof(t1)) == 0) { +80103fd7: 83 ec 04 sub $0x4,%esp + return inb(CMOS_RETURN); +80103fda: 89 45 e4 mov %eax,-0x1c(%ebp) + if (memcmp(&t1, &t2, sizeof(t1)) == 0) { +80103fdd: 8d 45 d0 lea -0x30(%ebp),%eax +80103fe0: 6a 18 push $0x18 +80103fe2: 50 push %eax +80103fe3: 8d 45 b8 lea -0x48(%ebp),%eax +80103fe6: 50 push %eax +80103fe7: e8 a4 1c 00 00 call 80105c90 +80103fec: 83 c4 10 add $0x10,%esp +80103fef: 85 c0 test %eax,%eax +80103ff1: 0f 85 f1 fe ff ff jne 80103ee8 + break; + } + } + + // convert + if (bcd) { +80103ff7: 80 7d b3 00 cmpb $0x0,-0x4d(%ebp) +80103ffb: 75 78 jne 80104075 +#define CONV(x) (t1.x = ((t1.x >> 4) * 10) + (t1.x & 0xf)) + CONV(second); +80103ffd: 8b 45 b8 mov -0x48(%ebp),%eax +80104000: 89 c2 mov %eax,%edx +80104002: 83 e0 0f and $0xf,%eax +80104005: c1 ea 04 shr $0x4,%edx +80104008: 8d 14 92 lea (%edx,%edx,4),%edx +8010400b: 8d 04 50 lea (%eax,%edx,2),%eax +8010400e: 89 45 b8 mov %eax,-0x48(%ebp) + CONV(minute); +80104011: 8b 45 bc mov -0x44(%ebp),%eax +80104014: 89 c2 mov %eax,%edx +80104016: 83 e0 0f and $0xf,%eax +80104019: c1 ea 04 shr $0x4,%edx +8010401c: 8d 14 92 lea (%edx,%edx,4),%edx +8010401f: 8d 04 50 lea (%eax,%edx,2),%eax +80104022: 89 45 bc mov %eax,-0x44(%ebp) + CONV(hour ); +80104025: 8b 45 c0 mov -0x40(%ebp),%eax +80104028: 89 c2 mov %eax,%edx +8010402a: 83 e0 0f and $0xf,%eax +8010402d: c1 ea 04 shr $0x4,%edx +80104030: 8d 14 92 lea (%edx,%edx,4),%edx +80104033: 8d 04 50 lea (%eax,%edx,2),%eax +80104036: 89 45 c0 mov %eax,-0x40(%ebp) + CONV(day ); +80104039: 8b 45 c4 mov -0x3c(%ebp),%eax +8010403c: 89 c2 mov %eax,%edx +8010403e: 83 e0 0f and $0xf,%eax +80104041: c1 ea 04 shr $0x4,%edx +80104044: 8d 14 92 lea (%edx,%edx,4),%edx +80104047: 8d 04 50 lea (%eax,%edx,2),%eax +8010404a: 89 45 c4 mov %eax,-0x3c(%ebp) + CONV(month ); +8010404d: 8b 45 c8 mov -0x38(%ebp),%eax +80104050: 89 c2 mov %eax,%edx +80104052: 83 e0 0f and $0xf,%eax +80104055: c1 ea 04 shr $0x4,%edx +80104058: 8d 14 92 lea (%edx,%edx,4),%edx +8010405b: 8d 04 50 lea (%eax,%edx,2),%eax +8010405e: 89 45 c8 mov %eax,-0x38(%ebp) + CONV(year ); +80104061: 8b 45 cc mov -0x34(%ebp),%eax +80104064: 89 c2 mov %eax,%edx +80104066: 83 e0 0f and $0xf,%eax +80104069: c1 ea 04 shr $0x4,%edx +8010406c: 8d 14 92 lea (%edx,%edx,4),%edx +8010406f: 8d 04 50 lea (%eax,%edx,2),%eax +80104072: 89 45 cc mov %eax,-0x34(%ebp) +#undef CONV + } + + *r = t1; +80104075: 8b 75 08 mov 0x8(%ebp),%esi +80104078: 8b 45 b8 mov -0x48(%ebp),%eax +8010407b: 89 06 mov %eax,(%esi) +8010407d: 8b 45 bc mov -0x44(%ebp),%eax +80104080: 89 46 04 mov %eax,0x4(%esi) +80104083: 8b 45 c0 mov -0x40(%ebp),%eax +80104086: 89 46 08 mov %eax,0x8(%esi) +80104089: 8b 45 c4 mov -0x3c(%ebp),%eax +8010408c: 89 46 0c mov %eax,0xc(%esi) +8010408f: 8b 45 c8 mov -0x38(%ebp),%eax +80104092: 89 46 10 mov %eax,0x10(%esi) +80104095: 8b 45 cc mov -0x34(%ebp),%eax +80104098: 89 46 14 mov %eax,0x14(%esi) + r->year += 2000; +8010409b: 81 46 14 d0 07 00 00 addl $0x7d0,0x14(%esi) +} +801040a2: 8d 65 f4 lea -0xc(%ebp),%esp +801040a5: 5b pop %ebx +801040a6: 5e pop %esi +801040a7: 5f pop %edi +801040a8: 5d pop %ebp +801040a9: c3 ret +801040aa: 66 90 xchg %ax,%ax +801040ac: 66 90 xchg %ax,%ax +801040ae: 66 90 xchg %ax,%ax + +801040b0 : +static void +install_trans(void) +{ + int tail; + + for (tail = 0; tail < log.lh.n; tail++) { +801040b0: 8b 0d 68 de 11 80 mov 0x8011de68,%ecx +801040b6: 85 c9 test %ecx,%ecx +801040b8: 0f 8e 8a 00 00 00 jle 80104148 +{ +801040be: 55 push %ebp +801040bf: 89 e5 mov %esp,%ebp +801040c1: 57 push %edi + for (tail = 0; tail < log.lh.n; tail++) { +801040c2: 31 ff xor %edi,%edi +{ +801040c4: 56 push %esi +801040c5: 53 push %ebx +801040c6: 83 ec 0c sub $0xc,%esp +801040c9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block +801040d0: a1 54 de 11 80 mov 0x8011de54,%eax +801040d5: 83 ec 08 sub $0x8,%esp +801040d8: 01 f8 add %edi,%eax +801040da: 83 c0 01 add $0x1,%eax +801040dd: 50 push %eax +801040de: ff 35 64 de 11 80 push 0x8011de64 +801040e4: e8 e7 bf ff ff call 801000d0 +801040e9: 89 c6 mov %eax,%esi + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst +801040eb: 58 pop %eax +801040ec: 5a pop %edx +801040ed: ff 34 bd 6c de 11 80 push -0x7fee2194(,%edi,4) +801040f4: ff 35 64 de 11 80 push 0x8011de64 + for (tail = 0; tail < log.lh.n; tail++) { +801040fa: 83 c7 01 add $0x1,%edi + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst +801040fd: e8 ce bf ff ff call 801000d0 + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst +80104102: 83 c4 0c add $0xc,%esp + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst +80104105: 89 c3 mov %eax,%ebx + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst +80104107: 8d 46 5c lea 0x5c(%esi),%eax +8010410a: 68 00 02 00 00 push $0x200 +8010410f: 50 push %eax +80104110: 8d 43 5c lea 0x5c(%ebx),%eax +80104113: 50 push %eax +80104114: e8 c7 1b 00 00 call 80105ce0 + bwrite(dbuf); // write dst to disk +80104119: 89 1c 24 mov %ebx,(%esp) +8010411c: e8 8f c0 ff ff call 801001b0 + brelse(lbuf); +80104121: 89 34 24 mov %esi,(%esp) +80104124: e8 c7 c0 ff ff call 801001f0 + brelse(dbuf); +80104129: 89 1c 24 mov %ebx,(%esp) +8010412c: e8 bf c0 ff ff call 801001f0 + for (tail = 0; tail < log.lh.n; tail++) { +80104131: 83 c4 10 add $0x10,%esp +80104134: 39 3d 68 de 11 80 cmp %edi,0x8011de68 +8010413a: 7f 94 jg 801040d0 + } +} +8010413c: 8d 65 f4 lea -0xc(%ebp),%esp +8010413f: 5b pop %ebx +80104140: 5e pop %esi +80104141: 5f pop %edi +80104142: 5d pop %ebp +80104143: c3 ret +80104144: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80104148: c3 ret +80104149: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80104150 : +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ +80104150: 55 push %ebp +80104151: 89 e5 mov %esp,%ebp +80104153: 53 push %ebx +80104154: 83 ec 0c sub $0xc,%esp + struct buf *buf = bread(log.dev, log.start); +80104157: ff 35 54 de 11 80 push 0x8011de54 +8010415d: ff 35 64 de 11 80 push 0x8011de64 +80104163: e8 68 bf ff ff call 801000d0 + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; + for (i = 0; i < log.lh.n; i++) { +80104168: 83 c4 10 add $0x10,%esp + struct buf *buf = bread(log.dev, log.start); +8010416b: 89 c3 mov %eax,%ebx + hb->n = log.lh.n; +8010416d: a1 68 de 11 80 mov 0x8011de68,%eax +80104172: 89 43 5c mov %eax,0x5c(%ebx) + for (i = 0; i < log.lh.n; i++) { +80104175: 85 c0 test %eax,%eax +80104177: 7e 19 jle 80104192 +80104179: 31 d2 xor %edx,%edx +8010417b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010417f: 90 nop + hb->block[i] = log.lh.block[i]; +80104180: 8b 0c 95 6c de 11 80 mov -0x7fee2194(,%edx,4),%ecx +80104187: 89 4c 93 60 mov %ecx,0x60(%ebx,%edx,4) + for (i = 0; i < log.lh.n; i++) { +8010418b: 83 c2 01 add $0x1,%edx +8010418e: 39 d0 cmp %edx,%eax +80104190: 75 ee jne 80104180 + } + bwrite(buf); +80104192: 83 ec 0c sub $0xc,%esp +80104195: 53 push %ebx +80104196: e8 15 c0 ff ff call 801001b0 + brelse(buf); +8010419b: 89 1c 24 mov %ebx,(%esp) +8010419e: e8 4d c0 ff ff call 801001f0 +} +801041a3: 8b 5d fc mov -0x4(%ebp),%ebx +801041a6: 83 c4 10 add $0x10,%esp +801041a9: c9 leave +801041aa: c3 ret +801041ab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801041af: 90 nop + +801041b0 : +{ +801041b0: 55 push %ebp +801041b1: 89 e5 mov %esp,%ebp +801041b3: 53 push %ebx +801041b4: 83 ec 2c sub $0x2c,%esp +801041b7: 8b 5d 08 mov 0x8(%ebp),%ebx + initlock(&log.lock, "log"); +801041ba: 68 c0 8e 10 80 push $0x80108ec0 +801041bf: 68 20 de 11 80 push $0x8011de20 +801041c4: e8 e7 17 00 00 call 801059b0 + readsb(dev, &sb); +801041c9: 58 pop %eax +801041ca: 8d 45 dc lea -0x24(%ebp),%eax +801041cd: 5a pop %edx +801041ce: 50 push %eax +801041cf: 53 push %ebx +801041d0: e8 3b e8 ff ff call 80102a10 + log.start = sb.logstart; +801041d5: 8b 45 ec mov -0x14(%ebp),%eax + struct buf *buf = bread(log.dev, log.start); +801041d8: 59 pop %ecx + log.dev = dev; +801041d9: 89 1d 64 de 11 80 mov %ebx,0x8011de64 + log.size = sb.nlog; +801041df: 8b 55 e8 mov -0x18(%ebp),%edx + log.start = sb.logstart; +801041e2: a3 54 de 11 80 mov %eax,0x8011de54 + log.size = sb.nlog; +801041e7: 89 15 58 de 11 80 mov %edx,0x8011de58 + struct buf *buf = bread(log.dev, log.start); +801041ed: 5a pop %edx +801041ee: 50 push %eax +801041ef: 53 push %ebx +801041f0: e8 db be ff ff call 801000d0 + for (i = 0; i < log.lh.n; i++) { +801041f5: 83 c4 10 add $0x10,%esp + log.lh.n = lh->n; +801041f8: 8b 58 5c mov 0x5c(%eax),%ebx +801041fb: 89 1d 68 de 11 80 mov %ebx,0x8011de68 + for (i = 0; i < log.lh.n; i++) { +80104201: 85 db test %ebx,%ebx +80104203: 7e 1d jle 80104222 +80104205: 31 d2 xor %edx,%edx +80104207: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010420e: 66 90 xchg %ax,%ax + log.lh.block[i] = lh->block[i]; +80104210: 8b 4c 90 60 mov 0x60(%eax,%edx,4),%ecx +80104214: 89 0c 95 6c de 11 80 mov %ecx,-0x7fee2194(,%edx,4) + for (i = 0; i < log.lh.n; i++) { +8010421b: 83 c2 01 add $0x1,%edx +8010421e: 39 d3 cmp %edx,%ebx +80104220: 75 ee jne 80104210 + brelse(buf); +80104222: 83 ec 0c sub $0xc,%esp +80104225: 50 push %eax +80104226: e8 c5 bf ff ff call 801001f0 + +static void +recover_from_log(void) +{ + read_head(); + install_trans(); // if committed, copy from log to disk +8010422b: e8 80 fe ff ff call 801040b0 + log.lh.n = 0; +80104230: c7 05 68 de 11 80 00 movl $0x0,0x8011de68 +80104237: 00 00 00 + write_head(); // clear the log +8010423a: e8 11 ff ff ff call 80104150 +} +8010423f: 8b 5d fc mov -0x4(%ebp),%ebx +80104242: 83 c4 10 add $0x10,%esp +80104245: c9 leave +80104246: c3 ret +80104247: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010424e: 66 90 xchg %ax,%ax + +80104250 : +} + +// called at the start of each FS system call. +void +begin_op(void) +{ +80104250: 55 push %ebp +80104251: 89 e5 mov %esp,%ebp +80104253: 83 ec 14 sub $0x14,%esp + acquire(&log.lock); +80104256: 68 20 de 11 80 push $0x8011de20 +8010425b: e8 20 19 00 00 call 80105b80 +80104260: 83 c4 10 add $0x10,%esp +80104263: eb 18 jmp 8010427d +80104265: 8d 76 00 lea 0x0(%esi),%esi + while(1){ + if(log.committing){ + sleep(&log, &log.lock); +80104268: 83 ec 08 sub $0x8,%esp +8010426b: 68 20 de 11 80 push $0x8011de20 +80104270: 68 20 de 11 80 push $0x8011de20 +80104275: e8 66 13 00 00 call 801055e0 +8010427a: 83 c4 10 add $0x10,%esp + if(log.committing){ +8010427d: a1 60 de 11 80 mov 0x8011de60,%eax +80104282: 85 c0 test %eax,%eax +80104284: 75 e2 jne 80104268 + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){ +80104286: a1 5c de 11 80 mov 0x8011de5c,%eax +8010428b: 8b 15 68 de 11 80 mov 0x8011de68,%edx +80104291: 83 c0 01 add $0x1,%eax +80104294: 8d 0c 80 lea (%eax,%eax,4),%ecx +80104297: 8d 14 4a lea (%edx,%ecx,2),%edx +8010429a: 83 fa 1e cmp $0x1e,%edx +8010429d: 7f c9 jg 80104268 + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); + } else { + log.outstanding += 1; + release(&log.lock); +8010429f: 83 ec 0c sub $0xc,%esp + log.outstanding += 1; +801042a2: a3 5c de 11 80 mov %eax,0x8011de5c + release(&log.lock); +801042a7: 68 20 de 11 80 push $0x8011de20 +801042ac: e8 6f 18 00 00 call 80105b20 + break; + } + } +} +801042b1: 83 c4 10 add $0x10,%esp +801042b4: c9 leave +801042b5: c3 ret +801042b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801042bd: 8d 76 00 lea 0x0(%esi),%esi + +801042c0 : + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ +801042c0: 55 push %ebp +801042c1: 89 e5 mov %esp,%ebp +801042c3: 57 push %edi +801042c4: 56 push %esi +801042c5: 53 push %ebx +801042c6: 83 ec 18 sub $0x18,%esp + int do_commit = 0; + + acquire(&log.lock); +801042c9: 68 20 de 11 80 push $0x8011de20 +801042ce: e8 ad 18 00 00 call 80105b80 + log.outstanding -= 1; +801042d3: a1 5c de 11 80 mov 0x8011de5c,%eax + if(log.committing) +801042d8: 8b 35 60 de 11 80 mov 0x8011de60,%esi +801042de: 83 c4 10 add $0x10,%esp + log.outstanding -= 1; +801042e1: 8d 58 ff lea -0x1(%eax),%ebx +801042e4: 89 1d 5c de 11 80 mov %ebx,0x8011de5c + if(log.committing) +801042ea: 85 f6 test %esi,%esi +801042ec: 0f 85 22 01 00 00 jne 80104414 + panic("log.committing"); + if(log.outstanding == 0){ +801042f2: 85 db test %ebx,%ebx +801042f4: 0f 85 f6 00 00 00 jne 801043f0 + do_commit = 1; + log.committing = 1; +801042fa: c7 05 60 de 11 80 01 movl $0x1,0x8011de60 +80104301: 00 00 00 + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); +80104304: 83 ec 0c sub $0xc,%esp +80104307: 68 20 de 11 80 push $0x8011de20 +8010430c: e8 0f 18 00 00 call 80105b20 +} + +static void +commit() +{ + if (log.lh.n > 0) { +80104311: 8b 0d 68 de 11 80 mov 0x8011de68,%ecx +80104317: 83 c4 10 add $0x10,%esp +8010431a: 85 c9 test %ecx,%ecx +8010431c: 7f 42 jg 80104360 + acquire(&log.lock); +8010431e: 83 ec 0c sub $0xc,%esp +80104321: 68 20 de 11 80 push $0x8011de20 +80104326: e8 55 18 00 00 call 80105b80 + wakeup(&log); +8010432b: c7 04 24 20 de 11 80 movl $0x8011de20,(%esp) + log.committing = 0; +80104332: c7 05 60 de 11 80 00 movl $0x0,0x8011de60 +80104339: 00 00 00 + wakeup(&log); +8010433c: e8 5f 13 00 00 call 801056a0 + release(&log.lock); +80104341: c7 04 24 20 de 11 80 movl $0x8011de20,(%esp) +80104348: e8 d3 17 00 00 call 80105b20 +8010434d: 83 c4 10 add $0x10,%esp +} +80104350: 8d 65 f4 lea -0xc(%ebp),%esp +80104353: 5b pop %ebx +80104354: 5e pop %esi +80104355: 5f pop %edi +80104356: 5d pop %ebp +80104357: c3 ret +80104358: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010435f: 90 nop + struct buf *to = bread(log.dev, log.start+tail+1); // log block +80104360: a1 54 de 11 80 mov 0x8011de54,%eax +80104365: 83 ec 08 sub $0x8,%esp +80104368: 01 d8 add %ebx,%eax +8010436a: 83 c0 01 add $0x1,%eax +8010436d: 50 push %eax +8010436e: ff 35 64 de 11 80 push 0x8011de64 +80104374: e8 57 bd ff ff call 801000d0 +80104379: 89 c6 mov %eax,%esi + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block +8010437b: 58 pop %eax +8010437c: 5a pop %edx +8010437d: ff 34 9d 6c de 11 80 push -0x7fee2194(,%ebx,4) +80104384: ff 35 64 de 11 80 push 0x8011de64 + for (tail = 0; tail < log.lh.n; tail++) { +8010438a: 83 c3 01 add $0x1,%ebx + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block +8010438d: e8 3e bd ff ff call 801000d0 + memmove(to->data, from->data, BSIZE); +80104392: 83 c4 0c add $0xc,%esp + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block +80104395: 89 c7 mov %eax,%edi + memmove(to->data, from->data, BSIZE); +80104397: 8d 40 5c lea 0x5c(%eax),%eax +8010439a: 68 00 02 00 00 push $0x200 +8010439f: 50 push %eax +801043a0: 8d 46 5c lea 0x5c(%esi),%eax +801043a3: 50 push %eax +801043a4: e8 37 19 00 00 call 80105ce0 + bwrite(to); // write the log +801043a9: 89 34 24 mov %esi,(%esp) +801043ac: e8 ff bd ff ff call 801001b0 + brelse(from); +801043b1: 89 3c 24 mov %edi,(%esp) +801043b4: e8 37 be ff ff call 801001f0 + brelse(to); +801043b9: 89 34 24 mov %esi,(%esp) +801043bc: e8 2f be ff ff call 801001f0 + for (tail = 0; tail < log.lh.n; tail++) { +801043c1: 83 c4 10 add $0x10,%esp +801043c4: 3b 1d 68 de 11 80 cmp 0x8011de68,%ebx +801043ca: 7c 94 jl 80104360 + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit +801043cc: e8 7f fd ff ff call 80104150 + install_trans(); // Now install writes to home locations +801043d1: e8 da fc ff ff call 801040b0 + log.lh.n = 0; +801043d6: c7 05 68 de 11 80 00 movl $0x0,0x8011de68 +801043dd: 00 00 00 + write_head(); // Erase the transaction from the log +801043e0: e8 6b fd ff ff call 80104150 +801043e5: e9 34 ff ff ff jmp 8010431e +801043ea: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + wakeup(&log); +801043f0: 83 ec 0c sub $0xc,%esp +801043f3: 68 20 de 11 80 push $0x8011de20 +801043f8: e8 a3 12 00 00 call 801056a0 + release(&log.lock); +801043fd: c7 04 24 20 de 11 80 movl $0x8011de20,(%esp) +80104404: e8 17 17 00 00 call 80105b20 +80104409: 83 c4 10 add $0x10,%esp +} +8010440c: 8d 65 f4 lea -0xc(%ebp),%esp +8010440f: 5b pop %ebx +80104410: 5e pop %esi +80104411: 5f pop %edi +80104412: 5d pop %ebp +80104413: c3 ret + panic("log.committing"); +80104414: 83 ec 0c sub $0xc,%esp +80104417: 68 c4 8e 10 80 push $0x80108ec4 +8010441c: e8 5f c0 ff ff call 80100480 +80104421: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104428: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010442f: 90 nop + +80104430 : +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ +80104430: 55 push %ebp +80104431: 89 e5 mov %esp,%ebp +80104433: 53 push %ebx +80104434: 83 ec 04 sub $0x4,%esp + int i; + + if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) +80104437: 8b 15 68 de 11 80 mov 0x8011de68,%edx +{ +8010443d: 8b 5d 08 mov 0x8(%ebp),%ebx + if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) +80104440: 83 fa 1d cmp $0x1d,%edx +80104443: 0f 8f 85 00 00 00 jg 801044ce +80104449: a1 58 de 11 80 mov 0x8011de58,%eax +8010444e: 83 e8 01 sub $0x1,%eax +80104451: 39 c2 cmp %eax,%edx +80104453: 7d 79 jge 801044ce + panic("too big a transaction"); + if (log.outstanding < 1) +80104455: a1 5c de 11 80 mov 0x8011de5c,%eax +8010445a: 85 c0 test %eax,%eax +8010445c: 7e 7d jle 801044db + panic("log_write outside of trans"); + + acquire(&log.lock); +8010445e: 83 ec 0c sub $0xc,%esp +80104461: 68 20 de 11 80 push $0x8011de20 +80104466: e8 15 17 00 00 call 80105b80 + for (i = 0; i < log.lh.n; i++) { +8010446b: 8b 15 68 de 11 80 mov 0x8011de68,%edx +80104471: 83 c4 10 add $0x10,%esp +80104474: 85 d2 test %edx,%edx +80104476: 7e 4a jle 801044c2 + if (log.lh.block[i] == b->blockno) // log absorbtion +80104478: 8b 4b 08 mov 0x8(%ebx),%ecx + for (i = 0; i < log.lh.n; i++) { +8010447b: 31 c0 xor %eax,%eax +8010447d: eb 08 jmp 80104487 +8010447f: 90 nop +80104480: 83 c0 01 add $0x1,%eax +80104483: 39 c2 cmp %eax,%edx +80104485: 74 29 je 801044b0 + if (log.lh.block[i] == b->blockno) // log absorbtion +80104487: 39 0c 85 6c de 11 80 cmp %ecx,-0x7fee2194(,%eax,4) +8010448e: 75 f0 jne 80104480 + break; + } + log.lh.block[i] = b->blockno; +80104490: 89 0c 85 6c de 11 80 mov %ecx,-0x7fee2194(,%eax,4) + if (i == log.lh.n) + log.lh.n++; + b->flags |= B_DIRTY; // prevent eviction +80104497: 83 0b 04 orl $0x4,(%ebx) + release(&log.lock); +} +8010449a: 8b 5d fc mov -0x4(%ebp),%ebx + release(&log.lock); +8010449d: c7 45 08 20 de 11 80 movl $0x8011de20,0x8(%ebp) +} +801044a4: c9 leave + release(&log.lock); +801044a5: e9 76 16 00 00 jmp 80105b20 +801044aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + log.lh.block[i] = b->blockno; +801044b0: 89 0c 95 6c de 11 80 mov %ecx,-0x7fee2194(,%edx,4) + log.lh.n++; +801044b7: 83 c2 01 add $0x1,%edx +801044ba: 89 15 68 de 11 80 mov %edx,0x8011de68 +801044c0: eb d5 jmp 80104497 + log.lh.block[i] = b->blockno; +801044c2: 8b 43 08 mov 0x8(%ebx),%eax +801044c5: a3 6c de 11 80 mov %eax,0x8011de6c + if (i == log.lh.n) +801044ca: 75 cb jne 80104497 +801044cc: eb e9 jmp 801044b7 + panic("too big a transaction"); +801044ce: 83 ec 0c sub $0xc,%esp +801044d1: 68 d3 8e 10 80 push $0x80108ed3 +801044d6: e8 a5 bf ff ff call 80100480 + panic("log_write outside of trans"); +801044db: 83 ec 0c sub $0xc,%esp +801044de: 68 e9 8e 10 80 push $0x80108ee9 +801044e3: e8 98 bf ff ff call 80100480 +801044e8: 66 90 xchg %ax,%ax +801044ea: 66 90 xchg %ax,%ax +801044ec: 66 90 xchg %ax,%ax +801044ee: 66 90 xchg %ax,%ax + +801044f0 : + lapicinit(); + mpmain(); +} + +// Common CPU setup code. +static void mpmain(void) { +801044f0: 55 push %ebp +801044f1: 89 e5 mov %esp,%ebp +801044f3: 53 push %ebx +801044f4: 83 ec 04 sub $0x4,%esp + cprintf("cpu%d: starting %d\n", cpuid(), cpuid()); +801044f7: e8 94 09 00 00 call 80104e90 +801044fc: 89 c3 mov %eax,%ebx +801044fe: e8 8d 09 00 00 call 80104e90 +80104503: 83 ec 04 sub $0x4,%esp +80104506: 53 push %ebx +80104507: 50 push %eax +80104508: 68 04 8f 10 80 push $0x80108f04 +8010450d: e8 7e c3 ff ff call 80100890 + idtinit(); // load idt register +80104512: e8 69 2b 00 00 call 80107080 + xchg(&(mycpu()->started), 1); // tell startothers() we're up +80104517: e8 14 09 00 00 call 80104e30 +8010451c: 89 c2 mov %eax,%edx + +static inline uint xchg(volatile uint *addr, uint newval) { + uint result; + + // The + in "+m" denotes a read-modify-write operand. + asm volatile ("lock; xchgl %0, %1" : +8010451e: b8 01 00 00 00 mov $0x1,%eax +80104523: f0 87 82 a0 00 00 00 lock xchg %eax,0xa0(%edx) + scheduler(); // start running processes +8010452a: e8 61 0c 00 00 call 80105190 +8010452f: 90 nop + +80104530 : +static void mpenter(void) { +80104530: 55 push %ebp +80104531: 89 e5 mov %esp,%ebp +80104533: 83 ec 08 sub $0x8,%esp + switchkvm(); +80104536: e8 35 3c 00 00 call 80108170 + seginit(); +8010453b: e8 a0 3b 00 00 call 801080e0 + lapicinit(); +80104540: e8 9b f7 ff ff call 80103ce0 + mpmain(); +80104545: e8 a6 ff ff ff call 801044f0 +8010454a: 66 90 xchg %ax,%ax +8010454c: 66 90 xchg %ax,%ax +8010454e: 66 90 xchg %ax,%ax + +80104550

: +int main(void) { +80104550: 8d 4c 24 04 lea 0x4(%esp),%ecx +80104554: 83 e4 f0 and $0xfffffff0,%esp +80104557: ff 71 fc push -0x4(%ecx) +8010455a: 55 push %ebp +8010455b: 89 e5 mov %esp,%ebp +8010455d: 53 push %ebx +8010455e: 51 push %ecx + kinit1(end, P2V(4 * 1024 * 1024)); // phys page allocator +8010455f: 83 ec 08 sub $0x8,%esp +80104562: 68 00 00 40 80 push $0x80400000 +80104567: 68 50 22 12 80 push $0x80122250 +8010456c: e8 8f f5 ff ff call 80103b00 + kvmalloc(); // kernel page table +80104571: e8 ea 40 00 00 call 80108660 + mpinit(); // detect other processors +80104576: e8 85 01 00 00 call 80104700 + lapicinit(); // interrupt controller +8010457b: e8 60 f7 ff ff call 80103ce0 + seginit(); // segment descriptors +80104580: e8 5b 3b 00 00 call 801080e0 + picinit(); // disable pic +80104585: e8 76 03 00 00 call 80104900 + ioapicinit(); // another interrupt controller +8010458a: e8 31 f3 ff ff call 801038c0 + consoleinit(); // console hardware +8010458f: e8 4c cc ff ff call 801011e0 + uartinit(); // serial port +80104594: e8 d7 2d 00 00 call 80107370 + pinit(); // process table +80104599: e8 72 08 00 00 call 80104e10 + tvinit(); // trap vectors +8010459e: e8 5d 2a 00 00 call 80107000 + binit(); // buffer cache +801045a3: e8 98 ba ff ff call 80100040 + fileinit(); // file table +801045a8: e8 53 dd ff ff call 80102300 + ideinit(); // disk +801045ad: e8 fe f0 ff ff call 801036b0 + + // Write entry code to unused memory at 0x7000. + // The linker has placed the image of entryother.S in + // _binary_entryother_start. + code = P2V(0x7000); + memmove(code, _binary_entryother_start, (uint)_binary_entryother_size); +801045b2: 83 c4 0c add $0xc,%esp +801045b5: 68 7a 00 00 00 push $0x7a +801045ba: 68 8c c4 10 80 push $0x8010c48c +801045bf: 68 00 70 00 80 push $0x80007000 +801045c4: e8 17 17 00 00 call 80105ce0 + + for (c = cpus; c < cpus + ncpu; c++) { +801045c9: 83 c4 10 add $0x10,%esp +801045cc: 69 05 04 df 11 80 b0 imul $0xb0,0x8011df04,%eax +801045d3: 00 00 00 +801045d6: 05 20 df 11 80 add $0x8011df20,%eax +801045db: 3d 20 df 11 80 cmp $0x8011df20,%eax +801045e0: 76 7e jbe 80104660 +801045e2: bb 20 df 11 80 mov $0x8011df20,%ebx +801045e7: eb 20 jmp 80104609 +801045e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801045f0: 69 05 04 df 11 80 b0 imul $0xb0,0x8011df04,%eax +801045f7: 00 00 00 +801045fa: 81 c3 b0 00 00 00 add $0xb0,%ebx +80104600: 05 20 df 11 80 add $0x8011df20,%eax +80104605: 39 c3 cmp %eax,%ebx +80104607: 73 57 jae 80104660 + if (c == mycpu()) { // We've started already. +80104609: e8 22 08 00 00 call 80104e30 +8010460e: 39 c3 cmp %eax,%ebx +80104610: 74 de je 801045f0 + } + + // Tell entryother.S what stack to use, where to enter, and what + // pgdir to use. We cannot use kpgdir yet, because the AP processor + // is running in low memory, so we use entrypgdir for the APs too. + stack = kalloc(); +80104612: e8 59 f5 ff ff call 80103b70 + *(void**)(code - 4) = stack + KSTACKSIZE; + *(void(**)(void))(code - 8) = mpenter; + *(int**)(code - 12) = (void *) V2P(entrypgdir); + + lapicstartap(c->apicid, V2P(code)); +80104617: 83 ec 08 sub $0x8,%esp + *(void(**)(void))(code - 8) = mpenter; +8010461a: c7 05 f8 6f 00 80 30 movl $0x80104530,0x80006ff8 +80104621: 45 10 80 + *(int**)(code - 12) = (void *) V2P(entrypgdir); +80104624: c7 05 f4 6f 00 80 00 movl $0x10b000,0x80006ff4 +8010462b: b0 10 00 + *(void**)(code - 4) = stack + KSTACKSIZE; +8010462e: 05 00 10 00 00 add $0x1000,%eax +80104633: a3 fc 6f 00 80 mov %eax,0x80006ffc + lapicstartap(c->apicid, V2P(code)); +80104638: 0f b6 03 movzbl (%ebx),%eax +8010463b: 68 00 70 00 00 push $0x7000 +80104640: 50 push %eax +80104641: e8 ea f7 ff ff call 80103e30 + + // wait for cpu to finish mpmain() + while (c->started == 0) { +80104646: 83 c4 10 add $0x10,%esp +80104649: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104650: 8b 83 a0 00 00 00 mov 0xa0(%ebx),%eax +80104656: 85 c0 test %eax,%eax +80104658: 74 f6 je 80104650 +8010465a: eb 94 jmp 801045f0 +8010465c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + kinit2(P2V(4 * 1024 * 1024), P2V(PHYSTOP)); // must come after startothers() +80104660: 83 ec 08 sub $0x8,%esp +80104663: 68 00 00 00 8e push $0x8e000000 +80104668: 68 00 00 40 80 push $0x80400000 +8010466d: e8 2e f4 ff ff call 80103aa0 + userinit(); // first user process +80104672: e8 69 08 00 00 call 80104ee0 + mpmain(); // finish this processor's setup +80104677: e8 74 fe ff ff call 801044f0 +8010467c: 66 90 xchg %ax,%ax +8010467e: 66 90 xchg %ax,%ax + +80104680 : + } + return sum; +} + +// Look for an MP structure in the len bytes at addr. +static struct mp*mpsearch1(uint a, int len) { +80104680: 55 push %ebp +80104681: 89 e5 mov %esp,%ebp +80104683: 57 push %edi +80104684: 56 push %esi + uchar *e, *p, *addr; + + addr = P2V(a); +80104685: 8d b0 00 00 00 80 lea -0x80000000(%eax),%esi +static struct mp*mpsearch1(uint a, int len) { +8010468b: 53 push %ebx + e = addr + len; +8010468c: 8d 1c 16 lea (%esi,%edx,1),%ebx +static struct mp*mpsearch1(uint a, int len) { +8010468f: 83 ec 0c sub $0xc,%esp + for (p = addr; p < e; p += sizeof(struct mp)) { +80104692: 39 de cmp %ebx,%esi +80104694: 72 10 jb 801046a6 +80104696: eb 50 jmp 801046e8 +80104698: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010469f: 90 nop +801046a0: 89 fe mov %edi,%esi +801046a2: 39 fb cmp %edi,%ebx +801046a4: 76 42 jbe 801046e8 + if (memcmp(p, "_MP_", 4) == 0 && sum(p, sizeof(struct mp)) == 0) { +801046a6: 83 ec 04 sub $0x4,%esp +801046a9: 8d 7e 10 lea 0x10(%esi),%edi +801046ac: 6a 04 push $0x4 +801046ae: 68 18 8f 10 80 push $0x80108f18 +801046b3: 56 push %esi +801046b4: e8 d7 15 00 00 call 80105c90 +801046b9: 83 c4 10 add $0x10,%esp +801046bc: 85 c0 test %eax,%eax +801046be: 75 e0 jne 801046a0 +801046c0: 89 f2 mov %esi,%edx +801046c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + sum += addr[i]; +801046c8: 0f b6 0a movzbl (%edx),%ecx + for (i = 0; i < len; i++) { +801046cb: 83 c2 01 add $0x1,%edx + sum += addr[i]; +801046ce: 01 c8 add %ecx,%eax + for (i = 0; i < len; i++) { +801046d0: 39 fa cmp %edi,%edx +801046d2: 75 f4 jne 801046c8 + if (memcmp(p, "_MP_", 4) == 0 && sum(p, sizeof(struct mp)) == 0) { +801046d4: 84 c0 test %al,%al +801046d6: 75 c8 jne 801046a0 + return (struct mp*)p; + } + } + return 0; +} +801046d8: 8d 65 f4 lea -0xc(%ebp),%esp +801046db: 89 f0 mov %esi,%eax +801046dd: 5b pop %ebx +801046de: 5e pop %esi +801046df: 5f pop %edi +801046e0: 5d pop %ebp +801046e1: c3 ret +801046e2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +801046e8: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +801046eb: 31 f6 xor %esi,%esi +} +801046ed: 5b pop %ebx +801046ee: 89 f0 mov %esi,%eax +801046f0: 5e pop %esi +801046f1: 5f pop %edi +801046f2: 5d pop %ebp +801046f3: c3 ret +801046f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801046fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801046ff: 90 nop + +80104700 : + } + *pmp = mp; + return conf; +} + +void mpinit(void) { +80104700: 55 push %ebp +80104701: 89 e5 mov %esp,%ebp +80104703: 57 push %edi +80104704: 56 push %esi +80104705: 53 push %ebx +80104706: 83 ec 1c sub $0x1c,%esp + if ((p = ((bda[0x0F] << 8) | bda[0x0E]) << 4)) { +80104709: 0f b6 05 0f 04 00 80 movzbl 0x8000040f,%eax +80104710: 0f b6 15 0e 04 00 80 movzbl 0x8000040e,%edx +80104717: c1 e0 08 shl $0x8,%eax +8010471a: 09 d0 or %edx,%eax +8010471c: c1 e0 04 shl $0x4,%eax +8010471f: 75 1b jne 8010473c + p = ((bda[0x14] << 8) | bda[0x13]) * 1024; +80104721: 0f b6 05 14 04 00 80 movzbl 0x80000414,%eax +80104728: 0f b6 15 13 04 00 80 movzbl 0x80000413,%edx +8010472f: c1 e0 08 shl $0x8,%eax +80104732: 09 d0 or %edx,%eax +80104734: c1 e0 0a shl $0xa,%eax + if ((mp = mpsearch1(p - 1024, 1024))) { +80104737: 2d 00 04 00 00 sub $0x400,%eax + if ((mp = mpsearch1(p, 1024))) { +8010473c: ba 00 04 00 00 mov $0x400,%edx +80104741: e8 3a ff ff ff call 80104680 +80104746: 89 c3 mov %eax,%ebx +80104748: 85 c0 test %eax,%eax +8010474a: 0f 84 40 01 00 00 je 80104890 + if ((mp = mpsearch()) == 0 || mp->physaddr == 0) { +80104750: 8b 73 04 mov 0x4(%ebx),%esi +80104753: 85 f6 test %esi,%esi +80104755: 0f 84 25 01 00 00 je 80104880 + if (memcmp(conf, "PCMP", 4) != 0) { +8010475b: 83 ec 04 sub $0x4,%esp + conf = (struct mpconf*) P2V((uint) mp->physaddr); +8010475e: 8d 86 00 00 00 80 lea -0x80000000(%esi),%eax + if (memcmp(conf, "PCMP", 4) != 0) { +80104764: 6a 04 push $0x4 +80104766: 68 1d 8f 10 80 push $0x80108f1d +8010476b: 50 push %eax + conf = (struct mpconf*) P2V((uint) mp->physaddr); +8010476c: 89 45 e4 mov %eax,-0x1c(%ebp) + if (memcmp(conf, "PCMP", 4) != 0) { +8010476f: e8 1c 15 00 00 call 80105c90 +80104774: 83 c4 10 add $0x10,%esp +80104777: 85 c0 test %eax,%eax +80104779: 0f 85 01 01 00 00 jne 80104880 + if (conf->version != 1 && conf->version != 4) { +8010477f: 0f b6 86 06 00 00 80 movzbl -0x7ffffffa(%esi),%eax +80104786: 3c 01 cmp $0x1,%al +80104788: 74 08 je 80104792 +8010478a: 3c 04 cmp $0x4,%al +8010478c: 0f 85 ee 00 00 00 jne 80104880 + if (sum((uchar*)conf, conf->length) != 0) { +80104792: 0f b7 96 04 00 00 80 movzwl -0x7ffffffc(%esi),%edx + for (i = 0; i < len; i++) { +80104799: 66 85 d2 test %dx,%dx +8010479c: 74 22 je 801047c0 +8010479e: 8d 3c 32 lea (%edx,%esi,1),%edi +801047a1: 89 f0 mov %esi,%eax + sum = 0; +801047a3: 31 d2 xor %edx,%edx +801047a5: 8d 76 00 lea 0x0(%esi),%esi + sum += addr[i]; +801047a8: 0f b6 88 00 00 00 80 movzbl -0x80000000(%eax),%ecx + for (i = 0; i < len; i++) { +801047af: 83 c0 01 add $0x1,%eax + sum += addr[i]; +801047b2: 01 ca add %ecx,%edx + for (i = 0; i < len; i++) { +801047b4: 39 c7 cmp %eax,%edi +801047b6: 75 f0 jne 801047a8 + if (sum((uchar*)conf, conf->length) != 0) { +801047b8: 84 d2 test %dl,%dl +801047ba: 0f 85 c0 00 00 00 jne 80104880 + + if ((conf = mpconfig(&mp)) == 0) { + panic("Expect to run on an SMP"); + } + ismp = 1; + lapic = (uint*)conf->lapicaddr; +801047c0: 8b 86 24 00 00 80 mov -0x7fffffdc(%esi),%eax +801047c6: a3 00 de 11 80 mov %eax,0x8011de00 + for (p = (uchar*)(conf + 1), e = (uchar*)conf + conf->length; p < e;) { +801047cb: 0f b7 96 04 00 00 80 movzwl -0x7ffffffc(%esi),%edx +801047d2: 8d 86 2c 00 00 80 lea -0x7fffffd4(%esi),%eax + ismp = 1; +801047d8: be 01 00 00 00 mov $0x1,%esi + for (p = (uchar*)(conf + 1), e = (uchar*)conf + conf->length; p < e;) { +801047dd: 03 55 e4 add -0x1c(%ebp),%edx +801047e0: 89 5d e4 mov %ebx,-0x1c(%ebp) +801047e3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801047e7: 90 nop +801047e8: 39 d0 cmp %edx,%eax +801047ea: 73 15 jae 80104801 + switch (*p) { +801047ec: 0f b6 08 movzbl (%eax),%ecx +801047ef: 80 f9 02 cmp $0x2,%cl +801047f2: 74 4c je 80104840 +801047f4: 77 3a ja 80104830 +801047f6: 84 c9 test %cl,%cl +801047f8: 74 56 je 80104850 + p += sizeof(struct mpioapic); + continue; + case MPBUS: + case MPIOINTR: + case MPLINTR: + p += 8; +801047fa: 83 c0 08 add $0x8,%eax + for (p = (uchar*)(conf + 1), e = (uchar*)conf + conf->length; p < e;) { +801047fd: 39 d0 cmp %edx,%eax +801047ff: 72 eb jb 801047ec + default: + ismp = 0; + break; + } + } + if (!ismp) { +80104801: 8b 5d e4 mov -0x1c(%ebp),%ebx +80104804: 85 f6 test %esi,%esi +80104806: 0f 84 d9 00 00 00 je 801048e5 + panic("Didn't find a suitable machine"); + } + + if (mp->imcrp) { +8010480c: 80 7b 0c 00 cmpb $0x0,0xc(%ebx) +80104810: 74 15 je 80104827 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80104812: b8 70 00 00 00 mov $0x70,%eax +80104817: ba 22 00 00 00 mov $0x22,%edx +8010481c: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +8010481d: ba 23 00 00 00 mov $0x23,%edx +80104822: ec in (%dx),%al + // Bochs doesn't support IMCR, so this doesn't run on Bochs. + // But it would on real hardware. + outb(0x22, 0x70); // Select IMCR + outb(0x23, inb(0x23) | 1); // Mask external interrupts. +80104823: 83 c8 01 or $0x1,%eax + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80104826: ee out %al,(%dx) + } +} +80104827: 8d 65 f4 lea -0xc(%ebp),%esp +8010482a: 5b pop %ebx +8010482b: 5e pop %esi +8010482c: 5f pop %edi +8010482d: 5d pop %ebp +8010482e: c3 ret +8010482f: 90 nop + switch (*p) { +80104830: 83 e9 03 sub $0x3,%ecx +80104833: 80 f9 01 cmp $0x1,%cl +80104836: 76 c2 jbe 801047fa +80104838: 31 f6 xor %esi,%esi +8010483a: eb ac jmp 801047e8 +8010483c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ioapicid = ioapic->apicno; +80104840: 0f b6 48 01 movzbl 0x1(%eax),%ecx + p += sizeof(struct mpioapic); +80104844: 83 c0 08 add $0x8,%eax + ioapicid = ioapic->apicno; +80104847: 88 0d 00 df 11 80 mov %cl,0x8011df00 + continue; +8010484d: eb 99 jmp 801047e8 +8010484f: 90 nop + if (ncpu < NCPU) { +80104850: 8b 0d 04 df 11 80 mov 0x8011df04,%ecx +80104856: 83 f9 07 cmp $0x7,%ecx +80104859: 7f 19 jg 80104874 + cpus[ncpu].apicid = proc->apicid; // apicid may differ from ncpu +8010485b: 69 f9 b0 00 00 00 imul $0xb0,%ecx,%edi +80104861: 0f b6 58 01 movzbl 0x1(%eax),%ebx + ncpu++; +80104865: 83 c1 01 add $0x1,%ecx +80104868: 89 0d 04 df 11 80 mov %ecx,0x8011df04 + cpus[ncpu].apicid = proc->apicid; // apicid may differ from ncpu +8010486e: 88 9f 20 df 11 80 mov %bl,-0x7fee20e0(%edi) + p += sizeof(struct mpproc); +80104874: 83 c0 14 add $0x14,%eax + continue; +80104877: e9 6c ff ff ff jmp 801047e8 +8010487c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + panic("Expect to run on an SMP"); +80104880: 83 ec 0c sub $0xc,%esp +80104883: 68 22 8f 10 80 push $0x80108f22 +80104888: e8 f3 bb ff ff call 80100480 +8010488d: 8d 76 00 lea 0x0(%esi),%esi +void mpinit(void) { +80104890: bb 00 00 0f 80 mov $0x800f0000,%ebx +80104895: eb 13 jmp 801048aa +80104897: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010489e: 66 90 xchg %ax,%ax + for (p = addr; p < e; p += sizeof(struct mp)) { +801048a0: 89 f3 mov %esi,%ebx +801048a2: 81 fe 00 00 10 80 cmp $0x80100000,%esi +801048a8: 74 d6 je 80104880 + if (memcmp(p, "_MP_", 4) == 0 && sum(p, sizeof(struct mp)) == 0) { +801048aa: 83 ec 04 sub $0x4,%esp +801048ad: 8d 73 10 lea 0x10(%ebx),%esi +801048b0: 6a 04 push $0x4 +801048b2: 68 18 8f 10 80 push $0x80108f18 +801048b7: 53 push %ebx +801048b8: e8 d3 13 00 00 call 80105c90 +801048bd: 83 c4 10 add $0x10,%esp +801048c0: 85 c0 test %eax,%eax +801048c2: 75 dc jne 801048a0 +801048c4: 89 da mov %ebx,%edx +801048c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801048cd: 8d 76 00 lea 0x0(%esi),%esi + sum += addr[i]; +801048d0: 0f b6 0a movzbl (%edx),%ecx + for (i = 0; i < len; i++) { +801048d3: 83 c2 01 add $0x1,%edx + sum += addr[i]; +801048d6: 01 c8 add %ecx,%eax + for (i = 0; i < len; i++) { +801048d8: 39 d6 cmp %edx,%esi +801048da: 75 f4 jne 801048d0 + if (memcmp(p, "_MP_", 4) == 0 && sum(p, sizeof(struct mp)) == 0) { +801048dc: 84 c0 test %al,%al +801048de: 75 c0 jne 801048a0 +801048e0: e9 6b fe ff ff jmp 80104750 + panic("Didn't find a suitable machine"); +801048e5: 83 ec 0c sub $0xc,%esp +801048e8: 68 3c 8f 10 80 push $0x80108f3c +801048ed: e8 8e bb ff ff call 80100480 +801048f2: 66 90 xchg %ax,%ax +801048f4: 66 90 xchg %ax,%ax +801048f6: 66 90 xchg %ax,%ax +801048f8: 66 90 xchg %ax,%ax +801048fa: 66 90 xchg %ax,%ax +801048fc: 66 90 xchg %ax,%ax +801048fe: 66 90 xchg %ax,%ax + +80104900 : +80104900: b8 ff ff ff ff mov $0xffffffff,%eax +80104905: ba 21 00 00 00 mov $0x21,%edx +8010490a: ee out %al,(%dx) +8010490b: ba a1 00 00 00 mov $0xa1,%edx +80104910: ee out %al,(%dx) +// Don't use the 8259A interrupt controllers. Xv6 assumes SMP hardware. +void picinit(void) { + // mask all interrupts + outb(IO_PIC1 + 1, 0xFF); + outb(IO_PIC2 + 1, 0xFF); +} +80104911: c3 ret +80104912: 66 90 xchg %ax,%ax +80104914: 66 90 xchg %ax,%ax +80104916: 66 90 xchg %ax,%ax +80104918: 66 90 xchg %ax,%ax +8010491a: 66 90 xchg %ax,%ax +8010491c: 66 90 xchg %ax,%ax +8010491e: 66 90 xchg %ax,%ax + +80104920 : + uint nwrite; // number of bytes written + int readopen; // read fd is still open + int writeopen; // write fd is still open +}; + +void cleanuppipealloc(struct pipe *p, struct file **f0, struct file **f1) { +80104920: 55 push %ebp +80104921: 89 e5 mov %esp,%ebp +80104923: 56 push %esi +80104924: 8b 45 08 mov 0x8(%ebp),%eax +80104927: 8b 75 0c mov 0xc(%ebp),%esi +8010492a: 53 push %ebx +8010492b: 8b 5d 10 mov 0x10(%ebp),%ebx + if (p) { +8010492e: 85 c0 test %eax,%eax +80104930: 74 0c je 8010493e + kfree((char*)p); +80104932: 83 ec 0c sub $0xc,%esp +80104935: 50 push %eax +80104936: e8 75 f0 ff ff call 801039b0 +8010493b: 83 c4 10 add $0x10,%esp + } + if (*f0) { +8010493e: 8b 06 mov (%esi),%eax +80104940: 85 c0 test %eax,%eax +80104942: 74 0c je 80104950 + fileclose(*f0); +80104944: 83 ec 0c sub $0xc,%esp +80104947: 50 push %eax +80104948: e8 93 da ff ff call 801023e0 +8010494d: 83 c4 10 add $0x10,%esp + } + if (*f1) { +80104950: 8b 03 mov (%ebx),%eax +80104952: 85 c0 test %eax,%eax +80104954: 74 12 je 80104968 + fileclose(*f1); +80104956: 89 45 08 mov %eax,0x8(%ebp) + } +} +80104959: 8d 65 f8 lea -0x8(%ebp),%esp +8010495c: 5b pop %ebx +8010495d: 5e pop %esi +8010495e: 5d pop %ebp + fileclose(*f1); +8010495f: e9 7c da ff ff jmp 801023e0 +80104964: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +} +80104968: 8d 65 f8 lea -0x8(%ebp),%esp +8010496b: 5b pop %ebx +8010496c: 5e pop %esi +8010496d: 5d pop %ebp +8010496e: c3 ret +8010496f: 90 nop + +80104970 : + +int pipealloc(struct file **f0, struct file **f1) { +80104970: 55 push %ebp +80104971: 89 e5 mov %esp,%ebp +80104973: 57 push %edi +80104974: 56 push %esi +80104975: 53 push %ebx +80104976: 83 ec 0c sub $0xc,%esp +80104979: 8b 75 08 mov 0x8(%ebp),%esi +8010497c: 8b 7d 0c mov 0xc(%ebp),%edi + struct pipe *p; + + p = 0; + *f0 = *f1 = 0; +8010497f: c7 07 00 00 00 00 movl $0x0,(%edi) +80104985: c7 06 00 00 00 00 movl $0x0,(%esi) + if ((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) { +8010498b: e8 90 d9 ff ff call 80102320 +80104990: 89 06 mov %eax,(%esi) +80104992: 85 c0 test %eax,%eax +80104994: 0f 84 a5 00 00 00 je 80104a3f +8010499a: e8 81 d9 ff ff call 80102320 +8010499f: 89 07 mov %eax,(%edi) +801049a1: 85 c0 test %eax,%eax +801049a3: 0f 84 84 00 00 00 je 80104a2d + cleanuppipealloc(p, f0, f1); + return -1; + } + if ((p = (struct pipe*)kalloc()) == 0) { +801049a9: e8 c2 f1 ff ff call 80103b70 +801049ae: 89 c3 mov %eax,%ebx +801049b0: 85 c0 test %eax,%eax +801049b2: 0f 84 a0 00 00 00 je 80104a58 + cleanuppipealloc(p, f0, f1); + return -1; + } + p->readopen = 1; +801049b8: c7 80 3c 02 00 00 01 movl $0x1,0x23c(%eax) +801049bf: 00 00 00 + p->writeopen = 1; + p->nwrite = 0; + p->nread = 0; + initlock(&p->lock, "pipe"); +801049c2: 83 ec 08 sub $0x8,%esp + p->writeopen = 1; +801049c5: c7 80 40 02 00 00 01 movl $0x1,0x240(%eax) +801049cc: 00 00 00 + p->nwrite = 0; +801049cf: c7 80 38 02 00 00 00 movl $0x0,0x238(%eax) +801049d6: 00 00 00 + p->nread = 0; +801049d9: c7 80 34 02 00 00 00 movl $0x0,0x234(%eax) +801049e0: 00 00 00 + initlock(&p->lock, "pipe"); +801049e3: 68 5b 8f 10 80 push $0x80108f5b +801049e8: 50 push %eax +801049e9: e8 c2 0f 00 00 call 801059b0 + (*f0)->type = FD_PIPE; +801049ee: 8b 06 mov (%esi),%eax + (*f0)->pipe = p; + (*f1)->type = FD_PIPE; + (*f1)->readable = 0; + (*f1)->writable = 1; + (*f1)->pipe = p; + return 0; +801049f0: 83 c4 10 add $0x10,%esp + (*f0)->type = FD_PIPE; +801049f3: c7 00 01 00 00 00 movl $0x1,(%eax) + (*f0)->readable = 1; +801049f9: 8b 06 mov (%esi),%eax +801049fb: c6 40 08 01 movb $0x1,0x8(%eax) + (*f0)->writable = 0; +801049ff: 8b 06 mov (%esi),%eax +80104a01: c6 40 09 00 movb $0x0,0x9(%eax) + (*f0)->pipe = p; +80104a05: 8b 06 mov (%esi),%eax +80104a07: 89 58 0c mov %ebx,0xc(%eax) + (*f1)->type = FD_PIPE; +80104a0a: 8b 07 mov (%edi),%eax +80104a0c: c7 00 01 00 00 00 movl $0x1,(%eax) + (*f1)->readable = 0; +80104a12: 8b 07 mov (%edi),%eax +80104a14: c6 40 08 00 movb $0x0,0x8(%eax) + (*f1)->writable = 1; +80104a18: 8b 07 mov (%edi),%eax +80104a1a: c6 40 09 01 movb $0x1,0x9(%eax) + (*f1)->pipe = p; +80104a1e: 8b 07 mov (%edi),%eax +80104a20: 89 58 0c mov %ebx,0xc(%eax) + return 0; +80104a23: 31 c0 xor %eax,%eax +} +80104a25: 8d 65 f4 lea -0xc(%ebp),%esp +80104a28: 5b pop %ebx +80104a29: 5e pop %esi +80104a2a: 5f pop %edi +80104a2b: 5d pop %ebp +80104a2c: c3 ret + if (*f0) { +80104a2d: 8b 06 mov (%esi),%eax +80104a2f: 85 c0 test %eax,%eax +80104a31: 74 1e je 80104a51 + fileclose(*f0); +80104a33: 83 ec 0c sub $0xc,%esp +80104a36: 50 push %eax +80104a37: e8 a4 d9 ff ff call 801023e0 +80104a3c: 83 c4 10 add $0x10,%esp + if (*f1) { +80104a3f: 8b 07 mov (%edi),%eax +80104a41: 85 c0 test %eax,%eax +80104a43: 74 0c je 80104a51 + fileclose(*f1); +80104a45: 83 ec 0c sub $0xc,%esp +80104a48: 50 push %eax +80104a49: e8 92 d9 ff ff call 801023e0 +80104a4e: 83 c4 10 add $0x10,%esp + return -1; +80104a51: b8 ff ff ff ff mov $0xffffffff,%eax +80104a56: eb cd jmp 80104a25 + if (*f0) { +80104a58: 8b 06 mov (%esi),%eax +80104a5a: 85 c0 test %eax,%eax +80104a5c: 75 d5 jne 80104a33 +80104a5e: eb df jmp 80104a3f + +80104a60 : + +void pipeclose(struct pipe *p, int writable) { +80104a60: 55 push %ebp +80104a61: 89 e5 mov %esp,%ebp +80104a63: 56 push %esi +80104a64: 53 push %ebx +80104a65: 8b 5d 08 mov 0x8(%ebp),%ebx +80104a68: 8b 75 0c mov 0xc(%ebp),%esi + acquire(&p->lock); +80104a6b: 83 ec 0c sub $0xc,%esp +80104a6e: 53 push %ebx +80104a6f: e8 0c 11 00 00 call 80105b80 + if (writable) { +80104a74: 83 c4 10 add $0x10,%esp +80104a77: 85 f6 test %esi,%esi +80104a79: 74 65 je 80104ae0 + p->writeopen = 0; + wakeup(&p->nread); +80104a7b: 83 ec 0c sub $0xc,%esp +80104a7e: 8d 83 34 02 00 00 lea 0x234(%ebx),%eax + p->writeopen = 0; +80104a84: c7 83 40 02 00 00 00 movl $0x0,0x240(%ebx) +80104a8b: 00 00 00 + wakeup(&p->nread); +80104a8e: 50 push %eax +80104a8f: e8 0c 0c 00 00 call 801056a0 +80104a94: 83 c4 10 add $0x10,%esp + } + else { + p->readopen = 0; + wakeup(&p->nwrite); + } + if (p->readopen == 0 && p->writeopen == 0) { +80104a97: 8b 93 3c 02 00 00 mov 0x23c(%ebx),%edx +80104a9d: 85 d2 test %edx,%edx +80104a9f: 75 0a jne 80104aab +80104aa1: 8b 83 40 02 00 00 mov 0x240(%ebx),%eax +80104aa7: 85 c0 test %eax,%eax +80104aa9: 74 15 je 80104ac0 + release(&p->lock); + kfree((char*)p); + } + else { + release(&p->lock); +80104aab: 89 5d 08 mov %ebx,0x8(%ebp) + } +} +80104aae: 8d 65 f8 lea -0x8(%ebp),%esp +80104ab1: 5b pop %ebx +80104ab2: 5e pop %esi +80104ab3: 5d pop %ebp + release(&p->lock); +80104ab4: e9 67 10 00 00 jmp 80105b20 +80104ab9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + release(&p->lock); +80104ac0: 83 ec 0c sub $0xc,%esp +80104ac3: 53 push %ebx +80104ac4: e8 57 10 00 00 call 80105b20 + kfree((char*)p); +80104ac9: 89 5d 08 mov %ebx,0x8(%ebp) +80104acc: 83 c4 10 add $0x10,%esp +} +80104acf: 8d 65 f8 lea -0x8(%ebp),%esp +80104ad2: 5b pop %ebx +80104ad3: 5e pop %esi +80104ad4: 5d pop %ebp + kfree((char*)p); +80104ad5: e9 d6 ee ff ff jmp 801039b0 +80104ada: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + wakeup(&p->nwrite); +80104ae0: 83 ec 0c sub $0xc,%esp +80104ae3: 8d 83 38 02 00 00 lea 0x238(%ebx),%eax + p->readopen = 0; +80104ae9: c7 83 3c 02 00 00 00 movl $0x0,0x23c(%ebx) +80104af0: 00 00 00 + wakeup(&p->nwrite); +80104af3: 50 push %eax +80104af4: e8 a7 0b 00 00 call 801056a0 +80104af9: 83 c4 10 add $0x10,%esp +80104afc: eb 99 jmp 80104a97 +80104afe: 66 90 xchg %ax,%ax + +80104b00 : + +int pipewrite(struct pipe *p, char *addr, int n) { +80104b00: 55 push %ebp +80104b01: 89 e5 mov %esp,%ebp +80104b03: 57 push %edi +80104b04: 56 push %esi +80104b05: 53 push %ebx +80104b06: 83 ec 28 sub $0x28,%esp +80104b09: 8b 5d 08 mov 0x8(%ebp),%ebx + int i; + + acquire(&p->lock); +80104b0c: 53 push %ebx +80104b0d: e8 6e 10 00 00 call 80105b80 + for (i = 0; i < n; i++) { +80104b12: 8b 45 10 mov 0x10(%ebp),%eax +80104b15: 83 c4 10 add $0x10,%esp +80104b18: 85 c0 test %eax,%eax +80104b1a: 0f 8e c0 00 00 00 jle 80104be0 +80104b20: 8b 45 0c mov 0xc(%ebp),%eax + while (p->nwrite == p->nread + PIPESIZE) { //DOC: pipewrite-full +80104b23: 8b 8b 38 02 00 00 mov 0x238(%ebx),%ecx + if (p->readopen == 0 || myproc()->killed) { + release(&p->lock); + return -1; + } + wakeup(&p->nread); +80104b29: 8d bb 34 02 00 00 lea 0x234(%ebx),%edi +80104b2f: 89 45 e4 mov %eax,-0x1c(%ebp) +80104b32: 03 45 10 add 0x10(%ebp),%eax +80104b35: 89 45 e0 mov %eax,-0x20(%ebp) + while (p->nwrite == p->nread + PIPESIZE) { //DOC: pipewrite-full +80104b38: 8b 83 34 02 00 00 mov 0x234(%ebx),%eax + sleep(&p->nwrite, &p->lock); //DOC: pipewrite-sleep +80104b3e: 8d b3 38 02 00 00 lea 0x238(%ebx),%esi + while (p->nwrite == p->nread + PIPESIZE) { //DOC: pipewrite-full +80104b44: 89 ca mov %ecx,%edx +80104b46: 05 00 02 00 00 add $0x200,%eax +80104b4b: 39 c1 cmp %eax,%ecx +80104b4d: 74 3f je 80104b8e +80104b4f: eb 67 jmp 80104bb8 +80104b51: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (p->readopen == 0 || myproc()->killed) { +80104b58: e8 53 03 00 00 call 80104eb0 +80104b5d: 8b 48 24 mov 0x24(%eax),%ecx +80104b60: 85 c9 test %ecx,%ecx +80104b62: 75 34 jne 80104b98 + wakeup(&p->nread); +80104b64: 83 ec 0c sub $0xc,%esp +80104b67: 57 push %edi +80104b68: e8 33 0b 00 00 call 801056a0 + sleep(&p->nwrite, &p->lock); //DOC: pipewrite-sleep +80104b6d: 58 pop %eax +80104b6e: 5a pop %edx +80104b6f: 53 push %ebx +80104b70: 56 push %esi +80104b71: e8 6a 0a 00 00 call 801055e0 + while (p->nwrite == p->nread + PIPESIZE) { //DOC: pipewrite-full +80104b76: 8b 83 34 02 00 00 mov 0x234(%ebx),%eax +80104b7c: 8b 93 38 02 00 00 mov 0x238(%ebx),%edx +80104b82: 83 c4 10 add $0x10,%esp +80104b85: 05 00 02 00 00 add $0x200,%eax +80104b8a: 39 c2 cmp %eax,%edx +80104b8c: 75 2a jne 80104bb8 + if (p->readopen == 0 || myproc()->killed) { +80104b8e: 8b 83 3c 02 00 00 mov 0x23c(%ebx),%eax +80104b94: 85 c0 test %eax,%eax +80104b96: 75 c0 jne 80104b58 + release(&p->lock); +80104b98: 83 ec 0c sub $0xc,%esp +80104b9b: 53 push %ebx +80104b9c: e8 7f 0f 00 00 call 80105b20 + return -1; +80104ba1: 83 c4 10 add $0x10,%esp +80104ba4: b8 ff ff ff ff mov $0xffffffff,%eax + p->data[p->nwrite++ % PIPESIZE] = addr[i]; + } + wakeup(&p->nread); //DOC: pipewrite-wakeup1 + release(&p->lock); + return n; +} +80104ba9: 8d 65 f4 lea -0xc(%ebp),%esp +80104bac: 5b pop %ebx +80104bad: 5e pop %esi +80104bae: 5f pop %edi +80104baf: 5d pop %ebp +80104bb0: c3 ret +80104bb1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + p->data[p->nwrite++ % PIPESIZE] = addr[i]; +80104bb8: 8b 75 e4 mov -0x1c(%ebp),%esi +80104bbb: 8d 4a 01 lea 0x1(%edx),%ecx +80104bbe: 81 e2 ff 01 00 00 and $0x1ff,%edx +80104bc4: 89 8b 38 02 00 00 mov %ecx,0x238(%ebx) +80104bca: 0f b6 06 movzbl (%esi),%eax + for (i = 0; i < n; i++) { +80104bcd: 83 c6 01 add $0x1,%esi +80104bd0: 89 75 e4 mov %esi,-0x1c(%ebp) + p->data[p->nwrite++ % PIPESIZE] = addr[i]; +80104bd3: 88 44 13 34 mov %al,0x34(%ebx,%edx,1) + for (i = 0; i < n; i++) { +80104bd7: 3b 75 e0 cmp -0x20(%ebp),%esi +80104bda: 0f 85 58 ff ff ff jne 80104b38 + wakeup(&p->nread); //DOC: pipewrite-wakeup1 +80104be0: 83 ec 0c sub $0xc,%esp +80104be3: 8d 83 34 02 00 00 lea 0x234(%ebx),%eax +80104be9: 50 push %eax +80104bea: e8 b1 0a 00 00 call 801056a0 + release(&p->lock); +80104bef: 89 1c 24 mov %ebx,(%esp) +80104bf2: e8 29 0f 00 00 call 80105b20 + return n; +80104bf7: 8b 45 10 mov 0x10(%ebp),%eax +80104bfa: 83 c4 10 add $0x10,%esp +80104bfd: eb aa jmp 80104ba9 +80104bff: 90 nop + +80104c00 : + +int piperead(struct pipe *p, char *addr, int n) { +80104c00: 55 push %ebp +80104c01: 89 e5 mov %esp,%ebp +80104c03: 57 push %edi +80104c04: 56 push %esi +80104c05: 53 push %ebx +80104c06: 83 ec 18 sub $0x18,%esp +80104c09: 8b 75 08 mov 0x8(%ebp),%esi +80104c0c: 8b 7d 0c mov 0xc(%ebp),%edi + int i; + + acquire(&p->lock); +80104c0f: 56 push %esi +80104c10: 8d 9e 34 02 00 00 lea 0x234(%esi),%ebx +80104c16: e8 65 0f 00 00 call 80105b80 + while (p->nread == p->nwrite && p->writeopen) { //DOC: pipe-empty +80104c1b: 8b 86 34 02 00 00 mov 0x234(%esi),%eax +80104c21: 83 c4 10 add $0x10,%esp +80104c24: 39 86 38 02 00 00 cmp %eax,0x238(%esi) +80104c2a: 74 2f je 80104c5b +80104c2c: eb 37 jmp 80104c65 +80104c2e: 66 90 xchg %ax,%ax + if (myproc()->killed) { +80104c30: e8 7b 02 00 00 call 80104eb0 +80104c35: 8b 48 24 mov 0x24(%eax),%ecx +80104c38: 85 c9 test %ecx,%ecx +80104c3a: 0f 85 80 00 00 00 jne 80104cc0 + release(&p->lock); + return -1; + } + sleep(&p->nread, &p->lock); //DOC: piperead-sleep +80104c40: 83 ec 08 sub $0x8,%esp +80104c43: 56 push %esi +80104c44: 53 push %ebx +80104c45: e8 96 09 00 00 call 801055e0 + while (p->nread == p->nwrite && p->writeopen) { //DOC: pipe-empty +80104c4a: 8b 86 38 02 00 00 mov 0x238(%esi),%eax +80104c50: 83 c4 10 add $0x10,%esp +80104c53: 39 86 34 02 00 00 cmp %eax,0x234(%esi) +80104c59: 75 0a jne 80104c65 +80104c5b: 8b 86 40 02 00 00 mov 0x240(%esi),%eax +80104c61: 85 c0 test %eax,%eax +80104c63: 75 cb jne 80104c30 + } + for (i = 0; i < n; i++) { //DOC: piperead-copy +80104c65: 8b 55 10 mov 0x10(%ebp),%edx +80104c68: 31 db xor %ebx,%ebx +80104c6a: 85 d2 test %edx,%edx +80104c6c: 7f 20 jg 80104c8e +80104c6e: eb 2c jmp 80104c9c + if (p->nread == p->nwrite) { + break; + } + addr[i] = p->data[p->nread++ % PIPESIZE]; +80104c70: 8d 48 01 lea 0x1(%eax),%ecx +80104c73: 25 ff 01 00 00 and $0x1ff,%eax +80104c78: 89 8e 34 02 00 00 mov %ecx,0x234(%esi) +80104c7e: 0f b6 44 06 34 movzbl 0x34(%esi,%eax,1),%eax +80104c83: 88 04 1f mov %al,(%edi,%ebx,1) + for (i = 0; i < n; i++) { //DOC: piperead-copy +80104c86: 83 c3 01 add $0x1,%ebx +80104c89: 39 5d 10 cmp %ebx,0x10(%ebp) +80104c8c: 74 0e je 80104c9c + if (p->nread == p->nwrite) { +80104c8e: 8b 86 34 02 00 00 mov 0x234(%esi),%eax +80104c94: 3b 86 38 02 00 00 cmp 0x238(%esi),%eax +80104c9a: 75 d4 jne 80104c70 + } + wakeup(&p->nwrite); //DOC: piperead-wakeup +80104c9c: 83 ec 0c sub $0xc,%esp +80104c9f: 8d 86 38 02 00 00 lea 0x238(%esi),%eax +80104ca5: 50 push %eax +80104ca6: e8 f5 09 00 00 call 801056a0 + release(&p->lock); +80104cab: 89 34 24 mov %esi,(%esp) +80104cae: e8 6d 0e 00 00 call 80105b20 + return i; +80104cb3: 83 c4 10 add $0x10,%esp +} +80104cb6: 8d 65 f4 lea -0xc(%ebp),%esp +80104cb9: 89 d8 mov %ebx,%eax +80104cbb: 5b pop %ebx +80104cbc: 5e pop %esi +80104cbd: 5f pop %edi +80104cbe: 5d pop %ebp +80104cbf: c3 ret + release(&p->lock); +80104cc0: 83 ec 0c sub $0xc,%esp + return -1; +80104cc3: bb ff ff ff ff mov $0xffffffff,%ebx + release(&p->lock); +80104cc8: 56 push %esi +80104cc9: e8 52 0e 00 00 call 80105b20 + return -1; +80104cce: 83 c4 10 add $0x10,%esp +} +80104cd1: 8d 65 f4 lea -0xc(%ebp),%esp +80104cd4: 89 d8 mov %ebx,%eax +80104cd6: 5b pop %ebx +80104cd7: 5e pop %esi +80104cd8: 5f pop %edi +80104cd9: 5d pop %ebp +80104cda: c3 ret +80104cdb: 66 90 xchg %ax,%ax +80104cdd: 66 90 xchg %ax,%ax +80104cdf: 90 nop + +80104ce0 : + +// Look in the process table for an UNUSED proc. +// If found, change state to EMBRYO and initialize +// state required to run in the kernel. +// Otherwise return 0. +static struct proc* allocproc(void) { +80104ce0: 55 push %ebp +80104ce1: 89 e5 mov %esp,%ebp +80104ce3: 53 push %ebx + char *sp; + int found = 0; + + acquire(&ptable.lock); + + p = ptable.proc; +80104ce4: bb d4 e4 11 80 mov $0x8011e4d4,%ebx +static struct proc* allocproc(void) { +80104ce9: 83 ec 10 sub $0x10,%esp + acquire(&ptable.lock); +80104cec: 68 a0 e4 11 80 push $0x8011e4a0 +80104cf1: e8 8a 0e 00 00 call 80105b80 +80104cf6: 83 c4 10 add $0x10,%esp + while (p < &ptable.proc[NPROC] && !found) { + if (p->state == UNUSED) { +80104cf9: 8b 43 0c mov 0xc(%ebx),%eax +80104cfc: 85 c0 test %eax,%eax +80104cfe: 74 30 je 80104d30 + found = 1; + } + else { + p++; +80104d00: 81 c3 94 00 00 00 add $0x94,%ebx + while (p < &ptable.proc[NPROC] && !found) { +80104d06: 81 fb d4 09 12 80 cmp $0x801209d4,%ebx +80104d0c: 75 eb jne 80104cf9 + } + + } + if (!found) { + release(&ptable.lock); +80104d0e: 83 ec 0c sub $0xc,%esp + return 0; +80104d11: 31 db xor %ebx,%ebx + release(&ptable.lock); +80104d13: 68 a0 e4 11 80 push $0x8011e4a0 +80104d18: e8 03 0e 00 00 call 80105b20 + memset(p->context, 0, sizeof *p->context); + p->context->eip = (uint)forkret; + p->consoleptr = getbaseconsoleptr(); + + return p; +} +80104d1d: 89 d8 mov %ebx,%eax + return 0; +80104d1f: 83 c4 10 add $0x10,%esp +} +80104d22: 8b 5d fc mov -0x4(%ebp),%ebx +80104d25: c9 leave +80104d26: c3 ret +80104d27: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104d2e: 66 90 xchg %ax,%ax + p->pid = nextpid++; +80104d30: a1 04 c0 10 80 mov 0x8010c004,%eax + release(&ptable.lock); +80104d35: 83 ec 0c sub $0xc,%esp + p->state = EMBRYO; +80104d38: c7 43 0c 01 00 00 00 movl $0x1,0xc(%ebx) + p->pid = nextpid++; +80104d3f: 89 43 10 mov %eax,0x10(%ebx) +80104d42: 8d 50 01 lea 0x1(%eax),%edx + release(&ptable.lock); +80104d45: 68 a0 e4 11 80 push $0x8011e4a0 + p->pid = nextpid++; +80104d4a: 89 15 04 c0 10 80 mov %edx,0x8010c004 + release(&ptable.lock); +80104d50: e8 cb 0d 00 00 call 80105b20 + if ((p->kstack = kalloc()) == 0) { +80104d55: e8 16 ee ff ff call 80103b70 +80104d5a: 83 c4 10 add $0x10,%esp +80104d5d: 89 43 08 mov %eax,0x8(%ebx) +80104d60: 85 c0 test %eax,%eax +80104d62: 74 44 je 80104da8 + sp -= sizeof *p->tf; +80104d64: 8d 90 b4 0f 00 00 lea 0xfb4(%eax),%edx + memset(p->context, 0, sizeof *p->context); +80104d6a: 83 ec 04 sub $0x4,%esp + sp -= sizeof *p->context; +80104d6d: 05 9c 0f 00 00 add $0xf9c,%eax + sp -= sizeof *p->tf; +80104d72: 89 53 18 mov %edx,0x18(%ebx) + *(uint*)sp = (uint)trapret; +80104d75: c7 40 14 e9 6f 10 80 movl $0x80106fe9,0x14(%eax) + p->context = (struct context*)sp; +80104d7c: 89 43 1c mov %eax,0x1c(%ebx) + memset(p->context, 0, sizeof *p->context); +80104d7f: 6a 14 push $0x14 +80104d81: 6a 00 push $0x0 +80104d83: 50 push %eax +80104d84: e8 b7 0e 00 00 call 80105c40 + p->context->eip = (uint)forkret; +80104d89: 8b 43 1c mov 0x1c(%ebx),%eax +80104d8c: c7 40 10 c0 4d 10 80 movl $0x80104dc0,0x10(%eax) + p->consoleptr = getbaseconsoleptr(); +80104d93: e8 b8 c2 ff ff call 80101050 + return p; +80104d98: 83 c4 10 add $0x10,%esp + p->consoleptr = getbaseconsoleptr(); +80104d9b: 89 43 7c mov %eax,0x7c(%ebx) +} +80104d9e: 89 d8 mov %ebx,%eax +80104da0: 8b 5d fc mov -0x4(%ebp),%ebx +80104da3: c9 leave +80104da4: c3 ret +80104da5: 8d 76 00 lea 0x0(%esi),%esi + p->state = UNUSED; +80104da8: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx) + return 0; +80104daf: 31 db xor %ebx,%ebx +} +80104db1: 89 d8 mov %ebx,%eax +80104db3: 8b 5d fc mov -0x4(%ebp),%ebx +80104db6: c9 leave +80104db7: c3 ret +80104db8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104dbf: 90 nop + +80104dc0 : + release(&ptable.lock); +} + +// A fork child's very first scheduling by scheduler() +// will swtch here. "Return" to user space. +void forkret(void) { +80104dc0: 55 push %ebp +80104dc1: 89 e5 mov %esp,%ebp +80104dc3: 83 ec 14 sub $0x14,%esp + static int first = 1; + // Still holding ptable.lock from scheduler. + release(&ptable.lock); +80104dc6: 68 a0 e4 11 80 push $0x8011e4a0 +80104dcb: e8 50 0d 00 00 call 80105b20 + + if (first) { +80104dd0: a1 00 c0 10 80 mov 0x8010c000,%eax +80104dd5: 83 c4 10 add $0x10,%esp +80104dd8: 85 c0 test %eax,%eax +80104dda: 75 04 jne 80104de0 + iinit(ROOTDEV); + initlog(ROOTDEV); + } + + // Return to "caller", actually trapret (see allocproc). +} +80104ddc: c9 leave +80104ddd: c3 ret +80104dde: 66 90 xchg %ax,%ax + first = 0; +80104de0: c7 05 00 c0 10 80 00 movl $0x0,0x8010c000 +80104de7: 00 00 00 + iinit(ROOTDEV); +80104dea: 83 ec 0c sub $0xc,%esp +80104ded: 6a 01 push $0x1 +80104def: e8 5c dc ff ff call 80102a50 + initlog(ROOTDEV); +80104df4: c7 04 24 01 00 00 00 movl $0x1,(%esp) +80104dfb: e8 b0 f3 ff ff call 801041b0 +} +80104e00: 83 c4 10 add $0x10,%esp +80104e03: c9 leave +80104e04: c3 ret +80104e05: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104e0c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80104e10 : +void pinit(void) { +80104e10: 55 push %ebp +80104e11: 89 e5 mov %esp,%ebp +80104e13: 83 ec 10 sub $0x10,%esp + initlock(&ptable.lock, "ptable"); +80104e16: 68 60 8f 10 80 push $0x80108f60 +80104e1b: 68 a0 e4 11 80 push $0x8011e4a0 +80104e20: e8 8b 0b 00 00 call 801059b0 +} +80104e25: 83 c4 10 add $0x10,%esp +80104e28: c9 leave +80104e29: c3 ret +80104e2a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80104e30 : +struct cpu*mycpu(void) { +80104e30: 55 push %ebp +80104e31: 89 e5 mov %esp,%ebp +80104e33: 56 push %esi +80104e34: 53 push %ebx + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +80104e35: 9c pushf +80104e36: 58 pop %eax + if (readeflags() & FL_IF) { +80104e37: f6 c4 02 test $0x2,%ah +80104e3a: 75 46 jne 80104e82 + apicid = lapicid(); +80104e3c: e8 9f ef ff ff call 80103de0 + for (i = 0; i < ncpu; ++i) { +80104e41: 8b 35 04 df 11 80 mov 0x8011df04,%esi +80104e47: 85 f6 test %esi,%esi +80104e49: 7e 2a jle 80104e75 +80104e4b: 31 d2 xor %edx,%edx +80104e4d: eb 08 jmp 80104e57 +80104e4f: 90 nop +80104e50: 83 c2 01 add $0x1,%edx +80104e53: 39 f2 cmp %esi,%edx +80104e55: 74 1e je 80104e75 + if (cpus[i].apicid == apicid) { +80104e57: 69 ca b0 00 00 00 imul $0xb0,%edx,%ecx +80104e5d: 0f b6 99 20 df 11 80 movzbl -0x7fee20e0(%ecx),%ebx +80104e64: 39 c3 cmp %eax,%ebx +80104e66: 75 e8 jne 80104e50 +} +80104e68: 8d 65 f8 lea -0x8(%ebp),%esp + return &cpus[i]; +80104e6b: 8d 81 20 df 11 80 lea -0x7fee20e0(%ecx),%eax +} +80104e71: 5b pop %ebx +80104e72: 5e pop %esi +80104e73: 5d pop %ebp +80104e74: c3 ret + panic("unknown apicid\n"); +80104e75: 83 ec 0c sub $0xc,%esp +80104e78: 68 67 8f 10 80 push $0x80108f67 +80104e7d: e8 fe b5 ff ff call 80100480 + panic("mycpu called with interrupts enabled\n"); +80104e82: 83 ec 0c sub $0xc,%esp +80104e85: 68 58 90 10 80 push $0x80109058 +80104e8a: e8 f1 b5 ff ff call 80100480 +80104e8f: 90 nop + +80104e90 : +int cpuid() { +80104e90: 55 push %ebp +80104e91: 89 e5 mov %esp,%ebp +80104e93: 83 ec 08 sub $0x8,%esp + return mycpu() - cpus; +80104e96: e8 95 ff ff ff call 80104e30 +} +80104e9b: c9 leave + return mycpu() - cpus; +80104e9c: 2d 20 df 11 80 sub $0x8011df20,%eax +80104ea1: c1 f8 04 sar $0x4,%eax +80104ea4: 69 c0 a3 8b 2e ba imul $0xba2e8ba3,%eax,%eax +} +80104eaa: c3 ret +80104eab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80104eaf: 90 nop + +80104eb0 : +struct proc*myproc(void) { +80104eb0: 55 push %ebp +80104eb1: 89 e5 mov %esp,%ebp +80104eb3: 53 push %ebx +80104eb4: 83 ec 04 sub $0x4,%esp + pushcli(); +80104eb7: e8 74 0b 00 00 call 80105a30 + c = mycpu(); +80104ebc: e8 6f ff ff ff call 80104e30 + p = c->proc; +80104ec1: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +80104ec7: e8 b4 0b 00 00 call 80105a80 +} +80104ecc: 89 d8 mov %ebx,%eax +80104ece: 8b 5d fc mov -0x4(%ebp),%ebx +80104ed1: c9 leave +80104ed2: c3 ret +80104ed3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80104eda: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80104ee0 : +void userinit(void) { +80104ee0: 55 push %ebp +80104ee1: 89 e5 mov %esp,%ebp +80104ee3: 53 push %ebx +80104ee4: 83 ec 04 sub $0x4,%esp + p = allocproc(); +80104ee7: e8 f4 fd ff ff call 80104ce0 +80104eec: 89 c3 mov %eax,%ebx + initproc = p; +80104eee: a3 d4 09 12 80 mov %eax,0x801209d4 + if ((p->pgdir = setupkvm()) == 0) { +80104ef3: e8 e8 36 00 00 call 801085e0 +80104ef8: 89 43 04 mov %eax,0x4(%ebx) +80104efb: 85 c0 test %eax,%eax +80104efd: 0f 84 db 00 00 00 je 80104fde + inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); +80104f03: 83 ec 04 sub $0x4,%esp +80104f06: 68 2c 00 00 00 push $0x2c +80104f0b: 68 60 c4 10 80 push $0x8010c460 +80104f10: 50 push %eax +80104f11: e8 7a 33 00 00 call 80108290 + memset(p->tf, 0, sizeof(*p->tf)); +80104f16: 83 c4 0c add $0xc,%esp + p->sz = PGSIZE; +80104f19: c7 03 00 10 00 00 movl $0x1000,(%ebx) + memset(p->tf, 0, sizeof(*p->tf)); +80104f1f: 6a 4c push $0x4c +80104f21: 6a 00 push $0x0 +80104f23: ff 73 18 push 0x18(%ebx) +80104f26: e8 15 0d 00 00 call 80105c40 + p->tf->cs = (SEG_UCODE << 3) | DPL_USER; +80104f2b: 8b 43 18 mov 0x18(%ebx),%eax +80104f2e: ba 1b 00 00 00 mov $0x1b,%edx + safestrcpy(p->name, "initcode", sizeof(p->name)); +80104f33: 83 c4 0c add $0xc,%esp + p->tf->ds = (SEG_UDATA << 3) | DPL_USER; +80104f36: b9 23 00 00 00 mov $0x23,%ecx + p->tf->cs = (SEG_UCODE << 3) | DPL_USER; +80104f3b: 66 89 50 3c mov %dx,0x3c(%eax) + p->tf->ds = (SEG_UDATA << 3) | DPL_USER; +80104f3f: 8b 43 18 mov 0x18(%ebx),%eax +80104f42: 66 89 48 2c mov %cx,0x2c(%eax) + p->tf->es = p->tf->ds; +80104f46: 8b 43 18 mov 0x18(%ebx),%eax +80104f49: 0f b7 50 2c movzwl 0x2c(%eax),%edx +80104f4d: 66 89 50 28 mov %dx,0x28(%eax) + p->tf->ss = p->tf->ds; +80104f51: 8b 43 18 mov 0x18(%ebx),%eax +80104f54: 0f b7 50 2c movzwl 0x2c(%eax),%edx +80104f58: 66 89 50 48 mov %dx,0x48(%eax) + p->tf->eflags = FL_IF; +80104f5c: 8b 43 18 mov 0x18(%ebx),%eax +80104f5f: c7 40 40 00 02 00 00 movl $0x200,0x40(%eax) + p->tf->esp = PGSIZE; +80104f66: 8b 43 18 mov 0x18(%ebx),%eax +80104f69: c7 40 44 00 10 00 00 movl $0x1000,0x44(%eax) + p->tf->eip = 0; // beginning of initcode.S +80104f70: 8b 43 18 mov 0x18(%ebx),%eax +80104f73: c7 40 38 00 00 00 00 movl $0x0,0x38(%eax) + safestrcpy(p->name, "initcode", sizeof(p->name)); +80104f7a: 8d 43 6c lea 0x6c(%ebx),%eax +80104f7d: 6a 10 push $0x10 +80104f7f: 68 90 8f 10 80 push $0x80108f90 +80104f84: 50 push %eax +80104f85: e8 76 0e 00 00 call 80105e00 + p->cwd = namei("/"); +80104f8a: c7 04 24 99 8f 10 80 movl $0x80108f99,(%esp) +80104f91: e8 fa e5 ff ff call 80103590 +80104f96: 89 43 68 mov %eax,0x68(%ebx) + p->consoleptr = getbaseconsoleptr(); +80104f99: e8 b2 c0 ff ff call 80101050 + safestrcpy(p->title, "Shell (Root)", sizeof(p->title)); +80104f9e: 83 c4 0c add $0xc,%esp + p->consoleptr = getbaseconsoleptr(); +80104fa1: 89 43 7c mov %eax,0x7c(%ebx) + safestrcpy(p->title, "Shell (Root)", sizeof(p->title)); +80104fa4: 8d 83 80 00 00 00 lea 0x80(%ebx),%eax +80104faa: 6a 14 push $0x14 +80104fac: 68 9b 8f 10 80 push $0x80108f9b +80104fb1: 50 push %eax +80104fb2: e8 49 0e 00 00 call 80105e00 + acquire(&ptable.lock); +80104fb7: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +80104fbe: e8 bd 0b 00 00 call 80105b80 + p->state = RUNNABLE; +80104fc3: c7 43 0c 03 00 00 00 movl $0x3,0xc(%ebx) + release(&ptable.lock); +80104fca: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +80104fd1: e8 4a 0b 00 00 call 80105b20 +} +80104fd6: 8b 5d fc mov -0x4(%ebp),%ebx +80104fd9: 83 c4 10 add $0x10,%esp +80104fdc: c9 leave +80104fdd: c3 ret + panic("userinit: out of memory?"); +80104fde: 83 ec 0c sub $0xc,%esp +80104fe1: 68 77 8f 10 80 push $0x80108f77 +80104fe6: e8 95 b4 ff ff call 80100480 +80104feb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80104fef: 90 nop + +80104ff0 : +int growproc(int n) { +80104ff0: 55 push %ebp +80104ff1: 89 e5 mov %esp,%ebp +80104ff3: 56 push %esi +80104ff4: 53 push %ebx +80104ff5: 8b 75 08 mov 0x8(%ebp),%esi + pushcli(); +80104ff8: e8 33 0a 00 00 call 80105a30 + c = mycpu(); +80104ffd: e8 2e fe ff ff call 80104e30 + p = c->proc; +80105002: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +80105008: e8 73 0a 00 00 call 80105a80 + sz = curproc->sz; +8010500d: 8b 03 mov (%ebx),%eax + if (n > 0) { +8010500f: 85 f6 test %esi,%esi +80105011: 7f 1d jg 80105030 + else if (n < 0) { +80105013: 75 3b jne 80105050 + switchuvm(curproc); +80105015: 83 ec 0c sub $0xc,%esp + curproc->sz = sz; +80105018: 89 03 mov %eax,(%ebx) + switchuvm(curproc); +8010501a: 53 push %ebx +8010501b: e8 60 31 00 00 call 80108180 + return 0; +80105020: 83 c4 10 add $0x10,%esp +80105023: 31 c0 xor %eax,%eax +} +80105025: 8d 65 f8 lea -0x8(%ebp),%esp +80105028: 5b pop %ebx +80105029: 5e pop %esi +8010502a: 5d pop %ebp +8010502b: c3 ret +8010502c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if ((sz = allocuvm(curproc->pgdir, sz, sz + n)) == 0) { +80105030: 83 ec 04 sub $0x4,%esp +80105033: 01 c6 add %eax,%esi +80105035: 56 push %esi +80105036: 50 push %eax +80105037: ff 73 04 push 0x4(%ebx) +8010503a: e8 c1 33 00 00 call 80108400 +8010503f: 83 c4 10 add $0x10,%esp +80105042: 85 c0 test %eax,%eax +80105044: 75 cf jne 80105015 + return -1; +80105046: b8 ff ff ff ff mov $0xffffffff,%eax +8010504b: eb d8 jmp 80105025 +8010504d: 8d 76 00 lea 0x0(%esi),%esi + if ((sz = deallocuvm(curproc->pgdir, sz, sz + n)) == 0) { +80105050: 83 ec 04 sub $0x4,%esp +80105053: 01 c6 add %eax,%esi +80105055: 56 push %esi +80105056: 50 push %eax +80105057: ff 73 04 push 0x4(%ebx) +8010505a: e8 d1 34 00 00 call 80108530 +8010505f: 83 c4 10 add $0x10,%esp +80105062: 85 c0 test %eax,%eax +80105064: 75 af jne 80105015 +80105066: eb de jmp 80105046 +80105068: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010506f: 90 nop + +80105070 : +int fork(void) { +80105070: 55 push %ebp +80105071: 89 e5 mov %esp,%ebp +80105073: 57 push %edi +80105074: 56 push %esi +80105075: 53 push %ebx +80105076: 83 ec 1c sub $0x1c,%esp + pushcli(); +80105079: e8 b2 09 00 00 call 80105a30 + c = mycpu(); +8010507e: e8 ad fd ff ff call 80104e30 + p = c->proc; +80105083: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +80105089: e8 f2 09 00 00 call 80105a80 + if ((np = allocproc()) == 0) { +8010508e: e8 4d fc ff ff call 80104ce0 +80105093: 89 45 e4 mov %eax,-0x1c(%ebp) +80105096: 85 c0 test %eax,%eax +80105098: 0f 84 bd 00 00 00 je 8010515b + if ((np->pgdir = copyuvm(curproc->pgdir, curproc->sz)) == 0) { +8010509e: 83 ec 08 sub $0x8,%esp +801050a1: ff 33 push (%ebx) +801050a3: 89 c7 mov %eax,%edi +801050a5: ff 73 04 push 0x4(%ebx) +801050a8: e8 23 36 00 00 call 801086d0 +801050ad: 83 c4 10 add $0x10,%esp +801050b0: 89 47 04 mov %eax,0x4(%edi) +801050b3: 85 c0 test %eax,%eax +801050b5: 0f 84 a7 00 00 00 je 80105162 + np->sz = curproc->sz; +801050bb: 8b 03 mov (%ebx),%eax +801050bd: 8b 4d e4 mov -0x1c(%ebp),%ecx +801050c0: 89 01 mov %eax,(%ecx) + *np->tf = *curproc->tf; +801050c2: 8b 79 18 mov 0x18(%ecx),%edi + np->parent = curproc; +801050c5: 89 c8 mov %ecx,%eax +801050c7: 89 59 14 mov %ebx,0x14(%ecx) + *np->tf = *curproc->tf; +801050ca: b9 13 00 00 00 mov $0x13,%ecx +801050cf: 8b 73 18 mov 0x18(%ebx),%esi +801050d2: f3 a5 rep movsl %ds:(%esi),%es:(%edi) + for (i = 0; i < NOFILE; i++) { +801050d4: 31 f6 xor %esi,%esi + np->tf->eax = 0; +801050d6: 8b 40 18 mov 0x18(%eax),%eax +801050d9: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax) + if (curproc->ofile[i]) { +801050e0: 8b 44 b3 28 mov 0x28(%ebx,%esi,4),%eax +801050e4: 85 c0 test %eax,%eax +801050e6: 74 13 je 801050fb + np->ofile[i] = filedup(curproc->ofile[i]); +801050e8: 83 ec 0c sub $0xc,%esp +801050eb: 50 push %eax +801050ec: e8 9f d2 ff ff call 80102390 +801050f1: 8b 55 e4 mov -0x1c(%ebp),%edx +801050f4: 83 c4 10 add $0x10,%esp +801050f7: 89 44 b2 28 mov %eax,0x28(%edx,%esi,4) + for (i = 0; i < NOFILE; i++) { +801050fb: 83 c6 01 add $0x1,%esi +801050fe: 83 fe 10 cmp $0x10,%esi +80105101: 75 dd jne 801050e0 + np->cwd = idup(curproc->cwd); +80105103: 83 ec 0c sub $0xc,%esp +80105106: ff 73 68 push 0x68(%ebx) +80105109: e8 32 db ff ff call 80102c40 +8010510e: 8b 7d e4 mov -0x1c(%ebp),%edi + safestrcpy(np->name, curproc->name, sizeof(curproc->name)); +80105111: 83 c4 0c add $0xc,%esp + np->cwd = idup(curproc->cwd); +80105114: 89 47 68 mov %eax,0x68(%edi) + safestrcpy(np->name, curproc->name, sizeof(curproc->name)); +80105117: 8d 43 6c lea 0x6c(%ebx),%eax +8010511a: 6a 10 push $0x10 +8010511c: 50 push %eax +8010511d: 8d 47 6c lea 0x6c(%edi),%eax +80105120: 50 push %eax +80105121: e8 da 0c 00 00 call 80105e00 + pid = np->pid; +80105126: 8b 77 10 mov 0x10(%edi),%esi + acquire(&ptable.lock); +80105129: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +80105130: e8 4b 0a 00 00 call 80105b80 + np->state = RUNNABLE; +80105135: c7 47 0c 03 00 00 00 movl $0x3,0xc(%edi) + np->consoleptr = curproc->consoleptr; +8010513c: 8b 43 7c mov 0x7c(%ebx),%eax +8010513f: 89 47 7c mov %eax,0x7c(%edi) + release(&ptable.lock); +80105142: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +80105149: e8 d2 09 00 00 call 80105b20 + return pid; +8010514e: 83 c4 10 add $0x10,%esp +} +80105151: 8d 65 f4 lea -0xc(%ebp),%esp +80105154: 89 f0 mov %esi,%eax +80105156: 5b pop %ebx +80105157: 5e pop %esi +80105158: 5f pop %edi +80105159: 5d pop %ebp +8010515a: c3 ret + return -1; +8010515b: be ff ff ff ff mov $0xffffffff,%esi +80105160: eb ef jmp 80105151 + kfree(np->kstack); +80105162: 8b 5d e4 mov -0x1c(%ebp),%ebx +80105165: 83 ec 0c sub $0xc,%esp + return -1; +80105168: be ff ff ff ff mov $0xffffffff,%esi + kfree(np->kstack); +8010516d: ff 73 08 push 0x8(%ebx) +80105170: e8 3b e8 ff ff call 801039b0 + np->kstack = 0; +80105175: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx) + return -1; +8010517c: 83 c4 10 add $0x10,%esp + np->state = UNUSED; +8010517f: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx) + return -1; +80105186: eb c9 jmp 80105151 +80105188: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010518f: 90 nop + +80105190 : +void scheduler(void) { +80105190: 55 push %ebp +80105191: 89 e5 mov %esp,%ebp +80105193: 57 push %edi +80105194: 56 push %esi +80105195: 53 push %ebx +80105196: 83 ec 0c sub $0xc,%esp + struct cpu *c = mycpu(); +80105199: e8 92 fc ff ff call 80104e30 + c->proc = 0; +8010519e: c7 80 ac 00 00 00 00 movl $0x0,0xac(%eax) +801051a5: 00 00 00 + struct cpu *c = mycpu(); +801051a8: 89 c6 mov %eax,%esi + c->proc = 0; +801051aa: 8d 78 04 lea 0x4(%eax),%edi +801051ad: 8d 76 00 lea 0x0(%esi),%esi + asm volatile ("sti"); +801051b0: fb sti + acquire(&ptable.lock); +801051b1: 83 ec 0c sub $0xc,%esp + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801051b4: bb d4 e4 11 80 mov $0x8011e4d4,%ebx + acquire(&ptable.lock); +801051b9: 68 a0 e4 11 80 push $0x8011e4a0 +801051be: e8 bd 09 00 00 call 80105b80 +801051c3: 83 c4 10 add $0x10,%esp +801051c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801051cd: 8d 76 00 lea 0x0(%esi),%esi + if (p->state != RUNNABLE) { +801051d0: 83 7b 0c 03 cmpl $0x3,0xc(%ebx) +801051d4: 75 33 jne 80105209 + switchuvm(p); +801051d6: 83 ec 0c sub $0xc,%esp + c->proc = p; +801051d9: 89 9e ac 00 00 00 mov %ebx,0xac(%esi) + switchuvm(p); +801051df: 53 push %ebx +801051e0: e8 9b 2f 00 00 call 80108180 + swtch(&(c->scheduler), p->context); +801051e5: 58 pop %eax +801051e6: 5a pop %edx +801051e7: ff 73 1c push 0x1c(%ebx) +801051ea: 57 push %edi + p->state = RUNNING; +801051eb: c7 43 0c 04 00 00 00 movl $0x4,0xc(%ebx) + swtch(&(c->scheduler), p->context); +801051f2: e8 64 0c 00 00 call 80105e5b + switchkvm(); +801051f7: e8 74 2f 00 00 call 80108170 + c->proc = 0; +801051fc: 83 c4 10 add $0x10,%esp +801051ff: c7 86 ac 00 00 00 00 movl $0x0,0xac(%esi) +80105206: 00 00 00 + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +80105209: 81 c3 94 00 00 00 add $0x94,%ebx +8010520f: 81 fb d4 09 12 80 cmp $0x801209d4,%ebx +80105215: 75 b9 jne 801051d0 + release(&ptable.lock); +80105217: 83 ec 0c sub $0xc,%esp +8010521a: 68 a0 e4 11 80 push $0x8011e4a0 +8010521f: e8 fc 08 00 00 call 80105b20 + sti(); +80105224: 83 c4 10 add $0x10,%esp +80105227: eb 87 jmp 801051b0 +80105229: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80105230 : +void sched(void) { +80105230: 55 push %ebp +80105231: 89 e5 mov %esp,%ebp +80105233: 56 push %esi +80105234: 53 push %ebx + pushcli(); +80105235: e8 f6 07 00 00 call 80105a30 + c = mycpu(); +8010523a: e8 f1 fb ff ff call 80104e30 + p = c->proc; +8010523f: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +80105245: e8 36 08 00 00 call 80105a80 + if (!holding(&ptable.lock)) { +8010524a: 83 ec 0c sub $0xc,%esp +8010524d: 68 a0 e4 11 80 push $0x8011e4a0 +80105252: e8 89 08 00 00 call 80105ae0 +80105257: 83 c4 10 add $0x10,%esp +8010525a: 85 c0 test %eax,%eax +8010525c: 74 4f je 801052ad + if (mycpu()->ncli != 1) { +8010525e: e8 cd fb ff ff call 80104e30 +80105263: 83 b8 a4 00 00 00 01 cmpl $0x1,0xa4(%eax) +8010526a: 75 68 jne 801052d4 + if (p->state == RUNNING) { +8010526c: 83 7b 0c 04 cmpl $0x4,0xc(%ebx) +80105270: 74 55 je 801052c7 + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +80105272: 9c pushf +80105273: 58 pop %eax + if (readeflags() & FL_IF) { +80105274: f6 c4 02 test $0x2,%ah +80105277: 75 41 jne 801052ba + intena = mycpu()->intena; +80105279: e8 b2 fb ff ff call 80104e30 + swtch(&p->context, mycpu()->scheduler); +8010527e: 83 c3 1c add $0x1c,%ebx + intena = mycpu()->intena; +80105281: 8b b0 a8 00 00 00 mov 0xa8(%eax),%esi + swtch(&p->context, mycpu()->scheduler); +80105287: e8 a4 fb ff ff call 80104e30 +8010528c: 83 ec 08 sub $0x8,%esp +8010528f: ff 70 04 push 0x4(%eax) +80105292: 53 push %ebx +80105293: e8 c3 0b 00 00 call 80105e5b + mycpu()->intena = intena; +80105298: e8 93 fb ff ff call 80104e30 +} +8010529d: 83 c4 10 add $0x10,%esp + mycpu()->intena = intena; +801052a0: 89 b0 a8 00 00 00 mov %esi,0xa8(%eax) +} +801052a6: 8d 65 f8 lea -0x8(%ebp),%esp +801052a9: 5b pop %ebx +801052aa: 5e pop %esi +801052ab: 5d pop %ebp +801052ac: c3 ret + panic("sched ptable.lock"); +801052ad: 83 ec 0c sub $0xc,%esp +801052b0: 68 a8 8f 10 80 push $0x80108fa8 +801052b5: e8 c6 b1 ff ff call 80100480 + panic("sched interruptible"); +801052ba: 83 ec 0c sub $0xc,%esp +801052bd: 68 d4 8f 10 80 push $0x80108fd4 +801052c2: e8 b9 b1 ff ff call 80100480 + panic("sched running"); +801052c7: 83 ec 0c sub $0xc,%esp +801052ca: 68 c6 8f 10 80 push $0x80108fc6 +801052cf: e8 ac b1 ff ff call 80100480 + panic("sched locks"); +801052d4: 83 ec 0c sub $0xc,%esp +801052d7: 68 ba 8f 10 80 push $0x80108fba +801052dc: e8 9f b1 ff ff call 80100480 +801052e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801052e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801052ef: 90 nop + +801052f0 : +void exit(void) { +801052f0: 55 push %ebp +801052f1: 89 e5 mov %esp,%ebp +801052f3: 57 push %edi +801052f4: 56 push %esi +801052f5: 53 push %ebx +801052f6: 83 ec 0c sub $0xc,%esp + struct proc *curproc = myproc(); +801052f9: e8 b2 fb ff ff call 80104eb0 + if (curproc == initproc) { +801052fe: 39 05 d4 09 12 80 cmp %eax,0x801209d4 +80105304: 0f 84 39 01 00 00 je 80105443 +8010530a: 89 c6 mov %eax,%esi +8010530c: 8d 58 28 lea 0x28(%eax),%ebx +8010530f: 8d 78 68 lea 0x68(%eax),%edi +80105312: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (curproc->ofile[fd]) { +80105318: 8b 03 mov (%ebx),%eax +8010531a: 85 c0 test %eax,%eax +8010531c: 74 12 je 80105330 + fileclose(curproc->ofile[fd]); +8010531e: 83 ec 0c sub $0xc,%esp +80105321: 50 push %eax +80105322: e8 b9 d0 ff ff call 801023e0 + curproc->ofile[fd] = 0; +80105327: c7 03 00 00 00 00 movl $0x0,(%ebx) +8010532d: 83 c4 10 add $0x10,%esp + for (fd = 0; fd < NOFILE; fd++) { +80105330: 83 c3 04 add $0x4,%ebx +80105333: 39 df cmp %ebx,%edi +80105335: 75 e1 jne 80105318 + begin_op(); +80105337: e8 14 ef ff ff call 80104250 + iput(curproc->cwd); +8010533c: 83 ec 0c sub $0xc,%esp +8010533f: ff 76 68 push 0x68(%esi) +80105342: e8 59 da ff ff call 80102da0 + end_op(); +80105347: e8 74 ef ff ff call 801042c0 + curproc->cwd = 0; +8010534c: c7 46 68 00 00 00 00 movl $0x0,0x68(%esi) + acquire(&ptable.lock); +80105353: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +8010535a: e8 21 08 00 00 call 80105b80 + wakeup1(curproc->parent); +8010535f: 8b 56 14 mov 0x14(%esi),%edx +80105362: 83 c4 10 add $0x10,%esp +// Wake up all processes sleeping on chan. +// The ptable lock must be held. +static void wakeup1(void *chan) { + struct proc *p; + + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +80105365: b8 d4 e4 11 80 mov $0x8011e4d4,%eax +8010536a: eb 10 jmp 8010537c +8010536c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105370: 05 94 00 00 00 add $0x94,%eax +80105375: 3d d4 09 12 80 cmp $0x801209d4,%eax +8010537a: 74 1e je 8010539a + if (p->state == SLEEPING && p->chan == chan) { +8010537c: 83 78 0c 02 cmpl $0x2,0xc(%eax) +80105380: 75 ee jne 80105370 +80105382: 3b 50 20 cmp 0x20(%eax),%edx +80105385: 75 e9 jne 80105370 + p->state = RUNNABLE; +80105387: c7 40 0c 03 00 00 00 movl $0x3,0xc(%eax) + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +8010538e: 05 94 00 00 00 add $0x94,%eax +80105393: 3d d4 09 12 80 cmp $0x801209d4,%eax +80105398: 75 e2 jne 8010537c + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +8010539a: bb d4 e4 11 80 mov $0x8011e4d4,%ebx +8010539f: eb 15 jmp 801053b6 +801053a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801053a8: 81 c3 94 00 00 00 add $0x94,%ebx +801053ae: 81 fb d4 09 12 80 cmp $0x801209d4,%ebx +801053b4: 74 4a je 80105400 + if (p->parent == curproc) { +801053b6: 39 73 14 cmp %esi,0x14(%ebx) +801053b9: 75 ed jne 801053a8 + p->parent = initproc; +801053bb: a1 d4 09 12 80 mov 0x801209d4,%eax +801053c0: 89 43 14 mov %eax,0x14(%ebx) + p->consoleptr = getbaseconsoleptr(); +801053c3: e8 88 bc ff ff call 80101050 + if (p->state == ZOMBIE) { +801053c8: 83 7b 0c 05 cmpl $0x5,0xc(%ebx) + p->consoleptr = getbaseconsoleptr(); +801053cc: 89 43 7c mov %eax,0x7c(%ebx) + if (p->state == ZOMBIE) { +801053cf: 75 d7 jne 801053a8 + wakeup1(initproc); +801053d1: 8b 15 d4 09 12 80 mov 0x801209d4,%edx + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801053d7: b8 d4 e4 11 80 mov $0x8011e4d4,%eax +801053dc: eb 0e jmp 801053ec +801053de: 66 90 xchg %ax,%ax +801053e0: 05 94 00 00 00 add $0x94,%eax +801053e5: 3d d4 09 12 80 cmp $0x801209d4,%eax +801053ea: 74 bc je 801053a8 + if (p->state == SLEEPING && p->chan == chan) { +801053ec: 83 78 0c 02 cmpl $0x2,0xc(%eax) +801053f0: 75 ee jne 801053e0 +801053f2: 3b 50 20 cmp 0x20(%eax),%edx +801053f5: 75 e9 jne 801053e0 + p->state = RUNNABLE; +801053f7: c7 40 0c 03 00 00 00 movl $0x3,0xc(%eax) +801053fe: eb e0 jmp 801053e0 + if (curproc->consoleptr != getbaseconsoleptr()) +80105400: 8b 5e 7c mov 0x7c(%esi),%ebx +80105403: e8 48 bc ff ff call 80101050 +80105408: 39 c3 cmp %eax,%ebx +8010540a: 74 05 je 80105411 + closeconsole(); +8010540c: e8 2f c9 ff ff call 80101d40 + if (curproc->consoleptr != 0) +80105411: 8b 46 7c mov 0x7c(%esi),%eax +80105414: 85 c0 test %eax,%eax +80105416: 74 12 je 8010542a + setconsoleproctitle(curproc->consoleptr, curproc->parent->name); +80105418: 52 push %edx +80105419: 52 push %edx +8010541a: 8b 4e 14 mov 0x14(%esi),%ecx +8010541d: 8d 51 6c lea 0x6c(%ecx),%edx +80105420: 52 push %edx +80105421: 50 push %eax +80105422: e8 39 ca ff ff call 80101e60 +80105427: 83 c4 10 add $0x10,%esp + curproc->state = ZOMBIE; +8010542a: c7 46 0c 05 00 00 00 movl $0x5,0xc(%esi) + sched(); +80105431: e8 fa fd ff ff call 80105230 + panic("zombie exit"); +80105436: 83 ec 0c sub $0xc,%esp +80105439: 68 f5 8f 10 80 push $0x80108ff5 +8010543e: e8 3d b0 ff ff call 80100480 + panic("init exiting"); +80105443: 83 ec 0c sub $0xc,%esp +80105446: 68 e8 8f 10 80 push $0x80108fe8 +8010544b: e8 30 b0 ff ff call 80100480 + +80105450 : +int wait(void) { +80105450: 55 push %ebp +80105451: 89 e5 mov %esp,%ebp +80105453: 56 push %esi +80105454: 53 push %ebx + pushcli(); +80105455: e8 d6 05 00 00 call 80105a30 + c = mycpu(); +8010545a: e8 d1 f9 ff ff call 80104e30 + p = c->proc; +8010545f: 8b b0 ac 00 00 00 mov 0xac(%eax),%esi + popcli(); +80105465: e8 16 06 00 00 call 80105a80 + acquire(&ptable.lock); +8010546a: 83 ec 0c sub $0xc,%esp +8010546d: 68 a0 e4 11 80 push $0x8011e4a0 +80105472: e8 09 07 00 00 call 80105b80 +80105477: 83 c4 10 add $0x10,%esp + havekids = 0; +8010547a: 31 c0 xor %eax,%eax + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +8010547c: bb d4 e4 11 80 mov $0x8011e4d4,%ebx +80105481: eb 13 jmp 80105496 +80105483: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105487: 90 nop +80105488: 81 c3 94 00 00 00 add $0x94,%ebx +8010548e: 81 fb d4 09 12 80 cmp $0x801209d4,%ebx +80105494: 74 1e je 801054b4 + if (p->parent != curproc) { +80105496: 39 73 14 cmp %esi,0x14(%ebx) +80105499: 75 ed jne 80105488 + if (p->state == ZOMBIE) { +8010549b: 83 7b 0c 05 cmpl $0x5,0xc(%ebx) +8010549f: 74 5f je 80105500 + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801054a1: 81 c3 94 00 00 00 add $0x94,%ebx + havekids = 1; +801054a7: b8 01 00 00 00 mov $0x1,%eax + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801054ac: 81 fb d4 09 12 80 cmp $0x801209d4,%ebx +801054b2: 75 e2 jne 80105496 + if (!havekids || curproc->killed) { +801054b4: 85 c0 test %eax,%eax +801054b6: 0f 84 a1 00 00 00 je 8010555d +801054bc: 8b 46 24 mov 0x24(%esi),%eax +801054bf: 85 c0 test %eax,%eax +801054c1: 0f 85 96 00 00 00 jne 8010555d + pushcli(); +801054c7: e8 64 05 00 00 call 80105a30 + c = mycpu(); +801054cc: e8 5f f9 ff ff call 80104e30 + p = c->proc; +801054d1: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +801054d7: e8 a4 05 00 00 call 80105a80 + if (p == 0) { +801054dc: 85 db test %ebx,%ebx +801054de: 0f 84 90 00 00 00 je 80105574 + p->chan = chan; +801054e4: 89 73 20 mov %esi,0x20(%ebx) + p->state = SLEEPING; +801054e7: c7 43 0c 02 00 00 00 movl $0x2,0xc(%ebx) + sched(); +801054ee: e8 3d fd ff ff call 80105230 + p->chan = 0; +801054f3: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) +} +801054fa: e9 7b ff ff ff jmp 8010547a +801054ff: 90 nop + kfree(p->kstack); +80105500: 83 ec 0c sub $0xc,%esp + pid = p->pid; +80105503: 8b 73 10 mov 0x10(%ebx),%esi + kfree(p->kstack); +80105506: ff 73 08 push 0x8(%ebx) +80105509: e8 a2 e4 ff ff call 801039b0 + p->kstack = 0; +8010550e: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx) + freevm(p->pgdir); +80105515: 5a pop %edx +80105516: ff 73 04 push 0x4(%ebx) +80105519: e8 42 30 00 00 call 80108560 + p->pid = 0; +8010551e: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx) + p->parent = 0; +80105525: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx) + p->name[0] = 0; +8010552c: c6 43 6c 00 movb $0x0,0x6c(%ebx) + p->killed = 0; +80105530: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx) + p->state = UNUSED; +80105537: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx) + p->consoleptr = 0; +8010553e: c7 43 7c 00 00 00 00 movl $0x0,0x7c(%ebx) + release(&ptable.lock); +80105545: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +8010554c: e8 cf 05 00 00 call 80105b20 + return pid; +80105551: 83 c4 10 add $0x10,%esp +} +80105554: 8d 65 f8 lea -0x8(%ebp),%esp +80105557: 89 f0 mov %esi,%eax +80105559: 5b pop %ebx +8010555a: 5e pop %esi +8010555b: 5d pop %ebp +8010555c: c3 ret + release(&ptable.lock); +8010555d: 83 ec 0c sub $0xc,%esp + return -1; +80105560: be ff ff ff ff mov $0xffffffff,%esi + release(&ptable.lock); +80105565: 68 a0 e4 11 80 push $0x8011e4a0 +8010556a: e8 b1 05 00 00 call 80105b20 + return -1; +8010556f: 83 c4 10 add $0x10,%esp +80105572: eb e0 jmp 80105554 + panic("sleep"); +80105574: 83 ec 0c sub $0xc,%esp +80105577: 68 01 90 10 80 push $0x80109001 +8010557c: e8 ff ae ff ff call 80100480 +80105581: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105588: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010558f: 90 nop + +80105590 : +void yield(void) { +80105590: 55 push %ebp +80105591: 89 e5 mov %esp,%ebp +80105593: 53 push %ebx +80105594: 83 ec 10 sub $0x10,%esp + acquire(&ptable.lock); //DOC: yieldlock +80105597: 68 a0 e4 11 80 push $0x8011e4a0 +8010559c: e8 df 05 00 00 call 80105b80 + pushcli(); +801055a1: e8 8a 04 00 00 call 80105a30 + c = mycpu(); +801055a6: e8 85 f8 ff ff call 80104e30 + p = c->proc; +801055ab: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +801055b1: e8 ca 04 00 00 call 80105a80 + myproc()->state = RUNNABLE; +801055b6: c7 43 0c 03 00 00 00 movl $0x3,0xc(%ebx) + sched(); +801055bd: e8 6e fc ff ff call 80105230 + release(&ptable.lock); +801055c2: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +801055c9: e8 52 05 00 00 call 80105b20 +} +801055ce: 8b 5d fc mov -0x4(%ebp),%ebx +801055d1: 83 c4 10 add $0x10,%esp +801055d4: c9 leave +801055d5: c3 ret +801055d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801055dd: 8d 76 00 lea 0x0(%esi),%esi + +801055e0 : +void sleep(void *chan, struct spinlock *lk) { +801055e0: 55 push %ebp +801055e1: 89 e5 mov %esp,%ebp +801055e3: 57 push %edi +801055e4: 56 push %esi +801055e5: 53 push %ebx +801055e6: 83 ec 0c sub $0xc,%esp +801055e9: 8b 7d 08 mov 0x8(%ebp),%edi +801055ec: 8b 75 0c mov 0xc(%ebp),%esi + pushcli(); +801055ef: e8 3c 04 00 00 call 80105a30 + c = mycpu(); +801055f4: e8 37 f8 ff ff call 80104e30 + p = c->proc; +801055f9: 8b 98 ac 00 00 00 mov 0xac(%eax),%ebx + popcli(); +801055ff: e8 7c 04 00 00 call 80105a80 + if (p == 0) { +80105604: 85 db test %ebx,%ebx +80105606: 0f 84 87 00 00 00 je 80105693 + if (lk == 0) { +8010560c: 85 f6 test %esi,%esi +8010560e: 74 76 je 80105686 + if (lk != &ptable.lock) { //DOC: sleeplock0 +80105610: 81 fe a0 e4 11 80 cmp $0x8011e4a0,%esi +80105616: 74 50 je 80105668 + acquire(&ptable.lock); //DOC: sleeplock1 +80105618: 83 ec 0c sub $0xc,%esp +8010561b: 68 a0 e4 11 80 push $0x8011e4a0 +80105620: e8 5b 05 00 00 call 80105b80 + release(lk); +80105625: 89 34 24 mov %esi,(%esp) +80105628: e8 f3 04 00 00 call 80105b20 + p->chan = chan; +8010562d: 89 7b 20 mov %edi,0x20(%ebx) + p->state = SLEEPING; +80105630: c7 43 0c 02 00 00 00 movl $0x2,0xc(%ebx) + sched(); +80105637: e8 f4 fb ff ff call 80105230 + p->chan = 0; +8010563c: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) + release(&ptable.lock); +80105643: c7 04 24 a0 e4 11 80 movl $0x8011e4a0,(%esp) +8010564a: e8 d1 04 00 00 call 80105b20 + acquire(lk); +8010564f: 89 75 08 mov %esi,0x8(%ebp) +80105652: 83 c4 10 add $0x10,%esp +} +80105655: 8d 65 f4 lea -0xc(%ebp),%esp +80105658: 5b pop %ebx +80105659: 5e pop %esi +8010565a: 5f pop %edi +8010565b: 5d pop %ebp + acquire(lk); +8010565c: e9 1f 05 00 00 jmp 80105b80 +80105661: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + p->chan = chan; +80105668: 89 7b 20 mov %edi,0x20(%ebx) + p->state = SLEEPING; +8010566b: c7 43 0c 02 00 00 00 movl $0x2,0xc(%ebx) + sched(); +80105672: e8 b9 fb ff ff call 80105230 + p->chan = 0; +80105677: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) +} +8010567e: 8d 65 f4 lea -0xc(%ebp),%esp +80105681: 5b pop %ebx +80105682: 5e pop %esi +80105683: 5f pop %edi +80105684: 5d pop %ebp +80105685: c3 ret + panic("sleep without lk"); +80105686: 83 ec 0c sub $0xc,%esp +80105689: 68 07 90 10 80 push $0x80109007 +8010568e: e8 ed ad ff ff call 80100480 + panic("sleep"); +80105693: 83 ec 0c sub $0xc,%esp +80105696: 68 01 90 10 80 push $0x80109001 +8010569b: e8 e0 ad ff ff call 80100480 + +801056a0 : + } + } +} + +// Wake up all processes sleeping on chan. +void wakeup(void *chan) { +801056a0: 55 push %ebp +801056a1: 89 e5 mov %esp,%ebp +801056a3: 53 push %ebx +801056a4: 83 ec 10 sub $0x10,%esp +801056a7: 8b 5d 08 mov 0x8(%ebp),%ebx + acquire(&ptable.lock); +801056aa: 68 a0 e4 11 80 push $0x8011e4a0 +801056af: e8 cc 04 00 00 call 80105b80 +801056b4: 83 c4 10 add $0x10,%esp + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801056b7: b8 d4 e4 11 80 mov $0x8011e4d4,%eax +801056bc: eb 0e jmp 801056cc +801056be: 66 90 xchg %ax,%ax +801056c0: 05 94 00 00 00 add $0x94,%eax +801056c5: 3d d4 09 12 80 cmp $0x801209d4,%eax +801056ca: 74 1e je 801056ea + if (p->state == SLEEPING && p->chan == chan) { +801056cc: 83 78 0c 02 cmpl $0x2,0xc(%eax) +801056d0: 75 ee jne 801056c0 +801056d2: 3b 58 20 cmp 0x20(%eax),%ebx +801056d5: 75 e9 jne 801056c0 + p->state = RUNNABLE; +801056d7: c7 40 0c 03 00 00 00 movl $0x3,0xc(%eax) + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801056de: 05 94 00 00 00 add $0x94,%eax +801056e3: 3d d4 09 12 80 cmp $0x801209d4,%eax +801056e8: 75 e2 jne 801056cc + wakeup1(chan); + release(&ptable.lock); +801056ea: c7 45 08 a0 e4 11 80 movl $0x8011e4a0,0x8(%ebp) +} +801056f1: 8b 5d fc mov -0x4(%ebp),%ebx +801056f4: c9 leave + release(&ptable.lock); +801056f5: e9 26 04 00 00 jmp 80105b20 +801056fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105700 : + +// Kill the process with the given pid. +// Process won't exit until it returns +// to user space (see trap in trap.c). +int kill(int pid) { +80105700: 55 push %ebp +80105701: 89 e5 mov %esp,%ebp +80105703: 53 push %ebx +80105704: 83 ec 10 sub $0x10,%esp +80105707: 8b 5d 08 mov 0x8(%ebp),%ebx + struct proc *p; + + acquire(&ptable.lock); +8010570a: 68 a0 e4 11 80 push $0x8011e4a0 +8010570f: e8 6c 04 00 00 call 80105b80 +80105714: 83 c4 10 add $0x10,%esp + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +80105717: b8 d4 e4 11 80 mov $0x8011e4d4,%eax +8010571c: eb 0e jmp 8010572c +8010571e: 66 90 xchg %ax,%ax +80105720: 05 94 00 00 00 add $0x94,%eax +80105725: 3d d4 09 12 80 cmp $0x801209d4,%eax +8010572a: 74 34 je 80105760 + if (p->pid == pid) { +8010572c: 39 58 10 cmp %ebx,0x10(%eax) +8010572f: 75 ef jne 80105720 + p->killed = 1; + // Wake process from sleep if necessary. + if (p->state == SLEEPING) { +80105731: 83 78 0c 02 cmpl $0x2,0xc(%eax) + p->killed = 1; +80105735: c7 40 24 01 00 00 00 movl $0x1,0x24(%eax) + if (p->state == SLEEPING) { +8010573c: 75 07 jne 80105745 + p->state = RUNNABLE; +8010573e: c7 40 0c 03 00 00 00 movl $0x3,0xc(%eax) + } + release(&ptable.lock); +80105745: 83 ec 0c sub $0xc,%esp +80105748: 68 a0 e4 11 80 push $0x8011e4a0 +8010574d: e8 ce 03 00 00 call 80105b20 + return 0; + } + } + release(&ptable.lock); + return -1; +} +80105752: 8b 5d fc mov -0x4(%ebp),%ebx + return 0; +80105755: 83 c4 10 add $0x10,%esp +80105758: 31 c0 xor %eax,%eax +} +8010575a: c9 leave +8010575b: c3 ret +8010575c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + release(&ptable.lock); +80105760: 83 ec 0c sub $0xc,%esp +80105763: 68 a0 e4 11 80 push $0x8011e4a0 +80105768: e8 b3 03 00 00 call 80105b20 +} +8010576d: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80105770: 83 c4 10 add $0x10,%esp +80105773: b8 ff ff ff ff mov $0xffffffff,%eax +} +80105778: c9 leave +80105779: c3 ret +8010577a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105780 : + +// Print a process listing to console. For debugging. +// Runs when user types ^P on console. +// No lock to avoid wedging a stuck machine further. +void procdump(void) { +80105780: 55 push %ebp +80105781: 89 e5 mov %esp,%ebp +80105783: 57 push %edi +80105784: 56 push %esi +80105785: 53 push %ebx +80105786: bb 40 e5 11 80 mov $0x8011e540,%ebx +8010578b: 83 ec 48 sub $0x48,%esp + int i; + struct proc *p; + char *state; + uint pc[10]; + + cprintf("Listing Processes\nPid(Parent) State Name(console)\n"); +8010578e: 68 80 90 10 80 push $0x80109080 +80105793: e8 f8 b0 ff ff call 80100890 + cprintf("-------------------------------\n"); +80105798: c7 04 24 b4 90 10 80 movl $0x801090b4,(%esp) +8010579f: e8 ec b0 ff ff call 80100890 + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801057a4: 83 c4 10 add $0x10,%esp +801057a7: eb 29 jmp 801057d2 +801057a9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + // was 10 + for (i = 0; i < 5 && pc[i] != 0; i++) { + cprintf(" %p", pc[i]); + } + } + cprintf("\n"); +801057b0: 83 ec 0c sub $0xc,%esp +801057b3: 68 b3 94 10 80 push $0x801094b3 +801057b8: e8 d3 b0 ff ff call 80100890 +801057bd: 83 c4 10 add $0x10,%esp + for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { +801057c0: 81 c3 94 00 00 00 add $0x94,%ebx +801057c6: 81 fb 40 0a 12 80 cmp $0x80120a40,%ebx +801057cc: 0f 84 9e 00 00 00 je 80105870 + if (p->state == UNUSED) { +801057d2: 8b 43 a0 mov -0x60(%ebx),%eax +801057d5: 85 c0 test %eax,%eax +801057d7: 74 e7 je 801057c0 + state = "???"; +801057d9: bf 18 90 10 80 mov $0x80109018,%edi + if (p->state >= 0 && p->state < NELEM(states) && states[p->state]) { +801057de: 83 f8 05 cmp $0x5,%eax +801057e1: 77 11 ja 801057f4 +801057e3: 8b 3c 85 d8 90 10 80 mov -0x7fef6f28(,%eax,4),%edi + state = "???"; +801057ea: b8 18 90 10 80 mov $0x80109018,%eax +801057ef: 85 ff test %edi,%edi +801057f1: 0f 44 f8 cmove %eax,%edi + if (p->parent != 0x0) +801057f4: 8b 43 a8 mov -0x58(%ebx),%eax + int parentpid = 0; +801057f7: 31 f6 xor %esi,%esi + if (p->parent != 0x0) +801057f9: 85 c0 test %eax,%eax +801057fb: 74 03 je 80105800 + parentpid = p->parent->pid; +801057fd: 8b 70 10 mov 0x10(%eax),%esi + cprintf("%d(%d) %s %s(%d)", p->pid, parentpid, state, p->name, getconsoleindex(p->consoleptr)); +80105800: 83 ec 0c sub $0xc,%esp +80105803: ff 73 10 push 0x10(%ebx) +80105806: e8 65 ac ff ff call 80100470 +8010580b: 5a pop %edx +8010580c: 59 pop %ecx +8010580d: 50 push %eax +8010580e: 53 push %ebx +8010580f: 57 push %edi +80105810: 56 push %esi +80105811: ff 73 a4 push -0x5c(%ebx) +80105814: 68 1c 90 10 80 push $0x8010901c +80105819: e8 72 b0 ff ff call 80100890 + if (p->state == SLEEPING) { +8010581e: 83 c4 20 add $0x20,%esp +80105821: 83 7b a0 02 cmpl $0x2,-0x60(%ebx) +80105825: 75 89 jne 801057b0 + getcallerpcs((uint*)p->context->ebp + 2, pc); +80105827: 83 ec 08 sub $0x8,%esp +8010582a: 8d 45 c0 lea -0x40(%ebp),%eax +8010582d: 8d 75 c0 lea -0x40(%ebp),%esi +80105830: 50 push %eax +80105831: 8b 43 b0 mov -0x50(%ebx),%eax +80105834: 8d 7d d4 lea -0x2c(%ebp),%edi +80105837: 8b 40 0c mov 0xc(%eax),%eax +8010583a: 83 c0 08 add $0x8,%eax +8010583d: 50 push %eax +8010583e: e8 8d 01 00 00 call 801059d0 + for (i = 0; i < 5 && pc[i] != 0; i++) { +80105843: 83 c4 10 add $0x10,%esp +80105846: 8b 16 mov (%esi),%edx +80105848: 85 d2 test %edx,%edx +8010584a: 0f 84 60 ff ff ff je 801057b0 + cprintf(" %p", pc[i]); +80105850: 83 ec 08 sub $0x8,%esp + for (i = 0; i < 5 && pc[i] != 0; i++) { +80105853: 83 c6 04 add $0x4,%esi + cprintf(" %p", pc[i]); +80105856: 52 push %edx +80105857: 68 a1 89 10 80 push $0x801089a1 +8010585c: e8 2f b0 ff ff call 80100890 + for (i = 0; i < 5 && pc[i] != 0; i++) { +80105861: 83 c4 10 add $0x10,%esp +80105864: 39 f7 cmp %esi,%edi +80105866: 75 de jne 80105846 +80105868: e9 43 ff ff ff jmp 801057b0 +8010586d: 8d 76 00 lea 0x0(%esi),%esi + } +} +80105870: 8d 65 f4 lea -0xc(%ebp),%esp +80105873: 5b pop %ebx +80105874: 5e pop %esi +80105875: 5f pop %edi +80105876: 5d pop %ebp +80105877: c3 ret +80105878: 66 90 xchg %ax,%ax +8010587a: 66 90 xchg %ax,%ax +8010587c: 66 90 xchg %ax,%ax +8010587e: 66 90 xchg %ax,%ax + +80105880 : +#include "mmu.h" +#include "proc.h" +#include "spinlock.h" +#include "sleeplock.h" + +void initsleeplock(struct sleeplock *lk, char *name) { +80105880: 55 push %ebp +80105881: 89 e5 mov %esp,%ebp +80105883: 53 push %ebx +80105884: 83 ec 0c sub $0xc,%esp +80105887: 8b 5d 08 mov 0x8(%ebp),%ebx + initlock(&lk->lk, "sleep lock"); +8010588a: 68 f0 90 10 80 push $0x801090f0 +8010588f: 8d 43 04 lea 0x4(%ebx),%eax +80105892: 50 push %eax +80105893: e8 18 01 00 00 call 801059b0 + lk->name = name; +80105898: 8b 45 0c mov 0xc(%ebp),%eax + lk->locked = 0; +8010589b: c7 03 00 00 00 00 movl $0x0,(%ebx) + lk->pid = 0; +} +801058a1: 83 c4 10 add $0x10,%esp + lk->pid = 0; +801058a4: c7 43 3c 00 00 00 00 movl $0x0,0x3c(%ebx) + lk->name = name; +801058ab: 89 43 38 mov %eax,0x38(%ebx) +} +801058ae: 8b 5d fc mov -0x4(%ebp),%ebx +801058b1: c9 leave +801058b2: c3 ret +801058b3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801058ba: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +801058c0 : + +void acquiresleep(struct sleeplock *lk) { +801058c0: 55 push %ebp +801058c1: 89 e5 mov %esp,%ebp +801058c3: 56 push %esi +801058c4: 53 push %ebx +801058c5: 8b 5d 08 mov 0x8(%ebp),%ebx + acquire(&lk->lk); +801058c8: 8d 73 04 lea 0x4(%ebx),%esi +801058cb: 83 ec 0c sub $0xc,%esp +801058ce: 56 push %esi +801058cf: e8 ac 02 00 00 call 80105b80 + while (lk->locked) { +801058d4: 8b 13 mov (%ebx),%edx +801058d6: 83 c4 10 add $0x10,%esp +801058d9: 85 d2 test %edx,%edx +801058db: 74 16 je 801058f3 +801058dd: 8d 76 00 lea 0x0(%esi),%esi + sleep(lk, &lk->lk); +801058e0: 83 ec 08 sub $0x8,%esp +801058e3: 56 push %esi +801058e4: 53 push %ebx +801058e5: e8 f6 fc ff ff call 801055e0 + while (lk->locked) { +801058ea: 8b 03 mov (%ebx),%eax +801058ec: 83 c4 10 add $0x10,%esp +801058ef: 85 c0 test %eax,%eax +801058f1: 75 ed jne 801058e0 + } + lk->locked = 1; +801058f3: c7 03 01 00 00 00 movl $0x1,(%ebx) + lk->pid = myproc()->pid; +801058f9: e8 b2 f5 ff ff call 80104eb0 +801058fe: 8b 40 10 mov 0x10(%eax),%eax +80105901: 89 43 3c mov %eax,0x3c(%ebx) + release(&lk->lk); +80105904: 89 75 08 mov %esi,0x8(%ebp) +} +80105907: 8d 65 f8 lea -0x8(%ebp),%esp +8010590a: 5b pop %ebx +8010590b: 5e pop %esi +8010590c: 5d pop %ebp + release(&lk->lk); +8010590d: e9 0e 02 00 00 jmp 80105b20 +80105912: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105919: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80105920 : + +void releasesleep(struct sleeplock *lk) { +80105920: 55 push %ebp +80105921: 89 e5 mov %esp,%ebp +80105923: 56 push %esi +80105924: 53 push %ebx +80105925: 8b 5d 08 mov 0x8(%ebp),%ebx + acquire(&lk->lk); +80105928: 8d 73 04 lea 0x4(%ebx),%esi +8010592b: 83 ec 0c sub $0xc,%esp +8010592e: 56 push %esi +8010592f: e8 4c 02 00 00 call 80105b80 + lk->locked = 0; +80105934: c7 03 00 00 00 00 movl $0x0,(%ebx) + lk->pid = 0; +8010593a: c7 43 3c 00 00 00 00 movl $0x0,0x3c(%ebx) + wakeup(lk); +80105941: 89 1c 24 mov %ebx,(%esp) +80105944: e8 57 fd ff ff call 801056a0 + release(&lk->lk); +80105949: 89 75 08 mov %esi,0x8(%ebp) +8010594c: 83 c4 10 add $0x10,%esp +} +8010594f: 8d 65 f8 lea -0x8(%ebp),%esp +80105952: 5b pop %ebx +80105953: 5e pop %esi +80105954: 5d pop %ebp + release(&lk->lk); +80105955: e9 c6 01 00 00 jmp 80105b20 +8010595a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105960 : + +int holdingsleep(struct sleeplock *lk) { +80105960: 55 push %ebp +80105961: 89 e5 mov %esp,%ebp +80105963: 57 push %edi +80105964: 31 ff xor %edi,%edi +80105966: 56 push %esi +80105967: 53 push %ebx +80105968: 83 ec 18 sub $0x18,%esp +8010596b: 8b 5d 08 mov 0x8(%ebp),%ebx + int r; + + acquire(&lk->lk); +8010596e: 8d 73 04 lea 0x4(%ebx),%esi +80105971: 56 push %esi +80105972: e8 09 02 00 00 call 80105b80 + r = lk->locked && (lk->pid == myproc()->pid); +80105977: 8b 03 mov (%ebx),%eax +80105979: 83 c4 10 add $0x10,%esp +8010597c: 85 c0 test %eax,%eax +8010597e: 75 18 jne 80105998 + release(&lk->lk); +80105980: 83 ec 0c sub $0xc,%esp +80105983: 56 push %esi +80105984: e8 97 01 00 00 call 80105b20 + return r; +} +80105989: 8d 65 f4 lea -0xc(%ebp),%esp +8010598c: 89 f8 mov %edi,%eax +8010598e: 5b pop %ebx +8010598f: 5e pop %esi +80105990: 5f pop %edi +80105991: 5d pop %ebp +80105992: c3 ret +80105993: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105997: 90 nop + r = lk->locked && (lk->pid == myproc()->pid); +80105998: 8b 5b 3c mov 0x3c(%ebx),%ebx +8010599b: e8 10 f5 ff ff call 80104eb0 +801059a0: 39 58 10 cmp %ebx,0x10(%eax) +801059a3: 0f 94 c0 sete %al +801059a6: 0f b6 c0 movzbl %al,%eax +801059a9: 89 c7 mov %eax,%edi +801059ab: eb d3 jmp 80105980 +801059ad: 66 90 xchg %ax,%ax +801059af: 90 nop + +801059b0 : +#include "memlayout.h" +#include "mmu.h" +#include "proc.h" +#include "spinlock.h" + +void initlock(struct spinlock *lk, char *name) { +801059b0: 55 push %ebp +801059b1: 89 e5 mov %esp,%ebp +801059b3: 8b 45 08 mov 0x8(%ebp),%eax + lk->name = name; +801059b6: 8b 55 0c mov 0xc(%ebp),%edx + lk->locked = 0; +801059b9: c7 00 00 00 00 00 movl $0x0,(%eax) + lk->name = name; +801059bf: 89 50 04 mov %edx,0x4(%eax) + lk->cpu = 0; +801059c2: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) +} +801059c9: 5d pop %ebp +801059ca: c3 ret +801059cb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801059cf: 90 nop + +801059d0 : + + popcli(); +} + +// Record the current call stack in pcs[] by following the %ebp chain. +void getcallerpcs(void *v, uint pcs[]) { +801059d0: 55 push %ebp + uint *ebp; + int i; + + ebp = (uint*)v - 2; + for (i = 0; i < 10; i++) { +801059d1: 31 d2 xor %edx,%edx +void getcallerpcs(void *v, uint pcs[]) { +801059d3: 89 e5 mov %esp,%ebp +801059d5: 53 push %ebx + ebp = (uint*)v - 2; +801059d6: 8b 45 08 mov 0x8(%ebp),%eax +void getcallerpcs(void *v, uint pcs[]) { +801059d9: 8b 4d 0c mov 0xc(%ebp),%ecx + ebp = (uint*)v - 2; +801059dc: 83 e8 08 sub $0x8,%eax + for (i = 0; i < 10; i++) { +801059df: 90 nop + if (ebp == 0 || ebp < (uint*)KERNBASE || ebp == (uint*)0xffffffff) { +801059e0: 8d 98 00 00 00 80 lea -0x80000000(%eax),%ebx +801059e6: 81 fb fe ff ff 7f cmp $0x7ffffffe,%ebx +801059ec: 77 1a ja 80105a08 + break; + } + pcs[i] = ebp[1]; // saved %eip +801059ee: 8b 58 04 mov 0x4(%eax),%ebx +801059f1: 89 1c 91 mov %ebx,(%ecx,%edx,4) + for (i = 0; i < 10; i++) { +801059f4: 83 c2 01 add $0x1,%edx + ebp = (uint*)ebp[0]; // saved %ebp +801059f7: 8b 00 mov (%eax),%eax + for (i = 0; i < 10; i++) { +801059f9: 83 fa 0a cmp $0xa,%edx +801059fc: 75 e2 jne 801059e0 + } + for (; i < 10; i++) { + pcs[i] = 0; + } +} +801059fe: 8b 5d fc mov -0x4(%ebp),%ebx +80105a01: c9 leave +80105a02: c3 ret +80105a03: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105a07: 90 nop + for (; i < 10; i++) { +80105a08: 8d 04 91 lea (%ecx,%edx,4),%eax +80105a0b: 8d 51 28 lea 0x28(%ecx),%edx +80105a0e: 66 90 xchg %ax,%ax + pcs[i] = 0; +80105a10: c7 00 00 00 00 00 movl $0x0,(%eax) + for (; i < 10; i++) { +80105a16: 83 c0 04 add $0x4,%eax +80105a19: 39 d0 cmp %edx,%eax +80105a1b: 75 f3 jne 80105a10 +} +80105a1d: 8b 5d fc mov -0x4(%ebp),%ebx +80105a20: c9 leave +80105a21: c3 ret +80105a22: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105a29: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80105a30 : + +// Pushcli/popcli are like cli/sti except that they are matched: +// it takes two popcli to undo two pushcli. Also, if interrupts +// are off, then pushcli, popcli leaves them off. + +void pushcli(void) { +80105a30: 55 push %ebp +80105a31: 89 e5 mov %esp,%ebp +80105a33: 53 push %ebx +80105a34: 83 ec 04 sub $0x4,%esp +80105a37: 9c pushf +80105a38: 5b pop %ebx + asm volatile ("cli"); +80105a39: fa cli + int eflags; + + eflags = readeflags(); + cli(); + if (mycpu()->ncli == 0) { +80105a3a: e8 f1 f3 ff ff call 80104e30 +80105a3f: 8b 80 a4 00 00 00 mov 0xa4(%eax),%eax +80105a45: 85 c0 test %eax,%eax +80105a47: 74 17 je 80105a60 + mycpu()->intena = eflags & FL_IF; + } + mycpu()->ncli += 1; +80105a49: e8 e2 f3 ff ff call 80104e30 +80105a4e: 83 80 a4 00 00 00 01 addl $0x1,0xa4(%eax) +} +80105a55: 8b 5d fc mov -0x4(%ebp),%ebx +80105a58: c9 leave +80105a59: c3 ret +80105a5a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + mycpu()->intena = eflags & FL_IF; +80105a60: e8 cb f3 ff ff call 80104e30 +80105a65: 81 e3 00 02 00 00 and $0x200,%ebx +80105a6b: 89 98 a8 00 00 00 mov %ebx,0xa8(%eax) +80105a71: eb d6 jmp 80105a49 +80105a73: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105a7a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105a80 : + +void popcli(void) { +80105a80: 55 push %ebp +80105a81: 89 e5 mov %esp,%ebp +80105a83: 83 ec 08 sub $0x8,%esp + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +80105a86: 9c pushf +80105a87: 58 pop %eax + if (readeflags() & FL_IF) { +80105a88: f6 c4 02 test $0x2,%ah +80105a8b: 75 35 jne 80105ac2 + panic("popcli - interruptible"); + } + if (--mycpu()->ncli < 0) { +80105a8d: e8 9e f3 ff ff call 80104e30 +80105a92: 83 a8 a4 00 00 00 01 subl $0x1,0xa4(%eax) +80105a99: 78 34 js 80105acf + panic("popcli"); + } + if (mycpu()->ncli == 0 && mycpu()->intena) { +80105a9b: e8 90 f3 ff ff call 80104e30 +80105aa0: 8b 90 a4 00 00 00 mov 0xa4(%eax),%edx +80105aa6: 85 d2 test %edx,%edx +80105aa8: 74 06 je 80105ab0 + sti(); + } +} +80105aaa: c9 leave +80105aab: c3 ret +80105aac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (mycpu()->ncli == 0 && mycpu()->intena) { +80105ab0: e8 7b f3 ff ff call 80104e30 +80105ab5: 8b 80 a8 00 00 00 mov 0xa8(%eax),%eax +80105abb: 85 c0 test %eax,%eax +80105abd: 74 eb je 80105aaa + asm volatile ("sti"); +80105abf: fb sti +} +80105ac0: c9 leave +80105ac1: c3 ret + panic("popcli - interruptible"); +80105ac2: 83 ec 0c sub $0xc,%esp +80105ac5: 68 fb 90 10 80 push $0x801090fb +80105aca: e8 b1 a9 ff ff call 80100480 + panic("popcli"); +80105acf: 83 ec 0c sub $0xc,%esp +80105ad2: 68 12 91 10 80 push $0x80109112 +80105ad7: e8 a4 a9 ff ff call 80100480 +80105adc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80105ae0 : +int holding(struct spinlock *lock) { +80105ae0: 55 push %ebp +80105ae1: 89 e5 mov %esp,%ebp +80105ae3: 56 push %esi +80105ae4: 53 push %ebx +80105ae5: 8b 75 08 mov 0x8(%ebp),%esi +80105ae8: 31 db xor %ebx,%ebx + pushcli(); +80105aea: e8 41 ff ff ff call 80105a30 + r = lock->locked && lock->cpu == mycpu(); +80105aef: 8b 06 mov (%esi),%eax +80105af1: 85 c0 test %eax,%eax +80105af3: 75 0b jne 80105b00 + popcli(); +80105af5: e8 86 ff ff ff call 80105a80 +} +80105afa: 89 d8 mov %ebx,%eax +80105afc: 5b pop %ebx +80105afd: 5e pop %esi +80105afe: 5d pop %ebp +80105aff: c3 ret + r = lock->locked && lock->cpu == mycpu(); +80105b00: 8b 5e 08 mov 0x8(%esi),%ebx +80105b03: e8 28 f3 ff ff call 80104e30 +80105b08: 39 c3 cmp %eax,%ebx +80105b0a: 0f 94 c3 sete %bl + popcli(); +80105b0d: e8 6e ff ff ff call 80105a80 + r = lock->locked && lock->cpu == mycpu(); +80105b12: 0f b6 db movzbl %bl,%ebx +} +80105b15: 89 d8 mov %ebx,%eax +80105b17: 5b pop %ebx +80105b18: 5e pop %esi +80105b19: 5d pop %ebp +80105b1a: c3 ret +80105b1b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105b1f: 90 nop + +80105b20 : +void release(struct spinlock *lk) { +80105b20: 55 push %ebp +80105b21: 89 e5 mov %esp,%ebp +80105b23: 56 push %esi +80105b24: 53 push %ebx +80105b25: 8b 5d 08 mov 0x8(%ebp),%ebx + pushcli(); +80105b28: e8 03 ff ff ff call 80105a30 + r = lock->locked && lock->cpu == mycpu(); +80105b2d: 8b 03 mov (%ebx),%eax +80105b2f: 85 c0 test %eax,%eax +80105b31: 75 15 jne 80105b48 + popcli(); +80105b33: e8 48 ff ff ff call 80105a80 + panic("release"); +80105b38: 83 ec 0c sub $0xc,%esp +80105b3b: 68 19 91 10 80 push $0x80109119 +80105b40: e8 3b a9 ff ff call 80100480 +80105b45: 8d 76 00 lea 0x0(%esi),%esi + r = lock->locked && lock->cpu == mycpu(); +80105b48: 8b 73 08 mov 0x8(%ebx),%esi +80105b4b: e8 e0 f2 ff ff call 80104e30 +80105b50: 39 c6 cmp %eax,%esi +80105b52: 75 df jne 80105b33 + popcli(); +80105b54: e8 27 ff ff ff call 80105a80 + lk->pcs[0] = 0; +80105b59: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx) + lk->cpu = 0; +80105b60: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx) + __sync_synchronize(); +80105b67: f0 83 0c 24 00 lock orl $0x0,(%esp) + asm volatile ("movl $0, %0" : "+m" (lk->locked) :); +80105b6c: c7 03 00 00 00 00 movl $0x0,(%ebx) +} +80105b72: 8d 65 f8 lea -0x8(%ebp),%esp +80105b75: 5b pop %ebx +80105b76: 5e pop %esi +80105b77: 5d pop %ebp + popcli(); +80105b78: e9 03 ff ff ff jmp 80105a80 +80105b7d: 8d 76 00 lea 0x0(%esi),%esi + +80105b80 : +void acquire(struct spinlock *lk) { +80105b80: 55 push %ebp +80105b81: 89 e5 mov %esp,%ebp +80105b83: 53 push %ebx +80105b84: 83 ec 04 sub $0x4,%esp + pushcli(); // disable interrupts to avoid deadlock. +80105b87: e8 a4 fe ff ff call 80105a30 + if (holding(lk)) { +80105b8c: 8b 5d 08 mov 0x8(%ebp),%ebx + pushcli(); +80105b8f: e8 9c fe ff ff call 80105a30 + r = lock->locked && lock->cpu == mycpu(); +80105b94: 8b 03 mov (%ebx),%eax +80105b96: 85 c0 test %eax,%eax +80105b98: 75 7e jne 80105c18 + popcli(); +80105b9a: e8 e1 fe ff ff call 80105a80 + asm volatile ("lock; xchgl %0, %1" : +80105b9f: b9 01 00 00 00 mov $0x1,%ecx +80105ba4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while (xchg(&lk->locked, 1) != 0) { +80105ba8: 8b 55 08 mov 0x8(%ebp),%edx +80105bab: 89 c8 mov %ecx,%eax +80105bad: f0 87 02 lock xchg %eax,(%edx) +80105bb0: 85 c0 test %eax,%eax +80105bb2: 75 f4 jne 80105ba8 + __sync_synchronize(); +80105bb4: f0 83 0c 24 00 lock orl $0x0,(%esp) + lk->cpu = mycpu(); +80105bb9: 8b 5d 08 mov 0x8(%ebp),%ebx +80105bbc: e8 6f f2 ff ff call 80104e30 + getcallerpcs(&lk, lk->pcs); +80105bc1: 8b 4d 08 mov 0x8(%ebp),%ecx + ebp = (uint*)v - 2; +80105bc4: 89 ea mov %ebp,%edx + lk->cpu = mycpu(); +80105bc6: 89 43 08 mov %eax,0x8(%ebx) + for (i = 0; i < 10; i++) { +80105bc9: 31 c0 xor %eax,%eax +80105bcb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105bcf: 90 nop + if (ebp == 0 || ebp < (uint*)KERNBASE || ebp == (uint*)0xffffffff) { +80105bd0: 8d 9a 00 00 00 80 lea -0x80000000(%edx),%ebx +80105bd6: 81 fb fe ff ff 7f cmp $0x7ffffffe,%ebx +80105bdc: 77 1a ja 80105bf8 + pcs[i] = ebp[1]; // saved %eip +80105bde: 8b 5a 04 mov 0x4(%edx),%ebx +80105be1: 89 5c 81 0c mov %ebx,0xc(%ecx,%eax,4) + for (i = 0; i < 10; i++) { +80105be5: 83 c0 01 add $0x1,%eax + ebp = (uint*)ebp[0]; // saved %ebp +80105be8: 8b 12 mov (%edx),%edx + for (i = 0; i < 10; i++) { +80105bea: 83 f8 0a cmp $0xa,%eax +80105bed: 75 e1 jne 80105bd0 +} +80105bef: 8b 5d fc mov -0x4(%ebp),%ebx +80105bf2: c9 leave +80105bf3: c3 ret +80105bf4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + for (; i < 10; i++) { +80105bf8: 8d 44 81 0c lea 0xc(%ecx,%eax,4),%eax +80105bfc: 8d 51 34 lea 0x34(%ecx),%edx +80105bff: 90 nop + pcs[i] = 0; +80105c00: c7 00 00 00 00 00 movl $0x0,(%eax) + for (; i < 10; i++) { +80105c06: 83 c0 04 add $0x4,%eax +80105c09: 39 c2 cmp %eax,%edx +80105c0b: 75 f3 jne 80105c00 +} +80105c0d: 8b 5d fc mov -0x4(%ebp),%ebx +80105c10: c9 leave +80105c11: c3 ret +80105c12: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + r = lock->locked && lock->cpu == mycpu(); +80105c18: 8b 5b 08 mov 0x8(%ebx),%ebx +80105c1b: e8 10 f2 ff ff call 80104e30 +80105c20: 39 c3 cmp %eax,%ebx +80105c22: 0f 85 72 ff ff ff jne 80105b9a + popcli(); +80105c28: e8 53 fe ff ff call 80105a80 + panic("acquire"); +80105c2d: 83 ec 0c sub $0xc,%esp +80105c30: 68 21 91 10 80 push $0x80109121 +80105c35: e8 46 a8 ff ff call 80100480 +80105c3a: 66 90 xchg %ax,%ax +80105c3c: 66 90 xchg %ax,%ax +80105c3e: 66 90 xchg %ax,%ax + +80105c40 : +#include "types.h" +#include "x86.h" + +void* memset(void *dst, int c, uint n) { +80105c40: 55 push %ebp +80105c41: 89 e5 mov %esp,%ebp +80105c43: 57 push %edi +80105c44: 8b 55 08 mov 0x8(%ebp),%edx +80105c47: 8b 4d 10 mov 0x10(%ebp),%ecx +80105c4a: 53 push %ebx +80105c4b: 8b 45 0c mov 0xc(%ebp),%eax + if ((int)dst % 4 == 0 && n % 4 == 0) { +80105c4e: 89 d7 mov %edx,%edi +80105c50: 09 cf or %ecx,%edi +80105c52: 83 e7 03 and $0x3,%edi +80105c55: 75 29 jne 80105c80 + c &= 0xFF; +80105c57: 0f b6 f8 movzbl %al,%edi + stosl(dst, (c << 24) | (c << 16) | (c << 8) | c, n / 4); +80105c5a: c1 e0 18 shl $0x18,%eax +80105c5d: 89 fb mov %edi,%ebx +80105c5f: c1 e9 02 shr $0x2,%ecx +80105c62: c1 e3 10 shl $0x10,%ebx +80105c65: 09 d8 or %ebx,%eax +80105c67: 09 f8 or %edi,%eax +80105c69: c1 e7 08 shl $0x8,%edi +80105c6c: 09 f8 or %edi,%eax + asm volatile ("cld; rep stosl" : +80105c6e: 89 d7 mov %edx,%edi +80105c70: fc cld +80105c71: f3 ab rep stos %eax,%es:(%edi) + } + else { + stosb(dst, c, n); + } + return dst; +} +80105c73: 5b pop %ebx +80105c74: 89 d0 mov %edx,%eax +80105c76: 5f pop %edi +80105c77: 5d pop %ebp +80105c78: c3 ret +80105c79: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + asm volatile ("cld; rep stosb" : +80105c80: 89 d7 mov %edx,%edi +80105c82: fc cld +80105c83: f3 aa rep stos %al,%es:(%edi) +80105c85: 5b pop %ebx +80105c86: 89 d0 mov %edx,%eax +80105c88: 5f pop %edi +80105c89: 5d pop %ebp +80105c8a: c3 ret +80105c8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105c8f: 90 nop + +80105c90 : + +int memcmp(const void *v1, const void *v2, uint n) { +80105c90: 55 push %ebp +80105c91: 89 e5 mov %esp,%ebp +80105c93: 56 push %esi +80105c94: 8b 75 10 mov 0x10(%ebp),%esi +80105c97: 8b 55 08 mov 0x8(%ebp),%edx +80105c9a: 53 push %ebx +80105c9b: 8b 45 0c mov 0xc(%ebp),%eax + const uchar *s1, *s2; + + s1 = v1; + s2 = v2; + while (n-- > 0) { +80105c9e: 85 f6 test %esi,%esi +80105ca0: 74 2e je 80105cd0 +80105ca2: 01 c6 add %eax,%esi +80105ca4: eb 14 jmp 80105cba +80105ca6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105cad: 8d 76 00 lea 0x0(%esi),%esi + if (*s1 != *s2) { + return *s1 - *s2; + } + s1++, s2++; +80105cb0: 83 c0 01 add $0x1,%eax +80105cb3: 83 c2 01 add $0x1,%edx + while (n-- > 0) { +80105cb6: 39 f0 cmp %esi,%eax +80105cb8: 74 16 je 80105cd0 + if (*s1 != *s2) { +80105cba: 0f b6 0a movzbl (%edx),%ecx +80105cbd: 0f b6 18 movzbl (%eax),%ebx +80105cc0: 38 d9 cmp %bl,%cl +80105cc2: 74 ec je 80105cb0 + return *s1 - *s2; +80105cc4: 0f b6 c1 movzbl %cl,%eax +80105cc7: 29 d8 sub %ebx,%eax + } + + return 0; +} +80105cc9: 5b pop %ebx +80105cca: 5e pop %esi +80105ccb: 5d pop %ebp +80105ccc: c3 ret +80105ccd: 8d 76 00 lea 0x0(%esi),%esi +80105cd0: 5b pop %ebx + return 0; +80105cd1: 31 c0 xor %eax,%eax +} +80105cd3: 5e pop %esi +80105cd4: 5d pop %ebp +80105cd5: c3 ret +80105cd6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105cdd: 8d 76 00 lea 0x0(%esi),%esi + +80105ce0 : + +void* memmove(void *dst, const void *src, uint n) { +80105ce0: 55 push %ebp +80105ce1: 89 e5 mov %esp,%ebp +80105ce3: 57 push %edi +80105ce4: 8b 55 08 mov 0x8(%ebp),%edx +80105ce7: 8b 4d 10 mov 0x10(%ebp),%ecx +80105cea: 56 push %esi +80105ceb: 8b 75 0c mov 0xc(%ebp),%esi + const char *s; + char *d; + + s = src; + d = dst; + if (s < d && s + n > d) { +80105cee: 39 d6 cmp %edx,%esi +80105cf0: 73 26 jae 80105d18 +80105cf2: 8d 3c 0e lea (%esi,%ecx,1),%edi +80105cf5: 39 fa cmp %edi,%edx +80105cf7: 73 1f jae 80105d18 +80105cf9: 8d 41 ff lea -0x1(%ecx),%eax + s += n; + d += n; + while (n-- > 0) { +80105cfc: 85 c9 test %ecx,%ecx +80105cfe: 74 0c je 80105d0c + *--d = *--s; +80105d00: 0f b6 0c 06 movzbl (%esi,%eax,1),%ecx +80105d04: 88 0c 02 mov %cl,(%edx,%eax,1) + while (n-- > 0) { +80105d07: 83 e8 01 sub $0x1,%eax +80105d0a: 73 f4 jae 80105d00 + *d++ = *s++; + } + } + + return dst; +} +80105d0c: 5e pop %esi +80105d0d: 89 d0 mov %edx,%eax +80105d0f: 5f pop %edi +80105d10: 5d pop %ebp +80105d11: c3 ret +80105d12: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + while (n-- > 0) { +80105d18: 8d 04 0e lea (%esi,%ecx,1),%eax +80105d1b: 89 d7 mov %edx,%edi +80105d1d: 85 c9 test %ecx,%ecx +80105d1f: 74 eb je 80105d0c +80105d21: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + *d++ = *s++; +80105d28: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { +80105d29: 39 c6 cmp %eax,%esi +80105d2b: 75 fb jne 80105d28 +} +80105d2d: 5e pop %esi +80105d2e: 89 d0 mov %edx,%eax +80105d30: 5f pop %edi +80105d31: 5d pop %ebp +80105d32: c3 ret +80105d33: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105d3a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105d40 : + +// memcpy exists to placate GCC. Use memmove. +void* memcpy(void *dst, const void *src, uint n) { + return memmove(dst, src, n); +80105d40: eb 9e jmp 80105ce0 +80105d42: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105d49: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80105d50 : +} + +int strncmp(const char *p, const char *q, uint n) { +80105d50: 55 push %ebp +80105d51: 89 e5 mov %esp,%ebp +80105d53: 56 push %esi +80105d54: 8b 75 10 mov 0x10(%ebp),%esi +80105d57: 8b 4d 08 mov 0x8(%ebp),%ecx +80105d5a: 53 push %ebx +80105d5b: 8b 55 0c mov 0xc(%ebp),%edx + while (n > 0 && *p && *p == *q) { +80105d5e: 85 f6 test %esi,%esi +80105d60: 74 2e je 80105d90 +80105d62: 01 d6 add %edx,%esi +80105d64: eb 18 jmp 80105d7e +80105d66: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105d6d: 8d 76 00 lea 0x0(%esi),%esi +80105d70: 38 d8 cmp %bl,%al +80105d72: 75 14 jne 80105d88 + n--, p++, q++; +80105d74: 83 c2 01 add $0x1,%edx +80105d77: 83 c1 01 add $0x1,%ecx + while (n > 0 && *p && *p == *q) { +80105d7a: 39 f2 cmp %esi,%edx +80105d7c: 74 12 je 80105d90 +80105d7e: 0f b6 01 movzbl (%ecx),%eax +80105d81: 0f b6 1a movzbl (%edx),%ebx +80105d84: 84 c0 test %al,%al +80105d86: 75 e8 jne 80105d70 + } + if (n == 0) { + return 0; + } + return (uchar) * p - (uchar) * q; +80105d88: 29 d8 sub %ebx,%eax +} +80105d8a: 5b pop %ebx +80105d8b: 5e pop %esi +80105d8c: 5d pop %ebp +80105d8d: c3 ret +80105d8e: 66 90 xchg %ax,%ax +80105d90: 5b pop %ebx + return 0; +80105d91: 31 c0 xor %eax,%eax +} +80105d93: 5e pop %esi +80105d94: 5d pop %ebp +80105d95: c3 ret +80105d96: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105d9d: 8d 76 00 lea 0x0(%esi),%esi + +80105da0 : + +char* strncpy(char *s, const char *t, int n) { +80105da0: 55 push %ebp +80105da1: 89 e5 mov %esp,%ebp +80105da3: 57 push %edi +80105da4: 56 push %esi +80105da5: 8b 75 08 mov 0x8(%ebp),%esi +80105da8: 53 push %ebx +80105da9: 8b 4d 10 mov 0x10(%ebp),%ecx + char *os; + + os = s; + while (n-- > 0 && (*s++ = *t++) != 0) { +80105dac: 89 f0 mov %esi,%eax +80105dae: eb 15 jmp 80105dc5 +80105db0: 83 45 0c 01 addl $0x1,0xc(%ebp) +80105db4: 8b 7d 0c mov 0xc(%ebp),%edi +80105db7: 83 c0 01 add $0x1,%eax +80105dba: 0f b6 57 ff movzbl -0x1(%edi),%edx +80105dbe: 88 50 ff mov %dl,-0x1(%eax) +80105dc1: 84 d2 test %dl,%dl +80105dc3: 74 09 je 80105dce +80105dc5: 89 cb mov %ecx,%ebx +80105dc7: 83 e9 01 sub $0x1,%ecx +80105dca: 85 db test %ebx,%ebx +80105dcc: 7f e2 jg 80105db0 + ; + } + while (n-- > 0) { +80105dce: 89 c2 mov %eax,%edx +80105dd0: 85 c9 test %ecx,%ecx +80105dd2: 7e 17 jle 80105deb +80105dd4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + *s++ = 0; +80105dd8: 83 c2 01 add $0x1,%edx +80105ddb: 89 c1 mov %eax,%ecx +80105ddd: c6 42 ff 00 movb $0x0,-0x1(%edx) + while (n-- > 0) { +80105de1: 29 d1 sub %edx,%ecx +80105de3: 8d 4c 0b ff lea -0x1(%ebx,%ecx,1),%ecx +80105de7: 85 c9 test %ecx,%ecx +80105de9: 7f ed jg 80105dd8 + } + return os; +} +80105deb: 5b pop %ebx +80105dec: 89 f0 mov %esi,%eax +80105dee: 5e pop %esi +80105def: 5f pop %edi +80105df0: 5d pop %ebp +80105df1: c3 ret +80105df2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105df9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80105e00 : + +// Like strncpy but guaranteed to NUL-terminate. +char* safestrcpy(char *s, const char *t, int n) { +80105e00: 55 push %ebp +80105e01: 89 e5 mov %esp,%ebp +80105e03: 56 push %esi +80105e04: 8b 55 10 mov 0x10(%ebp),%edx +80105e07: 8b 75 08 mov 0x8(%ebp),%esi +80105e0a: 53 push %ebx +80105e0b: 8b 45 0c mov 0xc(%ebp),%eax + char *os; + + os = s; + if (n <= 0) { +80105e0e: 85 d2 test %edx,%edx +80105e10: 7e 25 jle 80105e37 +80105e12: 8d 5c 10 ff lea -0x1(%eax,%edx,1),%ebx +80105e16: 89 f2 mov %esi,%edx +80105e18: eb 16 jmp 80105e30 +80105e1a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return os; + } + while (--n > 0 && (*s++ = *t++) != 0) { +80105e20: 0f b6 08 movzbl (%eax),%ecx +80105e23: 83 c0 01 add $0x1,%eax +80105e26: 83 c2 01 add $0x1,%edx +80105e29: 88 4a ff mov %cl,-0x1(%edx) +80105e2c: 84 c9 test %cl,%cl +80105e2e: 74 04 je 80105e34 +80105e30: 39 d8 cmp %ebx,%eax +80105e32: 75 ec jne 80105e20 + ; + } + *s = 0; +80105e34: c6 02 00 movb $0x0,(%edx) + return os; +} +80105e37: 89 f0 mov %esi,%eax +80105e39: 5b pop %ebx +80105e3a: 5e pop %esi +80105e3b: 5d pop %ebp +80105e3c: c3 ret +80105e3d: 8d 76 00 lea 0x0(%esi),%esi + +80105e40 : + +int strlen(const char *s) { +80105e40: 55 push %ebp + int n; + + for (n = 0; s[n]; n++) { +80105e41: 31 c0 xor %eax,%eax +int strlen(const char *s) { +80105e43: 89 e5 mov %esp,%ebp +80105e45: 8b 55 08 mov 0x8(%ebp),%edx + for (n = 0; s[n]; n++) { +80105e48: 80 3a 00 cmpb $0x0,(%edx) +80105e4b: 74 0c je 80105e59 +80105e4d: 8d 76 00 lea 0x0(%esi),%esi +80105e50: 83 c0 01 add $0x1,%eax +80105e53: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) +80105e57: 75 f7 jne 80105e50 + ; + } + return n; +} +80105e59: 5d pop %ebp +80105e5a: c3 ret + +80105e5b : +# a struct context, and save its address in *old. +# Switch stacks to new and pop previously-saved registers. + +.globl swtch +swtch: + movl 4(%esp), %eax +80105e5b: 8b 44 24 04 mov 0x4(%esp),%eax + movl 8(%esp), %edx +80105e5f: 8b 54 24 08 mov 0x8(%esp),%edx + + # Save old callee-saved registers + pushl %ebp +80105e63: 55 push %ebp + pushl %ebx +80105e64: 53 push %ebx + pushl %esi +80105e65: 56 push %esi + pushl %edi +80105e66: 57 push %edi + + # Switch stacks + movl %esp, (%eax) +80105e67: 89 20 mov %esp,(%eax) + movl %edx, %esp +80105e69: 89 d4 mov %edx,%esp + + # Load new callee-saved registers + popl %edi +80105e6b: 5f pop %edi + popl %esi +80105e6c: 5e pop %esi + popl %ebx +80105e6d: 5b pop %ebx + popl %ebp +80105e6e: 5d pop %ebp + ret +80105e6f: c3 ret + +80105e70 : +// Arguments on the stack, from the user call to the C +// library system call function. The saved user %esp points +// to a saved program counter, and then the first argument. + +// Fetch the int at addr from the current process. +int fetchint(uint addr, int *ip) { +80105e70: 55 push %ebp +80105e71: 89 e5 mov %esp,%ebp +80105e73: 53 push %ebx +80105e74: 83 ec 04 sub $0x4,%esp +80105e77: 8b 5d 08 mov 0x8(%ebp),%ebx + struct proc *curproc = myproc(); +80105e7a: e8 31 f0 ff ff call 80104eb0 + + if (addr >= curproc->sz || addr + 4 > curproc->sz) { +80105e7f: 8b 00 mov (%eax),%eax +80105e81: 39 d8 cmp %ebx,%eax +80105e83: 76 1b jbe 80105ea0 +80105e85: 8d 53 04 lea 0x4(%ebx),%edx +80105e88: 39 d0 cmp %edx,%eax +80105e8a: 72 14 jb 80105ea0 + return -1; + } + *ip = *(int*)(addr); +80105e8c: 8b 45 0c mov 0xc(%ebp),%eax +80105e8f: 8b 13 mov (%ebx),%edx +80105e91: 89 10 mov %edx,(%eax) + return 0; +80105e93: 31 c0 xor %eax,%eax +} +80105e95: 8b 5d fc mov -0x4(%ebp),%ebx +80105e98: c9 leave +80105e99: c3 ret +80105e9a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return -1; +80105ea0: b8 ff ff ff ff mov $0xffffffff,%eax +80105ea5: eb ee jmp 80105e95 +80105ea7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105eae: 66 90 xchg %ax,%ax + +80105eb0 : + +// Fetch the nul-terminated string at addr from the current process. +// Doesn't actually copy the string - just sets *pp to point at it. +// Returns length of string, not including nul. +int fetchstr(uint addr, char **pp) { +80105eb0: 55 push %ebp +80105eb1: 89 e5 mov %esp,%ebp +80105eb3: 53 push %ebx +80105eb4: 83 ec 04 sub $0x4,%esp +80105eb7: 8b 5d 08 mov 0x8(%ebp),%ebx + char *s, *ep; + struct proc *curproc = myproc(); +80105eba: e8 f1 ef ff ff call 80104eb0 + + if (addr >= curproc->sz) { +80105ebf: 39 18 cmp %ebx,(%eax) +80105ec1: 76 2d jbe 80105ef0 + return -1; + } + *pp = (char*)addr; +80105ec3: 8b 55 0c mov 0xc(%ebp),%edx +80105ec6: 89 1a mov %ebx,(%edx) + ep = (char*)curproc->sz; +80105ec8: 8b 10 mov (%eax),%edx + for (s = *pp; s < ep; s++) { +80105eca: 39 d3 cmp %edx,%ebx +80105ecc: 73 22 jae 80105ef0 +80105ece: 89 d8 mov %ebx,%eax +80105ed0: eb 0d jmp 80105edf +80105ed2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +80105ed8: 83 c0 01 add $0x1,%eax +80105edb: 39 c2 cmp %eax,%edx +80105edd: 76 11 jbe 80105ef0 + if (*s == 0) { +80105edf: 80 38 00 cmpb $0x0,(%eax) +80105ee2: 75 f4 jne 80105ed8 + return s - *pp; +80105ee4: 29 d8 sub %ebx,%eax + } + } + return -1; +} +80105ee6: 8b 5d fc mov -0x4(%ebp),%ebx +80105ee9: c9 leave +80105eea: c3 ret +80105eeb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80105eef: 90 nop +80105ef0: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80105ef3: b8 ff ff ff ff mov $0xffffffff,%eax +} +80105ef8: c9 leave +80105ef9: c3 ret +80105efa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80105f00 : + +// Fetch the nth 32-bit system call argument. +int argint(int n, int *ip) { +80105f00: 55 push %ebp +80105f01: 89 e5 mov %esp,%ebp +80105f03: 56 push %esi +80105f04: 53 push %ebx + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105f05: e8 a6 ef ff ff call 80104eb0 +80105f0a: 8b 55 08 mov 0x8(%ebp),%edx +80105f0d: 8b 40 18 mov 0x18(%eax),%eax +80105f10: 8b 40 44 mov 0x44(%eax),%eax +80105f13: 8d 1c 90 lea (%eax,%edx,4),%ebx + struct proc *curproc = myproc(); +80105f16: e8 95 ef ff ff call 80104eb0 + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105f1b: 8d 73 04 lea 0x4(%ebx),%esi + if (addr >= curproc->sz || addr + 4 > curproc->sz) { +80105f1e: 8b 00 mov (%eax),%eax +80105f20: 39 c6 cmp %eax,%esi +80105f22: 73 1c jae 80105f40 +80105f24: 8d 53 08 lea 0x8(%ebx),%edx +80105f27: 39 d0 cmp %edx,%eax +80105f29: 72 15 jb 80105f40 + *ip = *(int*)(addr); +80105f2b: 8b 45 0c mov 0xc(%ebp),%eax +80105f2e: 8b 53 04 mov 0x4(%ebx),%edx +80105f31: 89 10 mov %edx,(%eax) + return 0; +80105f33: 31 c0 xor %eax,%eax +} +80105f35: 5b pop %ebx +80105f36: 5e pop %esi +80105f37: 5d pop %ebp +80105f38: c3 ret +80105f39: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return -1; +80105f40: b8 ff ff ff ff mov $0xffffffff,%eax + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105f45: eb ee jmp 80105f35 +80105f47: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105f4e: 66 90 xchg %ax,%ax + +80105f50 : + +// Fetch the nth word-sized system call argument as a pointer +// to a block of memory of size bytes. Check that the pointer +// lies within the process address space. +int argptr(int n, char **pp, int size) { +80105f50: 55 push %ebp +80105f51: 89 e5 mov %esp,%ebp +80105f53: 57 push %edi +80105f54: 56 push %esi +80105f55: 53 push %ebx +80105f56: 83 ec 0c sub $0xc,%esp + int i; + struct proc *curproc = myproc(); +80105f59: e8 52 ef ff ff call 80104eb0 +80105f5e: 89 c6 mov %eax,%esi + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105f60: e8 4b ef ff ff call 80104eb0 +80105f65: 8b 55 08 mov 0x8(%ebp),%edx +80105f68: 8b 40 18 mov 0x18(%eax),%eax +80105f6b: 8b 40 44 mov 0x44(%eax),%eax +80105f6e: 8d 1c 90 lea (%eax,%edx,4),%ebx + struct proc *curproc = myproc(); +80105f71: e8 3a ef ff ff call 80104eb0 + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105f76: 8d 7b 04 lea 0x4(%ebx),%edi + if (addr >= curproc->sz || addr + 4 > curproc->sz) { +80105f79: 8b 00 mov (%eax),%eax +80105f7b: 39 c7 cmp %eax,%edi +80105f7d: 73 31 jae 80105fb0 +80105f7f: 8d 4b 08 lea 0x8(%ebx),%ecx +80105f82: 39 c8 cmp %ecx,%eax +80105f84: 72 2a jb 80105fb0 + + if (argint(n, &i) < 0) { + return -1; + } + if (size < 0 || (uint)i >= curproc->sz || (uint)i + size > curproc->sz) { +80105f86: 8b 55 10 mov 0x10(%ebp),%edx + *ip = *(int*)(addr); +80105f89: 8b 43 04 mov 0x4(%ebx),%eax + if (size < 0 || (uint)i >= curproc->sz || (uint)i + size > curproc->sz) { +80105f8c: 85 d2 test %edx,%edx +80105f8e: 78 20 js 80105fb0 +80105f90: 8b 16 mov (%esi),%edx +80105f92: 39 c2 cmp %eax,%edx +80105f94: 76 1a jbe 80105fb0 +80105f96: 8b 5d 10 mov 0x10(%ebp),%ebx +80105f99: 01 c3 add %eax,%ebx +80105f9b: 39 da cmp %ebx,%edx +80105f9d: 72 11 jb 80105fb0 + return -1; + } + *pp = (char*)i; +80105f9f: 8b 55 0c mov 0xc(%ebp),%edx +80105fa2: 89 02 mov %eax,(%edx) + return 0; +80105fa4: 31 c0 xor %eax,%eax +} +80105fa6: 83 c4 0c add $0xc,%esp +80105fa9: 5b pop %ebx +80105faa: 5e pop %esi +80105fab: 5f pop %edi +80105fac: 5d pop %ebp +80105fad: c3 ret +80105fae: 66 90 xchg %ax,%ax + return -1; +80105fb0: b8 ff ff ff ff mov $0xffffffff,%eax +80105fb5: eb ef jmp 80105fa6 +80105fb7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80105fbe: 66 90 xchg %ax,%ax + +80105fc0 : + +// Fetch the nth word-sized system call argument as a string pointer. +// Check that the pointer is valid and the string is nul-terminated. +// (There is no shared writable memory, so the string can't change +// between this check and being used by the kernel.) +int argstr(int n, char **pp) { +80105fc0: 55 push %ebp +80105fc1: 89 e5 mov %esp,%ebp +80105fc3: 56 push %esi +80105fc4: 53 push %ebx + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105fc5: e8 e6 ee ff ff call 80104eb0 +80105fca: 8b 55 08 mov 0x8(%ebp),%edx +80105fcd: 8b 40 18 mov 0x18(%eax),%eax +80105fd0: 8b 40 44 mov 0x44(%eax),%eax +80105fd3: 8d 1c 90 lea (%eax,%edx,4),%ebx + struct proc *curproc = myproc(); +80105fd6: e8 d5 ee ff ff call 80104eb0 + return fetchint((myproc()->tf->esp) + 4 + 4 * n, ip); +80105fdb: 8d 73 04 lea 0x4(%ebx),%esi + if (addr >= curproc->sz || addr + 4 > curproc->sz) { +80105fde: 8b 00 mov (%eax),%eax +80105fe0: 39 c6 cmp %eax,%esi +80105fe2: 73 44 jae 80106028 +80105fe4: 8d 53 08 lea 0x8(%ebx),%edx +80105fe7: 39 d0 cmp %edx,%eax +80105fe9: 72 3d jb 80106028 + *ip = *(int*)(addr); +80105feb: 8b 5b 04 mov 0x4(%ebx),%ebx + struct proc *curproc = myproc(); +80105fee: e8 bd ee ff ff call 80104eb0 + if (addr >= curproc->sz) { +80105ff3: 3b 18 cmp (%eax),%ebx +80105ff5: 73 31 jae 80106028 + *pp = (char*)addr; +80105ff7: 8b 55 0c mov 0xc(%ebp),%edx +80105ffa: 89 1a mov %ebx,(%edx) + ep = (char*)curproc->sz; +80105ffc: 8b 10 mov (%eax),%edx + for (s = *pp; s < ep; s++) { +80105ffe: 39 d3 cmp %edx,%ebx +80106000: 73 26 jae 80106028 +80106002: 89 d8 mov %ebx,%eax +80106004: eb 11 jmp 80106017 +80106006: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010600d: 8d 76 00 lea 0x0(%esi),%esi +80106010: 83 c0 01 add $0x1,%eax +80106013: 39 c2 cmp %eax,%edx +80106015: 76 11 jbe 80106028 + if (*s == 0) { +80106017: 80 38 00 cmpb $0x0,(%eax) +8010601a: 75 f4 jne 80106010 + return s - *pp; +8010601c: 29 d8 sub %ebx,%eax + int addr; + if (argint(n, &addr) < 0) { + return -1; + } + return fetchstr(addr, pp); +} +8010601e: 5b pop %ebx +8010601f: 5e pop %esi +80106020: 5d pop %ebp +80106021: c3 ret +80106022: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +80106028: 5b pop %ebx + return -1; +80106029: b8 ff ff ff ff mov $0xffffffff,%eax +} +8010602e: 5e pop %esi +8010602f: 5d pop %ebp +80106030: c3 ret +80106031: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106038: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010603f: 90 nop + +80106040 : + +void syscall(void) { +80106040: 55 push %ebp +80106041: 89 e5 mov %esp,%ebp +80106043: 53 push %ebx +80106044: 83 ec 04 sub $0x4,%esp + int num; + struct proc *curproc = myproc(); +80106047: e8 64 ee ff ff call 80104eb0 +8010604c: 89 c3 mov %eax,%ebx + + num = curproc->tf->eax; +8010604e: 8b 40 18 mov 0x18(%eax),%eax +80106051: 8b 40 1c mov 0x1c(%eax),%eax + if (num > 0 && num < NELEM(syscalls) && syscalls[num]) { +80106054: 8d 50 ff lea -0x1(%eax),%edx +80106057: 83 fa 19 cmp $0x19,%edx +8010605a: 77 24 ja 80106080 +8010605c: 8b 14 85 60 91 10 80 mov -0x7fef6ea0(,%eax,4),%edx +80106063: 85 d2 test %edx,%edx +80106065: 74 19 je 80106080 + curproc->tf->eax = syscalls[num](); +80106067: ff d2 call *%edx +80106069: 89 c2 mov %eax,%edx +8010606b: 8b 43 18 mov 0x18(%ebx),%eax +8010606e: 89 50 1c mov %edx,0x1c(%eax) + else { + cprintf("%d %s: unknown sys call %d\n", + curproc->pid, curproc->name, num); + curproc->tf->eax = -1; + } +} +80106071: 8b 5d fc mov -0x4(%ebp),%ebx +80106074: c9 leave +80106075: c3 ret +80106076: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010607d: 8d 76 00 lea 0x0(%esi),%esi + cprintf("%d %s: unknown sys call %d\n", +80106080: 50 push %eax + curproc->pid, curproc->name, num); +80106081: 8d 43 6c lea 0x6c(%ebx),%eax + cprintf("%d %s: unknown sys call %d\n", +80106084: 50 push %eax +80106085: ff 73 10 push 0x10(%ebx) +80106088: 68 29 91 10 80 push $0x80109129 +8010608d: e8 fe a7 ff ff call 80100890 + curproc->tf->eax = -1; +80106092: 8b 43 18 mov 0x18(%ebx),%eax +80106095: 83 c4 10 add $0x10,%esp +80106098: c7 40 1c ff ff ff ff movl $0xffffffff,0x1c(%eax) +} +8010609f: 8b 5d fc mov -0x4(%ebp),%ebx +801060a2: c9 leave +801060a3: c3 ret +801060a4: 66 90 xchg %ax,%ax +801060a6: 66 90 xchg %ax,%ax +801060a8: 66 90 xchg %ax,%ax +801060aa: 66 90 xchg %ax,%ax +801060ac: 66 90 xchg %ax,%ax +801060ae: 66 90 xchg %ax,%ax + +801060b0 : + end_op(); + + return 0; +} + +static struct inode* create(char *path, short type, short major, short minor) { +801060b0: 55 push %ebp +801060b1: 89 e5 mov %esp,%ebp +801060b3: 57 push %edi +801060b4: 56 push %esi + struct inode *ip, *dp; + char name[DIRSIZ]; + + if ((dp = nameiparent(path, name)) == 0) { +801060b5: 8d 7d da lea -0x26(%ebp),%edi +static struct inode* create(char *path, short type, short major, short minor) { +801060b8: 53 push %ebx +801060b9: 83 ec 34 sub $0x34,%esp +801060bc: 89 4d d0 mov %ecx,-0x30(%ebp) +801060bf: 8b 4d 08 mov 0x8(%ebp),%ecx + if ((dp = nameiparent(path, name)) == 0) { +801060c2: 57 push %edi +801060c3: 50 push %eax +static struct inode* create(char *path, short type, short major, short minor) { +801060c4: 89 55 d4 mov %edx,-0x2c(%ebp) +801060c7: 89 4d cc mov %ecx,-0x34(%ebp) + if ((dp = nameiparent(path, name)) == 0) { +801060ca: e8 e1 d4 ff ff call 801035b0 +801060cf: 83 c4 10 add $0x10,%esp +801060d2: 85 c0 test %eax,%eax +801060d4: 0f 84 46 01 00 00 je 80106220 + return 0; + } + ilock(dp); +801060da: 83 ec 0c sub $0xc,%esp +801060dd: 89 c3 mov %eax,%ebx +801060df: 50 push %eax +801060e0: e8 8b cb ff ff call 80102c70 + + if ((ip = dirlookup(dp, name, 0)) != 0) { +801060e5: 83 c4 0c add $0xc,%esp +801060e8: 6a 00 push $0x0 +801060ea: 57 push %edi +801060eb: 53 push %ebx +801060ec: e8 df d0 ff ff call 801031d0 +801060f1: 83 c4 10 add $0x10,%esp +801060f4: 89 c6 mov %eax,%esi +801060f6: 85 c0 test %eax,%eax +801060f8: 74 56 je 80106150 + iunlockput(dp); +801060fa: 83 ec 0c sub $0xc,%esp +801060fd: 53 push %ebx +801060fe: e8 fd cd ff ff call 80102f00 + ilock(ip); +80106103: 89 34 24 mov %esi,(%esp) +80106106: e8 65 cb ff ff call 80102c70 + if (type == T_FILE && ip->type == T_FILE) { +8010610b: 83 c4 10 add $0x10,%esp +8010610e: 66 83 7d d4 02 cmpw $0x2,-0x2c(%ebp) +80106113: 75 1b jne 80106130 +80106115: 66 83 7e 50 02 cmpw $0x2,0x50(%esi) +8010611a: 75 14 jne 80106130 + } + + iunlockput(dp); + + return ip; +} +8010611c: 8d 65 f4 lea -0xc(%ebp),%esp +8010611f: 89 f0 mov %esi,%eax +80106121: 5b pop %ebx +80106122: 5e pop %esi +80106123: 5f pop %edi +80106124: 5d pop %ebp +80106125: c3 ret +80106126: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010612d: 8d 76 00 lea 0x0(%esi),%esi + iunlockput(ip); +80106130: 83 ec 0c sub $0xc,%esp +80106133: 56 push %esi + return 0; +80106134: 31 f6 xor %esi,%esi + iunlockput(ip); +80106136: e8 c5 cd ff ff call 80102f00 + return 0; +8010613b: 83 c4 10 add $0x10,%esp +} +8010613e: 8d 65 f4 lea -0xc(%ebp),%esp +80106141: 89 f0 mov %esi,%eax +80106143: 5b pop %ebx +80106144: 5e pop %esi +80106145: 5f pop %edi +80106146: 5d pop %ebp +80106147: c3 ret +80106148: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010614f: 90 nop + if ((ip = ialloc(dp->dev, type)) == 0) { +80106150: 0f bf 45 d4 movswl -0x2c(%ebp),%eax +80106154: 83 ec 08 sub $0x8,%esp +80106157: 50 push %eax +80106158: ff 33 push (%ebx) +8010615a: e8 a1 c9 ff ff call 80102b00 +8010615f: 83 c4 10 add $0x10,%esp +80106162: 89 c6 mov %eax,%esi +80106164: 85 c0 test %eax,%eax +80106166: 0f 84 cd 00 00 00 je 80106239 + ilock(ip); +8010616c: 83 ec 0c sub $0xc,%esp +8010616f: 50 push %eax +80106170: e8 fb ca ff ff call 80102c70 + ip->major = major; +80106175: 0f b7 45 d0 movzwl -0x30(%ebp),%eax +80106179: 66 89 46 52 mov %ax,0x52(%esi) + ip->minor = minor; +8010617d: 0f b7 45 cc movzwl -0x34(%ebp),%eax +80106181: 66 89 46 54 mov %ax,0x54(%esi) + ip->nlink = 1; +80106185: b8 01 00 00 00 mov $0x1,%eax +8010618a: 66 89 46 56 mov %ax,0x56(%esi) + iupdate(ip); +8010618e: 89 34 24 mov %esi,(%esp) +80106191: e8 2a ca ff ff call 80102bc0 + if (type == T_DIR) { // Create . and .. entries. +80106196: 83 c4 10 add $0x10,%esp +80106199: 66 83 7d d4 01 cmpw $0x1,-0x2c(%ebp) +8010619e: 74 30 je 801061d0 + if (dirlink(dp, name, ip->inum) < 0) { +801061a0: 83 ec 04 sub $0x4,%esp +801061a3: ff 76 04 push 0x4(%esi) +801061a6: 57 push %edi +801061a7: 53 push %ebx +801061a8: e8 23 d3 ff ff call 801034d0 +801061ad: 83 c4 10 add $0x10,%esp +801061b0: 85 c0 test %eax,%eax +801061b2: 78 78 js 8010622c + iunlockput(dp); +801061b4: 83 ec 0c sub $0xc,%esp +801061b7: 53 push %ebx +801061b8: e8 43 cd ff ff call 80102f00 + return ip; +801061bd: 83 c4 10 add $0x10,%esp +} +801061c0: 8d 65 f4 lea -0xc(%ebp),%esp +801061c3: 89 f0 mov %esi,%eax +801061c5: 5b pop %ebx +801061c6: 5e pop %esi +801061c7: 5f pop %edi +801061c8: 5d pop %ebp +801061c9: c3 ret +801061ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + iupdate(dp); +801061d0: 83 ec 0c sub $0xc,%esp + dp->nlink++; // for ".." +801061d3: 66 83 43 56 01 addw $0x1,0x56(%ebx) + iupdate(dp); +801061d8: 53 push %ebx +801061d9: e8 e2 c9 ff ff call 80102bc0 + if (dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0) { +801061de: 83 c4 0c add $0xc,%esp +801061e1: ff 76 04 push 0x4(%esi) +801061e4: 68 e8 91 10 80 push $0x801091e8 +801061e9: 56 push %esi +801061ea: e8 e1 d2 ff ff call 801034d0 +801061ef: 83 c4 10 add $0x10,%esp +801061f2: 85 c0 test %eax,%eax +801061f4: 78 18 js 8010620e +801061f6: 83 ec 04 sub $0x4,%esp +801061f9: ff 73 04 push 0x4(%ebx) +801061fc: 68 e7 91 10 80 push $0x801091e7 +80106201: 56 push %esi +80106202: e8 c9 d2 ff ff call 801034d0 +80106207: 83 c4 10 add $0x10,%esp +8010620a: 85 c0 test %eax,%eax +8010620c: 79 92 jns 801061a0 + panic("create dots"); +8010620e: 83 ec 0c sub $0xc,%esp +80106211: 68 db 91 10 80 push $0x801091db +80106216: e8 65 a2 ff ff call 80100480 +8010621b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010621f: 90 nop +} +80106220: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +80106223: 31 f6 xor %esi,%esi +} +80106225: 5b pop %ebx +80106226: 89 f0 mov %esi,%eax +80106228: 5e pop %esi +80106229: 5f pop %edi +8010622a: 5d pop %ebp +8010622b: c3 ret + panic("create: dirlink"); +8010622c: 83 ec 0c sub $0xc,%esp +8010622f: 68 ea 91 10 80 push $0x801091ea +80106234: e8 47 a2 ff ff call 80100480 + panic("create: ialloc"); +80106239: 83 ec 0c sub $0xc,%esp +8010623c: 68 cc 91 10 80 push $0x801091cc +80106241: e8 3a a2 ff ff call 80100480 +80106246: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010624d: 8d 76 00 lea 0x0(%esi),%esi + +80106250 : +int sys_dup(void) { +80106250: 55 push %ebp +80106251: 89 e5 mov %esp,%ebp +80106253: 56 push %esi +80106254: 53 push %ebx + if (argint(n, &fd) < 0) { +80106255: 8d 45 f4 lea -0xc(%ebp),%eax +int sys_dup(void) { +80106258: 83 ec 18 sub $0x18,%esp + if (argint(n, &fd) < 0) { +8010625b: 50 push %eax +8010625c: 6a 00 push $0x0 +8010625e: e8 9d fc ff ff call 80105f00 +80106263: 83 c4 10 add $0x10,%esp +80106266: 85 c0 test %eax,%eax +80106268: 78 36 js 801062a0 + if (fd < 0 || fd >= NOFILE || (f = myproc()->ofile[fd]) == 0) { +8010626a: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +8010626e: 77 30 ja 801062a0 +80106270: e8 3b ec ff ff call 80104eb0 +80106275: 8b 55 f4 mov -0xc(%ebp),%edx +80106278: 8b 74 90 28 mov 0x28(%eax,%edx,4),%esi +8010627c: 85 f6 test %esi,%esi +8010627e: 74 20 je 801062a0 + struct proc *curproc = myproc(); +80106280: e8 2b ec ff ff call 80104eb0 + for (fd = 0; fd < NOFILE; fd++) { +80106285: 31 db xor %ebx,%ebx +80106287: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010628e: 66 90 xchg %ax,%ax + if (curproc->ofile[fd] == 0) { +80106290: 8b 54 98 28 mov 0x28(%eax,%ebx,4),%edx +80106294: 85 d2 test %edx,%edx +80106296: 74 18 je 801062b0 + for (fd = 0; fd < NOFILE; fd++) { +80106298: 83 c3 01 add $0x1,%ebx +8010629b: 83 fb 10 cmp $0x10,%ebx +8010629e: 75 f0 jne 80106290 +} +801062a0: 8d 65 f8 lea -0x8(%ebp),%esp + return -1; +801062a3: bb ff ff ff ff mov $0xffffffff,%ebx +} +801062a8: 89 d8 mov %ebx,%eax +801062aa: 5b pop %ebx +801062ab: 5e pop %esi +801062ac: 5d pop %ebp +801062ad: c3 ret +801062ae: 66 90 xchg %ax,%ax + filedup(f); +801062b0: 83 ec 0c sub $0xc,%esp + curproc->ofile[fd] = f; +801062b3: 89 74 98 28 mov %esi,0x28(%eax,%ebx,4) + filedup(f); +801062b7: 56 push %esi +801062b8: e8 d3 c0 ff ff call 80102390 + return fd; +801062bd: 83 c4 10 add $0x10,%esp +} +801062c0: 8d 65 f8 lea -0x8(%ebp),%esp +801062c3: 89 d8 mov %ebx,%eax +801062c5: 5b pop %ebx +801062c6: 5e pop %esi +801062c7: 5d pop %ebp +801062c8: c3 ret +801062c9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +801062d0 : +int sys_read(void) { +801062d0: 55 push %ebp +801062d1: 89 e5 mov %esp,%ebp +801062d3: 56 push %esi +801062d4: 53 push %ebx + if (argint(n, &fd) < 0) { +801062d5: 8d 5d f4 lea -0xc(%ebp),%ebx +int sys_read(void) { +801062d8: 83 ec 18 sub $0x18,%esp + if (argint(n, &fd) < 0) { +801062db: 53 push %ebx +801062dc: 6a 00 push $0x0 +801062de: e8 1d fc ff ff call 80105f00 +801062e3: 83 c4 10 add $0x10,%esp +801062e6: 85 c0 test %eax,%eax +801062e8: 78 5e js 80106348 + if (fd < 0 || fd >= NOFILE || (f = myproc()->ofile[fd]) == 0) { +801062ea: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +801062ee: 77 58 ja 80106348 +801062f0: e8 bb eb ff ff call 80104eb0 +801062f5: 8b 55 f4 mov -0xc(%ebp),%edx +801062f8: 8b 74 90 28 mov 0x28(%eax,%edx,4),%esi +801062fc: 85 f6 test %esi,%esi +801062fe: 74 48 je 80106348 + if (argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) { +80106300: 83 ec 08 sub $0x8,%esp +80106303: 8d 45 f0 lea -0x10(%ebp),%eax +80106306: 50 push %eax +80106307: 6a 02 push $0x2 +80106309: e8 f2 fb ff ff call 80105f00 +8010630e: 83 c4 10 add $0x10,%esp +80106311: 85 c0 test %eax,%eax +80106313: 78 33 js 80106348 +80106315: 83 ec 04 sub $0x4,%esp +80106318: ff 75 f0 push -0x10(%ebp) +8010631b: 53 push %ebx +8010631c: 6a 01 push $0x1 +8010631e: e8 2d fc ff ff call 80105f50 +80106323: 83 c4 10 add $0x10,%esp +80106326: 85 c0 test %eax,%eax +80106328: 78 1e js 80106348 + return fileread(f, p, n); +8010632a: 83 ec 04 sub $0x4,%esp +8010632d: ff 75 f0 push -0x10(%ebp) +80106330: ff 75 f4 push -0xc(%ebp) +80106333: 56 push %esi +80106334: e8 d7 c1 ff ff call 80102510 +80106339: 83 c4 10 add $0x10,%esp +} +8010633c: 8d 65 f8 lea -0x8(%ebp),%esp +8010633f: 5b pop %ebx +80106340: 5e pop %esi +80106341: 5d pop %ebp +80106342: c3 ret +80106343: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +80106347: 90 nop + return -1; +80106348: b8 ff ff ff ff mov $0xffffffff,%eax +8010634d: eb ed jmp 8010633c +8010634f: 90 nop + +80106350 : +int sys_write(void) { +80106350: 55 push %ebp +80106351: 89 e5 mov %esp,%ebp +80106353: 56 push %esi +80106354: 53 push %ebx + if (argint(n, &fd) < 0) { +80106355: 8d 5d f4 lea -0xc(%ebp),%ebx +int sys_write(void) { +80106358: 83 ec 18 sub $0x18,%esp + if (argint(n, &fd) < 0) { +8010635b: 53 push %ebx +8010635c: 6a 00 push $0x0 +8010635e: e8 9d fb ff ff call 80105f00 +80106363: 83 c4 10 add $0x10,%esp +80106366: 85 c0 test %eax,%eax +80106368: 78 5e js 801063c8 + if (fd < 0 || fd >= NOFILE || (f = myproc()->ofile[fd]) == 0) { +8010636a: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +8010636e: 77 58 ja 801063c8 +80106370: e8 3b eb ff ff call 80104eb0 +80106375: 8b 55 f4 mov -0xc(%ebp),%edx +80106378: 8b 74 90 28 mov 0x28(%eax,%edx,4),%esi +8010637c: 85 f6 test %esi,%esi +8010637e: 74 48 je 801063c8 + if (argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) { +80106380: 83 ec 08 sub $0x8,%esp +80106383: 8d 45 f0 lea -0x10(%ebp),%eax +80106386: 50 push %eax +80106387: 6a 02 push $0x2 +80106389: e8 72 fb ff ff call 80105f00 +8010638e: 83 c4 10 add $0x10,%esp +80106391: 85 c0 test %eax,%eax +80106393: 78 33 js 801063c8 +80106395: 83 ec 04 sub $0x4,%esp +80106398: ff 75 f0 push -0x10(%ebp) +8010639b: 53 push %ebx +8010639c: 6a 01 push $0x1 +8010639e: e8 ad fb ff ff call 80105f50 +801063a3: 83 c4 10 add $0x10,%esp +801063a6: 85 c0 test %eax,%eax +801063a8: 78 1e js 801063c8 + return filewrite(f, p, n); +801063aa: 83 ec 04 sub $0x4,%esp +801063ad: ff 75 f0 push -0x10(%ebp) +801063b0: ff 75 f4 push -0xc(%ebp) +801063b3: 56 push %esi +801063b4: e8 e7 c1 ff ff call 801025a0 +801063b9: 83 c4 10 add $0x10,%esp +} +801063bc: 8d 65 f8 lea -0x8(%ebp),%esp +801063bf: 5b pop %ebx +801063c0: 5e pop %esi +801063c1: 5d pop %ebp +801063c2: c3 ret +801063c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801063c7: 90 nop + return -1; +801063c8: b8 ff ff ff ff mov $0xffffffff,%eax +801063cd: eb ed jmp 801063bc +801063cf: 90 nop + +801063d0 : +int sys_close(void) { +801063d0: 55 push %ebp +801063d1: 89 e5 mov %esp,%ebp +801063d3: 56 push %esi +801063d4: 53 push %ebx + if (argint(n, &fd) < 0) { +801063d5: 8d 45 f4 lea -0xc(%ebp),%eax +int sys_close(void) { +801063d8: 83 ec 18 sub $0x18,%esp + if (argint(n, &fd) < 0) { +801063db: 50 push %eax +801063dc: 6a 00 push $0x0 +801063de: e8 1d fb ff ff call 80105f00 +801063e3: 83 c4 10 add $0x10,%esp +801063e6: 85 c0 test %eax,%eax +801063e8: 78 3e js 80106428 + if (fd < 0 || fd >= NOFILE || (f = myproc()->ofile[fd]) == 0) { +801063ea: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +801063ee: 77 38 ja 80106428 +801063f0: e8 bb ea ff ff call 80104eb0 +801063f5: 8b 55 f4 mov -0xc(%ebp),%edx +801063f8: 8d 5a 08 lea 0x8(%edx),%ebx +801063fb: 8b 74 98 08 mov 0x8(%eax,%ebx,4),%esi +801063ff: 85 f6 test %esi,%esi +80106401: 74 25 je 80106428 + myproc()->ofile[fd] = 0; +80106403: e8 a8 ea ff ff call 80104eb0 + fileclose(f); +80106408: 83 ec 0c sub $0xc,%esp + myproc()->ofile[fd] = 0; +8010640b: c7 44 98 08 00 00 00 movl $0x0,0x8(%eax,%ebx,4) +80106412: 00 + fileclose(f); +80106413: 56 push %esi +80106414: e8 c7 bf ff ff call 801023e0 + return 0; +80106419: 83 c4 10 add $0x10,%esp +8010641c: 31 c0 xor %eax,%eax +} +8010641e: 8d 65 f8 lea -0x8(%ebp),%esp +80106421: 5b pop %ebx +80106422: 5e pop %esi +80106423: 5d pop %ebp +80106424: c3 ret +80106425: 8d 76 00 lea 0x0(%esi),%esi + return -1; +80106428: b8 ff ff ff ff mov $0xffffffff,%eax +8010642d: eb ef jmp 8010641e +8010642f: 90 nop + +80106430 : +int sys_fstat(void) { +80106430: 55 push %ebp +80106431: 89 e5 mov %esp,%ebp +80106433: 56 push %esi +80106434: 53 push %ebx + if (argint(n, &fd) < 0) { +80106435: 8d 5d f4 lea -0xc(%ebp),%ebx +int sys_fstat(void) { +80106438: 83 ec 18 sub $0x18,%esp + if (argint(n, &fd) < 0) { +8010643b: 53 push %ebx +8010643c: 6a 00 push $0x0 +8010643e: e8 bd fa ff ff call 80105f00 +80106443: 83 c4 10 add $0x10,%esp +80106446: 85 c0 test %eax,%eax +80106448: 78 46 js 80106490 + if (fd < 0 || fd >= NOFILE || (f = myproc()->ofile[fd]) == 0) { +8010644a: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +8010644e: 77 40 ja 80106490 +80106450: e8 5b ea ff ff call 80104eb0 +80106455: 8b 55 f4 mov -0xc(%ebp),%edx +80106458: 8b 74 90 28 mov 0x28(%eax,%edx,4),%esi +8010645c: 85 f6 test %esi,%esi +8010645e: 74 30 je 80106490 + if (argfd(0, 0, &f) < 0 || argptr(1, (void*)&st, sizeof(*st)) < 0) { +80106460: 83 ec 04 sub $0x4,%esp +80106463: 6a 14 push $0x14 +80106465: 53 push %ebx +80106466: 6a 01 push $0x1 +80106468: e8 e3 fa ff ff call 80105f50 +8010646d: 83 c4 10 add $0x10,%esp +80106470: 85 c0 test %eax,%eax +80106472: 78 1c js 80106490 + return filestat(f, st); +80106474: 83 ec 08 sub $0x8,%esp +80106477: ff 75 f4 push -0xc(%ebp) +8010647a: 56 push %esi +8010647b: e8 40 c0 ff ff call 801024c0 +80106480: 83 c4 10 add $0x10,%esp +} +80106483: 8d 65 f8 lea -0x8(%ebp),%esp +80106486: 5b pop %ebx +80106487: 5e pop %esi +80106488: 5d pop %ebp +80106489: c3 ret +8010648a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return -1; +80106490: b8 ff ff ff ff mov $0xffffffff,%eax +80106495: eb ec jmp 80106483 +80106497: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010649e: 66 90 xchg %ax,%ax + +801064a0 : +void cleanupsyslink(struct inode * ip) { +801064a0: 55 push %ebp +801064a1: 89 e5 mov %esp,%ebp +801064a3: 53 push %ebx +801064a4: 83 ec 10 sub $0x10,%esp +801064a7: 8b 5d 08 mov 0x8(%ebp),%ebx + ilock(ip); +801064aa: 53 push %ebx +801064ab: e8 c0 c7 ff ff call 80102c70 + ip->nlink--; +801064b0: 66 83 6b 56 01 subw $0x1,0x56(%ebx) + iupdate(ip); +801064b5: 89 1c 24 mov %ebx,(%esp) +801064b8: e8 03 c7 ff ff call 80102bc0 + iunlockput(ip); +801064bd: 89 1c 24 mov %ebx,(%esp) +801064c0: e8 3b ca ff ff call 80102f00 +} +801064c5: 8b 5d fc mov -0x4(%ebp),%ebx + end_op(); +801064c8: 83 c4 10 add $0x10,%esp +} +801064cb: c9 leave + end_op(); +801064cc: e9 ef dd ff ff jmp 801042c0 +801064d1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801064d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801064df: 90 nop + +801064e0 : +int sys_link(void) { +801064e0: 55 push %ebp +801064e1: 89 e5 mov %esp,%ebp +801064e3: 57 push %edi +801064e4: 56 push %esi + if (argstr(0, &old) < 0 || argstr(1, &new) < 0) { +801064e5: 8d 45 d4 lea -0x2c(%ebp),%eax +int sys_link(void) { +801064e8: 53 push %ebx +801064e9: 83 ec 34 sub $0x34,%esp + if (argstr(0, &old) < 0 || argstr(1, &new) < 0) { +801064ec: 50 push %eax +801064ed: 6a 00 push $0x0 +801064ef: e8 cc fa ff ff call 80105fc0 +801064f4: 83 c4 10 add $0x10,%esp +801064f7: 85 c0 test %eax,%eax +801064f9: 0f 88 ff 00 00 00 js 801065fe +801064ff: 83 ec 08 sub $0x8,%esp +80106502: 8d 45 d0 lea -0x30(%ebp),%eax +80106505: 50 push %eax +80106506: 6a 01 push $0x1 +80106508: e8 b3 fa ff ff call 80105fc0 +8010650d: 83 c4 10 add $0x10,%esp +80106510: 85 c0 test %eax,%eax +80106512: 0f 88 e6 00 00 00 js 801065fe + begin_op(); +80106518: e8 33 dd ff ff call 80104250 + if ((ip = namei(old)) == 0) { +8010651d: 83 ec 0c sub $0xc,%esp +80106520: ff 75 d4 push -0x2c(%ebp) +80106523: e8 68 d0 ff ff call 80103590 +80106528: 83 c4 10 add $0x10,%esp +8010652b: 89 c3 mov %eax,%ebx +8010652d: 85 c0 test %eax,%eax +8010652f: 0f 84 e8 00 00 00 je 8010661d + ilock(ip); +80106535: 83 ec 0c sub $0xc,%esp +80106538: 50 push %eax +80106539: e8 32 c7 ff ff call 80102c70 + if (ip->type == T_DIR) { +8010653e: 83 c4 10 add $0x10,%esp +80106541: 66 83 7b 50 01 cmpw $0x1,0x50(%ebx) +80106546: 0f 84 b9 00 00 00 je 80106605 + iupdate(ip); +8010654c: 83 ec 0c sub $0xc,%esp + ip->nlink++; +8010654f: 66 83 43 56 01 addw $0x1,0x56(%ebx) + if ((dp = nameiparent(new, name)) == 0) { +80106554: 8d 7d da lea -0x26(%ebp),%edi + iupdate(ip); +80106557: 53 push %ebx +80106558: e8 63 c6 ff ff call 80102bc0 + iunlock(ip); +8010655d: 89 1c 24 mov %ebx,(%esp) +80106560: e8 eb c7 ff ff call 80102d50 + if ((dp = nameiparent(new, name)) == 0) { +80106565: 58 pop %eax +80106566: 5a pop %edx +80106567: 57 push %edi +80106568: ff 75 d0 push -0x30(%ebp) +8010656b: e8 40 d0 ff ff call 801035b0 +80106570: 83 c4 10 add $0x10,%esp +80106573: 89 c6 mov %eax,%esi +80106575: 85 c0 test %eax,%eax +80106577: 0f 84 ac 00 00 00 je 80106629 + ilock(dp); +8010657d: 83 ec 0c sub $0xc,%esp +80106580: 50 push %eax +80106581: e8 ea c6 ff ff call 80102c70 + if (dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0) { +80106586: 8b 03 mov (%ebx),%eax +80106588: 83 c4 10 add $0x10,%esp +8010658b: 39 06 cmp %eax,(%esi) +8010658d: 75 41 jne 801065d0 +8010658f: 83 ec 04 sub $0x4,%esp +80106592: ff 73 04 push 0x4(%ebx) +80106595: 57 push %edi +80106596: 56 push %esi +80106597: e8 34 cf ff ff call 801034d0 +8010659c: 83 c4 10 add $0x10,%esp +8010659f: 85 c0 test %eax,%eax +801065a1: 78 2d js 801065d0 + iunlockput(dp); +801065a3: 83 ec 0c sub $0xc,%esp +801065a6: 56 push %esi +801065a7: e8 54 c9 ff ff call 80102f00 + iput(ip); +801065ac: 89 1c 24 mov %ebx,(%esp) +801065af: e8 ec c7 ff ff call 80102da0 + end_op(); +801065b4: e8 07 dd ff ff call 801042c0 + return 0; +801065b9: 83 c4 10 add $0x10,%esp +801065bc: 31 c0 xor %eax,%eax +} +801065be: 8d 65 f4 lea -0xc(%ebp),%esp +801065c1: 5b pop %ebx +801065c2: 5e pop %esi +801065c3: 5f pop %edi +801065c4: 5d pop %ebp +801065c5: c3 ret +801065c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801065cd: 8d 76 00 lea 0x0(%esi),%esi + iunlockput(dp); +801065d0: 83 ec 0c sub $0xc,%esp +801065d3: 56 push %esi +801065d4: e8 27 c9 ff ff call 80102f00 + ilock(ip); +801065d9: 89 1c 24 mov %ebx,(%esp) +801065dc: e8 8f c6 ff ff call 80102c70 + ip->nlink--; +801065e1: 66 83 6b 56 01 subw $0x1,0x56(%ebx) + iupdate(ip); +801065e6: 89 1c 24 mov %ebx,(%esp) +801065e9: e8 d2 c5 ff ff call 80102bc0 + iunlockput(ip); +801065ee: 89 1c 24 mov %ebx,(%esp) +801065f1: e8 0a c9 ff ff call 80102f00 + end_op(); +801065f6: e8 c5 dc ff ff call 801042c0 +} +801065fb: 83 c4 10 add $0x10,%esp + return -1; +801065fe: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106603: eb b9 jmp 801065be + iunlockput(ip); +80106605: 83 ec 0c sub $0xc,%esp +80106608: 53 push %ebx +80106609: e8 f2 c8 ff ff call 80102f00 + end_op(); +8010660e: e8 ad dc ff ff call 801042c0 + return -1; +80106613: 83 c4 10 add $0x10,%esp +80106616: b8 ff ff ff ff mov $0xffffffff,%eax +8010661b: eb a1 jmp 801065be + end_op(); +8010661d: e8 9e dc ff ff call 801042c0 + return -1; +80106622: b8 ff ff ff ff mov $0xffffffff,%eax +80106627: eb 95 jmp 801065be + ilock(ip); +80106629: 83 ec 0c sub $0xc,%esp +8010662c: 53 push %ebx +8010662d: eb ad jmp 801065dc +8010662f: 90 nop + +80106630 : +int sys_unlink(void) { +80106630: 55 push %ebp +80106631: 89 e5 mov %esp,%ebp +80106633: 57 push %edi +80106634: 56 push %esi + if (argstr(0, &path) < 0) { +80106635: 8d 45 c0 lea -0x40(%ebp),%eax +int sys_unlink(void) { +80106638: 53 push %ebx +80106639: 83 ec 54 sub $0x54,%esp + if (argstr(0, &path) < 0) { +8010663c: 50 push %eax +8010663d: 6a 00 push $0x0 +8010663f: e8 7c f9 ff ff call 80105fc0 +80106644: 83 c4 10 add $0x10,%esp +80106647: 85 c0 test %eax,%eax +80106649: 0f 88 4c 01 00 00 js 8010679b + begin_op(); +8010664f: e8 fc db ff ff call 80104250 + if ((dp = nameiparent(path, name)) == 0) { +80106654: 8d 5d ca lea -0x36(%ebp),%ebx +80106657: 83 ec 08 sub $0x8,%esp +8010665a: 53 push %ebx +8010665b: ff 75 c0 push -0x40(%ebp) +8010665e: e8 4d cf ff ff call 801035b0 +80106663: 83 c4 10 add $0x10,%esp +80106666: 89 45 b4 mov %eax,-0x4c(%ebp) +80106669: 85 c0 test %eax,%eax +8010666b: 0f 84 55 01 00 00 je 801067c6 + ilock(dp); +80106671: 83 ec 0c sub $0xc,%esp +80106674: ff 75 b4 push -0x4c(%ebp) +80106677: e8 f4 c5 ff ff call 80102c70 + if (namecmp(name, ".") == 0 || namecmp(name, "..") == 0) { +8010667c: 5a pop %edx +8010667d: 59 pop %ecx +8010667e: 68 e8 91 10 80 push $0x801091e8 +80106683: 53 push %ebx +80106684: e8 27 cb ff ff call 801031b0 +80106689: 83 c4 10 add $0x10,%esp +8010668c: 85 c0 test %eax,%eax +8010668e: 0f 84 2d 01 00 00 je 801067c1 +80106694: 83 ec 08 sub $0x8,%esp +80106697: 68 e7 91 10 80 push $0x801091e7 +8010669c: 53 push %ebx +8010669d: e8 0e cb ff ff call 801031b0 +801066a2: 83 c4 10 add $0x10,%esp +801066a5: 85 c0 test %eax,%eax +801066a7: 0f 84 14 01 00 00 je 801067c1 + if ((ip = dirlookup(dp, name, &off)) == 0) { +801066ad: 83 ec 04 sub $0x4,%esp +801066b0: 8d 45 c4 lea -0x3c(%ebp),%eax +801066b3: 50 push %eax +801066b4: 53 push %ebx +801066b5: ff 75 b4 push -0x4c(%ebp) +801066b8: e8 13 cb ff ff call 801031d0 +801066bd: 83 c4 10 add $0x10,%esp +801066c0: 89 c3 mov %eax,%ebx +801066c2: 85 c0 test %eax,%eax +801066c4: 0f 84 f7 00 00 00 je 801067c1 + ilock(ip); +801066ca: 83 ec 0c sub $0xc,%esp +801066cd: 50 push %eax +801066ce: e8 9d c5 ff ff call 80102c70 + if (ip->nlink < 1) { +801066d3: 83 c4 10 add $0x10,%esp +801066d6: 66 83 7b 56 00 cmpw $0x0,0x56(%ebx) +801066db: 0f 8e 01 01 00 00 jle 801067e2 + if (ip->type == T_DIR && !isdirempty(ip)) { +801066e1: 66 83 7b 50 01 cmpw $0x1,0x50(%ebx) +801066e6: 8d 7d d8 lea -0x28(%ebp),%edi +801066e9: 74 65 je 80106750 + memset(&de, 0, sizeof(de)); +801066eb: 83 ec 04 sub $0x4,%esp +801066ee: 6a 10 push $0x10 +801066f0: 6a 00 push $0x0 +801066f2: 57 push %edi +801066f3: e8 48 f5 ff ff call 80105c40 + if (writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +801066f8: 6a 10 push $0x10 +801066fa: ff 75 c4 push -0x3c(%ebp) +801066fd: 57 push %edi +801066fe: ff 75 b4 push -0x4c(%ebp) +80106701: e8 7a c9 ff ff call 80103080 +80106706: 83 c4 20 add $0x20,%esp +80106709: 83 f8 10 cmp $0x10,%eax +8010670c: 0f 85 dd 00 00 00 jne 801067ef + if (ip->type == T_DIR) { +80106712: 66 83 7b 50 01 cmpw $0x1,0x50(%ebx) +80106717: 0f 84 8b 00 00 00 je 801067a8 + iunlockput(dp); +8010671d: 83 ec 0c sub $0xc,%esp +80106720: ff 75 b4 push -0x4c(%ebp) +80106723: e8 d8 c7 ff ff call 80102f00 + ip->nlink--; +80106728: 66 83 6b 56 01 subw $0x1,0x56(%ebx) + iupdate(ip); +8010672d: 89 1c 24 mov %ebx,(%esp) +80106730: e8 8b c4 ff ff call 80102bc0 + iunlockput(ip); +80106735: 89 1c 24 mov %ebx,(%esp) +80106738: e8 c3 c7 ff ff call 80102f00 + end_op(); +8010673d: e8 7e db ff ff call 801042c0 + return 0; +80106742: 83 c4 10 add $0x10,%esp +80106745: 31 c0 xor %eax,%eax +} +80106747: 8d 65 f4 lea -0xc(%ebp),%esp +8010674a: 5b pop %ebx +8010674b: 5e pop %esi +8010674c: 5f pop %edi +8010674d: 5d pop %ebp +8010674e: c3 ret +8010674f: 90 nop + for (off = 2 * sizeof(de); off < dp->size; off += sizeof(de)) { +80106750: 83 7b 58 20 cmpl $0x20,0x58(%ebx) +80106754: 76 95 jbe 801066eb +80106756: be 20 00 00 00 mov $0x20,%esi +8010675b: eb 0b jmp 80106768 +8010675d: 8d 76 00 lea 0x0(%esi),%esi +80106760: 83 c6 10 add $0x10,%esi +80106763: 39 73 58 cmp %esi,0x58(%ebx) +80106766: 76 83 jbe 801066eb + if (readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de)) { +80106768: 6a 10 push $0x10 +8010676a: 56 push %esi +8010676b: 57 push %edi +8010676c: 53 push %ebx +8010676d: e8 0e c8 ff ff call 80102f80 +80106772: 83 c4 10 add $0x10,%esp +80106775: 83 f8 10 cmp $0x10,%eax +80106778: 75 5b jne 801067d5 + if (de.inum != 0) { +8010677a: 66 83 7d d8 00 cmpw $0x0,-0x28(%ebp) +8010677f: 74 df je 80106760 + iunlockput(ip); +80106781: 83 ec 0c sub $0xc,%esp +80106784: 53 push %ebx +80106785: e8 76 c7 ff ff call 80102f00 + iunlockput(dp); +8010678a: 58 pop %eax +8010678b: ff 75 b4 push -0x4c(%ebp) +8010678e: e8 6d c7 ff ff call 80102f00 + end_op(); +80106793: e8 28 db ff ff call 801042c0 + return -1; +80106798: 83 c4 10 add $0x10,%esp +8010679b: b8 ff ff ff ff mov $0xffffffff,%eax +801067a0: eb a5 jmp 80106747 +801067a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + dp->nlink--; +801067a8: 8b 45 b4 mov -0x4c(%ebp),%eax + iupdate(dp); +801067ab: 83 ec 0c sub $0xc,%esp + dp->nlink--; +801067ae: 66 83 68 56 01 subw $0x1,0x56(%eax) + iupdate(dp); +801067b3: 50 push %eax +801067b4: e8 07 c4 ff ff call 80102bc0 +801067b9: 83 c4 10 add $0x10,%esp +801067bc: e9 5c ff ff ff jmp 8010671d + iunlockput(dp); +801067c1: 83 ec 0c sub $0xc,%esp +801067c4: eb c5 jmp 8010678b + end_op(); +801067c6: e8 f5 da ff ff call 801042c0 + return -1; +801067cb: b8 ff ff ff ff mov $0xffffffff,%eax +801067d0: e9 72 ff ff ff jmp 80106747 + panic("isdirempty: readi"); +801067d5: 83 ec 0c sub $0xc,%esp +801067d8: 68 0c 92 10 80 push $0x8010920c +801067dd: e8 9e 9c ff ff call 80100480 + panic("unlink: nlink < 1"); +801067e2: 83 ec 0c sub $0xc,%esp +801067e5: 68 fa 91 10 80 push $0x801091fa +801067ea: e8 91 9c ff ff call 80100480 + panic("unlink: writei"); +801067ef: 83 ec 0c sub $0xc,%esp +801067f2: 68 1e 92 10 80 push $0x8010921e +801067f7: e8 84 9c ff ff call 80100480 +801067fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106800 : + +int sys_open(void) { +80106800: 55 push %ebp +80106801: 89 e5 mov %esp,%ebp +80106803: 57 push %edi +80106804: 56 push %esi + char *path; + int fd, omode; + struct file *f; + struct inode *ip; + + if (argstr(0, &path) < 0 || argint(1, &omode) < 0) { +80106805: 8d 45 e0 lea -0x20(%ebp),%eax +int sys_open(void) { +80106808: 53 push %ebx +80106809: 83 ec 24 sub $0x24,%esp + if (argstr(0, &path) < 0 || argint(1, &omode) < 0) { +8010680c: 50 push %eax +8010680d: 6a 00 push $0x0 +8010680f: e8 ac f7 ff ff call 80105fc0 +80106814: 83 c4 10 add $0x10,%esp +80106817: 85 c0 test %eax,%eax +80106819: 0f 88 8e 00 00 00 js 801068ad +8010681f: 83 ec 08 sub $0x8,%esp +80106822: 8d 45 e4 lea -0x1c(%ebp),%eax +80106825: 50 push %eax +80106826: 6a 01 push $0x1 +80106828: e8 d3 f6 ff ff call 80105f00 +8010682d: 83 c4 10 add $0x10,%esp +80106830: 85 c0 test %eax,%eax +80106832: 78 79 js 801068ad + return -1; + } + + begin_op(); +80106834: e8 17 da ff ff call 80104250 + + if (omode & O_CREATE) { +80106839: f6 45 e5 02 testb $0x2,-0x1b(%ebp) +8010683d: 75 79 jne 801068b8 + end_op(); + return -1; + } + } + else { + if ((ip = namei(path)) == 0) { +8010683f: 83 ec 0c sub $0xc,%esp +80106842: ff 75 e0 push -0x20(%ebp) +80106845: e8 46 cd ff ff call 80103590 +8010684a: 83 c4 10 add $0x10,%esp +8010684d: 89 c6 mov %eax,%esi +8010684f: 85 c0 test %eax,%eax +80106851: 0f 84 7e 00 00 00 je 801068d5 + end_op(); + return -1; + } + ilock(ip); +80106857: 83 ec 0c sub $0xc,%esp +8010685a: 50 push %eax +8010685b: e8 10 c4 ff ff call 80102c70 + if (ip->type == T_DIR && omode != O_RDONLY) { +80106860: 83 c4 10 add $0x10,%esp +80106863: 66 83 7e 50 01 cmpw $0x1,0x50(%esi) +80106868: 0f 84 c2 00 00 00 je 80106930 + end_op(); + return -1; + } + } + + if ((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0) { +8010686e: e8 ad ba ff ff call 80102320 +80106873: 89 c7 mov %eax,%edi +80106875: 85 c0 test %eax,%eax +80106877: 74 23 je 8010689c + struct proc *curproc = myproc(); +80106879: e8 32 e6 ff ff call 80104eb0 + for (fd = 0; fd < NOFILE; fd++) { +8010687e: 31 db xor %ebx,%ebx + if (curproc->ofile[fd] == 0) { +80106880: 8b 54 98 28 mov 0x28(%eax,%ebx,4),%edx +80106884: 85 d2 test %edx,%edx +80106886: 74 60 je 801068e8 + for (fd = 0; fd < NOFILE; fd++) { +80106888: 83 c3 01 add $0x1,%ebx +8010688b: 83 fb 10 cmp $0x10,%ebx +8010688e: 75 f0 jne 80106880 + if (f) { + fileclose(f); +80106890: 83 ec 0c sub $0xc,%esp +80106893: 57 push %edi +80106894: e8 47 bb ff ff call 801023e0 +80106899: 83 c4 10 add $0x10,%esp + } + iunlockput(ip); +8010689c: 83 ec 0c sub $0xc,%esp +8010689f: 56 push %esi +801068a0: e8 5b c6 ff ff call 80102f00 + end_op(); +801068a5: e8 16 da ff ff call 801042c0 + return -1; +801068aa: 83 c4 10 add $0x10,%esp +801068ad: bb ff ff ff ff mov $0xffffffff,%ebx +801068b2: eb 6d jmp 80106921 +801068b4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ip = create(path, T_FILE, 0, 0); +801068b8: 83 ec 0c sub $0xc,%esp +801068bb: 8b 45 e0 mov -0x20(%ebp),%eax +801068be: 31 c9 xor %ecx,%ecx +801068c0: ba 02 00 00 00 mov $0x2,%edx +801068c5: 6a 00 push $0x0 +801068c7: e8 e4 f7 ff ff call 801060b0 + if (ip == 0) { +801068cc: 83 c4 10 add $0x10,%esp + ip = create(path, T_FILE, 0, 0); +801068cf: 89 c6 mov %eax,%esi + if (ip == 0) { +801068d1: 85 c0 test %eax,%eax +801068d3: 75 99 jne 8010686e + end_op(); +801068d5: e8 e6 d9 ff ff call 801042c0 + return -1; +801068da: bb ff ff ff ff mov $0xffffffff,%ebx +801068df: eb 40 jmp 80106921 +801068e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + } + iunlock(ip); +801068e8: 83 ec 0c sub $0xc,%esp + curproc->ofile[fd] = f; +801068eb: 89 7c 98 28 mov %edi,0x28(%eax,%ebx,4) + iunlock(ip); +801068ef: 56 push %esi +801068f0: e8 5b c4 ff ff call 80102d50 + end_op(); +801068f5: e8 c6 d9 ff ff call 801042c0 + + f->type = FD_INODE; +801068fa: c7 07 02 00 00 00 movl $0x2,(%edi) + f->ip = ip; + f->off = 0; + f->readable = !(omode & O_WRONLY); +80106900: 8b 55 e4 mov -0x1c(%ebp),%edx + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); +80106903: 83 c4 10 add $0x10,%esp + f->ip = ip; +80106906: 89 77 10 mov %esi,0x10(%edi) + f->readable = !(omode & O_WRONLY); +80106909: 89 d0 mov %edx,%eax + f->off = 0; +8010690b: c7 47 14 00 00 00 00 movl $0x0,0x14(%edi) + f->readable = !(omode & O_WRONLY); +80106912: f7 d0 not %eax +80106914: 83 e0 01 and $0x1,%eax + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); +80106917: 83 e2 03 and $0x3,%edx + f->readable = !(omode & O_WRONLY); +8010691a: 88 47 08 mov %al,0x8(%edi) + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); +8010691d: 0f 95 47 09 setne 0x9(%edi) + return fd; +} +80106921: 8d 65 f4 lea -0xc(%ebp),%esp +80106924: 89 d8 mov %ebx,%eax +80106926: 5b pop %ebx +80106927: 5e pop %esi +80106928: 5f pop %edi +80106929: 5d pop %ebp +8010692a: c3 ret +8010692b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010692f: 90 nop + if (ip->type == T_DIR && omode != O_RDONLY) { +80106930: 8b 4d e4 mov -0x1c(%ebp),%ecx +80106933: 85 c9 test %ecx,%ecx +80106935: 0f 84 33 ff ff ff je 8010686e +8010693b: e9 5c ff ff ff jmp 8010689c + +80106940 : + +int sys_mkdir(void) { +80106940: 55 push %ebp +80106941: 89 e5 mov %esp,%ebp +80106943: 83 ec 18 sub $0x18,%esp + char *path; + struct inode *ip; + + begin_op(); +80106946: e8 05 d9 ff ff call 80104250 + if (argstr(0, &path) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0) { +8010694b: 83 ec 08 sub $0x8,%esp +8010694e: 8d 45 f4 lea -0xc(%ebp),%eax +80106951: 50 push %eax +80106952: 6a 00 push $0x0 +80106954: e8 67 f6 ff ff call 80105fc0 +80106959: 83 c4 10 add $0x10,%esp +8010695c: 85 c0 test %eax,%eax +8010695e: 78 30 js 80106990 +80106960: 83 ec 0c sub $0xc,%esp +80106963: 8b 45 f4 mov -0xc(%ebp),%eax +80106966: 31 c9 xor %ecx,%ecx +80106968: ba 01 00 00 00 mov $0x1,%edx +8010696d: 6a 00 push $0x0 +8010696f: e8 3c f7 ff ff call 801060b0 +80106974: 83 c4 10 add $0x10,%esp +80106977: 85 c0 test %eax,%eax +80106979: 74 15 je 80106990 + end_op(); + return -1; + } + iunlockput(ip); +8010697b: 83 ec 0c sub $0xc,%esp +8010697e: 50 push %eax +8010697f: e8 7c c5 ff ff call 80102f00 + end_op(); +80106984: e8 37 d9 ff ff call 801042c0 + return 0; +80106989: 83 c4 10 add $0x10,%esp +8010698c: 31 c0 xor %eax,%eax +} +8010698e: c9 leave +8010698f: c3 ret + end_op(); +80106990: e8 2b d9 ff ff call 801042c0 + return -1; +80106995: b8 ff ff ff ff mov $0xffffffff,%eax +} +8010699a: c9 leave +8010699b: c3 ret +8010699c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +801069a0 : + +int sys_mknod(void) { +801069a0: 55 push %ebp +801069a1: 89 e5 mov %esp,%ebp +801069a3: 83 ec 18 sub $0x18,%esp + struct inode *ip; + char *path; + int major, minor; + + begin_op(); +801069a6: e8 a5 d8 ff ff call 80104250 + if ((argstr(0, &path)) < 0 || +801069ab: 83 ec 08 sub $0x8,%esp +801069ae: 8d 45 ec lea -0x14(%ebp),%eax +801069b1: 50 push %eax +801069b2: 6a 00 push $0x0 +801069b4: e8 07 f6 ff ff call 80105fc0 +801069b9: 83 c4 10 add $0x10,%esp +801069bc: 85 c0 test %eax,%eax +801069be: 78 60 js 80106a20 + argint(1, &major) < 0 || +801069c0: 83 ec 08 sub $0x8,%esp +801069c3: 8d 45 f0 lea -0x10(%ebp),%eax +801069c6: 50 push %eax +801069c7: 6a 01 push $0x1 +801069c9: e8 32 f5 ff ff call 80105f00 + if ((argstr(0, &path)) < 0 || +801069ce: 83 c4 10 add $0x10,%esp +801069d1: 85 c0 test %eax,%eax +801069d3: 78 4b js 80106a20 + argint(2, &minor) < 0 || +801069d5: 83 ec 08 sub $0x8,%esp +801069d8: 8d 45 f4 lea -0xc(%ebp),%eax +801069db: 50 push %eax +801069dc: 6a 02 push $0x2 +801069de: e8 1d f5 ff ff call 80105f00 + argint(1, &major) < 0 || +801069e3: 83 c4 10 add $0x10,%esp +801069e6: 85 c0 test %eax,%eax +801069e8: 78 36 js 80106a20 + (ip = create(path, T_DEV, major, minor)) == 0) { +801069ea: 0f bf 45 f4 movswl -0xc(%ebp),%eax +801069ee: 83 ec 0c sub $0xc,%esp +801069f1: 0f bf 4d f0 movswl -0x10(%ebp),%ecx +801069f5: ba 03 00 00 00 mov $0x3,%edx +801069fa: 50 push %eax +801069fb: 8b 45 ec mov -0x14(%ebp),%eax +801069fe: e8 ad f6 ff ff call 801060b0 + argint(2, &minor) < 0 || +80106a03: 83 c4 10 add $0x10,%esp +80106a06: 85 c0 test %eax,%eax +80106a08: 74 16 je 80106a20 + end_op(); + return -1; + } + iunlockput(ip); +80106a0a: 83 ec 0c sub $0xc,%esp +80106a0d: 50 push %eax +80106a0e: e8 ed c4 ff ff call 80102f00 + end_op(); +80106a13: e8 a8 d8 ff ff call 801042c0 + return 0; +80106a18: 83 c4 10 add $0x10,%esp +80106a1b: 31 c0 xor %eax,%eax +} +80106a1d: c9 leave +80106a1e: c3 ret +80106a1f: 90 nop + end_op(); +80106a20: e8 9b d8 ff ff call 801042c0 + return -1; +80106a25: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106a2a: c9 leave +80106a2b: c3 ret +80106a2c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106a30 : + +int sys_chdir(void) { +80106a30: 55 push %ebp +80106a31: 89 e5 mov %esp,%ebp +80106a33: 56 push %esi +80106a34: 53 push %ebx +80106a35: 83 ec 10 sub $0x10,%esp + char *path; + struct inode *ip; + struct proc *curproc = myproc(); +80106a38: e8 73 e4 ff ff call 80104eb0 +80106a3d: 89 c6 mov %eax,%esi + + begin_op(); +80106a3f: e8 0c d8 ff ff call 80104250 + if (argstr(0, &path) < 0 || (ip = namei(path)) == 0) { +80106a44: 83 ec 08 sub $0x8,%esp +80106a47: 8d 45 f4 lea -0xc(%ebp),%eax +80106a4a: 50 push %eax +80106a4b: 6a 00 push $0x0 +80106a4d: e8 6e f5 ff ff call 80105fc0 +80106a52: 83 c4 10 add $0x10,%esp +80106a55: 85 c0 test %eax,%eax +80106a57: 78 77 js 80106ad0 +80106a59: 83 ec 0c sub $0xc,%esp +80106a5c: ff 75 f4 push -0xc(%ebp) +80106a5f: e8 2c cb ff ff call 80103590 +80106a64: 83 c4 10 add $0x10,%esp +80106a67: 89 c3 mov %eax,%ebx +80106a69: 85 c0 test %eax,%eax +80106a6b: 74 63 je 80106ad0 + end_op(); + return -1; + } + ilock(ip); +80106a6d: 83 ec 0c sub $0xc,%esp +80106a70: 50 push %eax +80106a71: e8 fa c1 ff ff call 80102c70 + if (ip->type != T_DIR) { +80106a76: 83 c4 10 add $0x10,%esp +80106a79: 66 83 7b 50 01 cmpw $0x1,0x50(%ebx) +80106a7e: 75 30 jne 80106ab0 + iunlockput(ip); + end_op(); + return -1; + } + iunlock(ip); +80106a80: 83 ec 0c sub $0xc,%esp +80106a83: 53 push %ebx +80106a84: e8 c7 c2 ff ff call 80102d50 + iput(curproc->cwd); +80106a89: 58 pop %eax +80106a8a: ff 76 68 push 0x68(%esi) +80106a8d: e8 0e c3 ff ff call 80102da0 + end_op(); +80106a92: e8 29 d8 ff ff call 801042c0 + curproc->cwd = ip; +80106a97: 89 5e 68 mov %ebx,0x68(%esi) + return 0; +80106a9a: 83 c4 10 add $0x10,%esp +80106a9d: 31 c0 xor %eax,%eax +} +80106a9f: 8d 65 f8 lea -0x8(%ebp),%esp +80106aa2: 5b pop %ebx +80106aa3: 5e pop %esi +80106aa4: 5d pop %ebp +80106aa5: c3 ret +80106aa6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106aad: 8d 76 00 lea 0x0(%esi),%esi + iunlockput(ip); +80106ab0: 83 ec 0c sub $0xc,%esp +80106ab3: 53 push %ebx +80106ab4: e8 47 c4 ff ff call 80102f00 + end_op(); +80106ab9: e8 02 d8 ff ff call 801042c0 + return -1; +80106abe: 83 c4 10 add $0x10,%esp +80106ac1: b8 ff ff ff ff mov $0xffffffff,%eax +80106ac6: eb d7 jmp 80106a9f +80106ac8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106acf: 90 nop + end_op(); +80106ad0: e8 eb d7 ff ff call 801042c0 + return -1; +80106ad5: b8 ff ff ff ff mov $0xffffffff,%eax +80106ada: eb c3 jmp 80106a9f +80106adc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106ae0 : + +int sys_exec(void) { +80106ae0: 55 push %ebp +80106ae1: 89 e5 mov %esp,%ebp +80106ae3: 57 push %edi +80106ae4: 56 push %esi + char *path, *argv[MAXARG]; + int i; + uint uargv, uarg; + + if (argstr(0, &path) < 0 || argint(1, (int*)&uargv) < 0) { +80106ae5: 8d 85 5c ff ff ff lea -0xa4(%ebp),%eax +int sys_exec(void) { +80106aeb: 53 push %ebx +80106aec: 81 ec a4 00 00 00 sub $0xa4,%esp + if (argstr(0, &path) < 0 || argint(1, (int*)&uargv) < 0) { +80106af2: 50 push %eax +80106af3: 6a 00 push $0x0 +80106af5: e8 c6 f4 ff ff call 80105fc0 +80106afa: 83 c4 10 add $0x10,%esp +80106afd: 85 c0 test %eax,%eax +80106aff: 0f 88 87 00 00 00 js 80106b8c +80106b05: 83 ec 08 sub $0x8,%esp +80106b08: 8d 85 60 ff ff ff lea -0xa0(%ebp),%eax +80106b0e: 50 push %eax +80106b0f: 6a 01 push $0x1 +80106b11: e8 ea f3 ff ff call 80105f00 +80106b16: 83 c4 10 add $0x10,%esp +80106b19: 85 c0 test %eax,%eax +80106b1b: 78 6f js 80106b8c + return -1; + } + memset(argv, 0, sizeof(argv)); +80106b1d: 83 ec 04 sub $0x4,%esp +80106b20: 8d b5 68 ff ff ff lea -0x98(%ebp),%esi + for (i = 0;; i++) { +80106b26: 31 db xor %ebx,%ebx + memset(argv, 0, sizeof(argv)); +80106b28: 68 80 00 00 00 push $0x80 +80106b2d: 6a 00 push $0x0 +80106b2f: 56 push %esi +80106b30: e8 0b f1 ff ff call 80105c40 +80106b35: 83 c4 10 add $0x10,%esp +80106b38: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106b3f: 90 nop + if (i >= NELEM(argv)) { + return -1; + } + if (fetchint(uargv + 4 * i, (int*)&uarg) < 0) { +80106b40: 83 ec 08 sub $0x8,%esp +80106b43: 8d 85 64 ff ff ff lea -0x9c(%ebp),%eax +80106b49: 8d 3c 9d 00 00 00 00 lea 0x0(,%ebx,4),%edi +80106b50: 50 push %eax +80106b51: 8b 85 60 ff ff ff mov -0xa0(%ebp),%eax +80106b57: 01 f8 add %edi,%eax +80106b59: 50 push %eax +80106b5a: e8 11 f3 ff ff call 80105e70 +80106b5f: 83 c4 10 add $0x10,%esp +80106b62: 85 c0 test %eax,%eax +80106b64: 78 26 js 80106b8c + return -1; + } + if (uarg == 0) { +80106b66: 8b 85 64 ff ff ff mov -0x9c(%ebp),%eax +80106b6c: 85 c0 test %eax,%eax +80106b6e: 74 30 je 80106ba0 + argv[i] = 0; + break; + } + if (fetchstr(uarg, &argv[i]) < 0) { +80106b70: 83 ec 08 sub $0x8,%esp +80106b73: 8d 14 3e lea (%esi,%edi,1),%edx +80106b76: 52 push %edx +80106b77: 50 push %eax +80106b78: e8 33 f3 ff ff call 80105eb0 +80106b7d: 83 c4 10 add $0x10,%esp +80106b80: 85 c0 test %eax,%eax +80106b82: 78 08 js 80106b8c + for (i = 0;; i++) { +80106b84: 83 c3 01 add $0x1,%ebx + if (i >= NELEM(argv)) { +80106b87: 83 fb 20 cmp $0x20,%ebx +80106b8a: 75 b4 jne 80106b40 + return -1; + } + } + return exec(path, argv); +} +80106b8c: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +80106b8f: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106b94: 5b pop %ebx +80106b95: 5e pop %esi +80106b96: 5f pop %edi +80106b97: 5d pop %ebp +80106b98: c3 ret +80106b99: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + argv[i] = 0; +80106ba0: c7 84 9d 68 ff ff ff movl $0x0,-0x98(%ebp,%ebx,4) +80106ba7: 00 00 00 00 + return exec(path, argv); +80106bab: 83 ec 08 sub $0x8,%esp +80106bae: 56 push %esi +80106baf: ff b5 5c ff ff ff push -0xa4(%ebp) +80106bb5: e8 66 b3 ff ff call 80101f20 +80106bba: 83 c4 10 add $0x10,%esp +} +80106bbd: 8d 65 f4 lea -0xc(%ebp),%esp +80106bc0: 5b pop %ebx +80106bc1: 5e pop %esi +80106bc2: 5f pop %edi +80106bc3: 5d pop %ebp +80106bc4: c3 ret +80106bc5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106bcc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106bd0 : + +int sys_pipe(void) { +80106bd0: 55 push %ebp +80106bd1: 89 e5 mov %esp,%ebp +80106bd3: 57 push %edi +80106bd4: 56 push %esi + int *fd; + struct file *rf, *wf; + int fd0, fd1; + + if (argptr(0, (void*)&fd, 2 * sizeof(fd[0])) < 0) { +80106bd5: 8d 45 dc lea -0x24(%ebp),%eax +int sys_pipe(void) { +80106bd8: 53 push %ebx +80106bd9: 83 ec 20 sub $0x20,%esp + if (argptr(0, (void*)&fd, 2 * sizeof(fd[0])) < 0) { +80106bdc: 6a 08 push $0x8 +80106bde: 50 push %eax +80106bdf: 6a 00 push $0x0 +80106be1: e8 6a f3 ff ff call 80105f50 +80106be6: 83 c4 10 add $0x10,%esp +80106be9: 85 c0 test %eax,%eax +80106beb: 78 4a js 80106c37 + return -1; + } + if (pipealloc(&rf, &wf) < 0) { +80106bed: 83 ec 08 sub $0x8,%esp +80106bf0: 8d 45 e4 lea -0x1c(%ebp),%eax +80106bf3: 50 push %eax +80106bf4: 8d 45 e0 lea -0x20(%ebp),%eax +80106bf7: 50 push %eax +80106bf8: e8 73 dd ff ff call 80104970 +80106bfd: 83 c4 10 add $0x10,%esp +80106c00: 85 c0 test %eax,%eax +80106c02: 78 33 js 80106c37 + return -1; + } + fd0 = -1; + if ((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0) { +80106c04: 8b 7d e0 mov -0x20(%ebp),%edi + for (fd = 0; fd < NOFILE; fd++) { +80106c07: 31 db xor %ebx,%ebx + struct proc *curproc = myproc(); +80106c09: e8 a2 e2 ff ff call 80104eb0 + for (fd = 0; fd < NOFILE; fd++) { +80106c0e: 66 90 xchg %ax,%ax + if (curproc->ofile[fd] == 0) { +80106c10: 8b 74 98 28 mov 0x28(%eax,%ebx,4),%esi +80106c14: 85 f6 test %esi,%esi +80106c16: 74 28 je 80106c40 + for (fd = 0; fd < NOFILE; fd++) { +80106c18: 83 c3 01 add $0x1,%ebx +80106c1b: 83 fb 10 cmp $0x10,%ebx +80106c1e: 75 f0 jne 80106c10 + if (fd0 >= 0) { + myproc()->ofile[fd0] = 0; + } + fileclose(rf); +80106c20: 83 ec 0c sub $0xc,%esp +80106c23: ff 75 e0 push -0x20(%ebp) +80106c26: e8 b5 b7 ff ff call 801023e0 + fileclose(wf); +80106c2b: 58 pop %eax +80106c2c: ff 75 e4 push -0x1c(%ebp) +80106c2f: e8 ac b7 ff ff call 801023e0 + return -1; +80106c34: 83 c4 10 add $0x10,%esp +80106c37: b8 ff ff ff ff mov $0xffffffff,%eax +80106c3c: eb 53 jmp 80106c91 +80106c3e: 66 90 xchg %ax,%ax + curproc->ofile[fd] = f; +80106c40: 8d 73 08 lea 0x8(%ebx),%esi +80106c43: 89 7c b0 08 mov %edi,0x8(%eax,%esi,4) + if ((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0) { +80106c47: 8b 7d e4 mov -0x1c(%ebp),%edi + struct proc *curproc = myproc(); +80106c4a: e8 61 e2 ff ff call 80104eb0 + for (fd = 0; fd < NOFILE; fd++) { +80106c4f: 31 d2 xor %edx,%edx +80106c51: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (curproc->ofile[fd] == 0) { +80106c58: 8b 4c 90 28 mov 0x28(%eax,%edx,4),%ecx +80106c5c: 85 c9 test %ecx,%ecx +80106c5e: 74 20 je 80106c80 + for (fd = 0; fd < NOFILE; fd++) { +80106c60: 83 c2 01 add $0x1,%edx +80106c63: 83 fa 10 cmp $0x10,%edx +80106c66: 75 f0 jne 80106c58 + myproc()->ofile[fd0] = 0; +80106c68: e8 43 e2 ff ff call 80104eb0 +80106c6d: c7 44 b0 08 00 00 00 movl $0x0,0x8(%eax,%esi,4) +80106c74: 00 +80106c75: eb a9 jmp 80106c20 +80106c77: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106c7e: 66 90 xchg %ax,%ax + curproc->ofile[fd] = f; +80106c80: 89 7c 90 28 mov %edi,0x28(%eax,%edx,4) + } + fd[0] = fd0; +80106c84: 8b 45 dc mov -0x24(%ebp),%eax +80106c87: 89 18 mov %ebx,(%eax) + fd[1] = fd1; +80106c89: 8b 45 dc mov -0x24(%ebp),%eax +80106c8c: 89 50 04 mov %edx,0x4(%eax) + return 0; +80106c8f: 31 c0 xor %eax,%eax +} +80106c91: 8d 65 f4 lea -0xc(%ebp),%esp +80106c94: 5b pop %ebx +80106c95: 5e pop %esi +80106c96: 5f pop %edi +80106c97: 5d pop %ebp +80106c98: c3 ret +80106c99: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80106ca0 : + +int sys_getch(void) { + return consoleget(); +80106ca0: e9 0b a3 ff ff jmp 80100fb0 +80106ca5: 66 90 xchg %ax,%ax +80106ca7: 66 90 xchg %ax,%ax +80106ca9: 66 90 xchg %ax,%ax +80106cab: 66 90 xchg %ax,%ax +80106cad: 66 90 xchg %ax,%ax +80106caf: 90 nop + +80106cb0 : +#include "mmu.h" +#include "proc.h" + +int sys_fork(void) +{ + return fork(); +80106cb0: e9 bb e3 ff ff jmp 80105070 +80106cb5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106cbc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106cc0 : +} + +int sys_exit(void) +{ +80106cc0: 55 push %ebp +80106cc1: 89 e5 mov %esp,%ebp +80106cc3: 83 ec 08 sub $0x8,%esp + exit(); +80106cc6: e8 25 e6 ff ff call 801052f0 + return 0; // not reached +} +80106ccb: 31 c0 xor %eax,%eax +80106ccd: c9 leave +80106cce: c3 ret +80106ccf: 90 nop + +80106cd0 : + +int sys_wait(void) +{ + return wait(); +80106cd0: e9 7b e7 ff ff jmp 80105450 +80106cd5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106cdc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106ce0 : +} + +int sys_kill(void) +{ +80106ce0: 55 push %ebp +80106ce1: 89 e5 mov %esp,%ebp +80106ce3: 83 ec 20 sub $0x20,%esp + int pid; + + if (argint(0, &pid) < 0) +80106ce6: 8d 45 f4 lea -0xc(%ebp),%eax +80106ce9: 50 push %eax +80106cea: 6a 00 push $0x0 +80106cec: e8 0f f2 ff ff call 80105f00 +80106cf1: 83 c4 10 add $0x10,%esp +80106cf4: 85 c0 test %eax,%eax +80106cf6: 78 18 js 80106d10 + { + return -1; + } + return kill(pid); +80106cf8: 83 ec 0c sub $0xc,%esp +80106cfb: ff 75 f4 push -0xc(%ebp) +80106cfe: e8 fd e9 ff ff call 80105700 +80106d03: 83 c4 10 add $0x10,%esp +} +80106d06: c9 leave +80106d07: c3 ret +80106d08: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106d0f: 90 nop +80106d10: c9 leave + return -1; +80106d11: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106d16: c3 ret +80106d17: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106d1e: 66 90 xchg %ax,%ax + +80106d20 : + +int sys_getpid(void) +{ +80106d20: 55 push %ebp +80106d21: 89 e5 mov %esp,%ebp +80106d23: 83 ec 08 sub $0x8,%esp + return myproc()->pid; +80106d26: e8 85 e1 ff ff call 80104eb0 +80106d2b: 8b 40 10 mov 0x10(%eax),%eax +} +80106d2e: c9 leave +80106d2f: c3 ret + +80106d30 : + +int sys_sbrk(void) +{ +80106d30: 55 push %ebp +80106d31: 89 e5 mov %esp,%ebp +80106d33: 53 push %ebx + int addr; + int n; + + if (argint(0, &n) < 0) +80106d34: 8d 45 f4 lea -0xc(%ebp),%eax +{ +80106d37: 83 ec 1c sub $0x1c,%esp + if (argint(0, &n) < 0) +80106d3a: 50 push %eax +80106d3b: 6a 00 push $0x0 +80106d3d: e8 be f1 ff ff call 80105f00 +80106d42: 83 c4 10 add $0x10,%esp +80106d45: 85 c0 test %eax,%eax +80106d47: 78 27 js 80106d70 + { + return -1; + } + addr = myproc()->sz; +80106d49: e8 62 e1 ff ff call 80104eb0 + if (growproc(n) < 0) +80106d4e: 83 ec 0c sub $0xc,%esp + addr = myproc()->sz; +80106d51: 8b 18 mov (%eax),%ebx + if (growproc(n) < 0) +80106d53: ff 75 f4 push -0xc(%ebp) +80106d56: e8 95 e2 ff ff call 80104ff0 +80106d5b: 83 c4 10 add $0x10,%esp +80106d5e: 85 c0 test %eax,%eax +80106d60: 78 0e js 80106d70 + { + return -1; + } + return addr; +} +80106d62: 89 d8 mov %ebx,%eax +80106d64: 8b 5d fc mov -0x4(%ebp),%ebx +80106d67: c9 leave +80106d68: c3 ret +80106d69: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return -1; +80106d70: bb ff ff ff ff mov $0xffffffff,%ebx +80106d75: eb eb jmp 80106d62 +80106d77: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106d7e: 66 90 xchg %ax,%ax + +80106d80 : + +int sys_sleep(void) +{ +80106d80: 55 push %ebp +80106d81: 89 e5 mov %esp,%ebp +80106d83: 53 push %ebx + int n; + uint ticks0; + + if (argint(0, &n) < 0) +80106d84: 8d 45 f4 lea -0xc(%ebp),%eax +{ +80106d87: 83 ec 1c sub $0x1c,%esp + if (argint(0, &n) < 0) +80106d8a: 50 push %eax +80106d8b: 6a 00 push $0x0 +80106d8d: e8 6e f1 ff ff call 80105f00 +80106d92: 83 c4 10 add $0x10,%esp +80106d95: 85 c0 test %eax,%eax +80106d97: 0f 88 8a 00 00 00 js 80106e27 + { + return -1; + } + acquire(&tickslock); +80106d9d: 83 ec 0c sub $0xc,%esp +80106da0: 68 00 0a 12 80 push $0x80120a00 +80106da5: e8 d6 ed ff ff call 80105b80 + ticks0 = ticks; + while (ticks - ticks0 < n) +80106daa: 8b 55 f4 mov -0xc(%ebp),%edx + ticks0 = ticks; +80106dad: 8b 1d e0 09 12 80 mov 0x801209e0,%ebx + while (ticks - ticks0 < n) +80106db3: 83 c4 10 add $0x10,%esp +80106db6: 85 d2 test %edx,%edx +80106db8: 75 27 jne 80106de1 +80106dba: eb 54 jmp 80106e10 +80106dbc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (myproc()->killed) + { + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); +80106dc0: 83 ec 08 sub $0x8,%esp +80106dc3: 68 00 0a 12 80 push $0x80120a00 +80106dc8: 68 e0 09 12 80 push $0x801209e0 +80106dcd: e8 0e e8 ff ff call 801055e0 + while (ticks - ticks0 < n) +80106dd2: a1 e0 09 12 80 mov 0x801209e0,%eax +80106dd7: 83 c4 10 add $0x10,%esp +80106dda: 29 d8 sub %ebx,%eax +80106ddc: 3b 45 f4 cmp -0xc(%ebp),%eax +80106ddf: 73 2f jae 80106e10 + if (myproc()->killed) +80106de1: e8 ca e0 ff ff call 80104eb0 +80106de6: 8b 40 24 mov 0x24(%eax),%eax +80106de9: 85 c0 test %eax,%eax +80106deb: 74 d3 je 80106dc0 + release(&tickslock); +80106ded: 83 ec 0c sub $0xc,%esp +80106df0: 68 00 0a 12 80 push $0x80120a00 +80106df5: e8 26 ed ff ff call 80105b20 + } + release(&tickslock); + return 0; +} +80106dfa: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80106dfd: 83 c4 10 add $0x10,%esp +80106e00: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106e05: c9 leave +80106e06: c3 ret +80106e07: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106e0e: 66 90 xchg %ax,%ax + release(&tickslock); +80106e10: 83 ec 0c sub $0xc,%esp +80106e13: 68 00 0a 12 80 push $0x80120a00 +80106e18: e8 03 ed ff ff call 80105b20 + return 0; +80106e1d: 83 c4 10 add $0x10,%esp +80106e20: 31 c0 xor %eax,%eax +} +80106e22: 8b 5d fc mov -0x4(%ebp),%ebx +80106e25: c9 leave +80106e26: c3 ret + return -1; +80106e27: b8 ff ff ff ff mov $0xffffffff,%eax +80106e2c: eb f4 jmp 80106e22 +80106e2e: 66 90 xchg %ax,%ax + +80106e30 : + +// return how many clock tick interrupts have occurred +// since start. +int sys_uptime(void) +{ +80106e30: 55 push %ebp +80106e31: 89 e5 mov %esp,%ebp +80106e33: 53 push %ebx +80106e34: 83 ec 10 sub $0x10,%esp + uint xticks; + + acquire(&tickslock); +80106e37: 68 00 0a 12 80 push $0x80120a00 +80106e3c: e8 3f ed ff ff call 80105b80 + xticks = ticks; +80106e41: 8b 1d e0 09 12 80 mov 0x801209e0,%ebx + release(&tickslock); +80106e47: c7 04 24 00 0a 12 80 movl $0x80120a00,(%esp) +80106e4e: e8 cd ec ff ff call 80105b20 + return xticks; +} +80106e53: 89 d8 mov %ebx,%eax +80106e55: 8b 5d fc mov -0x4(%ebp),%ebx +80106e58: c9 leave +80106e59: c3 ret +80106e5a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80106e60 : + +// System call i used to debug and test the consoles, it returns useful information in relation to the current console/process +int sys_greeting(void) +{ +80106e60: 55 push %ebp +80106e61: 89 e5 mov %esp,%ebp +80106e63: 83 ec 14 sub $0x14,%esp + cprintf("Hello! here is the info you requested...\n"); +80106e66: 68 30 92 10 80 push $0x80109230 +80106e6b: e8 20 9a ff ff call 80100890 + cprintf("Using Console: %d\n", getcurrentconsoleindex()); +80106e70: e8 6b af ff ff call 80101de0 +80106e75: 5a pop %edx +80106e76: 59 pop %ecx +80106e77: 50 push %eax +80106e78: 68 84 92 10 80 push $0x80109284 +80106e7d: e8 0e 9a ff ff call 80100890 + cprintf("Current PID: %d\n", myproc()->pid); +80106e82: e8 29 e0 ff ff call 80104eb0 +80106e87: 5a pop %edx +80106e88: 59 pop %ecx +80106e89: ff 70 10 push 0x10(%eax) +80106e8c: 68 97 92 10 80 push $0x80109297 +80106e91: e8 fa 99 ff ff call 80100890 + cprintf("Current Parent PID: %d\n", myproc()->parent->pid); +80106e96: e8 15 e0 ff ff call 80104eb0 +80106e9b: 5a pop %edx +80106e9c: 59 pop %ecx +80106e9d: 8b 40 14 mov 0x14(%eax),%eax +80106ea0: ff 70 10 push 0x10(%eax) +80106ea3: 68 a8 92 10 80 push $0x801092a8 +80106ea8: e8 e3 99 ff ff call 80100890 + cprintf("Process Console: %d\n", getconsoleindex(myproc()->consoleptr)); +80106ead: e8 fe df ff ff call 80104eb0 +80106eb2: 5a pop %edx +80106eb3: ff 70 7c push 0x7c(%eax) +80106eb6: e8 b5 95 ff ff call 80100470 +80106ebb: 59 pop %ecx +80106ebc: 5a pop %edx +80106ebd: 50 push %eax +80106ebe: 68 c0 92 10 80 push $0x801092c0 +80106ec3: e8 c8 99 ff ff call 80100890 + return 0; +} +80106ec8: 31 c0 xor %eax,%eax +80106eca: c9 leave +80106ecb: c3 ret +80106ecc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80106ed0 : + +// System call to shutdown or restart the OS +int sys_shutdown(void) +{ +80106ed0: 55 push %ebp +80106ed1: 89 e5 mov %esp,%ebp +80106ed3: 83 ec 20 sub $0x20,%esp + int restart; + if (argint(0, &restart) < 0) +80106ed6: 8d 45 f4 lea -0xc(%ebp),%eax +80106ed9: 50 push %eax +80106eda: 6a 00 push $0x0 +80106edc: e8 1f f0 ff ff call 80105f00 +80106ee1: 83 c4 10 add $0x10,%esp +80106ee4: 85 c0 test %eax,%eax +80106ee6: 78 2f js 80106f17 + { + return -1; + } + + if (restart == 1) +80106ee8: 83 7d f4 01 cmpl $0x1,-0xc(%ebp) +80106eec: 74 12 je 80106f00 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80106eee: b8 00 20 00 00 mov $0x2000,%eax +80106ef3: ba 04 06 00 00 mov $0x604,%edx +80106ef8: 66 ef out %ax,(%dx) + else + { + outw(0x604, 0x2000); + } + return 0; +} +80106efa: c9 leave + return 0; +80106efb: 31 c0 xor %eax,%eax +} +80106efd: c3 ret +80106efe: 66 90 xchg %ax,%ax + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80106f00: ba 64 00 00 00 mov $0x64,%edx +80106f05: 8d 76 00 lea 0x0(%esi),%esi +80106f08: ec in (%dx),%al + while (good & 0x02) { +80106f09: a8 02 test $0x2,%al +80106f0b: 75 fb jne 80106f08 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80106f0d: b8 fe ff ff ff mov $0xfffffffe,%eax +80106f12: ee out %al,(%dx) +} +80106f13: c9 leave + return 0; +80106f14: 31 c0 xor %eax,%eax +} +80106f16: c3 ret +80106f17: c9 leave + return -1; +80106f18: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106f1d: c3 ret +80106f1e: 66 90 xchg %ax,%ax + +80106f20 : + +// System call for handling the new screen user app +int sys_screen(void) +{ +80106f20: 55 push %ebp +80106f21: 89 e5 mov %esp,%ebp +80106f23: 53 push %ebx +80106f24: 83 ec 14 sub $0x14,%esp + struct proc *curproc = myproc(); +80106f27: e8 84 df ff ff call 80104eb0 + struct vconsole* consoleptr = 0; + int bgcol; + char *title; + + // Get the background color value + if (argint(1, &bgcol) < 0) +80106f2c: 83 ec 08 sub $0x8,%esp + struct proc *curproc = myproc(); +80106f2f: 89 c3 mov %eax,%ebx + if (argint(1, &bgcol) < 0) +80106f31: 8d 45 f0 lea -0x10(%ebp),%eax +80106f34: 50 push %eax +80106f35: 6a 01 push $0x1 +80106f37: e8 c4 ef ff ff call 80105f00 +80106f3c: 83 c4 10 add $0x10,%esp +80106f3f: 85 c0 test %eax,%eax +80106f41: 78 4d js 80106f90 + { + return -1; + } + + // Get the title arg value + if (argstr(0, &title) < 0) +80106f43: 83 ec 08 sub $0x8,%esp +80106f46: 8d 45 f4 lea -0xc(%ebp),%eax +80106f49: 50 push %eax +80106f4a: 6a 00 push $0x0 +80106f4c: e8 6f f0 ff ff call 80105fc0 +80106f51: 83 c4 10 add $0x10,%esp +80106f54: 85 c0 test %eax,%eax +80106f56: 78 38 js 80106f90 + { + return -1; + } + + // Try to setup an unused console from the pool + if ((consoleptr = newconsole(title, bgcol)) != 0) +80106f58: 83 ec 08 sub $0x8,%esp +80106f5b: ff 75 f0 push -0x10(%ebp) +80106f5e: ff 75 f4 push -0xc(%ebp) +80106f61: e8 8a a3 ff ff call 801012f0 +80106f66: 83 c4 10 add $0x10,%esp +80106f69: 85 c0 test %eax,%eax +80106f6b: 74 33 je 80106fa0 + { + // New console was successful, set the pointer and switch to it + curproc->consoleptr = consoleptr; + switchtoconsole(consoleptr); +80106f6d: 83 ec 0c sub $0xc,%esp + curproc->consoleptr = consoleptr; +80106f70: 89 43 7c mov %eax,0x7c(%ebx) + switchtoconsole(consoleptr); +80106f73: 50 push %eax +80106f74: e8 67 a4 ff ff call 801013e0 + else + { + cprintf("screen: failed to create a new console\n"); + } + return result; +} +80106f79: 8b 5d fc mov -0x4(%ebp),%ebx +80106f7c: 83 c4 10 add $0x10,%esp + result = 1; +80106f7f: b8 01 00 00 00 mov $0x1,%eax +} +80106f84: c9 leave +80106f85: c3 ret +80106f86: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106f8d: 8d 76 00 lea 0x0(%esi),%esi +80106f90: 8b 5d fc mov -0x4(%ebp),%ebx + return -1; +80106f93: b8 ff ff ff ff mov $0xffffffff,%eax +} +80106f98: c9 leave +80106f99: c3 ret +80106f9a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + cprintf("screen: failed to create a new console\n"); +80106fa0: 83 ec 0c sub $0xc,%esp +80106fa3: 68 5c 92 10 80 push $0x8010925c +80106fa8: e8 e3 98 ff ff call 80100890 +} +80106fad: 8b 5d fc mov -0x4(%ebp),%ebx + cprintf("screen: failed to create a new console\n"); +80106fb0: 83 c4 10 add $0x10,%esp + int result = 0; +80106fb3: 31 c0 xor %eax,%eax +} +80106fb5: c9 leave +80106fb6: c3 ret +80106fb7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80106fbe: 66 90 xchg %ax,%ax + +80106fc0 : + +// System call to clear the screen +int sys_cls(void) +{ +80106fc0: 55 push %ebp +80106fc1: 89 e5 mov %esp,%ebp +80106fc3: 83 ec 14 sub $0x14,%esp + clearscreen(0); +80106fc6: 6a 00 push $0x0 +80106fc8: e8 f3 a0 ff ff call 801010c0 + return 0; +80106fcd: 31 c0 xor %eax,%eax +80106fcf: c9 leave +80106fd0: c3 ret + +80106fd1 : + + # vectors.S sends all traps here. +.globl alltraps +alltraps: + # Build trap frame. + pushl %ds +80106fd1: 1e push %ds + pushl %es +80106fd2: 06 push %es + pushl %fs +80106fd3: 0f a0 push %fs + pushl %gs +80106fd5: 0f a8 push %gs + pushal +80106fd7: 60 pusha + + # Set up data segments. + movw $(SEG_KDATA<<3), %ax +80106fd8: 66 b8 10 00 mov $0x10,%ax + movw %ax, %ds +80106fdc: 8e d8 mov %eax,%ds + movw %ax, %es +80106fde: 8e c0 mov %eax,%es + + # Call trap(tf), where tf=%esp + pushl %esp +80106fe0: 54 push %esp + call trap +80106fe1: e8 ca 00 00 00 call 801070b0 + addl $4, %esp +80106fe6: 83 c4 04 add $0x4,%esp + +80106fe9 : + + # Return falls through to trapret... +.globl trapret +trapret: + popal +80106fe9: 61 popa + popl %gs +80106fea: 0f a9 pop %gs + popl %fs +80106fec: 0f a1 pop %fs + popl %es +80106fee: 07 pop %es + popl %ds +80106fef: 1f pop %ds + addl $0x8, %esp # trapno and errcode +80106ff0: 83 c4 08 add $0x8,%esp + iret +80106ff3: cf iret +80106ff4: 66 90 xchg %ax,%ax +80106ff6: 66 90 xchg %ax,%ax +80106ff8: 66 90 xchg %ax,%ax +80106ffa: 66 90 xchg %ax,%ax +80106ffc: 66 90 xchg %ax,%ax +80106ffe: 66 90 xchg %ax,%ax + +80107000 : +struct gatedesc idt[256]; +extern uint vectors[]; // in vectors.S: array of 256 entry pointers +struct spinlock tickslock; +uint ticks; + +void tvinit(void) { +80107000: 55 push %ebp + int i; + + for (i = 0; i < 256; i++) { +80107001: 31 c0 xor %eax,%eax +void tvinit(void) { +80107003: 89 e5 mov %esp,%ebp +80107005: 83 ec 08 sub $0x8,%esp +80107008: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010700f: 90 nop + SETGATE(idt[i], 0, SEG_KCODE << 3, vectors[i], 0); +80107010: 8b 14 85 08 c0 10 80 mov -0x7fef3ff8(,%eax,4),%edx +80107017: c7 04 c5 42 0a 12 80 movl $0x8e000008,-0x7fedf5be(,%eax,8) +8010701e: 08 00 00 8e +80107022: 66 89 14 c5 40 0a 12 mov %dx,-0x7fedf5c0(,%eax,8) +80107029: 80 +8010702a: c1 ea 10 shr $0x10,%edx +8010702d: 66 89 14 c5 46 0a 12 mov %dx,-0x7fedf5ba(,%eax,8) +80107034: 80 + for (i = 0; i < 256; i++) { +80107035: 83 c0 01 add $0x1,%eax +80107038: 3d 00 01 00 00 cmp $0x100,%eax +8010703d: 75 d1 jne 80107010 + } + SETGATE(idt[T_SYSCALL], 1, SEG_KCODE << 3, vectors[T_SYSCALL], DPL_USER); + + initlock(&tickslock, "time"); +8010703f: 83 ec 08 sub $0x8,%esp + SETGATE(idt[T_SYSCALL], 1, SEG_KCODE << 3, vectors[T_SYSCALL], DPL_USER); +80107042: a1 08 c1 10 80 mov 0x8010c108,%eax +80107047: c7 05 42 0c 12 80 08 movl $0xef000008,0x80120c42 +8010704e: 00 00 ef + initlock(&tickslock, "time"); +80107051: 68 d5 92 10 80 push $0x801092d5 +80107056: 68 00 0a 12 80 push $0x80120a00 + SETGATE(idt[T_SYSCALL], 1, SEG_KCODE << 3, vectors[T_SYSCALL], DPL_USER); +8010705b: 66 a3 40 0c 12 80 mov %ax,0x80120c40 +80107061: c1 e8 10 shr $0x10,%eax +80107064: 66 a3 46 0c 12 80 mov %ax,0x80120c46 + initlock(&tickslock, "time"); +8010706a: e8 41 e9 ff ff call 801059b0 +} +8010706f: 83 c4 10 add $0x10,%esp +80107072: c9 leave +80107073: c3 ret +80107074: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010707b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010707f: 90 nop + +80107080 : + +void idtinit(void) { +80107080: 55 push %ebp + pd[0] = size - 1; +80107081: b8 ff 07 00 00 mov $0x7ff,%eax +80107086: 89 e5 mov %esp,%ebp +80107088: 83 ec 10 sub $0x10,%esp +8010708b: 66 89 45 fa mov %ax,-0x6(%ebp) + pd[1] = (uint)p; +8010708f: b8 40 0a 12 80 mov $0x80120a40,%eax +80107094: 66 89 45 fc mov %ax,-0x4(%ebp) + pd[2] = (uint)p >> 16; +80107098: c1 e8 10 shr $0x10,%eax +8010709b: 66 89 45 fe mov %ax,-0x2(%ebp) + asm volatile ("lidt (%0)" : : "r" (pd)); +8010709f: 8d 45 fa lea -0x6(%ebp),%eax +801070a2: 0f 01 18 lidtl (%eax) + lidt(idt, sizeof(idt)); +} +801070a5: c9 leave +801070a6: c3 ret +801070a7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801070ae: 66 90 xchg %ax,%ax + +801070b0 : + +void trap(struct trapframe *tf) { +801070b0: 55 push %ebp +801070b1: 89 e5 mov %esp,%ebp +801070b3: 57 push %edi +801070b4: 56 push %esi +801070b5: 53 push %ebx +801070b6: 83 ec 1c sub $0x1c,%esp +801070b9: 8b 5d 08 mov 0x8(%ebp),%ebx + if (tf->trapno == T_SYSCALL) { +801070bc: 8b 43 30 mov 0x30(%ebx),%eax +801070bf: 83 f8 40 cmp $0x40,%eax +801070c2: 0f 84 68 01 00 00 je 80107230 + exit(); + } + return; + } + + switch (tf->trapno) { +801070c8: 83 e8 20 sub $0x20,%eax +801070cb: 83 f8 1f cmp $0x1f,%eax +801070ce: 0f 87 8c 00 00 00 ja 80107160 +801070d4: ff 24 85 7c 93 10 80 jmp *-0x7fef6c84(,%eax,4) +801070db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +801070df: 90 nop + release(&tickslock); + } + lapiceoi(); + break; + case T_IRQ0 + IRQ_IDE: + ideintr(); +801070e0: e8 4b c6 ff ff call 80103730 + lapiceoi(); +801070e5: e8 16 cd ff ff call 80103e00 + } + + // Force process exit if it has been killed and is in user space. + // (If it is still executing in the kernel, let it keep running + // until it gets to the regular system call return.) + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +801070ea: e8 c1 dd ff ff call 80104eb0 +801070ef: 85 c0 test %eax,%eax +801070f1: 74 1d je 80107110 +801070f3: e8 b8 dd ff ff call 80104eb0 +801070f8: 8b 50 24 mov 0x24(%eax),%edx +801070fb: 85 d2 test %edx,%edx +801070fd: 74 11 je 80107110 +801070ff: 0f b7 43 3c movzwl 0x3c(%ebx),%eax +80107103: 83 e0 03 and $0x3,%eax +80107106: 66 83 f8 03 cmp $0x3,%ax +8010710a: 0f 84 e8 01 00 00 je 801072f8 + exit(); + } + + // Force process to give up CPU on clock tick. + // If interrupts were on while locks held, would need to check nlock. + if (myproc() && myproc()->state == RUNNING && +80107110: e8 9b dd ff ff call 80104eb0 +80107115: 85 c0 test %eax,%eax +80107117: 74 0f je 80107128 +80107119: e8 92 dd ff ff call 80104eb0 +8010711e: 83 78 0c 04 cmpl $0x4,0xc(%eax) +80107122: 0f 84 b8 00 00 00 je 801071e0 + tf->trapno == T_IRQ0 + IRQ_TIMER) { + yield(); + } + + // Check if the process has been killed since we yielded + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +80107128: e8 83 dd ff ff call 80104eb0 +8010712d: 85 c0 test %eax,%eax +8010712f: 74 1d je 8010714e +80107131: e8 7a dd ff ff call 80104eb0 +80107136: 8b 40 24 mov 0x24(%eax),%eax +80107139: 85 c0 test %eax,%eax +8010713b: 74 11 je 8010714e +8010713d: 0f b7 43 3c movzwl 0x3c(%ebx),%eax +80107141: 83 e0 03 and $0x3,%eax +80107144: 66 83 f8 03 cmp $0x3,%ax +80107148: 0f 84 0f 01 00 00 je 8010725d + exit(); + } +} +8010714e: 8d 65 f4 lea -0xc(%ebp),%esp +80107151: 5b pop %ebx +80107152: 5e pop %esi +80107153: 5f pop %edi +80107154: 5d pop %ebp +80107155: c3 ret +80107156: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010715d: 8d 76 00 lea 0x0(%esi),%esi + if (myproc() == 0 || (tf->cs & 3) == 0) { +80107160: e8 4b dd ff ff call 80104eb0 +80107165: 8b 7b 38 mov 0x38(%ebx),%edi +80107168: 85 c0 test %eax,%eax +8010716a: 0f 84 a2 01 00 00 je 80107312 +80107170: f6 43 3c 03 testb $0x3,0x3c(%ebx) +80107174: 0f 84 98 01 00 00 je 80107312 + return result; +} + +static inline uint rcr2(void) { + uint val; + asm volatile ("movl %%cr2,%0" : "=r" (val)); +8010717a: 0f 20 d1 mov %cr2,%ecx +8010717d: 89 4d d8 mov %ecx,-0x28(%ebp) + cprintf("pid %d %s: trap %d err %d on cpu %d " +80107180: e8 0b dd ff ff call 80104e90 +80107185: 8b 73 30 mov 0x30(%ebx),%esi +80107188: 89 45 dc mov %eax,-0x24(%ebp) +8010718b: 8b 43 34 mov 0x34(%ebx),%eax +8010718e: 89 45 e4 mov %eax,-0x1c(%ebp) + myproc()->pid, myproc()->name, tf->trapno, +80107191: e8 1a dd ff ff call 80104eb0 +80107196: 89 45 e0 mov %eax,-0x20(%ebp) +80107199: e8 12 dd ff ff call 80104eb0 + cprintf("pid %d %s: trap %d err %d on cpu %d " +8010719e: 8b 4d d8 mov -0x28(%ebp),%ecx +801071a1: 8b 55 dc mov -0x24(%ebp),%edx +801071a4: 51 push %ecx +801071a5: 57 push %edi +801071a6: 52 push %edx +801071a7: ff 75 e4 push -0x1c(%ebp) +801071aa: 56 push %esi + myproc()->pid, myproc()->name, tf->trapno, +801071ab: 8b 75 e0 mov -0x20(%ebp),%esi +801071ae: 83 c6 6c add $0x6c,%esi + cprintf("pid %d %s: trap %d err %d on cpu %d " +801071b1: 56 push %esi +801071b2: ff 70 10 push 0x10(%eax) +801071b5: 68 38 93 10 80 push $0x80109338 +801071ba: e8 d1 96 ff ff call 80100890 + myproc()->killed = 1; +801071bf: 83 c4 20 add $0x20,%esp +801071c2: e8 e9 dc ff ff call 80104eb0 +801071c7: c7 40 24 01 00 00 00 movl $0x1,0x24(%eax) + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +801071ce: e8 dd dc ff ff call 80104eb0 +801071d3: 85 c0 test %eax,%eax +801071d5: 0f 85 18 ff ff ff jne 801070f3 +801071db: e9 30 ff ff ff jmp 80107110 + if (myproc() && myproc()->state == RUNNING && +801071e0: 83 7b 30 20 cmpl $0x20,0x30(%ebx) +801071e4: 0f 85 3e ff ff ff jne 80107128 + yield(); +801071ea: e8 a1 e3 ff ff call 80105590 +801071ef: e9 34 ff ff ff jmp 80107128 +801071f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + cprintf("cpu%d: spurious interrupt at %x:%x\n", +801071f8: 8b 7b 38 mov 0x38(%ebx),%edi +801071fb: 0f b7 73 3c movzwl 0x3c(%ebx),%esi +801071ff: e8 8c dc ff ff call 80104e90 +80107204: 57 push %edi +80107205: 56 push %esi +80107206: 50 push %eax +80107207: 68 e0 92 10 80 push $0x801092e0 +8010720c: e8 7f 96 ff ff call 80100890 + lapiceoi(); +80107211: e8 ea cb ff ff call 80103e00 + break; +80107216: 83 c4 10 add $0x10,%esp + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +80107219: e8 92 dc ff ff call 80104eb0 +8010721e: 85 c0 test %eax,%eax +80107220: 0f 85 cd fe ff ff jne 801070f3 +80107226: e9 e5 fe ff ff jmp 80107110 +8010722b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010722f: 90 nop + if (myproc()->killed) { +80107230: e8 7b dc ff ff call 80104eb0 +80107235: 8b 70 24 mov 0x24(%eax),%esi +80107238: 85 f6 test %esi,%esi +8010723a: 0f 85 c8 00 00 00 jne 80107308 + myproc()->tf = tf; +80107240: e8 6b dc ff ff call 80104eb0 +80107245: 89 58 18 mov %ebx,0x18(%eax) + syscall(); +80107248: e8 f3 ed ff ff call 80106040 + if (myproc()->killed) { +8010724d: e8 5e dc ff ff call 80104eb0 +80107252: 8b 48 24 mov 0x24(%eax),%ecx +80107255: 85 c9 test %ecx,%ecx +80107257: 0f 84 f1 fe ff ff je 8010714e +} +8010725d: 8d 65 f4 lea -0xc(%ebp),%esp +80107260: 5b pop %ebx +80107261: 5e pop %esi +80107262: 5f pop %edi +80107263: 5d pop %ebp + exit(); +80107264: e9 87 e0 ff ff jmp 801052f0 +80107269: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + uartintr(); +80107270: e8 3b 02 00 00 call 801074b0 + lapiceoi(); +80107275: e8 86 cb ff ff call 80103e00 + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +8010727a: e8 31 dc ff ff call 80104eb0 +8010727f: 85 c0 test %eax,%eax +80107281: 0f 85 6c fe ff ff jne 801070f3 +80107287: e9 84 fe ff ff jmp 80107110 +8010728c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + kbdintr(); +80107290: e8 2b ca ff ff call 80103cc0 + lapiceoi(); +80107295: e8 66 cb ff ff call 80103e00 + if (myproc() && myproc()->killed && (tf->cs & 3) == DPL_USER) { +8010729a: e8 11 dc ff ff call 80104eb0 +8010729f: 85 c0 test %eax,%eax +801072a1: 0f 85 4c fe ff ff jne 801070f3 +801072a7: e9 64 fe ff ff jmp 80107110 +801072ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (cpuid() == 0) { +801072b0: e8 db db ff ff call 80104e90 +801072b5: 85 c0 test %eax,%eax +801072b7: 0f 85 28 fe ff ff jne 801070e5 + acquire(&tickslock); +801072bd: 83 ec 0c sub $0xc,%esp +801072c0: 68 00 0a 12 80 push $0x80120a00 +801072c5: e8 b6 e8 ff ff call 80105b80 + wakeup(&ticks); +801072ca: c7 04 24 e0 09 12 80 movl $0x801209e0,(%esp) + ticks++; +801072d1: 83 05 e0 09 12 80 01 addl $0x1,0x801209e0 + wakeup(&ticks); +801072d8: e8 c3 e3 ff ff call 801056a0 + release(&tickslock); +801072dd: c7 04 24 00 0a 12 80 movl $0x80120a00,(%esp) +801072e4: e8 37 e8 ff ff call 80105b20 +801072e9: 83 c4 10 add $0x10,%esp + lapiceoi(); +801072ec: e9 f4 fd ff ff jmp 801070e5 +801072f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + exit(); +801072f8: e8 f3 df ff ff call 801052f0 +801072fd: e9 0e fe ff ff jmp 80107110 +80107302: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + exit(); +80107308: e8 e3 df ff ff call 801052f0 +8010730d: e9 2e ff ff ff jmp 80107240 +80107312: 0f 20 d6 mov %cr2,%esi + cprintf("unexpected trap %d from cpu %d eip %x (cr2=0x%x)\n", +80107315: e8 76 db ff ff call 80104e90 +8010731a: 83 ec 0c sub $0xc,%esp +8010731d: 56 push %esi +8010731e: 57 push %edi +8010731f: 50 push %eax +80107320: ff 73 30 push 0x30(%ebx) +80107323: 68 04 93 10 80 push $0x80109304 +80107328: e8 63 95 ff ff call 80100890 + panic("trap"); +8010732d: 83 c4 14 add $0x14,%esp +80107330: 68 da 92 10 80 push $0x801092da +80107335: e8 46 91 ff ff call 80100480 +8010733a: 66 90 xchg %ax,%ax +8010733c: 66 90 xchg %ax,%ax +8010733e: 66 90 xchg %ax,%ax + +80107340 : + } + outb(COM1 + 0, c); +} + +static int uartgetc(void) { + if (!uart) { +80107340: a1 40 12 12 80 mov 0x80121240,%eax +80107345: 85 c0 test %eax,%eax +80107347: 74 17 je 80107360 + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +80107349: ba fd 03 00 00 mov $0x3fd,%edx +8010734e: ec in (%dx),%al + return -1; + } + if (!(inb(COM1 + 5) & 0x01)) { +8010734f: a8 01 test $0x1,%al +80107351: 74 0d je 80107360 +80107353: ba f8 03 00 00 mov $0x3f8,%edx +80107358: ec in (%dx),%al + return -1; + } + return inb(COM1 + 0); +80107359: 0f b6 c0 movzbl %al,%eax +8010735c: c3 ret +8010735d: 8d 76 00 lea 0x0(%esi),%esi + return -1; +80107360: b8 ff ff ff ff mov $0xffffffff,%eax +} +80107365: c3 ret +80107366: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010736d: 8d 76 00 lea 0x0(%esi),%esi + +80107370 : +void uartinit(void) { +80107370: 55 push %ebp + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80107371: 31 c9 xor %ecx,%ecx +80107373: 89 c8 mov %ecx,%eax +80107375: 89 e5 mov %esp,%ebp +80107377: 57 push %edi +80107378: bf fa 03 00 00 mov $0x3fa,%edi +8010737d: 56 push %esi +8010737e: 89 fa mov %edi,%edx +80107380: 53 push %ebx +80107381: 83 ec 1c sub $0x1c,%esp +80107384: ee out %al,(%dx) +80107385: be fb 03 00 00 mov $0x3fb,%esi +8010738a: b8 80 ff ff ff mov $0xffffff80,%eax +8010738f: 89 f2 mov %esi,%edx +80107391: ee out %al,(%dx) +80107392: b8 0c 00 00 00 mov $0xc,%eax +80107397: ba f8 03 00 00 mov $0x3f8,%edx +8010739c: ee out %al,(%dx) +8010739d: bb f9 03 00 00 mov $0x3f9,%ebx +801073a2: 89 c8 mov %ecx,%eax +801073a4: 89 da mov %ebx,%edx +801073a6: ee out %al,(%dx) +801073a7: b8 03 00 00 00 mov $0x3,%eax +801073ac: 89 f2 mov %esi,%edx +801073ae: ee out %al,(%dx) +801073af: ba fc 03 00 00 mov $0x3fc,%edx +801073b4: 89 c8 mov %ecx,%eax +801073b6: ee out %al,(%dx) +801073b7: b8 01 00 00 00 mov $0x1,%eax +801073bc: 89 da mov %ebx,%edx +801073be: ee out %al,(%dx) + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +801073bf: ba fd 03 00 00 mov $0x3fd,%edx +801073c4: ec in (%dx),%al + if (inb(COM1 + 5) == 0xFF) { +801073c5: 3c ff cmp $0xff,%al +801073c7: 74 78 je 80107441 + uart = 1; +801073c9: c7 05 40 12 12 80 01 movl $0x1,0x80121240 +801073d0: 00 00 00 +801073d3: 89 fa mov %edi,%edx +801073d5: ec in (%dx),%al +801073d6: ba f8 03 00 00 mov $0x3f8,%edx +801073db: ec in (%dx),%al + ioapicenable(IRQ_COM1, 0); +801073dc: 83 ec 08 sub $0x8,%esp + for (p = "xv6...\n"; *p; p++) { +801073df: bf fc 93 10 80 mov $0x801093fc,%edi +801073e4: be fd 03 00 00 mov $0x3fd,%esi + ioapicenable(IRQ_COM1, 0); +801073e9: 6a 00 push $0x0 +801073eb: 6a 04 push $0x4 +801073ed: e8 7e c5 ff ff call 80103970 + for (p = "xv6...\n"; *p; p++) { +801073f2: c6 45 e7 78 movb $0x78,-0x19(%ebp) + ioapicenable(IRQ_COM1, 0); +801073f6: 83 c4 10 add $0x10,%esp +801073f9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (!uart) { +80107400: a1 40 12 12 80 mov 0x80121240,%eax +80107405: bb 80 00 00 00 mov $0x80,%ebx +8010740a: 85 c0 test %eax,%eax +8010740c: 75 14 jne 80107422 +8010740e: eb 23 jmp 80107433 + microdelay(10); +80107410: 83 ec 0c sub $0xc,%esp +80107413: 6a 0a push $0xa +80107415: e8 06 ca ff ff call 80103e20 + for (i = 0; i < 128 && !(inb(COM1 + 5) & 0x20); i++) { +8010741a: 83 c4 10 add $0x10,%esp +8010741d: 83 eb 01 sub $0x1,%ebx +80107420: 74 07 je 80107429 +80107422: 89 f2 mov %esi,%edx +80107424: ec in (%dx),%al +80107425: a8 20 test $0x20,%al +80107427: 74 e7 je 80107410 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80107429: 0f b6 45 e7 movzbl -0x19(%ebp),%eax +8010742d: ba f8 03 00 00 mov $0x3f8,%edx +80107432: ee out %al,(%dx) + for (p = "xv6...\n"; *p; p++) { +80107433: 0f b6 47 01 movzbl 0x1(%edi),%eax +80107437: 83 c7 01 add $0x1,%edi +8010743a: 88 45 e7 mov %al,-0x19(%ebp) +8010743d: 84 c0 test %al,%al +8010743f: 75 bf jne 80107400 +} +80107441: 8d 65 f4 lea -0xc(%ebp),%esp +80107444: 5b pop %ebx +80107445: 5e pop %esi +80107446: 5f pop %edi +80107447: 5d pop %ebp +80107448: c3 ret +80107449: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80107450 : + if (!uart) { +80107450: a1 40 12 12 80 mov 0x80121240,%eax +80107455: 85 c0 test %eax,%eax +80107457: 74 47 je 801074a0 +void uartputc(int c) { +80107459: 55 push %ebp +8010745a: 89 e5 mov %esp,%ebp +8010745c: 56 push %esi + asm volatile ("in %1,%0" : "=a" (data) : "d" (port)); +8010745d: be fd 03 00 00 mov $0x3fd,%esi +80107462: 53 push %ebx +80107463: bb 80 00 00 00 mov $0x80,%ebx +80107468: eb 18 jmp 80107482 +8010746a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + microdelay(10); +80107470: 83 ec 0c sub $0xc,%esp +80107473: 6a 0a push $0xa +80107475: e8 a6 c9 ff ff call 80103e20 + for (i = 0; i < 128 && !(inb(COM1 + 5) & 0x20); i++) { +8010747a: 83 c4 10 add $0x10,%esp +8010747d: 83 eb 01 sub $0x1,%ebx +80107480: 74 07 je 80107489 +80107482: 89 f2 mov %esi,%edx +80107484: ec in (%dx),%al +80107485: a8 20 test $0x20,%al +80107487: 74 e7 je 80107470 + asm volatile ("out %0,%1" : : "a" (data), "d" (port)); +80107489: 8b 45 08 mov 0x8(%ebp),%eax +8010748c: ba f8 03 00 00 mov $0x3f8,%edx +80107491: ee out %al,(%dx) +} +80107492: 8d 65 f8 lea -0x8(%ebp),%esp +80107495: 5b pop %ebx +80107496: 5e pop %esi +80107497: 5d pop %ebp +80107498: c3 ret +80107499: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801074a0: c3 ret +801074a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801074a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801074af: 90 nop + +801074b0 : + +void uartintr(void) { +801074b0: 55 push %ebp +801074b1: 89 e5 mov %esp,%ebp +801074b3: 83 ec 14 sub $0x14,%esp + consoleintr(uartgetc); +801074b6: 68 40 73 10 80 push $0x80107340 +801074bb: e8 70 a0 ff ff call 80101530 +} +801074c0: 83 c4 10 add $0x10,%esp +801074c3: c9 leave +801074c4: c3 ret + +801074c5 : +# generated by vectors.pl - do not edit +# handlers +.globl alltraps +.globl vector0 +vector0: + pushl $0 +801074c5: 6a 00 push $0x0 + pushl $0 +801074c7: 6a 00 push $0x0 + jmp alltraps +801074c9: e9 03 fb ff ff jmp 80106fd1 + +801074ce : +.globl vector1 +vector1: + pushl $0 +801074ce: 6a 00 push $0x0 + pushl $1 +801074d0: 6a 01 push $0x1 + jmp alltraps +801074d2: e9 fa fa ff ff jmp 80106fd1 + +801074d7 : +.globl vector2 +vector2: + pushl $0 +801074d7: 6a 00 push $0x0 + pushl $2 +801074d9: 6a 02 push $0x2 + jmp alltraps +801074db: e9 f1 fa ff ff jmp 80106fd1 + +801074e0 : +.globl vector3 +vector3: + pushl $0 +801074e0: 6a 00 push $0x0 + pushl $3 +801074e2: 6a 03 push $0x3 + jmp alltraps +801074e4: e9 e8 fa ff ff jmp 80106fd1 + +801074e9 : +.globl vector4 +vector4: + pushl $0 +801074e9: 6a 00 push $0x0 + pushl $4 +801074eb: 6a 04 push $0x4 + jmp alltraps +801074ed: e9 df fa ff ff jmp 80106fd1 + +801074f2 : +.globl vector5 +vector5: + pushl $0 +801074f2: 6a 00 push $0x0 + pushl $5 +801074f4: 6a 05 push $0x5 + jmp alltraps +801074f6: e9 d6 fa ff ff jmp 80106fd1 + +801074fb : +.globl vector6 +vector6: + pushl $0 +801074fb: 6a 00 push $0x0 + pushl $6 +801074fd: 6a 06 push $0x6 + jmp alltraps +801074ff: e9 cd fa ff ff jmp 80106fd1 + +80107504 : +.globl vector7 +vector7: + pushl $0 +80107504: 6a 00 push $0x0 + pushl $7 +80107506: 6a 07 push $0x7 + jmp alltraps +80107508: e9 c4 fa ff ff jmp 80106fd1 + +8010750d : +.globl vector8 +vector8: + pushl $8 +8010750d: 6a 08 push $0x8 + jmp alltraps +8010750f: e9 bd fa ff ff jmp 80106fd1 + +80107514 : +.globl vector9 +vector9: + pushl $0 +80107514: 6a 00 push $0x0 + pushl $9 +80107516: 6a 09 push $0x9 + jmp alltraps +80107518: e9 b4 fa ff ff jmp 80106fd1 + +8010751d : +.globl vector10 +vector10: + pushl $10 +8010751d: 6a 0a push $0xa + jmp alltraps +8010751f: e9 ad fa ff ff jmp 80106fd1 + +80107524 : +.globl vector11 +vector11: + pushl $11 +80107524: 6a 0b push $0xb + jmp alltraps +80107526: e9 a6 fa ff ff jmp 80106fd1 + +8010752b : +.globl vector12 +vector12: + pushl $12 +8010752b: 6a 0c push $0xc + jmp alltraps +8010752d: e9 9f fa ff ff jmp 80106fd1 + +80107532 : +.globl vector13 +vector13: + pushl $13 +80107532: 6a 0d push $0xd + jmp alltraps +80107534: e9 98 fa ff ff jmp 80106fd1 + +80107539 : +.globl vector14 +vector14: + pushl $14 +80107539: 6a 0e push $0xe + jmp alltraps +8010753b: e9 91 fa ff ff jmp 80106fd1 + +80107540 : +.globl vector15 +vector15: + pushl $0 +80107540: 6a 00 push $0x0 + pushl $15 +80107542: 6a 0f push $0xf + jmp alltraps +80107544: e9 88 fa ff ff jmp 80106fd1 + +80107549 : +.globl vector16 +vector16: + pushl $0 +80107549: 6a 00 push $0x0 + pushl $16 +8010754b: 6a 10 push $0x10 + jmp alltraps +8010754d: e9 7f fa ff ff jmp 80106fd1 + +80107552 : +.globl vector17 +vector17: + pushl $17 +80107552: 6a 11 push $0x11 + jmp alltraps +80107554: e9 78 fa ff ff jmp 80106fd1 + +80107559 : +.globl vector18 +vector18: + pushl $0 +80107559: 6a 00 push $0x0 + pushl $18 +8010755b: 6a 12 push $0x12 + jmp alltraps +8010755d: e9 6f fa ff ff jmp 80106fd1 + +80107562 : +.globl vector19 +vector19: + pushl $0 +80107562: 6a 00 push $0x0 + pushl $19 +80107564: 6a 13 push $0x13 + jmp alltraps +80107566: e9 66 fa ff ff jmp 80106fd1 + +8010756b : +.globl vector20 +vector20: + pushl $0 +8010756b: 6a 00 push $0x0 + pushl $20 +8010756d: 6a 14 push $0x14 + jmp alltraps +8010756f: e9 5d fa ff ff jmp 80106fd1 + +80107574 : +.globl vector21 +vector21: + pushl $0 +80107574: 6a 00 push $0x0 + pushl $21 +80107576: 6a 15 push $0x15 + jmp alltraps +80107578: e9 54 fa ff ff jmp 80106fd1 + +8010757d : +.globl vector22 +vector22: + pushl $0 +8010757d: 6a 00 push $0x0 + pushl $22 +8010757f: 6a 16 push $0x16 + jmp alltraps +80107581: e9 4b fa ff ff jmp 80106fd1 + +80107586 : +.globl vector23 +vector23: + pushl $0 +80107586: 6a 00 push $0x0 + pushl $23 +80107588: 6a 17 push $0x17 + jmp alltraps +8010758a: e9 42 fa ff ff jmp 80106fd1 + +8010758f : +.globl vector24 +vector24: + pushl $0 +8010758f: 6a 00 push $0x0 + pushl $24 +80107591: 6a 18 push $0x18 + jmp alltraps +80107593: e9 39 fa ff ff jmp 80106fd1 + +80107598 : +.globl vector25 +vector25: + pushl $0 +80107598: 6a 00 push $0x0 + pushl $25 +8010759a: 6a 19 push $0x19 + jmp alltraps +8010759c: e9 30 fa ff ff jmp 80106fd1 + +801075a1 : +.globl vector26 +vector26: + pushl $0 +801075a1: 6a 00 push $0x0 + pushl $26 +801075a3: 6a 1a push $0x1a + jmp alltraps +801075a5: e9 27 fa ff ff jmp 80106fd1 + +801075aa : +.globl vector27 +vector27: + pushl $0 +801075aa: 6a 00 push $0x0 + pushl $27 +801075ac: 6a 1b push $0x1b + jmp alltraps +801075ae: e9 1e fa ff ff jmp 80106fd1 + +801075b3 : +.globl vector28 +vector28: + pushl $0 +801075b3: 6a 00 push $0x0 + pushl $28 +801075b5: 6a 1c push $0x1c + jmp alltraps +801075b7: e9 15 fa ff ff jmp 80106fd1 + +801075bc : +.globl vector29 +vector29: + pushl $0 +801075bc: 6a 00 push $0x0 + pushl $29 +801075be: 6a 1d push $0x1d + jmp alltraps +801075c0: e9 0c fa ff ff jmp 80106fd1 + +801075c5 : +.globl vector30 +vector30: + pushl $0 +801075c5: 6a 00 push $0x0 + pushl $30 +801075c7: 6a 1e push $0x1e + jmp alltraps +801075c9: e9 03 fa ff ff jmp 80106fd1 + +801075ce : +.globl vector31 +vector31: + pushl $0 +801075ce: 6a 00 push $0x0 + pushl $31 +801075d0: 6a 1f push $0x1f + jmp alltraps +801075d2: e9 fa f9 ff ff jmp 80106fd1 + +801075d7 : +.globl vector32 +vector32: + pushl $0 +801075d7: 6a 00 push $0x0 + pushl $32 +801075d9: 6a 20 push $0x20 + jmp alltraps +801075db: e9 f1 f9 ff ff jmp 80106fd1 + +801075e0 : +.globl vector33 +vector33: + pushl $0 +801075e0: 6a 00 push $0x0 + pushl $33 +801075e2: 6a 21 push $0x21 + jmp alltraps +801075e4: e9 e8 f9 ff ff jmp 80106fd1 + +801075e9 : +.globl vector34 +vector34: + pushl $0 +801075e9: 6a 00 push $0x0 + pushl $34 +801075eb: 6a 22 push $0x22 + jmp alltraps +801075ed: e9 df f9 ff ff jmp 80106fd1 + +801075f2 : +.globl vector35 +vector35: + pushl $0 +801075f2: 6a 00 push $0x0 + pushl $35 +801075f4: 6a 23 push $0x23 + jmp alltraps +801075f6: e9 d6 f9 ff ff jmp 80106fd1 + +801075fb : +.globl vector36 +vector36: + pushl $0 +801075fb: 6a 00 push $0x0 + pushl $36 +801075fd: 6a 24 push $0x24 + jmp alltraps +801075ff: e9 cd f9 ff ff jmp 80106fd1 + +80107604 : +.globl vector37 +vector37: + pushl $0 +80107604: 6a 00 push $0x0 + pushl $37 +80107606: 6a 25 push $0x25 + jmp alltraps +80107608: e9 c4 f9 ff ff jmp 80106fd1 + +8010760d : +.globl vector38 +vector38: + pushl $0 +8010760d: 6a 00 push $0x0 + pushl $38 +8010760f: 6a 26 push $0x26 + jmp alltraps +80107611: e9 bb f9 ff ff jmp 80106fd1 + +80107616 : +.globl vector39 +vector39: + pushl $0 +80107616: 6a 00 push $0x0 + pushl $39 +80107618: 6a 27 push $0x27 + jmp alltraps +8010761a: e9 b2 f9 ff ff jmp 80106fd1 + +8010761f : +.globl vector40 +vector40: + pushl $0 +8010761f: 6a 00 push $0x0 + pushl $40 +80107621: 6a 28 push $0x28 + jmp alltraps +80107623: e9 a9 f9 ff ff jmp 80106fd1 + +80107628 : +.globl vector41 +vector41: + pushl $0 +80107628: 6a 00 push $0x0 + pushl $41 +8010762a: 6a 29 push $0x29 + jmp alltraps +8010762c: e9 a0 f9 ff ff jmp 80106fd1 + +80107631 : +.globl vector42 +vector42: + pushl $0 +80107631: 6a 00 push $0x0 + pushl $42 +80107633: 6a 2a push $0x2a + jmp alltraps +80107635: e9 97 f9 ff ff jmp 80106fd1 + +8010763a : +.globl vector43 +vector43: + pushl $0 +8010763a: 6a 00 push $0x0 + pushl $43 +8010763c: 6a 2b push $0x2b + jmp alltraps +8010763e: e9 8e f9 ff ff jmp 80106fd1 + +80107643 : +.globl vector44 +vector44: + pushl $0 +80107643: 6a 00 push $0x0 + pushl $44 +80107645: 6a 2c push $0x2c + jmp alltraps +80107647: e9 85 f9 ff ff jmp 80106fd1 + +8010764c : +.globl vector45 +vector45: + pushl $0 +8010764c: 6a 00 push $0x0 + pushl $45 +8010764e: 6a 2d push $0x2d + jmp alltraps +80107650: e9 7c f9 ff ff jmp 80106fd1 + +80107655 : +.globl vector46 +vector46: + pushl $0 +80107655: 6a 00 push $0x0 + pushl $46 +80107657: 6a 2e push $0x2e + jmp alltraps +80107659: e9 73 f9 ff ff jmp 80106fd1 + +8010765e : +.globl vector47 +vector47: + pushl $0 +8010765e: 6a 00 push $0x0 + pushl $47 +80107660: 6a 2f push $0x2f + jmp alltraps +80107662: e9 6a f9 ff ff jmp 80106fd1 + +80107667 : +.globl vector48 +vector48: + pushl $0 +80107667: 6a 00 push $0x0 + pushl $48 +80107669: 6a 30 push $0x30 + jmp alltraps +8010766b: e9 61 f9 ff ff jmp 80106fd1 + +80107670 : +.globl vector49 +vector49: + pushl $0 +80107670: 6a 00 push $0x0 + pushl $49 +80107672: 6a 31 push $0x31 + jmp alltraps +80107674: e9 58 f9 ff ff jmp 80106fd1 + +80107679 : +.globl vector50 +vector50: + pushl $0 +80107679: 6a 00 push $0x0 + pushl $50 +8010767b: 6a 32 push $0x32 + jmp alltraps +8010767d: e9 4f f9 ff ff jmp 80106fd1 + +80107682 : +.globl vector51 +vector51: + pushl $0 +80107682: 6a 00 push $0x0 + pushl $51 +80107684: 6a 33 push $0x33 + jmp alltraps +80107686: e9 46 f9 ff ff jmp 80106fd1 + +8010768b : +.globl vector52 +vector52: + pushl $0 +8010768b: 6a 00 push $0x0 + pushl $52 +8010768d: 6a 34 push $0x34 + jmp alltraps +8010768f: e9 3d f9 ff ff jmp 80106fd1 + +80107694 : +.globl vector53 +vector53: + pushl $0 +80107694: 6a 00 push $0x0 + pushl $53 +80107696: 6a 35 push $0x35 + jmp alltraps +80107698: e9 34 f9 ff ff jmp 80106fd1 + +8010769d : +.globl vector54 +vector54: + pushl $0 +8010769d: 6a 00 push $0x0 + pushl $54 +8010769f: 6a 36 push $0x36 + jmp alltraps +801076a1: e9 2b f9 ff ff jmp 80106fd1 + +801076a6 : +.globl vector55 +vector55: + pushl $0 +801076a6: 6a 00 push $0x0 + pushl $55 +801076a8: 6a 37 push $0x37 + jmp alltraps +801076aa: e9 22 f9 ff ff jmp 80106fd1 + +801076af : +.globl vector56 +vector56: + pushl $0 +801076af: 6a 00 push $0x0 + pushl $56 +801076b1: 6a 38 push $0x38 + jmp alltraps +801076b3: e9 19 f9 ff ff jmp 80106fd1 + +801076b8 : +.globl vector57 +vector57: + pushl $0 +801076b8: 6a 00 push $0x0 + pushl $57 +801076ba: 6a 39 push $0x39 + jmp alltraps +801076bc: e9 10 f9 ff ff jmp 80106fd1 + +801076c1 : +.globl vector58 +vector58: + pushl $0 +801076c1: 6a 00 push $0x0 + pushl $58 +801076c3: 6a 3a push $0x3a + jmp alltraps +801076c5: e9 07 f9 ff ff jmp 80106fd1 + +801076ca : +.globl vector59 +vector59: + pushl $0 +801076ca: 6a 00 push $0x0 + pushl $59 +801076cc: 6a 3b push $0x3b + jmp alltraps +801076ce: e9 fe f8 ff ff jmp 80106fd1 + +801076d3 : +.globl vector60 +vector60: + pushl $0 +801076d3: 6a 00 push $0x0 + pushl $60 +801076d5: 6a 3c push $0x3c + jmp alltraps +801076d7: e9 f5 f8 ff ff jmp 80106fd1 + +801076dc : +.globl vector61 +vector61: + pushl $0 +801076dc: 6a 00 push $0x0 + pushl $61 +801076de: 6a 3d push $0x3d + jmp alltraps +801076e0: e9 ec f8 ff ff jmp 80106fd1 + +801076e5 : +.globl vector62 +vector62: + pushl $0 +801076e5: 6a 00 push $0x0 + pushl $62 +801076e7: 6a 3e push $0x3e + jmp alltraps +801076e9: e9 e3 f8 ff ff jmp 80106fd1 + +801076ee : +.globl vector63 +vector63: + pushl $0 +801076ee: 6a 00 push $0x0 + pushl $63 +801076f0: 6a 3f push $0x3f + jmp alltraps +801076f2: e9 da f8 ff ff jmp 80106fd1 + +801076f7 : +.globl vector64 +vector64: + pushl $0 +801076f7: 6a 00 push $0x0 + pushl $64 +801076f9: 6a 40 push $0x40 + jmp alltraps +801076fb: e9 d1 f8 ff ff jmp 80106fd1 + +80107700 : +.globl vector65 +vector65: + pushl $0 +80107700: 6a 00 push $0x0 + pushl $65 +80107702: 6a 41 push $0x41 + jmp alltraps +80107704: e9 c8 f8 ff ff jmp 80106fd1 + +80107709 : +.globl vector66 +vector66: + pushl $0 +80107709: 6a 00 push $0x0 + pushl $66 +8010770b: 6a 42 push $0x42 + jmp alltraps +8010770d: e9 bf f8 ff ff jmp 80106fd1 + +80107712 : +.globl vector67 +vector67: + pushl $0 +80107712: 6a 00 push $0x0 + pushl $67 +80107714: 6a 43 push $0x43 + jmp alltraps +80107716: e9 b6 f8 ff ff jmp 80106fd1 + +8010771b : +.globl vector68 +vector68: + pushl $0 +8010771b: 6a 00 push $0x0 + pushl $68 +8010771d: 6a 44 push $0x44 + jmp alltraps +8010771f: e9 ad f8 ff ff jmp 80106fd1 + +80107724 : +.globl vector69 +vector69: + pushl $0 +80107724: 6a 00 push $0x0 + pushl $69 +80107726: 6a 45 push $0x45 + jmp alltraps +80107728: e9 a4 f8 ff ff jmp 80106fd1 + +8010772d : +.globl vector70 +vector70: + pushl $0 +8010772d: 6a 00 push $0x0 + pushl $70 +8010772f: 6a 46 push $0x46 + jmp alltraps +80107731: e9 9b f8 ff ff jmp 80106fd1 + +80107736 : +.globl vector71 +vector71: + pushl $0 +80107736: 6a 00 push $0x0 + pushl $71 +80107738: 6a 47 push $0x47 + jmp alltraps +8010773a: e9 92 f8 ff ff jmp 80106fd1 + +8010773f : +.globl vector72 +vector72: + pushl $0 +8010773f: 6a 00 push $0x0 + pushl $72 +80107741: 6a 48 push $0x48 + jmp alltraps +80107743: e9 89 f8 ff ff jmp 80106fd1 + +80107748 : +.globl vector73 +vector73: + pushl $0 +80107748: 6a 00 push $0x0 + pushl $73 +8010774a: 6a 49 push $0x49 + jmp alltraps +8010774c: e9 80 f8 ff ff jmp 80106fd1 + +80107751 : +.globl vector74 +vector74: + pushl $0 +80107751: 6a 00 push $0x0 + pushl $74 +80107753: 6a 4a push $0x4a + jmp alltraps +80107755: e9 77 f8 ff ff jmp 80106fd1 + +8010775a : +.globl vector75 +vector75: + pushl $0 +8010775a: 6a 00 push $0x0 + pushl $75 +8010775c: 6a 4b push $0x4b + jmp alltraps +8010775e: e9 6e f8 ff ff jmp 80106fd1 + +80107763 : +.globl vector76 +vector76: + pushl $0 +80107763: 6a 00 push $0x0 + pushl $76 +80107765: 6a 4c push $0x4c + jmp alltraps +80107767: e9 65 f8 ff ff jmp 80106fd1 + +8010776c : +.globl vector77 +vector77: + pushl $0 +8010776c: 6a 00 push $0x0 + pushl $77 +8010776e: 6a 4d push $0x4d + jmp alltraps +80107770: e9 5c f8 ff ff jmp 80106fd1 + +80107775 : +.globl vector78 +vector78: + pushl $0 +80107775: 6a 00 push $0x0 + pushl $78 +80107777: 6a 4e push $0x4e + jmp alltraps +80107779: e9 53 f8 ff ff jmp 80106fd1 + +8010777e : +.globl vector79 +vector79: + pushl $0 +8010777e: 6a 00 push $0x0 + pushl $79 +80107780: 6a 4f push $0x4f + jmp alltraps +80107782: e9 4a f8 ff ff jmp 80106fd1 + +80107787 : +.globl vector80 +vector80: + pushl $0 +80107787: 6a 00 push $0x0 + pushl $80 +80107789: 6a 50 push $0x50 + jmp alltraps +8010778b: e9 41 f8 ff ff jmp 80106fd1 + +80107790 : +.globl vector81 +vector81: + pushl $0 +80107790: 6a 00 push $0x0 + pushl $81 +80107792: 6a 51 push $0x51 + jmp alltraps +80107794: e9 38 f8 ff ff jmp 80106fd1 + +80107799 : +.globl vector82 +vector82: + pushl $0 +80107799: 6a 00 push $0x0 + pushl $82 +8010779b: 6a 52 push $0x52 + jmp alltraps +8010779d: e9 2f f8 ff ff jmp 80106fd1 + +801077a2 : +.globl vector83 +vector83: + pushl $0 +801077a2: 6a 00 push $0x0 + pushl $83 +801077a4: 6a 53 push $0x53 + jmp alltraps +801077a6: e9 26 f8 ff ff jmp 80106fd1 + +801077ab : +.globl vector84 +vector84: + pushl $0 +801077ab: 6a 00 push $0x0 + pushl $84 +801077ad: 6a 54 push $0x54 + jmp alltraps +801077af: e9 1d f8 ff ff jmp 80106fd1 + +801077b4 : +.globl vector85 +vector85: + pushl $0 +801077b4: 6a 00 push $0x0 + pushl $85 +801077b6: 6a 55 push $0x55 + jmp alltraps +801077b8: e9 14 f8 ff ff jmp 80106fd1 + +801077bd : +.globl vector86 +vector86: + pushl $0 +801077bd: 6a 00 push $0x0 + pushl $86 +801077bf: 6a 56 push $0x56 + jmp alltraps +801077c1: e9 0b f8 ff ff jmp 80106fd1 + +801077c6 : +.globl vector87 +vector87: + pushl $0 +801077c6: 6a 00 push $0x0 + pushl $87 +801077c8: 6a 57 push $0x57 + jmp alltraps +801077ca: e9 02 f8 ff ff jmp 80106fd1 + +801077cf : +.globl vector88 +vector88: + pushl $0 +801077cf: 6a 00 push $0x0 + pushl $88 +801077d1: 6a 58 push $0x58 + jmp alltraps +801077d3: e9 f9 f7 ff ff jmp 80106fd1 + +801077d8 : +.globl vector89 +vector89: + pushl $0 +801077d8: 6a 00 push $0x0 + pushl $89 +801077da: 6a 59 push $0x59 + jmp alltraps +801077dc: e9 f0 f7 ff ff jmp 80106fd1 + +801077e1 : +.globl vector90 +vector90: + pushl $0 +801077e1: 6a 00 push $0x0 + pushl $90 +801077e3: 6a 5a push $0x5a + jmp alltraps +801077e5: e9 e7 f7 ff ff jmp 80106fd1 + +801077ea : +.globl vector91 +vector91: + pushl $0 +801077ea: 6a 00 push $0x0 + pushl $91 +801077ec: 6a 5b push $0x5b + jmp alltraps +801077ee: e9 de f7 ff ff jmp 80106fd1 + +801077f3 : +.globl vector92 +vector92: + pushl $0 +801077f3: 6a 00 push $0x0 + pushl $92 +801077f5: 6a 5c push $0x5c + jmp alltraps +801077f7: e9 d5 f7 ff ff jmp 80106fd1 + +801077fc : +.globl vector93 +vector93: + pushl $0 +801077fc: 6a 00 push $0x0 + pushl $93 +801077fe: 6a 5d push $0x5d + jmp alltraps +80107800: e9 cc f7 ff ff jmp 80106fd1 + +80107805 : +.globl vector94 +vector94: + pushl $0 +80107805: 6a 00 push $0x0 + pushl $94 +80107807: 6a 5e push $0x5e + jmp alltraps +80107809: e9 c3 f7 ff ff jmp 80106fd1 + +8010780e : +.globl vector95 +vector95: + pushl $0 +8010780e: 6a 00 push $0x0 + pushl $95 +80107810: 6a 5f push $0x5f + jmp alltraps +80107812: e9 ba f7 ff ff jmp 80106fd1 + +80107817 : +.globl vector96 +vector96: + pushl $0 +80107817: 6a 00 push $0x0 + pushl $96 +80107819: 6a 60 push $0x60 + jmp alltraps +8010781b: e9 b1 f7 ff ff jmp 80106fd1 + +80107820 : +.globl vector97 +vector97: + pushl $0 +80107820: 6a 00 push $0x0 + pushl $97 +80107822: 6a 61 push $0x61 + jmp alltraps +80107824: e9 a8 f7 ff ff jmp 80106fd1 + +80107829 : +.globl vector98 +vector98: + pushl $0 +80107829: 6a 00 push $0x0 + pushl $98 +8010782b: 6a 62 push $0x62 + jmp alltraps +8010782d: e9 9f f7 ff ff jmp 80106fd1 + +80107832 : +.globl vector99 +vector99: + pushl $0 +80107832: 6a 00 push $0x0 + pushl $99 +80107834: 6a 63 push $0x63 + jmp alltraps +80107836: e9 96 f7 ff ff jmp 80106fd1 + +8010783b : +.globl vector100 +vector100: + pushl $0 +8010783b: 6a 00 push $0x0 + pushl $100 +8010783d: 6a 64 push $0x64 + jmp alltraps +8010783f: e9 8d f7 ff ff jmp 80106fd1 + +80107844 : +.globl vector101 +vector101: + pushl $0 +80107844: 6a 00 push $0x0 + pushl $101 +80107846: 6a 65 push $0x65 + jmp alltraps +80107848: e9 84 f7 ff ff jmp 80106fd1 + +8010784d : +.globl vector102 +vector102: + pushl $0 +8010784d: 6a 00 push $0x0 + pushl $102 +8010784f: 6a 66 push $0x66 + jmp alltraps +80107851: e9 7b f7 ff ff jmp 80106fd1 + +80107856 : +.globl vector103 +vector103: + pushl $0 +80107856: 6a 00 push $0x0 + pushl $103 +80107858: 6a 67 push $0x67 + jmp alltraps +8010785a: e9 72 f7 ff ff jmp 80106fd1 + +8010785f : +.globl vector104 +vector104: + pushl $0 +8010785f: 6a 00 push $0x0 + pushl $104 +80107861: 6a 68 push $0x68 + jmp alltraps +80107863: e9 69 f7 ff ff jmp 80106fd1 + +80107868 : +.globl vector105 +vector105: + pushl $0 +80107868: 6a 00 push $0x0 + pushl $105 +8010786a: 6a 69 push $0x69 + jmp alltraps +8010786c: e9 60 f7 ff ff jmp 80106fd1 + +80107871 : +.globl vector106 +vector106: + pushl $0 +80107871: 6a 00 push $0x0 + pushl $106 +80107873: 6a 6a push $0x6a + jmp alltraps +80107875: e9 57 f7 ff ff jmp 80106fd1 + +8010787a : +.globl vector107 +vector107: + pushl $0 +8010787a: 6a 00 push $0x0 + pushl $107 +8010787c: 6a 6b push $0x6b + jmp alltraps +8010787e: e9 4e f7 ff ff jmp 80106fd1 + +80107883 : +.globl vector108 +vector108: + pushl $0 +80107883: 6a 00 push $0x0 + pushl $108 +80107885: 6a 6c push $0x6c + jmp alltraps +80107887: e9 45 f7 ff ff jmp 80106fd1 + +8010788c : +.globl vector109 +vector109: + pushl $0 +8010788c: 6a 00 push $0x0 + pushl $109 +8010788e: 6a 6d push $0x6d + jmp alltraps +80107890: e9 3c f7 ff ff jmp 80106fd1 + +80107895 : +.globl vector110 +vector110: + pushl $0 +80107895: 6a 00 push $0x0 + pushl $110 +80107897: 6a 6e push $0x6e + jmp alltraps +80107899: e9 33 f7 ff ff jmp 80106fd1 + +8010789e : +.globl vector111 +vector111: + pushl $0 +8010789e: 6a 00 push $0x0 + pushl $111 +801078a0: 6a 6f push $0x6f + jmp alltraps +801078a2: e9 2a f7 ff ff jmp 80106fd1 + +801078a7 : +.globl vector112 +vector112: + pushl $0 +801078a7: 6a 00 push $0x0 + pushl $112 +801078a9: 6a 70 push $0x70 + jmp alltraps +801078ab: e9 21 f7 ff ff jmp 80106fd1 + +801078b0 : +.globl vector113 +vector113: + pushl $0 +801078b0: 6a 00 push $0x0 + pushl $113 +801078b2: 6a 71 push $0x71 + jmp alltraps +801078b4: e9 18 f7 ff ff jmp 80106fd1 + +801078b9 : +.globl vector114 +vector114: + pushl $0 +801078b9: 6a 00 push $0x0 + pushl $114 +801078bb: 6a 72 push $0x72 + jmp alltraps +801078bd: e9 0f f7 ff ff jmp 80106fd1 + +801078c2 : +.globl vector115 +vector115: + pushl $0 +801078c2: 6a 00 push $0x0 + pushl $115 +801078c4: 6a 73 push $0x73 + jmp alltraps +801078c6: e9 06 f7 ff ff jmp 80106fd1 + +801078cb : +.globl vector116 +vector116: + pushl $0 +801078cb: 6a 00 push $0x0 + pushl $116 +801078cd: 6a 74 push $0x74 + jmp alltraps +801078cf: e9 fd f6 ff ff jmp 80106fd1 + +801078d4 : +.globl vector117 +vector117: + pushl $0 +801078d4: 6a 00 push $0x0 + pushl $117 +801078d6: 6a 75 push $0x75 + jmp alltraps +801078d8: e9 f4 f6 ff ff jmp 80106fd1 + +801078dd : +.globl vector118 +vector118: + pushl $0 +801078dd: 6a 00 push $0x0 + pushl $118 +801078df: 6a 76 push $0x76 + jmp alltraps +801078e1: e9 eb f6 ff ff jmp 80106fd1 + +801078e6 : +.globl vector119 +vector119: + pushl $0 +801078e6: 6a 00 push $0x0 + pushl $119 +801078e8: 6a 77 push $0x77 + jmp alltraps +801078ea: e9 e2 f6 ff ff jmp 80106fd1 + +801078ef : +.globl vector120 +vector120: + pushl $0 +801078ef: 6a 00 push $0x0 + pushl $120 +801078f1: 6a 78 push $0x78 + jmp alltraps +801078f3: e9 d9 f6 ff ff jmp 80106fd1 + +801078f8 : +.globl vector121 +vector121: + pushl $0 +801078f8: 6a 00 push $0x0 + pushl $121 +801078fa: 6a 79 push $0x79 + jmp alltraps +801078fc: e9 d0 f6 ff ff jmp 80106fd1 + +80107901 : +.globl vector122 +vector122: + pushl $0 +80107901: 6a 00 push $0x0 + pushl $122 +80107903: 6a 7a push $0x7a + jmp alltraps +80107905: e9 c7 f6 ff ff jmp 80106fd1 + +8010790a : +.globl vector123 +vector123: + pushl $0 +8010790a: 6a 00 push $0x0 + pushl $123 +8010790c: 6a 7b push $0x7b + jmp alltraps +8010790e: e9 be f6 ff ff jmp 80106fd1 + +80107913 : +.globl vector124 +vector124: + pushl $0 +80107913: 6a 00 push $0x0 + pushl $124 +80107915: 6a 7c push $0x7c + jmp alltraps +80107917: e9 b5 f6 ff ff jmp 80106fd1 + +8010791c : +.globl vector125 +vector125: + pushl $0 +8010791c: 6a 00 push $0x0 + pushl $125 +8010791e: 6a 7d push $0x7d + jmp alltraps +80107920: e9 ac f6 ff ff jmp 80106fd1 + +80107925 : +.globl vector126 +vector126: + pushl $0 +80107925: 6a 00 push $0x0 + pushl $126 +80107927: 6a 7e push $0x7e + jmp alltraps +80107929: e9 a3 f6 ff ff jmp 80106fd1 + +8010792e : +.globl vector127 +vector127: + pushl $0 +8010792e: 6a 00 push $0x0 + pushl $127 +80107930: 6a 7f push $0x7f + jmp alltraps +80107932: e9 9a f6 ff ff jmp 80106fd1 + +80107937 : +.globl vector128 +vector128: + pushl $0 +80107937: 6a 00 push $0x0 + pushl $128 +80107939: 68 80 00 00 00 push $0x80 + jmp alltraps +8010793e: e9 8e f6 ff ff jmp 80106fd1 + +80107943 : +.globl vector129 +vector129: + pushl $0 +80107943: 6a 00 push $0x0 + pushl $129 +80107945: 68 81 00 00 00 push $0x81 + jmp alltraps +8010794a: e9 82 f6 ff ff jmp 80106fd1 + +8010794f : +.globl vector130 +vector130: + pushl $0 +8010794f: 6a 00 push $0x0 + pushl $130 +80107951: 68 82 00 00 00 push $0x82 + jmp alltraps +80107956: e9 76 f6 ff ff jmp 80106fd1 + +8010795b : +.globl vector131 +vector131: + pushl $0 +8010795b: 6a 00 push $0x0 + pushl $131 +8010795d: 68 83 00 00 00 push $0x83 + jmp alltraps +80107962: e9 6a f6 ff ff jmp 80106fd1 + +80107967 : +.globl vector132 +vector132: + pushl $0 +80107967: 6a 00 push $0x0 + pushl $132 +80107969: 68 84 00 00 00 push $0x84 + jmp alltraps +8010796e: e9 5e f6 ff ff jmp 80106fd1 + +80107973 : +.globl vector133 +vector133: + pushl $0 +80107973: 6a 00 push $0x0 + pushl $133 +80107975: 68 85 00 00 00 push $0x85 + jmp alltraps +8010797a: e9 52 f6 ff ff jmp 80106fd1 + +8010797f : +.globl vector134 +vector134: + pushl $0 +8010797f: 6a 00 push $0x0 + pushl $134 +80107981: 68 86 00 00 00 push $0x86 + jmp alltraps +80107986: e9 46 f6 ff ff jmp 80106fd1 + +8010798b : +.globl vector135 +vector135: + pushl $0 +8010798b: 6a 00 push $0x0 + pushl $135 +8010798d: 68 87 00 00 00 push $0x87 + jmp alltraps +80107992: e9 3a f6 ff ff jmp 80106fd1 + +80107997 : +.globl vector136 +vector136: + pushl $0 +80107997: 6a 00 push $0x0 + pushl $136 +80107999: 68 88 00 00 00 push $0x88 + jmp alltraps +8010799e: e9 2e f6 ff ff jmp 80106fd1 + +801079a3 : +.globl vector137 +vector137: + pushl $0 +801079a3: 6a 00 push $0x0 + pushl $137 +801079a5: 68 89 00 00 00 push $0x89 + jmp alltraps +801079aa: e9 22 f6 ff ff jmp 80106fd1 + +801079af : +.globl vector138 +vector138: + pushl $0 +801079af: 6a 00 push $0x0 + pushl $138 +801079b1: 68 8a 00 00 00 push $0x8a + jmp alltraps +801079b6: e9 16 f6 ff ff jmp 80106fd1 + +801079bb : +.globl vector139 +vector139: + pushl $0 +801079bb: 6a 00 push $0x0 + pushl $139 +801079bd: 68 8b 00 00 00 push $0x8b + jmp alltraps +801079c2: e9 0a f6 ff ff jmp 80106fd1 + +801079c7 : +.globl vector140 +vector140: + pushl $0 +801079c7: 6a 00 push $0x0 + pushl $140 +801079c9: 68 8c 00 00 00 push $0x8c + jmp alltraps +801079ce: e9 fe f5 ff ff jmp 80106fd1 + +801079d3 : +.globl vector141 +vector141: + pushl $0 +801079d3: 6a 00 push $0x0 + pushl $141 +801079d5: 68 8d 00 00 00 push $0x8d + jmp alltraps +801079da: e9 f2 f5 ff ff jmp 80106fd1 + +801079df : +.globl vector142 +vector142: + pushl $0 +801079df: 6a 00 push $0x0 + pushl $142 +801079e1: 68 8e 00 00 00 push $0x8e + jmp alltraps +801079e6: e9 e6 f5 ff ff jmp 80106fd1 + +801079eb : +.globl vector143 +vector143: + pushl $0 +801079eb: 6a 00 push $0x0 + pushl $143 +801079ed: 68 8f 00 00 00 push $0x8f + jmp alltraps +801079f2: e9 da f5 ff ff jmp 80106fd1 + +801079f7 : +.globl vector144 +vector144: + pushl $0 +801079f7: 6a 00 push $0x0 + pushl $144 +801079f9: 68 90 00 00 00 push $0x90 + jmp alltraps +801079fe: e9 ce f5 ff ff jmp 80106fd1 + +80107a03 : +.globl vector145 +vector145: + pushl $0 +80107a03: 6a 00 push $0x0 + pushl $145 +80107a05: 68 91 00 00 00 push $0x91 + jmp alltraps +80107a0a: e9 c2 f5 ff ff jmp 80106fd1 + +80107a0f : +.globl vector146 +vector146: + pushl $0 +80107a0f: 6a 00 push $0x0 + pushl $146 +80107a11: 68 92 00 00 00 push $0x92 + jmp alltraps +80107a16: e9 b6 f5 ff ff jmp 80106fd1 + +80107a1b : +.globl vector147 +vector147: + pushl $0 +80107a1b: 6a 00 push $0x0 + pushl $147 +80107a1d: 68 93 00 00 00 push $0x93 + jmp alltraps +80107a22: e9 aa f5 ff ff jmp 80106fd1 + +80107a27 : +.globl vector148 +vector148: + pushl $0 +80107a27: 6a 00 push $0x0 + pushl $148 +80107a29: 68 94 00 00 00 push $0x94 + jmp alltraps +80107a2e: e9 9e f5 ff ff jmp 80106fd1 + +80107a33 : +.globl vector149 +vector149: + pushl $0 +80107a33: 6a 00 push $0x0 + pushl $149 +80107a35: 68 95 00 00 00 push $0x95 + jmp alltraps +80107a3a: e9 92 f5 ff ff jmp 80106fd1 + +80107a3f : +.globl vector150 +vector150: + pushl $0 +80107a3f: 6a 00 push $0x0 + pushl $150 +80107a41: 68 96 00 00 00 push $0x96 + jmp alltraps +80107a46: e9 86 f5 ff ff jmp 80106fd1 + +80107a4b : +.globl vector151 +vector151: + pushl $0 +80107a4b: 6a 00 push $0x0 + pushl $151 +80107a4d: 68 97 00 00 00 push $0x97 + jmp alltraps +80107a52: e9 7a f5 ff ff jmp 80106fd1 + +80107a57 : +.globl vector152 +vector152: + pushl $0 +80107a57: 6a 00 push $0x0 + pushl $152 +80107a59: 68 98 00 00 00 push $0x98 + jmp alltraps +80107a5e: e9 6e f5 ff ff jmp 80106fd1 + +80107a63 : +.globl vector153 +vector153: + pushl $0 +80107a63: 6a 00 push $0x0 + pushl $153 +80107a65: 68 99 00 00 00 push $0x99 + jmp alltraps +80107a6a: e9 62 f5 ff ff jmp 80106fd1 + +80107a6f : +.globl vector154 +vector154: + pushl $0 +80107a6f: 6a 00 push $0x0 + pushl $154 +80107a71: 68 9a 00 00 00 push $0x9a + jmp alltraps +80107a76: e9 56 f5 ff ff jmp 80106fd1 + +80107a7b : +.globl vector155 +vector155: + pushl $0 +80107a7b: 6a 00 push $0x0 + pushl $155 +80107a7d: 68 9b 00 00 00 push $0x9b + jmp alltraps +80107a82: e9 4a f5 ff ff jmp 80106fd1 + +80107a87 : +.globl vector156 +vector156: + pushl $0 +80107a87: 6a 00 push $0x0 + pushl $156 +80107a89: 68 9c 00 00 00 push $0x9c + jmp alltraps +80107a8e: e9 3e f5 ff ff jmp 80106fd1 + +80107a93 : +.globl vector157 +vector157: + pushl $0 +80107a93: 6a 00 push $0x0 + pushl $157 +80107a95: 68 9d 00 00 00 push $0x9d + jmp alltraps +80107a9a: e9 32 f5 ff ff jmp 80106fd1 + +80107a9f : +.globl vector158 +vector158: + pushl $0 +80107a9f: 6a 00 push $0x0 + pushl $158 +80107aa1: 68 9e 00 00 00 push $0x9e + jmp alltraps +80107aa6: e9 26 f5 ff ff jmp 80106fd1 + +80107aab : +.globl vector159 +vector159: + pushl $0 +80107aab: 6a 00 push $0x0 + pushl $159 +80107aad: 68 9f 00 00 00 push $0x9f + jmp alltraps +80107ab2: e9 1a f5 ff ff jmp 80106fd1 + +80107ab7 : +.globl vector160 +vector160: + pushl $0 +80107ab7: 6a 00 push $0x0 + pushl $160 +80107ab9: 68 a0 00 00 00 push $0xa0 + jmp alltraps +80107abe: e9 0e f5 ff ff jmp 80106fd1 + +80107ac3 : +.globl vector161 +vector161: + pushl $0 +80107ac3: 6a 00 push $0x0 + pushl $161 +80107ac5: 68 a1 00 00 00 push $0xa1 + jmp alltraps +80107aca: e9 02 f5 ff ff jmp 80106fd1 + +80107acf : +.globl vector162 +vector162: + pushl $0 +80107acf: 6a 00 push $0x0 + pushl $162 +80107ad1: 68 a2 00 00 00 push $0xa2 + jmp alltraps +80107ad6: e9 f6 f4 ff ff jmp 80106fd1 + +80107adb : +.globl vector163 +vector163: + pushl $0 +80107adb: 6a 00 push $0x0 + pushl $163 +80107add: 68 a3 00 00 00 push $0xa3 + jmp alltraps +80107ae2: e9 ea f4 ff ff jmp 80106fd1 + +80107ae7 : +.globl vector164 +vector164: + pushl $0 +80107ae7: 6a 00 push $0x0 + pushl $164 +80107ae9: 68 a4 00 00 00 push $0xa4 + jmp alltraps +80107aee: e9 de f4 ff ff jmp 80106fd1 + +80107af3 : +.globl vector165 +vector165: + pushl $0 +80107af3: 6a 00 push $0x0 + pushl $165 +80107af5: 68 a5 00 00 00 push $0xa5 + jmp alltraps +80107afa: e9 d2 f4 ff ff jmp 80106fd1 + +80107aff : +.globl vector166 +vector166: + pushl $0 +80107aff: 6a 00 push $0x0 + pushl $166 +80107b01: 68 a6 00 00 00 push $0xa6 + jmp alltraps +80107b06: e9 c6 f4 ff ff jmp 80106fd1 + +80107b0b : +.globl vector167 +vector167: + pushl $0 +80107b0b: 6a 00 push $0x0 + pushl $167 +80107b0d: 68 a7 00 00 00 push $0xa7 + jmp alltraps +80107b12: e9 ba f4 ff ff jmp 80106fd1 + +80107b17 : +.globl vector168 +vector168: + pushl $0 +80107b17: 6a 00 push $0x0 + pushl $168 +80107b19: 68 a8 00 00 00 push $0xa8 + jmp alltraps +80107b1e: e9 ae f4 ff ff jmp 80106fd1 + +80107b23 : +.globl vector169 +vector169: + pushl $0 +80107b23: 6a 00 push $0x0 + pushl $169 +80107b25: 68 a9 00 00 00 push $0xa9 + jmp alltraps +80107b2a: e9 a2 f4 ff ff jmp 80106fd1 + +80107b2f : +.globl vector170 +vector170: + pushl $0 +80107b2f: 6a 00 push $0x0 + pushl $170 +80107b31: 68 aa 00 00 00 push $0xaa + jmp alltraps +80107b36: e9 96 f4 ff ff jmp 80106fd1 + +80107b3b : +.globl vector171 +vector171: + pushl $0 +80107b3b: 6a 00 push $0x0 + pushl $171 +80107b3d: 68 ab 00 00 00 push $0xab + jmp alltraps +80107b42: e9 8a f4 ff ff jmp 80106fd1 + +80107b47 : +.globl vector172 +vector172: + pushl $0 +80107b47: 6a 00 push $0x0 + pushl $172 +80107b49: 68 ac 00 00 00 push $0xac + jmp alltraps +80107b4e: e9 7e f4 ff ff jmp 80106fd1 + +80107b53 : +.globl vector173 +vector173: + pushl $0 +80107b53: 6a 00 push $0x0 + pushl $173 +80107b55: 68 ad 00 00 00 push $0xad + jmp alltraps +80107b5a: e9 72 f4 ff ff jmp 80106fd1 + +80107b5f : +.globl vector174 +vector174: + pushl $0 +80107b5f: 6a 00 push $0x0 + pushl $174 +80107b61: 68 ae 00 00 00 push $0xae + jmp alltraps +80107b66: e9 66 f4 ff ff jmp 80106fd1 + +80107b6b : +.globl vector175 +vector175: + pushl $0 +80107b6b: 6a 00 push $0x0 + pushl $175 +80107b6d: 68 af 00 00 00 push $0xaf + jmp alltraps +80107b72: e9 5a f4 ff ff jmp 80106fd1 + +80107b77 : +.globl vector176 +vector176: + pushl $0 +80107b77: 6a 00 push $0x0 + pushl $176 +80107b79: 68 b0 00 00 00 push $0xb0 + jmp alltraps +80107b7e: e9 4e f4 ff ff jmp 80106fd1 + +80107b83 : +.globl vector177 +vector177: + pushl $0 +80107b83: 6a 00 push $0x0 + pushl $177 +80107b85: 68 b1 00 00 00 push $0xb1 + jmp alltraps +80107b8a: e9 42 f4 ff ff jmp 80106fd1 + +80107b8f : +.globl vector178 +vector178: + pushl $0 +80107b8f: 6a 00 push $0x0 + pushl $178 +80107b91: 68 b2 00 00 00 push $0xb2 + jmp alltraps +80107b96: e9 36 f4 ff ff jmp 80106fd1 + +80107b9b : +.globl vector179 +vector179: + pushl $0 +80107b9b: 6a 00 push $0x0 + pushl $179 +80107b9d: 68 b3 00 00 00 push $0xb3 + jmp alltraps +80107ba2: e9 2a f4 ff ff jmp 80106fd1 + +80107ba7 : +.globl vector180 +vector180: + pushl $0 +80107ba7: 6a 00 push $0x0 + pushl $180 +80107ba9: 68 b4 00 00 00 push $0xb4 + jmp alltraps +80107bae: e9 1e f4 ff ff jmp 80106fd1 + +80107bb3 : +.globl vector181 +vector181: + pushl $0 +80107bb3: 6a 00 push $0x0 + pushl $181 +80107bb5: 68 b5 00 00 00 push $0xb5 + jmp alltraps +80107bba: e9 12 f4 ff ff jmp 80106fd1 + +80107bbf : +.globl vector182 +vector182: + pushl $0 +80107bbf: 6a 00 push $0x0 + pushl $182 +80107bc1: 68 b6 00 00 00 push $0xb6 + jmp alltraps +80107bc6: e9 06 f4 ff ff jmp 80106fd1 + +80107bcb : +.globl vector183 +vector183: + pushl $0 +80107bcb: 6a 00 push $0x0 + pushl $183 +80107bcd: 68 b7 00 00 00 push $0xb7 + jmp alltraps +80107bd2: e9 fa f3 ff ff jmp 80106fd1 + +80107bd7 : +.globl vector184 +vector184: + pushl $0 +80107bd7: 6a 00 push $0x0 + pushl $184 +80107bd9: 68 b8 00 00 00 push $0xb8 + jmp alltraps +80107bde: e9 ee f3 ff ff jmp 80106fd1 + +80107be3 : +.globl vector185 +vector185: + pushl $0 +80107be3: 6a 00 push $0x0 + pushl $185 +80107be5: 68 b9 00 00 00 push $0xb9 + jmp alltraps +80107bea: e9 e2 f3 ff ff jmp 80106fd1 + +80107bef : +.globl vector186 +vector186: + pushl $0 +80107bef: 6a 00 push $0x0 + pushl $186 +80107bf1: 68 ba 00 00 00 push $0xba + jmp alltraps +80107bf6: e9 d6 f3 ff ff jmp 80106fd1 + +80107bfb : +.globl vector187 +vector187: + pushl $0 +80107bfb: 6a 00 push $0x0 + pushl $187 +80107bfd: 68 bb 00 00 00 push $0xbb + jmp alltraps +80107c02: e9 ca f3 ff ff jmp 80106fd1 + +80107c07 : +.globl vector188 +vector188: + pushl $0 +80107c07: 6a 00 push $0x0 + pushl $188 +80107c09: 68 bc 00 00 00 push $0xbc + jmp alltraps +80107c0e: e9 be f3 ff ff jmp 80106fd1 + +80107c13 : +.globl vector189 +vector189: + pushl $0 +80107c13: 6a 00 push $0x0 + pushl $189 +80107c15: 68 bd 00 00 00 push $0xbd + jmp alltraps +80107c1a: e9 b2 f3 ff ff jmp 80106fd1 + +80107c1f : +.globl vector190 +vector190: + pushl $0 +80107c1f: 6a 00 push $0x0 + pushl $190 +80107c21: 68 be 00 00 00 push $0xbe + jmp alltraps +80107c26: e9 a6 f3 ff ff jmp 80106fd1 + +80107c2b : +.globl vector191 +vector191: + pushl $0 +80107c2b: 6a 00 push $0x0 + pushl $191 +80107c2d: 68 bf 00 00 00 push $0xbf + jmp alltraps +80107c32: e9 9a f3 ff ff jmp 80106fd1 + +80107c37 : +.globl vector192 +vector192: + pushl $0 +80107c37: 6a 00 push $0x0 + pushl $192 +80107c39: 68 c0 00 00 00 push $0xc0 + jmp alltraps +80107c3e: e9 8e f3 ff ff jmp 80106fd1 + +80107c43 : +.globl vector193 +vector193: + pushl $0 +80107c43: 6a 00 push $0x0 + pushl $193 +80107c45: 68 c1 00 00 00 push $0xc1 + jmp alltraps +80107c4a: e9 82 f3 ff ff jmp 80106fd1 + +80107c4f : +.globl vector194 +vector194: + pushl $0 +80107c4f: 6a 00 push $0x0 + pushl $194 +80107c51: 68 c2 00 00 00 push $0xc2 + jmp alltraps +80107c56: e9 76 f3 ff ff jmp 80106fd1 + +80107c5b : +.globl vector195 +vector195: + pushl $0 +80107c5b: 6a 00 push $0x0 + pushl $195 +80107c5d: 68 c3 00 00 00 push $0xc3 + jmp alltraps +80107c62: e9 6a f3 ff ff jmp 80106fd1 + +80107c67 : +.globl vector196 +vector196: + pushl $0 +80107c67: 6a 00 push $0x0 + pushl $196 +80107c69: 68 c4 00 00 00 push $0xc4 + jmp alltraps +80107c6e: e9 5e f3 ff ff jmp 80106fd1 + +80107c73 : +.globl vector197 +vector197: + pushl $0 +80107c73: 6a 00 push $0x0 + pushl $197 +80107c75: 68 c5 00 00 00 push $0xc5 + jmp alltraps +80107c7a: e9 52 f3 ff ff jmp 80106fd1 + +80107c7f : +.globl vector198 +vector198: + pushl $0 +80107c7f: 6a 00 push $0x0 + pushl $198 +80107c81: 68 c6 00 00 00 push $0xc6 + jmp alltraps +80107c86: e9 46 f3 ff ff jmp 80106fd1 + +80107c8b : +.globl vector199 +vector199: + pushl $0 +80107c8b: 6a 00 push $0x0 + pushl $199 +80107c8d: 68 c7 00 00 00 push $0xc7 + jmp alltraps +80107c92: e9 3a f3 ff ff jmp 80106fd1 + +80107c97 : +.globl vector200 +vector200: + pushl $0 +80107c97: 6a 00 push $0x0 + pushl $200 +80107c99: 68 c8 00 00 00 push $0xc8 + jmp alltraps +80107c9e: e9 2e f3 ff ff jmp 80106fd1 + +80107ca3 : +.globl vector201 +vector201: + pushl $0 +80107ca3: 6a 00 push $0x0 + pushl $201 +80107ca5: 68 c9 00 00 00 push $0xc9 + jmp alltraps +80107caa: e9 22 f3 ff ff jmp 80106fd1 + +80107caf : +.globl vector202 +vector202: + pushl $0 +80107caf: 6a 00 push $0x0 + pushl $202 +80107cb1: 68 ca 00 00 00 push $0xca + jmp alltraps +80107cb6: e9 16 f3 ff ff jmp 80106fd1 + +80107cbb : +.globl vector203 +vector203: + pushl $0 +80107cbb: 6a 00 push $0x0 + pushl $203 +80107cbd: 68 cb 00 00 00 push $0xcb + jmp alltraps +80107cc2: e9 0a f3 ff ff jmp 80106fd1 + +80107cc7 : +.globl vector204 +vector204: + pushl $0 +80107cc7: 6a 00 push $0x0 + pushl $204 +80107cc9: 68 cc 00 00 00 push $0xcc + jmp alltraps +80107cce: e9 fe f2 ff ff jmp 80106fd1 + +80107cd3 : +.globl vector205 +vector205: + pushl $0 +80107cd3: 6a 00 push $0x0 + pushl $205 +80107cd5: 68 cd 00 00 00 push $0xcd + jmp alltraps +80107cda: e9 f2 f2 ff ff jmp 80106fd1 + +80107cdf : +.globl vector206 +vector206: + pushl $0 +80107cdf: 6a 00 push $0x0 + pushl $206 +80107ce1: 68 ce 00 00 00 push $0xce + jmp alltraps +80107ce6: e9 e6 f2 ff ff jmp 80106fd1 + +80107ceb : +.globl vector207 +vector207: + pushl $0 +80107ceb: 6a 00 push $0x0 + pushl $207 +80107ced: 68 cf 00 00 00 push $0xcf + jmp alltraps +80107cf2: e9 da f2 ff ff jmp 80106fd1 + +80107cf7 : +.globl vector208 +vector208: + pushl $0 +80107cf7: 6a 00 push $0x0 + pushl $208 +80107cf9: 68 d0 00 00 00 push $0xd0 + jmp alltraps +80107cfe: e9 ce f2 ff ff jmp 80106fd1 + +80107d03 : +.globl vector209 +vector209: + pushl $0 +80107d03: 6a 00 push $0x0 + pushl $209 +80107d05: 68 d1 00 00 00 push $0xd1 + jmp alltraps +80107d0a: e9 c2 f2 ff ff jmp 80106fd1 + +80107d0f : +.globl vector210 +vector210: + pushl $0 +80107d0f: 6a 00 push $0x0 + pushl $210 +80107d11: 68 d2 00 00 00 push $0xd2 + jmp alltraps +80107d16: e9 b6 f2 ff ff jmp 80106fd1 + +80107d1b : +.globl vector211 +vector211: + pushl $0 +80107d1b: 6a 00 push $0x0 + pushl $211 +80107d1d: 68 d3 00 00 00 push $0xd3 + jmp alltraps +80107d22: e9 aa f2 ff ff jmp 80106fd1 + +80107d27 : +.globl vector212 +vector212: + pushl $0 +80107d27: 6a 00 push $0x0 + pushl $212 +80107d29: 68 d4 00 00 00 push $0xd4 + jmp alltraps +80107d2e: e9 9e f2 ff ff jmp 80106fd1 + +80107d33 : +.globl vector213 +vector213: + pushl $0 +80107d33: 6a 00 push $0x0 + pushl $213 +80107d35: 68 d5 00 00 00 push $0xd5 + jmp alltraps +80107d3a: e9 92 f2 ff ff jmp 80106fd1 + +80107d3f : +.globl vector214 +vector214: + pushl $0 +80107d3f: 6a 00 push $0x0 + pushl $214 +80107d41: 68 d6 00 00 00 push $0xd6 + jmp alltraps +80107d46: e9 86 f2 ff ff jmp 80106fd1 + +80107d4b : +.globl vector215 +vector215: + pushl $0 +80107d4b: 6a 00 push $0x0 + pushl $215 +80107d4d: 68 d7 00 00 00 push $0xd7 + jmp alltraps +80107d52: e9 7a f2 ff ff jmp 80106fd1 + +80107d57 : +.globl vector216 +vector216: + pushl $0 +80107d57: 6a 00 push $0x0 + pushl $216 +80107d59: 68 d8 00 00 00 push $0xd8 + jmp alltraps +80107d5e: e9 6e f2 ff ff jmp 80106fd1 + +80107d63 : +.globl vector217 +vector217: + pushl $0 +80107d63: 6a 00 push $0x0 + pushl $217 +80107d65: 68 d9 00 00 00 push $0xd9 + jmp alltraps +80107d6a: e9 62 f2 ff ff jmp 80106fd1 + +80107d6f : +.globl vector218 +vector218: + pushl $0 +80107d6f: 6a 00 push $0x0 + pushl $218 +80107d71: 68 da 00 00 00 push $0xda + jmp alltraps +80107d76: e9 56 f2 ff ff jmp 80106fd1 + +80107d7b : +.globl vector219 +vector219: + pushl $0 +80107d7b: 6a 00 push $0x0 + pushl $219 +80107d7d: 68 db 00 00 00 push $0xdb + jmp alltraps +80107d82: e9 4a f2 ff ff jmp 80106fd1 + +80107d87 : +.globl vector220 +vector220: + pushl $0 +80107d87: 6a 00 push $0x0 + pushl $220 +80107d89: 68 dc 00 00 00 push $0xdc + jmp alltraps +80107d8e: e9 3e f2 ff ff jmp 80106fd1 + +80107d93 : +.globl vector221 +vector221: + pushl $0 +80107d93: 6a 00 push $0x0 + pushl $221 +80107d95: 68 dd 00 00 00 push $0xdd + jmp alltraps +80107d9a: e9 32 f2 ff ff jmp 80106fd1 + +80107d9f : +.globl vector222 +vector222: + pushl $0 +80107d9f: 6a 00 push $0x0 + pushl $222 +80107da1: 68 de 00 00 00 push $0xde + jmp alltraps +80107da6: e9 26 f2 ff ff jmp 80106fd1 + +80107dab : +.globl vector223 +vector223: + pushl $0 +80107dab: 6a 00 push $0x0 + pushl $223 +80107dad: 68 df 00 00 00 push $0xdf + jmp alltraps +80107db2: e9 1a f2 ff ff jmp 80106fd1 + +80107db7 : +.globl vector224 +vector224: + pushl $0 +80107db7: 6a 00 push $0x0 + pushl $224 +80107db9: 68 e0 00 00 00 push $0xe0 + jmp alltraps +80107dbe: e9 0e f2 ff ff jmp 80106fd1 + +80107dc3 : +.globl vector225 +vector225: + pushl $0 +80107dc3: 6a 00 push $0x0 + pushl $225 +80107dc5: 68 e1 00 00 00 push $0xe1 + jmp alltraps +80107dca: e9 02 f2 ff ff jmp 80106fd1 + +80107dcf : +.globl vector226 +vector226: + pushl $0 +80107dcf: 6a 00 push $0x0 + pushl $226 +80107dd1: 68 e2 00 00 00 push $0xe2 + jmp alltraps +80107dd6: e9 f6 f1 ff ff jmp 80106fd1 + +80107ddb : +.globl vector227 +vector227: + pushl $0 +80107ddb: 6a 00 push $0x0 + pushl $227 +80107ddd: 68 e3 00 00 00 push $0xe3 + jmp alltraps +80107de2: e9 ea f1 ff ff jmp 80106fd1 + +80107de7 : +.globl vector228 +vector228: + pushl $0 +80107de7: 6a 00 push $0x0 + pushl $228 +80107de9: 68 e4 00 00 00 push $0xe4 + jmp alltraps +80107dee: e9 de f1 ff ff jmp 80106fd1 + +80107df3 : +.globl vector229 +vector229: + pushl $0 +80107df3: 6a 00 push $0x0 + pushl $229 +80107df5: 68 e5 00 00 00 push $0xe5 + jmp alltraps +80107dfa: e9 d2 f1 ff ff jmp 80106fd1 + +80107dff : +.globl vector230 +vector230: + pushl $0 +80107dff: 6a 00 push $0x0 + pushl $230 +80107e01: 68 e6 00 00 00 push $0xe6 + jmp alltraps +80107e06: e9 c6 f1 ff ff jmp 80106fd1 + +80107e0b : +.globl vector231 +vector231: + pushl $0 +80107e0b: 6a 00 push $0x0 + pushl $231 +80107e0d: 68 e7 00 00 00 push $0xe7 + jmp alltraps +80107e12: e9 ba f1 ff ff jmp 80106fd1 + +80107e17 : +.globl vector232 +vector232: + pushl $0 +80107e17: 6a 00 push $0x0 + pushl $232 +80107e19: 68 e8 00 00 00 push $0xe8 + jmp alltraps +80107e1e: e9 ae f1 ff ff jmp 80106fd1 + +80107e23 : +.globl vector233 +vector233: + pushl $0 +80107e23: 6a 00 push $0x0 + pushl $233 +80107e25: 68 e9 00 00 00 push $0xe9 + jmp alltraps +80107e2a: e9 a2 f1 ff ff jmp 80106fd1 + +80107e2f : +.globl vector234 +vector234: + pushl $0 +80107e2f: 6a 00 push $0x0 + pushl $234 +80107e31: 68 ea 00 00 00 push $0xea + jmp alltraps +80107e36: e9 96 f1 ff ff jmp 80106fd1 + +80107e3b : +.globl vector235 +vector235: + pushl $0 +80107e3b: 6a 00 push $0x0 + pushl $235 +80107e3d: 68 eb 00 00 00 push $0xeb + jmp alltraps +80107e42: e9 8a f1 ff ff jmp 80106fd1 + +80107e47 : +.globl vector236 +vector236: + pushl $0 +80107e47: 6a 00 push $0x0 + pushl $236 +80107e49: 68 ec 00 00 00 push $0xec + jmp alltraps +80107e4e: e9 7e f1 ff ff jmp 80106fd1 + +80107e53 : +.globl vector237 +vector237: + pushl $0 +80107e53: 6a 00 push $0x0 + pushl $237 +80107e55: 68 ed 00 00 00 push $0xed + jmp alltraps +80107e5a: e9 72 f1 ff ff jmp 80106fd1 + +80107e5f : +.globl vector238 +vector238: + pushl $0 +80107e5f: 6a 00 push $0x0 + pushl $238 +80107e61: 68 ee 00 00 00 push $0xee + jmp alltraps +80107e66: e9 66 f1 ff ff jmp 80106fd1 + +80107e6b : +.globl vector239 +vector239: + pushl $0 +80107e6b: 6a 00 push $0x0 + pushl $239 +80107e6d: 68 ef 00 00 00 push $0xef + jmp alltraps +80107e72: e9 5a f1 ff ff jmp 80106fd1 + +80107e77 : +.globl vector240 +vector240: + pushl $0 +80107e77: 6a 00 push $0x0 + pushl $240 +80107e79: 68 f0 00 00 00 push $0xf0 + jmp alltraps +80107e7e: e9 4e f1 ff ff jmp 80106fd1 + +80107e83 : +.globl vector241 +vector241: + pushl $0 +80107e83: 6a 00 push $0x0 + pushl $241 +80107e85: 68 f1 00 00 00 push $0xf1 + jmp alltraps +80107e8a: e9 42 f1 ff ff jmp 80106fd1 + +80107e8f : +.globl vector242 +vector242: + pushl $0 +80107e8f: 6a 00 push $0x0 + pushl $242 +80107e91: 68 f2 00 00 00 push $0xf2 + jmp alltraps +80107e96: e9 36 f1 ff ff jmp 80106fd1 + +80107e9b : +.globl vector243 +vector243: + pushl $0 +80107e9b: 6a 00 push $0x0 + pushl $243 +80107e9d: 68 f3 00 00 00 push $0xf3 + jmp alltraps +80107ea2: e9 2a f1 ff ff jmp 80106fd1 + +80107ea7 : +.globl vector244 +vector244: + pushl $0 +80107ea7: 6a 00 push $0x0 + pushl $244 +80107ea9: 68 f4 00 00 00 push $0xf4 + jmp alltraps +80107eae: e9 1e f1 ff ff jmp 80106fd1 + +80107eb3 : +.globl vector245 +vector245: + pushl $0 +80107eb3: 6a 00 push $0x0 + pushl $245 +80107eb5: 68 f5 00 00 00 push $0xf5 + jmp alltraps +80107eba: e9 12 f1 ff ff jmp 80106fd1 + +80107ebf : +.globl vector246 +vector246: + pushl $0 +80107ebf: 6a 00 push $0x0 + pushl $246 +80107ec1: 68 f6 00 00 00 push $0xf6 + jmp alltraps +80107ec6: e9 06 f1 ff ff jmp 80106fd1 + +80107ecb : +.globl vector247 +vector247: + pushl $0 +80107ecb: 6a 00 push $0x0 + pushl $247 +80107ecd: 68 f7 00 00 00 push $0xf7 + jmp alltraps +80107ed2: e9 fa f0 ff ff jmp 80106fd1 + +80107ed7 : +.globl vector248 +vector248: + pushl $0 +80107ed7: 6a 00 push $0x0 + pushl $248 +80107ed9: 68 f8 00 00 00 push $0xf8 + jmp alltraps +80107ede: e9 ee f0 ff ff jmp 80106fd1 + +80107ee3 : +.globl vector249 +vector249: + pushl $0 +80107ee3: 6a 00 push $0x0 + pushl $249 +80107ee5: 68 f9 00 00 00 push $0xf9 + jmp alltraps +80107eea: e9 e2 f0 ff ff jmp 80106fd1 + +80107eef : +.globl vector250 +vector250: + pushl $0 +80107eef: 6a 00 push $0x0 + pushl $250 +80107ef1: 68 fa 00 00 00 push $0xfa + jmp alltraps +80107ef6: e9 d6 f0 ff ff jmp 80106fd1 + +80107efb : +.globl vector251 +vector251: + pushl $0 +80107efb: 6a 00 push $0x0 + pushl $251 +80107efd: 68 fb 00 00 00 push $0xfb + jmp alltraps +80107f02: e9 ca f0 ff ff jmp 80106fd1 + +80107f07 : +.globl vector252 +vector252: + pushl $0 +80107f07: 6a 00 push $0x0 + pushl $252 +80107f09: 68 fc 00 00 00 push $0xfc + jmp alltraps +80107f0e: e9 be f0 ff ff jmp 80106fd1 + +80107f13 : +.globl vector253 +vector253: + pushl $0 +80107f13: 6a 00 push $0x0 + pushl $253 +80107f15: 68 fd 00 00 00 push $0xfd + jmp alltraps +80107f1a: e9 b2 f0 ff ff jmp 80106fd1 + +80107f1f : +.globl vector254 +vector254: + pushl $0 +80107f1f: 6a 00 push $0x0 + pushl $254 +80107f21: 68 fe 00 00 00 push $0xfe + jmp alltraps +80107f26: e9 a6 f0 ff ff jmp 80106fd1 + +80107f2b : +.globl vector255 +vector255: + pushl $0 +80107f2b: 6a 00 push $0x0 + pushl $255 +80107f2d: 68 ff 00 00 00 push $0xff + jmp alltraps +80107f32: e9 9a f0 ff ff jmp 80106fd1 +80107f37: 66 90 xchg %ax,%ax +80107f39: 66 90 xchg %ax,%ax +80107f3b: 66 90 xchg %ax,%ax +80107f3d: 66 90 xchg %ax,%ax +80107f3f: 90 nop + +80107f40 : + +// Deallocate user pages to bring the process size from oldsz to +// newsz. oldsz and newsz need not be page-aligned, nor does newsz +// need to be less than oldsz. oldsz can be larger than the actual +// process size. Returns the new process size. +int deallocuvm(pde_t *pgdir, uint oldsz, uint newsz) { +80107f40: 55 push %ebp +80107f41: 89 e5 mov %esp,%ebp +80107f43: 57 push %edi +80107f44: 56 push %esi +80107f45: 53 push %ebx + + if (newsz >= oldsz) { + return oldsz; + } + + a = PGROUNDUP(newsz); +80107f46: 8d 99 ff 0f 00 00 lea 0xfff(%ecx),%ebx +80107f4c: 81 e3 00 f0 ff ff and $0xfffff000,%ebx +int deallocuvm(pde_t *pgdir, uint oldsz, uint newsz) { +80107f52: 83 ec 1c sub $0x1c,%esp +80107f55: 89 4d e0 mov %ecx,-0x20(%ebp) + for (; a < oldsz; a += PGSIZE) { +80107f58: 39 d3 cmp %edx,%ebx +80107f5a: 73 49 jae 80107fa5 +80107f5c: 89 c7 mov %eax,%edi +80107f5e: eb 0c jmp 80107f6c + pte = walkpgdir(pgdir, (char*)a, 0); + if (!pte) { + a = PGADDR(PDX(a) + 1, 0, 0) - PGSIZE; +80107f60: 83 c0 01 add $0x1,%eax +80107f63: c1 e0 16 shl $0x16,%eax +80107f66: 89 c3 mov %eax,%ebx + for (; a < oldsz; a += PGSIZE) { +80107f68: 39 da cmp %ebx,%edx +80107f6a: 76 39 jbe 80107fa5 + pde = &pgdir[PDX(va)]; +80107f6c: 89 d8 mov %ebx,%eax +80107f6e: c1 e8 16 shr $0x16,%eax + if (*pde & PTE_P) { +80107f71: 8b 0c 87 mov (%edi,%eax,4),%ecx +80107f74: f6 c1 01 test $0x1,%cl +80107f77: 74 e7 je 80107f60 + return &pgtab[PTX(va)]; +80107f79: 89 de mov %ebx,%esi + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +80107f7b: 81 e1 00 f0 ff ff and $0xfffff000,%ecx + return &pgtab[PTX(va)]; +80107f81: c1 ee 0a shr $0xa,%esi +80107f84: 81 e6 fc 0f 00 00 and $0xffc,%esi +80107f8a: 8d b4 31 00 00 00 80 lea -0x80000000(%ecx,%esi,1),%esi + if (!pte) { +80107f91: 85 f6 test %esi,%esi +80107f93: 74 cb je 80107f60 + } + else if ((*pte & PTE_P) != 0) { +80107f95: 8b 06 mov (%esi),%eax +80107f97: a8 01 test $0x1,%al +80107f99: 75 15 jne 80107fb0 + for (; a < oldsz; a += PGSIZE) { +80107f9b: 81 c3 00 10 00 00 add $0x1000,%ebx +80107fa1: 39 da cmp %ebx,%edx +80107fa3: 77 c7 ja 80107f6c + kfree(v); + *pte = 0; + } + } + return newsz; +} +80107fa5: 8b 45 e0 mov -0x20(%ebp),%eax +80107fa8: 8d 65 f4 lea -0xc(%ebp),%esp +80107fab: 5b pop %ebx +80107fac: 5e pop %esi +80107fad: 5f pop %edi +80107fae: 5d pop %ebp +80107faf: c3 ret + if (pa == 0) { +80107fb0: 25 00 f0 ff ff and $0xfffff000,%eax +80107fb5: 74 25 je 80107fdc + kfree(v); +80107fb7: 83 ec 0c sub $0xc,%esp + char *v = P2V(pa); +80107fba: 05 00 00 00 80 add $0x80000000,%eax +80107fbf: 89 55 e4 mov %edx,-0x1c(%ebp) + for (; a < oldsz; a += PGSIZE) { +80107fc2: 81 c3 00 10 00 00 add $0x1000,%ebx + kfree(v); +80107fc8: 50 push %eax +80107fc9: e8 e2 b9 ff ff call 801039b0 + *pte = 0; +80107fce: c7 06 00 00 00 00 movl $0x0,(%esi) + for (; a < oldsz; a += PGSIZE) { +80107fd4: 8b 55 e4 mov -0x1c(%ebp),%edx +80107fd7: 83 c4 10 add $0x10,%esp +80107fda: eb 8c jmp 80107f68 + panic("kfree"); +80107fdc: 83 ec 0c sub $0xc,%esp +80107fdf: 68 86 8c 10 80 push $0x80108c86 +80107fe4: e8 97 84 ff ff call 80100480 +80107fe9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80107ff0 : +static int mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm) { +80107ff0: 55 push %ebp +80107ff1: 89 e5 mov %esp,%ebp +80107ff3: 57 push %edi +80107ff4: 56 push %esi +80107ff5: 53 push %ebx + a = (char*)PGROUNDDOWN((uint)va); +80107ff6: 89 d3 mov %edx,%ebx +80107ff8: 81 e3 00 f0 ff ff and $0xfffff000,%ebx +static int mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm) { +80107ffe: 83 ec 1c sub $0x1c,%esp +80108001: 89 45 e4 mov %eax,-0x1c(%ebp) + last = (char*)PGROUNDDOWN(((uint)va) + size - 1); +80108004: 8d 44 0a ff lea -0x1(%edx,%ecx,1),%eax +80108008: 25 00 f0 ff ff and $0xfffff000,%eax +8010800d: 89 45 dc mov %eax,-0x24(%ebp) +80108010: 8b 45 08 mov 0x8(%ebp),%eax +80108013: 29 d8 sub %ebx,%eax +80108015: 89 45 e0 mov %eax,-0x20(%ebp) +80108018: eb 3d jmp 80108057 +8010801a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return &pgtab[PTX(va)]; +80108020: 89 da mov %ebx,%edx + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +80108022: 25 00 f0 ff ff and $0xfffff000,%eax + return &pgtab[PTX(va)]; +80108027: c1 ea 0a shr $0xa,%edx +8010802a: 81 e2 fc 0f 00 00 and $0xffc,%edx +80108030: 8d 84 10 00 00 00 80 lea -0x80000000(%eax,%edx,1),%eax + if ((pte = walkpgdir(pgdir, a, 1)) == 0) { +80108037: 85 c0 test %eax,%eax +80108039: 74 75 je 801080b0 + if (*pte & PTE_P) { +8010803b: f6 00 01 testb $0x1,(%eax) +8010803e: 0f 85 86 00 00 00 jne 801080ca + *pte = pa | perm | PTE_P; +80108044: 0b 75 0c or 0xc(%ebp),%esi +80108047: 83 ce 01 or $0x1,%esi +8010804a: 89 30 mov %esi,(%eax) + if (a == last) { +8010804c: 3b 5d dc cmp -0x24(%ebp),%ebx +8010804f: 74 6f je 801080c0 + a += PGSIZE; +80108051: 81 c3 00 10 00 00 add $0x1000,%ebx + for (;;) { +80108057: 8b 45 e0 mov -0x20(%ebp),%eax + pde = &pgdir[PDX(va)]; +8010805a: 8b 4d e4 mov -0x1c(%ebp),%ecx +8010805d: 8d 34 18 lea (%eax,%ebx,1),%esi +80108060: 89 d8 mov %ebx,%eax +80108062: c1 e8 16 shr $0x16,%eax +80108065: 8d 3c 81 lea (%ecx,%eax,4),%edi + if (*pde & PTE_P) { +80108068: 8b 07 mov (%edi),%eax +8010806a: a8 01 test $0x1,%al +8010806c: 75 b2 jne 80108020 + if (!alloc || (pgtab = (pte_t*)kalloc()) == 0) { +8010806e: e8 fd ba ff ff call 80103b70 +80108073: 85 c0 test %eax,%eax +80108075: 74 39 je 801080b0 + memset(pgtab, 0, PGSIZE); +80108077: 83 ec 04 sub $0x4,%esp +8010807a: 89 45 d8 mov %eax,-0x28(%ebp) +8010807d: 68 00 10 00 00 push $0x1000 +80108082: 6a 00 push $0x0 +80108084: 50 push %eax +80108085: e8 b6 db ff ff call 80105c40 + *pde = V2P(pgtab) | PTE_P | PTE_W | PTE_U; +8010808a: 8b 55 d8 mov -0x28(%ebp),%edx + return &pgtab[PTX(va)]; +8010808d: 83 c4 10 add $0x10,%esp + *pde = V2P(pgtab) | PTE_P | PTE_W | PTE_U; +80108090: 8d 82 00 00 00 80 lea -0x80000000(%edx),%eax +80108096: 83 c8 07 or $0x7,%eax +80108099: 89 07 mov %eax,(%edi) + return &pgtab[PTX(va)]; +8010809b: 89 d8 mov %ebx,%eax +8010809d: c1 e8 0a shr $0xa,%eax +801080a0: 25 fc 0f 00 00 and $0xffc,%eax +801080a5: 01 d0 add %edx,%eax +801080a7: eb 92 jmp 8010803b +801080a9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +} +801080b0: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +801080b3: b8 ff ff ff ff mov $0xffffffff,%eax +} +801080b8: 5b pop %ebx +801080b9: 5e pop %esi +801080ba: 5f pop %edi +801080bb: 5d pop %ebp +801080bc: c3 ret +801080bd: 8d 76 00 lea 0x0(%esi),%esi +801080c0: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +801080c3: 31 c0 xor %eax,%eax +} +801080c5: 5b pop %ebx +801080c6: 5e pop %esi +801080c7: 5f pop %edi +801080c8: 5d pop %ebp +801080c9: c3 ret + panic("remap"); +801080ca: 83 ec 0c sub $0xc,%esp +801080cd: 68 04 94 10 80 push $0x80109404 +801080d2: e8 a9 83 ff ff call 80100480 +801080d7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801080de: 66 90 xchg %ax,%ax + +801080e0 : +void seginit(void) { +801080e0: 55 push %ebp +801080e1: 89 e5 mov %esp,%ebp +801080e3: 83 ec 18 sub $0x18,%esp + c = &cpus[cpuid()]; +801080e6: e8 a5 cd ff ff call 80104e90 + pd[0] = size - 1; +801080eb: ba 2f 00 00 00 mov $0x2f,%edx +801080f0: 69 c0 b0 00 00 00 imul $0xb0,%eax,%eax +801080f6: 66 89 55 f2 mov %dx,-0xe(%ebp) + c->gdt[SEG_KCODE] = SEG(STA_X | STA_R, 0, 0xffffffff, 0); +801080fa: c7 80 98 df 11 80 ff movl $0xffff,-0x7fee2068(%eax) +80108101: ff 00 00 +80108104: c7 80 9c df 11 80 00 movl $0xcf9a00,-0x7fee2064(%eax) +8010810b: 9a cf 00 + c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); +8010810e: c7 80 a0 df 11 80 ff movl $0xffff,-0x7fee2060(%eax) +80108115: ff 00 00 +80108118: c7 80 a4 df 11 80 00 movl $0xcf9200,-0x7fee205c(%eax) +8010811f: 92 cf 00 + c->gdt[SEG_UCODE] = SEG(STA_X | STA_R, 0, 0xffffffff, DPL_USER); +80108122: c7 80 a8 df 11 80 ff movl $0xffff,-0x7fee2058(%eax) +80108129: ff 00 00 +8010812c: c7 80 ac df 11 80 00 movl $0xcffa00,-0x7fee2054(%eax) +80108133: fa cf 00 + c->gdt[SEG_UDATA] = SEG(STA_W, 0, 0xffffffff, DPL_USER); +80108136: c7 80 b0 df 11 80 ff movl $0xffff,-0x7fee2050(%eax) +8010813d: ff 00 00 +80108140: c7 80 b4 df 11 80 00 movl $0xcff200,-0x7fee204c(%eax) +80108147: f2 cf 00 + lgdt(c->gdt, sizeof(c->gdt)); +8010814a: 05 90 df 11 80 add $0x8011df90,%eax + pd[1] = (uint)p; +8010814f: 66 89 45 f4 mov %ax,-0xc(%ebp) + pd[2] = (uint)p >> 16; +80108153: c1 e8 10 shr $0x10,%eax +80108156: 66 89 45 f6 mov %ax,-0xa(%ebp) + asm volatile ("lgdt (%0)" : : "r" (pd)); +8010815a: 8d 45 f2 lea -0xe(%ebp),%eax +8010815d: 0f 01 10 lgdtl (%eax) +} +80108160: c9 leave +80108161: c3 ret +80108162: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +80108169: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80108170 : + lcr3(V2P(kpgdir)); // switch to the kernel page table +80108170: a1 44 12 12 80 mov 0x80121244,%eax +80108175: 05 00 00 00 80 add $0x80000000,%eax + return val; +} + +static inline void lcr3(uint val) { + asm volatile ("movl %0,%%cr3" : : "r" (val)); +8010817a: 0f 22 d8 mov %eax,%cr3 +} +8010817d: c3 ret +8010817e: 66 90 xchg %ax,%ax + +80108180 : +void switchuvm(struct proc *p) { +80108180: 55 push %ebp +80108181: 89 e5 mov %esp,%ebp +80108183: 57 push %edi +80108184: 56 push %esi +80108185: 53 push %ebx +80108186: 83 ec 1c sub $0x1c,%esp +80108189: 8b 75 08 mov 0x8(%ebp),%esi + if (p == 0) { +8010818c: 85 f6 test %esi,%esi +8010818e: 0f 84 cb 00 00 00 je 8010825f + if (p->kstack == 0) { +80108194: 8b 46 08 mov 0x8(%esi),%eax +80108197: 85 c0 test %eax,%eax +80108199: 0f 84 da 00 00 00 je 80108279 + if (p->pgdir == 0) { +8010819f: 8b 46 04 mov 0x4(%esi),%eax +801081a2: 85 c0 test %eax,%eax +801081a4: 0f 84 c2 00 00 00 je 8010826c + pushcli(); +801081aa: e8 81 d8 ff ff call 80105a30 + mycpu()->gdt[SEG_TSS] = SEG16(STS_T32A, &mycpu()->ts, +801081af: e8 7c cc ff ff call 80104e30 +801081b4: 89 c3 mov %eax,%ebx +801081b6: e8 75 cc ff ff call 80104e30 +801081bb: 89 c7 mov %eax,%edi +801081bd: e8 6e cc ff ff call 80104e30 +801081c2: 83 c7 08 add $0x8,%edi +801081c5: 89 45 e4 mov %eax,-0x1c(%ebp) +801081c8: e8 63 cc ff ff call 80104e30 +801081cd: 8b 4d e4 mov -0x1c(%ebp),%ecx +801081d0: ba 67 00 00 00 mov $0x67,%edx +801081d5: 66 89 bb 9a 00 00 00 mov %di,0x9a(%ebx) +801081dc: 83 c0 08 add $0x8,%eax +801081df: 66 89 93 98 00 00 00 mov %dx,0x98(%ebx) + mycpu()->ts.iomb = (ushort) 0xFFFF; +801081e6: bf ff ff ff ff mov $0xffffffff,%edi + mycpu()->gdt[SEG_TSS] = SEG16(STS_T32A, &mycpu()->ts, +801081eb: 83 c1 08 add $0x8,%ecx +801081ee: c1 e8 18 shr $0x18,%eax +801081f1: c1 e9 10 shr $0x10,%ecx +801081f4: 88 83 9f 00 00 00 mov %al,0x9f(%ebx) +801081fa: 88 8b 9c 00 00 00 mov %cl,0x9c(%ebx) +80108200: b9 99 40 00 00 mov $0x4099,%ecx +80108205: 66 89 8b 9d 00 00 00 mov %cx,0x9d(%ebx) + mycpu()->ts.ss0 = SEG_KDATA << 3; +8010820c: bb 10 00 00 00 mov $0x10,%ebx + mycpu()->gdt[SEG_TSS].s = 0; +80108211: e8 1a cc ff ff call 80104e30 +80108216: 80 a0 9d 00 00 00 ef andb $0xef,0x9d(%eax) + mycpu()->ts.ss0 = SEG_KDATA << 3; +8010821d: e8 0e cc ff ff call 80104e30 +80108222: 66 89 58 10 mov %bx,0x10(%eax) + mycpu()->ts.esp0 = (uint)p->kstack + KSTACKSIZE; +80108226: 8b 5e 08 mov 0x8(%esi),%ebx +80108229: 81 c3 00 10 00 00 add $0x1000,%ebx +8010822f: e8 fc cb ff ff call 80104e30 +80108234: 89 58 0c mov %ebx,0xc(%eax) + mycpu()->ts.iomb = (ushort) 0xFFFF; +80108237: e8 f4 cb ff ff call 80104e30 +8010823c: 66 89 78 6e mov %di,0x6e(%eax) + asm volatile ("ltr %0" : : "r" (sel)); +80108240: b8 28 00 00 00 mov $0x28,%eax +80108245: 0f 00 d8 ltr %ax + lcr3(V2P(p->pgdir)); // switch to process's address space +80108248: 8b 46 04 mov 0x4(%esi),%eax +8010824b: 05 00 00 00 80 add $0x80000000,%eax + asm volatile ("movl %0,%%cr3" : : "r" (val)); +80108250: 0f 22 d8 mov %eax,%cr3 +} +80108253: 8d 65 f4 lea -0xc(%ebp),%esp +80108256: 5b pop %ebx +80108257: 5e pop %esi +80108258: 5f pop %edi +80108259: 5d pop %ebp + popcli(); +8010825a: e9 21 d8 ff ff jmp 80105a80 + panic("switchuvm: no process"); +8010825f: 83 ec 0c sub $0xc,%esp +80108262: 68 0a 94 10 80 push $0x8010940a +80108267: e8 14 82 ff ff call 80100480 + panic("switchuvm: no pgdir"); +8010826c: 83 ec 0c sub $0xc,%esp +8010826f: 68 35 94 10 80 push $0x80109435 +80108274: e8 07 82 ff ff call 80100480 + panic("switchuvm: no kstack"); +80108279: 83 ec 0c sub $0xc,%esp +8010827c: 68 20 94 10 80 push $0x80109420 +80108281: e8 fa 81 ff ff call 80100480 +80108286: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010828d: 8d 76 00 lea 0x0(%esi),%esi + +80108290 : +void inituvm(pde_t *pgdir, char *init, uint sz) { +80108290: 55 push %ebp +80108291: 89 e5 mov %esp,%ebp +80108293: 57 push %edi +80108294: 56 push %esi +80108295: 53 push %ebx +80108296: 83 ec 1c sub $0x1c,%esp +80108299: 8b 45 0c mov 0xc(%ebp),%eax +8010829c: 8b 75 10 mov 0x10(%ebp),%esi +8010829f: 8b 7d 08 mov 0x8(%ebp),%edi +801082a2: 89 45 e4 mov %eax,-0x1c(%ebp) + if (sz >= PGSIZE) { +801082a5: 81 fe ff 0f 00 00 cmp $0xfff,%esi +801082ab: 77 4b ja 801082f8 + mem = kalloc(); +801082ad: e8 be b8 ff ff call 80103b70 + memset(mem, 0, PGSIZE); +801082b2: 83 ec 04 sub $0x4,%esp +801082b5: 68 00 10 00 00 push $0x1000 + mem = kalloc(); +801082ba: 89 c3 mov %eax,%ebx + memset(mem, 0, PGSIZE); +801082bc: 6a 00 push $0x0 +801082be: 50 push %eax +801082bf: e8 7c d9 ff ff call 80105c40 + mappages(pgdir, 0, PGSIZE, V2P(mem), PTE_W | PTE_U); +801082c4: 58 pop %eax +801082c5: 8d 83 00 00 00 80 lea -0x80000000(%ebx),%eax +801082cb: 5a pop %edx +801082cc: 6a 06 push $0x6 +801082ce: b9 00 10 00 00 mov $0x1000,%ecx +801082d3: 31 d2 xor %edx,%edx +801082d5: 50 push %eax +801082d6: 89 f8 mov %edi,%eax +801082d8: e8 13 fd ff ff call 80107ff0 + memmove(mem, init, sz); +801082dd: 8b 45 e4 mov -0x1c(%ebp),%eax +801082e0: 89 75 10 mov %esi,0x10(%ebp) +801082e3: 83 c4 10 add $0x10,%esp +801082e6: 89 5d 08 mov %ebx,0x8(%ebp) +801082e9: 89 45 0c mov %eax,0xc(%ebp) +} +801082ec: 8d 65 f4 lea -0xc(%ebp),%esp +801082ef: 5b pop %ebx +801082f0: 5e pop %esi +801082f1: 5f pop %edi +801082f2: 5d pop %ebp + memmove(mem, init, sz); +801082f3: e9 e8 d9 ff ff jmp 80105ce0 + panic("inituvm: more than a page"); +801082f8: 83 ec 0c sub $0xc,%esp +801082fb: 68 49 94 10 80 push $0x80109449 +80108300: e8 7b 81 ff ff call 80100480 +80108305: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010830c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +80108310 : +int loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) { +80108310: 55 push %ebp +80108311: 89 e5 mov %esp,%ebp +80108313: 57 push %edi +80108314: 56 push %esi +80108315: 53 push %ebx +80108316: 83 ec 1c sub $0x1c,%esp +80108319: 8b 45 0c mov 0xc(%ebp),%eax +8010831c: 8b 75 18 mov 0x18(%ebp),%esi + if ((uint) addr % PGSIZE != 0) { +8010831f: a9 ff 0f 00 00 test $0xfff,%eax +80108324: 0f 85 bb 00 00 00 jne 801083e5 + for (i = 0; i < sz; i += PGSIZE) { +8010832a: 01 f0 add %esi,%eax +8010832c: 89 f3 mov %esi,%ebx +8010832e: 89 45 e4 mov %eax,-0x1c(%ebp) + if (readi(ip, P2V(pa), offset + i, n) != n) { +80108331: 8b 45 14 mov 0x14(%ebp),%eax +80108334: 01 f0 add %esi,%eax +80108336: 89 45 e0 mov %eax,-0x20(%ebp) + for (i = 0; i < sz; i += PGSIZE) { +80108339: 85 f6 test %esi,%esi +8010833b: 0f 84 87 00 00 00 je 801083c8 +80108341: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + pde = &pgdir[PDX(va)]; +80108348: 8b 45 e4 mov -0x1c(%ebp),%eax + if (*pde & PTE_P) { +8010834b: 8b 4d 08 mov 0x8(%ebp),%ecx +8010834e: 29 d8 sub %ebx,%eax + pde = &pgdir[PDX(va)]; +80108350: 89 c2 mov %eax,%edx +80108352: c1 ea 16 shr $0x16,%edx + if (*pde & PTE_P) { +80108355: 8b 14 91 mov (%ecx,%edx,4),%edx +80108358: f6 c2 01 test $0x1,%dl +8010835b: 75 13 jne 80108370 + panic("loaduvm: address should exist"); +8010835d: 83 ec 0c sub $0xc,%esp +80108360: 68 63 94 10 80 push $0x80109463 +80108365: e8 16 81 ff ff call 80100480 +8010836a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return &pgtab[PTX(va)]; +80108370: c1 e8 0a shr $0xa,%eax + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +80108373: 81 e2 00 f0 ff ff and $0xfffff000,%edx + return &pgtab[PTX(va)]; +80108379: 25 fc 0f 00 00 and $0xffc,%eax +8010837e: 8d 84 02 00 00 00 80 lea -0x80000000(%edx,%eax,1),%eax + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { +80108385: 85 c0 test %eax,%eax +80108387: 74 d4 je 8010835d + pa = PTE_ADDR(*pte); +80108389: 8b 00 mov (%eax),%eax + if (readi(ip, P2V(pa), offset + i, n) != n) { +8010838b: 8b 4d e0 mov -0x20(%ebp),%ecx + if (sz - i < PGSIZE) { +8010838e: bf 00 10 00 00 mov $0x1000,%edi + pa = PTE_ADDR(*pte); +80108393: 25 00 f0 ff ff and $0xfffff000,%eax + if (sz - i < PGSIZE) { +80108398: 81 fb ff 0f 00 00 cmp $0xfff,%ebx +8010839e: 0f 46 fb cmovbe %ebx,%edi + if (readi(ip, P2V(pa), offset + i, n) != n) { +801083a1: 29 d9 sub %ebx,%ecx +801083a3: 05 00 00 00 80 add $0x80000000,%eax +801083a8: 57 push %edi +801083a9: 51 push %ecx +801083aa: 50 push %eax +801083ab: ff 75 10 push 0x10(%ebp) +801083ae: e8 cd ab ff ff call 80102f80 +801083b3: 83 c4 10 add $0x10,%esp +801083b6: 39 f8 cmp %edi,%eax +801083b8: 75 1e jne 801083d8 + for (i = 0; i < sz; i += PGSIZE) { +801083ba: 81 eb 00 10 00 00 sub $0x1000,%ebx +801083c0: 89 f0 mov %esi,%eax +801083c2: 29 d8 sub %ebx,%eax +801083c4: 39 c6 cmp %eax,%esi +801083c6: 77 80 ja 80108348 +} +801083c8: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +801083cb: 31 c0 xor %eax,%eax +} +801083cd: 5b pop %ebx +801083ce: 5e pop %esi +801083cf: 5f pop %edi +801083d0: 5d pop %ebp +801083d1: c3 ret +801083d2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi +801083d8: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +801083db: b8 ff ff ff ff mov $0xffffffff,%eax +} +801083e0: 5b pop %ebx +801083e1: 5e pop %esi +801083e2: 5f pop %edi +801083e3: 5d pop %ebp +801083e4: c3 ret + panic("loaduvm: addr must be page aligned"); +801083e5: 83 ec 0c sub $0xc,%esp +801083e8: 68 04 95 10 80 push $0x80109504 +801083ed: e8 8e 80 ff ff call 80100480 +801083f2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801083f9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +80108400 : +int allocuvm(pde_t *pgdir, uint oldsz, uint newsz) { +80108400: 55 push %ebp +80108401: 89 e5 mov %esp,%ebp +80108403: 57 push %edi +80108404: 56 push %esi +80108405: 53 push %ebx +80108406: 83 ec 1c sub $0x1c,%esp + if (newsz >= KERNBASE) { +80108409: 8b 45 10 mov 0x10(%ebp),%eax +int allocuvm(pde_t *pgdir, uint oldsz, uint newsz) { +8010840c: 8b 7d 08 mov 0x8(%ebp),%edi + if (newsz >= KERNBASE) { +8010840f: 89 45 e4 mov %eax,-0x1c(%ebp) +80108412: 85 c0 test %eax,%eax +80108414: 0f 88 b6 00 00 00 js 801084d0 + if (newsz < oldsz) { +8010841a: 3b 45 0c cmp 0xc(%ebp),%eax + return oldsz; +8010841d: 8b 45 0c mov 0xc(%ebp),%eax + if (newsz < oldsz) { +80108420: 0f 82 9a 00 00 00 jb 801084c0 + a = PGROUNDUP(oldsz); +80108426: 8d b0 ff 0f 00 00 lea 0xfff(%eax),%esi +8010842c: 81 e6 00 f0 ff ff and $0xfffff000,%esi + for (; a < newsz; a += PGSIZE) { +80108432: 39 75 10 cmp %esi,0x10(%ebp) +80108435: 77 44 ja 8010847b +80108437: e9 87 00 00 00 jmp 801084c3 +8010843c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + memset(mem, 0, PGSIZE); +80108440: 83 ec 04 sub $0x4,%esp +80108443: 68 00 10 00 00 push $0x1000 +80108448: 6a 00 push $0x0 +8010844a: 50 push %eax +8010844b: e8 f0 d7 ff ff call 80105c40 + if (mappages(pgdir, (char*)a, PGSIZE, V2P(mem), PTE_W | PTE_U) < 0) { +80108450: 58 pop %eax +80108451: 8d 83 00 00 00 80 lea -0x80000000(%ebx),%eax +80108457: 5a pop %edx +80108458: 6a 06 push $0x6 +8010845a: b9 00 10 00 00 mov $0x1000,%ecx +8010845f: 89 f2 mov %esi,%edx +80108461: 50 push %eax +80108462: 89 f8 mov %edi,%eax +80108464: e8 87 fb ff ff call 80107ff0 +80108469: 83 c4 10 add $0x10,%esp +8010846c: 85 c0 test %eax,%eax +8010846e: 78 78 js 801084e8 + for (; a < newsz; a += PGSIZE) { +80108470: 81 c6 00 10 00 00 add $0x1000,%esi +80108476: 39 75 10 cmp %esi,0x10(%ebp) +80108479: 76 48 jbe 801084c3 + mem = kalloc(); +8010847b: e8 f0 b6 ff ff call 80103b70 +80108480: 89 c3 mov %eax,%ebx + if (mem == 0) { +80108482: 85 c0 test %eax,%eax +80108484: 75 ba jne 80108440 + cprintf("allocuvm out of memory\n"); +80108486: 83 ec 0c sub $0xc,%esp +80108489: 68 81 94 10 80 push $0x80109481 +8010848e: e8 fd 83 ff ff call 80100890 + if (newsz >= oldsz) { +80108493: 8b 45 0c mov 0xc(%ebp),%eax +80108496: 83 c4 10 add $0x10,%esp +80108499: 39 45 10 cmp %eax,0x10(%ebp) +8010849c: 74 32 je 801084d0 +8010849e: 8b 55 10 mov 0x10(%ebp),%edx +801084a1: 89 c1 mov %eax,%ecx +801084a3: 89 f8 mov %edi,%eax +801084a5: e8 96 fa ff ff call 80107f40 + return 0; +801084aa: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +} +801084b1: 8b 45 e4 mov -0x1c(%ebp),%eax +801084b4: 8d 65 f4 lea -0xc(%ebp),%esp +801084b7: 5b pop %ebx +801084b8: 5e pop %esi +801084b9: 5f pop %edi +801084ba: 5d pop %ebp +801084bb: c3 ret +801084bc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + return oldsz; +801084c0: 89 45 e4 mov %eax,-0x1c(%ebp) +} +801084c3: 8b 45 e4 mov -0x1c(%ebp),%eax +801084c6: 8d 65 f4 lea -0xc(%ebp),%esp +801084c9: 5b pop %ebx +801084ca: 5e pop %esi +801084cb: 5f pop %edi +801084cc: 5d pop %ebp +801084cd: c3 ret +801084ce: 66 90 xchg %ax,%ax + return 0; +801084d0: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +} +801084d7: 8b 45 e4 mov -0x1c(%ebp),%eax +801084da: 8d 65 f4 lea -0xc(%ebp),%esp +801084dd: 5b pop %ebx +801084de: 5e pop %esi +801084df: 5f pop %edi +801084e0: 5d pop %ebp +801084e1: c3 ret +801084e2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + cprintf("allocuvm out of memory (2)\n"); +801084e8: 83 ec 0c sub $0xc,%esp +801084eb: 68 99 94 10 80 push $0x80109499 +801084f0: e8 9b 83 ff ff call 80100890 + if (newsz >= oldsz) { +801084f5: 8b 45 0c mov 0xc(%ebp),%eax +801084f8: 83 c4 10 add $0x10,%esp +801084fb: 39 45 10 cmp %eax,0x10(%ebp) +801084fe: 74 0c je 8010850c +80108500: 8b 55 10 mov 0x10(%ebp),%edx +80108503: 89 c1 mov %eax,%ecx +80108505: 89 f8 mov %edi,%eax +80108507: e8 34 fa ff ff call 80107f40 + kfree(mem); +8010850c: 83 ec 0c sub $0xc,%esp +8010850f: 53 push %ebx +80108510: e8 9b b4 ff ff call 801039b0 + return 0; +80108515: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +8010851c: 83 c4 10 add $0x10,%esp +} +8010851f: 8b 45 e4 mov -0x1c(%ebp),%eax +80108522: 8d 65 f4 lea -0xc(%ebp),%esp +80108525: 5b pop %ebx +80108526: 5e pop %esi +80108527: 5f pop %edi +80108528: 5d pop %ebp +80108529: c3 ret +8010852a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80108530 : +int deallocuvm(pde_t *pgdir, uint oldsz, uint newsz) { +80108530: 55 push %ebp +80108531: 89 e5 mov %esp,%ebp +80108533: 8b 55 0c mov 0xc(%ebp),%edx +80108536: 8b 4d 10 mov 0x10(%ebp),%ecx +80108539: 8b 45 08 mov 0x8(%ebp),%eax + if (newsz >= oldsz) { +8010853c: 39 d1 cmp %edx,%ecx +8010853e: 73 10 jae 80108550 +} +80108540: 5d pop %ebp +80108541: e9 fa f9 ff ff jmp 80107f40 +80108546: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010854d: 8d 76 00 lea 0x0(%esi),%esi +80108550: 89 d0 mov %edx,%eax +80108552: 5d pop %ebp +80108553: c3 ret +80108554: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010855b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010855f: 90 nop + +80108560 : + +// Free a page table and all the physical memory pages +// in the user part. +void freevm(pde_t *pgdir) { +80108560: 55 push %ebp +80108561: 89 e5 mov %esp,%ebp +80108563: 57 push %edi +80108564: 56 push %esi +80108565: 53 push %ebx +80108566: 83 ec 0c sub $0xc,%esp +80108569: 8b 75 08 mov 0x8(%ebp),%esi + uint i; + + if (pgdir == 0) { +8010856c: 85 f6 test %esi,%esi +8010856e: 74 59 je 801085c9 + if (newsz >= oldsz) { +80108570: 31 c9 xor %ecx,%ecx +80108572: ba 00 00 00 80 mov $0x80000000,%edx +80108577: 89 f0 mov %esi,%eax +80108579: 89 f3 mov %esi,%ebx +8010857b: e8 c0 f9 ff ff call 80107f40 + panic("freevm: no pgdir"); + } + deallocuvm(pgdir, KERNBASE, 0); + for (i = 0; i < NPDENTRIES; i++) { +80108580: 8d be 00 10 00 00 lea 0x1000(%esi),%edi +80108586: eb 0f jmp 80108597 +80108588: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010858f: 90 nop +80108590: 83 c3 04 add $0x4,%ebx +80108593: 39 df cmp %ebx,%edi +80108595: 74 23 je 801085ba + if (pgdir[i] & PTE_P) { +80108597: 8b 03 mov (%ebx),%eax +80108599: a8 01 test $0x1,%al +8010859b: 74 f3 je 80108590 + char * v = P2V(PTE_ADDR(pgdir[i])); +8010859d: 25 00 f0 ff ff and $0xfffff000,%eax + kfree(v); +801085a2: 83 ec 0c sub $0xc,%esp + for (i = 0; i < NPDENTRIES; i++) { +801085a5: 83 c3 04 add $0x4,%ebx + char * v = P2V(PTE_ADDR(pgdir[i])); +801085a8: 05 00 00 00 80 add $0x80000000,%eax + kfree(v); +801085ad: 50 push %eax +801085ae: e8 fd b3 ff ff call 801039b0 +801085b3: 83 c4 10 add $0x10,%esp + for (i = 0; i < NPDENTRIES; i++) { +801085b6: 39 df cmp %ebx,%edi +801085b8: 75 dd jne 80108597 + } + } + kfree((char*)pgdir); +801085ba: 89 75 08 mov %esi,0x8(%ebp) +} +801085bd: 8d 65 f4 lea -0xc(%ebp),%esp +801085c0: 5b pop %ebx +801085c1: 5e pop %esi +801085c2: 5f pop %edi +801085c3: 5d pop %ebp + kfree((char*)pgdir); +801085c4: e9 e7 b3 ff ff jmp 801039b0 + panic("freevm: no pgdir"); +801085c9: 83 ec 0c sub $0xc,%esp +801085cc: 68 b5 94 10 80 push $0x801094b5 +801085d1: e8 aa 7e ff ff call 80100480 +801085d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801085dd: 8d 76 00 lea 0x0(%esi),%esi + +801085e0 : +pde_t*setupkvm(void) { +801085e0: 55 push %ebp +801085e1: 89 e5 mov %esp,%ebp +801085e3: 56 push %esi +801085e4: 53 push %ebx + if ((pgdir = (pde_t*)kalloc()) == 0) { +801085e5: e8 86 b5 ff ff call 80103b70 +801085ea: 89 c6 mov %eax,%esi +801085ec: 85 c0 test %eax,%eax +801085ee: 74 42 je 80108632 + memset(pgdir, 0, PGSIZE); +801085f0: 83 ec 04 sub $0x4,%esp + for (k = kmap; k < &kmap[NELEM(kmap)]; k++) { +801085f3: bb 20 c4 10 80 mov $0x8010c420,%ebx + memset(pgdir, 0, PGSIZE); +801085f8: 68 00 10 00 00 push $0x1000 +801085fd: 6a 00 push $0x0 +801085ff: 50 push %eax +80108600: e8 3b d6 ff ff call 80105c40 +80108605: 83 c4 10 add $0x10,%esp + (uint)k->phys_start, k->perm) < 0) { +80108608: 8b 43 04 mov 0x4(%ebx),%eax + if (mappages(pgdir, k->virt, k->phys_end - k->phys_start, +8010860b: 83 ec 08 sub $0x8,%esp +8010860e: 8b 4b 08 mov 0x8(%ebx),%ecx +80108611: ff 73 0c push 0xc(%ebx) +80108614: 8b 13 mov (%ebx),%edx +80108616: 50 push %eax +80108617: 29 c1 sub %eax,%ecx +80108619: 89 f0 mov %esi,%eax +8010861b: e8 d0 f9 ff ff call 80107ff0 +80108620: 83 c4 10 add $0x10,%esp +80108623: 85 c0 test %eax,%eax +80108625: 78 19 js 80108640 + for (k = kmap; k < &kmap[NELEM(kmap)]; k++) { +80108627: 83 c3 10 add $0x10,%ebx +8010862a: 81 fb 60 c4 10 80 cmp $0x8010c460,%ebx +80108630: 75 d6 jne 80108608 +} +80108632: 8d 65 f8 lea -0x8(%ebp),%esp +80108635: 89 f0 mov %esi,%eax +80108637: 5b pop %ebx +80108638: 5e pop %esi +80108639: 5d pop %ebp +8010863a: c3 ret +8010863b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010863f: 90 nop + freevm(pgdir); +80108640: 83 ec 0c sub $0xc,%esp +80108643: 56 push %esi + return 0; +80108644: 31 f6 xor %esi,%esi + freevm(pgdir); +80108646: e8 15 ff ff ff call 80108560 + return 0; +8010864b: 83 c4 10 add $0x10,%esp +} +8010864e: 8d 65 f8 lea -0x8(%ebp),%esp +80108651: 89 f0 mov %esi,%eax +80108653: 5b pop %ebx +80108654: 5e pop %esi +80108655: 5d pop %ebp +80108656: c3 ret +80108657: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010865e: 66 90 xchg %ax,%ax + +80108660 : +void kvmalloc(void) { +80108660: 55 push %ebp +80108661: 89 e5 mov %esp,%ebp +80108663: 83 ec 08 sub $0x8,%esp + kpgdir = setupkvm(); +80108666: e8 75 ff ff ff call 801085e0 +8010866b: a3 44 12 12 80 mov %eax,0x80121244 + lcr3(V2P(kpgdir)); // switch to the kernel page table +80108670: 05 00 00 00 80 add $0x80000000,%eax +80108675: 0f 22 d8 mov %eax,%cr3 +} +80108678: c9 leave +80108679: c3 ret +8010867a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +80108680 : + +// Clear PTE_U on a page. Used to create an inaccessible +// page beneath the user stack. +void clearpteu(pde_t *pgdir, char *uva) { +80108680: 55 push %ebp +80108681: 89 e5 mov %esp,%ebp +80108683: 83 ec 08 sub $0x8,%esp +80108686: 8b 45 0c mov 0xc(%ebp),%eax + if (*pde & PTE_P) { +80108689: 8b 55 08 mov 0x8(%ebp),%edx + pde = &pgdir[PDX(va)]; +8010868c: 89 c1 mov %eax,%ecx +8010868e: c1 e9 16 shr $0x16,%ecx + if (*pde & PTE_P) { +80108691: 8b 14 8a mov (%edx,%ecx,4),%edx +80108694: f6 c2 01 test $0x1,%dl +80108697: 75 17 jne 801086b0 + pte_t *pte; + + pte = walkpgdir(pgdir, uva, 0); + if (pte == 0) { + panic("clearpteu"); +80108699: 83 ec 0c sub $0xc,%esp +8010869c: 68 c6 94 10 80 push $0x801094c6 +801086a1: e8 da 7d ff ff call 80100480 +801086a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801086ad: 8d 76 00 lea 0x0(%esi),%esi + return &pgtab[PTX(va)]; +801086b0: c1 e8 0a shr $0xa,%eax + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +801086b3: 81 e2 00 f0 ff ff and $0xfffff000,%edx + return &pgtab[PTX(va)]; +801086b9: 25 fc 0f 00 00 and $0xffc,%eax +801086be: 8d 84 02 00 00 00 80 lea -0x80000000(%edx,%eax,1),%eax + if (pte == 0) { +801086c5: 85 c0 test %eax,%eax +801086c7: 74 d0 je 80108699 + } + *pte &= ~PTE_U; +801086c9: 83 20 fb andl $0xfffffffb,(%eax) +} +801086cc: c9 leave +801086cd: c3 ret +801086ce: 66 90 xchg %ax,%ax + +801086d0 : + +// Given a parent process's page table, create a copy +// of it for a child. +pde_t* copyuvm(pde_t *pgdir, uint sz) { +801086d0: 55 push %ebp +801086d1: 89 e5 mov %esp,%ebp +801086d3: 57 push %edi +801086d4: 56 push %esi +801086d5: 53 push %ebx +801086d6: 83 ec 1c sub $0x1c,%esp + pde_t *d; + pte_t *pte; + uint pa, i, flags; + char *mem; + + if ((d = setupkvm()) == 0) { +801086d9: e8 02 ff ff ff call 801085e0 +801086de: 89 45 e0 mov %eax,-0x20(%ebp) +801086e1: 85 c0 test %eax,%eax +801086e3: 0f 84 bd 00 00 00 je 801087a6 + return 0; + } + for (i = 0; i < sz; i += PGSIZE) { +801086e9: 8b 5d 0c mov 0xc(%ebp),%ebx +801086ec: 85 db test %ebx,%ebx +801086ee: 0f 84 b2 00 00 00 je 801087a6 +801086f4: 31 f6 xor %esi,%esi +801086f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801086fd: 8d 76 00 lea 0x0(%esi),%esi + if (*pde & PTE_P) { +80108700: 8b 4d 08 mov 0x8(%ebp),%ecx + pde = &pgdir[PDX(va)]; +80108703: 89 f0 mov %esi,%eax +80108705: c1 e8 16 shr $0x16,%eax + if (*pde & PTE_P) { +80108708: 8b 04 81 mov (%ecx,%eax,4),%eax +8010870b: a8 01 test $0x1,%al +8010870d: 75 11 jne 80108720 + if ((pte = walkpgdir(pgdir, (void *) i, 0)) == 0) { + panic("copyuvm: pte should exist"); +8010870f: 83 ec 0c sub $0xc,%esp +80108712: 68 d0 94 10 80 push $0x801094d0 +80108717: e8 64 7d ff ff call 80100480 +8010871c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + return &pgtab[PTX(va)]; +80108720: 89 f2 mov %esi,%edx + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +80108722: 25 00 f0 ff ff and $0xfffff000,%eax + return &pgtab[PTX(va)]; +80108727: c1 ea 0a shr $0xa,%edx +8010872a: 81 e2 fc 0f 00 00 and $0xffc,%edx +80108730: 8d 84 10 00 00 00 80 lea -0x80000000(%eax,%edx,1),%eax + if ((pte = walkpgdir(pgdir, (void *) i, 0)) == 0) { +80108737: 85 c0 test %eax,%eax +80108739: 74 d4 je 8010870f + } + if (!(*pte & PTE_P)) { +8010873b: 8b 00 mov (%eax),%eax +8010873d: a8 01 test $0x1,%al +8010873f: 0f 84 c2 00 00 00 je 80108807 + panic("copyuvm: page not present"); + } + pa = PTE_ADDR(*pte); +80108745: 89 c7 mov %eax,%edi + flags = PTE_FLAGS(*pte); +80108747: 25 ff 0f 00 00 and $0xfff,%eax +8010874c: 89 45 e4 mov %eax,-0x1c(%ebp) + pa = PTE_ADDR(*pte); +8010874f: 81 e7 00 f0 ff ff and $0xfffff000,%edi + if ((mem = kalloc()) == 0) { +80108755: e8 16 b4 ff ff call 80103b70 +8010875a: 89 c3 mov %eax,%ebx +8010875c: 85 c0 test %eax,%eax +8010875e: 74 58 je 801087b8 + freevm(d); + return 0; + } + memmove(mem, (char*)P2V(pa), PGSIZE); +80108760: 83 ec 04 sub $0x4,%esp +80108763: 81 c7 00 00 00 80 add $0x80000000,%edi +80108769: 68 00 10 00 00 push $0x1000 +8010876e: 57 push %edi +8010876f: 50 push %eax +80108770: e8 6b d5 ff ff call 80105ce0 + if (mappages(d, (void*)i, PGSIZE, V2P(mem), flags) < 0) { +80108775: 8d 83 00 00 00 80 lea -0x80000000(%ebx),%eax +8010877b: 5a pop %edx +8010877c: 59 pop %ecx +8010877d: ff 75 e4 push -0x1c(%ebp) +80108780: b9 00 10 00 00 mov $0x1000,%ecx +80108785: 89 f2 mov %esi,%edx +80108787: 50 push %eax +80108788: 8b 45 e0 mov -0x20(%ebp),%eax +8010878b: e8 60 f8 ff ff call 80107ff0 +80108790: 83 c4 10 add $0x10,%esp +80108793: 85 c0 test %eax,%eax +80108795: 78 49 js 801087e0 + for (i = 0; i < sz; i += PGSIZE) { +80108797: 81 c6 00 10 00 00 add $0x1000,%esi +8010879d: 39 75 0c cmp %esi,0xc(%ebp) +801087a0: 0f 87 5a ff ff ff ja 80108700 + freevm(d); + return 0; + } + } + return d; +} +801087a6: 8b 45 e0 mov -0x20(%ebp),%eax +801087a9: 8d 65 f4 lea -0xc(%ebp),%esp +801087ac: 5b pop %ebx +801087ad: 5e pop %esi +801087ae: 5f pop %edi +801087af: 5d pop %ebp +801087b0: c3 ret +801087b1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + freevm(d); +801087b8: 83 ec 0c sub $0xc,%esp +801087bb: ff 75 e0 push -0x20(%ebp) +801087be: e8 9d fd ff ff call 80108560 + return 0; +801087c3: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) +801087ca: 83 c4 10 add $0x10,%esp +} +801087cd: 8b 45 e0 mov -0x20(%ebp),%eax +801087d0: 8d 65 f4 lea -0xc(%ebp),%esp +801087d3: 5b pop %ebx +801087d4: 5e pop %esi +801087d5: 5f pop %edi +801087d6: 5d pop %ebp +801087d7: c3 ret +801087d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +801087df: 90 nop + kfree(mem); +801087e0: 83 ec 0c sub $0xc,%esp +801087e3: 53 push %ebx +801087e4: e8 c7 b1 ff ff call 801039b0 + freevm(d); +801087e9: 58 pop %eax +801087ea: ff 75 e0 push -0x20(%ebp) +801087ed: e8 6e fd ff ff call 80108560 + return 0; +801087f2: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) +801087f9: 83 c4 10 add $0x10,%esp +} +801087fc: 8b 45 e0 mov -0x20(%ebp),%eax +801087ff: 8d 65 f4 lea -0xc(%ebp),%esp +80108802: 5b pop %ebx +80108803: 5e pop %esi +80108804: 5f pop %edi +80108805: 5d pop %ebp +80108806: c3 ret + panic("copyuvm: page not present"); +80108807: 83 ec 0c sub $0xc,%esp +8010880a: 68 ea 94 10 80 push $0x801094ea +8010880f: e8 6c 7c ff ff call 80100480 +80108814: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010881b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010881f: 90 nop + +80108820 : + + +// Map user virtual address to kernel address. +char*uva2ka(pde_t *pgdir, char *uva) { +80108820: 55 push %ebp +80108821: 89 e5 mov %esp,%ebp +80108823: 8b 45 0c mov 0xc(%ebp),%eax + if (*pde & PTE_P) { +80108826: 8b 55 08 mov 0x8(%ebp),%edx + pde = &pgdir[PDX(va)]; +80108829: 89 c1 mov %eax,%ecx +8010882b: c1 e9 16 shr $0x16,%ecx + if (*pde & PTE_P) { +8010882e: 8b 14 8a mov (%edx,%ecx,4),%edx +80108831: f6 c2 01 test $0x1,%dl +80108834: 0f 84 00 01 00 00 je 8010893a + return &pgtab[PTX(va)]; +8010883a: c1 e8 0c shr $0xc,%eax + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +8010883d: 81 e2 00 f0 ff ff and $0xfffff000,%edx + } + if ((*pte & PTE_U) == 0) { + return 0; + } + return (char*)P2V(PTE_ADDR(*pte)); +} +80108843: 5d pop %ebp + return &pgtab[PTX(va)]; +80108844: 25 ff 03 00 00 and $0x3ff,%eax + if ((*pte & PTE_P) == 0) { +80108849: 8b 84 82 00 00 00 80 mov -0x80000000(%edx,%eax,4),%eax + if ((*pte & PTE_U) == 0) { +80108850: 89 c2 mov %eax,%edx + return (char*)P2V(PTE_ADDR(*pte)); +80108852: 25 00 f0 ff ff and $0xfffff000,%eax + if ((*pte & PTE_U) == 0) { +80108857: 83 e2 05 and $0x5,%edx + return (char*)P2V(PTE_ADDR(*pte)); +8010885a: 05 00 00 00 80 add $0x80000000,%eax +8010885f: 83 fa 05 cmp $0x5,%edx +80108862: ba 00 00 00 00 mov $0x0,%edx +80108867: 0f 45 c2 cmovne %edx,%eax +} +8010886a: c3 ret +8010886b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010886f: 90 nop + +80108870 : + +// Copy len bytes from p to user address va in page table pgdir. +// Most useful when pgdir is not the current page table. +// uva2ka ensures this only works for PTE_U pages. +int copyout(pde_t *pgdir, uint va, void *p, uint len) { +80108870: 55 push %ebp +80108871: 89 e5 mov %esp,%ebp +80108873: 57 push %edi +80108874: 56 push %esi +80108875: 53 push %ebx +80108876: 83 ec 0c sub $0xc,%esp +80108879: 8b 75 14 mov 0x14(%ebp),%esi +8010887c: 8b 45 0c mov 0xc(%ebp),%eax +8010887f: 8b 55 10 mov 0x10(%ebp),%edx + char *buf, *pa0; + uint n, va0; + + buf = (char*)p; + while (len > 0) { +80108882: 85 f6 test %esi,%esi +80108884: 75 51 jne 801088d7 +80108886: e9 a5 00 00 00 jmp 80108930 +8010888b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +8010888f: 90 nop + return (char*)P2V(PTE_ADDR(*pte)); +80108890: 81 e3 00 f0 ff ff and $0xfffff000,%ebx +80108896: 8d 8b 00 00 00 80 lea -0x80000000(%ebx),%ecx + va0 = (uint)PGROUNDDOWN(va); + pa0 = uva2ka(pgdir, (char*)va0); + if (pa0 == 0) { +8010889c: 81 fb 00 00 00 80 cmp $0x80000000,%ebx +801088a2: 74 75 je 80108919 + return -1; + } + n = PGSIZE - (va - va0); +801088a4: 89 fb mov %edi,%ebx + if (n > len) { + n = len; + } + memmove(pa0 + (va - va0), buf, n); +801088a6: 89 55 10 mov %edx,0x10(%ebp) + n = PGSIZE - (va - va0); +801088a9: 29 c3 sub %eax,%ebx +801088ab: 81 c3 00 10 00 00 add $0x1000,%ebx +801088b1: 39 f3 cmp %esi,%ebx +801088b3: 0f 47 de cmova %esi,%ebx + memmove(pa0 + (va - va0), buf, n); +801088b6: 29 f8 sub %edi,%eax +801088b8: 83 ec 04 sub $0x4,%esp +801088bb: 01 c1 add %eax,%ecx +801088bd: 53 push %ebx +801088be: 52 push %edx +801088bf: 51 push %ecx +801088c0: e8 1b d4 ff ff call 80105ce0 + len -= n; + buf += n; +801088c5: 8b 55 10 mov 0x10(%ebp),%edx + va = va0 + PGSIZE; +801088c8: 8d 87 00 10 00 00 lea 0x1000(%edi),%eax + while (len > 0) { +801088ce: 83 c4 10 add $0x10,%esp + buf += n; +801088d1: 01 da add %ebx,%edx + while (len > 0) { +801088d3: 29 de sub %ebx,%esi +801088d5: 74 59 je 80108930 + if (*pde & PTE_P) { +801088d7: 8b 5d 08 mov 0x8(%ebp),%ebx + pde = &pgdir[PDX(va)]; +801088da: 89 c1 mov %eax,%ecx + va0 = (uint)PGROUNDDOWN(va); +801088dc: 89 c7 mov %eax,%edi + pde = &pgdir[PDX(va)]; +801088de: c1 e9 16 shr $0x16,%ecx + va0 = (uint)PGROUNDDOWN(va); +801088e1: 81 e7 00 f0 ff ff and $0xfffff000,%edi + if (*pde & PTE_P) { +801088e7: 8b 0c 8b mov (%ebx,%ecx,4),%ecx +801088ea: f6 c1 01 test $0x1,%cl +801088ed: 0f 84 4e 00 00 00 je 80108941 + return &pgtab[PTX(va)]; +801088f3: 89 fb mov %edi,%ebx + pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); +801088f5: 81 e1 00 f0 ff ff and $0xfffff000,%ecx + return &pgtab[PTX(va)]; +801088fb: c1 eb 0c shr $0xc,%ebx +801088fe: 81 e3 ff 03 00 00 and $0x3ff,%ebx + if ((*pte & PTE_P) == 0) { +80108904: 8b 9c 99 00 00 00 80 mov -0x80000000(%ecx,%ebx,4),%ebx + if ((*pte & PTE_U) == 0) { +8010890b: 89 d9 mov %ebx,%ecx +8010890d: 83 e1 05 and $0x5,%ecx +80108910: 83 f9 05 cmp $0x5,%ecx +80108913: 0f 84 77 ff ff ff je 80108890 + } + return 0; +} +80108919: 8d 65 f4 lea -0xc(%ebp),%esp + return -1; +8010891c: b8 ff ff ff ff mov $0xffffffff,%eax +} +80108921: 5b pop %ebx +80108922: 5e pop %esi +80108923: 5f pop %edi +80108924: 5d pop %ebp +80108925: c3 ret +80108926: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi +8010892d: 8d 76 00 lea 0x0(%esi),%esi +80108930: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; +80108933: 31 c0 xor %eax,%eax +} +80108935: 5b pop %ebx +80108936: 5e pop %esi +80108937: 5f pop %edi +80108938: 5d pop %ebp +80108939: c3 ret + +8010893a : + if ((*pte & PTE_P) == 0) { +8010893a: a1 00 00 00 00 mov 0x0,%eax +8010893f: 0f 0b ud2 + +80108941 : +80108941: a1 00 00 00 00 mov 0x0,%eax +80108946: 0f 0b ud2 diff --git a/kernel.sym b/kernel.sym new file mode 100644 index 0000000..772a28a --- /dev/null +++ b/kernel.sym @@ -0,0 +1,534 @@ +00000000 bio.c +00000000 console.c +80100280 navigatemenu +8011b6c0 currentmenuitem +8011b680 cons +8011b6b8 panicked +80100500 cgaputc +8011b6bc menuactive +80108a90 digits.0 +80100e90 drawtitle +8011b640 vcons +00000000 exec.c +00000000 file.c +00000000 fs.c +801026b0 bfree +80102730 balloc +80102840 iget +80102940 bmap +80103280 namex +00000000 ide.c +801035d0 idestart +8011dd80 idelock +8011dd60 havedisk1 +8011dd64 idequeue +00000000 ioapic.c +00000000 kalloc.c +00000000 kbd.c +8011ddfc shift.1 +80108dc0 shiftcode +80108cc0 togglecode +80108ca0 charcode.0 +8010a200 normalmap +8010a100 shiftmap +8010a000 ctlmap +00000000 lapic.c +00000000 log.c +801040b0 install_trans +80104150 write_head +00000000 main.c +801044f0 mpmain +80104530 mpenter +00000000 mp.c +80104680 mpsearch1 +00000000 picirq.c +00000000 pipe.c +00000000 proc.c +80104ce0 allocproc +8010c000 first.1 +801209d4 initproc +801090d8 states.0 +00000000 sleeplock.c +00000000 spinlock.c +00000000 string.c +00000000 syscall.c +80109160 syscalls +00000000 sysfile.c +801060b0 create +00000000 sysproc.c +00000000 trap.c +00000000 uart.c +80107340 uartgetc +80121240 uart +00000000 vm.c +80107f40 deallocuvm.part.0 +80107ff0 mappages +8010c420 kmap +8010893a uva2ka.cold +80108941 copyout.cold +80100320 consoleread +80107e8f vector242 +801078e6 vector119 +8010000c entry +801077c6 vector87 +801077bd vector86 +80105e00 safestrcpy +801063d0 sys_close +80107efb vector251 +801077ea vector91 +801075e0 vector33 +80107acf vector162 +80105590 yield +8011de20 log +8011ddc0 kmem +80107d33 vector213 +80107883 vector108 +80107370 uartinit +8010763a vector43 +80103e00 lapiceoi +80107af3 vector165 +80107be3 vector185 +801038c0 ioapicinit +801078c2 vector115 +80102510 fileread +80107901 vector122 +80106d30 sys_sbrk +8011df00 ioapicid +80107a87 vector156 +80107eb3 vector245 +8011ddb4 ioapic +80107c13 vector189 +80107504 vector7 +801076dc vector61 +8010758f vector24 +8010789e vector111 +80107c97 vector200 +80107712 vector67 +801079af vector138 +80107751 vector74 +80105230 sched +80105ce0 memmove +801076b8 vector57 +80106040 syscall +80107d3f vector214 +80107832 vector99 +80104e90 cpuid +80103080 writei +801079d3 vector141 +80106cb0 sys_fork +80101ed0 cleanupexec +8010c520 bcache +80107b47 vector172 +80107e83 vector241 +801059d0 getcallerpcs +80106940 sys_mkdir +80107f13 vector253 +801074e0 vector3 +801074d7 vector2 +801031b0 namecmp +80107ddb vector227 +80107d0f vector210 +80105fc0 argstr +80107db7 vector224 +8011b5a0 inputBuffer +80107628 vector41 +80100890 cprintf +80102390 filedup +80101d40 closeconsole +80103590 namei +80107574 vector21 +80100040 binit +80107b83 vector177 +80101e60 setconsoleproctitle +801078dd vector118 +8010772d vector70 +80107724 vector69 +80107e53 vector237 +801076f7 vector64 +801075aa vector27 +80107967 vector132 +80107bef vector186 +801062d0 sys_read +80107d63 vector217 +80105e70 fetchint +801085e0 setupkvm +80105d40 memcpy +80108560 freevm +801074ce vector1 +80107b8f vector178 +8010760d vector38 +801039b0 kfree +80107e5f vector238 +80106e60 sys_greeting +80104e30 mycpu +80102da0 iput +80107973 vector133 +80107748 vector73 +801079f7 vector144 +80107f1f vector254 +80102a10 readsb +8010c004 nextpid +80107844 vector101 +80107d1b vector211 +80104700 mpinit +80107b5f vector174 +80107e9b vector243 +80102300 fileinit +801064a0 cleanupsyslink +801059b0 initlock +80107937 vector128 +80108870 copyout +80107790 vector81 +801055e0 sleep +80103e20 microdelay +80107532 vector13 +80107682 vector51 +80107549 vector16 +8011b580 input +80107e77 vector240 +8010769d vector54 +80107562 vector19 +801077f3 vector92 +80107ea7 vector244 +80102f50 stati +801079c7 vector140 +80106ce0 sys_kill +8010764c vector45 +8010777e vector79 +80104a60 pipeclose +80107df3 vector229 +80107a9f vector158 +80106430 sys_fstat +801007e0 consolewrite +80107616 vector39 +80107b17 vector168 +801042c0 end_op +801075f2 vector35 +801078b0 vector113 +80103a50 freerange +8010791c vector125 +801012f0 newconsole +80108400 allocuvm +80106fe9 trapret +80107d57 vector216 +801076ee vector63 +801075a1 vector26 +80107c43 vector193 +80103ce0 lapicinit +80107c67 vector196 +80107d03 vector209 +801074e9 vector4 +80107b2f vector170 +80121250 stack +80107997 vector136 +8010751d vector10 +80107cdf vector206 +80102d50 iunlock +80106d80 sys_sleep +80107f2b vector255 +80107bb3 vector181 +801076ca vector59 +801077b4 vector85 +801077ab vector84 +80107bcb vector183 +80107aab vector159 +80107d27 vector212 +801064e0 sys_link +8010765e vector47 +80107de7 vector228 +80107631 vector42 +801078b9 vector114 +80108820 uva2ka +80107b6b vector175 +801079eb vector143 +80102320 filealloc +801056a0 wakeup +8010794f vector130 +80107ebf vector246 +80107514 vector9 +801079df vector142 +8010783b vector100 +80107ca3 vector201 +80108680 clearpteu +80104eb0 myproc +80107000 tvinit +801076d3 vector60 +80107586 vector23 +80102c40 idup +80107e47 vector236 +80103cc0 kbdintr +80106800 sys_open +80107e0b vector231 +80107709 vector66 +801075bc vector29 +80102f80 readi +8010798b vector135 +80101530 consoleintr +80105700 kill +8010776c vector77 +80102b00 ialloc +80107ba7 vector180 +80121244 kpgdir +80101de0 getcurrentconsoleindex +80107cf7 vector208 +80103ec0 cmostime +801074b0 uartintr +80107829 vector98 +80107820 vector97 +80107b77 vector176 +80107c4f vector194 +801075d7 vector32 +80122250 end +80107c8b vector199 +80100fb0 consoleget +8010795b vector131 +80107f07 vector252 +801025a0 filewrite +801074c5 vector0 +80105f00 argint +80104920 cleanuppipealloc +80101f20 exec +80107a03 vector145 +80106350 sys_write +80105b20 release +80105eb0 fetchstr +8010787a vector107 +8010761f vector40 +80105450 wait +8010784d vector102 +8010b000 entrypgdir +0010000c _start +801076af vector56 +8010771b vector68 +801074fb vector6 +8010c48c _binary_initcode_end +80100000 multiboot_header +80107943 vector129 +80105190 scheduler +801031d0 dirlookup +80107c73 vector197 +801023e0 fileclose +80104250 begin_op +80101080 loadscreenbuffer +80107a57 vector152 +80108660 kvmalloc +80107dff vector230 +80101000 testfillbuffer +80105d50 strncmp +80107604 vector37 +80107cd3 vector205 +80107ac3 vector161 +80120a00 tickslock +80104b00 pipewrite +80105da0 strncpy +80107736 vector71 +801086d0 copyuvm +8011b6e0 ftable +80107ab7 vector160 +80105f50 argptr +80107d4b vector215 +80107a93 vector157 +80106250 sys_dup +801078a7 vector112 +80100480 panic +80104dc0 forkret +80107bbf vector182 +8010752b vector12 +80105c90 memcmp +80103be0 kbdgetc +8010788c vector109 +8010756b vector20 +80105070 fork +80107694 vector53 +80107559 vector18 +0000007a _binary_entryother_size +8011df20 cpus +80105920 releasesleep +8010780e vector95 +80106ca0 sys_getch +80105ae0 holding +8011dd34 sb +80105b80 acquire +80107dcf vector226 +801035b0 nameiparent +80107670 vector49 +80107643 vector44 +8011de00 lapic +80107775 vector78 +80106fd1 alltraps +80107b53 vector173 +801078d4 vector117 +801010c0 clearscreen +80107799 vector82 +80107d9f vector222 +8010750d vector8 +80107a33 vector149 +80102bc0 iupdate +8010a000 data +80105c40 memset +80107e17 vector232 +80104550 main +80108170 switchkvm +80107871 vector106 +80107d87 vector220 +801077e1 vector90 +80107adb vector163 +80107e2f vector234 +80106f20 sys_screen +80104430 log_write +801058c0 acquiresleep +80106630 sys_unlink +801076e5 vector62 +80107598 vector25 +80107c7f vector198 +801078ef vector120 +8010c48c _binary_entryother_start +80103b00 kinit1 +80107679 vector50 +80107540 vector15 +80107a4b vector151 +801077a2 vector83 +801077d8 vector89 +801077cf vector88 +80106ed0 sys_shutdown +801070b0 trap +80106e30 sys_uptime +80107b9b vector179 +801075e9 vector34 +80107655 vector46 +8010797f vector134 +80107dab vector223 +80120a40 idt +80107d6f vector218 +80104e10 pinit +80100c00 sprintf +80108530 deallocuvm +801013e0 switchtoconsole +80107dc3 vector225 +80103de0 lapicid +80107bfb vector187 +80104ff0 growproc +80105960 holdingsleep +8011df04 ncpu +801075c5 vector30 +80104ee0 userinit +80100470 getconsoleindex +801000d0 bread +8010792e vector127 +80104c00 piperead +801209e0 ticks +80107c37 vector192 +80107aff vector166 +801011e0 consoleinit +80107763 vector76 +8010775a vector75 +80103730 ideintr +80107c5b vector195 +80107a3f vector150 +801076c1 vector58 +80107ed7 vector248 +8010790a vector123 +80107817 vector96 +80110ea0 consoles +801075ce vector31 +80107cbb vector203 +801079bb vector139 +80107a63 vector153 +80107ae7 vector164 +80105780 procdump +801078f8 vector121 +80107450 uartputc +801074f2 vector5 +80107b0b vector167 +80107a7b vector155 +80107ee3 vector249 +801001f0 brelse +801013c0 releaseallconsoles +80107eef vector250 +80107913 vector124 +80107895 vector110 +80107cc7 vector204 +80102c70 ilock +80106ae0 sys_exec +801079a3 vector137 +8010c460 _binary_initcode_start +80105e5b swtch +80107ecb vector247 +8010757d vector22 +80107caf vector202 +801080e0 seginit +80102f00 iunlockput +80110e80 currentconsole +8010773f vector72 +801076a6 vector55 +80107925 vector126 +80107700 vector65 +801075b3 vector28 +8010c506 _binary_entryother_end +80107b23 vector169 +801001b0 bwrite +80107e23 vector233 +801010a0 savescreenbuffer +80107080 idtinit +80101050 getbaseconsoleptr +801052f0 exit +80106cd0 sys_wait +80106cc0 sys_exit +801034d0 dirlink +0000002c _binary_initcode_size +80107a1b vector147 +80105880 initsleeplock +801036b0 ideinit +80108310 loaduvm +8010785f vector104 +801078cb vector116 +8011e4a0 ptable +80103970 ioapicenable +80105a80 popcli +8010c008 vectors +8010768b vector52 +80107552 vector17 +80107bd7 vector184 +80105e40 strlen +80106bd0 sys_pipe +80102a50 iinit +80104900 picinit +80107ceb vector207 +80108290 inituvm +80106fc0 sys_cls +80107c1f vector190 +80107e6b vector239 +80107805 vector94 +801077fc vector93 +801041b0 initlog +80107c07 vector188 +80107667 vector48 +801037d0 iderw +80100f80 getvalidprocessconsoleptr +80107d7b vector219 +80107a27 vector148 +80107d93 vector221 +80103b70 kalloc +8011c080 devsw +80106d20 sys_getpid +80107787 vector80 +80107b3b vector171 +80107a6f vector154 +80101060 clearconsole +801075fb vector36 +80104970 pipealloc +80107e3b vector235 +80107868 vector105 +80106a30 sys_chdir +8011c0e0 icache +80107a0f vector146 +80107c2b vector191 +80107856 vector103 +801069a0 sys_mknod +80103e30 lapicstartap +80108180 switchuvm +80105a30 pushcli +80103aa0 kinit2 +80107524 vector11 +80107539 vector14 +801024c0 filestat diff --git a/kill.asm b/kill.asm new file mode 100644 index 0000000..7a67399 --- /dev/null +++ b/kill.asm @@ -0,0 +1,1185 @@ + +_kill: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(int argc, char **argv) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: bb 01 00 00 00 mov $0x1,%ebx + 15: 51 push %ecx + 16: 83 ec 08 sub $0x8,%esp + 19: 8b 31 mov (%ecx),%esi + 1b: 8b 79 04 mov 0x4(%ecx),%edi + int i; + + if (argc < 2) { + 1e: 83 fe 01 cmp $0x1,%esi + 21: 7e 27 jle 4a + 23: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 27: 90 nop + printf(2, "usage: kill pid...\n"); + exit(); + } + for (i = 1; i < argc; i++) { + kill(atoi(argv[i])); + 28: 83 ec 0c sub $0xc,%esp + 2b: ff 34 9f push (%edi,%ebx,4) + for (i = 1; i < argc; i++) { + 2e: 83 c3 01 add $0x1,%ebx + kill(atoi(argv[i])); + 31: e8 0a 02 00 00 call 240 + 36: 89 04 24 mov %eax,(%esp) + 39: e8 95 02 00 00 call 2d3 + for (i = 1; i < argc; i++) { + 3e: 83 c4 10 add $0x10,%esp + 41: 39 de cmp %ebx,%esi + 43: 75 e3 jne 28 + } + exit(); + 45: e8 69 02 00 00 call 2b3 + printf(2, "usage: kill pid...\n"); + 4a: 50 push %eax + 4b: 50 push %eax + 4c: 68 58 07 00 00 push $0x758 + 51: 6a 02 push $0x2 + 53: e8 d8 03 00 00 call 430 + exit(); + 58: e8 56 02 00 00 call 2b3 + 5d: 66 90 xchg %ax,%ax + 5f: 90 nop + +00000060 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 60: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 61: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 63: 89 e5 mov %esp,%ebp + 65: 53 push %ebx + 66: 8b 4d 08 mov 0x8(%ebp),%ecx + 69: 8b 5d 0c mov 0xc(%ebp),%ebx + 6c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 70: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 74: 88 14 01 mov %dl,(%ecx,%eax,1) + 77: 83 c0 01 add $0x1,%eax + 7a: 84 d2 test %dl,%dl + 7c: 75 f2 jne 70 + ; + } + return os; +} + 7e: 8b 5d fc mov -0x4(%ebp),%ebx + 81: 89 c8 mov %ecx,%eax + 83: c9 leave + 84: c3 ret + 85: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 8c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000090 : + +int strcmp(const char *p, const char *q) { + 90: 55 push %ebp + 91: 89 e5 mov %esp,%ebp + 93: 53 push %ebx + 94: 8b 55 08 mov 0x8(%ebp),%edx + 97: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 9a: 0f b6 02 movzbl (%edx),%eax + 9d: 84 c0 test %al,%al + 9f: 75 17 jne b8 + a1: eb 3a jmp dd + a3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + a7: 90 nop + a8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + ac: 83 c2 01 add $0x1,%edx + af: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + b2: 84 c0 test %al,%al + b4: 74 1a je d0 + p++, q++; + b6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + b8: 0f b6 19 movzbl (%ecx),%ebx + bb: 38 c3 cmp %al,%bl + bd: 74 e9 je a8 + } + return (uchar) * p - (uchar) * q; + bf: 29 d8 sub %ebx,%eax +} + c1: 8b 5d fc mov -0x4(%ebp),%ebx + c4: c9 leave + c5: c3 ret + c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + cd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + d0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + d4: 31 c0 xor %eax,%eax + d6: 29 d8 sub %ebx,%eax +} + d8: 8b 5d fc mov -0x4(%ebp),%ebx + db: c9 leave + dc: c3 ret + return (uchar) * p - (uchar) * q; + dd: 0f b6 19 movzbl (%ecx),%ebx + e0: 31 c0 xor %eax,%eax + e2: eb db jmp bf + e4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + eb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ef: 90 nop + +000000f0 : + +uint strlen(const char *s) { + f0: 55 push %ebp + f1: 89 e5 mov %esp,%ebp + f3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + f6: 80 3a 00 cmpb $0x0,(%edx) + f9: 74 15 je 110 + fb: 31 c0 xor %eax,%eax + fd: 8d 76 00 lea 0x0(%esi),%esi + 100: 83 c0 01 add $0x1,%eax + 103: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 107: 89 c1 mov %eax,%ecx + 109: 75 f5 jne 100 + ; + } + return n; +} + 10b: 89 c8 mov %ecx,%eax + 10d: 5d pop %ebp + 10e: c3 ret + 10f: 90 nop + for (n = 0; s[n]; n++) { + 110: 31 c9 xor %ecx,%ecx +} + 112: 5d pop %ebp + 113: 89 c8 mov %ecx,%eax + 115: c3 ret + 116: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 11d: 8d 76 00 lea 0x0(%esi),%esi + +00000120 : + +void* memset(void *dst, int c, uint n) { + 120: 55 push %ebp + 121: 89 e5 mov %esp,%ebp + 123: 57 push %edi + 124: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 127: 8b 4d 10 mov 0x10(%ebp),%ecx + 12a: 8b 45 0c mov 0xc(%ebp),%eax + 12d: 89 d7 mov %edx,%edi + 12f: fc cld + 130: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 132: 8b 7d fc mov -0x4(%ebp),%edi + 135: 89 d0 mov %edx,%eax + 137: c9 leave + 138: c3 ret + 139: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000140 : + +char* strchr(const char *s, char c) { + 140: 55 push %ebp + 141: 89 e5 mov %esp,%ebp + 143: 8b 45 08 mov 0x8(%ebp),%eax + 146: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 14a: 0f b6 10 movzbl (%eax),%edx + 14d: 84 d2 test %dl,%dl + 14f: 75 12 jne 163 + 151: eb 1d jmp 170 + 153: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 157: 90 nop + 158: 0f b6 50 01 movzbl 0x1(%eax),%edx + 15c: 83 c0 01 add $0x1,%eax + 15f: 84 d2 test %dl,%dl + 161: 74 0d je 170 + if (*s == c) { + 163: 38 d1 cmp %dl,%cl + 165: 75 f1 jne 158 + return (char*)s; + } + } + return 0; +} + 167: 5d pop %ebp + 168: c3 ret + 169: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 170: 31 c0 xor %eax,%eax +} + 172: 5d pop %ebp + 173: c3 ret + 174: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 17b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 17f: 90 nop + +00000180 : + +char* gets(char *buf, int max) { + 180: 55 push %ebp + 181: 89 e5 mov %esp,%ebp + 183: 57 push %edi + 184: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 185: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 188: 53 push %ebx + for (i = 0; i + 1 < max;) { + 189: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 18b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 18e: eb 27 jmp 1b7 + cc = read(0, &c, 1); + 190: 83 ec 04 sub $0x4,%esp + 193: 6a 01 push $0x1 + 195: 57 push %edi + 196: 6a 00 push $0x0 + 198: e8 2e 01 00 00 call 2cb + if (cc < 1) { + 19d: 83 c4 10 add $0x10,%esp + 1a0: 85 c0 test %eax,%eax + 1a2: 7e 1d jle 1c1 + break; + } + buf[i++] = c; + 1a4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1a8: 8b 55 08 mov 0x8(%ebp),%edx + 1ab: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1af: 3c 0a cmp $0xa,%al + 1b1: 74 1d je 1d0 + 1b3: 3c 0d cmp $0xd,%al + 1b5: 74 19 je 1d0 + for (i = 0; i + 1 < max;) { + 1b7: 89 de mov %ebx,%esi + 1b9: 83 c3 01 add $0x1,%ebx + 1bc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1bf: 7c cf jl 190 + break; + } + } + buf[i] = '\0'; + 1c1: 8b 45 08 mov 0x8(%ebp),%eax + 1c4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1c8: 8d 65 f4 lea -0xc(%ebp),%esp + 1cb: 5b pop %ebx + 1cc: 5e pop %esi + 1cd: 5f pop %edi + 1ce: 5d pop %ebp + 1cf: c3 ret + buf[i] = '\0'; + 1d0: 8b 45 08 mov 0x8(%ebp),%eax + 1d3: 89 de mov %ebx,%esi + 1d5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1d9: 8d 65 f4 lea -0xc(%ebp),%esp + 1dc: 5b pop %ebx + 1dd: 5e pop %esi + 1de: 5f pop %edi + 1df: 5d pop %ebp + 1e0: c3 ret + 1e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ef: 90 nop + +000001f0 : + +int stat(const char *n, struct stat *st) { + 1f0: 55 push %ebp + 1f1: 89 e5 mov %esp,%ebp + 1f3: 56 push %esi + 1f4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 1f5: 83 ec 08 sub $0x8,%esp + 1f8: 6a 00 push $0x0 + 1fa: ff 75 08 push 0x8(%ebp) + 1fd: e8 19 01 00 00 call 31b + if (fd < 0) { + 202: 83 c4 10 add $0x10,%esp + 205: 85 c0 test %eax,%eax + 207: 78 27 js 230 + return -1; + } + r = fstat(fd, st); + 209: 83 ec 08 sub $0x8,%esp + 20c: ff 75 0c push 0xc(%ebp) + 20f: 89 c3 mov %eax,%ebx + 211: 50 push %eax + 212: e8 cc 00 00 00 call 2e3 + close(fd); + 217: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 21a: 89 c6 mov %eax,%esi + close(fd); + 21c: e8 2a 01 00 00 call 34b + return r; + 221: 83 c4 10 add $0x10,%esp +} + 224: 8d 65 f8 lea -0x8(%ebp),%esp + 227: 89 f0 mov %esi,%eax + 229: 5b pop %ebx + 22a: 5e pop %esi + 22b: 5d pop %ebp + 22c: c3 ret + 22d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 230: be ff ff ff ff mov $0xffffffff,%esi + 235: eb ed jmp 224 + 237: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 23e: 66 90 xchg %ax,%ax + +00000240 : + +int atoi(const char *s) { + 240: 55 push %ebp + 241: 89 e5 mov %esp,%ebp + 243: 53 push %ebx + 244: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 247: 0f be 02 movsbl (%edx),%eax + 24a: 8d 48 d0 lea -0x30(%eax),%ecx + 24d: 80 f9 09 cmp $0x9,%cl + n = 0; + 250: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 255: 77 1e ja 275 + 257: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 260: 83 c2 01 add $0x1,%edx + 263: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 266: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 26a: 0f be 02 movsbl (%edx),%eax + 26d: 8d 58 d0 lea -0x30(%eax),%ebx + 270: 80 fb 09 cmp $0x9,%bl + 273: 76 eb jbe 260 + } + return n; +} + 275: 8b 5d fc mov -0x4(%ebp),%ebx + 278: 89 c8 mov %ecx,%eax + 27a: c9 leave + 27b: c3 ret + 27c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000280 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 280: 55 push %ebp + 281: 89 e5 mov %esp,%ebp + 283: 57 push %edi + 284: 8b 45 10 mov 0x10(%ebp),%eax + 287: 8b 55 08 mov 0x8(%ebp),%edx + 28a: 56 push %esi + 28b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 28e: 85 c0 test %eax,%eax + 290: 7e 13 jle 2a5 + 292: 01 d0 add %edx,%eax + dst = vdst; + 294: 89 d7 mov %edx,%edi + 296: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2a0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2a1: 39 f8 cmp %edi,%eax + 2a3: 75 fb jne 2a0 + } + return vdst; +} + 2a5: 5e pop %esi + 2a6: 89 d0 mov %edx,%eax + 2a8: 5f pop %edi + 2a9: 5d pop %ebp + 2aa: c3 ret + +000002ab : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2ab: b8 01 00 00 00 mov $0x1,%eax + 2b0: cd 40 int $0x40 + 2b2: c3 ret + +000002b3 : +SYSCALL(exit) + 2b3: b8 02 00 00 00 mov $0x2,%eax + 2b8: cd 40 int $0x40 + 2ba: c3 ret + +000002bb : +SYSCALL(wait) + 2bb: b8 03 00 00 00 mov $0x3,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(pipe) + 2c3: b8 04 00 00 00 mov $0x4,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(read) + 2cb: b8 05 00 00 00 mov $0x5,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(kill) + 2d3: b8 06 00 00 00 mov $0x6,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(exec) + 2db: b8 07 00 00 00 mov $0x7,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(fstat) + 2e3: b8 08 00 00 00 mov $0x8,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(chdir) + 2eb: b8 09 00 00 00 mov $0x9,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(dup) + 2f3: b8 0a 00 00 00 mov $0xa,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(getpid) + 2fb: b8 0b 00 00 00 mov $0xb,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(sbrk) + 303: b8 0c 00 00 00 mov $0xc,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(sleep) + 30b: b8 0d 00 00 00 mov $0xd,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(uptime) + 313: b8 0e 00 00 00 mov $0xe,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(open) + 31b: b8 0f 00 00 00 mov $0xf,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(write) + 323: b8 10 00 00 00 mov $0x10,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(mknod) + 32b: b8 11 00 00 00 mov $0x11,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(unlink) + 333: b8 12 00 00 00 mov $0x12,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(link) + 33b: b8 13 00 00 00 mov $0x13,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(mkdir) + 343: b8 14 00 00 00 mov $0x14,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(close) + 34b: b8 15 00 00 00 mov $0x15,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(getch) + 353: b8 16 00 00 00 mov $0x16,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(greeting) + 35b: b8 17 00 00 00 mov $0x17,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(shutdown) + 363: b8 18 00 00 00 mov $0x18,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(screen) + 36b: b8 19 00 00 00 mov $0x19,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(cls) + 373: b8 1a 00 00 00 mov $0x1a,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + 37b: 66 90 xchg %ax,%ax + 37d: 66 90 xchg %ax,%ax + 37f: 90 nop + +00000380 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 380: 55 push %ebp + 381: 89 e5 mov %esp,%ebp + 383: 57 push %edi + 384: 56 push %esi + 385: 53 push %ebx + 386: 83 ec 3c sub $0x3c,%esp + 389: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 38c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 38e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 391: 85 d2 test %edx,%edx + 393: 0f 89 7f 00 00 00 jns 418 + 399: f6 45 08 01 testb $0x1,0x8(%ebp) + 39d: 74 79 je 418 + neg = 1; + 39f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3a6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3a8: 31 db xor %ebx,%ebx + 3aa: 8d 75 d7 lea -0x29(%ebp),%esi + 3ad: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3b0: 89 c8 mov %ecx,%eax + 3b2: 31 d2 xor %edx,%edx + 3b4: 89 cf mov %ecx,%edi + 3b6: f7 75 c4 divl -0x3c(%ebp) + 3b9: 0f b6 92 cc 07 00 00 movzbl 0x7cc(%edx),%edx + 3c0: 89 45 c0 mov %eax,-0x40(%ebp) + 3c3: 89 d8 mov %ebx,%eax + 3c5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3c8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3cb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3ce: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3d1: 76 dd jbe 3b0 + if (neg) { + 3d3: 8b 4d bc mov -0x44(%ebp),%ecx + 3d6: 85 c9 test %ecx,%ecx + 3d8: 74 0c je 3e6 + buf[i++] = '-'; + 3da: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3df: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3e1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3e6: 8b 7d b8 mov -0x48(%ebp),%edi + 3e9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3ed: eb 07 jmp 3f6 + 3ef: 90 nop + putc(fd, buf[i]); + 3f0: 0f b6 13 movzbl (%ebx),%edx + 3f3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3f6: 83 ec 04 sub $0x4,%esp + 3f9: 88 55 d7 mov %dl,-0x29(%ebp) + 3fc: 6a 01 push $0x1 + 3fe: 56 push %esi + 3ff: 57 push %edi + 400: e8 1e ff ff ff call 323 + while (--i >= 0) { + 405: 83 c4 10 add $0x10,%esp + 408: 39 de cmp %ebx,%esi + 40a: 75 e4 jne 3f0 + } +} + 40c: 8d 65 f4 lea -0xc(%ebp),%esp + 40f: 5b pop %ebx + 410: 5e pop %esi + 411: 5f pop %edi + 412: 5d pop %ebp + 413: c3 ret + 414: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 418: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 41f: eb 87 jmp 3a8 + 421: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 428: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42f: 90 nop + +00000430 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 430: 55 push %ebp + 431: 89 e5 mov %esp,%ebp + 433: 57 push %edi + 434: 56 push %esi + 435: 53 push %ebx + 436: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 439: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 43c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 43f: 0f b6 13 movzbl (%ebx),%edx + 442: 84 d2 test %dl,%dl + 444: 74 6a je 4b0 + ap = (uint*)(void*)&fmt + 1; + 446: 8d 45 10 lea 0x10(%ebp),%eax + 449: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 44c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 44f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 451: 89 45 d0 mov %eax,-0x30(%ebp) + 454: eb 36 jmp 48c + 456: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 45d: 8d 76 00 lea 0x0(%esi),%esi + 460: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 463: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 468: 83 f8 25 cmp $0x25,%eax + 46b: 74 15 je 482 + write(fd, &c, 1); + 46d: 83 ec 04 sub $0x4,%esp + 470: 88 55 e7 mov %dl,-0x19(%ebp) + 473: 6a 01 push $0x1 + 475: 57 push %edi + 476: 56 push %esi + 477: e8 a7 fe ff ff call 323 + 47c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 47f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 482: 0f b6 13 movzbl (%ebx),%edx + 485: 83 c3 01 add $0x1,%ebx + 488: 84 d2 test %dl,%dl + 48a: 74 24 je 4b0 + c = fmt[i] & 0xff; + 48c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 48f: 85 c9 test %ecx,%ecx + 491: 74 cd je 460 + } + } + else if (state == '%') { + 493: 83 f9 25 cmp $0x25,%ecx + 496: 75 ea jne 482 + if (c == 'd') { + 498: 83 f8 25 cmp $0x25,%eax + 49b: 0f 84 07 01 00 00 je 5a8 + 4a1: 83 e8 63 sub $0x63,%eax + 4a4: 83 f8 15 cmp $0x15,%eax + 4a7: 77 17 ja 4c0 + 4a9: ff 24 85 74 07 00 00 jmp *0x774(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4b0: 8d 65 f4 lea -0xc(%ebp),%esp + 4b3: 5b pop %ebx + 4b4: 5e pop %esi + 4b5: 5f pop %edi + 4b6: 5d pop %ebp + 4b7: c3 ret + 4b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4bf: 90 nop + write(fd, &c, 1); + 4c0: 83 ec 04 sub $0x4,%esp + 4c3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4c6: 6a 01 push $0x1 + 4c8: 57 push %edi + 4c9: 56 push %esi + 4ca: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4ce: e8 50 fe ff ff call 323 + putc(fd, c); + 4d3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4d7: 83 c4 0c add $0xc,%esp + 4da: 88 55 e7 mov %dl,-0x19(%ebp) + 4dd: 6a 01 push $0x1 + 4df: 57 push %edi + 4e0: 56 push %esi + 4e1: e8 3d fe ff ff call 323 + putc(fd, c); + 4e6: 83 c4 10 add $0x10,%esp + state = 0; + 4e9: 31 c9 xor %ecx,%ecx + 4eb: eb 95 jmp 482 + 4ed: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 4f0: 83 ec 0c sub $0xc,%esp + 4f3: b9 10 00 00 00 mov $0x10,%ecx + 4f8: 6a 00 push $0x0 + 4fa: 8b 45 d0 mov -0x30(%ebp),%eax + 4fd: 8b 10 mov (%eax),%edx + 4ff: 89 f0 mov %esi,%eax + 501: e8 7a fe ff ff call 380 + ap++; + 506: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 50a: 83 c4 10 add $0x10,%esp + state = 0; + 50d: 31 c9 xor %ecx,%ecx + 50f: e9 6e ff ff ff jmp 482 + 514: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 518: 8b 45 d0 mov -0x30(%ebp),%eax + 51b: 8b 10 mov (%eax),%edx + ap++; + 51d: 83 c0 04 add $0x4,%eax + 520: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 523: 85 d2 test %edx,%edx + 525: 0f 84 8d 00 00 00 je 5b8 + while (*s != 0) { + 52b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 52e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 530: 84 c0 test %al,%al + 532: 0f 84 4a ff ff ff je 482 + 538: 89 5d d4 mov %ebx,-0x2c(%ebp) + 53b: 89 d3 mov %edx,%ebx + 53d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 540: 83 ec 04 sub $0x4,%esp + s++; + 543: 83 c3 01 add $0x1,%ebx + 546: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 549: 6a 01 push $0x1 + 54b: 57 push %edi + 54c: 56 push %esi + 54d: e8 d1 fd ff ff call 323 + while (*s != 0) { + 552: 0f b6 03 movzbl (%ebx),%eax + 555: 83 c4 10 add $0x10,%esp + 558: 84 c0 test %al,%al + 55a: 75 e4 jne 540 + state = 0; + 55c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 55f: 31 c9 xor %ecx,%ecx + 561: e9 1c ff ff ff jmp 482 + 566: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 56d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 570: 83 ec 0c sub $0xc,%esp + 573: b9 0a 00 00 00 mov $0xa,%ecx + 578: 6a 01 push $0x1 + 57a: e9 7b ff ff ff jmp 4fa + 57f: 90 nop + putc(fd, *ap); + 580: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 583: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 586: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 588: 6a 01 push $0x1 + 58a: 57 push %edi + 58b: 56 push %esi + putc(fd, *ap); + 58c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 58f: e8 8f fd ff ff call 323 + ap++; + 594: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 598: 83 c4 10 add $0x10,%esp + state = 0; + 59b: 31 c9 xor %ecx,%ecx + 59d: e9 e0 fe ff ff jmp 482 + 5a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5a8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5ab: 83 ec 04 sub $0x4,%esp + 5ae: e9 2a ff ff ff jmp 4dd + 5b3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5b7: 90 nop + s = "(null)"; + 5b8: ba 6c 07 00 00 mov $0x76c,%edx + while (*s != 0) { + 5bd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5c0: b8 28 00 00 00 mov $0x28,%eax + 5c5: 89 d3 mov %edx,%ebx + 5c7: e9 74 ff ff ff jmp 540 + 5cc: 66 90 xchg %ax,%ax + 5ce: 66 90 xchg %ax,%ax + +000005d0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5d0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5d1: a1 84 0a 00 00 mov 0xa84,%eax +void free(void *ap) { + 5d6: 89 e5 mov %esp,%ebp + 5d8: 57 push %edi + 5d9: 56 push %esi + 5da: 53 push %ebx + 5db: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5de: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5e8: 89 c2 mov %eax,%edx + 5ea: 8b 00 mov (%eax),%eax + 5ec: 39 ca cmp %ecx,%edx + 5ee: 73 30 jae 620 + 5f0: 39 c1 cmp %eax,%ecx + 5f2: 72 04 jb 5f8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5f4: 39 c2 cmp %eax,%edx + 5f6: 72 f0 jb 5e8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 5f8: 8b 73 fc mov -0x4(%ebx),%esi + 5fb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5fe: 39 f8 cmp %edi,%eax + 600: 74 30 je 632 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 602: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 605: 8b 42 04 mov 0x4(%edx),%eax + 608: 8d 34 c2 lea (%edx,%eax,8),%esi + 60b: 39 f1 cmp %esi,%ecx + 60d: 74 3a je 649 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 60f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 611: 5b pop %ebx + freep = p; + 612: 89 15 84 0a 00 00 mov %edx,0xa84 +} + 618: 5e pop %esi + 619: 5f pop %edi + 61a: 5d pop %ebp + 61b: c3 ret + 61c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 620: 39 c2 cmp %eax,%edx + 622: 72 c4 jb 5e8 + 624: 39 c1 cmp %eax,%ecx + 626: 73 c0 jae 5e8 + if (bp + bp->s.size == p->s.ptr) { + 628: 8b 73 fc mov -0x4(%ebx),%esi + 62b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 62e: 39 f8 cmp %edi,%eax + 630: 75 d0 jne 602 + bp->s.size += p->s.ptr->s.size; + 632: 03 70 04 add 0x4(%eax),%esi + 635: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 638: 8b 02 mov (%edx),%eax + 63a: 8b 00 mov (%eax),%eax + 63c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 63f: 8b 42 04 mov 0x4(%edx),%eax + 642: 8d 34 c2 lea (%edx,%eax,8),%esi + 645: 39 f1 cmp %esi,%ecx + 647: 75 c6 jne 60f + p->s.size += bp->s.size; + 649: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 64c: 89 15 84 0a 00 00 mov %edx,0xa84 + p->s.size += bp->s.size; + 652: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 655: 8b 4b f8 mov -0x8(%ebx),%ecx + 658: 89 0a mov %ecx,(%edx) +} + 65a: 5b pop %ebx + 65b: 5e pop %esi + 65c: 5f pop %edi + 65d: 5d pop %ebp + 65e: c3 ret + 65f: 90 nop + +00000660 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 660: 55 push %ebp + 661: 89 e5 mov %esp,%ebp + 663: 57 push %edi + 664: 56 push %esi + 665: 53 push %ebx + 666: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 669: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 66c: 8b 3d 84 0a 00 00 mov 0xa84,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 672: 8d 70 07 lea 0x7(%eax),%esi + 675: c1 ee 03 shr $0x3,%esi + 678: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 67b: 85 ff test %edi,%edi + 67d: 0f 84 9d 00 00 00 je 720 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 683: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 685: 8b 4a 04 mov 0x4(%edx),%ecx + 688: 39 f1 cmp %esi,%ecx + 68a: 73 6a jae 6f6 + 68c: bb 00 10 00 00 mov $0x1000,%ebx + 691: 39 de cmp %ebx,%esi + 693: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 696: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 69d: 89 45 e4 mov %eax,-0x1c(%ebp) + 6a0: eb 17 jmp 6b9 + 6a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6a8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6aa: 8b 48 04 mov 0x4(%eax),%ecx + 6ad: 39 f1 cmp %esi,%ecx + 6af: 73 4f jae 700 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6b1: 8b 3d 84 0a 00 00 mov 0xa84,%edi + 6b7: 89 c2 mov %eax,%edx + 6b9: 39 d7 cmp %edx,%edi + 6bb: 75 eb jne 6a8 + p = sbrk(nu * sizeof(Header)); + 6bd: 83 ec 0c sub $0xc,%esp + 6c0: ff 75 e4 push -0x1c(%ebp) + 6c3: e8 3b fc ff ff call 303 + if (p == (char*)-1) { + 6c8: 83 c4 10 add $0x10,%esp + 6cb: 83 f8 ff cmp $0xffffffff,%eax + 6ce: 74 1c je 6ec + hp->s.size = nu; + 6d0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6d3: 83 ec 0c sub $0xc,%esp + 6d6: 83 c0 08 add $0x8,%eax + 6d9: 50 push %eax + 6da: e8 f1 fe ff ff call 5d0 + return freep; + 6df: 8b 15 84 0a 00 00 mov 0xa84,%edx + if ((p = morecore(nunits)) == 0) { + 6e5: 83 c4 10 add $0x10,%esp + 6e8: 85 d2 test %edx,%edx + 6ea: 75 bc jne 6a8 + return 0; + } + } + } +} + 6ec: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6ef: 31 c0 xor %eax,%eax +} + 6f1: 5b pop %ebx + 6f2: 5e pop %esi + 6f3: 5f pop %edi + 6f4: 5d pop %ebp + 6f5: c3 ret + if (p->s.size >= nunits) { + 6f6: 89 d0 mov %edx,%eax + 6f8: 89 fa mov %edi,%edx + 6fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 700: 39 ce cmp %ecx,%esi + 702: 74 4c je 750 + p->s.size -= nunits; + 704: 29 f1 sub %esi,%ecx + 706: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 709: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 70c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 70f: 89 15 84 0a 00 00 mov %edx,0xa84 +} + 715: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 718: 83 c0 08 add $0x8,%eax +} + 71b: 5b pop %ebx + 71c: 5e pop %esi + 71d: 5f pop %edi + 71e: 5d pop %ebp + 71f: c3 ret + base.s.ptr = freep = prevp = &base; + 720: c7 05 84 0a 00 00 88 movl $0xa88,0xa84 + 727: 0a 00 00 + base.s.size = 0; + 72a: bf 88 0a 00 00 mov $0xa88,%edi + base.s.ptr = freep = prevp = &base; + 72f: c7 05 88 0a 00 00 88 movl $0xa88,0xa88 + 736: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 739: 89 fa mov %edi,%edx + base.s.size = 0; + 73b: c7 05 8c 0a 00 00 00 movl $0x0,0xa8c + 742: 00 00 00 + if (p->s.size >= nunits) { + 745: e9 42 ff ff ff jmp 68c + 74a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 750: 8b 08 mov (%eax),%ecx + 752: 89 0a mov %ecx,(%edx) + 754: eb b9 jmp 70f diff --git a/kill.d b/kill.d new file mode 100644 index 0000000..078f4f8 --- /dev/null +++ b/kill.d @@ -0,0 +1 @@ +kill.o: kill.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/kill.o b/kill.o new file mode 100644 index 0000000000000000000000000000000000000000..08b19df3ae009da16578f066374b3a8d2ee5baba GIT binary patch literal 3472 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 literal 0 HcmV?d00001 diff --git a/ln.asm b/ln.asm new file mode 100644 index 0000000..c9194d9 --- /dev/null +++ b/ln.asm @@ -0,0 +1,1181 @@ + +_ln: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + if (argc != 3) { + a: 83 39 03 cmpl $0x3,(%ecx) +int main(int argc, char *argv[]) { + d: 55 push %ebp + e: 89 e5 mov %esp,%ebp + 10: 53 push %ebx + 11: 51 push %ecx + 12: 8b 59 04 mov 0x4(%ecx),%ebx + if (argc != 3) { + 15: 74 13 je 2a + printf(2, "Usage: ln old new\n"); + 17: 52 push %edx + 18: 52 push %edx + 19: 68 58 07 00 00 push $0x758 + 1e: 6a 02 push $0x2 + 20: e8 0b 04 00 00 call 430 + exit(); + 25: e8 89 02 00 00 call 2b3 + } + if (link(argv[1], argv[2]) < 0) { + 2a: 50 push %eax + 2b: 50 push %eax + 2c: ff 73 08 push 0x8(%ebx) + 2f: ff 73 04 push 0x4(%ebx) + 32: e8 04 03 00 00 call 33b + 37: 83 c4 10 add $0x10,%esp + 3a: 85 c0 test %eax,%eax + 3c: 78 05 js 43 + printf(2, "link %s %s: failed\n", argv[1], argv[2]); + } + exit(); + 3e: e8 70 02 00 00 call 2b3 + printf(2, "link %s %s: failed\n", argv[1], argv[2]); + 43: ff 73 08 push 0x8(%ebx) + 46: ff 73 04 push 0x4(%ebx) + 49: 68 6b 07 00 00 push $0x76b + 4e: 6a 02 push $0x2 + 50: e8 db 03 00 00 call 430 + 55: 83 c4 10 add $0x10,%esp + 58: eb e4 jmp 3e + 5a: 66 90 xchg %ax,%ax + 5c: 66 90 xchg %ax,%ax + 5e: 66 90 xchg %ax,%ax + +00000060 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 60: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 61: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 63: 89 e5 mov %esp,%ebp + 65: 53 push %ebx + 66: 8b 4d 08 mov 0x8(%ebp),%ecx + 69: 8b 5d 0c mov 0xc(%ebp),%ebx + 6c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 70: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 74: 88 14 01 mov %dl,(%ecx,%eax,1) + 77: 83 c0 01 add $0x1,%eax + 7a: 84 d2 test %dl,%dl + 7c: 75 f2 jne 70 + ; + } + return os; +} + 7e: 8b 5d fc mov -0x4(%ebp),%ebx + 81: 89 c8 mov %ecx,%eax + 83: c9 leave + 84: c3 ret + 85: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 8c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000090 : + +int strcmp(const char *p, const char *q) { + 90: 55 push %ebp + 91: 89 e5 mov %esp,%ebp + 93: 53 push %ebx + 94: 8b 55 08 mov 0x8(%ebp),%edx + 97: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 9a: 0f b6 02 movzbl (%edx),%eax + 9d: 84 c0 test %al,%al + 9f: 75 17 jne b8 + a1: eb 3a jmp dd + a3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + a7: 90 nop + a8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + ac: 83 c2 01 add $0x1,%edx + af: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + b2: 84 c0 test %al,%al + b4: 74 1a je d0 + p++, q++; + b6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + b8: 0f b6 19 movzbl (%ecx),%ebx + bb: 38 c3 cmp %al,%bl + bd: 74 e9 je a8 + } + return (uchar) * p - (uchar) * q; + bf: 29 d8 sub %ebx,%eax +} + c1: 8b 5d fc mov -0x4(%ebp),%ebx + c4: c9 leave + c5: c3 ret + c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + cd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + d0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + d4: 31 c0 xor %eax,%eax + d6: 29 d8 sub %ebx,%eax +} + d8: 8b 5d fc mov -0x4(%ebp),%ebx + db: c9 leave + dc: c3 ret + return (uchar) * p - (uchar) * q; + dd: 0f b6 19 movzbl (%ecx),%ebx + e0: 31 c0 xor %eax,%eax + e2: eb db jmp bf + e4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + eb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ef: 90 nop + +000000f0 : + +uint strlen(const char *s) { + f0: 55 push %ebp + f1: 89 e5 mov %esp,%ebp + f3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + f6: 80 3a 00 cmpb $0x0,(%edx) + f9: 74 15 je 110 + fb: 31 c0 xor %eax,%eax + fd: 8d 76 00 lea 0x0(%esi),%esi + 100: 83 c0 01 add $0x1,%eax + 103: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 107: 89 c1 mov %eax,%ecx + 109: 75 f5 jne 100 + ; + } + return n; +} + 10b: 89 c8 mov %ecx,%eax + 10d: 5d pop %ebp + 10e: c3 ret + 10f: 90 nop + for (n = 0; s[n]; n++) { + 110: 31 c9 xor %ecx,%ecx +} + 112: 5d pop %ebp + 113: 89 c8 mov %ecx,%eax + 115: c3 ret + 116: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 11d: 8d 76 00 lea 0x0(%esi),%esi + +00000120 : + +void* memset(void *dst, int c, uint n) { + 120: 55 push %ebp + 121: 89 e5 mov %esp,%ebp + 123: 57 push %edi + 124: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 127: 8b 4d 10 mov 0x10(%ebp),%ecx + 12a: 8b 45 0c mov 0xc(%ebp),%eax + 12d: 89 d7 mov %edx,%edi + 12f: fc cld + 130: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 132: 8b 7d fc mov -0x4(%ebp),%edi + 135: 89 d0 mov %edx,%eax + 137: c9 leave + 138: c3 ret + 139: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000140 : + +char* strchr(const char *s, char c) { + 140: 55 push %ebp + 141: 89 e5 mov %esp,%ebp + 143: 8b 45 08 mov 0x8(%ebp),%eax + 146: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 14a: 0f b6 10 movzbl (%eax),%edx + 14d: 84 d2 test %dl,%dl + 14f: 75 12 jne 163 + 151: eb 1d jmp 170 + 153: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 157: 90 nop + 158: 0f b6 50 01 movzbl 0x1(%eax),%edx + 15c: 83 c0 01 add $0x1,%eax + 15f: 84 d2 test %dl,%dl + 161: 74 0d je 170 + if (*s == c) { + 163: 38 d1 cmp %dl,%cl + 165: 75 f1 jne 158 + return (char*)s; + } + } + return 0; +} + 167: 5d pop %ebp + 168: c3 ret + 169: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 170: 31 c0 xor %eax,%eax +} + 172: 5d pop %ebp + 173: c3 ret + 174: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 17b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 17f: 90 nop + +00000180 : + +char* gets(char *buf, int max) { + 180: 55 push %ebp + 181: 89 e5 mov %esp,%ebp + 183: 57 push %edi + 184: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 185: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 188: 53 push %ebx + for (i = 0; i + 1 < max;) { + 189: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 18b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 18e: eb 27 jmp 1b7 + cc = read(0, &c, 1); + 190: 83 ec 04 sub $0x4,%esp + 193: 6a 01 push $0x1 + 195: 57 push %edi + 196: 6a 00 push $0x0 + 198: e8 2e 01 00 00 call 2cb + if (cc < 1) { + 19d: 83 c4 10 add $0x10,%esp + 1a0: 85 c0 test %eax,%eax + 1a2: 7e 1d jle 1c1 + break; + } + buf[i++] = c; + 1a4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1a8: 8b 55 08 mov 0x8(%ebp),%edx + 1ab: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1af: 3c 0a cmp $0xa,%al + 1b1: 74 1d je 1d0 + 1b3: 3c 0d cmp $0xd,%al + 1b5: 74 19 je 1d0 + for (i = 0; i + 1 < max;) { + 1b7: 89 de mov %ebx,%esi + 1b9: 83 c3 01 add $0x1,%ebx + 1bc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1bf: 7c cf jl 190 + break; + } + } + buf[i] = '\0'; + 1c1: 8b 45 08 mov 0x8(%ebp),%eax + 1c4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1c8: 8d 65 f4 lea -0xc(%ebp),%esp + 1cb: 5b pop %ebx + 1cc: 5e pop %esi + 1cd: 5f pop %edi + 1ce: 5d pop %ebp + 1cf: c3 ret + buf[i] = '\0'; + 1d0: 8b 45 08 mov 0x8(%ebp),%eax + 1d3: 89 de mov %ebx,%esi + 1d5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1d9: 8d 65 f4 lea -0xc(%ebp),%esp + 1dc: 5b pop %ebx + 1dd: 5e pop %esi + 1de: 5f pop %edi + 1df: 5d pop %ebp + 1e0: c3 ret + 1e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ef: 90 nop + +000001f0 : + +int stat(const char *n, struct stat *st) { + 1f0: 55 push %ebp + 1f1: 89 e5 mov %esp,%ebp + 1f3: 56 push %esi + 1f4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 1f5: 83 ec 08 sub $0x8,%esp + 1f8: 6a 00 push $0x0 + 1fa: ff 75 08 push 0x8(%ebp) + 1fd: e8 19 01 00 00 call 31b + if (fd < 0) { + 202: 83 c4 10 add $0x10,%esp + 205: 85 c0 test %eax,%eax + 207: 78 27 js 230 + return -1; + } + r = fstat(fd, st); + 209: 83 ec 08 sub $0x8,%esp + 20c: ff 75 0c push 0xc(%ebp) + 20f: 89 c3 mov %eax,%ebx + 211: 50 push %eax + 212: e8 cc 00 00 00 call 2e3 + close(fd); + 217: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 21a: 89 c6 mov %eax,%esi + close(fd); + 21c: e8 2a 01 00 00 call 34b + return r; + 221: 83 c4 10 add $0x10,%esp +} + 224: 8d 65 f8 lea -0x8(%ebp),%esp + 227: 89 f0 mov %esi,%eax + 229: 5b pop %ebx + 22a: 5e pop %esi + 22b: 5d pop %ebp + 22c: c3 ret + 22d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 230: be ff ff ff ff mov $0xffffffff,%esi + 235: eb ed jmp 224 + 237: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 23e: 66 90 xchg %ax,%ax + +00000240 : + +int atoi(const char *s) { + 240: 55 push %ebp + 241: 89 e5 mov %esp,%ebp + 243: 53 push %ebx + 244: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 247: 0f be 02 movsbl (%edx),%eax + 24a: 8d 48 d0 lea -0x30(%eax),%ecx + 24d: 80 f9 09 cmp $0x9,%cl + n = 0; + 250: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 255: 77 1e ja 275 + 257: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 260: 83 c2 01 add $0x1,%edx + 263: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 266: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 26a: 0f be 02 movsbl (%edx),%eax + 26d: 8d 58 d0 lea -0x30(%eax),%ebx + 270: 80 fb 09 cmp $0x9,%bl + 273: 76 eb jbe 260 + } + return n; +} + 275: 8b 5d fc mov -0x4(%ebp),%ebx + 278: 89 c8 mov %ecx,%eax + 27a: c9 leave + 27b: c3 ret + 27c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000280 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 280: 55 push %ebp + 281: 89 e5 mov %esp,%ebp + 283: 57 push %edi + 284: 8b 45 10 mov 0x10(%ebp),%eax + 287: 8b 55 08 mov 0x8(%ebp),%edx + 28a: 56 push %esi + 28b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 28e: 85 c0 test %eax,%eax + 290: 7e 13 jle 2a5 + 292: 01 d0 add %edx,%eax + dst = vdst; + 294: 89 d7 mov %edx,%edi + 296: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2a0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2a1: 39 f8 cmp %edi,%eax + 2a3: 75 fb jne 2a0 + } + return vdst; +} + 2a5: 5e pop %esi + 2a6: 89 d0 mov %edx,%eax + 2a8: 5f pop %edi + 2a9: 5d pop %ebp + 2aa: c3 ret + +000002ab : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2ab: b8 01 00 00 00 mov $0x1,%eax + 2b0: cd 40 int $0x40 + 2b2: c3 ret + +000002b3 : +SYSCALL(exit) + 2b3: b8 02 00 00 00 mov $0x2,%eax + 2b8: cd 40 int $0x40 + 2ba: c3 ret + +000002bb : +SYSCALL(wait) + 2bb: b8 03 00 00 00 mov $0x3,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(pipe) + 2c3: b8 04 00 00 00 mov $0x4,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(read) + 2cb: b8 05 00 00 00 mov $0x5,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(kill) + 2d3: b8 06 00 00 00 mov $0x6,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(exec) + 2db: b8 07 00 00 00 mov $0x7,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(fstat) + 2e3: b8 08 00 00 00 mov $0x8,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(chdir) + 2eb: b8 09 00 00 00 mov $0x9,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(dup) + 2f3: b8 0a 00 00 00 mov $0xa,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(getpid) + 2fb: b8 0b 00 00 00 mov $0xb,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(sbrk) + 303: b8 0c 00 00 00 mov $0xc,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(sleep) + 30b: b8 0d 00 00 00 mov $0xd,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(uptime) + 313: b8 0e 00 00 00 mov $0xe,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(open) + 31b: b8 0f 00 00 00 mov $0xf,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(write) + 323: b8 10 00 00 00 mov $0x10,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(mknod) + 32b: b8 11 00 00 00 mov $0x11,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(unlink) + 333: b8 12 00 00 00 mov $0x12,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(link) + 33b: b8 13 00 00 00 mov $0x13,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(mkdir) + 343: b8 14 00 00 00 mov $0x14,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(close) + 34b: b8 15 00 00 00 mov $0x15,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(getch) + 353: b8 16 00 00 00 mov $0x16,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(greeting) + 35b: b8 17 00 00 00 mov $0x17,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(shutdown) + 363: b8 18 00 00 00 mov $0x18,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(screen) + 36b: b8 19 00 00 00 mov $0x19,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(cls) + 373: b8 1a 00 00 00 mov $0x1a,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + 37b: 66 90 xchg %ax,%ax + 37d: 66 90 xchg %ax,%ax + 37f: 90 nop + +00000380 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 380: 55 push %ebp + 381: 89 e5 mov %esp,%ebp + 383: 57 push %edi + 384: 56 push %esi + 385: 53 push %ebx + 386: 83 ec 3c sub $0x3c,%esp + 389: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 38c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 38e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 391: 85 d2 test %edx,%edx + 393: 0f 89 7f 00 00 00 jns 418 + 399: f6 45 08 01 testb $0x1,0x8(%ebp) + 39d: 74 79 je 418 + neg = 1; + 39f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3a6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3a8: 31 db xor %ebx,%ebx + 3aa: 8d 75 d7 lea -0x29(%ebp),%esi + 3ad: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3b0: 89 c8 mov %ecx,%eax + 3b2: 31 d2 xor %edx,%edx + 3b4: 89 cf mov %ecx,%edi + 3b6: f7 75 c4 divl -0x3c(%ebp) + 3b9: 0f b6 92 e0 07 00 00 movzbl 0x7e0(%edx),%edx + 3c0: 89 45 c0 mov %eax,-0x40(%ebp) + 3c3: 89 d8 mov %ebx,%eax + 3c5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3c8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3cb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3ce: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3d1: 76 dd jbe 3b0 + if (neg) { + 3d3: 8b 4d bc mov -0x44(%ebp),%ecx + 3d6: 85 c9 test %ecx,%ecx + 3d8: 74 0c je 3e6 + buf[i++] = '-'; + 3da: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3df: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3e1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3e6: 8b 7d b8 mov -0x48(%ebp),%edi + 3e9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3ed: eb 07 jmp 3f6 + 3ef: 90 nop + putc(fd, buf[i]); + 3f0: 0f b6 13 movzbl (%ebx),%edx + 3f3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3f6: 83 ec 04 sub $0x4,%esp + 3f9: 88 55 d7 mov %dl,-0x29(%ebp) + 3fc: 6a 01 push $0x1 + 3fe: 56 push %esi + 3ff: 57 push %edi + 400: e8 1e ff ff ff call 323 + while (--i >= 0) { + 405: 83 c4 10 add $0x10,%esp + 408: 39 de cmp %ebx,%esi + 40a: 75 e4 jne 3f0 + } +} + 40c: 8d 65 f4 lea -0xc(%ebp),%esp + 40f: 5b pop %ebx + 410: 5e pop %esi + 411: 5f pop %edi + 412: 5d pop %ebp + 413: c3 ret + 414: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 418: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 41f: eb 87 jmp 3a8 + 421: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 428: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42f: 90 nop + +00000430 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 430: 55 push %ebp + 431: 89 e5 mov %esp,%ebp + 433: 57 push %edi + 434: 56 push %esi + 435: 53 push %ebx + 436: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 439: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 43c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 43f: 0f b6 13 movzbl (%ebx),%edx + 442: 84 d2 test %dl,%dl + 444: 74 6a je 4b0 + ap = (uint*)(void*)&fmt + 1; + 446: 8d 45 10 lea 0x10(%ebp),%eax + 449: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 44c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 44f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 451: 89 45 d0 mov %eax,-0x30(%ebp) + 454: eb 36 jmp 48c + 456: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 45d: 8d 76 00 lea 0x0(%esi),%esi + 460: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 463: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 468: 83 f8 25 cmp $0x25,%eax + 46b: 74 15 je 482 + write(fd, &c, 1); + 46d: 83 ec 04 sub $0x4,%esp + 470: 88 55 e7 mov %dl,-0x19(%ebp) + 473: 6a 01 push $0x1 + 475: 57 push %edi + 476: 56 push %esi + 477: e8 a7 fe ff ff call 323 + 47c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 47f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 482: 0f b6 13 movzbl (%ebx),%edx + 485: 83 c3 01 add $0x1,%ebx + 488: 84 d2 test %dl,%dl + 48a: 74 24 je 4b0 + c = fmt[i] & 0xff; + 48c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 48f: 85 c9 test %ecx,%ecx + 491: 74 cd je 460 + } + } + else if (state == '%') { + 493: 83 f9 25 cmp $0x25,%ecx + 496: 75 ea jne 482 + if (c == 'd') { + 498: 83 f8 25 cmp $0x25,%eax + 49b: 0f 84 07 01 00 00 je 5a8 + 4a1: 83 e8 63 sub $0x63,%eax + 4a4: 83 f8 15 cmp $0x15,%eax + 4a7: 77 17 ja 4c0 + 4a9: ff 24 85 88 07 00 00 jmp *0x788(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4b0: 8d 65 f4 lea -0xc(%ebp),%esp + 4b3: 5b pop %ebx + 4b4: 5e pop %esi + 4b5: 5f pop %edi + 4b6: 5d pop %ebp + 4b7: c3 ret + 4b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4bf: 90 nop + write(fd, &c, 1); + 4c0: 83 ec 04 sub $0x4,%esp + 4c3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4c6: 6a 01 push $0x1 + 4c8: 57 push %edi + 4c9: 56 push %esi + 4ca: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4ce: e8 50 fe ff ff call 323 + putc(fd, c); + 4d3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4d7: 83 c4 0c add $0xc,%esp + 4da: 88 55 e7 mov %dl,-0x19(%ebp) + 4dd: 6a 01 push $0x1 + 4df: 57 push %edi + 4e0: 56 push %esi + 4e1: e8 3d fe ff ff call 323 + putc(fd, c); + 4e6: 83 c4 10 add $0x10,%esp + state = 0; + 4e9: 31 c9 xor %ecx,%ecx + 4eb: eb 95 jmp 482 + 4ed: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 4f0: 83 ec 0c sub $0xc,%esp + 4f3: b9 10 00 00 00 mov $0x10,%ecx + 4f8: 6a 00 push $0x0 + 4fa: 8b 45 d0 mov -0x30(%ebp),%eax + 4fd: 8b 10 mov (%eax),%edx + 4ff: 89 f0 mov %esi,%eax + 501: e8 7a fe ff ff call 380 + ap++; + 506: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 50a: 83 c4 10 add $0x10,%esp + state = 0; + 50d: 31 c9 xor %ecx,%ecx + 50f: e9 6e ff ff ff jmp 482 + 514: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 518: 8b 45 d0 mov -0x30(%ebp),%eax + 51b: 8b 10 mov (%eax),%edx + ap++; + 51d: 83 c0 04 add $0x4,%eax + 520: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 523: 85 d2 test %edx,%edx + 525: 0f 84 8d 00 00 00 je 5b8 + while (*s != 0) { + 52b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 52e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 530: 84 c0 test %al,%al + 532: 0f 84 4a ff ff ff je 482 + 538: 89 5d d4 mov %ebx,-0x2c(%ebp) + 53b: 89 d3 mov %edx,%ebx + 53d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 540: 83 ec 04 sub $0x4,%esp + s++; + 543: 83 c3 01 add $0x1,%ebx + 546: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 549: 6a 01 push $0x1 + 54b: 57 push %edi + 54c: 56 push %esi + 54d: e8 d1 fd ff ff call 323 + while (*s != 0) { + 552: 0f b6 03 movzbl (%ebx),%eax + 555: 83 c4 10 add $0x10,%esp + 558: 84 c0 test %al,%al + 55a: 75 e4 jne 540 + state = 0; + 55c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 55f: 31 c9 xor %ecx,%ecx + 561: e9 1c ff ff ff jmp 482 + 566: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 56d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 570: 83 ec 0c sub $0xc,%esp + 573: b9 0a 00 00 00 mov $0xa,%ecx + 578: 6a 01 push $0x1 + 57a: e9 7b ff ff ff jmp 4fa + 57f: 90 nop + putc(fd, *ap); + 580: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 583: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 586: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 588: 6a 01 push $0x1 + 58a: 57 push %edi + 58b: 56 push %esi + putc(fd, *ap); + 58c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 58f: e8 8f fd ff ff call 323 + ap++; + 594: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 598: 83 c4 10 add $0x10,%esp + state = 0; + 59b: 31 c9 xor %ecx,%ecx + 59d: e9 e0 fe ff ff jmp 482 + 5a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5a8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5ab: 83 ec 04 sub $0x4,%esp + 5ae: e9 2a ff ff ff jmp 4dd + 5b3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5b7: 90 nop + s = "(null)"; + 5b8: ba 7f 07 00 00 mov $0x77f,%edx + while (*s != 0) { + 5bd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5c0: b8 28 00 00 00 mov $0x28,%eax + 5c5: 89 d3 mov %edx,%ebx + 5c7: e9 74 ff ff ff jmp 540 + 5cc: 66 90 xchg %ax,%ax + 5ce: 66 90 xchg %ax,%ax + +000005d0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5d0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5d1: a1 8c 0a 00 00 mov 0xa8c,%eax +void free(void *ap) { + 5d6: 89 e5 mov %esp,%ebp + 5d8: 57 push %edi + 5d9: 56 push %esi + 5da: 53 push %ebx + 5db: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5de: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5e1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5e8: 89 c2 mov %eax,%edx + 5ea: 8b 00 mov (%eax),%eax + 5ec: 39 ca cmp %ecx,%edx + 5ee: 73 30 jae 620 + 5f0: 39 c1 cmp %eax,%ecx + 5f2: 72 04 jb 5f8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5f4: 39 c2 cmp %eax,%edx + 5f6: 72 f0 jb 5e8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 5f8: 8b 73 fc mov -0x4(%ebx),%esi + 5fb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5fe: 39 f8 cmp %edi,%eax + 600: 74 30 je 632 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 602: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 605: 8b 42 04 mov 0x4(%edx),%eax + 608: 8d 34 c2 lea (%edx,%eax,8),%esi + 60b: 39 f1 cmp %esi,%ecx + 60d: 74 3a je 649 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 60f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 611: 5b pop %ebx + freep = p; + 612: 89 15 8c 0a 00 00 mov %edx,0xa8c +} + 618: 5e pop %esi + 619: 5f pop %edi + 61a: 5d pop %ebp + 61b: c3 ret + 61c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 620: 39 c2 cmp %eax,%edx + 622: 72 c4 jb 5e8 + 624: 39 c1 cmp %eax,%ecx + 626: 73 c0 jae 5e8 + if (bp + bp->s.size == p->s.ptr) { + 628: 8b 73 fc mov -0x4(%ebx),%esi + 62b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 62e: 39 f8 cmp %edi,%eax + 630: 75 d0 jne 602 + bp->s.size += p->s.ptr->s.size; + 632: 03 70 04 add 0x4(%eax),%esi + 635: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 638: 8b 02 mov (%edx),%eax + 63a: 8b 00 mov (%eax),%eax + 63c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 63f: 8b 42 04 mov 0x4(%edx),%eax + 642: 8d 34 c2 lea (%edx,%eax,8),%esi + 645: 39 f1 cmp %esi,%ecx + 647: 75 c6 jne 60f + p->s.size += bp->s.size; + 649: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 64c: 89 15 8c 0a 00 00 mov %edx,0xa8c + p->s.size += bp->s.size; + 652: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 655: 8b 4b f8 mov -0x8(%ebx),%ecx + 658: 89 0a mov %ecx,(%edx) +} + 65a: 5b pop %ebx + 65b: 5e pop %esi + 65c: 5f pop %edi + 65d: 5d pop %ebp + 65e: c3 ret + 65f: 90 nop + +00000660 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 660: 55 push %ebp + 661: 89 e5 mov %esp,%ebp + 663: 57 push %edi + 664: 56 push %esi + 665: 53 push %ebx + 666: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 669: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 66c: 8b 3d 8c 0a 00 00 mov 0xa8c,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 672: 8d 70 07 lea 0x7(%eax),%esi + 675: c1 ee 03 shr $0x3,%esi + 678: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 67b: 85 ff test %edi,%edi + 67d: 0f 84 9d 00 00 00 je 720 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 683: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 685: 8b 4a 04 mov 0x4(%edx),%ecx + 688: 39 f1 cmp %esi,%ecx + 68a: 73 6a jae 6f6 + 68c: bb 00 10 00 00 mov $0x1000,%ebx + 691: 39 de cmp %ebx,%esi + 693: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 696: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 69d: 89 45 e4 mov %eax,-0x1c(%ebp) + 6a0: eb 17 jmp 6b9 + 6a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6a8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6aa: 8b 48 04 mov 0x4(%eax),%ecx + 6ad: 39 f1 cmp %esi,%ecx + 6af: 73 4f jae 700 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6b1: 8b 3d 8c 0a 00 00 mov 0xa8c,%edi + 6b7: 89 c2 mov %eax,%edx + 6b9: 39 d7 cmp %edx,%edi + 6bb: 75 eb jne 6a8 + p = sbrk(nu * sizeof(Header)); + 6bd: 83 ec 0c sub $0xc,%esp + 6c0: ff 75 e4 push -0x1c(%ebp) + 6c3: e8 3b fc ff ff call 303 + if (p == (char*)-1) { + 6c8: 83 c4 10 add $0x10,%esp + 6cb: 83 f8 ff cmp $0xffffffff,%eax + 6ce: 74 1c je 6ec + hp->s.size = nu; + 6d0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6d3: 83 ec 0c sub $0xc,%esp + 6d6: 83 c0 08 add $0x8,%eax + 6d9: 50 push %eax + 6da: e8 f1 fe ff ff call 5d0 + return freep; + 6df: 8b 15 8c 0a 00 00 mov 0xa8c,%edx + if ((p = morecore(nunits)) == 0) { + 6e5: 83 c4 10 add $0x10,%esp + 6e8: 85 d2 test %edx,%edx + 6ea: 75 bc jne 6a8 + return 0; + } + } + } +} + 6ec: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6ef: 31 c0 xor %eax,%eax +} + 6f1: 5b pop %ebx + 6f2: 5e pop %esi + 6f3: 5f pop %edi + 6f4: 5d pop %ebp + 6f5: c3 ret + if (p->s.size >= nunits) { + 6f6: 89 d0 mov %edx,%eax + 6f8: 89 fa mov %edi,%edx + 6fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 700: 39 ce cmp %ecx,%esi + 702: 74 4c je 750 + p->s.size -= nunits; + 704: 29 f1 sub %esi,%ecx + 706: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 709: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 70c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 70f: 89 15 8c 0a 00 00 mov %edx,0xa8c +} + 715: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 718: 83 c0 08 add $0x8,%eax +} + 71b: 5b pop %ebx + 71c: 5e pop %esi + 71d: 5f pop %edi + 71e: 5d pop %ebp + 71f: c3 ret + base.s.ptr = freep = prevp = &base; + 720: c7 05 8c 0a 00 00 90 movl $0xa90,0xa8c + 727: 0a 00 00 + base.s.size = 0; + 72a: bf 90 0a 00 00 mov $0xa90,%edi + base.s.ptr = freep = prevp = &base; + 72f: c7 05 90 0a 00 00 90 movl $0xa90,0xa90 + 736: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 739: 89 fa mov %edi,%edx + base.s.size = 0; + 73b: c7 05 94 0a 00 00 00 movl $0x0,0xa94 + 742: 00 00 00 + if (p->s.size >= nunits) { + 745: e9 42 ff ff ff jmp 68c + 74a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 750: 8b 08 mov (%eax),%ecx + 752: 89 0a mov %ecx,(%edx) + 754: eb b9 jmp 70f diff --git a/ln.d b/ln.d new file mode 100644 index 0000000..6728be9 --- /dev/null +++ b/ln.d @@ -0,0 +1 @@ +ln.o: ln.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/ln.o b/ln.o new file mode 100644 index 0000000000000000000000000000000000000000..a450647727384289c34998b749a1218c02d3aa2f GIT binary patch literal 3308 zcma)8U1%It6h8B}*<|y-(lm{dZA^c0H`%nLZTe$vv^BMAn-bB0q_ew|-Lbnf>C9}K zmfE6GRMdz1ASi+$>VwZkL3~j3p}q+EV9_TZD)<9ZMMP;Ke&_DJn~5UzuyfCM&iT%{ zckbMuy?Eb|gPNw15{(R6v4}1w8C;ab|x}aFXLBB8P7S>Mpf54nb{EH zH<6jQ-KtY+YvjFrWY}D~c76HO&81z&%nRQiKlb8dW|W?uu5kPb{fC>&%gdrUdUQEV zE{CQtmOkr#_TxoM;D)=BUg0D9^R*O)X_01f9cu*59Ri_gXCOs0TNr72OD`)e`G>Hq z4NwWwa=nOJT2V>wwGO~l!ecZWG8dSwB|5=Ky1=a+X!L~Owyov7Es57Shm%EOirP*1 zHA`^drCB`M8|>^zi%2Jv^-I(_D9m*nS_2o4Tjzm2#b7I%I)fc(rWi~r&kO)_$mF4$ zJTTIRDV5rnGCD!LpPtk%V!jNErl8C&O072;Sv}f@&UDHc92lJG>(RRVFbOgb-?=5H z-Q90=PNa6HcBMA;Po?+tYe-6N6jfStv^x5n*1xBpsBLvtBPX>MLuy|gnM(I)y@~y6 z&xxuX7OAeL(mLp!s~mkF9Khgc9FIlf8v`jxFfhr~FPWw}te--&mGRbb#^bZVbUP@z zNLb0{FQKFhKvfn?WR^VX;>CnLaigRrY?Ky;9s2e`3@$P&G+ zv8=Q;l;}BZCCk>(?nkZUUaK`Ra@DeCp*1Uc#j+A-tky^LK9sC`p?Gud*v zRLEo>25H{&vxT}_ja;u`gb~pC=z8Ub)33Qvc0RCcPIkdZhfbi#cJX9(A@C!o z82Qq<;5vxf;aRU(34G75huOM!#`Q|s$Szc!5Wz6wykgZ3D=ORdJ!-yPv0?{Qvt3V| zA0$jWC>LoVK=1Pee446Wu1F&_r{vlr;r!h3v*FReFOS$^=!9X-@uIO?L`4D7)I%r8 z;ovzmIXRKpJX5H9QC&`EHeVNJ{=(Q;Zgl$=>89KG>q4}1)1;kGY6I=2`8<}xFnqkk zSj4irw_T$n-IiXb16@XaG0|=4_4AE*yyexT#H3%B6=rSxW1$;Zpm8xsEYzmUpw=d4 zV30g?rPm-F1~D?i~dt9VUZor;A*@{m5AzMqQy6rA5ko8 zz8`RNU>>nc)^8E-fx3+~hI+TO4?{EW7~A0S6{KM*`0Um2%Hkx)tMZwtL5sSW znjyA9-XeLUQu6`IdHbXm^u^&1wH6Ma(?`I8O23m)vTzIyI%?2F>4P8+v zauy@XmF&o-Tpr`0y~yj4F;6MWfAKaU#%u9bJn{X&8^goG^*C1v_r(vdch+ir zCxCh1DG~b##%?@VuHyT1tcrx4(0s@83BeZ}kBj#U*HiK#Kv&G6;DhkT>%EP7SK#A% z*hbBIj{~b5K>8fU*9@enm=9ZF4!x-pO-K$a6*~zW@3)H1c--7CmUpw?C18~UNZ+7d zhJh3ny9hg8FG4+@Gp>hYqgn4&V3h+%f1w`!*EB`NUV$fG@0r;6_#{>H{2s8%;Ueu= z5CH=zD)uhyc)gcUZ!>&6J|3s4_dYP^jN)OrfO^BK2yBM@d?K~ty@dkP@F`KeFX3RU zc)x?kYf_2geG3O;C7IRNO*8fj2+YH@31QxTiCOV`u>6E4{=S!E^S1^u^}g|1oOc5C pu0!L`q_}UG*Num3sl5hBN3l-Toy)cwdk=7&_YwO2lL=B3?{C~roPPiS literal 0 HcmV?d00001 diff --git a/ln.sym b/ln.sym new file mode 100644 index 0000000..b861a73 --- /dev/null +++ b/ln.sym @@ -0,0 +1,50 @@ +00000000 ln.c +00000000 ulib.c +00000000 printf.c +00000380 printint +000007e0 digits.0 +00000000 umalloc.c +00000a8c freep +00000a90 base +00000060 strcpy +00000430 printf +0000035b greeting +00000280 memmove +0000032b mknod +00000180 gets +000002fb getpid +0000036b screen +00000660 malloc +0000030b sleep +000002c3 pipe +00000353 getch +00000323 write +000002e3 fstat +000002d3 kill +000002eb chdir +000002db exec +000002bb wait +000002cb read +00000333 unlink +000002ab fork +00000303 sbrk +00000313 uptime +00000a8c __bss_start +00000120 memset +00000000 main +00000090 strcmp +00000363 shutdown +000002f3 dup +000001f0 stat +00000a8c _edata +00000a98 _end +0000033b link +000002b3 exit +00000240 atoi +00000373 cls +000000f0 strlen +0000031b open +00000140 strchr +00000343 mkdir +0000034b close +000005d0 free diff --git a/log.d b/log.d new file mode 100644 index 0000000..04c8930 --- /dev/null +++ b/log.d @@ -0,0 +1,2 @@ +log.o: log.c /usr/include/stdc-predef.h types.h defs.h param.h spinlock.h \ + sleeplock.h fs.h buf.h diff --git a/log.o b/log.o new file mode 100644 index 0000000000000000000000000000000000000000..c8fa57c87428c76acaed5e8450d60a3cede1d516 GIT binary patch literal 10232 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 Iz): + close(fd); +} + +int +main(int argc, char *argv[]) +{ + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: bb 01 00 00 00 mov $0x1,%ebx + 15: 51 push %ecx + 16: 83 ec 08 sub $0x8,%esp + 19: 8b 31 mov (%ecx),%esi + 1b: 8b 79 04 mov 0x4(%ecx),%edi + int i; + + if(argc < 2){ + 1e: 83 fe 01 cmp $0x1,%esi + 21: 7e 1f jle 42 + 23: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 27: 90 nop + ls("."); + exit(); + } + for(i=1; i + for(i=1; i + exit(); + 3d: e8 51 05 00 00 call 593 + ls("."); + 42: 83 ec 0c sub $0xc,%esp + 45: 68 80 0a 00 00 push $0xa80 + 4a: e8 b1 00 00 00 call 100 + exit(); + 4f: e8 3f 05 00 00 call 593 + 54: 66 90 xchg %ax,%ax + 56: 66 90 xchg %ax,%ax + 58: 66 90 xchg %ax,%ax + 5a: 66 90 xchg %ax,%ax + 5c: 66 90 xchg %ax,%ax + 5e: 66 90 xchg %ax,%ax + +00000060 : +{ + 60: 55 push %ebp + 61: 89 e5 mov %esp,%ebp + 63: 56 push %esi + 64: 53 push %ebx + 65: 8b 75 08 mov 0x8(%ebp),%esi + for(p=path+strlen(path); p >= path && *p != '/'; p--) + 68: 83 ec 0c sub $0xc,%esp + 6b: 56 push %esi + 6c: e8 5f 03 00 00 call 3d0 + 71: 83 c4 10 add $0x10,%esp + 74: 01 f0 add %esi,%eax + 76: 89 c3 mov %eax,%ebx + 78: 73 0f jae 89 + 7a: eb 12 jmp 8e + 7c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 80: 8d 43 ff lea -0x1(%ebx),%eax + 83: 39 c6 cmp %eax,%esi + 85: 77 0a ja 91 + 87: 89 c3 mov %eax,%ebx + 89: 80 3b 2f cmpb $0x2f,(%ebx) + 8c: 75 f2 jne 80 + p++; + 8e: 83 c3 01 add $0x1,%ebx + if(strlen(p) >= DIRSIZ) + 91: 83 ec 0c sub $0xc,%esp + 94: 53 push %ebx + 95: e8 36 03 00 00 call 3d0 + 9a: 83 c4 10 add $0x10,%esp + 9d: 83 f8 0d cmp $0xd,%eax + a0: 77 4a ja ec + memmove(buf, p, strlen(p)); + a2: 83 ec 0c sub $0xc,%esp + a5: 53 push %ebx + a6: e8 25 03 00 00 call 3d0 + ab: 83 c4 0c add $0xc,%esp + ae: 50 push %eax + af: 53 push %ebx + b0: 68 14 0e 00 00 push $0xe14 + b5: e8 a6 04 00 00 call 560 + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + ba: 89 1c 24 mov %ebx,(%esp) + bd: e8 0e 03 00 00 call 3d0 + c2: 89 1c 24 mov %ebx,(%esp) + return buf; + c5: bb 14 0e 00 00 mov $0xe14,%ebx + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + ca: 89 c6 mov %eax,%esi + cc: e8 ff 02 00 00 call 3d0 + d1: ba 0e 00 00 00 mov $0xe,%edx + d6: 83 c4 0c add $0xc,%esp + d9: 29 f2 sub %esi,%edx + db: 05 14 0e 00 00 add $0xe14,%eax + e0: 52 push %edx + e1: 6a 20 push $0x20 + e3: 50 push %eax + e4: e8 17 03 00 00 call 400 + return buf; + e9: 83 c4 10 add $0x10,%esp +} + ec: 8d 65 f8 lea -0x8(%ebp),%esp + ef: 89 d8 mov %ebx,%eax + f1: 5b pop %ebx + f2: 5e pop %esi + f3: 5d pop %ebp + f4: c3 ret + f5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000100 : +{ + 100: 55 push %ebp + 101: 89 e5 mov %esp,%ebp + 103: 57 push %edi + 104: 56 push %esi + 105: 53 push %ebx + 106: 81 ec 64 02 00 00 sub $0x264,%esp + 10c: 8b 7d 08 mov 0x8(%ebp),%edi + if((fd = open(path, 0)) < 0){ + 10f: 6a 00 push $0x0 + 111: 57 push %edi + 112: e8 e4 04 00 00 call 5fb + 117: 83 c4 10 add $0x10,%esp + 11a: 85 c0 test %eax,%eax + 11c: 0f 88 9e 01 00 00 js 2c0 + if(fstat(fd, &st) < 0){ + 122: 83 ec 08 sub $0x8,%esp + 125: 8d b5 d4 fd ff ff lea -0x22c(%ebp),%esi + 12b: 89 c3 mov %eax,%ebx + 12d: 56 push %esi + 12e: 50 push %eax + 12f: e8 8f 04 00 00 call 5c3 + 134: 83 c4 10 add $0x10,%esp + 137: 85 c0 test %eax,%eax + 139: 0f 88 c1 01 00 00 js 300 + switch(st.type){ + 13f: 0f b7 85 d4 fd ff ff movzwl -0x22c(%ebp),%eax + 146: 66 83 f8 01 cmp $0x1,%ax + 14a: 74 64 je 1b0 + 14c: 66 83 f8 02 cmp $0x2,%ax + 150: 74 1e je 170 + close(fd); + 152: 83 ec 0c sub $0xc,%esp + 155: 53 push %ebx + 156: e8 d0 04 00 00 call 62b + 15b: 83 c4 10 add $0x10,%esp +} + 15e: 8d 65 f4 lea -0xc(%ebp),%esp + 161: 5b pop %ebx + 162: 5e pop %esi + 163: 5f pop %edi + 164: 5d pop %ebp + 165: c3 ret + 166: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 16d: 8d 76 00 lea 0x0(%esi),%esi + printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size); + 170: 83 ec 0c sub $0xc,%esp + 173: 8b 95 e4 fd ff ff mov -0x21c(%ebp),%edx + 179: 8b b5 dc fd ff ff mov -0x224(%ebp),%esi + 17f: 57 push %edi + 180: 89 95 b4 fd ff ff mov %edx,-0x24c(%ebp) + 186: e8 d5 fe ff ff call 60 + 18b: 8b 95 b4 fd ff ff mov -0x24c(%ebp),%edx + 191: 59 pop %ecx + 192: 5f pop %edi + 193: 52 push %edx + 194: 56 push %esi + 195: 6a 02 push $0x2 + 197: 50 push %eax + 198: 68 60 0a 00 00 push $0xa60 + 19d: 6a 01 push $0x1 + 19f: e8 6c 05 00 00 call 710 + break; + 1a4: 83 c4 20 add $0x20,%esp + 1a7: eb a9 jmp 152 + 1a9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + 1b0: 83 ec 0c sub $0xc,%esp + 1b3: 57 push %edi + 1b4: e8 17 02 00 00 call 3d0 + 1b9: 83 c4 10 add $0x10,%esp + 1bc: 83 c0 10 add $0x10,%eax + 1bf: 3d 00 02 00 00 cmp $0x200,%eax + 1c4: 0f 87 16 01 00 00 ja 2e0 + strcpy(buf, path); + 1ca: 83 ec 08 sub $0x8,%esp + 1cd: 57 push %edi + 1ce: 8d bd e8 fd ff ff lea -0x218(%ebp),%edi + 1d4: 57 push %edi + 1d5: e8 66 01 00 00 call 340 + p = buf+strlen(buf); + 1da: 89 3c 24 mov %edi,(%esp) + 1dd: e8 ee 01 00 00 call 3d0 + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1e2: 83 c4 10 add $0x10,%esp + p = buf+strlen(buf); + 1e5: 01 f8 add %edi,%eax + *p++ = '/'; + 1e7: 8d 48 01 lea 0x1(%eax),%ecx + p = buf+strlen(buf); + 1ea: 89 85 a8 fd ff ff mov %eax,-0x258(%ebp) + *p++ = '/'; + 1f0: 89 8d a4 fd ff ff mov %ecx,-0x25c(%ebp) + 1f6: c6 00 2f movb $0x2f,(%eax) + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1f9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 200: 83 ec 04 sub $0x4,%esp + 203: 8d 85 c4 fd ff ff lea -0x23c(%ebp),%eax + 209: 6a 10 push $0x10 + 20b: 50 push %eax + 20c: 53 push %ebx + 20d: e8 99 03 00 00 call 5ab + 212: 83 c4 10 add $0x10,%esp + 215: 83 f8 10 cmp $0x10,%eax + 218: 0f 85 34 ff ff ff jne 152 + if(de.inum == 0) + 21e: 66 83 bd c4 fd ff ff cmpw $0x0,-0x23c(%ebp) + 225: 00 + 226: 74 d8 je 200 + memmove(p, de.name, DIRSIZ); + 228: 83 ec 04 sub $0x4,%esp + 22b: 8d 85 c6 fd ff ff lea -0x23a(%ebp),%eax + 231: 6a 0e push $0xe + 233: 50 push %eax + 234: ff b5 a4 fd ff ff push -0x25c(%ebp) + 23a: e8 21 03 00 00 call 560 + p[DIRSIZ] = 0; + 23f: 8b 85 a8 fd ff ff mov -0x258(%ebp),%eax + 245: c6 40 0f 00 movb $0x0,0xf(%eax) + if(stat(buf, &st) < 0){ + 249: 58 pop %eax + 24a: 5a pop %edx + 24b: 56 push %esi + 24c: 57 push %edi + 24d: e8 7e 02 00 00 call 4d0 + 252: 83 c4 10 add $0x10,%esp + 255: 85 c0 test %eax,%eax + 257: 0f 88 cb 00 00 00 js 328 + printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size); + 25d: 83 ec 0c sub $0xc,%esp + 260: 8b 8d e4 fd ff ff mov -0x21c(%ebp),%ecx + 266: 8b 95 dc fd ff ff mov -0x224(%ebp),%edx + 26c: 57 push %edi + 26d: 0f bf 85 d4 fd ff ff movswl -0x22c(%ebp),%eax + 274: 89 8d ac fd ff ff mov %ecx,-0x254(%ebp) + 27a: 89 95 b0 fd ff ff mov %edx,-0x250(%ebp) + 280: 89 85 b4 fd ff ff mov %eax,-0x24c(%ebp) + 286: e8 d5 fd ff ff call 60 + 28b: 5a pop %edx + 28c: 8b 95 b0 fd ff ff mov -0x250(%ebp),%edx + 292: 59 pop %ecx + 293: 8b 8d ac fd ff ff mov -0x254(%ebp),%ecx + 299: 51 push %ecx + 29a: 52 push %edx + 29b: ff b5 b4 fd ff ff push -0x24c(%ebp) + 2a1: 50 push %eax + 2a2: 68 60 0a 00 00 push $0xa60 + 2a7: 6a 01 push $0x1 + 2a9: e8 62 04 00 00 call 710 + 2ae: 83 c4 20 add $0x20,%esp + 2b1: e9 4a ff ff ff jmp 200 + 2b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2bd: 8d 76 00 lea 0x0(%esi),%esi + printf(2, "ls: cannot open %s\n", path); + 2c0: 83 ec 04 sub $0x4,%esp + 2c3: 57 push %edi + 2c4: 68 38 0a 00 00 push $0xa38 + 2c9: 6a 02 push $0x2 + 2cb: e8 40 04 00 00 call 710 + return; + 2d0: 83 c4 10 add $0x10,%esp +} + 2d3: 8d 65 f4 lea -0xc(%ebp),%esp + 2d6: 5b pop %ebx + 2d7: 5e pop %esi + 2d8: 5f pop %edi + 2d9: 5d pop %ebp + 2da: c3 ret + 2db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2df: 90 nop + printf(1, "ls: path too long\n"); + 2e0: 83 ec 08 sub $0x8,%esp + 2e3: 68 6d 0a 00 00 push $0xa6d + 2e8: 6a 01 push $0x1 + 2ea: e8 21 04 00 00 call 710 + break; + 2ef: 83 c4 10 add $0x10,%esp + 2f2: e9 5b fe ff ff jmp 152 + 2f7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2fe: 66 90 xchg %ax,%ax + printf(2, "ls: cannot stat %s\n", path); + 300: 83 ec 04 sub $0x4,%esp + 303: 57 push %edi + 304: 68 4c 0a 00 00 push $0xa4c + 309: 6a 02 push $0x2 + 30b: e8 00 04 00 00 call 710 + close(fd); + 310: 89 1c 24 mov %ebx,(%esp) + 313: e8 13 03 00 00 call 62b + return; + 318: 83 c4 10 add $0x10,%esp +} + 31b: 8d 65 f4 lea -0xc(%ebp),%esp + 31e: 5b pop %ebx + 31f: 5e pop %esi + 320: 5f pop %edi + 321: 5d pop %ebp + 322: c3 ret + 323: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 327: 90 nop + printf(1, "ls: cannot stat %s\n", buf); + 328: 83 ec 04 sub $0x4,%esp + 32b: 57 push %edi + 32c: 68 4c 0a 00 00 push $0xa4c + 331: 6a 01 push $0x1 + 333: e8 d8 03 00 00 call 710 + continue; + 338: 83 c4 10 add $0x10,%esp + 33b: e9 c0 fe ff ff jmp 200 + +00000340 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 340: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 341: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 343: 89 e5 mov %esp,%ebp + 345: 53 push %ebx + 346: 8b 4d 08 mov 0x8(%ebp),%ecx + 349: 8b 5d 0c mov 0xc(%ebp),%ebx + 34c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 350: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 354: 88 14 01 mov %dl,(%ecx,%eax,1) + 357: 83 c0 01 add $0x1,%eax + 35a: 84 d2 test %dl,%dl + 35c: 75 f2 jne 350 + ; + } + return os; +} + 35e: 8b 5d fc mov -0x4(%ebp),%ebx + 361: 89 c8 mov %ecx,%eax + 363: c9 leave + 364: c3 ret + 365: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000370 : + +int strcmp(const char *p, const char *q) { + 370: 55 push %ebp + 371: 89 e5 mov %esp,%ebp + 373: 53 push %ebx + 374: 8b 55 08 mov 0x8(%ebp),%edx + 377: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 37a: 0f b6 02 movzbl (%edx),%eax + 37d: 84 c0 test %al,%al + 37f: 75 17 jne 398 + 381: eb 3a jmp 3bd + 383: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 387: 90 nop + 388: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 38c: 83 c2 01 add $0x1,%edx + 38f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 392: 84 c0 test %al,%al + 394: 74 1a je 3b0 + p++, q++; + 396: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 398: 0f b6 19 movzbl (%ecx),%ebx + 39b: 38 c3 cmp %al,%bl + 39d: 74 e9 je 388 + } + return (uchar) * p - (uchar) * q; + 39f: 29 d8 sub %ebx,%eax +} + 3a1: 8b 5d fc mov -0x4(%ebp),%ebx + 3a4: c9 leave + 3a5: c3 ret + 3a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3ad: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 3b0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 3b4: 31 c0 xor %eax,%eax + 3b6: 29 d8 sub %ebx,%eax +} + 3b8: 8b 5d fc mov -0x4(%ebp),%ebx + 3bb: c9 leave + 3bc: c3 ret + return (uchar) * p - (uchar) * q; + 3bd: 0f b6 19 movzbl (%ecx),%ebx + 3c0: 31 c0 xor %eax,%eax + 3c2: eb db jmp 39f + 3c4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3cb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 3cf: 90 nop + +000003d0 : + +uint strlen(const char *s) { + 3d0: 55 push %ebp + 3d1: 89 e5 mov %esp,%ebp + 3d3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 3d6: 80 3a 00 cmpb $0x0,(%edx) + 3d9: 74 15 je 3f0 + 3db: 31 c0 xor %eax,%eax + 3dd: 8d 76 00 lea 0x0(%esi),%esi + 3e0: 83 c0 01 add $0x1,%eax + 3e3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 3e7: 89 c1 mov %eax,%ecx + 3e9: 75 f5 jne 3e0 + ; + } + return n; +} + 3eb: 89 c8 mov %ecx,%eax + 3ed: 5d pop %ebp + 3ee: c3 ret + 3ef: 90 nop + for (n = 0; s[n]; n++) { + 3f0: 31 c9 xor %ecx,%ecx +} + 3f2: 5d pop %ebp + 3f3: 89 c8 mov %ecx,%eax + 3f5: c3 ret + 3f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3fd: 8d 76 00 lea 0x0(%esi),%esi + +00000400 : + +void* memset(void *dst, int c, uint n) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 57 push %edi + 404: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 407: 8b 4d 10 mov 0x10(%ebp),%ecx + 40a: 8b 45 0c mov 0xc(%ebp),%eax + 40d: 89 d7 mov %edx,%edi + 40f: fc cld + 410: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 412: 8b 7d fc mov -0x4(%ebp),%edi + 415: 89 d0 mov %edx,%eax + 417: c9 leave + 418: c3 ret + 419: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000420 : + +char* strchr(const char *s, char c) { + 420: 55 push %ebp + 421: 89 e5 mov %esp,%ebp + 423: 8b 45 08 mov 0x8(%ebp),%eax + 426: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 42a: 0f b6 10 movzbl (%eax),%edx + 42d: 84 d2 test %dl,%dl + 42f: 75 12 jne 443 + 431: eb 1d jmp 450 + 433: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 437: 90 nop + 438: 0f b6 50 01 movzbl 0x1(%eax),%edx + 43c: 83 c0 01 add $0x1,%eax + 43f: 84 d2 test %dl,%dl + 441: 74 0d je 450 + if (*s == c) { + 443: 38 d1 cmp %dl,%cl + 445: 75 f1 jne 438 + return (char*)s; + } + } + return 0; +} + 447: 5d pop %ebp + 448: c3 ret + 449: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 450: 31 c0 xor %eax,%eax +} + 452: 5d pop %ebp + 453: c3 ret + 454: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 45b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 45f: 90 nop + +00000460 : + +char* gets(char *buf, int max) { + 460: 55 push %ebp + 461: 89 e5 mov %esp,%ebp + 463: 57 push %edi + 464: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 465: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 468: 53 push %ebx + for (i = 0; i + 1 < max;) { + 469: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 46b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 46e: eb 27 jmp 497 + cc = read(0, &c, 1); + 470: 83 ec 04 sub $0x4,%esp + 473: 6a 01 push $0x1 + 475: 57 push %edi + 476: 6a 00 push $0x0 + 478: e8 2e 01 00 00 call 5ab + if (cc < 1) { + 47d: 83 c4 10 add $0x10,%esp + 480: 85 c0 test %eax,%eax + 482: 7e 1d jle 4a1 + break; + } + buf[i++] = c; + 484: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 488: 8b 55 08 mov 0x8(%ebp),%edx + 48b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 48f: 3c 0a cmp $0xa,%al + 491: 74 1d je 4b0 + 493: 3c 0d cmp $0xd,%al + 495: 74 19 je 4b0 + for (i = 0; i + 1 < max;) { + 497: 89 de mov %ebx,%esi + 499: 83 c3 01 add $0x1,%ebx + 49c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 49f: 7c cf jl 470 + break; + } + } + buf[i] = '\0'; + 4a1: 8b 45 08 mov 0x8(%ebp),%eax + 4a4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 4a8: 8d 65 f4 lea -0xc(%ebp),%esp + 4ab: 5b pop %ebx + 4ac: 5e pop %esi + 4ad: 5f pop %edi + 4ae: 5d pop %ebp + 4af: c3 ret + buf[i] = '\0'; + 4b0: 8b 45 08 mov 0x8(%ebp),%eax + 4b3: 89 de mov %ebx,%esi + 4b5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 4b9: 8d 65 f4 lea -0xc(%ebp),%esp + 4bc: 5b pop %ebx + 4bd: 5e pop %esi + 4be: 5f pop %edi + 4bf: 5d pop %ebp + 4c0: c3 ret + 4c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4cf: 90 nop + +000004d0 : + +int stat(const char *n, struct stat *st) { + 4d0: 55 push %ebp + 4d1: 89 e5 mov %esp,%ebp + 4d3: 56 push %esi + 4d4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 4d5: 83 ec 08 sub $0x8,%esp + 4d8: 6a 00 push $0x0 + 4da: ff 75 08 push 0x8(%ebp) + 4dd: e8 19 01 00 00 call 5fb + if (fd < 0) { + 4e2: 83 c4 10 add $0x10,%esp + 4e5: 85 c0 test %eax,%eax + 4e7: 78 27 js 510 + return -1; + } + r = fstat(fd, st); + 4e9: 83 ec 08 sub $0x8,%esp + 4ec: ff 75 0c push 0xc(%ebp) + 4ef: 89 c3 mov %eax,%ebx + 4f1: 50 push %eax + 4f2: e8 cc 00 00 00 call 5c3 + close(fd); + 4f7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 4fa: 89 c6 mov %eax,%esi + close(fd); + 4fc: e8 2a 01 00 00 call 62b + return r; + 501: 83 c4 10 add $0x10,%esp +} + 504: 8d 65 f8 lea -0x8(%ebp),%esp + 507: 89 f0 mov %esi,%eax + 509: 5b pop %ebx + 50a: 5e pop %esi + 50b: 5d pop %ebp + 50c: c3 ret + 50d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 510: be ff ff ff ff mov $0xffffffff,%esi + 515: eb ed jmp 504 + 517: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 51e: 66 90 xchg %ax,%ax + +00000520 : + +int atoi(const char *s) { + 520: 55 push %ebp + 521: 89 e5 mov %esp,%ebp + 523: 53 push %ebx + 524: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 527: 0f be 02 movsbl (%edx),%eax + 52a: 8d 48 d0 lea -0x30(%eax),%ecx + 52d: 80 f9 09 cmp $0x9,%cl + n = 0; + 530: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 535: 77 1e ja 555 + 537: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 53e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 540: 83 c2 01 add $0x1,%edx + 543: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 546: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 54a: 0f be 02 movsbl (%edx),%eax + 54d: 8d 58 d0 lea -0x30(%eax),%ebx + 550: 80 fb 09 cmp $0x9,%bl + 553: 76 eb jbe 540 + } + return n; +} + 555: 8b 5d fc mov -0x4(%ebp),%ebx + 558: 89 c8 mov %ecx,%eax + 55a: c9 leave + 55b: c3 ret + 55c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000560 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 560: 55 push %ebp + 561: 89 e5 mov %esp,%ebp + 563: 57 push %edi + 564: 8b 45 10 mov 0x10(%ebp),%eax + 567: 8b 55 08 mov 0x8(%ebp),%edx + 56a: 56 push %esi + 56b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 56e: 85 c0 test %eax,%eax + 570: 7e 13 jle 585 + 572: 01 d0 add %edx,%eax + dst = vdst; + 574: 89 d7 mov %edx,%edi + 576: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 57d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 580: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 581: 39 f8 cmp %edi,%eax + 583: 75 fb jne 580 + } + return vdst; +} + 585: 5e pop %esi + 586: 89 d0 mov %edx,%eax + 588: 5f pop %edi + 589: 5d pop %ebp + 58a: c3 ret + +0000058b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 58b: b8 01 00 00 00 mov $0x1,%eax + 590: cd 40 int $0x40 + 592: c3 ret + +00000593 : +SYSCALL(exit) + 593: b8 02 00 00 00 mov $0x2,%eax + 598: cd 40 int $0x40 + 59a: c3 ret + +0000059b : +SYSCALL(wait) + 59b: b8 03 00 00 00 mov $0x3,%eax + 5a0: cd 40 int $0x40 + 5a2: c3 ret + +000005a3 : +SYSCALL(pipe) + 5a3: b8 04 00 00 00 mov $0x4,%eax + 5a8: cd 40 int $0x40 + 5aa: c3 ret + +000005ab : +SYSCALL(read) + 5ab: b8 05 00 00 00 mov $0x5,%eax + 5b0: cd 40 int $0x40 + 5b2: c3 ret + +000005b3 : +SYSCALL(kill) + 5b3: b8 06 00 00 00 mov $0x6,%eax + 5b8: cd 40 int $0x40 + 5ba: c3 ret + +000005bb : +SYSCALL(exec) + 5bb: b8 07 00 00 00 mov $0x7,%eax + 5c0: cd 40 int $0x40 + 5c2: c3 ret + +000005c3 : +SYSCALL(fstat) + 5c3: b8 08 00 00 00 mov $0x8,%eax + 5c8: cd 40 int $0x40 + 5ca: c3 ret + +000005cb : +SYSCALL(chdir) + 5cb: b8 09 00 00 00 mov $0x9,%eax + 5d0: cd 40 int $0x40 + 5d2: c3 ret + +000005d3 : +SYSCALL(dup) + 5d3: b8 0a 00 00 00 mov $0xa,%eax + 5d8: cd 40 int $0x40 + 5da: c3 ret + +000005db : +SYSCALL(getpid) + 5db: b8 0b 00 00 00 mov $0xb,%eax + 5e0: cd 40 int $0x40 + 5e2: c3 ret + +000005e3 : +SYSCALL(sbrk) + 5e3: b8 0c 00 00 00 mov $0xc,%eax + 5e8: cd 40 int $0x40 + 5ea: c3 ret + +000005eb : +SYSCALL(sleep) + 5eb: b8 0d 00 00 00 mov $0xd,%eax + 5f0: cd 40 int $0x40 + 5f2: c3 ret + +000005f3 : +SYSCALL(uptime) + 5f3: b8 0e 00 00 00 mov $0xe,%eax + 5f8: cd 40 int $0x40 + 5fa: c3 ret + +000005fb : +SYSCALL(open) + 5fb: b8 0f 00 00 00 mov $0xf,%eax + 600: cd 40 int $0x40 + 602: c3 ret + +00000603 : +SYSCALL(write) + 603: b8 10 00 00 00 mov $0x10,%eax + 608: cd 40 int $0x40 + 60a: c3 ret + +0000060b : +SYSCALL(mknod) + 60b: b8 11 00 00 00 mov $0x11,%eax + 610: cd 40 int $0x40 + 612: c3 ret + +00000613 : +SYSCALL(unlink) + 613: b8 12 00 00 00 mov $0x12,%eax + 618: cd 40 int $0x40 + 61a: c3 ret + +0000061b : +SYSCALL(link) + 61b: b8 13 00 00 00 mov $0x13,%eax + 620: cd 40 int $0x40 + 622: c3 ret + +00000623 : +SYSCALL(mkdir) + 623: b8 14 00 00 00 mov $0x14,%eax + 628: cd 40 int $0x40 + 62a: c3 ret + +0000062b : +SYSCALL(close) + 62b: b8 15 00 00 00 mov $0x15,%eax + 630: cd 40 int $0x40 + 632: c3 ret + +00000633 : +SYSCALL(getch) + 633: b8 16 00 00 00 mov $0x16,%eax + 638: cd 40 int $0x40 + 63a: c3 ret + +0000063b : +SYSCALL(greeting) + 63b: b8 17 00 00 00 mov $0x17,%eax + 640: cd 40 int $0x40 + 642: c3 ret + +00000643 : +SYSCALL(shutdown) + 643: b8 18 00 00 00 mov $0x18,%eax + 648: cd 40 int $0x40 + 64a: c3 ret + +0000064b : +SYSCALL(screen) + 64b: b8 19 00 00 00 mov $0x19,%eax + 650: cd 40 int $0x40 + 652: c3 ret + +00000653 : +SYSCALL(cls) + 653: b8 1a 00 00 00 mov $0x1a,%eax + 658: cd 40 int $0x40 + 65a: c3 ret + 65b: 66 90 xchg %ax,%ax + 65d: 66 90 xchg %ax,%ax + 65f: 90 nop + +00000660 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 660: 55 push %ebp + 661: 89 e5 mov %esp,%ebp + 663: 57 push %edi + 664: 56 push %esi + 665: 53 push %ebx + 666: 83 ec 3c sub $0x3c,%esp + 669: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 66c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 66e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 671: 85 d2 test %edx,%edx + 673: 0f 89 7f 00 00 00 jns 6f8 + 679: f6 45 08 01 testb $0x1,0x8(%ebp) + 67d: 74 79 je 6f8 + neg = 1; + 67f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 686: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 688: 31 db xor %ebx,%ebx + 68a: 8d 75 d7 lea -0x29(%ebp),%esi + 68d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 690: 89 c8 mov %ecx,%eax + 692: 31 d2 xor %edx,%edx + 694: 89 cf mov %ecx,%edi + 696: f7 75 c4 divl -0x3c(%ebp) + 699: 0f b6 92 e4 0a 00 00 movzbl 0xae4(%edx),%edx + 6a0: 89 45 c0 mov %eax,-0x40(%ebp) + 6a3: 89 d8 mov %ebx,%eax + 6a5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 6a8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 6ab: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 6ae: 39 7d c4 cmp %edi,-0x3c(%ebp) + 6b1: 76 dd jbe 690 + if (neg) { + 6b3: 8b 4d bc mov -0x44(%ebp),%ecx + 6b6: 85 c9 test %ecx,%ecx + 6b8: 74 0c je 6c6 + buf[i++] = '-'; + 6ba: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 6bf: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 6c1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 6c6: 8b 7d b8 mov -0x48(%ebp),%edi + 6c9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 6cd: eb 07 jmp 6d6 + 6cf: 90 nop + putc(fd, buf[i]); + 6d0: 0f b6 13 movzbl (%ebx),%edx + 6d3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 6d6: 83 ec 04 sub $0x4,%esp + 6d9: 88 55 d7 mov %dl,-0x29(%ebp) + 6dc: 6a 01 push $0x1 + 6de: 56 push %esi + 6df: 57 push %edi + 6e0: e8 1e ff ff ff call 603 + while (--i >= 0) { + 6e5: 83 c4 10 add $0x10,%esp + 6e8: 39 de cmp %ebx,%esi + 6ea: 75 e4 jne 6d0 + } +} + 6ec: 8d 65 f4 lea -0xc(%ebp),%esp + 6ef: 5b pop %ebx + 6f0: 5e pop %esi + 6f1: 5f pop %edi + 6f2: 5d pop %ebp + 6f3: c3 ret + 6f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 6f8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 6ff: eb 87 jmp 688 + 701: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 708: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 70f: 90 nop + +00000710 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 710: 55 push %ebp + 711: 89 e5 mov %esp,%ebp + 713: 57 push %edi + 714: 56 push %esi + 715: 53 push %ebx + 716: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 719: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 71c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 71f: 0f b6 13 movzbl (%ebx),%edx + 722: 84 d2 test %dl,%dl + 724: 74 6a je 790 + ap = (uint*)(void*)&fmt + 1; + 726: 8d 45 10 lea 0x10(%ebp),%eax + 729: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 72c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 72f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 731: 89 45 d0 mov %eax,-0x30(%ebp) + 734: eb 36 jmp 76c + 736: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 73d: 8d 76 00 lea 0x0(%esi),%esi + 740: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 743: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 748: 83 f8 25 cmp $0x25,%eax + 74b: 74 15 je 762 + write(fd, &c, 1); + 74d: 83 ec 04 sub $0x4,%esp + 750: 88 55 e7 mov %dl,-0x19(%ebp) + 753: 6a 01 push $0x1 + 755: 57 push %edi + 756: 56 push %esi + 757: e8 a7 fe ff ff call 603 + 75c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 75f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 762: 0f b6 13 movzbl (%ebx),%edx + 765: 83 c3 01 add $0x1,%ebx + 768: 84 d2 test %dl,%dl + 76a: 74 24 je 790 + c = fmt[i] & 0xff; + 76c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 76f: 85 c9 test %ecx,%ecx + 771: 74 cd je 740 + } + } + else if (state == '%') { + 773: 83 f9 25 cmp $0x25,%ecx + 776: 75 ea jne 762 + if (c == 'd') { + 778: 83 f8 25 cmp $0x25,%eax + 77b: 0f 84 07 01 00 00 je 888 + 781: 83 e8 63 sub $0x63,%eax + 784: 83 f8 15 cmp $0x15,%eax + 787: 77 17 ja 7a0 + 789: ff 24 85 8c 0a 00 00 jmp *0xa8c(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 790: 8d 65 f4 lea -0xc(%ebp),%esp + 793: 5b pop %ebx + 794: 5e pop %esi + 795: 5f pop %edi + 796: 5d pop %ebp + 797: c3 ret + 798: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 79f: 90 nop + write(fd, &c, 1); + 7a0: 83 ec 04 sub $0x4,%esp + 7a3: 88 55 d4 mov %dl,-0x2c(%ebp) + 7a6: 6a 01 push $0x1 + 7a8: 57 push %edi + 7a9: 56 push %esi + 7aa: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 7ae: e8 50 fe ff ff call 603 + putc(fd, c); + 7b3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 7b7: 83 c4 0c add $0xc,%esp + 7ba: 88 55 e7 mov %dl,-0x19(%ebp) + 7bd: 6a 01 push $0x1 + 7bf: 57 push %edi + 7c0: 56 push %esi + 7c1: e8 3d fe ff ff call 603 + putc(fd, c); + 7c6: 83 c4 10 add $0x10,%esp + state = 0; + 7c9: 31 c9 xor %ecx,%ecx + 7cb: eb 95 jmp 762 + 7cd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 7d0: 83 ec 0c sub $0xc,%esp + 7d3: b9 10 00 00 00 mov $0x10,%ecx + 7d8: 6a 00 push $0x0 + 7da: 8b 45 d0 mov -0x30(%ebp),%eax + 7dd: 8b 10 mov (%eax),%edx + 7df: 89 f0 mov %esi,%eax + 7e1: e8 7a fe ff ff call 660 + ap++; + 7e6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 7ea: 83 c4 10 add $0x10,%esp + state = 0; + 7ed: 31 c9 xor %ecx,%ecx + 7ef: e9 6e ff ff ff jmp 762 + 7f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 7f8: 8b 45 d0 mov -0x30(%ebp),%eax + 7fb: 8b 10 mov (%eax),%edx + ap++; + 7fd: 83 c0 04 add $0x4,%eax + 800: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 803: 85 d2 test %edx,%edx + 805: 0f 84 8d 00 00 00 je 898 + while (*s != 0) { + 80b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 80e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 810: 84 c0 test %al,%al + 812: 0f 84 4a ff ff ff je 762 + 818: 89 5d d4 mov %ebx,-0x2c(%ebp) + 81b: 89 d3 mov %edx,%ebx + 81d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 820: 83 ec 04 sub $0x4,%esp + s++; + 823: 83 c3 01 add $0x1,%ebx + 826: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 829: 6a 01 push $0x1 + 82b: 57 push %edi + 82c: 56 push %esi + 82d: e8 d1 fd ff ff call 603 + while (*s != 0) { + 832: 0f b6 03 movzbl (%ebx),%eax + 835: 83 c4 10 add $0x10,%esp + 838: 84 c0 test %al,%al + 83a: 75 e4 jne 820 + state = 0; + 83c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 83f: 31 c9 xor %ecx,%ecx + 841: e9 1c ff ff ff jmp 762 + 846: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 84d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 850: 83 ec 0c sub $0xc,%esp + 853: b9 0a 00 00 00 mov $0xa,%ecx + 858: 6a 01 push $0x1 + 85a: e9 7b ff ff ff jmp 7da + 85f: 90 nop + putc(fd, *ap); + 860: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 863: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 866: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 868: 6a 01 push $0x1 + 86a: 57 push %edi + 86b: 56 push %esi + putc(fd, *ap); + 86c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 86f: e8 8f fd ff ff call 603 + ap++; + 874: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 878: 83 c4 10 add $0x10,%esp + state = 0; + 87b: 31 c9 xor %ecx,%ecx + 87d: e9 e0 fe ff ff jmp 762 + 882: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 888: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 88b: 83 ec 04 sub $0x4,%esp + 88e: e9 2a ff ff ff jmp 7bd + 893: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 897: 90 nop + s = "(null)"; + 898: ba 82 0a 00 00 mov $0xa82,%edx + while (*s != 0) { + 89d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 8a0: b8 28 00 00 00 mov $0x28,%eax + 8a5: 89 d3 mov %edx,%ebx + 8a7: e9 74 ff ff ff jmp 820 + 8ac: 66 90 xchg %ax,%ax + 8ae: 66 90 xchg %ax,%ax + +000008b0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 8b0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 8b1: a1 24 0e 00 00 mov 0xe24,%eax +void free(void *ap) { + 8b6: 89 e5 mov %esp,%ebp + 8b8: 57 push %edi + 8b9: 56 push %esi + 8ba: 53 push %ebx + 8bb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 8be: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 8c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 8c8: 89 c2 mov %eax,%edx + 8ca: 8b 00 mov (%eax),%eax + 8cc: 39 ca cmp %ecx,%edx + 8ce: 73 30 jae 900 + 8d0: 39 c1 cmp %eax,%ecx + 8d2: 72 04 jb 8d8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 8d4: 39 c2 cmp %eax,%edx + 8d6: 72 f0 jb 8c8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 8d8: 8b 73 fc mov -0x4(%ebx),%esi + 8db: 8d 3c f1 lea (%ecx,%esi,8),%edi + 8de: 39 f8 cmp %edi,%eax + 8e0: 74 30 je 912 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 8e2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 8e5: 8b 42 04 mov 0x4(%edx),%eax + 8e8: 8d 34 c2 lea (%edx,%eax,8),%esi + 8eb: 39 f1 cmp %esi,%ecx + 8ed: 74 3a je 929 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 8ef: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 8f1: 5b pop %ebx + freep = p; + 8f2: 89 15 24 0e 00 00 mov %edx,0xe24 +} + 8f8: 5e pop %esi + 8f9: 5f pop %edi + 8fa: 5d pop %ebp + 8fb: c3 ret + 8fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 900: 39 c2 cmp %eax,%edx + 902: 72 c4 jb 8c8 + 904: 39 c1 cmp %eax,%ecx + 906: 73 c0 jae 8c8 + if (bp + bp->s.size == p->s.ptr) { + 908: 8b 73 fc mov -0x4(%ebx),%esi + 90b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 90e: 39 f8 cmp %edi,%eax + 910: 75 d0 jne 8e2 + bp->s.size += p->s.ptr->s.size; + 912: 03 70 04 add 0x4(%eax),%esi + 915: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 918: 8b 02 mov (%edx),%eax + 91a: 8b 00 mov (%eax),%eax + 91c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 91f: 8b 42 04 mov 0x4(%edx),%eax + 922: 8d 34 c2 lea (%edx,%eax,8),%esi + 925: 39 f1 cmp %esi,%ecx + 927: 75 c6 jne 8ef + p->s.size += bp->s.size; + 929: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 92c: 89 15 24 0e 00 00 mov %edx,0xe24 + p->s.size += bp->s.size; + 932: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 935: 8b 4b f8 mov -0x8(%ebx),%ecx + 938: 89 0a mov %ecx,(%edx) +} + 93a: 5b pop %ebx + 93b: 5e pop %esi + 93c: 5f pop %edi + 93d: 5d pop %ebp + 93e: c3 ret + 93f: 90 nop + +00000940 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 940: 55 push %ebp + 941: 89 e5 mov %esp,%ebp + 943: 57 push %edi + 944: 56 push %esi + 945: 53 push %ebx + 946: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 949: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 94c: 8b 3d 24 0e 00 00 mov 0xe24,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 952: 8d 70 07 lea 0x7(%eax),%esi + 955: c1 ee 03 shr $0x3,%esi + 958: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 95b: 85 ff test %edi,%edi + 95d: 0f 84 9d 00 00 00 je a00 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 963: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 965: 8b 4a 04 mov 0x4(%edx),%ecx + 968: 39 f1 cmp %esi,%ecx + 96a: 73 6a jae 9d6 + 96c: bb 00 10 00 00 mov $0x1000,%ebx + 971: 39 de cmp %ebx,%esi + 973: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 976: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 97d: 89 45 e4 mov %eax,-0x1c(%ebp) + 980: eb 17 jmp 999 + 982: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 988: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 98a: 8b 48 04 mov 0x4(%eax),%ecx + 98d: 39 f1 cmp %esi,%ecx + 98f: 73 4f jae 9e0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 991: 8b 3d 24 0e 00 00 mov 0xe24,%edi + 997: 89 c2 mov %eax,%edx + 999: 39 d7 cmp %edx,%edi + 99b: 75 eb jne 988 + p = sbrk(nu * sizeof(Header)); + 99d: 83 ec 0c sub $0xc,%esp + 9a0: ff 75 e4 push -0x1c(%ebp) + 9a3: e8 3b fc ff ff call 5e3 + if (p == (char*)-1) { + 9a8: 83 c4 10 add $0x10,%esp + 9ab: 83 f8 ff cmp $0xffffffff,%eax + 9ae: 74 1c je 9cc + hp->s.size = nu; + 9b0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 9b3: 83 ec 0c sub $0xc,%esp + 9b6: 83 c0 08 add $0x8,%eax + 9b9: 50 push %eax + 9ba: e8 f1 fe ff ff call 8b0 + return freep; + 9bf: 8b 15 24 0e 00 00 mov 0xe24,%edx + if ((p = morecore(nunits)) == 0) { + 9c5: 83 c4 10 add $0x10,%esp + 9c8: 85 d2 test %edx,%edx + 9ca: 75 bc jne 988 + return 0; + } + } + } +} + 9cc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 9cf: 31 c0 xor %eax,%eax +} + 9d1: 5b pop %ebx + 9d2: 5e pop %esi + 9d3: 5f pop %edi + 9d4: 5d pop %ebp + 9d5: c3 ret + if (p->s.size >= nunits) { + 9d6: 89 d0 mov %edx,%eax + 9d8: 89 fa mov %edi,%edx + 9da: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 9e0: 39 ce cmp %ecx,%esi + 9e2: 74 4c je a30 + p->s.size -= nunits; + 9e4: 29 f1 sub %esi,%ecx + 9e6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 9e9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 9ec: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 9ef: 89 15 24 0e 00 00 mov %edx,0xe24 +} + 9f5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 9f8: 83 c0 08 add $0x8,%eax +} + 9fb: 5b pop %ebx + 9fc: 5e pop %esi + 9fd: 5f pop %edi + 9fe: 5d pop %ebp + 9ff: c3 ret + base.s.ptr = freep = prevp = &base; + a00: c7 05 24 0e 00 00 28 movl $0xe28,0xe24 + a07: 0e 00 00 + base.s.size = 0; + a0a: bf 28 0e 00 00 mov $0xe28,%edi + base.s.ptr = freep = prevp = &base; + a0f: c7 05 28 0e 00 00 28 movl $0xe28,0xe28 + a16: 0e 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + a19: 89 fa mov %edi,%edx + base.s.size = 0; + a1b: c7 05 2c 0e 00 00 00 movl $0x0,0xe2c + a22: 00 00 00 + if (p->s.size >= nunits) { + a25: e9 42 ff ff ff jmp 96c + a2a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + a30: 8b 08 mov (%eax),%ecx + a32: 89 0a mov %ecx,(%edx) + a34: eb b9 jmp 9ef diff --git a/ls.d b/ls.d new file mode 100644 index 0000000..a55b6d4 --- /dev/null +++ b/ls.d @@ -0,0 +1 @@ +ls.o: ls.c /usr/include/stdc-predef.h types.h stat.h user.h fs.h diff --git a/ls.o b/ls.o new file mode 100644 index 0000000000000000000000000000000000000000..507e51c2fb268683d410e5c2279d0600f5a761ab GIT binary patch literal 7016 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 S$ygTJ-P0??^gCUF-TwijbEc~R literal 0 HcmV?d00001 diff --git a/maze.asm b/maze.asm new file mode 100644 index 0000000..b62baa7 --- /dev/null +++ b/maze.asm @@ -0,0 +1,1386 @@ + +_maze: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: + + int range = end - start + 1; + return (rngnumber() + seed) % (range) + start; +} + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 08 sub $0x8,%esp + 14: 8b 39 mov (%ecx),%edi + 16: 8b 71 04 mov 0x4(%ecx),%esi + int lines = 1000; + int seed = getpid(); + 19: e8 5d 04 00 00 call 47b + + for (int i = 1; i < argc; i++) { + 1e: 83 ff 01 cmp $0x1,%edi + 21: 7e 6f jle 92 + 23: bb 01 00 00 00 mov $0x1,%ebx + 28: eb 3b jmp 65 + 2a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (strcmp(argv[i], "-l") == 0) + { + lines = atoi(argv[i + 1]); + } + else if (strcmp(argv[i], "-s") == 0) + 30: 83 ec 08 sub $0x8,%esp + 33: 68 db 08 00 00 push $0x8db + 38: ff 34 9e push (%esi,%ebx,4) + 3b: e8 d0 01 00 00 call 210 + 40: 83 c4 10 add $0x10,%esp + 43: 85 c0 test %eax,%eax + 45: 74 35 je 7c + { + seed = atoi(argv[i + 1]); + } + else if (strcmp(argv[i], "-help") == 0) + 47: 83 ec 08 sub $0x8,%esp + 4a: 68 de 08 00 00 push $0x8de + 4f: ff 34 9e push (%esi,%ebx,4) + 52: e8 b9 01 00 00 call 210 + 57: 83 c4 10 add $0x10,%esp + 5a: 85 c0 test %eax,%eax + 5c: 74 69 je c7 + for (int i = 1; i < argc; i++) { + 5e: 83 c3 01 add $0x1,%ebx + 61: 39 df cmp %ebx,%edi + 63: 74 2d je 92 + if (strcmp(argv[i], "-l") == 0) + 65: 83 ec 08 sub $0x8,%esp + 68: 68 d8 08 00 00 push $0x8d8 + 6d: ff 34 9e push (%esi,%ebx,4) + 70: e8 9b 01 00 00 call 210 + 75: 83 c4 10 add $0x10,%esp + 78: 85 c0 test %eax,%eax + 7a: 75 b4 jne 30 + seed = atoi(argv[i + 1]); + 7c: 83 ec 0c sub $0xc,%esp + 7f: ff 74 9e 04 push 0x4(%esi,%ebx,4) + for (int i = 1; i < argc; i++) { + 83: 83 c3 01 add $0x1,%ebx + seed = atoi(argv[i + 1]); + 86: e8 35 03 00 00 call 3c0 + 8b: 83 c4 10 add $0x10,%esp + for (int i = 1; i < argc; i++) { + 8e: 39 df cmp %ebx,%edi + 90: 75 d3 jne 65 + exit(); + return 0; + } + } + + cls(); + 92: e8 5c 04 00 00 call 4f3 + + printf(1, "Start Maze (DISABLED)\n"); + 97: 83 ec 08 sub $0x8,%esp + 9a: 68 ee 08 00 00 push $0x8ee + 9f: 6a 01 push $0x1 + a1: e8 0a 05 00 00 call 5b0 + printf(1, "This does not work on the azure servers, but it would generate a random x lines of characters to look like a maze, similar to the old c64 basic program.\n"); + a6: 58 pop %eax + a7: 5a pop %edx + a8: 68 ac 09 00 00 push $0x9ac + ad: 6a 01 push $0x1 + af: e8 fc 04 00 00 call 5b0 + printf(1, "I could have used the slashes but they look aweful in this font so use the count app instead.\n\n"); + b4: 59 pop %ecx + b5: 5b pop %ebx + b6: 68 48 0a 00 00 push $0xa48 + bb: 6a 01 push $0x1 + bd: e8 ee 04 00 00 call 5b0 + exit(); + c2: e8 6c 03 00 00 call 433 + printf(1, "Generates X lines of random maze.\n"); + c7: 56 push %esi + c8: 56 push %esi + c9: 68 08 09 00 00 push $0x908 + ce: 6a 01 push $0x1 + d0: e8 db 04 00 00 call 5b0 + printf(1, "Options:\n"); + d5: 5f pop %edi + d6: 58 pop %eax + d7: 68 e4 08 00 00 push $0x8e4 + dc: 6a 01 push $0x1 + de: e8 cd 04 00 00 call 5b0 + printf(1, "-l [Number] : Sets number of lines to generate for the maze.\n"); + e3: 58 pop %eax + e4: 5a pop %edx + e5: 68 2c 09 00 00 push $0x92c + ea: 6a 01 push $0x1 + ec: e8 bf 04 00 00 call 5b0 + printf(1, "-s [Number] : Sets the current seed for the random function.\n"); + f1: 59 pop %ecx + f2: 5b pop %ebx + f3: 68 6c 09 00 00 push $0x96c + f8: 6a 01 push $0x1 + fa: e8 b1 04 00 00 call 5b0 + exit(); + ff: e8 2f 03 00 00 call 433 + 104: 66 90 xchg %ax,%ax + 106: 66 90 xchg %ax,%ax + 108: 66 90 xchg %ax,%ax + 10a: 66 90 xchg %ax,%ax + 10c: 66 90 xchg %ax,%ax + 10e: 66 90 xchg %ax,%ax + +00000110 : + b = ((z1 << 6) ^ z1) >> 13; + 110: 8b 0d 1c 0e 00 00 mov 0xe1c,%ecx + b = ((z2 << 2) ^ z2) >> 27; + 116: a1 18 0e 00 00 mov 0xe18,%eax +{ + 11b: 55 push %ebp + b = ((z1 << 6) ^ z1) >> 13; + 11c: 89 ca mov %ecx,%edx + 11e: c1 e2 06 shl $0x6,%edx +{ + 121: 89 e5 mov %esp,%ebp + 123: 56 push %esi + b = ((z4 << 3) ^ z4) >> 12; + 124: 8b 35 10 0e 00 00 mov 0xe10,%esi + b = ((z1 << 6) ^ z1) >> 13; + 12a: 31 ca xor %ecx,%edx + z1 = ((z1 & 4294967294U) << 18) ^ b; + 12c: c1 e1 12 shl $0x12,%ecx +{ + 12f: 53 push %ebx + z1 = ((z1 & 4294967294U) << 18) ^ b; + 130: 81 e1 00 00 f8 ff and $0xfff80000,%ecx + b = ((z1 << 6) ^ z1) >> 13; + 136: c1 ea 0d shr $0xd,%edx + z1 = ((z1 & 4294967294U) << 18) ^ b; + 139: 31 ca xor %ecx,%edx + b = ((z2 << 2) ^ z2) >> 27; + 13b: 8d 0c 85 00 00 00 00 lea 0x0(,%eax,4),%ecx + 142: 31 c8 xor %ecx,%eax + z2 = ((z2 & 4294967288U) << 2) ^ b; + 144: 83 e1 e0 and $0xffffffe0,%ecx + z1 = ((z1 & 4294967294U) << 18) ^ b; + 147: 89 15 1c 0e 00 00 mov %edx,0xe1c + b = ((z2 << 2) ^ z2) >> 27; + 14d: c1 e8 1b shr $0x1b,%eax + z2 = ((z2 & 4294967288U) << 2) ^ b; + 150: 31 c8 xor %ecx,%eax + b = ((z3 << 13) ^ z3) >> 21; + 152: 8b 0d 14 0e 00 00 mov 0xe14,%ecx + z2 = ((z2 & 4294967288U) << 2) ^ b; + 158: a3 18 0e 00 00 mov %eax,0xe18 + return (z1 ^ z2 ^ z3 ^ z4) / 2; + 15d: 31 d0 xor %edx,%eax + b = ((z3 << 13) ^ z3) >> 21; + 15f: 89 cb mov %ecx,%ebx + 161: c1 e3 0d shl $0xd,%ebx + 164: 31 cb xor %ecx,%ebx + z3 = ((z3 & 4294967280U) << 7) ^ b; + 166: c1 e1 07 shl $0x7,%ecx + 169: 81 e1 00 f8 ff ff and $0xfffff800,%ecx + b = ((z3 << 13) ^ z3) >> 21; + 16f: c1 eb 15 shr $0x15,%ebx + z3 = ((z3 & 4294967280U) << 7) ^ b; + 172: 31 cb xor %ecx,%ebx + b = ((z4 << 3) ^ z4) >> 12; + 174: 8d 0c f5 00 00 00 00 lea 0x0(,%esi,8),%ecx + 17b: 31 f1 xor %esi,%ecx + z4 = ((z4 & 4294967168U) << 13) ^ b; + 17d: c1 e6 0d shl $0xd,%esi + return (z1 ^ z2 ^ z3 ^ z4) / 2; + 180: 31 d8 xor %ebx,%eax + z3 = ((z3 & 4294967280U) << 7) ^ b; + 182: 89 1d 14 0e 00 00 mov %ebx,0xe14 + z4 = ((z4 & 4294967168U) << 13) ^ b; + 188: 81 e6 00 00 f0 ff and $0xfff00000,%esi + b = ((z4 << 3) ^ z4) >> 12; + 18e: c1 e9 0c shr $0xc,%ecx +} + 191: 5b pop %ebx + z4 = ((z4 & 4294967168U) << 13) ^ b; + 192: 31 f1 xor %esi,%ecx +} + 194: 5e pop %esi + 195: 5d pop %ebp + return (z1 ^ z2 ^ z3 ^ z4) / 2; + 196: 31 c8 xor %ecx,%eax + z4 = ((z4 & 4294967168U) << 13) ^ b; + 198: 89 0d 10 0e 00 00 mov %ecx,0xe10 + return (z1 ^ z2 ^ z3 ^ z4) / 2; + 19e: d1 e8 shr %eax +} + 1a0: c3 ret + 1a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1af: 90 nop + +000001b0 : +{ + 1b0: 55 push %ebp + 1b1: 89 e5 mov %esp,%ebp + 1b3: 56 push %esi + 1b4: 8b 75 08 mov 0x8(%ebp),%esi + 1b7: 53 push %ebx + 1b8: 8b 5d 0c mov 0xc(%ebp),%ebx + if (end < start) + 1bb: 39 f3 cmp %esi,%ebx + 1bd: 7d 06 jge 1c5 + 1bf: 89 f0 mov %esi,%eax + 1c1: 89 de mov %ebx,%esi + 1c3: 89 c3 mov %eax,%ebx + return (rngnumber() + seed) % (range) + start; + 1c5: e8 46 ff ff ff call 110 + int range = end - start + 1; + 1ca: 29 f3 sub %esi,%ebx + return (rngnumber() + seed) % (range) + start; + 1cc: 03 45 10 add 0x10(%ebp),%eax + 1cf: 31 d2 xor %edx,%edx + int range = end - start + 1; + 1d1: 83 c3 01 add $0x1,%ebx + return (rngnumber() + seed) % (range) + start; + 1d4: f7 f3 div %ebx +} + 1d6: 5b pop %ebx + return (rngnumber() + seed) % (range) + start; + 1d7: 8d 04 32 lea (%edx,%esi,1),%eax +} + 1da: 5e pop %esi + 1db: 5d pop %ebp + 1dc: c3 ret + 1dd: 66 90 xchg %ax,%ax + 1df: 90 nop + +000001e0 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 1e0: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 1e1: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 1e3: 89 e5 mov %esp,%ebp + 1e5: 53 push %ebx + 1e6: 8b 4d 08 mov 0x8(%ebp),%ecx + 1e9: 8b 5d 0c mov 0xc(%ebp),%ebx + 1ec: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 1f0: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 1f4: 88 14 01 mov %dl,(%ecx,%eax,1) + 1f7: 83 c0 01 add $0x1,%eax + 1fa: 84 d2 test %dl,%dl + 1fc: 75 f2 jne 1f0 + ; + } + return os; +} + 1fe: 8b 5d fc mov -0x4(%ebp),%ebx + 201: 89 c8 mov %ecx,%eax + 203: c9 leave + 204: c3 ret + 205: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000210 : + +int strcmp(const char *p, const char *q) { + 210: 55 push %ebp + 211: 89 e5 mov %esp,%ebp + 213: 53 push %ebx + 214: 8b 55 08 mov 0x8(%ebp),%edx + 217: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 21a: 0f b6 02 movzbl (%edx),%eax + 21d: 84 c0 test %al,%al + 21f: 75 17 jne 238 + 221: eb 3a jmp 25d + 223: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 227: 90 nop + 228: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 22c: 83 c2 01 add $0x1,%edx + 22f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 232: 84 c0 test %al,%al + 234: 74 1a je 250 + p++, q++; + 236: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 238: 0f b6 19 movzbl (%ecx),%ebx + 23b: 38 c3 cmp %al,%bl + 23d: 74 e9 je 228 + } + return (uchar) * p - (uchar) * q; + 23f: 29 d8 sub %ebx,%eax +} + 241: 8b 5d fc mov -0x4(%ebp),%ebx + 244: c9 leave + 245: c3 ret + 246: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 24d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 250: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 254: 31 c0 xor %eax,%eax + 256: 29 d8 sub %ebx,%eax +} + 258: 8b 5d fc mov -0x4(%ebp),%ebx + 25b: c9 leave + 25c: c3 ret + return (uchar) * p - (uchar) * q; + 25d: 0f b6 19 movzbl (%ecx),%ebx + 260: 31 c0 xor %eax,%eax + 262: eb db jmp 23f + 264: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 26f: 90 nop + +00000270 : + +uint strlen(const char *s) { + 270: 55 push %ebp + 271: 89 e5 mov %esp,%ebp + 273: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 276: 80 3a 00 cmpb $0x0,(%edx) + 279: 74 15 je 290 + 27b: 31 c0 xor %eax,%eax + 27d: 8d 76 00 lea 0x0(%esi),%esi + 280: 83 c0 01 add $0x1,%eax + 283: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 287: 89 c1 mov %eax,%ecx + 289: 75 f5 jne 280 + ; + } + return n; +} + 28b: 89 c8 mov %ecx,%eax + 28d: 5d pop %ebp + 28e: c3 ret + 28f: 90 nop + for (n = 0; s[n]; n++) { + 290: 31 c9 xor %ecx,%ecx +} + 292: 5d pop %ebp + 293: 89 c8 mov %ecx,%eax + 295: c3 ret + 296: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29d: 8d 76 00 lea 0x0(%esi),%esi + +000002a0 : + +void* memset(void *dst, int c, uint n) { + 2a0: 55 push %ebp + 2a1: 89 e5 mov %esp,%ebp + 2a3: 57 push %edi + 2a4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 2a7: 8b 4d 10 mov 0x10(%ebp),%ecx + 2aa: 8b 45 0c mov 0xc(%ebp),%eax + 2ad: 89 d7 mov %edx,%edi + 2af: fc cld + 2b0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 2b2: 8b 7d fc mov -0x4(%ebp),%edi + 2b5: 89 d0 mov %edx,%eax + 2b7: c9 leave + 2b8: c3 ret + 2b9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000002c0 : + +char* strchr(const char *s, char c) { + 2c0: 55 push %ebp + 2c1: 89 e5 mov %esp,%ebp + 2c3: 8b 45 08 mov 0x8(%ebp),%eax + 2c6: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 2ca: 0f b6 10 movzbl (%eax),%edx + 2cd: 84 d2 test %dl,%dl + 2cf: 75 12 jne 2e3 + 2d1: eb 1d jmp 2f0 + 2d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2d7: 90 nop + 2d8: 0f b6 50 01 movzbl 0x1(%eax),%edx + 2dc: 83 c0 01 add $0x1,%eax + 2df: 84 d2 test %dl,%dl + 2e1: 74 0d je 2f0 + if (*s == c) { + 2e3: 38 d1 cmp %dl,%cl + 2e5: 75 f1 jne 2d8 + return (char*)s; + } + } + return 0; +} + 2e7: 5d pop %ebp + 2e8: c3 ret + 2e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 2f0: 31 c0 xor %eax,%eax +} + 2f2: 5d pop %ebp + 2f3: c3 ret + 2f4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2fb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2ff: 90 nop + +00000300 : + +char* gets(char *buf, int max) { + 300: 55 push %ebp + 301: 89 e5 mov %esp,%ebp + 303: 57 push %edi + 304: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 305: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 308: 53 push %ebx + for (i = 0; i + 1 < max;) { + 309: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 30b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 30e: eb 27 jmp 337 + cc = read(0, &c, 1); + 310: 83 ec 04 sub $0x4,%esp + 313: 6a 01 push $0x1 + 315: 57 push %edi + 316: 6a 00 push $0x0 + 318: e8 2e 01 00 00 call 44b + if (cc < 1) { + 31d: 83 c4 10 add $0x10,%esp + 320: 85 c0 test %eax,%eax + 322: 7e 1d jle 341 + break; + } + buf[i++] = c; + 324: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 328: 8b 55 08 mov 0x8(%ebp),%edx + 32b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 32f: 3c 0a cmp $0xa,%al + 331: 74 1d je 350 + 333: 3c 0d cmp $0xd,%al + 335: 74 19 je 350 + for (i = 0; i + 1 < max;) { + 337: 89 de mov %ebx,%esi + 339: 83 c3 01 add $0x1,%ebx + 33c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 33f: 7c cf jl 310 + break; + } + } + buf[i] = '\0'; + 341: 8b 45 08 mov 0x8(%ebp),%eax + 344: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 348: 8d 65 f4 lea -0xc(%ebp),%esp + 34b: 5b pop %ebx + 34c: 5e pop %esi + 34d: 5f pop %edi + 34e: 5d pop %ebp + 34f: c3 ret + buf[i] = '\0'; + 350: 8b 45 08 mov 0x8(%ebp),%eax + 353: 89 de mov %ebx,%esi + 355: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 359: 8d 65 f4 lea -0xc(%ebp),%esp + 35c: 5b pop %ebx + 35d: 5e pop %esi + 35e: 5f pop %edi + 35f: 5d pop %ebp + 360: c3 ret + 361: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 368: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36f: 90 nop + +00000370 : + +int stat(const char *n, struct stat *st) { + 370: 55 push %ebp + 371: 89 e5 mov %esp,%ebp + 373: 56 push %esi + 374: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 375: 83 ec 08 sub $0x8,%esp + 378: 6a 00 push $0x0 + 37a: ff 75 08 push 0x8(%ebp) + 37d: e8 19 01 00 00 call 49b + if (fd < 0) { + 382: 83 c4 10 add $0x10,%esp + 385: 85 c0 test %eax,%eax + 387: 78 27 js 3b0 + return -1; + } + r = fstat(fd, st); + 389: 83 ec 08 sub $0x8,%esp + 38c: ff 75 0c push 0xc(%ebp) + 38f: 89 c3 mov %eax,%ebx + 391: 50 push %eax + 392: e8 cc 00 00 00 call 463 + close(fd); + 397: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 39a: 89 c6 mov %eax,%esi + close(fd); + 39c: e8 2a 01 00 00 call 4cb + return r; + 3a1: 83 c4 10 add $0x10,%esp +} + 3a4: 8d 65 f8 lea -0x8(%ebp),%esp + 3a7: 89 f0 mov %esi,%eax + 3a9: 5b pop %ebx + 3aa: 5e pop %esi + 3ab: 5d pop %ebp + 3ac: c3 ret + 3ad: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 3b0: be ff ff ff ff mov $0xffffffff,%esi + 3b5: eb ed jmp 3a4 + 3b7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3be: 66 90 xchg %ax,%ax + +000003c0 : + +int atoi(const char *s) { + 3c0: 55 push %ebp + 3c1: 89 e5 mov %esp,%ebp + 3c3: 53 push %ebx + 3c4: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 3c7: 0f be 02 movsbl (%edx),%eax + 3ca: 8d 48 d0 lea -0x30(%eax),%ecx + 3cd: 80 f9 09 cmp $0x9,%cl + n = 0; + 3d0: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 3d5: 77 1e ja 3f5 + 3d7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3de: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 3e0: 83 c2 01 add $0x1,%edx + 3e3: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 3e6: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 3ea: 0f be 02 movsbl (%edx),%eax + 3ed: 8d 58 d0 lea -0x30(%eax),%ebx + 3f0: 80 fb 09 cmp $0x9,%bl + 3f3: 76 eb jbe 3e0 + } + return n; +} + 3f5: 8b 5d fc mov -0x4(%ebp),%ebx + 3f8: 89 c8 mov %ecx,%eax + 3fa: c9 leave + 3fb: c3 ret + 3fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000400 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 57 push %edi + 404: 8b 45 10 mov 0x10(%ebp),%eax + 407: 8b 55 08 mov 0x8(%ebp),%edx + 40a: 56 push %esi + 40b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 40e: 85 c0 test %eax,%eax + 410: 7e 13 jle 425 + 412: 01 d0 add %edx,%eax + dst = vdst; + 414: 89 d7 mov %edx,%edi + 416: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 41d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 420: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 421: 39 f8 cmp %edi,%eax + 423: 75 fb jne 420 + } + return vdst; +} + 425: 5e pop %esi + 426: 89 d0 mov %edx,%eax + 428: 5f pop %edi + 429: 5d pop %ebp + 42a: c3 ret + +0000042b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 42b: b8 01 00 00 00 mov $0x1,%eax + 430: cd 40 int $0x40 + 432: c3 ret + +00000433 : +SYSCALL(exit) + 433: b8 02 00 00 00 mov $0x2,%eax + 438: cd 40 int $0x40 + 43a: c3 ret + +0000043b : +SYSCALL(wait) + 43b: b8 03 00 00 00 mov $0x3,%eax + 440: cd 40 int $0x40 + 442: c3 ret + +00000443 : +SYSCALL(pipe) + 443: b8 04 00 00 00 mov $0x4,%eax + 448: cd 40 int $0x40 + 44a: c3 ret + +0000044b : +SYSCALL(read) + 44b: b8 05 00 00 00 mov $0x5,%eax + 450: cd 40 int $0x40 + 452: c3 ret + +00000453 : +SYSCALL(kill) + 453: b8 06 00 00 00 mov $0x6,%eax + 458: cd 40 int $0x40 + 45a: c3 ret + +0000045b : +SYSCALL(exec) + 45b: b8 07 00 00 00 mov $0x7,%eax + 460: cd 40 int $0x40 + 462: c3 ret + +00000463 : +SYSCALL(fstat) + 463: b8 08 00 00 00 mov $0x8,%eax + 468: cd 40 int $0x40 + 46a: c3 ret + +0000046b : +SYSCALL(chdir) + 46b: b8 09 00 00 00 mov $0x9,%eax + 470: cd 40 int $0x40 + 472: c3 ret + +00000473 : +SYSCALL(dup) + 473: b8 0a 00 00 00 mov $0xa,%eax + 478: cd 40 int $0x40 + 47a: c3 ret + +0000047b : +SYSCALL(getpid) + 47b: b8 0b 00 00 00 mov $0xb,%eax + 480: cd 40 int $0x40 + 482: c3 ret + +00000483 : +SYSCALL(sbrk) + 483: b8 0c 00 00 00 mov $0xc,%eax + 488: cd 40 int $0x40 + 48a: c3 ret + +0000048b : +SYSCALL(sleep) + 48b: b8 0d 00 00 00 mov $0xd,%eax + 490: cd 40 int $0x40 + 492: c3 ret + +00000493 : +SYSCALL(uptime) + 493: b8 0e 00 00 00 mov $0xe,%eax + 498: cd 40 int $0x40 + 49a: c3 ret + +0000049b : +SYSCALL(open) + 49b: b8 0f 00 00 00 mov $0xf,%eax + 4a0: cd 40 int $0x40 + 4a2: c3 ret + +000004a3 : +SYSCALL(write) + 4a3: b8 10 00 00 00 mov $0x10,%eax + 4a8: cd 40 int $0x40 + 4aa: c3 ret + +000004ab : +SYSCALL(mknod) + 4ab: b8 11 00 00 00 mov $0x11,%eax + 4b0: cd 40 int $0x40 + 4b2: c3 ret + +000004b3 : +SYSCALL(unlink) + 4b3: b8 12 00 00 00 mov $0x12,%eax + 4b8: cd 40 int $0x40 + 4ba: c3 ret + +000004bb : +SYSCALL(link) + 4bb: b8 13 00 00 00 mov $0x13,%eax + 4c0: cd 40 int $0x40 + 4c2: c3 ret + +000004c3 : +SYSCALL(mkdir) + 4c3: b8 14 00 00 00 mov $0x14,%eax + 4c8: cd 40 int $0x40 + 4ca: c3 ret + +000004cb : +SYSCALL(close) + 4cb: b8 15 00 00 00 mov $0x15,%eax + 4d0: cd 40 int $0x40 + 4d2: c3 ret + +000004d3 : +SYSCALL(getch) + 4d3: b8 16 00 00 00 mov $0x16,%eax + 4d8: cd 40 int $0x40 + 4da: c3 ret + +000004db : +SYSCALL(greeting) + 4db: b8 17 00 00 00 mov $0x17,%eax + 4e0: cd 40 int $0x40 + 4e2: c3 ret + +000004e3 : +SYSCALL(shutdown) + 4e3: b8 18 00 00 00 mov $0x18,%eax + 4e8: cd 40 int $0x40 + 4ea: c3 ret + +000004eb : +SYSCALL(screen) + 4eb: b8 19 00 00 00 mov $0x19,%eax + 4f0: cd 40 int $0x40 + 4f2: c3 ret + +000004f3 : +SYSCALL(cls) + 4f3: b8 1a 00 00 00 mov $0x1a,%eax + 4f8: cd 40 int $0x40 + 4fa: c3 ret + 4fb: 66 90 xchg %ax,%ax + 4fd: 66 90 xchg %ax,%ax + 4ff: 90 nop + +00000500 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 500: 55 push %ebp + 501: 89 e5 mov %esp,%ebp + 503: 57 push %edi + 504: 56 push %esi + 505: 53 push %ebx + 506: 83 ec 3c sub $0x3c,%esp + 509: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 50c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 50e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 511: 85 d2 test %edx,%edx + 513: 0f 89 7f 00 00 00 jns 598 + 519: f6 45 08 01 testb $0x1,0x8(%ebp) + 51d: 74 79 je 598 + neg = 1; + 51f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 526: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 528: 31 db xor %ebx,%ebx + 52a: 8d 75 d7 lea -0x29(%ebp),%esi + 52d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 530: 89 c8 mov %ecx,%eax + 532: 31 d2 xor %edx,%edx + 534: 89 cf mov %ecx,%edi + 536: f7 75 c4 divl -0x3c(%ebp) + 539: 0f b6 92 08 0b 00 00 movzbl 0xb08(%edx),%edx + 540: 89 45 c0 mov %eax,-0x40(%ebp) + 543: 89 d8 mov %ebx,%eax + 545: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 548: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 54b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 54e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 551: 76 dd jbe 530 + if (neg) { + 553: 8b 4d bc mov -0x44(%ebp),%ecx + 556: 85 c9 test %ecx,%ecx + 558: 74 0c je 566 + buf[i++] = '-'; + 55a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 55f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 561: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 566: 8b 7d b8 mov -0x48(%ebp),%edi + 569: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 56d: eb 07 jmp 576 + 56f: 90 nop + putc(fd, buf[i]); + 570: 0f b6 13 movzbl (%ebx),%edx + 573: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 576: 83 ec 04 sub $0x4,%esp + 579: 88 55 d7 mov %dl,-0x29(%ebp) + 57c: 6a 01 push $0x1 + 57e: 56 push %esi + 57f: 57 push %edi + 580: e8 1e ff ff ff call 4a3 + while (--i >= 0) { + 585: 83 c4 10 add $0x10,%esp + 588: 39 de cmp %ebx,%esi + 58a: 75 e4 jne 570 + } +} + 58c: 8d 65 f4 lea -0xc(%ebp),%esp + 58f: 5b pop %ebx + 590: 5e pop %esi + 591: 5f pop %edi + 592: 5d pop %ebp + 593: c3 ret + 594: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 598: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 59f: eb 87 jmp 528 + 5a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5af: 90 nop + +000005b0 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 5b0: 55 push %ebp + 5b1: 89 e5 mov %esp,%ebp + 5b3: 57 push %edi + 5b4: 56 push %esi + 5b5: 53 push %ebx + 5b6: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 5b9: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 5bc: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 5bf: 0f b6 13 movzbl (%ebx),%edx + 5c2: 84 d2 test %dl,%dl + 5c4: 74 6a je 630 + ap = (uint*)(void*)&fmt + 1; + 5c6: 8d 45 10 lea 0x10(%ebp),%eax + 5c9: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 5cc: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 5cf: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 5d1: 89 45 d0 mov %eax,-0x30(%ebp) + 5d4: eb 36 jmp 60c + 5d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5dd: 8d 76 00 lea 0x0(%esi),%esi + 5e0: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 5e3: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 5e8: 83 f8 25 cmp $0x25,%eax + 5eb: 74 15 je 602 + write(fd, &c, 1); + 5ed: 83 ec 04 sub $0x4,%esp + 5f0: 88 55 e7 mov %dl,-0x19(%ebp) + 5f3: 6a 01 push $0x1 + 5f5: 57 push %edi + 5f6: 56 push %esi + 5f7: e8 a7 fe ff ff call 4a3 + 5fc: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 5ff: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 602: 0f b6 13 movzbl (%ebx),%edx + 605: 83 c3 01 add $0x1,%ebx + 608: 84 d2 test %dl,%dl + 60a: 74 24 je 630 + c = fmt[i] & 0xff; + 60c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 60f: 85 c9 test %ecx,%ecx + 611: 74 cd je 5e0 + } + } + else if (state == '%') { + 613: 83 f9 25 cmp $0x25,%ecx + 616: 75 ea jne 602 + if (c == 'd') { + 618: 83 f8 25 cmp $0x25,%eax + 61b: 0f 84 07 01 00 00 je 728 + 621: 83 e8 63 sub $0x63,%eax + 624: 83 f8 15 cmp $0x15,%eax + 627: 77 17 ja 640 + 629: ff 24 85 b0 0a 00 00 jmp *0xab0(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 630: 8d 65 f4 lea -0xc(%ebp),%esp + 633: 5b pop %ebx + 634: 5e pop %esi + 635: 5f pop %edi + 636: 5d pop %ebp + 637: c3 ret + 638: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 63f: 90 nop + write(fd, &c, 1); + 640: 83 ec 04 sub $0x4,%esp + 643: 88 55 d4 mov %dl,-0x2c(%ebp) + 646: 6a 01 push $0x1 + 648: 57 push %edi + 649: 56 push %esi + 64a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 64e: e8 50 fe ff ff call 4a3 + putc(fd, c); + 653: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 657: 83 c4 0c add $0xc,%esp + 65a: 88 55 e7 mov %dl,-0x19(%ebp) + 65d: 6a 01 push $0x1 + 65f: 57 push %edi + 660: 56 push %esi + 661: e8 3d fe ff ff call 4a3 + putc(fd, c); + 666: 83 c4 10 add $0x10,%esp + state = 0; + 669: 31 c9 xor %ecx,%ecx + 66b: eb 95 jmp 602 + 66d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 670: 83 ec 0c sub $0xc,%esp + 673: b9 10 00 00 00 mov $0x10,%ecx + 678: 6a 00 push $0x0 + 67a: 8b 45 d0 mov -0x30(%ebp),%eax + 67d: 8b 10 mov (%eax),%edx + 67f: 89 f0 mov %esi,%eax + 681: e8 7a fe ff ff call 500 + ap++; + 686: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 68a: 83 c4 10 add $0x10,%esp + state = 0; + 68d: 31 c9 xor %ecx,%ecx + 68f: e9 6e ff ff ff jmp 602 + 694: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 698: 8b 45 d0 mov -0x30(%ebp),%eax + 69b: 8b 10 mov (%eax),%edx + ap++; + 69d: 83 c0 04 add $0x4,%eax + 6a0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 6a3: 85 d2 test %edx,%edx + 6a5: 0f 84 8d 00 00 00 je 738 + while (*s != 0) { + 6ab: 0f b6 02 movzbl (%edx),%eax + state = 0; + 6ae: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 6b0: 84 c0 test %al,%al + 6b2: 0f 84 4a ff ff ff je 602 + 6b8: 89 5d d4 mov %ebx,-0x2c(%ebp) + 6bb: 89 d3 mov %edx,%ebx + 6bd: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 6c0: 83 ec 04 sub $0x4,%esp + s++; + 6c3: 83 c3 01 add $0x1,%ebx + 6c6: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 6c9: 6a 01 push $0x1 + 6cb: 57 push %edi + 6cc: 56 push %esi + 6cd: e8 d1 fd ff ff call 4a3 + while (*s != 0) { + 6d2: 0f b6 03 movzbl (%ebx),%eax + 6d5: 83 c4 10 add $0x10,%esp + 6d8: 84 c0 test %al,%al + 6da: 75 e4 jne 6c0 + state = 0; + 6dc: 8b 5d d4 mov -0x2c(%ebp),%ebx + 6df: 31 c9 xor %ecx,%ecx + 6e1: e9 1c ff ff ff jmp 602 + 6e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6ed: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 6f0: 83 ec 0c sub $0xc,%esp + 6f3: b9 0a 00 00 00 mov $0xa,%ecx + 6f8: 6a 01 push $0x1 + 6fa: e9 7b ff ff ff jmp 67a + 6ff: 90 nop + putc(fd, *ap); + 700: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 703: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 706: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 708: 6a 01 push $0x1 + 70a: 57 push %edi + 70b: 56 push %esi + putc(fd, *ap); + 70c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 70f: e8 8f fd ff ff call 4a3 + ap++; + 714: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 718: 83 c4 10 add $0x10,%esp + state = 0; + 71b: 31 c9 xor %ecx,%ecx + 71d: e9 e0 fe ff ff jmp 602 + 722: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 728: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 72b: 83 ec 04 sub $0x4,%esp + 72e: e9 2a ff ff ff jmp 65d + 733: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 737: 90 nop + s = "(null)"; + 738: ba a8 0a 00 00 mov $0xaa8,%edx + while (*s != 0) { + 73d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 740: b8 28 00 00 00 mov $0x28,%eax + 745: 89 d3 mov %edx,%ebx + 747: e9 74 ff ff ff jmp 6c0 + 74c: 66 90 xchg %ax,%ax + 74e: 66 90 xchg %ax,%ax + +00000750 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 750: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 751: a1 20 0e 00 00 mov 0xe20,%eax +void free(void *ap) { + 756: 89 e5 mov %esp,%ebp + 758: 57 push %edi + 759: 56 push %esi + 75a: 53 push %ebx + 75b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 75e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 761: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 768: 89 c2 mov %eax,%edx + 76a: 8b 00 mov (%eax),%eax + 76c: 39 ca cmp %ecx,%edx + 76e: 73 30 jae 7a0 + 770: 39 c1 cmp %eax,%ecx + 772: 72 04 jb 778 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 774: 39 c2 cmp %eax,%edx + 776: 72 f0 jb 768 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 778: 8b 73 fc mov -0x4(%ebx),%esi + 77b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 77e: 39 f8 cmp %edi,%eax + 780: 74 30 je 7b2 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 782: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 785: 8b 42 04 mov 0x4(%edx),%eax + 788: 8d 34 c2 lea (%edx,%eax,8),%esi + 78b: 39 f1 cmp %esi,%ecx + 78d: 74 3a je 7c9 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 78f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 791: 5b pop %ebx + freep = p; + 792: 89 15 20 0e 00 00 mov %edx,0xe20 +} + 798: 5e pop %esi + 799: 5f pop %edi + 79a: 5d pop %ebp + 79b: c3 ret + 79c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 7a0: 39 c2 cmp %eax,%edx + 7a2: 72 c4 jb 768 + 7a4: 39 c1 cmp %eax,%ecx + 7a6: 73 c0 jae 768 + if (bp + bp->s.size == p->s.ptr) { + 7a8: 8b 73 fc mov -0x4(%ebx),%esi + 7ab: 8d 3c f1 lea (%ecx,%esi,8),%edi + 7ae: 39 f8 cmp %edi,%eax + 7b0: 75 d0 jne 782 + bp->s.size += p->s.ptr->s.size; + 7b2: 03 70 04 add 0x4(%eax),%esi + 7b5: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 7b8: 8b 02 mov (%edx),%eax + 7ba: 8b 00 mov (%eax),%eax + 7bc: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 7bf: 8b 42 04 mov 0x4(%edx),%eax + 7c2: 8d 34 c2 lea (%edx,%eax,8),%esi + 7c5: 39 f1 cmp %esi,%ecx + 7c7: 75 c6 jne 78f + p->s.size += bp->s.size; + 7c9: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 7cc: 89 15 20 0e 00 00 mov %edx,0xe20 + p->s.size += bp->s.size; + 7d2: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 7d5: 8b 4b f8 mov -0x8(%ebx),%ecx + 7d8: 89 0a mov %ecx,(%edx) +} + 7da: 5b pop %ebx + 7db: 5e pop %esi + 7dc: 5f pop %edi + 7dd: 5d pop %ebp + 7de: c3 ret + 7df: 90 nop + +000007e0 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 7e0: 55 push %ebp + 7e1: 89 e5 mov %esp,%ebp + 7e3: 57 push %edi + 7e4: 56 push %esi + 7e5: 53 push %ebx + 7e6: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 7e9: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 7ec: 8b 3d 20 0e 00 00 mov 0xe20,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 7f2: 8d 70 07 lea 0x7(%eax),%esi + 7f5: c1 ee 03 shr $0x3,%esi + 7f8: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 7fb: 85 ff test %edi,%edi + 7fd: 0f 84 9d 00 00 00 je 8a0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 803: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 805: 8b 4a 04 mov 0x4(%edx),%ecx + 808: 39 f1 cmp %esi,%ecx + 80a: 73 6a jae 876 + 80c: bb 00 10 00 00 mov $0x1000,%ebx + 811: 39 de cmp %ebx,%esi + 813: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 816: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 81d: 89 45 e4 mov %eax,-0x1c(%ebp) + 820: eb 17 jmp 839 + 822: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 828: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 82a: 8b 48 04 mov 0x4(%eax),%ecx + 82d: 39 f1 cmp %esi,%ecx + 82f: 73 4f jae 880 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 831: 8b 3d 20 0e 00 00 mov 0xe20,%edi + 837: 89 c2 mov %eax,%edx + 839: 39 d7 cmp %edx,%edi + 83b: 75 eb jne 828 + p = sbrk(nu * sizeof(Header)); + 83d: 83 ec 0c sub $0xc,%esp + 840: ff 75 e4 push -0x1c(%ebp) + 843: e8 3b fc ff ff call 483 + if (p == (char*)-1) { + 848: 83 c4 10 add $0x10,%esp + 84b: 83 f8 ff cmp $0xffffffff,%eax + 84e: 74 1c je 86c + hp->s.size = nu; + 850: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 853: 83 ec 0c sub $0xc,%esp + 856: 83 c0 08 add $0x8,%eax + 859: 50 push %eax + 85a: e8 f1 fe ff ff call 750 + return freep; + 85f: 8b 15 20 0e 00 00 mov 0xe20,%edx + if ((p = morecore(nunits)) == 0) { + 865: 83 c4 10 add $0x10,%esp + 868: 85 d2 test %edx,%edx + 86a: 75 bc jne 828 + return 0; + } + } + } +} + 86c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 86f: 31 c0 xor %eax,%eax +} + 871: 5b pop %ebx + 872: 5e pop %esi + 873: 5f pop %edi + 874: 5d pop %ebp + 875: c3 ret + if (p->s.size >= nunits) { + 876: 89 d0 mov %edx,%eax + 878: 89 fa mov %edi,%edx + 87a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 880: 39 ce cmp %ecx,%esi + 882: 74 4c je 8d0 + p->s.size -= nunits; + 884: 29 f1 sub %esi,%ecx + 886: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 889: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 88c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 88f: 89 15 20 0e 00 00 mov %edx,0xe20 +} + 895: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 898: 83 c0 08 add $0x8,%eax +} + 89b: 5b pop %ebx + 89c: 5e pop %esi + 89d: 5f pop %edi + 89e: 5d pop %ebp + 89f: c3 ret + base.s.ptr = freep = prevp = &base; + 8a0: c7 05 20 0e 00 00 24 movl $0xe24,0xe20 + 8a7: 0e 00 00 + base.s.size = 0; + 8aa: bf 24 0e 00 00 mov $0xe24,%edi + base.s.ptr = freep = prevp = &base; + 8af: c7 05 24 0e 00 00 24 movl $0xe24,0xe24 + 8b6: 0e 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 8b9: 89 fa mov %edi,%edx + base.s.size = 0; + 8bb: c7 05 28 0e 00 00 00 movl $0x0,0xe28 + 8c2: 00 00 00 + if (p->s.size >= nunits) { + 8c5: e9 42 ff ff ff jmp 80c + 8ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 8d0: 8b 08 mov (%eax),%ecx + 8d2: 89 0a mov %ecx,(%edx) + 8d4: eb b9 jmp 88f diff --git a/maze.d b/maze.d new file mode 100644 index 0000000..92a9724 --- /dev/null +++ b/maze.d @@ -0,0 +1 @@ +maze.o: maze.c /usr/include/stdc-predef.h types.h user.h diff --git a/maze.o b/maze.o new file mode 100644 index 0000000000000000000000000000000000000000..dd07b2cad217436e884d1ff3d70f05c6e0ccc03e GIT binary patch literal 6688 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 literal 0 HcmV?d00001 diff --git a/maze.sym b/maze.sym new file mode 100644 index 0000000..30105d2 --- /dev/null +++ b/maze.sym @@ -0,0 +1,56 @@ +00000000 maze.c +00000e1c z1.3 +00000e18 z2.2 +00000e10 z4.0 +00000e14 z3.1 +00000000 ulib.c +00000000 printf.c +00000500 printint +00000b08 digits.0 +00000000 umalloc.c +00000e20 freep +00000e24 base +000001e0 strcpy +000005b0 printf +000004db greeting +00000400 memmove +000004ab mknod +00000300 gets +0000047b getpid +000004eb screen +000007e0 malloc +0000048b sleep +00000110 rngnumber +00000443 pipe +000004d3 getch +000004a3 write +00000463 fstat +00000453 kill +0000046b chdir +000001b0 rngrange +0000045b exec +0000043b wait +0000044b read +000004b3 unlink +0000042b fork +00000483 sbrk +00000493 uptime +00000e20 __bss_start +000002a0 memset +00000000 main +00000210 strcmp +000004e3 shutdown +00000473 dup +00000370 stat +00000e20 _edata +00000e2c _end +000004bb link +00000433 exit +000003c0 atoi +000004f3 cls +00000270 strlen +0000049b open +000002c0 strchr +000004c3 mkdir +000004cb close +00000750 free diff --git a/mkdir.asm b/mkdir.asm new file mode 100644 index 0000000..22ea349 --- /dev/null +++ b/mkdir.asm @@ -0,0 +1,1202 @@ + +_mkdir: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: bf 01 00 00 00 mov $0x1,%edi + 13: 56 push %esi + 14: 53 push %ebx + 15: 51 push %ecx + 16: 83 ec 08 sub $0x8,%esp + 19: 8b 59 04 mov 0x4(%ecx),%ebx + 1c: 8b 31 mov (%ecx),%esi + 1e: 83 c3 04 add $0x4,%ebx + int i; + + if (argc < 2) { + 21: 83 fe 01 cmp $0x1,%esi + 24: 7e 3e jle 64 + 26: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2d: 8d 76 00 lea 0x0(%esi),%esi + printf(2, "Usage: mkdir files...\n"); + exit(); + } + + for (i = 1; i < argc; i++) { + if (mkdir(argv[i]) < 0) { + 30: 83 ec 0c sub $0xc,%esp + 33: ff 33 push (%ebx) + 35: e8 29 03 00 00 call 363 + 3a: 83 c4 10 add $0x10,%esp + 3d: 85 c0 test %eax,%eax + 3f: 78 0f js 50 + for (i = 1; i < argc; i++) { + 41: 83 c7 01 add $0x1,%edi + 44: 83 c3 04 add $0x4,%ebx + 47: 39 fe cmp %edi,%esi + 49: 75 e5 jne 30 + printf(2, "mkdir: %s failed to create\n", argv[i]); + break; + } + } + + exit(); + 4b: e8 83 02 00 00 call 2d3 + printf(2, "mkdir: %s failed to create\n", argv[i]); + 50: 50 push %eax + 51: ff 33 push (%ebx) + 53: 68 8f 07 00 00 push $0x78f + 58: 6a 02 push $0x2 + 5a: e8 f1 03 00 00 call 450 + break; + 5f: 83 c4 10 add $0x10,%esp + 62: eb e7 jmp 4b + printf(2, "Usage: mkdir files...\n"); + 64: 52 push %edx + 65: 52 push %edx + 66: 68 78 07 00 00 push $0x778 + 6b: 6a 02 push $0x2 + 6d: e8 de 03 00 00 call 450 + exit(); + 72: e8 5c 02 00 00 call 2d3 + 77: 66 90 xchg %ax,%ax + 79: 66 90 xchg %ax,%ax + 7b: 66 90 xchg %ax,%ax + 7d: 66 90 xchg %ax,%ax + 7f: 90 nop + +00000080 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 80: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 81: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 83: 89 e5 mov %esp,%ebp + 85: 53 push %ebx + 86: 8b 4d 08 mov 0x8(%ebp),%ecx + 89: 8b 5d 0c mov 0xc(%ebp),%ebx + 8c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 90: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 94: 88 14 01 mov %dl,(%ecx,%eax,1) + 97: 83 c0 01 add $0x1,%eax + 9a: 84 d2 test %dl,%dl + 9c: 75 f2 jne 90 + ; + } + return os; +} + 9e: 8b 5d fc mov -0x4(%ebp),%ebx + a1: 89 c8 mov %ecx,%eax + a3: c9 leave + a4: c3 ret + a5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000000b0 : + +int strcmp(const char *p, const char *q) { + b0: 55 push %ebp + b1: 89 e5 mov %esp,%ebp + b3: 53 push %ebx + b4: 8b 55 08 mov 0x8(%ebp),%edx + b7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + ba: 0f b6 02 movzbl (%edx),%eax + bd: 84 c0 test %al,%al + bf: 75 17 jne d8 + c1: eb 3a jmp fd + c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c7: 90 nop + c8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + cc: 83 c2 01 add $0x1,%edx + cf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + d2: 84 c0 test %al,%al + d4: 74 1a je f0 + p++, q++; + d6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + d8: 0f b6 19 movzbl (%ecx),%ebx + db: 38 c3 cmp %al,%bl + dd: 74 e9 je c8 + } + return (uchar) * p - (uchar) * q; + df: 29 d8 sub %ebx,%eax +} + e1: 8b 5d fc mov -0x4(%ebp),%ebx + e4: c9 leave + e5: c3 ret + e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ed: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + f0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + f4: 31 c0 xor %eax,%eax + f6: 29 d8 sub %ebx,%eax +} + f8: 8b 5d fc mov -0x4(%ebp),%ebx + fb: c9 leave + fc: c3 ret + return (uchar) * p - (uchar) * q; + fd: 0f b6 19 movzbl (%ecx),%ebx + 100: 31 c0 xor %eax,%eax + 102: eb db jmp df + 104: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 10b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 10f: 90 nop + +00000110 : + +uint strlen(const char *s) { + 110: 55 push %ebp + 111: 89 e5 mov %esp,%ebp + 113: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 116: 80 3a 00 cmpb $0x0,(%edx) + 119: 74 15 je 130 + 11b: 31 c0 xor %eax,%eax + 11d: 8d 76 00 lea 0x0(%esi),%esi + 120: 83 c0 01 add $0x1,%eax + 123: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 127: 89 c1 mov %eax,%ecx + 129: 75 f5 jne 120 + ; + } + return n; +} + 12b: 89 c8 mov %ecx,%eax + 12d: 5d pop %ebp + 12e: c3 ret + 12f: 90 nop + for (n = 0; s[n]; n++) { + 130: 31 c9 xor %ecx,%ecx +} + 132: 5d pop %ebp + 133: 89 c8 mov %ecx,%eax + 135: c3 ret + 136: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 13d: 8d 76 00 lea 0x0(%esi),%esi + +00000140 : + +void* memset(void *dst, int c, uint n) { + 140: 55 push %ebp + 141: 89 e5 mov %esp,%ebp + 143: 57 push %edi + 144: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 147: 8b 4d 10 mov 0x10(%ebp),%ecx + 14a: 8b 45 0c mov 0xc(%ebp),%eax + 14d: 89 d7 mov %edx,%edi + 14f: fc cld + 150: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 152: 8b 7d fc mov -0x4(%ebp),%edi + 155: 89 d0 mov %edx,%eax + 157: c9 leave + 158: c3 ret + 159: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000160 : + +char* strchr(const char *s, char c) { + 160: 55 push %ebp + 161: 89 e5 mov %esp,%ebp + 163: 8b 45 08 mov 0x8(%ebp),%eax + 166: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 16a: 0f b6 10 movzbl (%eax),%edx + 16d: 84 d2 test %dl,%dl + 16f: 75 12 jne 183 + 171: eb 1d jmp 190 + 173: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 177: 90 nop + 178: 0f b6 50 01 movzbl 0x1(%eax),%edx + 17c: 83 c0 01 add $0x1,%eax + 17f: 84 d2 test %dl,%dl + 181: 74 0d je 190 + if (*s == c) { + 183: 38 d1 cmp %dl,%cl + 185: 75 f1 jne 178 + return (char*)s; + } + } + return 0; +} + 187: 5d pop %ebp + 188: c3 ret + 189: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 190: 31 c0 xor %eax,%eax +} + 192: 5d pop %ebp + 193: c3 ret + 194: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 19b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 19f: 90 nop + +000001a0 : + +char* gets(char *buf, int max) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 57 push %edi + 1a4: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 1a5: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 1a8: 53 push %ebx + for (i = 0; i + 1 < max;) { + 1a9: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 1ab: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 1ae: eb 27 jmp 1d7 + cc = read(0, &c, 1); + 1b0: 83 ec 04 sub $0x4,%esp + 1b3: 6a 01 push $0x1 + 1b5: 57 push %edi + 1b6: 6a 00 push $0x0 + 1b8: e8 2e 01 00 00 call 2eb + if (cc < 1) { + 1bd: 83 c4 10 add $0x10,%esp + 1c0: 85 c0 test %eax,%eax + 1c2: 7e 1d jle 1e1 + break; + } + buf[i++] = c; + 1c4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1c8: 8b 55 08 mov 0x8(%ebp),%edx + 1cb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1cf: 3c 0a cmp $0xa,%al + 1d1: 74 1d je 1f0 + 1d3: 3c 0d cmp $0xd,%al + 1d5: 74 19 je 1f0 + for (i = 0; i + 1 < max;) { + 1d7: 89 de mov %ebx,%esi + 1d9: 83 c3 01 add $0x1,%ebx + 1dc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1df: 7c cf jl 1b0 + break; + } + } + buf[i] = '\0'; + 1e1: 8b 45 08 mov 0x8(%ebp),%eax + 1e4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1e8: 8d 65 f4 lea -0xc(%ebp),%esp + 1eb: 5b pop %ebx + 1ec: 5e pop %esi + 1ed: 5f pop %edi + 1ee: 5d pop %ebp + 1ef: c3 ret + buf[i] = '\0'; + 1f0: 8b 45 08 mov 0x8(%ebp),%eax + 1f3: 89 de mov %ebx,%esi + 1f5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1f9: 8d 65 f4 lea -0xc(%ebp),%esp + 1fc: 5b pop %ebx + 1fd: 5e pop %esi + 1fe: 5f pop %edi + 1ff: 5d pop %ebp + 200: c3 ret + 201: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 208: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20f: 90 nop + +00000210 : + +int stat(const char *n, struct stat *st) { + 210: 55 push %ebp + 211: 89 e5 mov %esp,%ebp + 213: 56 push %esi + 214: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 215: 83 ec 08 sub $0x8,%esp + 218: 6a 00 push $0x0 + 21a: ff 75 08 push 0x8(%ebp) + 21d: e8 19 01 00 00 call 33b + if (fd < 0) { + 222: 83 c4 10 add $0x10,%esp + 225: 85 c0 test %eax,%eax + 227: 78 27 js 250 + return -1; + } + r = fstat(fd, st); + 229: 83 ec 08 sub $0x8,%esp + 22c: ff 75 0c push 0xc(%ebp) + 22f: 89 c3 mov %eax,%ebx + 231: 50 push %eax + 232: e8 cc 00 00 00 call 303 + close(fd); + 237: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 23a: 89 c6 mov %eax,%esi + close(fd); + 23c: e8 2a 01 00 00 call 36b + return r; + 241: 83 c4 10 add $0x10,%esp +} + 244: 8d 65 f8 lea -0x8(%ebp),%esp + 247: 89 f0 mov %esi,%eax + 249: 5b pop %ebx + 24a: 5e pop %esi + 24b: 5d pop %ebp + 24c: c3 ret + 24d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 250: be ff ff ff ff mov $0xffffffff,%esi + 255: eb ed jmp 244 + 257: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25e: 66 90 xchg %ax,%ax + +00000260 : + +int atoi(const char *s) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 53 push %ebx + 264: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 267: 0f be 02 movsbl (%edx),%eax + 26a: 8d 48 d0 lea -0x30(%eax),%ecx + 26d: 80 f9 09 cmp $0x9,%cl + n = 0; + 270: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 275: 77 1e ja 295 + 277: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 27e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 280: 83 c2 01 add $0x1,%edx + 283: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 286: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 28a: 0f be 02 movsbl (%edx),%eax + 28d: 8d 58 d0 lea -0x30(%eax),%ebx + 290: 80 fb 09 cmp $0x9,%bl + 293: 76 eb jbe 280 + } + return n; +} + 295: 8b 5d fc mov -0x4(%ebp),%ebx + 298: 89 c8 mov %ecx,%eax + 29a: c9 leave + 29b: c3 ret + 29c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000002a0 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 2a0: 55 push %ebp + 2a1: 89 e5 mov %esp,%ebp + 2a3: 57 push %edi + 2a4: 8b 45 10 mov 0x10(%ebp),%eax + 2a7: 8b 55 08 mov 0x8(%ebp),%edx + 2aa: 56 push %esi + 2ab: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 2ae: 85 c0 test %eax,%eax + 2b0: 7e 13 jle 2c5 + 2b2: 01 d0 add %edx,%eax + dst = vdst; + 2b4: 89 d7 mov %edx,%edi + 2b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2bd: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2c0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2c1: 39 f8 cmp %edi,%eax + 2c3: 75 fb jne 2c0 + } + return vdst; +} + 2c5: 5e pop %esi + 2c6: 89 d0 mov %edx,%eax + 2c8: 5f pop %edi + 2c9: 5d pop %ebp + 2ca: c3 ret + +000002cb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2cb: b8 01 00 00 00 mov $0x1,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(exit) + 2d3: b8 02 00 00 00 mov $0x2,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(wait) + 2db: b8 03 00 00 00 mov $0x3,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(pipe) + 2e3: b8 04 00 00 00 mov $0x4,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(read) + 2eb: b8 05 00 00 00 mov $0x5,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(kill) + 2f3: b8 06 00 00 00 mov $0x6,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(exec) + 2fb: b8 07 00 00 00 mov $0x7,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(fstat) + 303: b8 08 00 00 00 mov $0x8,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(chdir) + 30b: b8 09 00 00 00 mov $0x9,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(dup) + 313: b8 0a 00 00 00 mov $0xa,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(getpid) + 31b: b8 0b 00 00 00 mov $0xb,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(sbrk) + 323: b8 0c 00 00 00 mov $0xc,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(sleep) + 32b: b8 0d 00 00 00 mov $0xd,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(uptime) + 333: b8 0e 00 00 00 mov $0xe,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(open) + 33b: b8 0f 00 00 00 mov $0xf,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(write) + 343: b8 10 00 00 00 mov $0x10,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(mknod) + 34b: b8 11 00 00 00 mov $0x11,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(unlink) + 353: b8 12 00 00 00 mov $0x12,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(link) + 35b: b8 13 00 00 00 mov $0x13,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(mkdir) + 363: b8 14 00 00 00 mov $0x14,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(close) + 36b: b8 15 00 00 00 mov $0x15,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(getch) + 373: b8 16 00 00 00 mov $0x16,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(greeting) + 37b: b8 17 00 00 00 mov $0x17,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(shutdown) + 383: b8 18 00 00 00 mov $0x18,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(screen) + 38b: b8 19 00 00 00 mov $0x19,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(cls) + 393: b8 1a 00 00 00 mov $0x1a,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + 39b: 66 90 xchg %ax,%ax + 39d: 66 90 xchg %ax,%ax + 39f: 90 nop + +000003a0 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 3a0: 55 push %ebp + 3a1: 89 e5 mov %esp,%ebp + 3a3: 57 push %edi + 3a4: 56 push %esi + 3a5: 53 push %ebx + 3a6: 83 ec 3c sub $0x3c,%esp + 3a9: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 3ac: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 3ae: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 3b1: 85 d2 test %edx,%edx + 3b3: 0f 89 7f 00 00 00 jns 438 + 3b9: f6 45 08 01 testb $0x1,0x8(%ebp) + 3bd: 74 79 je 438 + neg = 1; + 3bf: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3c6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3c8: 31 db xor %ebx,%ebx + 3ca: 8d 75 d7 lea -0x29(%ebp),%esi + 3cd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3d0: 89 c8 mov %ecx,%eax + 3d2: 31 d2 xor %edx,%edx + 3d4: 89 cf mov %ecx,%edi + 3d6: f7 75 c4 divl -0x3c(%ebp) + 3d9: 0f b6 92 0c 08 00 00 movzbl 0x80c(%edx),%edx + 3e0: 89 45 c0 mov %eax,-0x40(%ebp) + 3e3: 89 d8 mov %ebx,%eax + 3e5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3e8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3eb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3ee: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3f1: 76 dd jbe 3d0 + if (neg) { + 3f3: 8b 4d bc mov -0x44(%ebp),%ecx + 3f6: 85 c9 test %ecx,%ecx + 3f8: 74 0c je 406 + buf[i++] = '-'; + 3fa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3ff: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 401: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 406: 8b 7d b8 mov -0x48(%ebp),%edi + 409: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 40d: eb 07 jmp 416 + 40f: 90 nop + putc(fd, buf[i]); + 410: 0f b6 13 movzbl (%ebx),%edx + 413: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 416: 83 ec 04 sub $0x4,%esp + 419: 88 55 d7 mov %dl,-0x29(%ebp) + 41c: 6a 01 push $0x1 + 41e: 56 push %esi + 41f: 57 push %edi + 420: e8 1e ff ff ff call 343 + while (--i >= 0) { + 425: 83 c4 10 add $0x10,%esp + 428: 39 de cmp %ebx,%esi + 42a: 75 e4 jne 410 + } +} + 42c: 8d 65 f4 lea -0xc(%ebp),%esp + 42f: 5b pop %ebx + 430: 5e pop %esi + 431: 5f pop %edi + 432: 5d pop %ebp + 433: c3 ret + 434: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 438: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 43f: eb 87 jmp 3c8 + 441: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 448: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 44f: 90 nop + +00000450 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 450: 55 push %ebp + 451: 89 e5 mov %esp,%ebp + 453: 57 push %edi + 454: 56 push %esi + 455: 53 push %ebx + 456: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 459: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 45c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 45f: 0f b6 13 movzbl (%ebx),%edx + 462: 84 d2 test %dl,%dl + 464: 74 6a je 4d0 + ap = (uint*)(void*)&fmt + 1; + 466: 8d 45 10 lea 0x10(%ebp),%eax + 469: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 46c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 46f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 471: 89 45 d0 mov %eax,-0x30(%ebp) + 474: eb 36 jmp 4ac + 476: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 47d: 8d 76 00 lea 0x0(%esi),%esi + 480: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 483: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 488: 83 f8 25 cmp $0x25,%eax + 48b: 74 15 je 4a2 + write(fd, &c, 1); + 48d: 83 ec 04 sub $0x4,%esp + 490: 88 55 e7 mov %dl,-0x19(%ebp) + 493: 6a 01 push $0x1 + 495: 57 push %edi + 496: 56 push %esi + 497: e8 a7 fe ff ff call 343 + 49c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 49f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 4a2: 0f b6 13 movzbl (%ebx),%edx + 4a5: 83 c3 01 add $0x1,%ebx + 4a8: 84 d2 test %dl,%dl + 4aa: 74 24 je 4d0 + c = fmt[i] & 0xff; + 4ac: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 4af: 85 c9 test %ecx,%ecx + 4b1: 74 cd je 480 + } + } + else if (state == '%') { + 4b3: 83 f9 25 cmp $0x25,%ecx + 4b6: 75 ea jne 4a2 + if (c == 'd') { + 4b8: 83 f8 25 cmp $0x25,%eax + 4bb: 0f 84 07 01 00 00 je 5c8 + 4c1: 83 e8 63 sub $0x63,%eax + 4c4: 83 f8 15 cmp $0x15,%eax + 4c7: 77 17 ja 4e0 + 4c9: ff 24 85 b4 07 00 00 jmp *0x7b4(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4d0: 8d 65 f4 lea -0xc(%ebp),%esp + 4d3: 5b pop %ebx + 4d4: 5e pop %esi + 4d5: 5f pop %edi + 4d6: 5d pop %ebp + 4d7: c3 ret + 4d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4df: 90 nop + write(fd, &c, 1); + 4e0: 83 ec 04 sub $0x4,%esp + 4e3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4e6: 6a 01 push $0x1 + 4e8: 57 push %edi + 4e9: 56 push %esi + 4ea: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4ee: e8 50 fe ff ff call 343 + putc(fd, c); + 4f3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4f7: 83 c4 0c add $0xc,%esp + 4fa: 88 55 e7 mov %dl,-0x19(%ebp) + 4fd: 6a 01 push $0x1 + 4ff: 57 push %edi + 500: 56 push %esi + 501: e8 3d fe ff ff call 343 + putc(fd, c); + 506: 83 c4 10 add $0x10,%esp + state = 0; + 509: 31 c9 xor %ecx,%ecx + 50b: eb 95 jmp 4a2 + 50d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 510: 83 ec 0c sub $0xc,%esp + 513: b9 10 00 00 00 mov $0x10,%ecx + 518: 6a 00 push $0x0 + 51a: 8b 45 d0 mov -0x30(%ebp),%eax + 51d: 8b 10 mov (%eax),%edx + 51f: 89 f0 mov %esi,%eax + 521: e8 7a fe ff ff call 3a0 + ap++; + 526: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 52a: 83 c4 10 add $0x10,%esp + state = 0; + 52d: 31 c9 xor %ecx,%ecx + 52f: e9 6e ff ff ff jmp 4a2 + 534: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 538: 8b 45 d0 mov -0x30(%ebp),%eax + 53b: 8b 10 mov (%eax),%edx + ap++; + 53d: 83 c0 04 add $0x4,%eax + 540: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 543: 85 d2 test %edx,%edx + 545: 0f 84 8d 00 00 00 je 5d8 + while (*s != 0) { + 54b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 54e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 550: 84 c0 test %al,%al + 552: 0f 84 4a ff ff ff je 4a2 + 558: 89 5d d4 mov %ebx,-0x2c(%ebp) + 55b: 89 d3 mov %edx,%ebx + 55d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 560: 83 ec 04 sub $0x4,%esp + s++; + 563: 83 c3 01 add $0x1,%ebx + 566: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 569: 6a 01 push $0x1 + 56b: 57 push %edi + 56c: 56 push %esi + 56d: e8 d1 fd ff ff call 343 + while (*s != 0) { + 572: 0f b6 03 movzbl (%ebx),%eax + 575: 83 c4 10 add $0x10,%esp + 578: 84 c0 test %al,%al + 57a: 75 e4 jne 560 + state = 0; + 57c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 57f: 31 c9 xor %ecx,%ecx + 581: e9 1c ff ff ff jmp 4a2 + 586: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 58d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 590: 83 ec 0c sub $0xc,%esp + 593: b9 0a 00 00 00 mov $0xa,%ecx + 598: 6a 01 push $0x1 + 59a: e9 7b ff ff ff jmp 51a + 59f: 90 nop + putc(fd, *ap); + 5a0: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 5a3: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 5a6: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 5a8: 6a 01 push $0x1 + 5aa: 57 push %edi + 5ab: 56 push %esi + putc(fd, *ap); + 5ac: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 5af: e8 8f fd ff ff call 343 + ap++; + 5b4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5b8: 83 c4 10 add $0x10,%esp + state = 0; + 5bb: 31 c9 xor %ecx,%ecx + 5bd: e9 e0 fe ff ff jmp 4a2 + 5c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5c8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5cb: 83 ec 04 sub $0x4,%esp + 5ce: e9 2a ff ff ff jmp 4fd + 5d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5d7: 90 nop + s = "(null)"; + 5d8: ba ab 07 00 00 mov $0x7ab,%edx + while (*s != 0) { + 5dd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5e0: b8 28 00 00 00 mov $0x28,%eax + 5e5: 89 d3 mov %edx,%ebx + 5e7: e9 74 ff ff ff jmp 560 + 5ec: 66 90 xchg %ax,%ax + 5ee: 66 90 xchg %ax,%ax + +000005f0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5f0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5f1: a1 c4 0a 00 00 mov 0xac4,%eax +void free(void *ap) { + 5f6: 89 e5 mov %esp,%ebp + 5f8: 57 push %edi + 5f9: 56 push %esi + 5fa: 53 push %ebx + 5fb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5fe: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 601: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 608: 89 c2 mov %eax,%edx + 60a: 8b 00 mov (%eax),%eax + 60c: 39 ca cmp %ecx,%edx + 60e: 73 30 jae 640 + 610: 39 c1 cmp %eax,%ecx + 612: 72 04 jb 618 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 614: 39 c2 cmp %eax,%edx + 616: 72 f0 jb 608 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 618: 8b 73 fc mov -0x4(%ebx),%esi + 61b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 61e: 39 f8 cmp %edi,%eax + 620: 74 30 je 652 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 622: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 625: 8b 42 04 mov 0x4(%edx),%eax + 628: 8d 34 c2 lea (%edx,%eax,8),%esi + 62b: 39 f1 cmp %esi,%ecx + 62d: 74 3a je 669 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 62f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 631: 5b pop %ebx + freep = p; + 632: 89 15 c4 0a 00 00 mov %edx,0xac4 +} + 638: 5e pop %esi + 639: 5f pop %edi + 63a: 5d pop %ebp + 63b: c3 ret + 63c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 640: 39 c2 cmp %eax,%edx + 642: 72 c4 jb 608 + 644: 39 c1 cmp %eax,%ecx + 646: 73 c0 jae 608 + if (bp + bp->s.size == p->s.ptr) { + 648: 8b 73 fc mov -0x4(%ebx),%esi + 64b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 64e: 39 f8 cmp %edi,%eax + 650: 75 d0 jne 622 + bp->s.size += p->s.ptr->s.size; + 652: 03 70 04 add 0x4(%eax),%esi + 655: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 658: 8b 02 mov (%edx),%eax + 65a: 8b 00 mov (%eax),%eax + 65c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 65f: 8b 42 04 mov 0x4(%edx),%eax + 662: 8d 34 c2 lea (%edx,%eax,8),%esi + 665: 39 f1 cmp %esi,%ecx + 667: 75 c6 jne 62f + p->s.size += bp->s.size; + 669: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 66c: 89 15 c4 0a 00 00 mov %edx,0xac4 + p->s.size += bp->s.size; + 672: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 675: 8b 4b f8 mov -0x8(%ebx),%ecx + 678: 89 0a mov %ecx,(%edx) +} + 67a: 5b pop %ebx + 67b: 5e pop %esi + 67c: 5f pop %edi + 67d: 5d pop %ebp + 67e: c3 ret + 67f: 90 nop + +00000680 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 680: 55 push %ebp + 681: 89 e5 mov %esp,%ebp + 683: 57 push %edi + 684: 56 push %esi + 685: 53 push %ebx + 686: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 689: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 68c: 8b 3d c4 0a 00 00 mov 0xac4,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 692: 8d 70 07 lea 0x7(%eax),%esi + 695: c1 ee 03 shr $0x3,%esi + 698: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 69b: 85 ff test %edi,%edi + 69d: 0f 84 9d 00 00 00 je 740 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6a3: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 6a5: 8b 4a 04 mov 0x4(%edx),%ecx + 6a8: 39 f1 cmp %esi,%ecx + 6aa: 73 6a jae 716 + 6ac: bb 00 10 00 00 mov $0x1000,%ebx + 6b1: 39 de cmp %ebx,%esi + 6b3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 6b6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 6bd: 89 45 e4 mov %eax,-0x1c(%ebp) + 6c0: eb 17 jmp 6d9 + 6c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6c8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6ca: 8b 48 04 mov 0x4(%eax),%ecx + 6cd: 39 f1 cmp %esi,%ecx + 6cf: 73 4f jae 720 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6d1: 8b 3d c4 0a 00 00 mov 0xac4,%edi + 6d7: 89 c2 mov %eax,%edx + 6d9: 39 d7 cmp %edx,%edi + 6db: 75 eb jne 6c8 + p = sbrk(nu * sizeof(Header)); + 6dd: 83 ec 0c sub $0xc,%esp + 6e0: ff 75 e4 push -0x1c(%ebp) + 6e3: e8 3b fc ff ff call 323 + if (p == (char*)-1) { + 6e8: 83 c4 10 add $0x10,%esp + 6eb: 83 f8 ff cmp $0xffffffff,%eax + 6ee: 74 1c je 70c + hp->s.size = nu; + 6f0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6f3: 83 ec 0c sub $0xc,%esp + 6f6: 83 c0 08 add $0x8,%eax + 6f9: 50 push %eax + 6fa: e8 f1 fe ff ff call 5f0 + return freep; + 6ff: 8b 15 c4 0a 00 00 mov 0xac4,%edx + if ((p = morecore(nunits)) == 0) { + 705: 83 c4 10 add $0x10,%esp + 708: 85 d2 test %edx,%edx + 70a: 75 bc jne 6c8 + return 0; + } + } + } +} + 70c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 70f: 31 c0 xor %eax,%eax +} + 711: 5b pop %ebx + 712: 5e pop %esi + 713: 5f pop %edi + 714: 5d pop %ebp + 715: c3 ret + if (p->s.size >= nunits) { + 716: 89 d0 mov %edx,%eax + 718: 89 fa mov %edi,%edx + 71a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 720: 39 ce cmp %ecx,%esi + 722: 74 4c je 770 + p->s.size -= nunits; + 724: 29 f1 sub %esi,%ecx + 726: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 729: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 72c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 72f: 89 15 c4 0a 00 00 mov %edx,0xac4 +} + 735: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 738: 83 c0 08 add $0x8,%eax +} + 73b: 5b pop %ebx + 73c: 5e pop %esi + 73d: 5f pop %edi + 73e: 5d pop %ebp + 73f: c3 ret + base.s.ptr = freep = prevp = &base; + 740: c7 05 c4 0a 00 00 c8 movl $0xac8,0xac4 + 747: 0a 00 00 + base.s.size = 0; + 74a: bf c8 0a 00 00 mov $0xac8,%edi + base.s.ptr = freep = prevp = &base; + 74f: c7 05 c8 0a 00 00 c8 movl $0xac8,0xac8 + 756: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 759: 89 fa mov %edi,%edx + base.s.size = 0; + 75b: c7 05 cc 0a 00 00 00 movl $0x0,0xacc + 762: 00 00 00 + if (p->s.size >= nunits) { + 765: e9 42 ff ff ff jmp 6ac + 76a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 770: 8b 08 mov (%eax),%ecx + 772: 89 0a mov %ecx,(%edx) + 774: eb b9 jmp 72f diff --git a/mkdir.d b/mkdir.d new file mode 100644 index 0000000..0c77808 --- /dev/null +++ b/mkdir.d @@ -0,0 +1 @@ +mkdir.o: mkdir.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/mkdir.o b/mkdir.o new file mode 100644 index 0000000000000000000000000000000000000000..3a6e6cb05140482da48a7b4604f55ea929e7a251 GIT binary patch literal 3460 zcma)8TWnlc72WqW9((-ER7o5MGL4cn5zLLpj?&gm(nnfaM=nj1nt~9ru4k@iF7e#4 z?<0>kZ9c3DP!)+H;0qzX_~3^h1b;jPQiTK`{Q^Oy{v>MErl{}%NJKSjojGT6EkJZj z=d8W=S$m(yJ!j9{cxvf$mSu?%OB}gpi7XBGM@}d>Dl@WAmeZgeF4Vf0T2WG4i`K)` z_x%x3_CoD&T3ZX?Y}K+}t(k;D7LJ(gA~%-~xm&kB+TOgo{Egc${(@6|;o|dKcgnAS z$$h=C^=o(QW9!v3H-B=3AvZ6})}7Jq`SOBEiL37xNdkLLomALA13*GQ;gxDoT8yTT~tn_X89mc7cij0myw>-sx zCRb>FZwlnGzp0UNlI=HSoIcCjN7xM)mpl=PRT?JY6xsrs&2Ev(d2}08xVGz55~FYq z4vEVJx?HMQhon+DQ*p*Yd`4ceZd9>EPZk00gjDW#sd-b@;qhw4IWTizdC!zJi8C+h zxU$HQZ#_Egj4xCksXSbHV0y87YT80j`H0Fg?90y4uUXTlrbR|}M)hMVJoC|=Ba783 zYgg&9y)UV(W1g6)7OOVs<2xLCe)a?wH*rFoa(_J_^?mX` zh`oufMZL92ee()*5U>}KGuDf;A84a7#t4tq$OIHKiMmc#o*Z3F#AAnB{ z$^nbXZR>zN;XDaVme{?(&O0ccnr*k|Rqyi-mL|@X&w1t7yy4RO-dM@O)jl-8Eyc%Vi!=dBd zuoVTz)3ue0*V6MzuYEj7(=biDVVuqN56o|VLYAt8VCQL=_^3rspFO)!JG#7@$62nA zw%*8<*?4ts&YwMTOuOYiesqZS(gm@um#vvm*Zn$f$t--lc@%Zqo*cDganiGMd3r;31yl_Tb`RlgPiB91*_ie8@jB$0B2R=vi4}?gstQ9Sv& zY!qKUFbj|C%d|0BTida=QzCdMa45eh%S3FOE4Q#+)?(s5B97-E5#(b;@MbkWsPT-( za~jor;B9LA6^-A~_yeLN@?&lPT;p$vs9L|*_-BppXuL&4+=m+fu8|*{{xYi$aF4c6 zYh)qhPbANh<7&S^wJ+@Rv-ATS8hM_yA0vWS1KL3G(`#KkQDBzzv17C>yqbyM3bH`_ z)if19>Cqsw;WuE0>pnSf1WA@}^gXR`HE*v(@mdeDN)J|7lkjqJbiLPHkJ5}OkwdeR zAZ~{{TuI#i588SZhbA!=VpO_Ul-=xgSqH?AQJ{Pj$+{{${i(vvimGVX_$QMY(D)X4 z-jox481&|y-VYCT9x3I2@gBe!@96*IsqY8g92$lB=9Sj(I2YTa8qNAPV5^z~q^P$B zd;|^GSABng+(E!YK>mWWdhqv=>v|rId5ydaWq-k8)Mw!@<~xKp^+))a59%P_SD>31 zsN&cn?^DrY#(J=g&Y=&%drET%W{iK{iu2yZWZWa?#q}P{y9M3EK$SThc#Vn{Gj;=Z zG2bW-!Q?~v8RYvebQ8lA7myGCng(LVz6DP)-+tudxpIB1k>;F#1l`0yl@R&379(ct zhj0}09YV6B@G&3PY4ZIPI%8(hD7TRBut@@&D%-C#8s0EIK5MEG!+Q%3>W0?>k9X3D z;r$5?>PEiF%Ty3E_80i5hkIWeSohXG1z(Z(0_Oeaf8qTbH)+2< literal 0 HcmV?d00001 diff --git a/mkdir.sym b/mkdir.sym new file mode 100644 index 0000000..819228f --- /dev/null +++ b/mkdir.sym @@ -0,0 +1,50 @@ +00000000 mkdir.c +00000000 ulib.c +00000000 printf.c +000003a0 printint +0000080c digits.0 +00000000 umalloc.c +00000ac4 freep +00000ac8 base +00000080 strcpy +00000450 printf +0000037b greeting +000002a0 memmove +0000034b mknod +000001a0 gets +0000031b getpid +0000038b screen +00000680 malloc +0000032b sleep +000002e3 pipe +00000373 getch +00000343 write +00000303 fstat +000002f3 kill +0000030b chdir +000002fb exec +000002db wait +000002eb read +00000353 unlink +000002cb fork +00000323 sbrk +00000333 uptime +00000ac4 __bss_start +00000140 memset +00000000 main +000000b0 strcmp +00000383 shutdown +00000313 dup +00000210 stat +00000ac4 _edata +00000ad0 _end +0000035b link +000002d3 exit +00000260 atoi +00000393 cls +00000110 strlen +0000033b open +00000160 strchr +00000363 mkdir +0000036b close +000005f0 free diff --git a/mkfs b/mkfs new file mode 100644 index 0000000000000000000000000000000000000000..d536cc4e69ed0b67ac06ba8e3f6c3c9c783d1898 GIT binary patch literal 21440 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 literal 0 HcmV?d00001 diff --git a/mp.d b/mp.d new file mode 100644 index 0000000..0714441 --- /dev/null +++ b/mp.d @@ -0,0 +1,2 @@ +mp.o: mp.c /usr/include/stdc-predef.h types.h defs.h param.h memlayout.h \ + mp.h x86.h mmu.h proc.h diff --git a/mp.o b/mp.o new file mode 100644 index 0000000000000000000000000000000000000000..fdf3583e49468419ca9a7980ae2c5d15e79e9215 GIT binary patch literal 11616 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 literal 0 HcmV?d00001 diff --git a/pipe.d b/pipe.d new file mode 100644 index 0000000..3d0eac9 --- /dev/null +++ b/pipe.d @@ -0,0 +1,2 @@ +pipe.o: pipe.c /usr/include/stdc-predef.h types.h defs.h param.h mmu.h \ + proc.h fs.h spinlock.h sleeplock.h file.h diff --git a/pipe.o b/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..9cd2608efb9967c80370f850a8321a0e0b9d0e7c GIT binary patch literal 11128 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 tQ?L&p<{uj<*=q>;N literal 0 HcmV?d00001 diff --git a/printf.d b/printf.d new file mode 100644 index 0000000..ddd3a8d --- /dev/null +++ b/printf.d @@ -0,0 +1 @@ +printf.o: printf.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/printf.o b/printf.o new file mode 100644 index 0000000000000000000000000000000000000000..940bfcda1807fc785188621c97252a03e6a2e472 GIT binary patch literal 7136 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

GKJdUtRO(B+xi>>vtt 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 A@&Et; literal 0 HcmV?d00001 diff --git a/rm.asm b/rm.asm new file mode 100644 index 0000000..54173a1 --- /dev/null +++ b/rm.asm @@ -0,0 +1,1202 @@ + +_rm: file format elf32-i386 + + +Disassembly of section .text: + +00000000

: +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: bf 01 00 00 00 mov $0x1,%edi + 13: 56 push %esi + 14: 53 push %ebx + 15: 51 push %ecx + 16: 83 ec 08 sub $0x8,%esp + 19: 8b 59 04 mov 0x4(%ecx),%ebx + 1c: 8b 31 mov (%ecx),%esi + 1e: 83 c3 04 add $0x4,%ebx + int i; + + if (argc < 2) { + 21: 83 fe 01 cmp $0x1,%esi + 24: 7e 3e jle 64 + 26: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2d: 8d 76 00 lea 0x0(%esi),%esi + printf(2, "Usage: rm files...\n"); + exit(); + } + + for (i = 1; i < argc; i++) { + if (unlink(argv[i]) < 0) { + 30: 83 ec 0c sub $0xc,%esp + 33: ff 33 push (%ebx) + 35: e8 19 03 00 00 call 353 + 3a: 83 c4 10 add $0x10,%esp + 3d: 85 c0 test %eax,%eax + 3f: 78 0f js 50 + for (i = 1; i < argc; i++) { + 41: 83 c7 01 add $0x1,%edi + 44: 83 c3 04 add $0x4,%ebx + 47: 39 fe cmp %edi,%esi + 49: 75 e5 jne 30 + printf(2, "rm: %s failed to delete\n", argv[i]); + break; + } + } + + exit(); + 4b: e8 83 02 00 00 call 2d3 + printf(2, "rm: %s failed to delete\n", argv[i]); + 50: 50 push %eax + 51: ff 33 push (%ebx) + 53: 68 8c 07 00 00 push $0x78c + 58: 6a 02 push $0x2 + 5a: e8 f1 03 00 00 call 450 + break; + 5f: 83 c4 10 add $0x10,%esp + 62: eb e7 jmp 4b + printf(2, "Usage: rm files...\n"); + 64: 52 push %edx + 65: 52 push %edx + 66: 68 78 07 00 00 push $0x778 + 6b: 6a 02 push $0x2 + 6d: e8 de 03 00 00 call 450 + exit(); + 72: e8 5c 02 00 00 call 2d3 + 77: 66 90 xchg %ax,%ax + 79: 66 90 xchg %ax,%ax + 7b: 66 90 xchg %ax,%ax + 7d: 66 90 xchg %ax,%ax + 7f: 90 nop + +00000080 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 80: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 81: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 83: 89 e5 mov %esp,%ebp + 85: 53 push %ebx + 86: 8b 4d 08 mov 0x8(%ebp),%ecx + 89: 8b 5d 0c mov 0xc(%ebp),%ebx + 8c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 90: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 94: 88 14 01 mov %dl,(%ecx,%eax,1) + 97: 83 c0 01 add $0x1,%eax + 9a: 84 d2 test %dl,%dl + 9c: 75 f2 jne 90 + ; + } + return os; +} + 9e: 8b 5d fc mov -0x4(%ebp),%ebx + a1: 89 c8 mov %ecx,%eax + a3: c9 leave + a4: c3 ret + a5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000000b0 : + +int strcmp(const char *p, const char *q) { + b0: 55 push %ebp + b1: 89 e5 mov %esp,%ebp + b3: 53 push %ebx + b4: 8b 55 08 mov 0x8(%ebp),%edx + b7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + ba: 0f b6 02 movzbl (%edx),%eax + bd: 84 c0 test %al,%al + bf: 75 17 jne d8 + c1: eb 3a jmp fd + c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c7: 90 nop + c8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + cc: 83 c2 01 add $0x1,%edx + cf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + d2: 84 c0 test %al,%al + d4: 74 1a je f0 + p++, q++; + d6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + d8: 0f b6 19 movzbl (%ecx),%ebx + db: 38 c3 cmp %al,%bl + dd: 74 e9 je c8 + } + return (uchar) * p - (uchar) * q; + df: 29 d8 sub %ebx,%eax +} + e1: 8b 5d fc mov -0x4(%ebp),%ebx + e4: c9 leave + e5: c3 ret + e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ed: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + f0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + f4: 31 c0 xor %eax,%eax + f6: 29 d8 sub %ebx,%eax +} + f8: 8b 5d fc mov -0x4(%ebp),%ebx + fb: c9 leave + fc: c3 ret + return (uchar) * p - (uchar) * q; + fd: 0f b6 19 movzbl (%ecx),%ebx + 100: 31 c0 xor %eax,%eax + 102: eb db jmp df + 104: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 10b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 10f: 90 nop + +00000110 : + +uint strlen(const char *s) { + 110: 55 push %ebp + 111: 89 e5 mov %esp,%ebp + 113: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 116: 80 3a 00 cmpb $0x0,(%edx) + 119: 74 15 je 130 + 11b: 31 c0 xor %eax,%eax + 11d: 8d 76 00 lea 0x0(%esi),%esi + 120: 83 c0 01 add $0x1,%eax + 123: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 127: 89 c1 mov %eax,%ecx + 129: 75 f5 jne 120 + ; + } + return n; +} + 12b: 89 c8 mov %ecx,%eax + 12d: 5d pop %ebp + 12e: c3 ret + 12f: 90 nop + for (n = 0; s[n]; n++) { + 130: 31 c9 xor %ecx,%ecx +} + 132: 5d pop %ebp + 133: 89 c8 mov %ecx,%eax + 135: c3 ret + 136: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 13d: 8d 76 00 lea 0x0(%esi),%esi + +00000140 : + +void* memset(void *dst, int c, uint n) { + 140: 55 push %ebp + 141: 89 e5 mov %esp,%ebp + 143: 57 push %edi + 144: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 147: 8b 4d 10 mov 0x10(%ebp),%ecx + 14a: 8b 45 0c mov 0xc(%ebp),%eax + 14d: 89 d7 mov %edx,%edi + 14f: fc cld + 150: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 152: 8b 7d fc mov -0x4(%ebp),%edi + 155: 89 d0 mov %edx,%eax + 157: c9 leave + 158: c3 ret + 159: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000160 : + +char* strchr(const char *s, char c) { + 160: 55 push %ebp + 161: 89 e5 mov %esp,%ebp + 163: 8b 45 08 mov 0x8(%ebp),%eax + 166: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 16a: 0f b6 10 movzbl (%eax),%edx + 16d: 84 d2 test %dl,%dl + 16f: 75 12 jne 183 + 171: eb 1d jmp 190 + 173: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 177: 90 nop + 178: 0f b6 50 01 movzbl 0x1(%eax),%edx + 17c: 83 c0 01 add $0x1,%eax + 17f: 84 d2 test %dl,%dl + 181: 74 0d je 190 + if (*s == c) { + 183: 38 d1 cmp %dl,%cl + 185: 75 f1 jne 178 + return (char*)s; + } + } + return 0; +} + 187: 5d pop %ebp + 188: c3 ret + 189: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 190: 31 c0 xor %eax,%eax +} + 192: 5d pop %ebp + 193: c3 ret + 194: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 19b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 19f: 90 nop + +000001a0 : + +char* gets(char *buf, int max) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 57 push %edi + 1a4: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 1a5: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 1a8: 53 push %ebx + for (i = 0; i + 1 < max;) { + 1a9: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 1ab: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 1ae: eb 27 jmp 1d7 + cc = read(0, &c, 1); + 1b0: 83 ec 04 sub $0x4,%esp + 1b3: 6a 01 push $0x1 + 1b5: 57 push %edi + 1b6: 6a 00 push $0x0 + 1b8: e8 2e 01 00 00 call 2eb + if (cc < 1) { + 1bd: 83 c4 10 add $0x10,%esp + 1c0: 85 c0 test %eax,%eax + 1c2: 7e 1d jle 1e1 + break; + } + buf[i++] = c; + 1c4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1c8: 8b 55 08 mov 0x8(%ebp),%edx + 1cb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1cf: 3c 0a cmp $0xa,%al + 1d1: 74 1d je 1f0 + 1d3: 3c 0d cmp $0xd,%al + 1d5: 74 19 je 1f0 + for (i = 0; i + 1 < max;) { + 1d7: 89 de mov %ebx,%esi + 1d9: 83 c3 01 add $0x1,%ebx + 1dc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1df: 7c cf jl 1b0 + break; + } + } + buf[i] = '\0'; + 1e1: 8b 45 08 mov 0x8(%ebp),%eax + 1e4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1e8: 8d 65 f4 lea -0xc(%ebp),%esp + 1eb: 5b pop %ebx + 1ec: 5e pop %esi + 1ed: 5f pop %edi + 1ee: 5d pop %ebp + 1ef: c3 ret + buf[i] = '\0'; + 1f0: 8b 45 08 mov 0x8(%ebp),%eax + 1f3: 89 de mov %ebx,%esi + 1f5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1f9: 8d 65 f4 lea -0xc(%ebp),%esp + 1fc: 5b pop %ebx + 1fd: 5e pop %esi + 1fe: 5f pop %edi + 1ff: 5d pop %ebp + 200: c3 ret + 201: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 208: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20f: 90 nop + +00000210 : + +int stat(const char *n, struct stat *st) { + 210: 55 push %ebp + 211: 89 e5 mov %esp,%ebp + 213: 56 push %esi + 214: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 215: 83 ec 08 sub $0x8,%esp + 218: 6a 00 push $0x0 + 21a: ff 75 08 push 0x8(%ebp) + 21d: e8 19 01 00 00 call 33b + if (fd < 0) { + 222: 83 c4 10 add $0x10,%esp + 225: 85 c0 test %eax,%eax + 227: 78 27 js 250 + return -1; + } + r = fstat(fd, st); + 229: 83 ec 08 sub $0x8,%esp + 22c: ff 75 0c push 0xc(%ebp) + 22f: 89 c3 mov %eax,%ebx + 231: 50 push %eax + 232: e8 cc 00 00 00 call 303 + close(fd); + 237: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 23a: 89 c6 mov %eax,%esi + close(fd); + 23c: e8 2a 01 00 00 call 36b + return r; + 241: 83 c4 10 add $0x10,%esp +} + 244: 8d 65 f8 lea -0x8(%ebp),%esp + 247: 89 f0 mov %esi,%eax + 249: 5b pop %ebx + 24a: 5e pop %esi + 24b: 5d pop %ebp + 24c: c3 ret + 24d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 250: be ff ff ff ff mov $0xffffffff,%esi + 255: eb ed jmp 244 + 257: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25e: 66 90 xchg %ax,%ax + +00000260 : + +int atoi(const char *s) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 53 push %ebx + 264: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 267: 0f be 02 movsbl (%edx),%eax + 26a: 8d 48 d0 lea -0x30(%eax),%ecx + 26d: 80 f9 09 cmp $0x9,%cl + n = 0; + 270: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 275: 77 1e ja 295 + 277: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 27e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 280: 83 c2 01 add $0x1,%edx + 283: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 286: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 28a: 0f be 02 movsbl (%edx),%eax + 28d: 8d 58 d0 lea -0x30(%eax),%ebx + 290: 80 fb 09 cmp $0x9,%bl + 293: 76 eb jbe 280 + } + return n; +} + 295: 8b 5d fc mov -0x4(%ebp),%ebx + 298: 89 c8 mov %ecx,%eax + 29a: c9 leave + 29b: c3 ret + 29c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000002a0 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 2a0: 55 push %ebp + 2a1: 89 e5 mov %esp,%ebp + 2a3: 57 push %edi + 2a4: 8b 45 10 mov 0x10(%ebp),%eax + 2a7: 8b 55 08 mov 0x8(%ebp),%edx + 2aa: 56 push %esi + 2ab: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 2ae: 85 c0 test %eax,%eax + 2b0: 7e 13 jle 2c5 + 2b2: 01 d0 add %edx,%eax + dst = vdst; + 2b4: 89 d7 mov %edx,%edi + 2b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2bd: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2c0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2c1: 39 f8 cmp %edi,%eax + 2c3: 75 fb jne 2c0 + } + return vdst; +} + 2c5: 5e pop %esi + 2c6: 89 d0 mov %edx,%eax + 2c8: 5f pop %edi + 2c9: 5d pop %ebp + 2ca: c3 ret + +000002cb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2cb: b8 01 00 00 00 mov $0x1,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(exit) + 2d3: b8 02 00 00 00 mov $0x2,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(wait) + 2db: b8 03 00 00 00 mov $0x3,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(pipe) + 2e3: b8 04 00 00 00 mov $0x4,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(read) + 2eb: b8 05 00 00 00 mov $0x5,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(kill) + 2f3: b8 06 00 00 00 mov $0x6,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(exec) + 2fb: b8 07 00 00 00 mov $0x7,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(fstat) + 303: b8 08 00 00 00 mov $0x8,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(chdir) + 30b: b8 09 00 00 00 mov $0x9,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(dup) + 313: b8 0a 00 00 00 mov $0xa,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(getpid) + 31b: b8 0b 00 00 00 mov $0xb,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(sbrk) + 323: b8 0c 00 00 00 mov $0xc,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(sleep) + 32b: b8 0d 00 00 00 mov $0xd,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(uptime) + 333: b8 0e 00 00 00 mov $0xe,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(open) + 33b: b8 0f 00 00 00 mov $0xf,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(write) + 343: b8 10 00 00 00 mov $0x10,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(mknod) + 34b: b8 11 00 00 00 mov $0x11,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(unlink) + 353: b8 12 00 00 00 mov $0x12,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(link) + 35b: b8 13 00 00 00 mov $0x13,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(mkdir) + 363: b8 14 00 00 00 mov $0x14,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(close) + 36b: b8 15 00 00 00 mov $0x15,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(getch) + 373: b8 16 00 00 00 mov $0x16,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(greeting) + 37b: b8 17 00 00 00 mov $0x17,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(shutdown) + 383: b8 18 00 00 00 mov $0x18,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(screen) + 38b: b8 19 00 00 00 mov $0x19,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(cls) + 393: b8 1a 00 00 00 mov $0x1a,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + 39b: 66 90 xchg %ax,%ax + 39d: 66 90 xchg %ax,%ax + 39f: 90 nop + +000003a0 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 3a0: 55 push %ebp + 3a1: 89 e5 mov %esp,%ebp + 3a3: 57 push %edi + 3a4: 56 push %esi + 3a5: 53 push %ebx + 3a6: 83 ec 3c sub $0x3c,%esp + 3a9: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 3ac: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 3ae: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 3b1: 85 d2 test %edx,%edx + 3b3: 0f 89 7f 00 00 00 jns 438 + 3b9: f6 45 08 01 testb $0x1,0x8(%ebp) + 3bd: 74 79 je 438 + neg = 1; + 3bf: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3c6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3c8: 31 db xor %ebx,%ebx + 3ca: 8d 75 d7 lea -0x29(%ebp),%esi + 3cd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3d0: 89 c8 mov %ecx,%eax + 3d2: 31 d2 xor %edx,%edx + 3d4: 89 cf mov %ecx,%edi + 3d6: f7 75 c4 divl -0x3c(%ebp) + 3d9: 0f b6 92 04 08 00 00 movzbl 0x804(%edx),%edx + 3e0: 89 45 c0 mov %eax,-0x40(%ebp) + 3e3: 89 d8 mov %ebx,%eax + 3e5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3e8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3eb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3ee: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3f1: 76 dd jbe 3d0 + if (neg) { + 3f3: 8b 4d bc mov -0x44(%ebp),%ecx + 3f6: 85 c9 test %ecx,%ecx + 3f8: 74 0c je 406 + buf[i++] = '-'; + 3fa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3ff: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 401: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 406: 8b 7d b8 mov -0x48(%ebp),%edi + 409: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 40d: eb 07 jmp 416 + 40f: 90 nop + putc(fd, buf[i]); + 410: 0f b6 13 movzbl (%ebx),%edx + 413: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 416: 83 ec 04 sub $0x4,%esp + 419: 88 55 d7 mov %dl,-0x29(%ebp) + 41c: 6a 01 push $0x1 + 41e: 56 push %esi + 41f: 57 push %edi + 420: e8 1e ff ff ff call 343 + while (--i >= 0) { + 425: 83 c4 10 add $0x10,%esp + 428: 39 de cmp %ebx,%esi + 42a: 75 e4 jne 410 + } +} + 42c: 8d 65 f4 lea -0xc(%ebp),%esp + 42f: 5b pop %ebx + 430: 5e pop %esi + 431: 5f pop %edi + 432: 5d pop %ebp + 433: c3 ret + 434: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 438: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 43f: eb 87 jmp 3c8 + 441: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 448: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 44f: 90 nop + +00000450 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 450: 55 push %ebp + 451: 89 e5 mov %esp,%ebp + 453: 57 push %edi + 454: 56 push %esi + 455: 53 push %ebx + 456: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 459: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 45c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 45f: 0f b6 13 movzbl (%ebx),%edx + 462: 84 d2 test %dl,%dl + 464: 74 6a je 4d0 + ap = (uint*)(void*)&fmt + 1; + 466: 8d 45 10 lea 0x10(%ebp),%eax + 469: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 46c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 46f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 471: 89 45 d0 mov %eax,-0x30(%ebp) + 474: eb 36 jmp 4ac + 476: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 47d: 8d 76 00 lea 0x0(%esi),%esi + 480: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 483: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 488: 83 f8 25 cmp $0x25,%eax + 48b: 74 15 je 4a2 + write(fd, &c, 1); + 48d: 83 ec 04 sub $0x4,%esp + 490: 88 55 e7 mov %dl,-0x19(%ebp) + 493: 6a 01 push $0x1 + 495: 57 push %edi + 496: 56 push %esi + 497: e8 a7 fe ff ff call 343 + 49c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 49f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 4a2: 0f b6 13 movzbl (%ebx),%edx + 4a5: 83 c3 01 add $0x1,%ebx + 4a8: 84 d2 test %dl,%dl + 4aa: 74 24 je 4d0 + c = fmt[i] & 0xff; + 4ac: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 4af: 85 c9 test %ecx,%ecx + 4b1: 74 cd je 480 + } + } + else if (state == '%') { + 4b3: 83 f9 25 cmp $0x25,%ecx + 4b6: 75 ea jne 4a2 + if (c == 'd') { + 4b8: 83 f8 25 cmp $0x25,%eax + 4bb: 0f 84 07 01 00 00 je 5c8 + 4c1: 83 e8 63 sub $0x63,%eax + 4c4: 83 f8 15 cmp $0x15,%eax + 4c7: 77 17 ja 4e0 + 4c9: ff 24 85 ac 07 00 00 jmp *0x7ac(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4d0: 8d 65 f4 lea -0xc(%ebp),%esp + 4d3: 5b pop %ebx + 4d4: 5e pop %esi + 4d5: 5f pop %edi + 4d6: 5d pop %ebp + 4d7: c3 ret + 4d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4df: 90 nop + write(fd, &c, 1); + 4e0: 83 ec 04 sub $0x4,%esp + 4e3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4e6: 6a 01 push $0x1 + 4e8: 57 push %edi + 4e9: 56 push %esi + 4ea: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4ee: e8 50 fe ff ff call 343 + putc(fd, c); + 4f3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4f7: 83 c4 0c add $0xc,%esp + 4fa: 88 55 e7 mov %dl,-0x19(%ebp) + 4fd: 6a 01 push $0x1 + 4ff: 57 push %edi + 500: 56 push %esi + 501: e8 3d fe ff ff call 343 + putc(fd, c); + 506: 83 c4 10 add $0x10,%esp + state = 0; + 509: 31 c9 xor %ecx,%ecx + 50b: eb 95 jmp 4a2 + 50d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 510: 83 ec 0c sub $0xc,%esp + 513: b9 10 00 00 00 mov $0x10,%ecx + 518: 6a 00 push $0x0 + 51a: 8b 45 d0 mov -0x30(%ebp),%eax + 51d: 8b 10 mov (%eax),%edx + 51f: 89 f0 mov %esi,%eax + 521: e8 7a fe ff ff call 3a0 + ap++; + 526: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 52a: 83 c4 10 add $0x10,%esp + state = 0; + 52d: 31 c9 xor %ecx,%ecx + 52f: e9 6e ff ff ff jmp 4a2 + 534: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 538: 8b 45 d0 mov -0x30(%ebp),%eax + 53b: 8b 10 mov (%eax),%edx + ap++; + 53d: 83 c0 04 add $0x4,%eax + 540: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 543: 85 d2 test %edx,%edx + 545: 0f 84 8d 00 00 00 je 5d8 + while (*s != 0) { + 54b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 54e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 550: 84 c0 test %al,%al + 552: 0f 84 4a ff ff ff je 4a2 + 558: 89 5d d4 mov %ebx,-0x2c(%ebp) + 55b: 89 d3 mov %edx,%ebx + 55d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 560: 83 ec 04 sub $0x4,%esp + s++; + 563: 83 c3 01 add $0x1,%ebx + 566: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 569: 6a 01 push $0x1 + 56b: 57 push %edi + 56c: 56 push %esi + 56d: e8 d1 fd ff ff call 343 + while (*s != 0) { + 572: 0f b6 03 movzbl (%ebx),%eax + 575: 83 c4 10 add $0x10,%esp + 578: 84 c0 test %al,%al + 57a: 75 e4 jne 560 + state = 0; + 57c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 57f: 31 c9 xor %ecx,%ecx + 581: e9 1c ff ff ff jmp 4a2 + 586: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 58d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 590: 83 ec 0c sub $0xc,%esp + 593: b9 0a 00 00 00 mov $0xa,%ecx + 598: 6a 01 push $0x1 + 59a: e9 7b ff ff ff jmp 51a + 59f: 90 nop + putc(fd, *ap); + 5a0: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 5a3: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 5a6: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 5a8: 6a 01 push $0x1 + 5aa: 57 push %edi + 5ab: 56 push %esi + putc(fd, *ap); + 5ac: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 5af: e8 8f fd ff ff call 343 + ap++; + 5b4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5b8: 83 c4 10 add $0x10,%esp + state = 0; + 5bb: 31 c9 xor %ecx,%ecx + 5bd: e9 e0 fe ff ff jmp 4a2 + 5c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5c8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5cb: 83 ec 04 sub $0x4,%esp + 5ce: e9 2a ff ff ff jmp 4fd + 5d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5d7: 90 nop + s = "(null)"; + 5d8: ba a5 07 00 00 mov $0x7a5,%edx + while (*s != 0) { + 5dd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5e0: b8 28 00 00 00 mov $0x28,%eax + 5e5: 89 d3 mov %edx,%ebx + 5e7: e9 74 ff ff ff jmp 560 + 5ec: 66 90 xchg %ax,%ax + 5ee: 66 90 xchg %ax,%ax + +000005f0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5f0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5f1: a1 bc 0a 00 00 mov 0xabc,%eax +void free(void *ap) { + 5f6: 89 e5 mov %esp,%ebp + 5f8: 57 push %edi + 5f9: 56 push %esi + 5fa: 53 push %ebx + 5fb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5fe: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 601: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 608: 89 c2 mov %eax,%edx + 60a: 8b 00 mov (%eax),%eax + 60c: 39 ca cmp %ecx,%edx + 60e: 73 30 jae 640 + 610: 39 c1 cmp %eax,%ecx + 612: 72 04 jb 618 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 614: 39 c2 cmp %eax,%edx + 616: 72 f0 jb 608 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 618: 8b 73 fc mov -0x4(%ebx),%esi + 61b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 61e: 39 f8 cmp %edi,%eax + 620: 74 30 je 652 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 622: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 625: 8b 42 04 mov 0x4(%edx),%eax + 628: 8d 34 c2 lea (%edx,%eax,8),%esi + 62b: 39 f1 cmp %esi,%ecx + 62d: 74 3a je 669 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 62f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 631: 5b pop %ebx + freep = p; + 632: 89 15 bc 0a 00 00 mov %edx,0xabc +} + 638: 5e pop %esi + 639: 5f pop %edi + 63a: 5d pop %ebp + 63b: c3 ret + 63c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 640: 39 c2 cmp %eax,%edx + 642: 72 c4 jb 608 + 644: 39 c1 cmp %eax,%ecx + 646: 73 c0 jae 608 + if (bp + bp->s.size == p->s.ptr) { + 648: 8b 73 fc mov -0x4(%ebx),%esi + 64b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 64e: 39 f8 cmp %edi,%eax + 650: 75 d0 jne 622 + bp->s.size += p->s.ptr->s.size; + 652: 03 70 04 add 0x4(%eax),%esi + 655: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 658: 8b 02 mov (%edx),%eax + 65a: 8b 00 mov (%eax),%eax + 65c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 65f: 8b 42 04 mov 0x4(%edx),%eax + 662: 8d 34 c2 lea (%edx,%eax,8),%esi + 665: 39 f1 cmp %esi,%ecx + 667: 75 c6 jne 62f + p->s.size += bp->s.size; + 669: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 66c: 89 15 bc 0a 00 00 mov %edx,0xabc + p->s.size += bp->s.size; + 672: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 675: 8b 4b f8 mov -0x8(%ebx),%ecx + 678: 89 0a mov %ecx,(%edx) +} + 67a: 5b pop %ebx + 67b: 5e pop %esi + 67c: 5f pop %edi + 67d: 5d pop %ebp + 67e: c3 ret + 67f: 90 nop + +00000680 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 680: 55 push %ebp + 681: 89 e5 mov %esp,%ebp + 683: 57 push %edi + 684: 56 push %esi + 685: 53 push %ebx + 686: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 689: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 68c: 8b 3d bc 0a 00 00 mov 0xabc,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 692: 8d 70 07 lea 0x7(%eax),%esi + 695: c1 ee 03 shr $0x3,%esi + 698: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 69b: 85 ff test %edi,%edi + 69d: 0f 84 9d 00 00 00 je 740 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6a3: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 6a5: 8b 4a 04 mov 0x4(%edx),%ecx + 6a8: 39 f1 cmp %esi,%ecx + 6aa: 73 6a jae 716 + 6ac: bb 00 10 00 00 mov $0x1000,%ebx + 6b1: 39 de cmp %ebx,%esi + 6b3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 6b6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 6bd: 89 45 e4 mov %eax,-0x1c(%ebp) + 6c0: eb 17 jmp 6d9 + 6c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6c8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6ca: 8b 48 04 mov 0x4(%eax),%ecx + 6cd: 39 f1 cmp %esi,%ecx + 6cf: 73 4f jae 720 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6d1: 8b 3d bc 0a 00 00 mov 0xabc,%edi + 6d7: 89 c2 mov %eax,%edx + 6d9: 39 d7 cmp %edx,%edi + 6db: 75 eb jne 6c8 + p = sbrk(nu * sizeof(Header)); + 6dd: 83 ec 0c sub $0xc,%esp + 6e0: ff 75 e4 push -0x1c(%ebp) + 6e3: e8 3b fc ff ff call 323 + if (p == (char*)-1) { + 6e8: 83 c4 10 add $0x10,%esp + 6eb: 83 f8 ff cmp $0xffffffff,%eax + 6ee: 74 1c je 70c + hp->s.size = nu; + 6f0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6f3: 83 ec 0c sub $0xc,%esp + 6f6: 83 c0 08 add $0x8,%eax + 6f9: 50 push %eax + 6fa: e8 f1 fe ff ff call 5f0 + return freep; + 6ff: 8b 15 bc 0a 00 00 mov 0xabc,%edx + if ((p = morecore(nunits)) == 0) { + 705: 83 c4 10 add $0x10,%esp + 708: 85 d2 test %edx,%edx + 70a: 75 bc jne 6c8 + return 0; + } + } + } +} + 70c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 70f: 31 c0 xor %eax,%eax +} + 711: 5b pop %ebx + 712: 5e pop %esi + 713: 5f pop %edi + 714: 5d pop %ebp + 715: c3 ret + if (p->s.size >= nunits) { + 716: 89 d0 mov %edx,%eax + 718: 89 fa mov %edi,%edx + 71a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 720: 39 ce cmp %ecx,%esi + 722: 74 4c je 770 + p->s.size -= nunits; + 724: 29 f1 sub %esi,%ecx + 726: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 729: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 72c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 72f: 89 15 bc 0a 00 00 mov %edx,0xabc +} + 735: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 738: 83 c0 08 add $0x8,%eax +} + 73b: 5b pop %ebx + 73c: 5e pop %esi + 73d: 5f pop %edi + 73e: 5d pop %ebp + 73f: c3 ret + base.s.ptr = freep = prevp = &base; + 740: c7 05 bc 0a 00 00 c0 movl $0xac0,0xabc + 747: 0a 00 00 + base.s.size = 0; + 74a: bf c0 0a 00 00 mov $0xac0,%edi + base.s.ptr = freep = prevp = &base; + 74f: c7 05 c0 0a 00 00 c0 movl $0xac0,0xac0 + 756: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 759: 89 fa mov %edi,%edx + base.s.size = 0; + 75b: c7 05 c4 0a 00 00 00 movl $0x0,0xac4 + 762: 00 00 00 + if (p->s.size >= nunits) { + 765: e9 42 ff ff ff jmp 6ac + 76a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 770: 8b 08 mov (%eax),%ecx + 772: 89 0a mov %ecx,(%edx) + 774: eb b9 jmp 72f diff --git a/rm.d b/rm.d new file mode 100644 index 0000000..ba50b6b --- /dev/null +++ b/rm.d @@ -0,0 +1 @@ +rm.o: rm.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/rm.o b/rm.o new file mode 100644 index 0000000000000000000000000000000000000000..9e3e2407c0da8d7a4a1c7a6a02496153968cd767 GIT binary patch literal 3452 zcma)8OKerAr>r9$oHKLlsimha%Mv4&IC9StxiC72oKkR94#<94NrQH{P)mBX^{5-BzVDAo z(p#uKkk-}%cv`irUu%WkFbl^_U4yrm?svEDytlpi!OGX}KK~OA^|{N>ZM{=|?F;T} zjjf-%TOV34pS%5o!%Vn+Rkq$4-#+=L54N|rx8AJ2^3&^6TfeZtdgR0WuJT^mKH1p~ z>Q`(-`tw`M%N=HGm-6q!K%Q7G{oaGq;d(}1{KcjCY8h}9D^Zo z_n?@|sfu;KR4V5x&LoJ>%1hR*8BEcWMSwdcmHS+3-n8|=#?BdLsSqn+!!>Y=tFFT`OwPw#?YsYqG4RR{`Fs1RGk;R#5 zYgg&#|XF8$P^Sah&oQ!_tY@-(|ovhxm!r$*c3c{97cL#3&U<%?eV6>qfkwl`6-yzy^)b7H%8 zDfMQEXFTskZ{qS@Z`8T*`QO?&^j03HQ9H)9Yo8=J?_`n@~E3d z@xVwku(Nv5je<0a+XH967iIPJBLKfh2ry0VtX zS*~}q-pG~NczJ%_KXK}qb_?GyiuJ;>SU1bofpOP;6{q6_d^~X!b;>S`Te4X7>|CCx zj@bFlXQ!Neqf{-~`Sq$}=h=X|qvt_0;>usQjZSn5r+8p{#W3RP3=e&d=pO{_ab)Kc z?+Bief;dtwSR9WJ=sj^{M$`p_i|gBkyHmLrR@uc2R>SokimI+Qy?C(Ir`6wDHF> zhcuqkcu}Jo5AjWHzohXS8oxtyM82=>A8Y(25u5cZjepSiM~!!g$a`1gKQ!`#(_iLm z1LXb@&uZlU^QVz}NxxbzP^}B=e2{)%LnHT-_TxnGYCsz(etM&an+eR40d|a*h1WCj zTR|3xzm}%rCw&@ZHv9(6uJab zqK0NALEH{^xRSX2A2d9Ip(%`s7?ti-WjFgh-hA<6yh}db#=3fM21A9NRrQcz;s2i; z0F8IiocB}zmS*nheVWHDrTj165yW^#KZ>WmA9(X<6xORNZP0OCw#PJ@`E9`Foiw8E z8jMHLaD3JGXY39V9tQH4o3DrZxdc9kX4V8%-a_MFDI-Sx6dc8RbGTE#gOBx~4(ojx zy2*hmjxF*w6)h&#hi!C*-UaU|%^{c=|Fjjy{W}KZ8aXbG_i)@T=q3lM%wxlARJ54b zE!f3+EhXJXetc!kK7S9o$$=^%>Txbc zOzgXG6zk2Q*irackMlJ3eh8g8C(tN&Q17rQ0-Gw^&omm|7(V_od`1lK*Kklbyf1;r zGik)|eh&wABd_u>6~x5;0v~mJRwd*uX`R4zP%CCezdeYV^%iR}?>DIT9+3b3 i`CCL@6^*s96+?Lw=l)za_;Vbf%Fz);Rh4(MBLAWgd literal 0 HcmV?d00001 diff --git a/rm.sym b/rm.sym new file mode 100644 index 0000000..ab2b961 --- /dev/null +++ b/rm.sym @@ -0,0 +1,50 @@ +00000000 rm.c +00000000 ulib.c +00000000 printf.c +000003a0 printint +00000804 digits.0 +00000000 umalloc.c +00000abc freep +00000ac0 base +00000080 strcpy +00000450 printf +0000037b greeting +000002a0 memmove +0000034b mknod +000001a0 gets +0000031b getpid +0000038b screen +00000680 malloc +0000032b sleep +000002e3 pipe +00000373 getch +00000343 write +00000303 fstat +000002f3 kill +0000030b chdir +000002fb exec +000002db wait +000002eb read +00000353 unlink +000002cb fork +00000323 sbrk +00000333 uptime +00000abc __bss_start +00000140 memset +00000000 main +000000b0 strcmp +00000383 shutdown +00000313 dup +00000210 stat +00000abc _edata +00000ac8 _end +0000035b link +000002d3 exit +00000260 atoi +00000393 cls +00000110 strlen +0000033b open +00000160 strchr +00000363 mkdir +0000036b close +000005f0 free diff --git a/screen.asm b/screen.asm new file mode 100644 index 0000000..aa996dd --- /dev/null +++ b/screen.asm @@ -0,0 +1,1389 @@ + +_screen: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 38 sub $0x38,%esp + 14: 8b 39 mov (%ecx),%edi + 16: 8b 71 04 mov 0x4(%ecx),%esi + 19: 89 7d c4 mov %edi,-0x3c(%ebp) + int pid; + int selopt = getpid() % 10; + 1c: e8 aa 04 00 00 call 4cb + 21: ba 67 66 66 66 mov $0x66666667,%edx + 26: 89 c1 mov %eax,%ecx + 28: f7 ea imul %edx + 2a: 89 c8 mov %ecx,%eax + 2c: c1 f8 1f sar $0x1f,%eax + 2f: c1 fa 02 sar $0x2,%edx + 32: 29 c2 sub %eax,%edx + 34: 8d 04 92 lea (%edx,%edx,4),%eax + 37: 01 c0 add %eax,%eax + 39: 29 c1 sub %eax,%ecx + 3b: 89 4d c0 mov %ecx,-0x40(%ebp) + int bgcol = 0x4F00; + char title[20]; + int accepttitle = 0; + int currenttitlelen = 0; + + for (int i = 1; i < argc; i++) { + 3e: 83 ff 01 cmp $0x1,%edi + 41: 7e 6c jle af + int currenttitlelen = 0; + 43: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + for (int i = 1; i < argc; i++) { + 4a: bb 01 00 00 00 mov $0x1,%ebx + int accepttitle = 0; + 4f: 31 ff xor %edi,%edi + 51: eb 21 jmp 74 + 53: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 57: 90 nop + if (strcmp(argv[i], "-bg") == 0) + { + accepttitle = 0; + selopt = atoi(argv[i + 1]); + 58: 83 ec 0c sub $0xc,%esp + 5b: ff 74 9e 04 push 0x4(%esi,%ebx,4) + accepttitle = 0; + 5f: 31 ff xor %edi,%edi + selopt = atoi(argv[i + 1]); + 61: e8 aa 03 00 00 call 410 + 66: 83 c4 10 add $0x10,%esp + 69: 89 45 c0 mov %eax,-0x40(%ebp) + for (int i = 1; i < argc; i++) { + 6c: 83 c3 01 add $0x1,%ebx + 6f: 39 5d c4 cmp %ebx,-0x3c(%ebp) + 72: 74 3b je af + if (strcmp(argv[i], "-bg") == 0) + 74: 83 ec 08 sub $0x8,%esp + 77: 68 40 09 00 00 push $0x940 + 7c: ff 34 9e push (%esi,%ebx,4) + 7f: e8 dc 01 00 00 call 260 + 84: 83 c4 10 add $0x10,%esp + 87: 85 c0 test %eax,%eax + 89: 74 cd je 58 + } + else if (strcmp(argv[i], "-t") == 0) + 8b: 83 ec 08 sub $0x8,%esp + 8e: 68 44 09 00 00 push $0x944 + 93: ff 34 9e push (%esi,%ebx,4) + 96: e8 c5 01 00 00 call 260 + 9b: 83 c4 10 add $0x10,%esp + 9e: 85 c0 test %eax,%eax + a0: 75 3e jne e0 + { + accepttitle = 1; + a2: bf 01 00 00 00 mov $0x1,%edi + for (int i = 1; i < argc; i++) { + a7: 83 c3 01 add $0x1,%ebx + aa: 39 5d c4 cmp %ebx,-0x3c(%ebp) + ad: 75 c5 jne 74 + } + } + } + + // Set the variable to the selected bg/fg preset option + switch(selopt) + af: 8b 45 c0 mov -0x40(%ebp),%eax + b2: bb 00 4f 00 00 mov $0x4f00,%ebx + b7: 83 e8 01 sub $0x1,%eax + ba: 83 f8 08 cmp $0x8,%eax + bd: 0f 86 9a 00 00 00 jbe 15d + bgcol = 0xCF00; + break; + } + + // Fork into a new process and create the screen + pid = fork(); + c3: e8 b3 03 00 00 call 47b + if (pid < 0) { + c8: 85 c0 test %eax,%eax + ca: 0f 88 f7 00 00 00 js 1c7 + printf(1, "screen: fork failed\n"); + } + if (pid == 0) { + d0: 0f 84 93 00 00 00 je 169 + else + { + + } + } + exit(); + d6: e8 a8 03 00 00 call 483 + db: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + df: 90 nop + else if (strcmp(argv[i], "-help") == 0) + e0: 83 ec 08 sub $0x8,%esp + e3: 68 47 09 00 00 push $0x947 + e8: ff 34 9e push (%esi,%ebx,4) + eb: e8 70 01 00 00 call 260 + f0: 83 c4 10 add $0x10,%esp + f3: 85 c0 test %eax,%eax + f5: 0f 84 e2 00 00 00 je 1dd + if (accepttitle) + fb: 85 ff test %edi,%edi + fd: 0f 84 69 ff ff ff je 6c + if (currenttitlelen > 0) + 103: 8b 45 bc mov -0x44(%ebp),%eax + for (sx = argv[i]; *sx != '\0'; sx++) + 106: 8b 0c 9e mov (%esi,%ebx,4),%ecx + if (currenttitlelen > 0) + 109: 85 c0 test %eax,%eax + 10b: 0f 84 92 00 00 00 je 1a3 + title[currenttitlelen] = ' '; + 111: c6 44 05 d4 20 movb $0x20,-0x2c(%ebp,%eax,1) + currenttitlelen++; + 116: 8d 50 01 lea 0x1(%eax),%edx + for (sx = argv[i]; *sx != '\0'; sx++) + 119: 0f b6 01 movzbl (%ecx),%eax + 11c: 84 c0 test %al,%al + 11e: 0f 84 f6 00 00 00 je 21a + currenttitlelen++; + 124: 83 45 bc 02 addl $0x2,-0x44(%ebp) + title[currenttitlelen] = *sx; + 128: 88 44 15 d4 mov %al,-0x2c(%ebp,%edx,1) + currenttitlelen++; + 12c: 8b 45 bc mov -0x44(%ebp),%eax + if (currenttitlelen >= 20) + 12f: 83 f8 13 cmp $0x13,%eax + 132: 0f 8f 88 00 00 00 jg 1c0 + currenttitlelen++; + 138: 8b 45 bc mov -0x44(%ebp),%eax + for (sx = argv[i]; *sx != '\0'; sx++) + 13b: 29 c1 sub %eax,%ecx + 13d: eb 0d jmp 14c + 13f: 90 nop + title[currenttitlelen] = *sx; + 140: 88 54 05 d4 mov %dl,-0x2c(%ebp,%eax,1) + currenttitlelen++; + 144: 83 c0 01 add $0x1,%eax + if (currenttitlelen >= 20) + 147: 83 f8 14 cmp $0x14,%eax + 14a: 74 6d je 1b9 + for (sx = argv[i]; *sx != '\0'; sx++) + 14c: 0f b6 54 01 01 movzbl 0x1(%ecx,%eax,1),%edx + 151: 84 d2 test %dl,%dl + 153: 75 eb jne 140 + 155: 89 45 bc mov %eax,-0x44(%ebp) + 158: e9 0f ff ff ff jmp 6c + 15d: 8b 1c 85 20 0a 00 00 mov 0xa20(,%eax,4),%ebx + 164: e9 5a ff ff ff jmp c3 + if (screen(title, bgcol) != 0) + 169: 8d 45 d4 lea -0x2c(%ebp),%eax + 16c: 57 push %edi + 16d: 57 push %edi + 16e: 53 push %ebx + 16f: 50 push %eax + 170: e8 c6 03 00 00 call 53b + 175: 83 c4 10 add $0x10,%esp + 178: 85 c0 test %eax,%eax + 17a: 0f 84 56 ff ff ff je d6 + exec("sh", argv); + 180: 50 push %eax + 181: 50 push %eax + 182: 56 push %esi + 183: 68 6c 09 00 00 push $0x96c + 188: e8 1e 03 00 00 call 4ab + printf(1, "screen: exec sh failed\n"); + 18d: 5a pop %edx + 18e: 59 pop %ecx + 18f: 68 6f 09 00 00 push $0x96f + 194: 6a 01 push $0x1 + 196: e8 65 04 00 00 call 600 + 19b: 83 c4 10 add $0x10,%esp + 19e: e9 33 ff ff ff jmp d6 + for (sx = argv[i]; *sx != '\0'; sx++) + 1a3: 0f b6 01 movzbl (%ecx),%eax + 1a6: 84 c0 test %al,%al + 1a8: 0f 84 be fe ff ff je 6c + title[currenttitlelen] = *sx; + 1ae: 88 45 d4 mov %al,-0x2c(%ebp) + currenttitlelen++; + 1b1: 89 7d bc mov %edi,-0x44(%ebp) + 1b4: e9 7f ff ff ff jmp 138 + 1b9: c7 45 bc 14 00 00 00 movl $0x14,-0x44(%ebp) + accepttitle = 0; + 1c0: 31 ff xor %edi,%edi + 1c2: e9 a5 fe ff ff jmp 6c + printf(1, "screen: fork failed\n"); + 1c7: 50 push %eax + 1c8: 50 push %eax + 1c9: 68 57 09 00 00 push $0x957 + 1ce: 6a 01 push $0x1 + 1d0: e8 2b 04 00 00 call 600 + 1d5: 83 c4 10 add $0x10,%esp + 1d8: e9 f9 fe ff ff jmp d6 + printf(1, "Creates a new virtual console.\n"); + 1dd: 50 push %eax + 1de: 50 push %eax + 1df: 68 88 09 00 00 push $0x988 + 1e4: 6a 01 push $0x1 + 1e6: e8 15 04 00 00 call 600 + printf(1, "Options:\n"); + 1eb: 58 pop %eax + 1ec: 5a pop %edx + 1ed: 68 4d 09 00 00 push $0x94d + 1f2: 6a 01 push $0x1 + 1f4: e8 07 04 00 00 call 600 + printf(1, "-bg [0 - 9] : Sets a background preset for the title bar.\n"); + 1f9: 59 pop %ecx + 1fa: 5b pop %ebx + 1fb: 68 a8 09 00 00 push $0x9a8 + 200: 6a 01 push $0x1 + 202: e8 f9 03 00 00 call 600 + printf(1, "-t [String] : Sets a custom title for the console.\n"); + 207: 5e pop %esi + 208: 5f pop %edi + 209: 68 e4 09 00 00 push $0x9e4 + 20e: 6a 01 push $0x1 + 210: e8 eb 03 00 00 call 600 + exit(); + 215: e8 69 02 00 00 call 483 + currenttitlelen++; + 21a: 89 55 bc mov %edx,-0x44(%ebp) + 21d: e9 4a fe ff ff jmp 6c + 222: 66 90 xchg %ax,%ax + 224: 66 90 xchg %ax,%ax + 226: 66 90 xchg %ax,%ax + 228: 66 90 xchg %ax,%ax + 22a: 66 90 xchg %ax,%ax + 22c: 66 90 xchg %ax,%ax + 22e: 66 90 xchg %ax,%ax + +00000230 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 230: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 231: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 233: 89 e5 mov %esp,%ebp + 235: 53 push %ebx + 236: 8b 4d 08 mov 0x8(%ebp),%ecx + 239: 8b 5d 0c mov 0xc(%ebp),%ebx + 23c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 240: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 244: 88 14 01 mov %dl,(%ecx,%eax,1) + 247: 83 c0 01 add $0x1,%eax + 24a: 84 d2 test %dl,%dl + 24c: 75 f2 jne 240 + ; + } + return os; +} + 24e: 8b 5d fc mov -0x4(%ebp),%ebx + 251: 89 c8 mov %ecx,%eax + 253: c9 leave + 254: c3 ret + 255: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000260 : + +int strcmp(const char *p, const char *q) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 53 push %ebx + 264: 8b 55 08 mov 0x8(%ebp),%edx + 267: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 26a: 0f b6 02 movzbl (%edx),%eax + 26d: 84 c0 test %al,%al + 26f: 75 17 jne 288 + 271: eb 3a jmp 2ad + 273: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 277: 90 nop + 278: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 27c: 83 c2 01 add $0x1,%edx + 27f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 282: 84 c0 test %al,%al + 284: 74 1a je 2a0 + p++, q++; + 286: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 288: 0f b6 19 movzbl (%ecx),%ebx + 28b: 38 c3 cmp %al,%bl + 28d: 74 e9 je 278 + } + return (uchar) * p - (uchar) * q; + 28f: 29 d8 sub %ebx,%eax +} + 291: 8b 5d fc mov -0x4(%ebp),%ebx + 294: c9 leave + 295: c3 ret + 296: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 2a0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 2a4: 31 c0 xor %eax,%eax + 2a6: 29 d8 sub %ebx,%eax +} + 2a8: 8b 5d fc mov -0x4(%ebp),%ebx + 2ab: c9 leave + 2ac: c3 ret + return (uchar) * p - (uchar) * q; + 2ad: 0f b6 19 movzbl (%ecx),%ebx + 2b0: 31 c0 xor %eax,%eax + 2b2: eb db jmp 28f + 2b4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2bb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2bf: 90 nop + +000002c0 : + +uint strlen(const char *s) { + 2c0: 55 push %ebp + 2c1: 89 e5 mov %esp,%ebp + 2c3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 2c6: 80 3a 00 cmpb $0x0,(%edx) + 2c9: 74 15 je 2e0 + 2cb: 31 c0 xor %eax,%eax + 2cd: 8d 76 00 lea 0x0(%esi),%esi + 2d0: 83 c0 01 add $0x1,%eax + 2d3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 2d7: 89 c1 mov %eax,%ecx + 2d9: 75 f5 jne 2d0 + ; + } + return n; +} + 2db: 89 c8 mov %ecx,%eax + 2dd: 5d pop %ebp + 2de: c3 ret + 2df: 90 nop + for (n = 0; s[n]; n++) { + 2e0: 31 c9 xor %ecx,%ecx +} + 2e2: 5d pop %ebp + 2e3: 89 c8 mov %ecx,%eax + 2e5: c3 ret + 2e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2ed: 8d 76 00 lea 0x0(%esi),%esi + +000002f0 : + +void* memset(void *dst, int c, uint n) { + 2f0: 55 push %ebp + 2f1: 89 e5 mov %esp,%ebp + 2f3: 57 push %edi + 2f4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 2f7: 8b 4d 10 mov 0x10(%ebp),%ecx + 2fa: 8b 45 0c mov 0xc(%ebp),%eax + 2fd: 89 d7 mov %edx,%edi + 2ff: fc cld + 300: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 302: 8b 7d fc mov -0x4(%ebp),%edi + 305: 89 d0 mov %edx,%eax + 307: c9 leave + 308: c3 ret + 309: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000310 : + +char* strchr(const char *s, char c) { + 310: 55 push %ebp + 311: 89 e5 mov %esp,%ebp + 313: 8b 45 08 mov 0x8(%ebp),%eax + 316: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 31a: 0f b6 10 movzbl (%eax),%edx + 31d: 84 d2 test %dl,%dl + 31f: 75 12 jne 333 + 321: eb 1d jmp 340 + 323: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 327: 90 nop + 328: 0f b6 50 01 movzbl 0x1(%eax),%edx + 32c: 83 c0 01 add $0x1,%eax + 32f: 84 d2 test %dl,%dl + 331: 74 0d je 340 + if (*s == c) { + 333: 38 d1 cmp %dl,%cl + 335: 75 f1 jne 328 + return (char*)s; + } + } + return 0; +} + 337: 5d pop %ebp + 338: c3 ret + 339: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 340: 31 c0 xor %eax,%eax +} + 342: 5d pop %ebp + 343: c3 ret + 344: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 34b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 34f: 90 nop + +00000350 : + +char* gets(char *buf, int max) { + 350: 55 push %ebp + 351: 89 e5 mov %esp,%ebp + 353: 57 push %edi + 354: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 355: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 358: 53 push %ebx + for (i = 0; i + 1 < max;) { + 359: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 35b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 35e: eb 27 jmp 387 + cc = read(0, &c, 1); + 360: 83 ec 04 sub $0x4,%esp + 363: 6a 01 push $0x1 + 365: 57 push %edi + 366: 6a 00 push $0x0 + 368: e8 2e 01 00 00 call 49b + if (cc < 1) { + 36d: 83 c4 10 add $0x10,%esp + 370: 85 c0 test %eax,%eax + 372: 7e 1d jle 391 + break; + } + buf[i++] = c; + 374: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 378: 8b 55 08 mov 0x8(%ebp),%edx + 37b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 37f: 3c 0a cmp $0xa,%al + 381: 74 1d je 3a0 + 383: 3c 0d cmp $0xd,%al + 385: 74 19 je 3a0 + for (i = 0; i + 1 < max;) { + 387: 89 de mov %ebx,%esi + 389: 83 c3 01 add $0x1,%ebx + 38c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 38f: 7c cf jl 360 + break; + } + } + buf[i] = '\0'; + 391: 8b 45 08 mov 0x8(%ebp),%eax + 394: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 398: 8d 65 f4 lea -0xc(%ebp),%esp + 39b: 5b pop %ebx + 39c: 5e pop %esi + 39d: 5f pop %edi + 39e: 5d pop %ebp + 39f: c3 ret + buf[i] = '\0'; + 3a0: 8b 45 08 mov 0x8(%ebp),%eax + 3a3: 89 de mov %ebx,%esi + 3a5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 3a9: 8d 65 f4 lea -0xc(%ebp),%esp + 3ac: 5b pop %ebx + 3ad: 5e pop %esi + 3ae: 5f pop %edi + 3af: 5d pop %ebp + 3b0: c3 ret + 3b1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3bf: 90 nop + +000003c0 : + +int stat(const char *n, struct stat *st) { + 3c0: 55 push %ebp + 3c1: 89 e5 mov %esp,%ebp + 3c3: 56 push %esi + 3c4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 3c5: 83 ec 08 sub $0x8,%esp + 3c8: 6a 00 push $0x0 + 3ca: ff 75 08 push 0x8(%ebp) + 3cd: e8 19 01 00 00 call 4eb + if (fd < 0) { + 3d2: 83 c4 10 add $0x10,%esp + 3d5: 85 c0 test %eax,%eax + 3d7: 78 27 js 400 + return -1; + } + r = fstat(fd, st); + 3d9: 83 ec 08 sub $0x8,%esp + 3dc: ff 75 0c push 0xc(%ebp) + 3df: 89 c3 mov %eax,%ebx + 3e1: 50 push %eax + 3e2: e8 cc 00 00 00 call 4b3 + close(fd); + 3e7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 3ea: 89 c6 mov %eax,%esi + close(fd); + 3ec: e8 2a 01 00 00 call 51b + return r; + 3f1: 83 c4 10 add $0x10,%esp +} + 3f4: 8d 65 f8 lea -0x8(%ebp),%esp + 3f7: 89 f0 mov %esi,%eax + 3f9: 5b pop %ebx + 3fa: 5e pop %esi + 3fb: 5d pop %ebp + 3fc: c3 ret + 3fd: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 400: be ff ff ff ff mov $0xffffffff,%esi + 405: eb ed jmp 3f4 + 407: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 40e: 66 90 xchg %ax,%ax + +00000410 : + +int atoi(const char *s) { + 410: 55 push %ebp + 411: 89 e5 mov %esp,%ebp + 413: 53 push %ebx + 414: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 417: 0f be 02 movsbl (%edx),%eax + 41a: 8d 48 d0 lea -0x30(%eax),%ecx + 41d: 80 f9 09 cmp $0x9,%cl + n = 0; + 420: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 425: 77 1e ja 445 + 427: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 430: 83 c2 01 add $0x1,%edx + 433: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 436: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 43a: 0f be 02 movsbl (%edx),%eax + 43d: 8d 58 d0 lea -0x30(%eax),%ebx + 440: 80 fb 09 cmp $0x9,%bl + 443: 76 eb jbe 430 + } + return n; +} + 445: 8b 5d fc mov -0x4(%ebp),%ebx + 448: 89 c8 mov %ecx,%eax + 44a: c9 leave + 44b: c3 ret + 44c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000450 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 450: 55 push %ebp + 451: 89 e5 mov %esp,%ebp + 453: 57 push %edi + 454: 8b 45 10 mov 0x10(%ebp),%eax + 457: 8b 55 08 mov 0x8(%ebp),%edx + 45a: 56 push %esi + 45b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 45e: 85 c0 test %eax,%eax + 460: 7e 13 jle 475 + 462: 01 d0 add %edx,%eax + dst = vdst; + 464: 89 d7 mov %edx,%edi + 466: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 46d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 470: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 471: 39 f8 cmp %edi,%eax + 473: 75 fb jne 470 + } + return vdst; +} + 475: 5e pop %esi + 476: 89 d0 mov %edx,%eax + 478: 5f pop %edi + 479: 5d pop %ebp + 47a: c3 ret + +0000047b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 47b: b8 01 00 00 00 mov $0x1,%eax + 480: cd 40 int $0x40 + 482: c3 ret + +00000483 : +SYSCALL(exit) + 483: b8 02 00 00 00 mov $0x2,%eax + 488: cd 40 int $0x40 + 48a: c3 ret + +0000048b : +SYSCALL(wait) + 48b: b8 03 00 00 00 mov $0x3,%eax + 490: cd 40 int $0x40 + 492: c3 ret + +00000493 : +SYSCALL(pipe) + 493: b8 04 00 00 00 mov $0x4,%eax + 498: cd 40 int $0x40 + 49a: c3 ret + +0000049b : +SYSCALL(read) + 49b: b8 05 00 00 00 mov $0x5,%eax + 4a0: cd 40 int $0x40 + 4a2: c3 ret + +000004a3 : +SYSCALL(kill) + 4a3: b8 06 00 00 00 mov $0x6,%eax + 4a8: cd 40 int $0x40 + 4aa: c3 ret + +000004ab : +SYSCALL(exec) + 4ab: b8 07 00 00 00 mov $0x7,%eax + 4b0: cd 40 int $0x40 + 4b2: c3 ret + +000004b3 : +SYSCALL(fstat) + 4b3: b8 08 00 00 00 mov $0x8,%eax + 4b8: cd 40 int $0x40 + 4ba: c3 ret + +000004bb : +SYSCALL(chdir) + 4bb: b8 09 00 00 00 mov $0x9,%eax + 4c0: cd 40 int $0x40 + 4c2: c3 ret + +000004c3 : +SYSCALL(dup) + 4c3: b8 0a 00 00 00 mov $0xa,%eax + 4c8: cd 40 int $0x40 + 4ca: c3 ret + +000004cb : +SYSCALL(getpid) + 4cb: b8 0b 00 00 00 mov $0xb,%eax + 4d0: cd 40 int $0x40 + 4d2: c3 ret + +000004d3 : +SYSCALL(sbrk) + 4d3: b8 0c 00 00 00 mov $0xc,%eax + 4d8: cd 40 int $0x40 + 4da: c3 ret + +000004db : +SYSCALL(sleep) + 4db: b8 0d 00 00 00 mov $0xd,%eax + 4e0: cd 40 int $0x40 + 4e2: c3 ret + +000004e3 : +SYSCALL(uptime) + 4e3: b8 0e 00 00 00 mov $0xe,%eax + 4e8: cd 40 int $0x40 + 4ea: c3 ret + +000004eb : +SYSCALL(open) + 4eb: b8 0f 00 00 00 mov $0xf,%eax + 4f0: cd 40 int $0x40 + 4f2: c3 ret + +000004f3 : +SYSCALL(write) + 4f3: b8 10 00 00 00 mov $0x10,%eax + 4f8: cd 40 int $0x40 + 4fa: c3 ret + +000004fb : +SYSCALL(mknod) + 4fb: b8 11 00 00 00 mov $0x11,%eax + 500: cd 40 int $0x40 + 502: c3 ret + +00000503 : +SYSCALL(unlink) + 503: b8 12 00 00 00 mov $0x12,%eax + 508: cd 40 int $0x40 + 50a: c3 ret + +0000050b : +SYSCALL(link) + 50b: b8 13 00 00 00 mov $0x13,%eax + 510: cd 40 int $0x40 + 512: c3 ret + +00000513 : +SYSCALL(mkdir) + 513: b8 14 00 00 00 mov $0x14,%eax + 518: cd 40 int $0x40 + 51a: c3 ret + +0000051b : +SYSCALL(close) + 51b: b8 15 00 00 00 mov $0x15,%eax + 520: cd 40 int $0x40 + 522: c3 ret + +00000523 : +SYSCALL(getch) + 523: b8 16 00 00 00 mov $0x16,%eax + 528: cd 40 int $0x40 + 52a: c3 ret + +0000052b : +SYSCALL(greeting) + 52b: b8 17 00 00 00 mov $0x17,%eax + 530: cd 40 int $0x40 + 532: c3 ret + +00000533 : +SYSCALL(shutdown) + 533: b8 18 00 00 00 mov $0x18,%eax + 538: cd 40 int $0x40 + 53a: c3 ret + +0000053b : +SYSCALL(screen) + 53b: b8 19 00 00 00 mov $0x19,%eax + 540: cd 40 int $0x40 + 542: c3 ret + +00000543 : +SYSCALL(cls) + 543: b8 1a 00 00 00 mov $0x1a,%eax + 548: cd 40 int $0x40 + 54a: c3 ret + 54b: 66 90 xchg %ax,%ax + 54d: 66 90 xchg %ax,%ax + 54f: 90 nop + +00000550 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 550: 55 push %ebp + 551: 89 e5 mov %esp,%ebp + 553: 57 push %edi + 554: 56 push %esi + 555: 53 push %ebx + 556: 83 ec 3c sub $0x3c,%esp + 559: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 55c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 55e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 561: 85 d2 test %edx,%edx + 563: 0f 89 7f 00 00 00 jns 5e8 + 569: f6 45 08 01 testb $0x1,0x8(%ebp) + 56d: 74 79 je 5e8 + neg = 1; + 56f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 576: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 578: 31 db xor %ebx,%ebx + 57a: 8d 75 d7 lea -0x29(%ebp),%esi + 57d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 580: 89 c8 mov %ecx,%eax + 582: 31 d2 xor %edx,%edx + 584: 89 cf mov %ecx,%edi + 586: f7 75 c4 divl -0x3c(%ebp) + 589: 0f b6 92 a4 0a 00 00 movzbl 0xaa4(%edx),%edx + 590: 89 45 c0 mov %eax,-0x40(%ebp) + 593: 89 d8 mov %ebx,%eax + 595: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 598: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 59b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 59e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 5a1: 76 dd jbe 580 + if (neg) { + 5a3: 8b 4d bc mov -0x44(%ebp),%ecx + 5a6: 85 c9 test %ecx,%ecx + 5a8: 74 0c je 5b6 + buf[i++] = '-'; + 5aa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 5af: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 5b1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 5b6: 8b 7d b8 mov -0x48(%ebp),%edi + 5b9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 5bd: eb 07 jmp 5c6 + 5bf: 90 nop + putc(fd, buf[i]); + 5c0: 0f b6 13 movzbl (%ebx),%edx + 5c3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 5c6: 83 ec 04 sub $0x4,%esp + 5c9: 88 55 d7 mov %dl,-0x29(%ebp) + 5cc: 6a 01 push $0x1 + 5ce: 56 push %esi + 5cf: 57 push %edi + 5d0: e8 1e ff ff ff call 4f3 + while (--i >= 0) { + 5d5: 83 c4 10 add $0x10,%esp + 5d8: 39 de cmp %ebx,%esi + 5da: 75 e4 jne 5c0 + } +} + 5dc: 8d 65 f4 lea -0xc(%ebp),%esp + 5df: 5b pop %ebx + 5e0: 5e pop %esi + 5e1: 5f pop %edi + 5e2: 5d pop %ebp + 5e3: c3 ret + 5e4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 5e8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 5ef: eb 87 jmp 578 + 5f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5ff: 90 nop + +00000600 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 600: 55 push %ebp + 601: 89 e5 mov %esp,%ebp + 603: 57 push %edi + 604: 56 push %esi + 605: 53 push %ebx + 606: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 609: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 60c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 60f: 0f b6 13 movzbl (%ebx),%edx + 612: 84 d2 test %dl,%dl + 614: 74 6a je 680 + ap = (uint*)(void*)&fmt + 1; + 616: 8d 45 10 lea 0x10(%ebp),%eax + 619: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 61c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 61f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 621: 89 45 d0 mov %eax,-0x30(%ebp) + 624: eb 36 jmp 65c + 626: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 62d: 8d 76 00 lea 0x0(%esi),%esi + 630: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 633: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 638: 83 f8 25 cmp $0x25,%eax + 63b: 74 15 je 652 + write(fd, &c, 1); + 63d: 83 ec 04 sub $0x4,%esp + 640: 88 55 e7 mov %dl,-0x19(%ebp) + 643: 6a 01 push $0x1 + 645: 57 push %edi + 646: 56 push %esi + 647: e8 a7 fe ff ff call 4f3 + 64c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 64f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 652: 0f b6 13 movzbl (%ebx),%edx + 655: 83 c3 01 add $0x1,%ebx + 658: 84 d2 test %dl,%dl + 65a: 74 24 je 680 + c = fmt[i] & 0xff; + 65c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 65f: 85 c9 test %ecx,%ecx + 661: 74 cd je 630 + } + } + else if (state == '%') { + 663: 83 f9 25 cmp $0x25,%ecx + 666: 75 ea jne 652 + if (c == 'd') { + 668: 83 f8 25 cmp $0x25,%eax + 66b: 0f 84 07 01 00 00 je 778 + 671: 83 e8 63 sub $0x63,%eax + 674: 83 f8 15 cmp $0x15,%eax + 677: 77 17 ja 690 + 679: ff 24 85 4c 0a 00 00 jmp *0xa4c(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 680: 8d 65 f4 lea -0xc(%ebp),%esp + 683: 5b pop %ebx + 684: 5e pop %esi + 685: 5f pop %edi + 686: 5d pop %ebp + 687: c3 ret + 688: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 68f: 90 nop + write(fd, &c, 1); + 690: 83 ec 04 sub $0x4,%esp + 693: 88 55 d4 mov %dl,-0x2c(%ebp) + 696: 6a 01 push $0x1 + 698: 57 push %edi + 699: 56 push %esi + 69a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 69e: e8 50 fe ff ff call 4f3 + putc(fd, c); + 6a3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 6a7: 83 c4 0c add $0xc,%esp + 6aa: 88 55 e7 mov %dl,-0x19(%ebp) + 6ad: 6a 01 push $0x1 + 6af: 57 push %edi + 6b0: 56 push %esi + 6b1: e8 3d fe ff ff call 4f3 + putc(fd, c); + 6b6: 83 c4 10 add $0x10,%esp + state = 0; + 6b9: 31 c9 xor %ecx,%ecx + 6bb: eb 95 jmp 652 + 6bd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 6c0: 83 ec 0c sub $0xc,%esp + 6c3: b9 10 00 00 00 mov $0x10,%ecx + 6c8: 6a 00 push $0x0 + 6ca: 8b 45 d0 mov -0x30(%ebp),%eax + 6cd: 8b 10 mov (%eax),%edx + 6cf: 89 f0 mov %esi,%eax + 6d1: e8 7a fe ff ff call 550 + ap++; + 6d6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 6da: 83 c4 10 add $0x10,%esp + state = 0; + 6dd: 31 c9 xor %ecx,%ecx + 6df: e9 6e ff ff ff jmp 652 + 6e4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 6e8: 8b 45 d0 mov -0x30(%ebp),%eax + 6eb: 8b 10 mov (%eax),%edx + ap++; + 6ed: 83 c0 04 add $0x4,%eax + 6f0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 6f3: 85 d2 test %edx,%edx + 6f5: 0f 84 8d 00 00 00 je 788 + while (*s != 0) { + 6fb: 0f b6 02 movzbl (%edx),%eax + state = 0; + 6fe: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 700: 84 c0 test %al,%al + 702: 0f 84 4a ff ff ff je 652 + 708: 89 5d d4 mov %ebx,-0x2c(%ebp) + 70b: 89 d3 mov %edx,%ebx + 70d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 710: 83 ec 04 sub $0x4,%esp + s++; + 713: 83 c3 01 add $0x1,%ebx + 716: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 719: 6a 01 push $0x1 + 71b: 57 push %edi + 71c: 56 push %esi + 71d: e8 d1 fd ff ff call 4f3 + while (*s != 0) { + 722: 0f b6 03 movzbl (%ebx),%eax + 725: 83 c4 10 add $0x10,%esp + 728: 84 c0 test %al,%al + 72a: 75 e4 jne 710 + state = 0; + 72c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 72f: 31 c9 xor %ecx,%ecx + 731: e9 1c ff ff ff jmp 652 + 736: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 73d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 740: 83 ec 0c sub $0xc,%esp + 743: b9 0a 00 00 00 mov $0xa,%ecx + 748: 6a 01 push $0x1 + 74a: e9 7b ff ff ff jmp 6ca + 74f: 90 nop + putc(fd, *ap); + 750: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 753: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 756: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 758: 6a 01 push $0x1 + 75a: 57 push %edi + 75b: 56 push %esi + putc(fd, *ap); + 75c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 75f: e8 8f fd ff ff call 4f3 + ap++; + 764: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 768: 83 c4 10 add $0x10,%esp + state = 0; + 76b: 31 c9 xor %ecx,%ecx + 76d: e9 e0 fe ff ff jmp 652 + 772: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 778: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 77b: 83 ec 04 sub $0x4,%esp + 77e: e9 2a ff ff ff jmp 6ad + 783: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 787: 90 nop + s = "(null)"; + 788: ba 44 0a 00 00 mov $0xa44,%edx + while (*s != 0) { + 78d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 790: b8 28 00 00 00 mov $0x28,%eax + 795: 89 d3 mov %edx,%ebx + 797: e9 74 ff ff ff jmp 710 + 79c: 66 90 xchg %ax,%ax + 79e: 66 90 xchg %ax,%ax + +000007a0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 7a0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 7a1: a1 58 0d 00 00 mov 0xd58,%eax +void free(void *ap) { + 7a6: 89 e5 mov %esp,%ebp + 7a8: 57 push %edi + 7a9: 56 push %esi + 7aa: 53 push %ebx + 7ab: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 7ae: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 7b1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 7b8: 89 c2 mov %eax,%edx + 7ba: 8b 00 mov (%eax),%eax + 7bc: 39 ca cmp %ecx,%edx + 7be: 73 30 jae 7f0 + 7c0: 39 c1 cmp %eax,%ecx + 7c2: 72 04 jb 7c8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 7c4: 39 c2 cmp %eax,%edx + 7c6: 72 f0 jb 7b8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 7c8: 8b 73 fc mov -0x4(%ebx),%esi + 7cb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 7ce: 39 f8 cmp %edi,%eax + 7d0: 74 30 je 802 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 7d2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 7d5: 8b 42 04 mov 0x4(%edx),%eax + 7d8: 8d 34 c2 lea (%edx,%eax,8),%esi + 7db: 39 f1 cmp %esi,%ecx + 7dd: 74 3a je 819 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 7df: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 7e1: 5b pop %ebx + freep = p; + 7e2: 89 15 58 0d 00 00 mov %edx,0xd58 +} + 7e8: 5e pop %esi + 7e9: 5f pop %edi + 7ea: 5d pop %ebp + 7eb: c3 ret + 7ec: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 7f0: 39 c2 cmp %eax,%edx + 7f2: 72 c4 jb 7b8 + 7f4: 39 c1 cmp %eax,%ecx + 7f6: 73 c0 jae 7b8 + if (bp + bp->s.size == p->s.ptr) { + 7f8: 8b 73 fc mov -0x4(%ebx),%esi + 7fb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 7fe: 39 f8 cmp %edi,%eax + 800: 75 d0 jne 7d2 + bp->s.size += p->s.ptr->s.size; + 802: 03 70 04 add 0x4(%eax),%esi + 805: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 808: 8b 02 mov (%edx),%eax + 80a: 8b 00 mov (%eax),%eax + 80c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 80f: 8b 42 04 mov 0x4(%edx),%eax + 812: 8d 34 c2 lea (%edx,%eax,8),%esi + 815: 39 f1 cmp %esi,%ecx + 817: 75 c6 jne 7df + p->s.size += bp->s.size; + 819: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 81c: 89 15 58 0d 00 00 mov %edx,0xd58 + p->s.size += bp->s.size; + 822: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 825: 8b 4b f8 mov -0x8(%ebx),%ecx + 828: 89 0a mov %ecx,(%edx) +} + 82a: 5b pop %ebx + 82b: 5e pop %esi + 82c: 5f pop %edi + 82d: 5d pop %ebp + 82e: c3 ret + 82f: 90 nop + +00000830 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 830: 55 push %ebp + 831: 89 e5 mov %esp,%ebp + 833: 57 push %edi + 834: 56 push %esi + 835: 53 push %ebx + 836: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 839: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 83c: 8b 3d 58 0d 00 00 mov 0xd58,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 842: 8d 70 07 lea 0x7(%eax),%esi + 845: c1 ee 03 shr $0x3,%esi + 848: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 84b: 85 ff test %edi,%edi + 84d: 0f 84 9d 00 00 00 je 8f0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 853: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 855: 8b 4a 04 mov 0x4(%edx),%ecx + 858: 39 f1 cmp %esi,%ecx + 85a: 73 6a jae 8c6 + 85c: bb 00 10 00 00 mov $0x1000,%ebx + 861: 39 de cmp %ebx,%esi + 863: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 866: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 86d: 89 45 e4 mov %eax,-0x1c(%ebp) + 870: eb 17 jmp 889 + 872: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 878: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 87a: 8b 48 04 mov 0x4(%eax),%ecx + 87d: 39 f1 cmp %esi,%ecx + 87f: 73 4f jae 8d0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 881: 8b 3d 58 0d 00 00 mov 0xd58,%edi + 887: 89 c2 mov %eax,%edx + 889: 39 d7 cmp %edx,%edi + 88b: 75 eb jne 878 + p = sbrk(nu * sizeof(Header)); + 88d: 83 ec 0c sub $0xc,%esp + 890: ff 75 e4 push -0x1c(%ebp) + 893: e8 3b fc ff ff call 4d3 + if (p == (char*)-1) { + 898: 83 c4 10 add $0x10,%esp + 89b: 83 f8 ff cmp $0xffffffff,%eax + 89e: 74 1c je 8bc + hp->s.size = nu; + 8a0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 8a3: 83 ec 0c sub $0xc,%esp + 8a6: 83 c0 08 add $0x8,%eax + 8a9: 50 push %eax + 8aa: e8 f1 fe ff ff call 7a0 + return freep; + 8af: 8b 15 58 0d 00 00 mov 0xd58,%edx + if ((p = morecore(nunits)) == 0) { + 8b5: 83 c4 10 add $0x10,%esp + 8b8: 85 d2 test %edx,%edx + 8ba: 75 bc jne 878 + return 0; + } + } + } +} + 8bc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 8bf: 31 c0 xor %eax,%eax +} + 8c1: 5b pop %ebx + 8c2: 5e pop %esi + 8c3: 5f pop %edi + 8c4: 5d pop %ebp + 8c5: c3 ret + if (p->s.size >= nunits) { + 8c6: 89 d0 mov %edx,%eax + 8c8: 89 fa mov %edi,%edx + 8ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 8d0: 39 ce cmp %ecx,%esi + 8d2: 74 4c je 920 + p->s.size -= nunits; + 8d4: 29 f1 sub %esi,%ecx + 8d6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 8d9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 8dc: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 8df: 89 15 58 0d 00 00 mov %edx,0xd58 +} + 8e5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 8e8: 83 c0 08 add $0x8,%eax +} + 8eb: 5b pop %ebx + 8ec: 5e pop %esi + 8ed: 5f pop %edi + 8ee: 5d pop %ebp + 8ef: c3 ret + base.s.ptr = freep = prevp = &base; + 8f0: c7 05 58 0d 00 00 5c movl $0xd5c,0xd58 + 8f7: 0d 00 00 + base.s.size = 0; + 8fa: bf 5c 0d 00 00 mov $0xd5c,%edi + base.s.ptr = freep = prevp = &base; + 8ff: c7 05 5c 0d 00 00 5c movl $0xd5c,0xd5c + 906: 0d 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 909: 89 fa mov %edi,%edx + base.s.size = 0; + 90b: c7 05 60 0d 00 00 00 movl $0x0,0xd60 + 912: 00 00 00 + if (p->s.size >= nunits) { + 915: e9 42 ff ff ff jmp 85c + 91a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 920: 8b 08 mov (%eax),%ecx + 922: 89 0a mov %ecx,(%edx) + 924: eb b9 jmp 8df diff --git a/screen.c b/screen.c index 02c08c0..8c2bdea 100644 --- a/screen.c +++ b/screen.c @@ -93,8 +93,8 @@ int main(int argc, char *argv[]) { } if (pid == 0) { if (screen(title, bgcol) != 0) - { - exec("sh", argv); + { + exec("sh", argv); printf(1, "screen: exec sh failed\n"); } else diff --git a/screen.d b/screen.d new file mode 100644 index 0000000..38dc977 --- /dev/null +++ b/screen.d @@ -0,0 +1 @@ +screen.o: screen.c /usr/include/stdc-predef.h types.h user.h diff --git a/screen.o b/screen.o new file mode 100644 index 0000000000000000000000000000000000000000..b10f04210183e9cad9540f6863d4b8864d5c7f25 GIT binary patch literal 6208 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 M(J$SxUh&BP0NA(8m;e9( literal 0 HcmV?d00001 diff --git a/screen.sym b/screen.sym new file mode 100644 index 0000000..e9a8a07 --- /dev/null +++ b/screen.sym @@ -0,0 +1,51 @@ +00000000 screen.c +00000a20 CSWTCH.6 +00000000 ulib.c +00000000 printf.c +00000550 printint +00000aa4 digits.0 +00000000 umalloc.c +00000d58 freep +00000d5c base +00000230 strcpy +00000600 printf +0000052b greeting +00000450 memmove +000004fb mknod +00000350 gets +000004cb getpid +0000053b screen +00000830 malloc +000004db sleep +00000493 pipe +00000523 getch +000004f3 write +000004b3 fstat +000004a3 kill +000004bb chdir +000004ab exec +0000048b wait +0000049b read +00000503 unlink +0000047b fork +000004d3 sbrk +000004e3 uptime +00000d58 __bss_start +000002f0 memset +00000000 main +00000260 strcmp +00000533 shutdown +000004c3 dup +000003c0 stat +00000d58 _edata +00000d64 _end +0000050b link +00000483 exit +00000410 atoi +00000543 cls +000002c0 strlen +000004eb open +00000310 strchr +00000513 mkdir +0000051b close +000007a0 free diff --git a/sh.asm b/sh.asm new file mode 100644 index 0000000..5e936e9 --- /dev/null +++ b/sh.asm @@ -0,0 +1,2727 @@ + +_sh: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: + return -1; + } + return 0; +} + +int main(void) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 51 push %ecx + e: 83 ec 04 sub $0x4,%esp + static char buf[100]; + int fd; + + // Ensure that three file descriptors are open. + while ((fd = open("console", O_RDWR)) >= 0) { + 11: eb 0e jmp 21 + 13: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 17: 90 nop + if (fd >= 3) { + 18: 83 f8 02 cmp $0x2,%eax + 1b: 0f 8f 01 01 00 00 jg 122 + while ((fd = open("console", O_RDWR)) >= 0) { + 21: 83 ec 08 sub $0x8,%esp + 24: 6a 02 push $0x2 + 26: 68 99 13 00 00 push $0x1399 + 2b: e8 8b 0e 00 00 call ebb + 30: 83 c4 10 add $0x10,%esp + 33: 85 c0 test %eax,%eax + 35: 79 e1 jns 18 + 37: eb 33 jmp 6c + 39: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + // Read and run input commands. + while (getcmd(buf, sizeof(buf)) >= 0) { + if (buf[0] == 'e' && buf[1] == 'x' && buf[2] == 'i' && buf[3] == 't') { + exit(); + } + if (buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' ') { + 40: 3c 63 cmp $0x63,%al + 42: 75 0d jne 51 + 44: 80 3d 41 1a 00 00 64 cmpb $0x64,0x1a41 + 4b: 0f 84 7f 00 00 00 je d0 +} + +int fork1(void) { + int pid; + + pid = fork(); + 51: e8 f5 0d 00 00 call e4b + if (pid == -1) { + 56: 83 f8 ff cmp $0xffffffff,%eax + 59: 0f 84 e9 00 00 00 je 148 + if (fork1() == 0) { + 5f: 85 c0 test %eax,%eax + 61: 0f 84 cc 00 00 00 je 133 + wait(); + 67: e8 ef 0d 00 00 call e5b + printf(2, "$ "); + 6c: 83 ec 08 sub $0x8,%esp + 6f: 68 f8 12 00 00 push $0x12f8 + 74: 6a 02 push $0x2 + 76: e8 55 0f 00 00 call fd0 + memset(buf, 0, nbuf); + 7b: 83 c4 0c add $0xc,%esp + 7e: 6a 64 push $0x64 + 80: 6a 00 push $0x0 + 82: 68 40 1a 00 00 push $0x1a40 + 87: e8 34 0c 00 00 call cc0 + gets(buf, nbuf); + 8c: 58 pop %eax + 8d: 5a pop %edx + 8e: 6a 64 push $0x64 + 90: 68 40 1a 00 00 push $0x1a40 + 95: e8 86 0c 00 00 call d20 + if (buf[0] == 0) { // EOF + 9a: 0f b6 05 40 1a 00 00 movzbl 0x1a40,%eax + a1: 83 c4 10 add $0x10,%esp + a4: 84 c0 test %al,%al + a6: 74 1f je c7 + if (buf[0] == 'e' && buf[1] == 'x' && buf[2] == 'i' && buf[3] == 't') { + a8: 3c 65 cmp $0x65,%al + aa: 75 94 jne 40 + ac: 80 3d 41 1a 00 00 78 cmpb $0x78,0x1a41 + b3: 75 9c jne 51 + b5: 80 3d 42 1a 00 00 69 cmpb $0x69,0x1a42 + bc: 75 93 jne 51 + be: 80 3d 43 1a 00 00 74 cmpb $0x74,0x1a43 + c5: 75 8a jne 51 + exit(); + c7: e8 87 0d 00 00 call e53 + cc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' ') { + d0: 80 3d 42 1a 00 00 20 cmpb $0x20,0x1a42 + d7: 0f 85 74 ff ff ff jne 51 + buf[strlen(buf) - 1] = 0; // chop \n + dd: 83 ec 0c sub $0xc,%esp + e0: 68 40 1a 00 00 push $0x1a40 + e5: e8 a6 0b 00 00 call c90 + if (chdir(buf + 3) < 0) { + ea: c7 04 24 43 1a 00 00 movl $0x1a43,(%esp) + buf[strlen(buf) - 1] = 0; // chop \n + f1: c6 80 3f 1a 00 00 00 movb $0x0,0x1a3f(%eax) + if (chdir(buf + 3) < 0) { + f8: e8 8e 0d 00 00 call e8b + fd: 83 c4 10 add $0x10,%esp + 100: 85 c0 test %eax,%eax + 102: 0f 89 64 ff ff ff jns 6c + printf(2, "cannot cd %s\n", buf + 3); + 108: 51 push %ecx + 109: 68 43 1a 00 00 push $0x1a43 + 10e: 68 a1 13 00 00 push $0x13a1 + 113: 6a 02 push $0x2 + 115: e8 b6 0e 00 00 call fd0 + 11a: 83 c4 10 add $0x10,%esp + 11d: e9 4a ff ff ff jmp 6c + close(fd); + 122: 83 ec 0c sub $0xc,%esp + 125: 50 push %eax + 126: e8 c0 0d 00 00 call eeb + break; + 12b: 83 c4 10 add $0x10,%esp + 12e: e9 39 ff ff ff jmp 6c + runcmd(parsecmd(buf)); + 133: 83 ec 0c sub $0xc,%esp + 136: 68 40 1a 00 00 push $0x1a40 + 13b: e8 50 0a 00 00 call b90 + 140: 89 04 24 mov %eax,(%esp) + 143: e8 98 00 00 00 call 1e0 + panic("fork"); + 148: 83 ec 0c sub $0xc,%esp + 14b: 68 fb 12 00 00 push $0x12fb + 150: e8 4b 00 00 00 call 1a0 + 155: 66 90 xchg %ax,%ax + 157: 66 90 xchg %ax,%ax + 159: 66 90 xchg %ax,%ax + 15b: 66 90 xchg %ax,%ax + 15d: 66 90 xchg %ax,%ax + 15f: 90 nop + +00000160 : +int getcmd(char *buf, int nbuf) { + 160: 55 push %ebp + 161: 89 e5 mov %esp,%ebp + 163: 56 push %esi + 164: 53 push %ebx + 165: 8b 75 0c mov 0xc(%ebp),%esi + 168: 8b 5d 08 mov 0x8(%ebp),%ebx + printf(2, "$ "); + 16b: 83 ec 08 sub $0x8,%esp + 16e: 68 f8 12 00 00 push $0x12f8 + 173: 6a 02 push $0x2 + 175: e8 56 0e 00 00 call fd0 + memset(buf, 0, nbuf); + 17a: 83 c4 0c add $0xc,%esp + 17d: 56 push %esi + 17e: 6a 00 push $0x0 + 180: 53 push %ebx + 181: e8 3a 0b 00 00 call cc0 + gets(buf, nbuf); + 186: 58 pop %eax + 187: 5a pop %edx + 188: 56 push %esi + 189: 53 push %ebx + 18a: e8 91 0b 00 00 call d20 + if (buf[0] == 0) { // EOF + 18f: 83 c4 10 add $0x10,%esp + 192: 80 3b 01 cmpb $0x1,(%ebx) + 195: 19 c0 sbb %eax,%eax +} + 197: 8d 65 f8 lea -0x8(%ebp),%esp + 19a: 5b pop %ebx + 19b: 5e pop %esi + 19c: 5d pop %ebp + 19d: c3 ret + 19e: 66 90 xchg %ax,%ax + +000001a0 : +void panic(char *s) { + 1a0: 55 push %ebp + 1a1: 89 e5 mov %esp,%ebp + 1a3: 83 ec 0c sub $0xc,%esp + printf(2, "%s\n", s); + 1a6: ff 75 08 push 0x8(%ebp) + 1a9: 68 95 13 00 00 push $0x1395 + 1ae: 6a 02 push $0x2 + 1b0: e8 1b 0e 00 00 call fd0 + exit(); + 1b5: e8 99 0c 00 00 call e53 + 1ba: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +000001c0 : +int fork1(void) { + 1c0: 55 push %ebp + 1c1: 89 e5 mov %esp,%ebp + 1c3: 83 ec 08 sub $0x8,%esp + pid = fork(); + 1c6: e8 80 0c 00 00 call e4b + if (pid == -1) { + 1cb: 83 f8 ff cmp $0xffffffff,%eax + 1ce: 74 02 je 1d2 + } + return pid; +} + 1d0: c9 leave + 1d1: c3 ret + panic("fork"); + 1d2: 83 ec 0c sub $0xc,%esp + 1d5: 68 fb 12 00 00 push $0x12fb + 1da: e8 c1 ff ff ff call 1a0 + 1df: 90 nop + +000001e0 : +void runcmd(struct cmd *cmd) { + 1e0: 55 push %ebp + 1e1: 89 e5 mov %esp,%ebp + 1e3: 53 push %ebx + 1e4: 83 ec 14 sub $0x14,%esp + 1e7: 8b 5d 08 mov 0x8(%ebp),%ebx + if (cmd == 0) { + 1ea: 85 db test %ebx,%ebx + 1ec: 74 42 je 230 + switch (cmd->type) { + 1ee: 83 3b 05 cmpl $0x5,(%ebx) + 1f1: 0f 87 e3 00 00 00 ja 2da + 1f7: 8b 03 mov (%ebx),%eax + 1f9: ff 24 85 b0 13 00 00 jmp *0x13b0(,%eax,4) + if (ecmd->argv[0] == 0) { + 200: 8b 43 04 mov 0x4(%ebx),%eax + 203: 85 c0 test %eax,%eax + 205: 74 29 je 230 + exec(ecmd->argv[0], ecmd->argv); + 207: 8d 53 04 lea 0x4(%ebx),%edx + 20a: 51 push %ecx + 20b: 51 push %ecx + 20c: 52 push %edx + 20d: 50 push %eax + 20e: e8 68 0c 00 00 call e7b + printf(2, "exec %s failed\n", ecmd->argv[0]); + 213: 83 c4 0c add $0xc,%esp + 216: ff 73 04 push 0x4(%ebx) + 219: 68 07 13 00 00 push $0x1307 + 21e: 6a 02 push $0x2 + 220: e8 ab 0d 00 00 call fd0 + break; + 225: 83 c4 10 add $0x10,%esp + 228: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 22f: 90 nop + exit(); + 230: e8 1e 0c 00 00 call e53 + if (fork1() == 0) { + 235: e8 86 ff ff ff call 1c0 + 23a: 85 c0 test %eax,%eax + 23c: 75 f2 jne 230 + 23e: e9 8c 00 00 00 jmp 2cf + if (pipe(p) < 0) { + 243: 83 ec 0c sub $0xc,%esp + 246: 8d 45 f0 lea -0x10(%ebp),%eax + 249: 50 push %eax + 24a: e8 14 0c 00 00 call e63 + 24f: 83 c4 10 add $0x10,%esp + 252: 85 c0 test %eax,%eax + 254: 0f 88 a2 00 00 00 js 2fc + if (fork1() == 0) { + 25a: e8 61 ff ff ff call 1c0 + 25f: 85 c0 test %eax,%eax + 261: 0f 84 a2 00 00 00 je 309 + if (fork1() == 0) { + 267: e8 54 ff ff ff call 1c0 + 26c: 85 c0 test %eax,%eax + 26e: 0f 84 c3 00 00 00 je 337 + close(p[0]); + 274: 83 ec 0c sub $0xc,%esp + 277: ff 75 f0 push -0x10(%ebp) + 27a: e8 6c 0c 00 00 call eeb + close(p[1]); + 27f: 58 pop %eax + 280: ff 75 f4 push -0xc(%ebp) + 283: e8 63 0c 00 00 call eeb + wait(); + 288: e8 ce 0b 00 00 call e5b + wait(); + 28d: e8 c9 0b 00 00 call e5b + break; + 292: 83 c4 10 add $0x10,%esp + 295: eb 99 jmp 230 + if (fork1() == 0) { + 297: e8 24 ff ff ff call 1c0 + 29c: 85 c0 test %eax,%eax + 29e: 74 2f je 2cf + wait(); + 2a0: e8 b6 0b 00 00 call e5b + runcmd(lcmd->right); + 2a5: 83 ec 0c sub $0xc,%esp + 2a8: ff 73 08 push 0x8(%ebx) + 2ab: e8 30 ff ff ff call 1e0 + close(rcmd->fd); + 2b0: 83 ec 0c sub $0xc,%esp + 2b3: ff 73 14 push 0x14(%ebx) + 2b6: e8 30 0c 00 00 call eeb + if (open(rcmd->file, rcmd->mode) < 0) { + 2bb: 58 pop %eax + 2bc: 5a pop %edx + 2bd: ff 73 10 push 0x10(%ebx) + 2c0: ff 73 08 push 0x8(%ebx) + 2c3: e8 f3 0b 00 00 call ebb + 2c8: 83 c4 10 add $0x10,%esp + 2cb: 85 c0 test %eax,%eax + 2cd: 78 18 js 2e7 + runcmd(bcmd->cmd); + 2cf: 83 ec 0c sub $0xc,%esp + 2d2: ff 73 04 push 0x4(%ebx) + 2d5: e8 06 ff ff ff call 1e0 + panic("runcmd"); + 2da: 83 ec 0c sub $0xc,%esp + 2dd: 68 00 13 00 00 push $0x1300 + 2e2: e8 b9 fe ff ff call 1a0 + printf(2, "open %s failed\n", rcmd->file); + 2e7: 51 push %ecx + 2e8: ff 73 08 push 0x8(%ebx) + 2eb: 68 17 13 00 00 push $0x1317 + 2f0: 6a 02 push $0x2 + 2f2: e8 d9 0c 00 00 call fd0 + exit(); + 2f7: e8 57 0b 00 00 call e53 + panic("pipe"); + 2fc: 83 ec 0c sub $0xc,%esp + 2ff: 68 27 13 00 00 push $0x1327 + 304: e8 97 fe ff ff call 1a0 + close(1); + 309: 83 ec 0c sub $0xc,%esp + 30c: 6a 01 push $0x1 + 30e: e8 d8 0b 00 00 call eeb + dup(p[1]); + 313: 58 pop %eax + 314: ff 75 f4 push -0xc(%ebp) + 317: e8 77 0b 00 00 call e93 + close(p[0]); + 31c: 58 pop %eax + 31d: ff 75 f0 push -0x10(%ebp) + 320: e8 c6 0b 00 00 call eeb + close(p[1]); + 325: 58 pop %eax + 326: ff 75 f4 push -0xc(%ebp) + 329: e8 bd 0b 00 00 call eeb + runcmd(pcmd->left); + 32e: 5a pop %edx + 32f: ff 73 04 push 0x4(%ebx) + 332: e8 a9 fe ff ff call 1e0 + close(0); + 337: 83 ec 0c sub $0xc,%esp + 33a: 6a 00 push $0x0 + 33c: e8 aa 0b 00 00 call eeb + dup(p[0]); + 341: 5a pop %edx + 342: ff 75 f0 push -0x10(%ebp) + 345: e8 49 0b 00 00 call e93 + close(p[0]); + 34a: 59 pop %ecx + 34b: ff 75 f0 push -0x10(%ebp) + 34e: e8 98 0b 00 00 call eeb + close(p[1]); + 353: 58 pop %eax + 354: ff 75 f4 push -0xc(%ebp) + 357: e8 8f 0b 00 00 call eeb + runcmd(pcmd->right); + 35c: 58 pop %eax + 35d: ff 73 08 push 0x8(%ebx) + 360: e8 7b fe ff ff call 1e0 + 365: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000370 : + + +// Constructors + +struct cmd* execcmd(void) { + 370: 55 push %ebp + 371: 89 e5 mov %esp,%ebp + 373: 53 push %ebx + 374: 83 ec 10 sub $0x10,%esp + struct execcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 377: 6a 54 push $0x54 + 379: e8 82 0e 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 37e: 83 c4 0c add $0xc,%esp + 381: 6a 54 push $0x54 + cmd = malloc(sizeof(*cmd)); + 383: 89 c3 mov %eax,%ebx + memset(cmd, 0, sizeof(*cmd)); + 385: 6a 00 push $0x0 + 387: 50 push %eax + 388: e8 33 09 00 00 call cc0 + cmd->type = EXEC; + 38d: c7 03 01 00 00 00 movl $0x1,(%ebx) + return (struct cmd*)cmd; +} + 393: 89 d8 mov %ebx,%eax + 395: 8b 5d fc mov -0x4(%ebp),%ebx + 398: c9 leave + 399: c3 ret + 39a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +000003a0 : + +struct cmd* redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd) { + 3a0: 55 push %ebp + 3a1: 89 e5 mov %esp,%ebp + 3a3: 53 push %ebx + 3a4: 83 ec 10 sub $0x10,%esp + struct redircmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 3a7: 6a 18 push $0x18 + 3a9: e8 52 0e 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 3ae: 83 c4 0c add $0xc,%esp + 3b1: 6a 18 push $0x18 + cmd = malloc(sizeof(*cmd)); + 3b3: 89 c3 mov %eax,%ebx + memset(cmd, 0, sizeof(*cmd)); + 3b5: 6a 00 push $0x0 + 3b7: 50 push %eax + 3b8: e8 03 09 00 00 call cc0 + cmd->type = REDIR; + cmd->cmd = subcmd; + 3bd: 8b 45 08 mov 0x8(%ebp),%eax + cmd->type = REDIR; + 3c0: c7 03 02 00 00 00 movl $0x2,(%ebx) + cmd->cmd = subcmd; + 3c6: 89 43 04 mov %eax,0x4(%ebx) + cmd->file = file; + 3c9: 8b 45 0c mov 0xc(%ebp),%eax + 3cc: 89 43 08 mov %eax,0x8(%ebx) + cmd->efile = efile; + 3cf: 8b 45 10 mov 0x10(%ebp),%eax + 3d2: 89 43 0c mov %eax,0xc(%ebx) + cmd->mode = mode; + 3d5: 8b 45 14 mov 0x14(%ebp),%eax + 3d8: 89 43 10 mov %eax,0x10(%ebx) + cmd->fd = fd; + 3db: 8b 45 18 mov 0x18(%ebp),%eax + 3de: 89 43 14 mov %eax,0x14(%ebx) + return (struct cmd*)cmd; +} + 3e1: 89 d8 mov %ebx,%eax + 3e3: 8b 5d fc mov -0x4(%ebp),%ebx + 3e6: c9 leave + 3e7: c3 ret + 3e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3ef: 90 nop + +000003f0 : + +struct cmd* pipecmd(struct cmd *left, struct cmd *right) { + 3f0: 55 push %ebp + 3f1: 89 e5 mov %esp,%ebp + 3f3: 53 push %ebx + 3f4: 83 ec 10 sub $0x10,%esp + struct pipecmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 3f7: 6a 0c push $0xc + 3f9: e8 02 0e 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 3fe: 83 c4 0c add $0xc,%esp + 401: 6a 0c push $0xc + cmd = malloc(sizeof(*cmd)); + 403: 89 c3 mov %eax,%ebx + memset(cmd, 0, sizeof(*cmd)); + 405: 6a 00 push $0x0 + 407: 50 push %eax + 408: e8 b3 08 00 00 call cc0 + cmd->type = PIPE; + cmd->left = left; + 40d: 8b 45 08 mov 0x8(%ebp),%eax + cmd->type = PIPE; + 410: c7 03 03 00 00 00 movl $0x3,(%ebx) + cmd->left = left; + 416: 89 43 04 mov %eax,0x4(%ebx) + cmd->right = right; + 419: 8b 45 0c mov 0xc(%ebp),%eax + 41c: 89 43 08 mov %eax,0x8(%ebx) + return (struct cmd*)cmd; +} + 41f: 89 d8 mov %ebx,%eax + 421: 8b 5d fc mov -0x4(%ebp),%ebx + 424: c9 leave + 425: c3 ret + 426: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42d: 8d 76 00 lea 0x0(%esi),%esi + +00000430 : + +struct cmd* listcmd(struct cmd *left, struct cmd *right) { + 430: 55 push %ebp + 431: 89 e5 mov %esp,%ebp + 433: 53 push %ebx + 434: 83 ec 10 sub $0x10,%esp + struct listcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 437: 6a 0c push $0xc + 439: e8 c2 0d 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 43e: 83 c4 0c add $0xc,%esp + 441: 6a 0c push $0xc + cmd = malloc(sizeof(*cmd)); + 443: 89 c3 mov %eax,%ebx + memset(cmd, 0, sizeof(*cmd)); + 445: 6a 00 push $0x0 + 447: 50 push %eax + 448: e8 73 08 00 00 call cc0 + cmd->type = LIST; + cmd->left = left; + 44d: 8b 45 08 mov 0x8(%ebp),%eax + cmd->type = LIST; + 450: c7 03 04 00 00 00 movl $0x4,(%ebx) + cmd->left = left; + 456: 89 43 04 mov %eax,0x4(%ebx) + cmd->right = right; + 459: 8b 45 0c mov 0xc(%ebp),%eax + 45c: 89 43 08 mov %eax,0x8(%ebx) + return (struct cmd*)cmd; +} + 45f: 89 d8 mov %ebx,%eax + 461: 8b 5d fc mov -0x4(%ebp),%ebx + 464: c9 leave + 465: c3 ret + 466: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 46d: 8d 76 00 lea 0x0(%esi),%esi + +00000470 : + +struct cmd* backcmd(struct cmd *subcmd) { + 470: 55 push %ebp + 471: 89 e5 mov %esp,%ebp + 473: 53 push %ebx + 474: 83 ec 10 sub $0x10,%esp + struct backcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 477: 6a 08 push $0x8 + 479: e8 82 0d 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 47e: 83 c4 0c add $0xc,%esp + 481: 6a 08 push $0x8 + cmd = malloc(sizeof(*cmd)); + 483: 89 c3 mov %eax,%ebx + memset(cmd, 0, sizeof(*cmd)); + 485: 6a 00 push $0x0 + 487: 50 push %eax + 488: e8 33 08 00 00 call cc0 + cmd->type = BACK; + cmd->cmd = subcmd; + 48d: 8b 45 08 mov 0x8(%ebp),%eax + cmd->type = BACK; + 490: c7 03 05 00 00 00 movl $0x5,(%ebx) + cmd->cmd = subcmd; + 496: 89 43 04 mov %eax,0x4(%ebx) + return (struct cmd*)cmd; +} + 499: 89 d8 mov %ebx,%eax + 49b: 8b 5d fc mov -0x4(%ebp),%ebx + 49e: c9 leave + 49f: c3 ret + +000004a0 : +// Parsing + +char whitespace[] = " \t\r\n\v"; +char symbols[] = "<|>&;()"; + +int gettoken(char **ps, char *es, char **q, char **eq) { + 4a0: 55 push %ebp + 4a1: 89 e5 mov %esp,%ebp + 4a3: 57 push %edi + 4a4: 56 push %esi + 4a5: 53 push %ebx + 4a6: 83 ec 0c sub $0xc,%esp + char *s; + int ret; + + s = *ps; + 4a9: 8b 45 08 mov 0x8(%ebp),%eax +int gettoken(char **ps, char *es, char **q, char **eq) { + 4ac: 8b 5d 0c mov 0xc(%ebp),%ebx + 4af: 8b 75 10 mov 0x10(%ebp),%esi + s = *ps; + 4b2: 8b 38 mov (%eax),%edi + while (s < es && strchr(whitespace, *s)) { + 4b4: 39 df cmp %ebx,%edi + 4b6: 72 0f jb 4c7 + 4b8: eb 25 jmp 4df + 4ba: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + s++; + 4c0: 83 c7 01 add $0x1,%edi + while (s < es && strchr(whitespace, *s)) { + 4c3: 39 fb cmp %edi,%ebx + 4c5: 74 18 je 4df + 4c7: 0f be 07 movsbl (%edi),%eax + 4ca: 83 ec 08 sub $0x8,%esp + 4cd: 50 push %eax + 4ce: 68 1c 1a 00 00 push $0x1a1c + 4d3: e8 08 08 00 00 call ce0 + 4d8: 83 c4 10 add $0x10,%esp + 4db: 85 c0 test %eax,%eax + 4dd: 75 e1 jne 4c0 + } + if (q) { + 4df: 85 f6 test %esi,%esi + 4e1: 74 02 je 4e5 + *q = s; + 4e3: 89 3e mov %edi,(%esi) + } + ret = *s; + 4e5: 0f b6 07 movzbl (%edi),%eax + switch (*s) { + 4e8: 3c 3c cmp $0x3c,%al + 4ea: 0f 8f d0 00 00 00 jg 5c0 + 4f0: 3c 3a cmp $0x3a,%al + 4f2: 0f 8f b4 00 00 00 jg 5ac + 4f8: 84 c0 test %al,%al + 4fa: 75 44 jne 540 + 4fc: 31 f6 xor %esi,%esi + while (s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) { + s++; + } + break; + } + if (eq) { + 4fe: 8b 55 14 mov 0x14(%ebp),%edx + 501: 85 d2 test %edx,%edx + 503: 74 05 je 50a + *eq = s; + 505: 8b 45 14 mov 0x14(%ebp),%eax + 508: 89 38 mov %edi,(%eax) + } + + while (s < es && strchr(whitespace, *s)) { + 50a: 39 df cmp %ebx,%edi + 50c: 72 09 jb 517 + 50e: eb 1f jmp 52f + s++; + 510: 83 c7 01 add $0x1,%edi + while (s < es && strchr(whitespace, *s)) { + 513: 39 fb cmp %edi,%ebx + 515: 74 18 je 52f + 517: 0f be 07 movsbl (%edi),%eax + 51a: 83 ec 08 sub $0x8,%esp + 51d: 50 push %eax + 51e: 68 1c 1a 00 00 push $0x1a1c + 523: e8 b8 07 00 00 call ce0 + 528: 83 c4 10 add $0x10,%esp + 52b: 85 c0 test %eax,%eax + 52d: 75 e1 jne 510 + } + *ps = s; + 52f: 8b 45 08 mov 0x8(%ebp),%eax + 532: 89 38 mov %edi,(%eax) + return ret; +} + 534: 8d 65 f4 lea -0xc(%ebp),%esp + 537: 89 f0 mov %esi,%eax + 539: 5b pop %ebx + 53a: 5e pop %esi + 53b: 5f pop %edi + 53c: 5d pop %ebp + 53d: c3 ret + 53e: 66 90 xchg %ax,%ax + switch (*s) { + 540: 79 5e jns 5a0 + while (s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) { + 542: 39 fb cmp %edi,%ebx + 544: 77 34 ja 57a + if (eq) { + 546: 8b 45 14 mov 0x14(%ebp),%eax + 549: be 61 00 00 00 mov $0x61,%esi + 54e: 85 c0 test %eax,%eax + 550: 75 b3 jne 505 + 552: eb db jmp 52f + 554: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while (s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) { + 558: 0f be 07 movsbl (%edi),%eax + 55b: 83 ec 08 sub $0x8,%esp + 55e: 50 push %eax + 55f: 68 14 1a 00 00 push $0x1a14 + 564: e8 77 07 00 00 call ce0 + 569: 83 c4 10 add $0x10,%esp + 56c: 85 c0 test %eax,%eax + 56e: 75 22 jne 592 + s++; + 570: 83 c7 01 add $0x1,%edi + while (s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) { + 573: 39 fb cmp %edi,%ebx + 575: 74 cf je 546 + 577: 0f b6 07 movzbl (%edi),%eax + 57a: 83 ec 08 sub $0x8,%esp + 57d: 0f be f0 movsbl %al,%esi + 580: 56 push %esi + 581: 68 1c 1a 00 00 push $0x1a1c + 586: e8 55 07 00 00 call ce0 + 58b: 83 c4 10 add $0x10,%esp + 58e: 85 c0 test %eax,%eax + 590: 74 c6 je 558 + ret = 'a'; + 592: be 61 00 00 00 mov $0x61,%esi + 597: e9 62 ff ff ff jmp 4fe + 59c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + switch (*s) { + 5a0: 3c 26 cmp $0x26,%al + 5a2: 74 08 je 5ac + 5a4: 8d 48 d8 lea -0x28(%eax),%ecx + 5a7: 80 f9 01 cmp $0x1,%cl + 5aa: 77 96 ja 542 + ret = *s; + 5ac: 0f be f0 movsbl %al,%esi + s++; + 5af: 83 c7 01 add $0x1,%edi + break; + 5b2: e9 47 ff ff ff jmp 4fe + 5b7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5be: 66 90 xchg %ax,%ax + switch (*s) { + 5c0: 3c 3e cmp $0x3e,%al + 5c2: 75 1c jne 5e0 + if (*s == '>') { + 5c4: 80 7f 01 3e cmpb $0x3e,0x1(%edi) + s++; + 5c8: 8d 47 01 lea 0x1(%edi),%eax + if (*s == '>') { + 5cb: 74 1c je 5e9 + s++; + 5cd: 89 c7 mov %eax,%edi + 5cf: be 3e 00 00 00 mov $0x3e,%esi + 5d4: e9 25 ff ff ff jmp 4fe + 5d9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + switch (*s) { + 5e0: 3c 7c cmp $0x7c,%al + 5e2: 74 c8 je 5ac + 5e4: e9 59 ff ff ff jmp 542 + s++; + 5e9: 83 c7 02 add $0x2,%edi + ret = '+'; + 5ec: be 2b 00 00 00 mov $0x2b,%esi + 5f1: e9 08 ff ff ff jmp 4fe + 5f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5fd: 8d 76 00 lea 0x0(%esi),%esi + +00000600 : + +int peek(char **ps, char *es, char *toks) { + 600: 55 push %ebp + 601: 89 e5 mov %esp,%ebp + 603: 57 push %edi + 604: 56 push %esi + 605: 53 push %ebx + 606: 83 ec 0c sub $0xc,%esp + 609: 8b 7d 08 mov 0x8(%ebp),%edi + 60c: 8b 75 0c mov 0xc(%ebp),%esi + char *s; + + s = *ps; + 60f: 8b 1f mov (%edi),%ebx + while (s < es && strchr(whitespace, *s)) { + 611: 39 f3 cmp %esi,%ebx + 613: 72 12 jb 627 + 615: eb 28 jmp 63f + 617: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 61e: 66 90 xchg %ax,%ax + s++; + 620: 83 c3 01 add $0x1,%ebx + while (s < es && strchr(whitespace, *s)) { + 623: 39 de cmp %ebx,%esi + 625: 74 18 je 63f + 627: 0f be 03 movsbl (%ebx),%eax + 62a: 83 ec 08 sub $0x8,%esp + 62d: 50 push %eax + 62e: 68 1c 1a 00 00 push $0x1a1c + 633: e8 a8 06 00 00 call ce0 + 638: 83 c4 10 add $0x10,%esp + 63b: 85 c0 test %eax,%eax + 63d: 75 e1 jne 620 + } + *ps = s; + 63f: 89 1f mov %ebx,(%edi) + return *s && strchr(toks, *s); + 641: 0f be 03 movsbl (%ebx),%eax + 644: 31 d2 xor %edx,%edx + 646: 84 c0 test %al,%al + 648: 75 0e jne 658 +} + 64a: 8d 65 f4 lea -0xc(%ebp),%esp + 64d: 89 d0 mov %edx,%eax + 64f: 5b pop %ebx + 650: 5e pop %esi + 651: 5f pop %edi + 652: 5d pop %ebp + 653: c3 ret + 654: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + return *s && strchr(toks, *s); + 658: 83 ec 08 sub $0x8,%esp + 65b: 50 push %eax + 65c: ff 75 10 push 0x10(%ebp) + 65f: e8 7c 06 00 00 call ce0 + 664: 83 c4 10 add $0x10,%esp + 667: 31 d2 xor %edx,%edx + 669: 85 c0 test %eax,%eax + 66b: 0f 95 c2 setne %dl +} + 66e: 8d 65 f4 lea -0xc(%ebp),%esp + 671: 5b pop %ebx + 672: 89 d0 mov %edx,%eax + 674: 5e pop %esi + 675: 5f pop %edi + 676: 5d pop %ebp + 677: c3 ret + 678: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 67f: 90 nop + +00000680 : + cmd = pipecmd(cmd, parsepipe(ps, es)); + } + return cmd; +} + +struct cmd* parseredirs(struct cmd *cmd, char **ps, char *es) { + 680: 55 push %ebp + 681: 89 e5 mov %esp,%ebp + 683: 57 push %edi + 684: 56 push %esi + 685: 53 push %ebx + 686: 83 ec 2c sub $0x2c,%esp + 689: 8b 75 0c mov 0xc(%ebp),%esi + 68c: 8b 5d 10 mov 0x10(%ebp),%ebx + int tok; + char *q, *eq; + + while (peek(ps, es, "<>")) { + 68f: 90 nop + 690: 83 ec 04 sub $0x4,%esp + 693: 68 49 13 00 00 push $0x1349 + 698: 53 push %ebx + 699: 56 push %esi + 69a: e8 61 ff ff ff call 600 + 69f: 83 c4 10 add $0x10,%esp + 6a2: 85 c0 test %eax,%eax + 6a4: 0f 84 f6 00 00 00 je 7a0 + tok = gettoken(ps, es, 0, 0); + 6aa: 6a 00 push $0x0 + 6ac: 6a 00 push $0x0 + 6ae: 53 push %ebx + 6af: 56 push %esi + 6b0: e8 eb fd ff ff call 4a0 + 6b5: 89 c7 mov %eax,%edi + if (gettoken(ps, es, &q, &eq) != 'a') { + 6b7: 8d 45 e4 lea -0x1c(%ebp),%eax + 6ba: 50 push %eax + 6bb: 8d 45 e0 lea -0x20(%ebp),%eax + 6be: 50 push %eax + 6bf: 53 push %ebx + 6c0: 56 push %esi + 6c1: e8 da fd ff ff call 4a0 + 6c6: 83 c4 20 add $0x20,%esp + 6c9: 83 f8 61 cmp $0x61,%eax + 6cc: 0f 85 d9 00 00 00 jne 7ab + panic("missing file for redirection"); + } + switch (tok) { + 6d2: 83 ff 3c cmp $0x3c,%edi + 6d5: 74 69 je 740 + 6d7: 83 ff 3e cmp $0x3e,%edi + 6da: 74 05 je 6e1 + 6dc: 83 ff 2b cmp $0x2b,%edi + 6df: 75 af jne 690 + cmd = malloc(sizeof(*cmd)); + 6e1: 83 ec 0c sub $0xc,%esp + break; + case '>': + cmd = redircmd(cmd, q, eq, O_WRONLY | O_CREATE, 1); + break; + case '+': // >> + cmd = redircmd(cmd, q, eq, O_WRONLY | O_CREATE, 1); + 6e4: 8b 55 e4 mov -0x1c(%ebp),%edx + 6e7: 8b 4d e0 mov -0x20(%ebp),%ecx + cmd = malloc(sizeof(*cmd)); + 6ea: 6a 18 push $0x18 + cmd = redircmd(cmd, q, eq, O_WRONLY | O_CREATE, 1); + 6ec: 89 55 d0 mov %edx,-0x30(%ebp) + 6ef: 89 4d d4 mov %ecx,-0x2c(%ebp) + cmd = malloc(sizeof(*cmd)); + 6f2: e8 09 0b 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 6f7: 83 c4 0c add $0xc,%esp + 6fa: 6a 18 push $0x18 + cmd = malloc(sizeof(*cmd)); + 6fc: 89 c7 mov %eax,%edi + memset(cmd, 0, sizeof(*cmd)); + 6fe: 6a 00 push $0x0 + 700: 50 push %eax + 701: e8 ba 05 00 00 call cc0 + cmd->type = REDIR; + 706: c7 07 02 00 00 00 movl $0x2,(%edi) + cmd->cmd = subcmd; + 70c: 8b 45 08 mov 0x8(%ebp),%eax + break; + 70f: 83 c4 10 add $0x10,%esp + cmd->cmd = subcmd; + 712: 89 47 04 mov %eax,0x4(%edi) + cmd->file = file; + 715: 8b 4d d4 mov -0x2c(%ebp),%ecx + 718: 89 4f 08 mov %ecx,0x8(%edi) + cmd->efile = efile; + 71b: 8b 55 d0 mov -0x30(%ebp),%edx + cmd->mode = mode; + 71e: c7 47 10 01 02 00 00 movl $0x201,0x10(%edi) + cmd->efile = efile; + 725: 89 57 0c mov %edx,0xc(%edi) + cmd->fd = fd; + 728: c7 47 14 01 00 00 00 movl $0x1,0x14(%edi) + break; + 72f: 89 7d 08 mov %edi,0x8(%ebp) + 732: e9 59 ff ff ff jmp 690 + 737: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 73e: 66 90 xchg %ax,%ax + cmd = malloc(sizeof(*cmd)); + 740: 83 ec 0c sub $0xc,%esp + cmd = redircmd(cmd, q, eq, O_RDONLY, 0); + 743: 8b 55 e4 mov -0x1c(%ebp),%edx + 746: 8b 4d e0 mov -0x20(%ebp),%ecx + cmd = malloc(sizeof(*cmd)); + 749: 6a 18 push $0x18 + cmd = redircmd(cmd, q, eq, O_RDONLY, 0); + 74b: 89 55 d0 mov %edx,-0x30(%ebp) + 74e: 89 4d d4 mov %ecx,-0x2c(%ebp) + cmd = malloc(sizeof(*cmd)); + 751: e8 aa 0a 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 756: 83 c4 0c add $0xc,%esp + 759: 6a 18 push $0x18 + cmd = malloc(sizeof(*cmd)); + 75b: 89 c7 mov %eax,%edi + memset(cmd, 0, sizeof(*cmd)); + 75d: 6a 00 push $0x0 + 75f: 50 push %eax + 760: e8 5b 05 00 00 call cc0 + cmd->cmd = subcmd; + 765: 8b 45 08 mov 0x8(%ebp),%eax + cmd->file = file; + 768: 8b 4d d4 mov -0x2c(%ebp),%ecx + break; + 76b: 89 7d 08 mov %edi,0x8(%ebp) + cmd->efile = efile; + 76e: 8b 55 d0 mov -0x30(%ebp),%edx + cmd->type = REDIR; + 771: c7 07 02 00 00 00 movl $0x2,(%edi) + break; + 777: 83 c4 10 add $0x10,%esp + cmd->cmd = subcmd; + 77a: 89 47 04 mov %eax,0x4(%edi) + cmd->file = file; + 77d: 89 4f 08 mov %ecx,0x8(%edi) + cmd->efile = efile; + 780: 89 57 0c mov %edx,0xc(%edi) + cmd->mode = mode; + 783: c7 47 10 00 00 00 00 movl $0x0,0x10(%edi) + cmd->fd = fd; + 78a: c7 47 14 00 00 00 00 movl $0x0,0x14(%edi) + break; + 791: e9 fa fe ff ff jmp 690 + 796: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 79d: 8d 76 00 lea 0x0(%esi),%esi + } + } + return cmd; +} + 7a0: 8b 45 08 mov 0x8(%ebp),%eax + 7a3: 8d 65 f4 lea -0xc(%ebp),%esp + 7a6: 5b pop %ebx + 7a7: 5e pop %esi + 7a8: 5f pop %edi + 7a9: 5d pop %ebp + 7aa: c3 ret + panic("missing file for redirection"); + 7ab: 83 ec 0c sub $0xc,%esp + 7ae: 68 2c 13 00 00 push $0x132c + 7b3: e8 e8 f9 ff ff call 1a0 + 7b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 7bf: 90 nop + +000007c0 : + gettoken(ps, es, 0, 0); + cmd = parseredirs(cmd, ps, es); + return cmd; +} + +struct cmd* parseexec(char **ps, char *es) { + 7c0: 55 push %ebp + 7c1: 89 e5 mov %esp,%ebp + 7c3: 57 push %edi + 7c4: 56 push %esi + 7c5: 53 push %ebx + 7c6: 83 ec 30 sub $0x30,%esp + 7c9: 8b 75 08 mov 0x8(%ebp),%esi + 7cc: 8b 7d 0c mov 0xc(%ebp),%edi + char *q, *eq; + int tok, argc; + struct execcmd *cmd; + struct cmd *ret; + + if (peek(ps, es, "(")) { + 7cf: 68 4c 13 00 00 push $0x134c + 7d4: 57 push %edi + 7d5: 56 push %esi + 7d6: e8 25 fe ff ff call 600 + 7db: 83 c4 10 add $0x10,%esp + 7de: 85 c0 test %eax,%eax + 7e0: 0f 85 aa 00 00 00 jne 890 + cmd = malloc(sizeof(*cmd)); + 7e6: 83 ec 0c sub $0xc,%esp + 7e9: 89 c3 mov %eax,%ebx + 7eb: 6a 54 push $0x54 + 7ed: e8 0e 0a 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 7f2: 83 c4 0c add $0xc,%esp + 7f5: 6a 54 push $0x54 + 7f7: 6a 00 push $0x0 + 7f9: 50 push %eax + 7fa: 89 45 d0 mov %eax,-0x30(%ebp) + 7fd: e8 be 04 00 00 call cc0 + cmd->type = EXEC; + 802: 8b 45 d0 mov -0x30(%ebp),%eax + + ret = execcmd(); + cmd = (struct execcmd*)ret; + + argc = 0; + ret = parseredirs(ret, ps, es); + 805: 83 c4 0c add $0xc,%esp + cmd->type = EXEC; + 808: c7 00 01 00 00 00 movl $0x1,(%eax) + ret = parseredirs(ret, ps, es); + 80e: 57 push %edi + 80f: 56 push %esi + 810: 50 push %eax + 811: e8 6a fe ff ff call 680 + while (!peek(ps, es, "|)&;")) { + 816: 83 c4 10 add $0x10,%esp + ret = parseredirs(ret, ps, es); + 819: 89 45 d4 mov %eax,-0x2c(%ebp) + while (!peek(ps, es, "|)&;")) { + 81c: eb 15 jmp 833 + 81e: 66 90 xchg %ax,%ax + cmd->eargv[argc] = eq; + argc++; + if (argc >= MAXARGS) { + panic("too many args"); + } + ret = parseredirs(ret, ps, es); + 820: 83 ec 04 sub $0x4,%esp + 823: 57 push %edi + 824: 56 push %esi + 825: ff 75 d4 push -0x2c(%ebp) + 828: e8 53 fe ff ff call 680 + 82d: 83 c4 10 add $0x10,%esp + 830: 89 45 d4 mov %eax,-0x2c(%ebp) + while (!peek(ps, es, "|)&;")) { + 833: 83 ec 04 sub $0x4,%esp + 836: 68 63 13 00 00 push $0x1363 + 83b: 57 push %edi + 83c: 56 push %esi + 83d: e8 be fd ff ff call 600 + 842: 83 c4 10 add $0x10,%esp + 845: 85 c0 test %eax,%eax + 847: 75 5f jne 8a8 + if ((tok = gettoken(ps, es, &q, &eq)) == 0) { + 849: 8d 45 e4 lea -0x1c(%ebp),%eax + 84c: 50 push %eax + 84d: 8d 45 e0 lea -0x20(%ebp),%eax + 850: 50 push %eax + 851: 57 push %edi + 852: 56 push %esi + 853: e8 48 fc ff ff call 4a0 + 858: 83 c4 10 add $0x10,%esp + 85b: 85 c0 test %eax,%eax + 85d: 74 49 je 8a8 + if (tok != 'a') { + 85f: 83 f8 61 cmp $0x61,%eax + 862: 75 62 jne 8c6 + cmd->argv[argc] = q; + 864: 8b 45 e0 mov -0x20(%ebp),%eax + 867: 8b 55 d0 mov -0x30(%ebp),%edx + 86a: 89 44 9a 04 mov %eax,0x4(%edx,%ebx,4) + cmd->eargv[argc] = eq; + 86e: 8b 45 e4 mov -0x1c(%ebp),%eax + 871: 89 44 9a 2c mov %eax,0x2c(%edx,%ebx,4) + argc++; + 875: 83 c3 01 add $0x1,%ebx + if (argc >= MAXARGS) { + 878: 83 fb 0a cmp $0xa,%ebx + 87b: 75 a3 jne 820 + panic("too many args"); + 87d: 83 ec 0c sub $0xc,%esp + 880: 68 55 13 00 00 push $0x1355 + 885: e8 16 f9 ff ff call 1a0 + 88a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + return parseblock(ps, es); + 890: 89 7d 0c mov %edi,0xc(%ebp) + 893: 89 75 08 mov %esi,0x8(%ebp) + } + cmd->argv[argc] = 0; + cmd->eargv[argc] = 0; + return ret; +} + 896: 8d 65 f4 lea -0xc(%ebp),%esp + 899: 5b pop %ebx + 89a: 5e pop %esi + 89b: 5f pop %edi + 89c: 5d pop %ebp + return parseblock(ps, es); + 89d: e9 ae 01 00 00 jmp a50 + 8a2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + cmd->argv[argc] = 0; + 8a8: 8b 45 d0 mov -0x30(%ebp),%eax + 8ab: c7 44 98 04 00 00 00 movl $0x0,0x4(%eax,%ebx,4) + 8b2: 00 + cmd->eargv[argc] = 0; + 8b3: c7 44 98 2c 00 00 00 movl $0x0,0x2c(%eax,%ebx,4) + 8ba: 00 +} + 8bb: 8b 45 d4 mov -0x2c(%ebp),%eax + 8be: 8d 65 f4 lea -0xc(%ebp),%esp + 8c1: 5b pop %ebx + 8c2: 5e pop %esi + 8c3: 5f pop %edi + 8c4: 5d pop %ebp + 8c5: c3 ret + panic("syntax"); + 8c6: 83 ec 0c sub $0xc,%esp + 8c9: 68 4e 13 00 00 push $0x134e + 8ce: e8 cd f8 ff ff call 1a0 + 8d3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 8da: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +000008e0 : +struct cmd* parsepipe(char **ps, char *es) { + 8e0: 55 push %ebp + 8e1: 89 e5 mov %esp,%ebp + 8e3: 57 push %edi + 8e4: 56 push %esi + 8e5: 53 push %ebx + 8e6: 83 ec 14 sub $0x14,%esp + 8e9: 8b 75 08 mov 0x8(%ebp),%esi + 8ec: 8b 7d 0c mov 0xc(%ebp),%edi + cmd = parseexec(ps, es); + 8ef: 57 push %edi + 8f0: 56 push %esi + 8f1: e8 ca fe ff ff call 7c0 + if (peek(ps, es, "|")) { + 8f6: 83 c4 0c add $0xc,%esp + 8f9: 68 68 13 00 00 push $0x1368 + cmd = parseexec(ps, es); + 8fe: 89 c3 mov %eax,%ebx + if (peek(ps, es, "|")) { + 900: 57 push %edi + 901: 56 push %esi + 902: e8 f9 fc ff ff call 600 + 907: 83 c4 10 add $0x10,%esp + 90a: 85 c0 test %eax,%eax + 90c: 75 12 jne 920 +} + 90e: 8d 65 f4 lea -0xc(%ebp),%esp + 911: 89 d8 mov %ebx,%eax + 913: 5b pop %ebx + 914: 5e pop %esi + 915: 5f pop %edi + 916: 5d pop %ebp + 917: c3 ret + 918: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 91f: 90 nop + gettoken(ps, es, 0, 0); + 920: 6a 00 push $0x0 + 922: 6a 00 push $0x0 + 924: 57 push %edi + 925: 56 push %esi + 926: e8 75 fb ff ff call 4a0 + cmd = pipecmd(cmd, parsepipe(ps, es)); + 92b: 58 pop %eax + 92c: 5a pop %edx + 92d: 57 push %edi + 92e: 56 push %esi + 92f: e8 ac ff ff ff call 8e0 + cmd = malloc(sizeof(*cmd)); + 934: c7 04 24 0c 00 00 00 movl $0xc,(%esp) + cmd = pipecmd(cmd, parsepipe(ps, es)); + 93b: 89 c7 mov %eax,%edi + cmd = malloc(sizeof(*cmd)); + 93d: e8 be 08 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 942: 83 c4 0c add $0xc,%esp + 945: 6a 0c push $0xc + cmd = malloc(sizeof(*cmd)); + 947: 89 c6 mov %eax,%esi + memset(cmd, 0, sizeof(*cmd)); + 949: 6a 00 push $0x0 + 94b: 50 push %eax + 94c: e8 6f 03 00 00 call cc0 + cmd->left = left; + 951: 89 5e 04 mov %ebx,0x4(%esi) + cmd->right = right; + 954: 83 c4 10 add $0x10,%esp + 957: 89 f3 mov %esi,%ebx + cmd->type = PIPE; + 959: c7 06 03 00 00 00 movl $0x3,(%esi) +} + 95f: 89 d8 mov %ebx,%eax + cmd->right = right; + 961: 89 7e 08 mov %edi,0x8(%esi) +} + 964: 8d 65 f4 lea -0xc(%ebp),%esp + 967: 5b pop %ebx + 968: 5e pop %esi + 969: 5f pop %edi + 96a: 5d pop %ebp + 96b: c3 ret + 96c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000970 : +struct cmd* parseline(char **ps, char *es) { + 970: 55 push %ebp + 971: 89 e5 mov %esp,%ebp + 973: 57 push %edi + 974: 56 push %esi + 975: 53 push %ebx + 976: 83 ec 24 sub $0x24,%esp + 979: 8b 75 08 mov 0x8(%ebp),%esi + 97c: 8b 7d 0c mov 0xc(%ebp),%edi + cmd = parsepipe(ps, es); + 97f: 57 push %edi + 980: 56 push %esi + 981: e8 5a ff ff ff call 8e0 + while (peek(ps, es, "&")) { + 986: 83 c4 10 add $0x10,%esp + cmd = parsepipe(ps, es); + 989: 89 c3 mov %eax,%ebx + while (peek(ps, es, "&")) { + 98b: eb 3b jmp 9c8 + 98d: 8d 76 00 lea 0x0(%esi),%esi + gettoken(ps, es, 0, 0); + 990: 6a 00 push $0x0 + 992: 6a 00 push $0x0 + 994: 57 push %edi + 995: 56 push %esi + 996: e8 05 fb ff ff call 4a0 + cmd = malloc(sizeof(*cmd)); + 99b: c7 04 24 08 00 00 00 movl $0x8,(%esp) + 9a2: e8 59 08 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + 9a7: 83 c4 0c add $0xc,%esp + 9aa: 6a 08 push $0x8 + 9ac: 6a 00 push $0x0 + 9ae: 50 push %eax + 9af: 89 45 e4 mov %eax,-0x1c(%ebp) + 9b2: e8 09 03 00 00 call cc0 + cmd->type = BACK; + 9b7: 8b 55 e4 mov -0x1c(%ebp),%edx + cmd->cmd = subcmd; + 9ba: 83 c4 10 add $0x10,%esp + cmd->type = BACK; + 9bd: c7 02 05 00 00 00 movl $0x5,(%edx) + cmd->cmd = subcmd; + 9c3: 89 5a 04 mov %ebx,0x4(%edx) + 9c6: 89 d3 mov %edx,%ebx + while (peek(ps, es, "&")) { + 9c8: 83 ec 04 sub $0x4,%esp + 9cb: 68 6a 13 00 00 push $0x136a + 9d0: 57 push %edi + 9d1: 56 push %esi + 9d2: e8 29 fc ff ff call 600 + 9d7: 83 c4 10 add $0x10,%esp + 9da: 85 c0 test %eax,%eax + 9dc: 75 b2 jne 990 + if (peek(ps, es, ";")) { + 9de: 83 ec 04 sub $0x4,%esp + 9e1: 68 66 13 00 00 push $0x1366 + 9e6: 57 push %edi + 9e7: 56 push %esi + 9e8: e8 13 fc ff ff call 600 + 9ed: 83 c4 10 add $0x10,%esp + 9f0: 85 c0 test %eax,%eax + 9f2: 75 0c jne a00 +} + 9f4: 8d 65 f4 lea -0xc(%ebp),%esp + 9f7: 89 d8 mov %ebx,%eax + 9f9: 5b pop %ebx + 9fa: 5e pop %esi + 9fb: 5f pop %edi + 9fc: 5d pop %ebp + 9fd: c3 ret + 9fe: 66 90 xchg %ax,%ax + gettoken(ps, es, 0, 0); + a00: 6a 00 push $0x0 + a02: 6a 00 push $0x0 + a04: 57 push %edi + a05: 56 push %esi + a06: e8 95 fa ff ff call 4a0 + cmd = listcmd(cmd, parseline(ps, es)); + a0b: 58 pop %eax + a0c: 5a pop %edx + a0d: 57 push %edi + a0e: 56 push %esi + a0f: e8 5c ff ff ff call 970 + cmd = malloc(sizeof(*cmd)); + a14: c7 04 24 0c 00 00 00 movl $0xc,(%esp) + cmd = listcmd(cmd, parseline(ps, es)); + a1b: 89 c7 mov %eax,%edi + cmd = malloc(sizeof(*cmd)); + a1d: e8 de 07 00 00 call 1200 + memset(cmd, 0, sizeof(*cmd)); + a22: 83 c4 0c add $0xc,%esp + a25: 6a 0c push $0xc + cmd = malloc(sizeof(*cmd)); + a27: 89 c6 mov %eax,%esi + memset(cmd, 0, sizeof(*cmd)); + a29: 6a 00 push $0x0 + a2b: 50 push %eax + a2c: e8 8f 02 00 00 call cc0 + cmd->left = left; + a31: 89 5e 04 mov %ebx,0x4(%esi) + cmd->right = right; + a34: 83 c4 10 add $0x10,%esp + a37: 89 f3 mov %esi,%ebx + cmd->type = LIST; + a39: c7 06 04 00 00 00 movl $0x4,(%esi) +} + a3f: 89 d8 mov %ebx,%eax + cmd->right = right; + a41: 89 7e 08 mov %edi,0x8(%esi) +} + a44: 8d 65 f4 lea -0xc(%ebp),%esp + a47: 5b pop %ebx + a48: 5e pop %esi + a49: 5f pop %edi + a4a: 5d pop %ebp + a4b: c3 ret + a4c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000a50 : +struct cmd* parseblock(char **ps, char *es) { + a50: 55 push %ebp + a51: 89 e5 mov %esp,%ebp + a53: 57 push %edi + a54: 56 push %esi + a55: 53 push %ebx + a56: 83 ec 10 sub $0x10,%esp + a59: 8b 5d 08 mov 0x8(%ebp),%ebx + a5c: 8b 75 0c mov 0xc(%ebp),%esi + if (!peek(ps, es, "(")) { + a5f: 68 4c 13 00 00 push $0x134c + a64: 56 push %esi + a65: 53 push %ebx + a66: e8 95 fb ff ff call 600 + a6b: 83 c4 10 add $0x10,%esp + a6e: 85 c0 test %eax,%eax + a70: 74 4a je abc + gettoken(ps, es, 0, 0); + a72: 6a 00 push $0x0 + a74: 6a 00 push $0x0 + a76: 56 push %esi + a77: 53 push %ebx + a78: e8 23 fa ff ff call 4a0 + cmd = parseline(ps, es); + a7d: 58 pop %eax + a7e: 5a pop %edx + a7f: 56 push %esi + a80: 53 push %ebx + a81: e8 ea fe ff ff call 970 + if (!peek(ps, es, ")")) { + a86: 83 c4 0c add $0xc,%esp + a89: 68 88 13 00 00 push $0x1388 + cmd = parseline(ps, es); + a8e: 89 c7 mov %eax,%edi + if (!peek(ps, es, ")")) { + a90: 56 push %esi + a91: 53 push %ebx + a92: e8 69 fb ff ff call 600 + a97: 83 c4 10 add $0x10,%esp + a9a: 85 c0 test %eax,%eax + a9c: 74 2b je ac9 + gettoken(ps, es, 0, 0); + a9e: 6a 00 push $0x0 + aa0: 6a 00 push $0x0 + aa2: 56 push %esi + aa3: 53 push %ebx + aa4: e8 f7 f9 ff ff call 4a0 + cmd = parseredirs(cmd, ps, es); + aa9: 83 c4 0c add $0xc,%esp + aac: 56 push %esi + aad: 53 push %ebx + aae: 57 push %edi + aaf: e8 cc fb ff ff call 680 +} + ab4: 8d 65 f4 lea -0xc(%ebp),%esp + ab7: 5b pop %ebx + ab8: 5e pop %esi + ab9: 5f pop %edi + aba: 5d pop %ebp + abb: c3 ret + panic("parseblock"); + abc: 83 ec 0c sub $0xc,%esp + abf: 68 6c 13 00 00 push $0x136c + ac4: e8 d7 f6 ff ff call 1a0 + panic("syntax - missing )"); + ac9: 83 ec 0c sub $0xc,%esp + acc: 68 77 13 00 00 push $0x1377 + ad1: e8 ca f6 ff ff call 1a0 + ad6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + add: 8d 76 00 lea 0x0(%esi),%esi + +00000ae0 : + +// NUL-terminate all the counted strings. +struct cmd* nulterminate(struct cmd *cmd) { + ae0: 55 push %ebp + ae1: 89 e5 mov %esp,%ebp + ae3: 53 push %ebx + ae4: 83 ec 04 sub $0x4,%esp + ae7: 8b 5d 08 mov 0x8(%ebp),%ebx + struct execcmd *ecmd; + struct listcmd *lcmd; + struct pipecmd *pcmd; + struct redircmd *rcmd; + + if (cmd == 0) { + aea: 85 db test %ebx,%ebx + aec: 0f 84 8e 00 00 00 je b80 + return 0; + } + + switch (cmd->type) { + af2: 83 3b 05 cmpl $0x5,(%ebx) + af5: 77 61 ja b58 + af7: 8b 03 mov (%ebx),%eax + af9: ff 24 85 c8 13 00 00 jmp *0x13c8(,%eax,4) + nulterminate(pcmd->right); + break; + + case LIST: + lcmd = (struct listcmd*)cmd; + nulterminate(lcmd->left); + b00: 83 ec 0c sub $0xc,%esp + b03: ff 73 04 push 0x4(%ebx) + b06: e8 d5 ff ff ff call ae0 + nulterminate(lcmd->right); + b0b: 58 pop %eax + b0c: ff 73 08 push 0x8(%ebx) + b0f: e8 cc ff ff ff call ae0 + break; + b14: 83 c4 10 add $0x10,%esp + b17: 89 d8 mov %ebx,%eax + bcmd = (struct backcmd*)cmd; + nulterminate(bcmd->cmd); + break; + } + return cmd; +} + b19: 8b 5d fc mov -0x4(%ebp),%ebx + b1c: c9 leave + b1d: c3 ret + b1e: 66 90 xchg %ax,%ax + nulterminate(bcmd->cmd); + b20: 83 ec 0c sub $0xc,%esp + b23: ff 73 04 push 0x4(%ebx) + b26: e8 b5 ff ff ff call ae0 + break; + b2b: 89 d8 mov %ebx,%eax + b2d: 83 c4 10 add $0x10,%esp +} + b30: 8b 5d fc mov -0x4(%ebp),%ebx + b33: c9 leave + b34: c3 ret + b35: 8d 76 00 lea 0x0(%esi),%esi + for (i = 0; ecmd->argv[i]; i++) { + b38: 8b 4b 04 mov 0x4(%ebx),%ecx + b3b: 8d 43 08 lea 0x8(%ebx),%eax + b3e: 85 c9 test %ecx,%ecx + b40: 74 16 je b58 + b42: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + *ecmd->eargv[i] = 0; + b48: 8b 50 24 mov 0x24(%eax),%edx + for (i = 0; ecmd->argv[i]; i++) { + b4b: 83 c0 04 add $0x4,%eax + *ecmd->eargv[i] = 0; + b4e: c6 02 00 movb $0x0,(%edx) + for (i = 0; ecmd->argv[i]; i++) { + b51: 8b 50 fc mov -0x4(%eax),%edx + b54: 85 d2 test %edx,%edx + b56: 75 f0 jne b48 + switch (cmd->type) { + b58: 89 d8 mov %ebx,%eax +} + b5a: 8b 5d fc mov -0x4(%ebp),%ebx + b5d: c9 leave + b5e: c3 ret + b5f: 90 nop + nulterminate(rcmd->cmd); + b60: 83 ec 0c sub $0xc,%esp + b63: ff 73 04 push 0x4(%ebx) + b66: e8 75 ff ff ff call ae0 + *rcmd->efile = 0; + b6b: 8b 43 0c mov 0xc(%ebx),%eax + break; + b6e: 83 c4 10 add $0x10,%esp + *rcmd->efile = 0; + b71: c6 00 00 movb $0x0,(%eax) + break; + b74: 89 d8 mov %ebx,%eax +} + b76: 8b 5d fc mov -0x4(%ebp),%ebx + b79: c9 leave + b7a: c3 ret + b7b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + b7f: 90 nop + return 0; + b80: 31 c0 xor %eax,%eax + b82: eb 95 jmp b19 + b84: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + b8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + b8f: 90 nop + +00000b90 : +struct cmd* parsecmd(char *s) { + b90: 55 push %ebp + b91: 89 e5 mov %esp,%ebp + b93: 57 push %edi + b94: 56 push %esi + cmd = parseline(&s, es); + b95: 8d 7d 08 lea 0x8(%ebp),%edi +struct cmd* parsecmd(char *s) { + b98: 53 push %ebx + b99: 83 ec 18 sub $0x18,%esp + es = s + strlen(s); + b9c: 8b 5d 08 mov 0x8(%ebp),%ebx + b9f: 53 push %ebx + ba0: e8 eb 00 00 00 call c90 + cmd = parseline(&s, es); + ba5: 59 pop %ecx + ba6: 5e pop %esi + es = s + strlen(s); + ba7: 01 c3 add %eax,%ebx + cmd = parseline(&s, es); + ba9: 53 push %ebx + baa: 57 push %edi + bab: e8 c0 fd ff ff call 970 + peek(&s, es, ""); + bb0: 83 c4 0c add $0xc,%esp + bb3: 68 16 13 00 00 push $0x1316 + cmd = parseline(&s, es); + bb8: 89 c6 mov %eax,%esi + peek(&s, es, ""); + bba: 53 push %ebx + bbb: 57 push %edi + bbc: e8 3f fa ff ff call 600 + if (s != es) { + bc1: 8b 45 08 mov 0x8(%ebp),%eax + bc4: 83 c4 10 add $0x10,%esp + bc7: 39 d8 cmp %ebx,%eax + bc9: 75 13 jne bde + nulterminate(cmd); + bcb: 83 ec 0c sub $0xc,%esp + bce: 56 push %esi + bcf: e8 0c ff ff ff call ae0 +} + bd4: 8d 65 f4 lea -0xc(%ebp),%esp + bd7: 89 f0 mov %esi,%eax + bd9: 5b pop %ebx + bda: 5e pop %esi + bdb: 5f pop %edi + bdc: 5d pop %ebp + bdd: c3 ret + printf(2, "leftovers: %s\n", s); + bde: 52 push %edx + bdf: 50 push %eax + be0: 68 8a 13 00 00 push $0x138a + be5: 6a 02 push $0x2 + be7: e8 e4 03 00 00 call fd0 + panic("syntax"); + bec: c7 04 24 4e 13 00 00 movl $0x134e,(%esp) + bf3: e8 a8 f5 ff ff call 1a0 + bf8: 66 90 xchg %ax,%ax + bfa: 66 90 xchg %ax,%ax + bfc: 66 90 xchg %ax,%ax + bfe: 66 90 xchg %ax,%ax + +00000c00 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + c00: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + c01: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + c03: 89 e5 mov %esp,%ebp + c05: 53 push %ebx + c06: 8b 4d 08 mov 0x8(%ebp),%ecx + c09: 8b 5d 0c mov 0xc(%ebp),%ebx + c0c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + c10: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + c14: 88 14 01 mov %dl,(%ecx,%eax,1) + c17: 83 c0 01 add $0x1,%eax + c1a: 84 d2 test %dl,%dl + c1c: 75 f2 jne c10 + ; + } + return os; +} + c1e: 8b 5d fc mov -0x4(%ebp),%ebx + c21: 89 c8 mov %ecx,%eax + c23: c9 leave + c24: c3 ret + c25: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + c2c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000c30 : + +int strcmp(const char *p, const char *q) { + c30: 55 push %ebp + c31: 89 e5 mov %esp,%ebp + c33: 53 push %ebx + c34: 8b 55 08 mov 0x8(%ebp),%edx + c37: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + c3a: 0f b6 02 movzbl (%edx),%eax + c3d: 84 c0 test %al,%al + c3f: 75 17 jne c58 + c41: eb 3a jmp c7d + c43: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c47: 90 nop + c48: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + c4c: 83 c2 01 add $0x1,%edx + c4f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + c52: 84 c0 test %al,%al + c54: 74 1a je c70 + p++, q++; + c56: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + c58: 0f b6 19 movzbl (%ecx),%ebx + c5b: 38 c3 cmp %al,%bl + c5d: 74 e9 je c48 + } + return (uchar) * p - (uchar) * q; + c5f: 29 d8 sub %ebx,%eax +} + c61: 8b 5d fc mov -0x4(%ebp),%ebx + c64: c9 leave + c65: c3 ret + c66: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + c6d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + c70: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + c74: 31 c0 xor %eax,%eax + c76: 29 d8 sub %ebx,%eax +} + c78: 8b 5d fc mov -0x4(%ebp),%ebx + c7b: c9 leave + c7c: c3 ret + return (uchar) * p - (uchar) * q; + c7d: 0f b6 19 movzbl (%ecx),%ebx + c80: 31 c0 xor %eax,%eax + c82: eb db jmp c5f + c84: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + c8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c8f: 90 nop + +00000c90 : + +uint strlen(const char *s) { + c90: 55 push %ebp + c91: 89 e5 mov %esp,%ebp + c93: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + c96: 80 3a 00 cmpb $0x0,(%edx) + c99: 74 15 je cb0 + c9b: 31 c0 xor %eax,%eax + c9d: 8d 76 00 lea 0x0(%esi),%esi + ca0: 83 c0 01 add $0x1,%eax + ca3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + ca7: 89 c1 mov %eax,%ecx + ca9: 75 f5 jne ca0 + ; + } + return n; +} + cab: 89 c8 mov %ecx,%eax + cad: 5d pop %ebp + cae: c3 ret + caf: 90 nop + for (n = 0; s[n]; n++) { + cb0: 31 c9 xor %ecx,%ecx +} + cb2: 5d pop %ebp + cb3: 89 c8 mov %ecx,%eax + cb5: c3 ret + cb6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + cbd: 8d 76 00 lea 0x0(%esi),%esi + +00000cc0 : + +void* memset(void *dst, int c, uint n) { + cc0: 55 push %ebp + cc1: 89 e5 mov %esp,%ebp + cc3: 57 push %edi + cc4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + cc7: 8b 4d 10 mov 0x10(%ebp),%ecx + cca: 8b 45 0c mov 0xc(%ebp),%eax + ccd: 89 d7 mov %edx,%edi + ccf: fc cld + cd0: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + cd2: 8b 7d fc mov -0x4(%ebp),%edi + cd5: 89 d0 mov %edx,%eax + cd7: c9 leave + cd8: c3 ret + cd9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000ce0 : + +char* strchr(const char *s, char c) { + ce0: 55 push %ebp + ce1: 89 e5 mov %esp,%ebp + ce3: 8b 45 08 mov 0x8(%ebp),%eax + ce6: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + cea: 0f b6 10 movzbl (%eax),%edx + ced: 84 d2 test %dl,%dl + cef: 75 12 jne d03 + cf1: eb 1d jmp d10 + cf3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + cf7: 90 nop + cf8: 0f b6 50 01 movzbl 0x1(%eax),%edx + cfc: 83 c0 01 add $0x1,%eax + cff: 84 d2 test %dl,%dl + d01: 74 0d je d10 + if (*s == c) { + d03: 38 d1 cmp %dl,%cl + d05: 75 f1 jne cf8 + return (char*)s; + } + } + return 0; +} + d07: 5d pop %ebp + d08: c3 ret + d09: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + d10: 31 c0 xor %eax,%eax +} + d12: 5d pop %ebp + d13: c3 ret + d14: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + d1b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + d1f: 90 nop + +00000d20 : + +char* gets(char *buf, int max) { + d20: 55 push %ebp + d21: 89 e5 mov %esp,%ebp + d23: 57 push %edi + d24: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + d25: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + d28: 53 push %ebx + for (i = 0; i + 1 < max;) { + d29: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + d2b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + d2e: eb 27 jmp d57 + cc = read(0, &c, 1); + d30: 83 ec 04 sub $0x4,%esp + d33: 6a 01 push $0x1 + d35: 57 push %edi + d36: 6a 00 push $0x0 + d38: e8 2e 01 00 00 call e6b + if (cc < 1) { + d3d: 83 c4 10 add $0x10,%esp + d40: 85 c0 test %eax,%eax + d42: 7e 1d jle d61 + break; + } + buf[i++] = c; + d44: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + d48: 8b 55 08 mov 0x8(%ebp),%edx + d4b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + d4f: 3c 0a cmp $0xa,%al + d51: 74 1d je d70 + d53: 3c 0d cmp $0xd,%al + d55: 74 19 je d70 + for (i = 0; i + 1 < max;) { + d57: 89 de mov %ebx,%esi + d59: 83 c3 01 add $0x1,%ebx + d5c: 3b 5d 0c cmp 0xc(%ebp),%ebx + d5f: 7c cf jl d30 + break; + } + } + buf[i] = '\0'; + d61: 8b 45 08 mov 0x8(%ebp),%eax + d64: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + d68: 8d 65 f4 lea -0xc(%ebp),%esp + d6b: 5b pop %ebx + d6c: 5e pop %esi + d6d: 5f pop %edi + d6e: 5d pop %ebp + d6f: c3 ret + buf[i] = '\0'; + d70: 8b 45 08 mov 0x8(%ebp),%eax + d73: 89 de mov %ebx,%esi + d75: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + d79: 8d 65 f4 lea -0xc(%ebp),%esp + d7c: 5b pop %ebx + d7d: 5e pop %esi + d7e: 5f pop %edi + d7f: 5d pop %ebp + d80: c3 ret + d81: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + d88: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + d8f: 90 nop + +00000d90 : + +int stat(const char *n, struct stat *st) { + d90: 55 push %ebp + d91: 89 e5 mov %esp,%ebp + d93: 56 push %esi + d94: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + d95: 83 ec 08 sub $0x8,%esp + d98: 6a 00 push $0x0 + d9a: ff 75 08 push 0x8(%ebp) + d9d: e8 19 01 00 00 call ebb + if (fd < 0) { + da2: 83 c4 10 add $0x10,%esp + da5: 85 c0 test %eax,%eax + da7: 78 27 js dd0 + return -1; + } + r = fstat(fd, st); + da9: 83 ec 08 sub $0x8,%esp + dac: ff 75 0c push 0xc(%ebp) + daf: 89 c3 mov %eax,%ebx + db1: 50 push %eax + db2: e8 cc 00 00 00 call e83 + close(fd); + db7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + dba: 89 c6 mov %eax,%esi + close(fd); + dbc: e8 2a 01 00 00 call eeb + return r; + dc1: 83 c4 10 add $0x10,%esp +} + dc4: 8d 65 f8 lea -0x8(%ebp),%esp + dc7: 89 f0 mov %esi,%eax + dc9: 5b pop %ebx + dca: 5e pop %esi + dcb: 5d pop %ebp + dcc: c3 ret + dcd: 8d 76 00 lea 0x0(%esi),%esi + return -1; + dd0: be ff ff ff ff mov $0xffffffff,%esi + dd5: eb ed jmp dc4 + dd7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + dde: 66 90 xchg %ax,%ax + +00000de0 : + +int atoi(const char *s) { + de0: 55 push %ebp + de1: 89 e5 mov %esp,%ebp + de3: 53 push %ebx + de4: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + de7: 0f be 02 movsbl (%edx),%eax + dea: 8d 48 d0 lea -0x30(%eax),%ecx + ded: 80 f9 09 cmp $0x9,%cl + n = 0; + df0: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + df5: 77 1e ja e15 + df7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + dfe: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + e00: 83 c2 01 add $0x1,%edx + e03: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + e06: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + e0a: 0f be 02 movsbl (%edx),%eax + e0d: 8d 58 d0 lea -0x30(%eax),%ebx + e10: 80 fb 09 cmp $0x9,%bl + e13: 76 eb jbe e00 + } + return n; +} + e15: 8b 5d fc mov -0x4(%ebp),%ebx + e18: 89 c8 mov %ecx,%eax + e1a: c9 leave + e1b: c3 ret + e1c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000e20 : + +void* memmove(void *vdst, const void *vsrc, int n) { + e20: 55 push %ebp + e21: 89 e5 mov %esp,%ebp + e23: 57 push %edi + e24: 8b 45 10 mov 0x10(%ebp),%eax + e27: 8b 55 08 mov 0x8(%ebp),%edx + e2a: 56 push %esi + e2b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + e2e: 85 c0 test %eax,%eax + e30: 7e 13 jle e45 + e32: 01 d0 add %edx,%eax + dst = vdst; + e34: 89 d7 mov %edx,%edi + e36: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + e3d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + e40: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + e41: 39 f8 cmp %edi,%eax + e43: 75 fb jne e40 + } + return vdst; +} + e45: 5e pop %esi + e46: 89 d0 mov %edx,%eax + e48: 5f pop %edi + e49: 5d pop %ebp + e4a: c3 ret + +00000e4b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + e4b: b8 01 00 00 00 mov $0x1,%eax + e50: cd 40 int $0x40 + e52: c3 ret + +00000e53 : +SYSCALL(exit) + e53: b8 02 00 00 00 mov $0x2,%eax + e58: cd 40 int $0x40 + e5a: c3 ret + +00000e5b : +SYSCALL(wait) + e5b: b8 03 00 00 00 mov $0x3,%eax + e60: cd 40 int $0x40 + e62: c3 ret + +00000e63 : +SYSCALL(pipe) + e63: b8 04 00 00 00 mov $0x4,%eax + e68: cd 40 int $0x40 + e6a: c3 ret + +00000e6b : +SYSCALL(read) + e6b: b8 05 00 00 00 mov $0x5,%eax + e70: cd 40 int $0x40 + e72: c3 ret + +00000e73 : +SYSCALL(kill) + e73: b8 06 00 00 00 mov $0x6,%eax + e78: cd 40 int $0x40 + e7a: c3 ret + +00000e7b : +SYSCALL(exec) + e7b: b8 07 00 00 00 mov $0x7,%eax + e80: cd 40 int $0x40 + e82: c3 ret + +00000e83 : +SYSCALL(fstat) + e83: b8 08 00 00 00 mov $0x8,%eax + e88: cd 40 int $0x40 + e8a: c3 ret + +00000e8b : +SYSCALL(chdir) + e8b: b8 09 00 00 00 mov $0x9,%eax + e90: cd 40 int $0x40 + e92: c3 ret + +00000e93 : +SYSCALL(dup) + e93: b8 0a 00 00 00 mov $0xa,%eax + e98: cd 40 int $0x40 + e9a: c3 ret + +00000e9b : +SYSCALL(getpid) + e9b: b8 0b 00 00 00 mov $0xb,%eax + ea0: cd 40 int $0x40 + ea2: c3 ret + +00000ea3 : +SYSCALL(sbrk) + ea3: b8 0c 00 00 00 mov $0xc,%eax + ea8: cd 40 int $0x40 + eaa: c3 ret + +00000eab : +SYSCALL(sleep) + eab: b8 0d 00 00 00 mov $0xd,%eax + eb0: cd 40 int $0x40 + eb2: c3 ret + +00000eb3 : +SYSCALL(uptime) + eb3: b8 0e 00 00 00 mov $0xe,%eax + eb8: cd 40 int $0x40 + eba: c3 ret + +00000ebb : +SYSCALL(open) + ebb: b8 0f 00 00 00 mov $0xf,%eax + ec0: cd 40 int $0x40 + ec2: c3 ret + +00000ec3 : +SYSCALL(write) + ec3: b8 10 00 00 00 mov $0x10,%eax + ec8: cd 40 int $0x40 + eca: c3 ret + +00000ecb : +SYSCALL(mknod) + ecb: b8 11 00 00 00 mov $0x11,%eax + ed0: cd 40 int $0x40 + ed2: c3 ret + +00000ed3 : +SYSCALL(unlink) + ed3: b8 12 00 00 00 mov $0x12,%eax + ed8: cd 40 int $0x40 + eda: c3 ret + +00000edb : +SYSCALL(link) + edb: b8 13 00 00 00 mov $0x13,%eax + ee0: cd 40 int $0x40 + ee2: c3 ret + +00000ee3 : +SYSCALL(mkdir) + ee3: b8 14 00 00 00 mov $0x14,%eax + ee8: cd 40 int $0x40 + eea: c3 ret + +00000eeb : +SYSCALL(close) + eeb: b8 15 00 00 00 mov $0x15,%eax + ef0: cd 40 int $0x40 + ef2: c3 ret + +00000ef3 : +SYSCALL(getch) + ef3: b8 16 00 00 00 mov $0x16,%eax + ef8: cd 40 int $0x40 + efa: c3 ret + +00000efb : +SYSCALL(greeting) + efb: b8 17 00 00 00 mov $0x17,%eax + f00: cd 40 int $0x40 + f02: c3 ret + +00000f03 : +SYSCALL(shutdown) + f03: b8 18 00 00 00 mov $0x18,%eax + f08: cd 40 int $0x40 + f0a: c3 ret + +00000f0b : +SYSCALL(screen) + f0b: b8 19 00 00 00 mov $0x19,%eax + f10: cd 40 int $0x40 + f12: c3 ret + +00000f13 : +SYSCALL(cls) + f13: b8 1a 00 00 00 mov $0x1a,%eax + f18: cd 40 int $0x40 + f1a: c3 ret + f1b: 66 90 xchg %ax,%ax + f1d: 66 90 xchg %ax,%ax + f1f: 90 nop + +00000f20 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + f20: 55 push %ebp + f21: 89 e5 mov %esp,%ebp + f23: 57 push %edi + f24: 56 push %esi + f25: 53 push %ebx + f26: 83 ec 3c sub $0x3c,%esp + f29: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + f2c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + f2e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + f31: 85 d2 test %edx,%edx + f33: 0f 89 7f 00 00 00 jns fb8 + f39: f6 45 08 01 testb $0x1,0x8(%ebp) + f3d: 74 79 je fb8 + neg = 1; + f3f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + f46: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + f48: 31 db xor %ebx,%ebx + f4a: 8d 75 d7 lea -0x29(%ebp),%esi + f4d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + f50: 89 c8 mov %ecx,%eax + f52: 31 d2 xor %edx,%edx + f54: 89 cf mov %ecx,%edi + f56: f7 75 c4 divl -0x3c(%ebp) + f59: 0f b6 92 40 14 00 00 movzbl 0x1440(%edx),%edx + f60: 89 45 c0 mov %eax,-0x40(%ebp) + f63: 89 d8 mov %ebx,%eax + f65: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + f68: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + f6b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + f6e: 39 7d c4 cmp %edi,-0x3c(%ebp) + f71: 76 dd jbe f50 + if (neg) { + f73: 8b 4d bc mov -0x44(%ebp),%ecx + f76: 85 c9 test %ecx,%ecx + f78: 74 0c je f86 + buf[i++] = '-'; + f7a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + f7f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + f81: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + f86: 8b 7d b8 mov -0x48(%ebp),%edi + f89: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + f8d: eb 07 jmp f96 + f8f: 90 nop + putc(fd, buf[i]); + f90: 0f b6 13 movzbl (%ebx),%edx + f93: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + f96: 83 ec 04 sub $0x4,%esp + f99: 88 55 d7 mov %dl,-0x29(%ebp) + f9c: 6a 01 push $0x1 + f9e: 56 push %esi + f9f: 57 push %edi + fa0: e8 1e ff ff ff call ec3 + while (--i >= 0) { + fa5: 83 c4 10 add $0x10,%esp + fa8: 39 de cmp %ebx,%esi + faa: 75 e4 jne f90 + } +} + fac: 8d 65 f4 lea -0xc(%ebp),%esp + faf: 5b pop %ebx + fb0: 5e pop %esi + fb1: 5f pop %edi + fb2: 5d pop %ebp + fb3: c3 ret + fb4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + fb8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + fbf: eb 87 jmp f48 + fc1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fc8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fcf: 90 nop + +00000fd0 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + fd0: 55 push %ebp + fd1: 89 e5 mov %esp,%ebp + fd3: 57 push %edi + fd4: 56 push %esi + fd5: 53 push %ebx + fd6: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + fd9: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + fdc: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + fdf: 0f b6 13 movzbl (%ebx),%edx + fe2: 84 d2 test %dl,%dl + fe4: 74 6a je 1050 + ap = (uint*)(void*)&fmt + 1; + fe6: 8d 45 10 lea 0x10(%ebp),%eax + fe9: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + fec: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + fef: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + ff1: 89 45 d0 mov %eax,-0x30(%ebp) + ff4: eb 36 jmp 102c + ff6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ffd: 8d 76 00 lea 0x0(%esi),%esi + 1000: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 1003: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 1008: 83 f8 25 cmp $0x25,%eax + 100b: 74 15 je 1022 + write(fd, &c, 1); + 100d: 83 ec 04 sub $0x4,%esp + 1010: 88 55 e7 mov %dl,-0x19(%ebp) + 1013: 6a 01 push $0x1 + 1015: 57 push %edi + 1016: 56 push %esi + 1017: e8 a7 fe ff ff call ec3 + 101c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 101f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 1022: 0f b6 13 movzbl (%ebx),%edx + 1025: 83 c3 01 add $0x1,%ebx + 1028: 84 d2 test %dl,%dl + 102a: 74 24 je 1050 + c = fmt[i] & 0xff; + 102c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 102f: 85 c9 test %ecx,%ecx + 1031: 74 cd je 1000 + } + } + else if (state == '%') { + 1033: 83 f9 25 cmp $0x25,%ecx + 1036: 75 ea jne 1022 + if (c == 'd') { + 1038: 83 f8 25 cmp $0x25,%eax + 103b: 0f 84 07 01 00 00 je 1148 + 1041: 83 e8 63 sub $0x63,%eax + 1044: 83 f8 15 cmp $0x15,%eax + 1047: 77 17 ja 1060 + 1049: ff 24 85 e8 13 00 00 jmp *0x13e8(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 1050: 8d 65 f4 lea -0xc(%ebp),%esp + 1053: 5b pop %ebx + 1054: 5e pop %esi + 1055: 5f pop %edi + 1056: 5d pop %ebp + 1057: c3 ret + 1058: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 105f: 90 nop + write(fd, &c, 1); + 1060: 83 ec 04 sub $0x4,%esp + 1063: 88 55 d4 mov %dl,-0x2c(%ebp) + 1066: 6a 01 push $0x1 + 1068: 57 push %edi + 1069: 56 push %esi + 106a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 106e: e8 50 fe ff ff call ec3 + putc(fd, c); + 1073: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 1077: 83 c4 0c add $0xc,%esp + 107a: 88 55 e7 mov %dl,-0x19(%ebp) + 107d: 6a 01 push $0x1 + 107f: 57 push %edi + 1080: 56 push %esi + 1081: e8 3d fe ff ff call ec3 + putc(fd, c); + 1086: 83 c4 10 add $0x10,%esp + state = 0; + 1089: 31 c9 xor %ecx,%ecx + 108b: eb 95 jmp 1022 + 108d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 1090: 83 ec 0c sub $0xc,%esp + 1093: b9 10 00 00 00 mov $0x10,%ecx + 1098: 6a 00 push $0x0 + 109a: 8b 45 d0 mov -0x30(%ebp),%eax + 109d: 8b 10 mov (%eax),%edx + 109f: 89 f0 mov %esi,%eax + 10a1: e8 7a fe ff ff call f20 + ap++; + 10a6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 10aa: 83 c4 10 add $0x10,%esp + state = 0; + 10ad: 31 c9 xor %ecx,%ecx + 10af: e9 6e ff ff ff jmp 1022 + 10b4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 10b8: 8b 45 d0 mov -0x30(%ebp),%eax + 10bb: 8b 10 mov (%eax),%edx + ap++; + 10bd: 83 c0 04 add $0x4,%eax + 10c0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 10c3: 85 d2 test %edx,%edx + 10c5: 0f 84 8d 00 00 00 je 1158 + while (*s != 0) { + 10cb: 0f b6 02 movzbl (%edx),%eax + state = 0; + 10ce: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 10d0: 84 c0 test %al,%al + 10d2: 0f 84 4a ff ff ff je 1022 + 10d8: 89 5d d4 mov %ebx,-0x2c(%ebp) + 10db: 89 d3 mov %edx,%ebx + 10dd: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 10e0: 83 ec 04 sub $0x4,%esp + s++; + 10e3: 83 c3 01 add $0x1,%ebx + 10e6: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 10e9: 6a 01 push $0x1 + 10eb: 57 push %edi + 10ec: 56 push %esi + 10ed: e8 d1 fd ff ff call ec3 + while (*s != 0) { + 10f2: 0f b6 03 movzbl (%ebx),%eax + 10f5: 83 c4 10 add $0x10,%esp + 10f8: 84 c0 test %al,%al + 10fa: 75 e4 jne 10e0 + state = 0; + 10fc: 8b 5d d4 mov -0x2c(%ebp),%ebx + 10ff: 31 c9 xor %ecx,%ecx + 1101: e9 1c ff ff ff jmp 1022 + 1106: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 110d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 1110: 83 ec 0c sub $0xc,%esp + 1113: b9 0a 00 00 00 mov $0xa,%ecx + 1118: 6a 01 push $0x1 + 111a: e9 7b ff ff ff jmp 109a + 111f: 90 nop + putc(fd, *ap); + 1120: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 1123: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 1126: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 1128: 6a 01 push $0x1 + 112a: 57 push %edi + 112b: 56 push %esi + putc(fd, *ap); + 112c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 112f: e8 8f fd ff ff call ec3 + ap++; + 1134: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 1138: 83 c4 10 add $0x10,%esp + state = 0; + 113b: 31 c9 xor %ecx,%ecx + 113d: e9 e0 fe ff ff jmp 1022 + 1142: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 1148: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 114b: 83 ec 04 sub $0x4,%esp + 114e: e9 2a ff ff ff jmp 107d + 1153: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1157: 90 nop + s = "(null)"; + 1158: ba e0 13 00 00 mov $0x13e0,%edx + while (*s != 0) { + 115d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 1160: b8 28 00 00 00 mov $0x28,%eax + 1165: 89 d3 mov %edx,%ebx + 1167: e9 74 ff ff ff jmp 10e0 + 116c: 66 90 xchg %ax,%ax + 116e: 66 90 xchg %ax,%ax + +00001170 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 1170: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 1171: a1 a4 1a 00 00 mov 0x1aa4,%eax +void free(void *ap) { + 1176: 89 e5 mov %esp,%ebp + 1178: 57 push %edi + 1179: 56 push %esi + 117a: 53 push %ebx + 117b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 117e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 1181: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1188: 89 c2 mov %eax,%edx + 118a: 8b 00 mov (%eax),%eax + 118c: 39 ca cmp %ecx,%edx + 118e: 73 30 jae 11c0 + 1190: 39 c1 cmp %eax,%ecx + 1192: 72 04 jb 1198 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 1194: 39 c2 cmp %eax,%edx + 1196: 72 f0 jb 1188 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 1198: 8b 73 fc mov -0x4(%ebx),%esi + 119b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 119e: 39 f8 cmp %edi,%eax + 11a0: 74 30 je 11d2 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 11a2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 11a5: 8b 42 04 mov 0x4(%edx),%eax + 11a8: 8d 34 c2 lea (%edx,%eax,8),%esi + 11ab: 39 f1 cmp %esi,%ecx + 11ad: 74 3a je 11e9 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 11af: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 11b1: 5b pop %ebx + freep = p; + 11b2: 89 15 a4 1a 00 00 mov %edx,0x1aa4 +} + 11b8: 5e pop %esi + 11b9: 5f pop %edi + 11ba: 5d pop %ebp + 11bb: c3 ret + 11bc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 11c0: 39 c2 cmp %eax,%edx + 11c2: 72 c4 jb 1188 + 11c4: 39 c1 cmp %eax,%ecx + 11c6: 73 c0 jae 1188 + if (bp + bp->s.size == p->s.ptr) { + 11c8: 8b 73 fc mov -0x4(%ebx),%esi + 11cb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 11ce: 39 f8 cmp %edi,%eax + 11d0: 75 d0 jne 11a2 + bp->s.size += p->s.ptr->s.size; + 11d2: 03 70 04 add 0x4(%eax),%esi + 11d5: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 11d8: 8b 02 mov (%edx),%eax + 11da: 8b 00 mov (%eax),%eax + 11dc: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 11df: 8b 42 04 mov 0x4(%edx),%eax + 11e2: 8d 34 c2 lea (%edx,%eax,8),%esi + 11e5: 39 f1 cmp %esi,%ecx + 11e7: 75 c6 jne 11af + p->s.size += bp->s.size; + 11e9: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 11ec: 89 15 a4 1a 00 00 mov %edx,0x1aa4 + p->s.size += bp->s.size; + 11f2: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 11f5: 8b 4b f8 mov -0x8(%ebx),%ecx + 11f8: 89 0a mov %ecx,(%edx) +} + 11fa: 5b pop %ebx + 11fb: 5e pop %esi + 11fc: 5f pop %edi + 11fd: 5d pop %ebp + 11fe: c3 ret + 11ff: 90 nop + +00001200 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 1200: 55 push %ebp + 1201: 89 e5 mov %esp,%ebp + 1203: 57 push %edi + 1204: 56 push %esi + 1205: 53 push %ebx + 1206: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 1209: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 120c: 8b 3d a4 1a 00 00 mov 0x1aa4,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 1212: 8d 70 07 lea 0x7(%eax),%esi + 1215: c1 ee 03 shr $0x3,%esi + 1218: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 121b: 85 ff test %edi,%edi + 121d: 0f 84 9d 00 00 00 je 12c0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 1223: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 1225: 8b 4a 04 mov 0x4(%edx),%ecx + 1228: 39 f1 cmp %esi,%ecx + 122a: 73 6a jae 1296 + 122c: bb 00 10 00 00 mov $0x1000,%ebx + 1231: 39 de cmp %ebx,%esi + 1233: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 1236: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 123d: 89 45 e4 mov %eax,-0x1c(%ebp) + 1240: eb 17 jmp 1259 + 1242: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 1248: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 124a: 8b 48 04 mov 0x4(%eax),%ecx + 124d: 39 f1 cmp %esi,%ecx + 124f: 73 4f jae 12a0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 1251: 8b 3d a4 1a 00 00 mov 0x1aa4,%edi + 1257: 89 c2 mov %eax,%edx + 1259: 39 d7 cmp %edx,%edi + 125b: 75 eb jne 1248 + p = sbrk(nu * sizeof(Header)); + 125d: 83 ec 0c sub $0xc,%esp + 1260: ff 75 e4 push -0x1c(%ebp) + 1263: e8 3b fc ff ff call ea3 + if (p == (char*)-1) { + 1268: 83 c4 10 add $0x10,%esp + 126b: 83 f8 ff cmp $0xffffffff,%eax + 126e: 74 1c je 128c + hp->s.size = nu; + 1270: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 1273: 83 ec 0c sub $0xc,%esp + 1276: 83 c0 08 add $0x8,%eax + 1279: 50 push %eax + 127a: e8 f1 fe ff ff call 1170 + return freep; + 127f: 8b 15 a4 1a 00 00 mov 0x1aa4,%edx + if ((p = morecore(nunits)) == 0) { + 1285: 83 c4 10 add $0x10,%esp + 1288: 85 d2 test %edx,%edx + 128a: 75 bc jne 1248 + return 0; + } + } + } +} + 128c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 128f: 31 c0 xor %eax,%eax +} + 1291: 5b pop %ebx + 1292: 5e pop %esi + 1293: 5f pop %edi + 1294: 5d pop %ebp + 1295: c3 ret + if (p->s.size >= nunits) { + 1296: 89 d0 mov %edx,%eax + 1298: 89 fa mov %edi,%edx + 129a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 12a0: 39 ce cmp %ecx,%esi + 12a2: 74 4c je 12f0 + p->s.size -= nunits; + 12a4: 29 f1 sub %esi,%ecx + 12a6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 12a9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 12ac: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 12af: 89 15 a4 1a 00 00 mov %edx,0x1aa4 +} + 12b5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 12b8: 83 c0 08 add $0x8,%eax +} + 12bb: 5b pop %ebx + 12bc: 5e pop %esi + 12bd: 5f pop %edi + 12be: 5d pop %ebp + 12bf: c3 ret + base.s.ptr = freep = prevp = &base; + 12c0: c7 05 a4 1a 00 00 a8 movl $0x1aa8,0x1aa4 + 12c7: 1a 00 00 + base.s.size = 0; + 12ca: bf a8 1a 00 00 mov $0x1aa8,%edi + base.s.ptr = freep = prevp = &base; + 12cf: c7 05 a8 1a 00 00 a8 movl $0x1aa8,0x1aa8 + 12d6: 1a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 12d9: 89 fa mov %edi,%edx + base.s.size = 0; + 12db: c7 05 ac 1a 00 00 00 movl $0x0,0x1aac + 12e2: 00 00 00 + if (p->s.size >= nunits) { + 12e5: e9 42 ff ff ff jmp 122c + 12ea: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 12f0: 8b 08 mov (%eax),%ecx + 12f2: 89 0a mov %ecx,(%edx) + 12f4: eb b9 jmp 12af diff --git a/sh.d b/sh.d new file mode 100644 index 0000000..51ddf2d --- /dev/null +++ b/sh.d @@ -0,0 +1 @@ +sh.o: sh.c /usr/include/stdc-predef.h types.h user.h fcntl.h diff --git a/sh.o b/sh.o new file mode 100644 index 0000000000000000000000000000000000000000..53f6979b45a0a735acef19186a1b7966a67d5e29 GIT binary patch literal 23344 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 literal 0 HcmV?d00001 diff --git a/sh.sym b/sh.sym new file mode 100644 index 0000000..01e9c45 --- /dev/null +++ b/sh.sym @@ -0,0 +1,71 @@ +00000000 sh.c +00001a40 buf.0 +00000000 ulib.c +00000000 printf.c +00000f20 printint +00001440 digits.0 +00000000 umalloc.c +00001aa4 freep +00001aa8 base +00000c00 strcpy +00000fd0 printf +00000efb greeting +00000e20 memmove +00000ecb mknod +00000370 execcmd +00000d20 gets +00000e9b getpid +000008e0 parsepipe +00000b90 parsecmd +00000470 backcmd +00000600 peek +00000f0b screen +00000680 parseredirs +000004a0 gettoken +00001200 malloc +00000eab sleep +00001a1c whitespace +000001c0 fork1 +00000ae0 nulterminate +00000e63 pipe +00000ef3 getch +00000160 getcmd +00000ec3 write +00000e83 fstat +00000e73 kill +00000e8b chdir +00000970 parseline +000001e0 runcmd +00000a50 parseblock +00000e7b exec +00000e5b wait +00001a14 symbols +00000e6b read +000007c0 parseexec +00000ed3 unlink +000001a0 panic +00000e4b fork +00000ea3 sbrk +00000eb3 uptime +00001a22 __bss_start +00000cc0 memset +00000000 main +00000c30 strcmp +00000f03 shutdown +00000e93 dup +000003f0 pipecmd +000003a0 redircmd +00000d90 stat +00001a22 _edata +00001ab0 _end +00000edb link +00000e53 exit +00000de0 atoi +00000f13 cls +00000c90 strlen +00000ebb open +00000ce0 strchr +00000ee3 mkdir +00000eeb close +00000430 listcmd +00001170 free diff --git a/shutdown.asm b/shutdown.asm new file mode 100644 index 0000000..89620a6 --- /dev/null +++ b/shutdown.asm @@ -0,0 +1,1210 @@ + +_shutdown: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "types.h" +#include "user.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: 53 push %ebx + 10: 51 push %ecx + 11: 83 ec 18 sub $0x18,%esp + 14: 8b 01 mov (%ecx),%eax + 16: 8b 71 04 mov 0x4(%ecx),%esi + 19: 89 45 e4 mov %eax,-0x1c(%ebp) + int restart = 0; + + for (int i = 1; i < argc; i++) { + 1c: 83 f8 01 cmp $0x1,%eax + 1f: 7e 58 jle 79 + 21: bb 01 00 00 00 mov $0x1,%ebx + int restart = 0; + 26: 31 ff xor %edi,%edi + 28: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2f: 90 nop + if (strcmp(argv[i], "-r") == 0) { + 30: 83 ec 08 sub $0x8,%esp + 33: 68 88 07 00 00 push $0x788 + 38: ff 34 9e push (%esi,%ebx,4) + 3b: e8 80 00 00 00 call c0 + 40: 83 c4 10 add $0x10,%esp + restart = 1; + 43: 85 c0 test %eax,%eax + 45: b8 01 00 00 00 mov $0x1,%eax + 4a: 0f 44 f8 cmove %eax,%edi + for (int i = 1; i < argc; i++) { + 4d: 83 c3 01 add $0x1,%ebx + 50: 39 5d e4 cmp %ebx,-0x1c(%ebp) + 53: 75 db jne 30 + } + } + + switch(restart) { + 55: 83 ff 01 cmp $0x1,%edi + 58: 75 1f jne 79 + case 0: + printf(1, "Shutting Down...\n"); + break; + case 1: + printf(1, "Restarting...\n"); + 5a: 50 push %eax + 5b: 50 push %eax + 5c: 68 9d 07 00 00 push $0x79d + 61: 6a 01 push $0x1 + 63: e8 f8 03 00 00 call 460 + break; + 68: 83 c4 10 add $0x10,%esp + } + + shutdown(restart); + 6b: 83 ec 0c sub $0xc,%esp + 6e: 57 push %edi + 6f: e8 1f 03 00 00 call 393 + exit(); + 74: e8 6a 02 00 00 call 2e3 + printf(1, "Shutting Down...\n"); + 79: 52 push %edx + break; + 7a: 31 ff xor %edi,%edi + printf(1, "Shutting Down...\n"); + 7c: 52 push %edx + 7d: 68 8b 07 00 00 push $0x78b + 82: 6a 01 push $0x1 + 84: e8 d7 03 00 00 call 460 + break; + 89: 83 c4 10 add $0x10,%esp + 8c: eb dd jmp 6b + 8e: 66 90 xchg %ax,%ax + +00000090 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 90: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 91: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 93: 89 e5 mov %esp,%ebp + 95: 53 push %ebx + 96: 8b 4d 08 mov 0x8(%ebp),%ecx + 99: 8b 5d 0c mov 0xc(%ebp),%ebx + 9c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + a0: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + a4: 88 14 01 mov %dl,(%ecx,%eax,1) + a7: 83 c0 01 add $0x1,%eax + aa: 84 d2 test %dl,%dl + ac: 75 f2 jne a0 + ; + } + return os; +} + ae: 8b 5d fc mov -0x4(%ebp),%ebx + b1: 89 c8 mov %ecx,%eax + b3: c9 leave + b4: c3 ret + b5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + bc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000000c0 : + +int strcmp(const char *p, const char *q) { + c0: 55 push %ebp + c1: 89 e5 mov %esp,%ebp + c3: 53 push %ebx + c4: 8b 55 08 mov 0x8(%ebp),%edx + c7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + ca: 0f b6 02 movzbl (%edx),%eax + cd: 84 c0 test %al,%al + cf: 75 17 jne e8 + d1: eb 3a jmp 10d + d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + d7: 90 nop + d8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + dc: 83 c2 01 add $0x1,%edx + df: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + e2: 84 c0 test %al,%al + e4: 74 1a je 100 + p++, q++; + e6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + e8: 0f b6 19 movzbl (%ecx),%ebx + eb: 38 c3 cmp %al,%bl + ed: 74 e9 je d8 + } + return (uchar) * p - (uchar) * q; + ef: 29 d8 sub %ebx,%eax +} + f1: 8b 5d fc mov -0x4(%ebp),%ebx + f4: c9 leave + f5: c3 ret + f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + fd: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 100: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 104: 31 c0 xor %eax,%eax + 106: 29 d8 sub %ebx,%eax +} + 108: 8b 5d fc mov -0x4(%ebp),%ebx + 10b: c9 leave + 10c: c3 ret + return (uchar) * p - (uchar) * q; + 10d: 0f b6 19 movzbl (%ecx),%ebx + 110: 31 c0 xor %eax,%eax + 112: eb db jmp ef + 114: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 11b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 11f: 90 nop + +00000120 : + +uint strlen(const char *s) { + 120: 55 push %ebp + 121: 89 e5 mov %esp,%ebp + 123: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 126: 80 3a 00 cmpb $0x0,(%edx) + 129: 74 15 je 140 + 12b: 31 c0 xor %eax,%eax + 12d: 8d 76 00 lea 0x0(%esi),%esi + 130: 83 c0 01 add $0x1,%eax + 133: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 137: 89 c1 mov %eax,%ecx + 139: 75 f5 jne 130 + ; + } + return n; +} + 13b: 89 c8 mov %ecx,%eax + 13d: 5d pop %ebp + 13e: c3 ret + 13f: 90 nop + for (n = 0; s[n]; n++) { + 140: 31 c9 xor %ecx,%ecx +} + 142: 5d pop %ebp + 143: 89 c8 mov %ecx,%eax + 145: c3 ret + 146: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 14d: 8d 76 00 lea 0x0(%esi),%esi + +00000150 : + +void* memset(void *dst, int c, uint n) { + 150: 55 push %ebp + 151: 89 e5 mov %esp,%ebp + 153: 57 push %edi + 154: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 157: 8b 4d 10 mov 0x10(%ebp),%ecx + 15a: 8b 45 0c mov 0xc(%ebp),%eax + 15d: 89 d7 mov %edx,%edi + 15f: fc cld + 160: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 162: 8b 7d fc mov -0x4(%ebp),%edi + 165: 89 d0 mov %edx,%eax + 167: c9 leave + 168: c3 ret + 169: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000170 : + +char* strchr(const char *s, char c) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 8b 45 08 mov 0x8(%ebp),%eax + 176: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 17a: 0f b6 10 movzbl (%eax),%edx + 17d: 84 d2 test %dl,%dl + 17f: 75 12 jne 193 + 181: eb 1d jmp 1a0 + 183: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 187: 90 nop + 188: 0f b6 50 01 movzbl 0x1(%eax),%edx + 18c: 83 c0 01 add $0x1,%eax + 18f: 84 d2 test %dl,%dl + 191: 74 0d je 1a0 + if (*s == c) { + 193: 38 d1 cmp %dl,%cl + 195: 75 f1 jne 188 + return (char*)s; + } + } + return 0; +} + 197: 5d pop %ebp + 198: c3 ret + 199: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 1a0: 31 c0 xor %eax,%eax +} + 1a2: 5d pop %ebp + 1a3: c3 ret + 1a4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ab: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1af: 90 nop + +000001b0 : + +char* gets(char *buf, int max) { + 1b0: 55 push %ebp + 1b1: 89 e5 mov %esp,%ebp + 1b3: 57 push %edi + 1b4: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 1b5: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 1b8: 53 push %ebx + for (i = 0; i + 1 < max;) { + 1b9: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 1bb: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 1be: eb 27 jmp 1e7 + cc = read(0, &c, 1); + 1c0: 83 ec 04 sub $0x4,%esp + 1c3: 6a 01 push $0x1 + 1c5: 57 push %edi + 1c6: 6a 00 push $0x0 + 1c8: e8 2e 01 00 00 call 2fb + if (cc < 1) { + 1cd: 83 c4 10 add $0x10,%esp + 1d0: 85 c0 test %eax,%eax + 1d2: 7e 1d jle 1f1 + break; + } + buf[i++] = c; + 1d4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 1d8: 8b 55 08 mov 0x8(%ebp),%edx + 1db: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 1df: 3c 0a cmp $0xa,%al + 1e1: 74 1d je 200 + 1e3: 3c 0d cmp $0xd,%al + 1e5: 74 19 je 200 + for (i = 0; i + 1 < max;) { + 1e7: 89 de mov %ebx,%esi + 1e9: 83 c3 01 add $0x1,%ebx + 1ec: 3b 5d 0c cmp 0xc(%ebp),%ebx + 1ef: 7c cf jl 1c0 + break; + } + } + buf[i] = '\0'; + 1f1: 8b 45 08 mov 0x8(%ebp),%eax + 1f4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 1f8: 8d 65 f4 lea -0xc(%ebp),%esp + 1fb: 5b pop %ebx + 1fc: 5e pop %esi + 1fd: 5f pop %edi + 1fe: 5d pop %ebp + 1ff: c3 ret + buf[i] = '\0'; + 200: 8b 45 08 mov 0x8(%ebp),%eax + 203: 89 de mov %ebx,%esi + 205: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 209: 8d 65 f4 lea -0xc(%ebp),%esp + 20c: 5b pop %ebx + 20d: 5e pop %esi + 20e: 5f pop %edi + 20f: 5d pop %ebp + 210: c3 ret + 211: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 218: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 21f: 90 nop + +00000220 : + +int stat(const char *n, struct stat *st) { + 220: 55 push %ebp + 221: 89 e5 mov %esp,%ebp + 223: 56 push %esi + 224: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 225: 83 ec 08 sub $0x8,%esp + 228: 6a 00 push $0x0 + 22a: ff 75 08 push 0x8(%ebp) + 22d: e8 19 01 00 00 call 34b + if (fd < 0) { + 232: 83 c4 10 add $0x10,%esp + 235: 85 c0 test %eax,%eax + 237: 78 27 js 260 + return -1; + } + r = fstat(fd, st); + 239: 83 ec 08 sub $0x8,%esp + 23c: ff 75 0c push 0xc(%ebp) + 23f: 89 c3 mov %eax,%ebx + 241: 50 push %eax + 242: e8 cc 00 00 00 call 313 + close(fd); + 247: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 24a: 89 c6 mov %eax,%esi + close(fd); + 24c: e8 2a 01 00 00 call 37b + return r; + 251: 83 c4 10 add $0x10,%esp +} + 254: 8d 65 f8 lea -0x8(%ebp),%esp + 257: 89 f0 mov %esi,%eax + 259: 5b pop %ebx + 25a: 5e pop %esi + 25b: 5d pop %ebp + 25c: c3 ret + 25d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 260: be ff ff ff ff mov $0xffffffff,%esi + 265: eb ed jmp 254 + 267: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26e: 66 90 xchg %ax,%ax + +00000270 : + +int atoi(const char *s) { + 270: 55 push %ebp + 271: 89 e5 mov %esp,%ebp + 273: 53 push %ebx + 274: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 277: 0f be 02 movsbl (%edx),%eax + 27a: 8d 48 d0 lea -0x30(%eax),%ecx + 27d: 80 f9 09 cmp $0x9,%cl + n = 0; + 280: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 285: 77 1e ja 2a5 + 287: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 28e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 290: 83 c2 01 add $0x1,%edx + 293: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 296: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 29a: 0f be 02 movsbl (%edx),%eax + 29d: 8d 58 d0 lea -0x30(%eax),%ebx + 2a0: 80 fb 09 cmp $0x9,%bl + 2a3: 76 eb jbe 290 + } + return n; +} + 2a5: 8b 5d fc mov -0x4(%ebp),%ebx + 2a8: 89 c8 mov %ecx,%eax + 2aa: c9 leave + 2ab: c3 ret + 2ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000002b0 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 2b0: 55 push %ebp + 2b1: 89 e5 mov %esp,%ebp + 2b3: 57 push %edi + 2b4: 8b 45 10 mov 0x10(%ebp),%eax + 2b7: 8b 55 08 mov 0x8(%ebp),%edx + 2ba: 56 push %esi + 2bb: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 2be: 85 c0 test %eax,%eax + 2c0: 7e 13 jle 2d5 + 2c2: 01 d0 add %edx,%eax + dst = vdst; + 2c4: 89 d7 mov %edx,%edi + 2c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2cd: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 2d0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 2d1: 39 f8 cmp %edi,%eax + 2d3: 75 fb jne 2d0 + } + return vdst; +} + 2d5: 5e pop %esi + 2d6: 89 d0 mov %edx,%eax + 2d8: 5f pop %edi + 2d9: 5d pop %ebp + 2da: c3 ret + +000002db : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 2db: b8 01 00 00 00 mov $0x1,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(exit) + 2e3: b8 02 00 00 00 mov $0x2,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(wait) + 2eb: b8 03 00 00 00 mov $0x3,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(pipe) + 2f3: b8 04 00 00 00 mov $0x4,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(read) + 2fb: b8 05 00 00 00 mov $0x5,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(kill) + 303: b8 06 00 00 00 mov $0x6,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(exec) + 30b: b8 07 00 00 00 mov $0x7,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(fstat) + 313: b8 08 00 00 00 mov $0x8,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(chdir) + 31b: b8 09 00 00 00 mov $0x9,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(dup) + 323: b8 0a 00 00 00 mov $0xa,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(getpid) + 32b: b8 0b 00 00 00 mov $0xb,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(sbrk) + 333: b8 0c 00 00 00 mov $0xc,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(sleep) + 33b: b8 0d 00 00 00 mov $0xd,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(uptime) + 343: b8 0e 00 00 00 mov $0xe,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + +0000034b : +SYSCALL(open) + 34b: b8 0f 00 00 00 mov $0xf,%eax + 350: cd 40 int $0x40 + 352: c3 ret + +00000353 : +SYSCALL(write) + 353: b8 10 00 00 00 mov $0x10,%eax + 358: cd 40 int $0x40 + 35a: c3 ret + +0000035b : +SYSCALL(mknod) + 35b: b8 11 00 00 00 mov $0x11,%eax + 360: cd 40 int $0x40 + 362: c3 ret + +00000363 : +SYSCALL(unlink) + 363: b8 12 00 00 00 mov $0x12,%eax + 368: cd 40 int $0x40 + 36a: c3 ret + +0000036b : +SYSCALL(link) + 36b: b8 13 00 00 00 mov $0x13,%eax + 370: cd 40 int $0x40 + 372: c3 ret + +00000373 : +SYSCALL(mkdir) + 373: b8 14 00 00 00 mov $0x14,%eax + 378: cd 40 int $0x40 + 37a: c3 ret + +0000037b : +SYSCALL(close) + 37b: b8 15 00 00 00 mov $0x15,%eax + 380: cd 40 int $0x40 + 382: c3 ret + +00000383 : +SYSCALL(getch) + 383: b8 16 00 00 00 mov $0x16,%eax + 388: cd 40 int $0x40 + 38a: c3 ret + +0000038b : +SYSCALL(greeting) + 38b: b8 17 00 00 00 mov $0x17,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(shutdown) + 393: b8 18 00 00 00 mov $0x18,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(screen) + 39b: b8 19 00 00 00 mov $0x19,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(cls) + 3a3: b8 1a 00 00 00 mov $0x1a,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + 3ab: 66 90 xchg %ax,%ax + 3ad: 66 90 xchg %ax,%ax + 3af: 90 nop + +000003b0 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 3b0: 55 push %ebp + 3b1: 89 e5 mov %esp,%ebp + 3b3: 57 push %edi + 3b4: 56 push %esi + 3b5: 53 push %ebx + 3b6: 83 ec 3c sub $0x3c,%esp + 3b9: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 3bc: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 3be: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 3c1: 85 d2 test %edx,%edx + 3c3: 0f 89 7f 00 00 00 jns 448 + 3c9: f6 45 08 01 testb $0x1,0x8(%ebp) + 3cd: 74 79 je 448 + neg = 1; + 3cf: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 3d6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 3d8: 31 db xor %ebx,%ebx + 3da: 8d 75 d7 lea -0x29(%ebp),%esi + 3dd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 3e0: 89 c8 mov %ecx,%eax + 3e2: 31 d2 xor %edx,%edx + 3e4: 89 cf mov %ecx,%edi + 3e6: f7 75 c4 divl -0x3c(%ebp) + 3e9: 0f b6 92 0c 08 00 00 movzbl 0x80c(%edx),%edx + 3f0: 89 45 c0 mov %eax,-0x40(%ebp) + 3f3: 89 d8 mov %ebx,%eax + 3f5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 3f8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 3fb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 3fe: 39 7d c4 cmp %edi,-0x3c(%ebp) + 401: 76 dd jbe 3e0 + if (neg) { + 403: 8b 4d bc mov -0x44(%ebp),%ecx + 406: 85 c9 test %ecx,%ecx + 408: 74 0c je 416 + buf[i++] = '-'; + 40a: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 40f: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 411: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 416: 8b 7d b8 mov -0x48(%ebp),%edi + 419: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 41d: eb 07 jmp 426 + 41f: 90 nop + putc(fd, buf[i]); + 420: 0f b6 13 movzbl (%ebx),%edx + 423: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 426: 83 ec 04 sub $0x4,%esp + 429: 88 55 d7 mov %dl,-0x29(%ebp) + 42c: 6a 01 push $0x1 + 42e: 56 push %esi + 42f: 57 push %edi + 430: e8 1e ff ff ff call 353 + while (--i >= 0) { + 435: 83 c4 10 add $0x10,%esp + 438: 39 de cmp %ebx,%esi + 43a: 75 e4 jne 420 + } +} + 43c: 8d 65 f4 lea -0xc(%ebp),%esp + 43f: 5b pop %ebx + 440: 5e pop %esi + 441: 5f pop %edi + 442: 5d pop %ebp + 443: c3 ret + 444: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 448: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 44f: eb 87 jmp 3d8 + 451: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 458: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 45f: 90 nop + +00000460 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 460: 55 push %ebp + 461: 89 e5 mov %esp,%ebp + 463: 57 push %edi + 464: 56 push %esi + 465: 53 push %ebx + 466: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 469: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 46c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 46f: 0f b6 13 movzbl (%ebx),%edx + 472: 84 d2 test %dl,%dl + 474: 74 6a je 4e0 + ap = (uint*)(void*)&fmt + 1; + 476: 8d 45 10 lea 0x10(%ebp),%eax + 479: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 47c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 47f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 481: 89 45 d0 mov %eax,-0x30(%ebp) + 484: eb 36 jmp 4bc + 486: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 48d: 8d 76 00 lea 0x0(%esi),%esi + 490: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 493: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 498: 83 f8 25 cmp $0x25,%eax + 49b: 74 15 je 4b2 + write(fd, &c, 1); + 49d: 83 ec 04 sub $0x4,%esp + 4a0: 88 55 e7 mov %dl,-0x19(%ebp) + 4a3: 6a 01 push $0x1 + 4a5: 57 push %edi + 4a6: 56 push %esi + 4a7: e8 a7 fe ff ff call 353 + 4ac: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 4af: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 4b2: 0f b6 13 movzbl (%ebx),%edx + 4b5: 83 c3 01 add $0x1,%ebx + 4b8: 84 d2 test %dl,%dl + 4ba: 74 24 je 4e0 + c = fmt[i] & 0xff; + 4bc: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 4bf: 85 c9 test %ecx,%ecx + 4c1: 74 cd je 490 + } + } + else if (state == '%') { + 4c3: 83 f9 25 cmp $0x25,%ecx + 4c6: 75 ea jne 4b2 + if (c == 'd') { + 4c8: 83 f8 25 cmp $0x25,%eax + 4cb: 0f 84 07 01 00 00 je 5d8 + 4d1: 83 e8 63 sub $0x63,%eax + 4d4: 83 f8 15 cmp $0x15,%eax + 4d7: 77 17 ja 4f0 + 4d9: ff 24 85 b4 07 00 00 jmp *0x7b4(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 4e0: 8d 65 f4 lea -0xc(%ebp),%esp + 4e3: 5b pop %ebx + 4e4: 5e pop %esi + 4e5: 5f pop %edi + 4e6: 5d pop %ebp + 4e7: c3 ret + 4e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 4ef: 90 nop + write(fd, &c, 1); + 4f0: 83 ec 04 sub $0x4,%esp + 4f3: 88 55 d4 mov %dl,-0x2c(%ebp) + 4f6: 6a 01 push $0x1 + 4f8: 57 push %edi + 4f9: 56 push %esi + 4fa: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 4fe: e8 50 fe ff ff call 353 + putc(fd, c); + 503: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 507: 83 c4 0c add $0xc,%esp + 50a: 88 55 e7 mov %dl,-0x19(%ebp) + 50d: 6a 01 push $0x1 + 50f: 57 push %edi + 510: 56 push %esi + 511: e8 3d fe ff ff call 353 + putc(fd, c); + 516: 83 c4 10 add $0x10,%esp + state = 0; + 519: 31 c9 xor %ecx,%ecx + 51b: eb 95 jmp 4b2 + 51d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 520: 83 ec 0c sub $0xc,%esp + 523: b9 10 00 00 00 mov $0x10,%ecx + 528: 6a 00 push $0x0 + 52a: 8b 45 d0 mov -0x30(%ebp),%eax + 52d: 8b 10 mov (%eax),%edx + 52f: 89 f0 mov %esi,%eax + 531: e8 7a fe ff ff call 3b0 + ap++; + 536: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 53a: 83 c4 10 add $0x10,%esp + state = 0; + 53d: 31 c9 xor %ecx,%ecx + 53f: e9 6e ff ff ff jmp 4b2 + 544: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 548: 8b 45 d0 mov -0x30(%ebp),%eax + 54b: 8b 10 mov (%eax),%edx + ap++; + 54d: 83 c0 04 add $0x4,%eax + 550: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 553: 85 d2 test %edx,%edx + 555: 0f 84 8d 00 00 00 je 5e8 + while (*s != 0) { + 55b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 55e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 560: 84 c0 test %al,%al + 562: 0f 84 4a ff ff ff je 4b2 + 568: 89 5d d4 mov %ebx,-0x2c(%ebp) + 56b: 89 d3 mov %edx,%ebx + 56d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 570: 83 ec 04 sub $0x4,%esp + s++; + 573: 83 c3 01 add $0x1,%ebx + 576: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 579: 6a 01 push $0x1 + 57b: 57 push %edi + 57c: 56 push %esi + 57d: e8 d1 fd ff ff call 353 + while (*s != 0) { + 582: 0f b6 03 movzbl (%ebx),%eax + 585: 83 c4 10 add $0x10,%esp + 588: 84 c0 test %al,%al + 58a: 75 e4 jne 570 + state = 0; + 58c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 58f: 31 c9 xor %ecx,%ecx + 591: e9 1c ff ff ff jmp 4b2 + 596: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 59d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 5a0: 83 ec 0c sub $0xc,%esp + 5a3: b9 0a 00 00 00 mov $0xa,%ecx + 5a8: 6a 01 push $0x1 + 5aa: e9 7b ff ff ff jmp 52a + 5af: 90 nop + putc(fd, *ap); + 5b0: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 5b3: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 5b6: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 5b8: 6a 01 push $0x1 + 5ba: 57 push %edi + 5bb: 56 push %esi + putc(fd, *ap); + 5bc: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 5bf: e8 8f fd ff ff call 353 + ap++; + 5c4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5c8: 83 c4 10 add $0x10,%esp + state = 0; + 5cb: 31 c9 xor %ecx,%ecx + 5cd: e9 e0 fe ff ff jmp 4b2 + 5d2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 5d8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 5db: 83 ec 04 sub $0x4,%esp + 5de: e9 2a ff ff ff jmp 50d + 5e3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 5e7: 90 nop + s = "(null)"; + 5e8: ba ac 07 00 00 mov $0x7ac,%edx + while (*s != 0) { + 5ed: 89 5d d4 mov %ebx,-0x2c(%ebp) + 5f0: b8 28 00 00 00 mov $0x28,%eax + 5f5: 89 d3 mov %edx,%ebx + 5f7: e9 74 ff ff ff jmp 570 + 5fc: 66 90 xchg %ax,%ax + 5fe: 66 90 xchg %ax,%ax + +00000600 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 600: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 601: a1 c0 0a 00 00 mov 0xac0,%eax +void free(void *ap) { + 606: 89 e5 mov %esp,%ebp + 608: 57 push %edi + 609: 56 push %esi + 60a: 53 push %ebx + 60b: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 60e: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 611: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 618: 89 c2 mov %eax,%edx + 61a: 8b 00 mov (%eax),%eax + 61c: 39 ca cmp %ecx,%edx + 61e: 73 30 jae 650 + 620: 39 c1 cmp %eax,%ecx + 622: 72 04 jb 628 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 624: 39 c2 cmp %eax,%edx + 626: 72 f0 jb 618 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 628: 8b 73 fc mov -0x4(%ebx),%esi + 62b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 62e: 39 f8 cmp %edi,%eax + 630: 74 30 je 662 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 632: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 635: 8b 42 04 mov 0x4(%edx),%eax + 638: 8d 34 c2 lea (%edx,%eax,8),%esi + 63b: 39 f1 cmp %esi,%ecx + 63d: 74 3a je 679 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 63f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 641: 5b pop %ebx + freep = p; + 642: 89 15 c0 0a 00 00 mov %edx,0xac0 +} + 648: 5e pop %esi + 649: 5f pop %edi + 64a: 5d pop %ebp + 64b: c3 ret + 64c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 650: 39 c2 cmp %eax,%edx + 652: 72 c4 jb 618 + 654: 39 c1 cmp %eax,%ecx + 656: 73 c0 jae 618 + if (bp + bp->s.size == p->s.ptr) { + 658: 8b 73 fc mov -0x4(%ebx),%esi + 65b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 65e: 39 f8 cmp %edi,%eax + 660: 75 d0 jne 632 + bp->s.size += p->s.ptr->s.size; + 662: 03 70 04 add 0x4(%eax),%esi + 665: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 668: 8b 02 mov (%edx),%eax + 66a: 8b 00 mov (%eax),%eax + 66c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 66f: 8b 42 04 mov 0x4(%edx),%eax + 672: 8d 34 c2 lea (%edx,%eax,8),%esi + 675: 39 f1 cmp %esi,%ecx + 677: 75 c6 jne 63f + p->s.size += bp->s.size; + 679: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 67c: 89 15 c0 0a 00 00 mov %edx,0xac0 + p->s.size += bp->s.size; + 682: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 685: 8b 4b f8 mov -0x8(%ebx),%ecx + 688: 89 0a mov %ecx,(%edx) +} + 68a: 5b pop %ebx + 68b: 5e pop %esi + 68c: 5f pop %edi + 68d: 5d pop %ebp + 68e: c3 ret + 68f: 90 nop + +00000690 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 690: 55 push %ebp + 691: 89 e5 mov %esp,%ebp + 693: 57 push %edi + 694: 56 push %esi + 695: 53 push %ebx + 696: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 699: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 69c: 8b 3d c0 0a 00 00 mov 0xac0,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 6a2: 8d 70 07 lea 0x7(%eax),%esi + 6a5: c1 ee 03 shr $0x3,%esi + 6a8: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 6ab: 85 ff test %edi,%edi + 6ad: 0f 84 9d 00 00 00 je 750 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6b3: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 6b5: 8b 4a 04 mov 0x4(%edx),%ecx + 6b8: 39 f1 cmp %esi,%ecx + 6ba: 73 6a jae 726 + 6bc: bb 00 10 00 00 mov $0x1000,%ebx + 6c1: 39 de cmp %ebx,%esi + 6c3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 6c6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 6cd: 89 45 e4 mov %eax,-0x1c(%ebp) + 6d0: eb 17 jmp 6e9 + 6d2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 6d8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 6da: 8b 48 04 mov 0x4(%eax),%ecx + 6dd: 39 f1 cmp %esi,%ecx + 6df: 73 4f jae 730 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 6e1: 8b 3d c0 0a 00 00 mov 0xac0,%edi + 6e7: 89 c2 mov %eax,%edx + 6e9: 39 d7 cmp %edx,%edi + 6eb: 75 eb jne 6d8 + p = sbrk(nu * sizeof(Header)); + 6ed: 83 ec 0c sub $0xc,%esp + 6f0: ff 75 e4 push -0x1c(%ebp) + 6f3: e8 3b fc ff ff call 333 + if (p == (char*)-1) { + 6f8: 83 c4 10 add $0x10,%esp + 6fb: 83 f8 ff cmp $0xffffffff,%eax + 6fe: 74 1c je 71c + hp->s.size = nu; + 700: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 703: 83 ec 0c sub $0xc,%esp + 706: 83 c0 08 add $0x8,%eax + 709: 50 push %eax + 70a: e8 f1 fe ff ff call 600 + return freep; + 70f: 8b 15 c0 0a 00 00 mov 0xac0,%edx + if ((p = morecore(nunits)) == 0) { + 715: 83 c4 10 add $0x10,%esp + 718: 85 d2 test %edx,%edx + 71a: 75 bc jne 6d8 + return 0; + } + } + } +} + 71c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 71f: 31 c0 xor %eax,%eax +} + 721: 5b pop %ebx + 722: 5e pop %esi + 723: 5f pop %edi + 724: 5d pop %ebp + 725: c3 ret + if (p->s.size >= nunits) { + 726: 89 d0 mov %edx,%eax + 728: 89 fa mov %edi,%edx + 72a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 730: 39 ce cmp %ecx,%esi + 732: 74 4c je 780 + p->s.size -= nunits; + 734: 29 f1 sub %esi,%ecx + 736: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 739: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 73c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 73f: 89 15 c0 0a 00 00 mov %edx,0xac0 +} + 745: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 748: 83 c0 08 add $0x8,%eax +} + 74b: 5b pop %ebx + 74c: 5e pop %esi + 74d: 5f pop %edi + 74e: 5d pop %ebp + 74f: c3 ret + base.s.ptr = freep = prevp = &base; + 750: c7 05 c0 0a 00 00 c4 movl $0xac4,0xac0 + 757: 0a 00 00 + base.s.size = 0; + 75a: bf c4 0a 00 00 mov $0xac4,%edi + base.s.ptr = freep = prevp = &base; + 75f: c7 05 c4 0a 00 00 c4 movl $0xac4,0xac4 + 766: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 769: 89 fa mov %edi,%edx + base.s.size = 0; + 76b: c7 05 c8 0a 00 00 00 movl $0x0,0xac8 + 772: 00 00 00 + if (p->s.size >= nunits) { + 775: e9 42 ff ff ff jmp 6bc + 77a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 780: 8b 08 mov (%eax),%ecx + 782: 89 0a mov %ecx,(%edx) + 784: eb b9 jmp 73f diff --git a/shutdown.d b/shutdown.d new file mode 100644 index 0000000..a21cde4 --- /dev/null +++ b/shutdown.d @@ -0,0 +1 @@ +shutdown.o: shutdown.c /usr/include/stdc-predef.h types.h user.h diff --git a/shutdown.o b/shutdown.o new file mode 100644 index 0000000000000000000000000000000000000000..6832f32cad50992da0cf9eebb5516d432ef90119 GIT binary patch literal 3692 zcma)9TWnlM8J;t>5A?)RN_mJJQ z&bhQnR1%3*C{fyo@X)6SRH^L)PduPfi3dRN!V3}-5-QLa6eI)z(MljoL|VRYc4mFd zMf8_uzW+XR=KS-Y-D@YFds<2<3`vm^+maBALp{r)g1nd(`$QoSryFq;d44^&(tgD+ z7K=k-%?+b+K%EjzzBitmvpaYH*1dRt{l*{8ymb1-&b_@i<;{!sjT3h}Tk`7JA9A%) z_l@r#WXLx=_XZnex{Kfb8+xc1c`j6kI&)CXV=cn?Cb9dw4cDgd2Id!VB2kNg# z9riVU77Bt-hHK*(WV#*qrBFMolz`z5T zth93yFlalT9|>my=^mn@f+5L>U9-?xhtgM!Mv@y6_SXR^ncfd`<{Efs1XG?dZ(}Gg zHHqO-xJX+q1dF&u^POW*j(nD^J<1^KwiwMT$9**IhH4mNEKQxWi!O&TK7)~^VITD4 zo{$47dIg$g42#oE3}Nxq`50D&>3K4jF+D}*1}2(>y@D(@caJs1>I7`hh_A|PU{Z4; zllfdGH429@k(sq=b&B%XRBH6eS?j6H6SK}EQ>zn8Qxb;sxcv0!L?$&eJ+nSJF0+$3 z-=a{y8MtQX`I?+s!ub#C#Dh3nold*-QVs3JZZZeeZiaU{tWJ!}-Rb4MSJav#j=)w_ z?COMtsL>sY$sc?HyBJ$cI`wqfj9j1OuE${<>}Tj1#fwCHTbSO6ePx#T!saz@Vm+HsEEc1BW{&ZcJz>7QG; zZ8G*lukO3G94}261=ZH3a4&h_8|@&vdR3f!em!@*^jNM`Dn44A&lOsaE?|mc z-#uD)eK+u`5X(Weanw8V_>o+pUawVhg%{wo;kOHw*lVH>^#m;ERii?=>6JtFE9KE{ zc~M~_D7W0gW*eJw1LIt-UMOq^?Z~Z0ZLQq&Tv*HDWxv`8+I~9@3$g!-=hq5Rxzcn) z7}5CCcv6^+PSgeet;>~n+z=~hZ zrmgr=Hf6CfNGbJb`vI&Xn zv4w6^N=&GRN)4ZFH!joowpm59^B7__-bzE1^F{!w)e>)_R|UPhpkKeS_U;B^7BM6) z;u6q86X)fmT%(N7$0iYv6%)sVxT@{fwH+;!eOmBKBXK-@LWyH}P~$!#`o#evoY@fQ zH?Q$Aja;Al7c^Eieof=+8sE|QJt986Khp9qG=4xtulrEr@3sCfTK-7mKZw}ZAUhTO zQB?}ZiO4&xaZY1F;}MN$)yhvj2mDWHnQfNe{;ZbOxxmgEW?pp;I3LzE&xt<}h(|Oo z6XBNwT0l_@FSpPHfKkxHhT$UjQY4DCa#R+@N*Ib_(567oQn3WlZ5HVR1%5Tfn>|g< zt;F^7p1;vXtm4a+O5nbnv^Lw-rWZy`i5%K1DEoDHhbr*v|KZm3eAgt#Mhr{!c_mld zE%q5v^w9!~Xu}27+Ima5jq|E!;=w-|@i!G-N$-OQWIZQ|HqtBxc^)b0fB8KE8*BRi z`Kk8@zXc2u^UW!)H*qbFV;a@x7yOqoc-IZFPDuO_gz^{57^FL>&1E3(KdzVRRNNPT z3NWvszk+!-p)l+hp-<-f9rA5K$9!P>`P6-fZ0KQ+$AY>PIXEkg>fBKACSALLNHqkNZR`Q1$d4kTLTZq#6wD zDTc^${6wSiyN#D$Gfvt@zhC~F-{0ZKnlxnc{RRs1hGtD6YK5_}j>zNnE1HAfGnyyx zIY@uPNIvf(1RSAy-Uor^d6T)I7EP`TCI9VYFzCngVJ;kPpPDGnLSNe6`#5w-za<22 I{TIJ~0q-^300000 literal 0 HcmV?d00001 diff --git a/shutdown.sym b/shutdown.sym new file mode 100644 index 0000000..e29ee46 --- /dev/null +++ b/shutdown.sym @@ -0,0 +1,50 @@ +00000000 shutdown.c +00000000 ulib.c +00000000 printf.c +000003b0 printint +0000080c digits.0 +00000000 umalloc.c +00000ac0 freep +00000ac4 base +00000090 strcpy +00000460 printf +0000038b greeting +000002b0 memmove +0000035b mknod +000001b0 gets +0000032b getpid +0000039b screen +00000690 malloc +0000033b sleep +000002f3 pipe +00000383 getch +00000353 write +00000313 fstat +00000303 kill +0000031b chdir +0000030b exec +000002eb wait +000002fb read +00000363 unlink +000002db fork +00000333 sbrk +00000343 uptime +00000ac0 __bss_start +00000150 memset +00000000 main +000000c0 strcmp +00000393 shutdown +00000323 dup +00000220 stat +00000ac0 _edata +00000acc _end +0000036b link +000002e3 exit +00000270 atoi +000003a3 cls +00000120 strlen +0000034b open +00000170 strchr +00000373 mkdir +0000037b close +00000600 free diff --git a/sleeplock.d b/sleeplock.d new file mode 100644 index 0000000..e50551a --- /dev/null +++ b/sleeplock.d @@ -0,0 +1,2 @@ +sleeplock.o: sleeplock.c /usr/include/stdc-predef.h types.h defs.h \ + param.h x86.h memlayout.h mmu.h proc.h spinlock.h sleeplock.h diff --git a/sleeplock.o b/sleeplock.o new file mode 100644 index 0000000000000000000000000000000000000000..713d0e7832d6f902b55b04b693b33e59968e5ccb GIT binary patch literal 7456 zcma)Ae{3Abb)MPVSsr=(eH2BClyp=minc|HM^Y3eQ8p!-wy4OGB1N*|Sf-D6OY+L& z-RbsDzwB6wW&N^B$BKoftz|%Ui#CW;*ncP~k~pmZ#a072Xpq85VIYBvBCzYEXxapI zQKwbEZ+4bC2`!KTX1@2{y!U42&70lXJvqMfAt|K@iWDJnn-k)EtKT!Ip<65!&4H@M z{TF_|@ANOLFCGfdl3y6J_k8%TiyXkh(B7eDTn4zkg%lS{K=c zZ?c8`fqk%E@NBp_;M+!Fbmm9J=7l5T^e@8)_W9BfrPoXUax=sU`m)jb3u7Y}O5p|f zKR^G(p?~JcfqQ?H|I5EWv0zs1o!S+gz<;@)V1AFrZymrITl`s?DVoW&EKYjC{mli; zVe-(8g<_X@@#5!4wA+mb>+3FGulwfp3pao9_g=>l#GX-%vkPrFX*WCgVhoIIxh(d`W~V8r}sHmieS7LgA|Sz*GzM2`qQo zo`4_erqaSL`3|J(fjOcXTe?$uVIS2@*!m~v+Q&3gjhf_X|a zEz(VZd0I2=a>f(($?7c_Ic9x;);^_~RdN~~U(|G`UXuN+X1XvLVV~A?xAk3GJg1p^ zWeOc;=u- zZ*|kz3tDRw!^7l~W*(FtOunqOwp;H~>m|+X5Nb2Huv+#i;^P$ItgQ=zdf_k)+BIG8 zya;+Z>2S=Mg3b!kc6ZnlD@n<<;Z!~&Vx+B}a9(t1={n~fI9;W6`@)GM8SyDCA9R>U zotj=BPECo`nj8wxh%QZSaDD}aHKfDCLVXKfX4Twz(R(W*V(2dh@he6V&>JD(apVy?LsnnPoCr z7!c}6WC7mV^|q*^+9sx>ulyA2)VZVl6zkSmrTi3ItMg6yDTYl(CMrM0u*ujl^#$#1 zSZA+#Ml&Niuhq$5W0CRdl-XD$newx5yUr!$XWtGciSn~=r%n>(XWuTSg7UL(k4^>U zXWw3?r8=iq`B`f>V|HFM2bkgNf~F5zE7|e9W*+02P!~1*xb-uJ&(F#yWG01U?q}tb z)(>d%f>xW7kbg;&DeEBRFKT95gt*&F?G~Q;HykT$E9~|G$ed7QH$YggGehkqd(mOb zq9+{H%%ly=84Tt)O^>1@Z@mPkPDL~hi>p>M&XW_a%z*hb>mS)ushO`@hsablu6Km^ zI${p4$yr9%`g!8C`5C6;?zEc><6b$-H51m`^~JF7XM^iBw;OKS`3zqqP3)rTRst(Q5gZvFfVTlFw>?rGYDo@$v-r-XB_o_xKP zWzT(j@=dZhEu6JWpM_S7#dSD6Iz;W(SE<#j6E$XCAhS-}cUqgN*4KCrHr+CL6rSVJ zKL<0bAHYt3)oWlfRuk0*ny-U-+A7h(VAWe-PKgj#*7_l)USV^6&MJossC*k1q7qfe z%6`yRWd-O^b7hz6Ywl0s*UzSDgr50bTbQ^wj+n!-W0> zY!!{Zb6cmb2HP8=K=<%Pp{=7L^d+259pH}wVWm(%!C<2m*1edMe(hA4*N)80VI506 z3})*HR8;6K7}im*@bhOxRL?+RVH2z?c=$ziGnzl#L7t5W(ZRAGW47Vv8o191NZUm9 z84UaUk-*H?t^RkYT|T>LTRjHbue==a6?_AVc3gpk>{3kM_fa1~l~;ZRrFzV`tCN&< zNh~i2xyH{7C{&}`AEV)jb|uExF zs4W+S>O`c&o`}M1yZC}U2|`6>s5TPOS{-2tiKDGL6#R5lO+;%Vb8uCm1kJ*Fh`ahK zyD>~Vl&Ykhh|)!*1KR5#sqU2zv|l`1{+eb^ti$rBisbJUk;wg#P%SbX z30pgY`)xf=M|e|*^mQyOvmtOsS%!-&g;-@Qr%A7*Ohv}xulw?A}rf+F0s9Y z3q6@A+h^4>fIO@|MHo>{go8M9QjR~eZSUuHi@p1I?b^C+=eY2SiJ~hCZpKY`u9!kI z8DBryC*0{w0@sGec0aOhVq6rwBXQxmGbz_gigY$z)ZZi}ekDw&Gp(4hXaH(&WIEQLkHFUyY}xJe=t}< zywCTj@Y(hM|YkzDkz9ANm_YU;-#d_uk`q30iS$E5fn{^B6B-lhDIlCo2G&~gR znVCsV#d>x_X*!$hnJT3-#dOwZydt!VJ&8;@;b9wmVQxNM?9tKe$>%s`AyCE|dJu@B zn=IyxFrRkOoA8cjle2|fHdpd`O4+07Y^tZ2n98^wI`!Inl9_}z8(61vS>YvT-Bc;# z7DO@OF+fOGFQ3lprRunDWa`Wx*P%~mb17Hkct0oatDCeE`I%I@AZBwJ=90eyN6gNP zY%-J9`H{^9XTjH4H;?bu#5!+!a^G=pPa!w6F5!8u=glLn`)^0RHz|I1P3@TrfEAO) z>z!R(6Ubx3LulvcOK7)Tu3f+qF&Y`u!g%gUX4*+5NSI{2CTJ}MvIi+Wqng&sa@pH`_V z>fY2&AHw_YuEK|WP;BvUw*s1Y=btF@xc-)vkkHqcMM+467ikh9|4zIp3+Y?hB8z_9 z0?JBA)QK9yGk%SD{j`5z%`#FBcgEu%X=12u^27~^oFi-b8&JxDsZb{r&nQs=DJwya( znuySyAl3=-hLOKTY!u?xhUY&ieonO$q4xsi;D2n8yCt!ujJX5@Q+&YSf0e;yM7+LN z5pnNaLxdhgPbe*8iTC{R~w8QJY=wB@DB|BsX=~m)6bg*`E5g<|IZLo^pDd0N|e%jzW z27hkwe+(|g`KNxL!3l#&gHIWJ#o*Tr{?Oo04Sr(zI%-c+KP5WQ3Q?bch!k)d|HHx3p$DR-(gGnvj#=Y*jXQ&R=^NWkIkoJo85-BqTY zC?v8o`0-aJ!i~}mOyE8sDW24PGB?k=h3L)V2GxsOT#tV%)IQwVN&fGh$THvMIKe2)Z$eXL^!1Nkus|C$4sLLHU|P|MfxG#2m%Cc$+uAA@!1Tmm1Ip(-Ih z3Y*akQ w*xzzr5Q{uIMVF4wz;aet(H{3g)*U+BnAEdT%j literal 0 HcmV?d00001 diff --git a/spinlock.d b/spinlock.d new file mode 100644 index 0000000..9f70952 --- /dev/null +++ b/spinlock.d @@ -0,0 +1,2 @@ +spinlock.o: spinlock.c /usr/include/stdc-predef.h types.h defs.h param.h \ + x86.h memlayout.h mmu.h proc.h spinlock.h diff --git a/spinlock.o b/spinlock.o new file mode 100644 index 0000000000000000000000000000000000000000..1d082d19bc5492f7949c4c243ecf62da774f9642 GIT binary patch literal 10684 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 literal 0 HcmV?d00001 diff --git a/stressfs.asm b/stressfs.asm new file mode 100644 index 0000000..b9166d4 --- /dev/null +++ b/stressfs.asm @@ -0,0 +1,1288 @@ + +_stressfs: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +#include "stat.h" +#include "user.h" +#include "fs.h" +#include "fcntl.h" + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + int fd, i; + char path[] = "stressfs0"; + 7: b8 30 00 00 00 mov $0x30,%eax +int main(int argc, char *argv[]) { + c: ff 71 fc push -0x4(%ecx) + f: 55 push %ebp + 10: 89 e5 mov %esp,%ebp + 12: 57 push %edi + 13: 56 push %esi + char data[512]; + + printf(1, "stressfs starting\n"); + memset(data, 'a', sizeof(data)); + 14: 8d b5 e8 fd ff ff lea -0x218(%ebp),%esi +int main(int argc, char *argv[]) { + 1a: 53 push %ebx + + for (i = 0; i < 4; i++) { + 1b: 31 db xor %ebx,%ebx +int main(int argc, char *argv[]) { + 1d: 51 push %ecx + 1e: 81 ec 20 02 00 00 sub $0x220,%esp + char path[] = "stressfs0"; + 24: 66 89 85 e6 fd ff ff mov %ax,-0x21a(%ebp) + printf(1, "stressfs starting\n"); + 2b: 68 38 08 00 00 push $0x838 + 30: 6a 01 push $0x1 + char path[] = "stressfs0"; + 32: c7 85 de fd ff ff 73 movl $0x65727473,-0x222(%ebp) + 39: 74 72 65 + 3c: c7 85 e2 fd ff ff 73 movl $0x73667373,-0x21e(%ebp) + 43: 73 66 73 + printf(1, "stressfs starting\n"); + 46: e8 c5 04 00 00 call 510 + memset(data, 'a', sizeof(data)); + 4b: 83 c4 0c add $0xc,%esp + 4e: 68 00 02 00 00 push $0x200 + 53: 6a 61 push $0x61 + 55: 56 push %esi + 56: e8 a5 01 00 00 call 200 + 5b: 83 c4 10 add $0x10,%esp + if (fork() > 0) { + 5e: e8 28 03 00 00 call 38b + 63: 85 c0 test %eax,%eax + 65: 0f 8f bf 00 00 00 jg 12a + for (i = 0; i < 4; i++) { + 6b: 83 c3 01 add $0x1,%ebx + 6e: 83 fb 04 cmp $0x4,%ebx + 71: 75 eb jne 5e + 73: bf 04 00 00 00 mov $0x4,%edi + break; + } + } + + printf(1, "write %d\n", i); + 78: 83 ec 04 sub $0x4,%esp + 7b: 53 push %ebx + + path[8] += i; + fd = open(path, O_CREATE | O_RDWR); + 7c: bb 14 00 00 00 mov $0x14,%ebx + printf(1, "write %d\n", i); + 81: 68 4b 08 00 00 push $0x84b + 86: 6a 01 push $0x1 + 88: e8 83 04 00 00 call 510 + path[8] += i; + 8d: 89 f8 mov %edi,%eax + fd = open(path, O_CREATE | O_RDWR); + 8f: 5f pop %edi + path[8] += i; + 90: 00 85 e6 fd ff ff add %al,-0x21a(%ebp) + fd = open(path, O_CREATE | O_RDWR); + 96: 58 pop %eax + 97: 8d 85 de fd ff ff lea -0x222(%ebp),%eax + 9d: 68 02 02 00 00 push $0x202 + a2: 50 push %eax + a3: e8 53 03 00 00 call 3fb + a8: 83 c4 10 add $0x10,%esp + ab: 89 c7 mov %eax,%edi + for (i = 0; i < 20; i++) { + ad: 8d 76 00 lea 0x0(%esi),%esi +// printf(fd, "%d\n", i); + write(fd, data, sizeof(data)); + b0: 83 ec 04 sub $0x4,%esp + b3: 68 00 02 00 00 push $0x200 + b8: 56 push %esi + b9: 57 push %edi + ba: e8 44 03 00 00 call 403 + for (i = 0; i < 20; i++) { + bf: 83 c4 10 add $0x10,%esp + c2: 83 eb 01 sub $0x1,%ebx + c5: 75 e9 jne b0 + } + close(fd); + c7: 83 ec 0c sub $0xc,%esp + ca: 57 push %edi + cb: e8 5b 03 00 00 call 42b + + printf(1, "read\n"); + d0: 58 pop %eax + d1: 5a pop %edx + d2: 68 55 08 00 00 push $0x855 + d7: 6a 01 push $0x1 + d9: e8 32 04 00 00 call 510 + + fd = open(path, O_RDONLY); + de: 8d 85 de fd ff ff lea -0x222(%ebp),%eax + e4: 59 pop %ecx + e5: 5b pop %ebx + e6: 6a 00 push $0x0 + e8: bb 14 00 00 00 mov $0x14,%ebx + ed: 50 push %eax + ee: e8 08 03 00 00 call 3fb + f3: 83 c4 10 add $0x10,%esp + f6: 89 c7 mov %eax,%edi + for (i = 0; i < 20; i++) { + f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ff: 90 nop + read(fd, data, sizeof(data)); + 100: 83 ec 04 sub $0x4,%esp + 103: 68 00 02 00 00 push $0x200 + 108: 56 push %esi + 109: 57 push %edi + 10a: e8 9c 02 00 00 call 3ab + for (i = 0; i < 20; i++) { + 10f: 83 c4 10 add $0x10,%esp + 112: 83 eb 01 sub $0x1,%ebx + 115: 75 e9 jne 100 + } + close(fd); + 117: 83 ec 0c sub $0xc,%esp + 11a: 57 push %edi + 11b: e8 0b 03 00 00 call 42b + + wait(); + 120: e8 76 02 00 00 call 39b + + exit(); + 125: e8 69 02 00 00 call 393 + path[8] += i; + 12a: 89 df mov %ebx,%edi + 12c: e9 47 ff ff ff jmp 78 + 131: 66 90 xchg %ax,%ax + 133: 66 90 xchg %ax,%ax + 135: 66 90 xchg %ax,%ax + 137: 66 90 xchg %ax,%ax + 139: 66 90 xchg %ax,%ax + 13b: 66 90 xchg %ax,%ax + 13d: 66 90 xchg %ax,%ax + 13f: 90 nop + +00000140 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 140: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 141: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 143: 89 e5 mov %esp,%ebp + 145: 53 push %ebx + 146: 8b 4d 08 mov 0x8(%ebp),%ecx + 149: 8b 5d 0c mov 0xc(%ebp),%ebx + 14c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 150: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 154: 88 14 01 mov %dl,(%ecx,%eax,1) + 157: 83 c0 01 add $0x1,%eax + 15a: 84 d2 test %dl,%dl + 15c: 75 f2 jne 150 + ; + } + return os; +} + 15e: 8b 5d fc mov -0x4(%ebp),%ebx + 161: 89 c8 mov %ecx,%eax + 163: c9 leave + 164: c3 ret + 165: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 16c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000170 : + +int strcmp(const char *p, const char *q) { + 170: 55 push %ebp + 171: 89 e5 mov %esp,%ebp + 173: 53 push %ebx + 174: 8b 55 08 mov 0x8(%ebp),%edx + 177: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 17a: 0f b6 02 movzbl (%edx),%eax + 17d: 84 c0 test %al,%al + 17f: 75 17 jne 198 + 181: eb 3a jmp 1bd + 183: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 187: 90 nop + 188: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 18c: 83 c2 01 add $0x1,%edx + 18f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 192: 84 c0 test %al,%al + 194: 74 1a je 1b0 + p++, q++; + 196: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 198: 0f b6 19 movzbl (%ecx),%ebx + 19b: 38 c3 cmp %al,%bl + 19d: 74 e9 je 188 + } + return (uchar) * p - (uchar) * q; + 19f: 29 d8 sub %ebx,%eax +} + 1a1: 8b 5d fc mov -0x4(%ebp),%ebx + 1a4: c9 leave + 1a5: c3 ret + 1a6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ad: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 1b0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 1b4: 31 c0 xor %eax,%eax + 1b6: 29 d8 sub %ebx,%eax +} + 1b8: 8b 5d fc mov -0x4(%ebp),%ebx + 1bb: c9 leave + 1bc: c3 ret + return (uchar) * p - (uchar) * q; + 1bd: 0f b6 19 movzbl (%ecx),%ebx + 1c0: 31 c0 xor %eax,%eax + 1c2: eb db jmp 19f + 1c4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1cb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1cf: 90 nop + +000001d0 : + +uint strlen(const char *s) { + 1d0: 55 push %ebp + 1d1: 89 e5 mov %esp,%ebp + 1d3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 1d6: 80 3a 00 cmpb $0x0,(%edx) + 1d9: 74 15 je 1f0 + 1db: 31 c0 xor %eax,%eax + 1dd: 8d 76 00 lea 0x0(%esi),%esi + 1e0: 83 c0 01 add $0x1,%eax + 1e3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 1e7: 89 c1 mov %eax,%ecx + 1e9: 75 f5 jne 1e0 + ; + } + return n; +} + 1eb: 89 c8 mov %ecx,%eax + 1ed: 5d pop %ebp + 1ee: c3 ret + 1ef: 90 nop + for (n = 0; s[n]; n++) { + 1f0: 31 c9 xor %ecx,%ecx +} + 1f2: 5d pop %ebp + 1f3: 89 c8 mov %ecx,%eax + 1f5: c3 ret + 1f6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1fd: 8d 76 00 lea 0x0(%esi),%esi + +00000200 : + +void* memset(void *dst, int c, uint n) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 57 push %edi + 204: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 207: 8b 4d 10 mov 0x10(%ebp),%ecx + 20a: 8b 45 0c mov 0xc(%ebp),%eax + 20d: 89 d7 mov %edx,%edi + 20f: fc cld + 210: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 212: 8b 7d fc mov -0x4(%ebp),%edi + 215: 89 d0 mov %edx,%eax + 217: c9 leave + 218: c3 ret + 219: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000220 : + +char* strchr(const char *s, char c) { + 220: 55 push %ebp + 221: 89 e5 mov %esp,%ebp + 223: 8b 45 08 mov 0x8(%ebp),%eax + 226: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 22a: 0f b6 10 movzbl (%eax),%edx + 22d: 84 d2 test %dl,%dl + 22f: 75 12 jne 243 + 231: eb 1d jmp 250 + 233: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 237: 90 nop + 238: 0f b6 50 01 movzbl 0x1(%eax),%edx + 23c: 83 c0 01 add $0x1,%eax + 23f: 84 d2 test %dl,%dl + 241: 74 0d je 250 + if (*s == c) { + 243: 38 d1 cmp %dl,%cl + 245: 75 f1 jne 238 + return (char*)s; + } + } + return 0; +} + 247: 5d pop %ebp + 248: c3 ret + 249: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 250: 31 c0 xor %eax,%eax +} + 252: 5d pop %ebp + 253: c3 ret + 254: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 25b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 25f: 90 nop + +00000260 : + +char* gets(char *buf, int max) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 57 push %edi + 264: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 265: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 268: 53 push %ebx + for (i = 0; i + 1 < max;) { + 269: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 26b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 26e: eb 27 jmp 297 + cc = read(0, &c, 1); + 270: 83 ec 04 sub $0x4,%esp + 273: 6a 01 push $0x1 + 275: 57 push %edi + 276: 6a 00 push $0x0 + 278: e8 2e 01 00 00 call 3ab + if (cc < 1) { + 27d: 83 c4 10 add $0x10,%esp + 280: 85 c0 test %eax,%eax + 282: 7e 1d jle 2a1 + break; + } + buf[i++] = c; + 284: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 288: 8b 55 08 mov 0x8(%ebp),%edx + 28b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 28f: 3c 0a cmp $0xa,%al + 291: 74 1d je 2b0 + 293: 3c 0d cmp $0xd,%al + 295: 74 19 je 2b0 + for (i = 0; i + 1 < max;) { + 297: 89 de mov %ebx,%esi + 299: 83 c3 01 add $0x1,%ebx + 29c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 29f: 7c cf jl 270 + break; + } + } + buf[i] = '\0'; + 2a1: 8b 45 08 mov 0x8(%ebp),%eax + 2a4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 2a8: 8d 65 f4 lea -0xc(%ebp),%esp + 2ab: 5b pop %ebx + 2ac: 5e pop %esi + 2ad: 5f pop %edi + 2ae: 5d pop %ebp + 2af: c3 ret + buf[i] = '\0'; + 2b0: 8b 45 08 mov 0x8(%ebp),%eax + 2b3: 89 de mov %ebx,%esi + 2b5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 2b9: 8d 65 f4 lea -0xc(%ebp),%esp + 2bc: 5b pop %ebx + 2bd: 5e pop %esi + 2be: 5f pop %edi + 2bf: 5d pop %ebp + 2c0: c3 ret + 2c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2cf: 90 nop + +000002d0 : + +int stat(const char *n, struct stat *st) { + 2d0: 55 push %ebp + 2d1: 89 e5 mov %esp,%ebp + 2d3: 56 push %esi + 2d4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 2d5: 83 ec 08 sub $0x8,%esp + 2d8: 6a 00 push $0x0 + 2da: ff 75 08 push 0x8(%ebp) + 2dd: e8 19 01 00 00 call 3fb + if (fd < 0) { + 2e2: 83 c4 10 add $0x10,%esp + 2e5: 85 c0 test %eax,%eax + 2e7: 78 27 js 310 + return -1; + } + r = fstat(fd, st); + 2e9: 83 ec 08 sub $0x8,%esp + 2ec: ff 75 0c push 0xc(%ebp) + 2ef: 89 c3 mov %eax,%ebx + 2f1: 50 push %eax + 2f2: e8 cc 00 00 00 call 3c3 + close(fd); + 2f7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 2fa: 89 c6 mov %eax,%esi + close(fd); + 2fc: e8 2a 01 00 00 call 42b + return r; + 301: 83 c4 10 add $0x10,%esp +} + 304: 8d 65 f8 lea -0x8(%ebp),%esp + 307: 89 f0 mov %esi,%eax + 309: 5b pop %ebx + 30a: 5e pop %esi + 30b: 5d pop %ebp + 30c: c3 ret + 30d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 310: be ff ff ff ff mov $0xffffffff,%esi + 315: eb ed jmp 304 + 317: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 31e: 66 90 xchg %ax,%ax + +00000320 : + +int atoi(const char *s) { + 320: 55 push %ebp + 321: 89 e5 mov %esp,%ebp + 323: 53 push %ebx + 324: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 327: 0f be 02 movsbl (%edx),%eax + 32a: 8d 48 d0 lea -0x30(%eax),%ecx + 32d: 80 f9 09 cmp $0x9,%cl + n = 0; + 330: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 335: 77 1e ja 355 + 337: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 33e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 340: 83 c2 01 add $0x1,%edx + 343: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 346: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 34a: 0f be 02 movsbl (%edx),%eax + 34d: 8d 58 d0 lea -0x30(%eax),%ebx + 350: 80 fb 09 cmp $0x9,%bl + 353: 76 eb jbe 340 + } + return n; +} + 355: 8b 5d fc mov -0x4(%ebp),%ebx + 358: 89 c8 mov %ecx,%eax + 35a: c9 leave + 35b: c3 ret + 35c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000360 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 360: 55 push %ebp + 361: 89 e5 mov %esp,%ebp + 363: 57 push %edi + 364: 8b 45 10 mov 0x10(%ebp),%eax + 367: 8b 55 08 mov 0x8(%ebp),%edx + 36a: 56 push %esi + 36b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 36e: 85 c0 test %eax,%eax + 370: 7e 13 jle 385 + 372: 01 d0 add %edx,%eax + dst = vdst; + 374: 89 d7 mov %edx,%edi + 376: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 37d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 380: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 381: 39 f8 cmp %edi,%eax + 383: 75 fb jne 380 + } + return vdst; +} + 385: 5e pop %esi + 386: 89 d0 mov %edx,%eax + 388: 5f pop %edi + 389: 5d pop %ebp + 38a: c3 ret + +0000038b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 38b: b8 01 00 00 00 mov $0x1,%eax + 390: cd 40 int $0x40 + 392: c3 ret + +00000393 : +SYSCALL(exit) + 393: b8 02 00 00 00 mov $0x2,%eax + 398: cd 40 int $0x40 + 39a: c3 ret + +0000039b : +SYSCALL(wait) + 39b: b8 03 00 00 00 mov $0x3,%eax + 3a0: cd 40 int $0x40 + 3a2: c3 ret + +000003a3 : +SYSCALL(pipe) + 3a3: b8 04 00 00 00 mov $0x4,%eax + 3a8: cd 40 int $0x40 + 3aa: c3 ret + +000003ab : +SYSCALL(read) + 3ab: b8 05 00 00 00 mov $0x5,%eax + 3b0: cd 40 int $0x40 + 3b2: c3 ret + +000003b3 : +SYSCALL(kill) + 3b3: b8 06 00 00 00 mov $0x6,%eax + 3b8: cd 40 int $0x40 + 3ba: c3 ret + +000003bb : +SYSCALL(exec) + 3bb: b8 07 00 00 00 mov $0x7,%eax + 3c0: cd 40 int $0x40 + 3c2: c3 ret + +000003c3 : +SYSCALL(fstat) + 3c3: b8 08 00 00 00 mov $0x8,%eax + 3c8: cd 40 int $0x40 + 3ca: c3 ret + +000003cb : +SYSCALL(chdir) + 3cb: b8 09 00 00 00 mov $0x9,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(dup) + 3d3: b8 0a 00 00 00 mov $0xa,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(getpid) + 3db: b8 0b 00 00 00 mov $0xb,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(sbrk) + 3e3: b8 0c 00 00 00 mov $0xc,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(sleep) + 3eb: b8 0d 00 00 00 mov $0xd,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(uptime) + 3f3: b8 0e 00 00 00 mov $0xe,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + +000003fb : +SYSCALL(open) + 3fb: b8 0f 00 00 00 mov $0xf,%eax + 400: cd 40 int $0x40 + 402: c3 ret + +00000403 : +SYSCALL(write) + 403: b8 10 00 00 00 mov $0x10,%eax + 408: cd 40 int $0x40 + 40a: c3 ret + +0000040b : +SYSCALL(mknod) + 40b: b8 11 00 00 00 mov $0x11,%eax + 410: cd 40 int $0x40 + 412: c3 ret + +00000413 : +SYSCALL(unlink) + 413: b8 12 00 00 00 mov $0x12,%eax + 418: cd 40 int $0x40 + 41a: c3 ret + +0000041b : +SYSCALL(link) + 41b: b8 13 00 00 00 mov $0x13,%eax + 420: cd 40 int $0x40 + 422: c3 ret + +00000423 : +SYSCALL(mkdir) + 423: b8 14 00 00 00 mov $0x14,%eax + 428: cd 40 int $0x40 + 42a: c3 ret + +0000042b : +SYSCALL(close) + 42b: b8 15 00 00 00 mov $0x15,%eax + 430: cd 40 int $0x40 + 432: c3 ret + +00000433 : +SYSCALL(getch) + 433: b8 16 00 00 00 mov $0x16,%eax + 438: cd 40 int $0x40 + 43a: c3 ret + +0000043b : +SYSCALL(greeting) + 43b: b8 17 00 00 00 mov $0x17,%eax + 440: cd 40 int $0x40 + 442: c3 ret + +00000443 : +SYSCALL(shutdown) + 443: b8 18 00 00 00 mov $0x18,%eax + 448: cd 40 int $0x40 + 44a: c3 ret + +0000044b : +SYSCALL(screen) + 44b: b8 19 00 00 00 mov $0x19,%eax + 450: cd 40 int $0x40 + 452: c3 ret + +00000453 : +SYSCALL(cls) + 453: b8 1a 00 00 00 mov $0x1a,%eax + 458: cd 40 int $0x40 + 45a: c3 ret + 45b: 66 90 xchg %ax,%ax + 45d: 66 90 xchg %ax,%ax + 45f: 90 nop + +00000460 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 460: 55 push %ebp + 461: 89 e5 mov %esp,%ebp + 463: 57 push %edi + 464: 56 push %esi + 465: 53 push %ebx + 466: 83 ec 3c sub $0x3c,%esp + 469: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 46c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 46e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 471: 85 d2 test %edx,%edx + 473: 0f 89 7f 00 00 00 jns 4f8 + 479: f6 45 08 01 testb $0x1,0x8(%ebp) + 47d: 74 79 je 4f8 + neg = 1; + 47f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 486: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 488: 31 db xor %ebx,%ebx + 48a: 8d 75 d7 lea -0x29(%ebp),%esi + 48d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 490: 89 c8 mov %ecx,%eax + 492: 31 d2 xor %edx,%edx + 494: 89 cf mov %ecx,%edi + 496: f7 75 c4 divl -0x3c(%ebp) + 499: 0f b6 92 bc 08 00 00 movzbl 0x8bc(%edx),%edx + 4a0: 89 45 c0 mov %eax,-0x40(%ebp) + 4a3: 89 d8 mov %ebx,%eax + 4a5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 4a8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 4ab: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 4ae: 39 7d c4 cmp %edi,-0x3c(%ebp) + 4b1: 76 dd jbe 490 + if (neg) { + 4b3: 8b 4d bc mov -0x44(%ebp),%ecx + 4b6: 85 c9 test %ecx,%ecx + 4b8: 74 0c je 4c6 + buf[i++] = '-'; + 4ba: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 4bf: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 4c1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 4c6: 8b 7d b8 mov -0x48(%ebp),%edi + 4c9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 4cd: eb 07 jmp 4d6 + 4cf: 90 nop + putc(fd, buf[i]); + 4d0: 0f b6 13 movzbl (%ebx),%edx + 4d3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 4d6: 83 ec 04 sub $0x4,%esp + 4d9: 88 55 d7 mov %dl,-0x29(%ebp) + 4dc: 6a 01 push $0x1 + 4de: 56 push %esi + 4df: 57 push %edi + 4e0: e8 1e ff ff ff call 403 + while (--i >= 0) { + 4e5: 83 c4 10 add $0x10,%esp + 4e8: 39 de cmp %ebx,%esi + 4ea: 75 e4 jne 4d0 + } +} + 4ec: 8d 65 f4 lea -0xc(%ebp),%esp + 4ef: 5b pop %ebx + 4f0: 5e pop %esi + 4f1: 5f pop %edi + 4f2: 5d pop %ebp + 4f3: c3 ret + 4f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 4f8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 4ff: eb 87 jmp 488 + 501: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 508: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 50f: 90 nop + +00000510 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 510: 55 push %ebp + 511: 89 e5 mov %esp,%ebp + 513: 57 push %edi + 514: 56 push %esi + 515: 53 push %ebx + 516: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 519: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 51c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 51f: 0f b6 13 movzbl (%ebx),%edx + 522: 84 d2 test %dl,%dl + 524: 74 6a je 590 + ap = (uint*)(void*)&fmt + 1; + 526: 8d 45 10 lea 0x10(%ebp),%eax + 529: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 52c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 52f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 531: 89 45 d0 mov %eax,-0x30(%ebp) + 534: eb 36 jmp 56c + 536: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 53d: 8d 76 00 lea 0x0(%esi),%esi + 540: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 543: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 548: 83 f8 25 cmp $0x25,%eax + 54b: 74 15 je 562 + write(fd, &c, 1); + 54d: 83 ec 04 sub $0x4,%esp + 550: 88 55 e7 mov %dl,-0x19(%ebp) + 553: 6a 01 push $0x1 + 555: 57 push %edi + 556: 56 push %esi + 557: e8 a7 fe ff ff call 403 + 55c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 55f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 562: 0f b6 13 movzbl (%ebx),%edx + 565: 83 c3 01 add $0x1,%ebx + 568: 84 d2 test %dl,%dl + 56a: 74 24 je 590 + c = fmt[i] & 0xff; + 56c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 56f: 85 c9 test %ecx,%ecx + 571: 74 cd je 540 + } + } + else if (state == '%') { + 573: 83 f9 25 cmp $0x25,%ecx + 576: 75 ea jne 562 + if (c == 'd') { + 578: 83 f8 25 cmp $0x25,%eax + 57b: 0f 84 07 01 00 00 je 688 + 581: 83 e8 63 sub $0x63,%eax + 584: 83 f8 15 cmp $0x15,%eax + 587: 77 17 ja 5a0 + 589: ff 24 85 64 08 00 00 jmp *0x864(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 590: 8d 65 f4 lea -0xc(%ebp),%esp + 593: 5b pop %ebx + 594: 5e pop %esi + 595: 5f pop %edi + 596: 5d pop %ebp + 597: c3 ret + 598: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 59f: 90 nop + write(fd, &c, 1); + 5a0: 83 ec 04 sub $0x4,%esp + 5a3: 88 55 d4 mov %dl,-0x2c(%ebp) + 5a6: 6a 01 push $0x1 + 5a8: 57 push %edi + 5a9: 56 push %esi + 5aa: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 5ae: e8 50 fe ff ff call 403 + putc(fd, c); + 5b3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 5b7: 83 c4 0c add $0xc,%esp + 5ba: 88 55 e7 mov %dl,-0x19(%ebp) + 5bd: 6a 01 push $0x1 + 5bf: 57 push %edi + 5c0: 56 push %esi + 5c1: e8 3d fe ff ff call 403 + putc(fd, c); + 5c6: 83 c4 10 add $0x10,%esp + state = 0; + 5c9: 31 c9 xor %ecx,%ecx + 5cb: eb 95 jmp 562 + 5cd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 5d0: 83 ec 0c sub $0xc,%esp + 5d3: b9 10 00 00 00 mov $0x10,%ecx + 5d8: 6a 00 push $0x0 + 5da: 8b 45 d0 mov -0x30(%ebp),%eax + 5dd: 8b 10 mov (%eax),%edx + 5df: 89 f0 mov %esi,%eax + 5e1: e8 7a fe ff ff call 460 + ap++; + 5e6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 5ea: 83 c4 10 add $0x10,%esp + state = 0; + 5ed: 31 c9 xor %ecx,%ecx + 5ef: e9 6e ff ff ff jmp 562 + 5f4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 5f8: 8b 45 d0 mov -0x30(%ebp),%eax + 5fb: 8b 10 mov (%eax),%edx + ap++; + 5fd: 83 c0 04 add $0x4,%eax + 600: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 603: 85 d2 test %edx,%edx + 605: 0f 84 8d 00 00 00 je 698 + while (*s != 0) { + 60b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 60e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 610: 84 c0 test %al,%al + 612: 0f 84 4a ff ff ff je 562 + 618: 89 5d d4 mov %ebx,-0x2c(%ebp) + 61b: 89 d3 mov %edx,%ebx + 61d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 620: 83 ec 04 sub $0x4,%esp + s++; + 623: 83 c3 01 add $0x1,%ebx + 626: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 629: 6a 01 push $0x1 + 62b: 57 push %edi + 62c: 56 push %esi + 62d: e8 d1 fd ff ff call 403 + while (*s != 0) { + 632: 0f b6 03 movzbl (%ebx),%eax + 635: 83 c4 10 add $0x10,%esp + 638: 84 c0 test %al,%al + 63a: 75 e4 jne 620 + state = 0; + 63c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 63f: 31 c9 xor %ecx,%ecx + 641: e9 1c ff ff ff jmp 562 + 646: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 64d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 650: 83 ec 0c sub $0xc,%esp + 653: b9 0a 00 00 00 mov $0xa,%ecx + 658: 6a 01 push $0x1 + 65a: e9 7b ff ff ff jmp 5da + 65f: 90 nop + putc(fd, *ap); + 660: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 663: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 666: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 668: 6a 01 push $0x1 + 66a: 57 push %edi + 66b: 56 push %esi + putc(fd, *ap); + 66c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 66f: e8 8f fd ff ff call 403 + ap++; + 674: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 678: 83 c4 10 add $0x10,%esp + state = 0; + 67b: 31 c9 xor %ecx,%ecx + 67d: e9 e0 fe ff ff jmp 562 + 682: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 688: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 68b: 83 ec 04 sub $0x4,%esp + 68e: e9 2a ff ff ff jmp 5bd + 693: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 697: 90 nop + s = "(null)"; + 698: ba 5b 08 00 00 mov $0x85b,%edx + while (*s != 0) { + 69d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 6a0: b8 28 00 00 00 mov $0x28,%eax + 6a5: 89 d3 mov %edx,%ebx + 6a7: e9 74 ff ff ff jmp 620 + 6ac: 66 90 xchg %ax,%ax + 6ae: 66 90 xchg %ax,%ax + +000006b0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 6b0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 6b1: a1 74 0b 00 00 mov 0xb74,%eax +void free(void *ap) { + 6b6: 89 e5 mov %esp,%ebp + 6b8: 57 push %edi + 6b9: 56 push %esi + 6ba: 53 push %ebx + 6bb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 6be: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 6c1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6c8: 89 c2 mov %eax,%edx + 6ca: 8b 00 mov (%eax),%eax + 6cc: 39 ca cmp %ecx,%edx + 6ce: 73 30 jae 700 + 6d0: 39 c1 cmp %eax,%ecx + 6d2: 72 04 jb 6d8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 6d4: 39 c2 cmp %eax,%edx + 6d6: 72 f0 jb 6c8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 6d8: 8b 73 fc mov -0x4(%ebx),%esi + 6db: 8d 3c f1 lea (%ecx,%esi,8),%edi + 6de: 39 f8 cmp %edi,%eax + 6e0: 74 30 je 712 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 6e2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 6e5: 8b 42 04 mov 0x4(%edx),%eax + 6e8: 8d 34 c2 lea (%edx,%eax,8),%esi + 6eb: 39 f1 cmp %esi,%ecx + 6ed: 74 3a je 729 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 6ef: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 6f1: 5b pop %ebx + freep = p; + 6f2: 89 15 74 0b 00 00 mov %edx,0xb74 +} + 6f8: 5e pop %esi + 6f9: 5f pop %edi + 6fa: 5d pop %ebp + 6fb: c3 ret + 6fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 700: 39 c2 cmp %eax,%edx + 702: 72 c4 jb 6c8 + 704: 39 c1 cmp %eax,%ecx + 706: 73 c0 jae 6c8 + if (bp + bp->s.size == p->s.ptr) { + 708: 8b 73 fc mov -0x4(%ebx),%esi + 70b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 70e: 39 f8 cmp %edi,%eax + 710: 75 d0 jne 6e2 + bp->s.size += p->s.ptr->s.size; + 712: 03 70 04 add 0x4(%eax),%esi + 715: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 718: 8b 02 mov (%edx),%eax + 71a: 8b 00 mov (%eax),%eax + 71c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 71f: 8b 42 04 mov 0x4(%edx),%eax + 722: 8d 34 c2 lea (%edx,%eax,8),%esi + 725: 39 f1 cmp %esi,%ecx + 727: 75 c6 jne 6ef + p->s.size += bp->s.size; + 729: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 72c: 89 15 74 0b 00 00 mov %edx,0xb74 + p->s.size += bp->s.size; + 732: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 735: 8b 4b f8 mov -0x8(%ebx),%ecx + 738: 89 0a mov %ecx,(%edx) +} + 73a: 5b pop %ebx + 73b: 5e pop %esi + 73c: 5f pop %edi + 73d: 5d pop %ebp + 73e: c3 ret + 73f: 90 nop + +00000740 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 740: 55 push %ebp + 741: 89 e5 mov %esp,%ebp + 743: 57 push %edi + 744: 56 push %esi + 745: 53 push %ebx + 746: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 749: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 74c: 8b 3d 74 0b 00 00 mov 0xb74,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 752: 8d 70 07 lea 0x7(%eax),%esi + 755: c1 ee 03 shr $0x3,%esi + 758: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 75b: 85 ff test %edi,%edi + 75d: 0f 84 9d 00 00 00 je 800 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 763: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 765: 8b 4a 04 mov 0x4(%edx),%ecx + 768: 39 f1 cmp %esi,%ecx + 76a: 73 6a jae 7d6 + 76c: bb 00 10 00 00 mov $0x1000,%ebx + 771: 39 de cmp %ebx,%esi + 773: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 776: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 77d: 89 45 e4 mov %eax,-0x1c(%ebp) + 780: eb 17 jmp 799 + 782: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 788: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 78a: 8b 48 04 mov 0x4(%eax),%ecx + 78d: 39 f1 cmp %esi,%ecx + 78f: 73 4f jae 7e0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 791: 8b 3d 74 0b 00 00 mov 0xb74,%edi + 797: 89 c2 mov %eax,%edx + 799: 39 d7 cmp %edx,%edi + 79b: 75 eb jne 788 + p = sbrk(nu * sizeof(Header)); + 79d: 83 ec 0c sub $0xc,%esp + 7a0: ff 75 e4 push -0x1c(%ebp) + 7a3: e8 3b fc ff ff call 3e3 + if (p == (char*)-1) { + 7a8: 83 c4 10 add $0x10,%esp + 7ab: 83 f8 ff cmp $0xffffffff,%eax + 7ae: 74 1c je 7cc + hp->s.size = nu; + 7b0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 7b3: 83 ec 0c sub $0xc,%esp + 7b6: 83 c0 08 add $0x8,%eax + 7b9: 50 push %eax + 7ba: e8 f1 fe ff ff call 6b0 + return freep; + 7bf: 8b 15 74 0b 00 00 mov 0xb74,%edx + if ((p = morecore(nunits)) == 0) { + 7c5: 83 c4 10 add $0x10,%esp + 7c8: 85 d2 test %edx,%edx + 7ca: 75 bc jne 788 + return 0; + } + } + } +} + 7cc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 7cf: 31 c0 xor %eax,%eax +} + 7d1: 5b pop %ebx + 7d2: 5e pop %esi + 7d3: 5f pop %edi + 7d4: 5d pop %ebp + 7d5: c3 ret + if (p->s.size >= nunits) { + 7d6: 89 d0 mov %edx,%eax + 7d8: 89 fa mov %edi,%edx + 7da: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 7e0: 39 ce cmp %ecx,%esi + 7e2: 74 4c je 830 + p->s.size -= nunits; + 7e4: 29 f1 sub %esi,%ecx + 7e6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 7e9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 7ec: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 7ef: 89 15 74 0b 00 00 mov %edx,0xb74 +} + 7f5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 7f8: 83 c0 08 add $0x8,%eax +} + 7fb: 5b pop %ebx + 7fc: 5e pop %esi + 7fd: 5f pop %edi + 7fe: 5d pop %ebp + 7ff: c3 ret + base.s.ptr = freep = prevp = &base; + 800: c7 05 74 0b 00 00 78 movl $0xb78,0xb74 + 807: 0b 00 00 + base.s.size = 0; + 80a: bf 78 0b 00 00 mov $0xb78,%edi + base.s.ptr = freep = prevp = &base; + 80f: c7 05 78 0b 00 00 78 movl $0xb78,0xb78 + 816: 0b 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 819: 89 fa mov %edi,%edx + base.s.size = 0; + 81b: c7 05 7c 0b 00 00 00 movl $0x0,0xb7c + 822: 00 00 00 + if (p->s.size >= nunits) { + 825: e9 42 ff ff ff jmp 76c + 82a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 830: 8b 08 mov (%eax),%ecx + 832: 89 0a mov %ecx,(%edx) + 834: eb b9 jmp 7ef diff --git a/stressfs.d b/stressfs.d new file mode 100644 index 0000000..7d5de54 --- /dev/null +++ b/stressfs.d @@ -0,0 +1,2 @@ +stressfs.o: stressfs.c /usr/include/stdc-predef.h types.h stat.h user.h \ + fs.h fcntl.h diff --git a/stressfs.o b/stressfs.o new file mode 100644 index 0000000000000000000000000000000000000000..54dea28d91065bd997bc77d2b3f3627023f46b05 GIT binary patch literal 4784 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 literal 0 HcmV?d00001 diff --git a/swtch.o b/swtch.o new file mode 100644 index 0000000000000000000000000000000000000000..29c6b7d7944f9b2158d89ffce3c8dc7313e2e58c GIT binary patch literal 1204 zcma)5%Wl&^6uncYr95g99uiV3WJ4)PAO`{q7DyEF5~3iaP>`T)WD_@y)TGE`pk2YX zYL_he3VwkNAJ9)=!9TF!oUt!)Ho%qc+;d-N#&^aa?=L+t#)yg$Pez`|%0!X5;mjpD zF23yDo3HIXpPycCzj(PD>>hO1Uax+;jRH^3Vm0QMKZDh=g3E~gkiXf8+6B|3WAu)g z$4|mAJm0*AHJmVLIER8_yV{>4oGzMV8g>C{KADEpryAyj@%&l;f`4+-Rm@>6d!5fk zdx`Z3%|Y7j$4$H5Y46x)*;cO^Tbo)tNQZe#9zIA6FSTt=S5Bct&|j?tpMUdB(A_6#jPpWjX!l-BiO7+Nop-5KO@ z0-I-r-B6UL+qp#DIFBVttd%HBH=}Nvyz6x~`@^*A_lN6SD0R6wNwV~PH5+H~u$O|M zC;&fB^M5jnGG4e&kZ-Mecg#^jC^1Ij@&T$Bd1TK5BqZI>w)t@{l?=v`p| literal 0 HcmV?d00001 diff --git a/syscall.d b/syscall.d new file mode 100644 index 0000000..07012da --- /dev/null +++ b/syscall.d @@ -0,0 +1,2 @@ +syscall.o: syscall.c /usr/include/stdc-predef.h types.h defs.h param.h \ + memlayout.h mmu.h proc.h x86.h syscall.h syscalltable.h diff --git a/syscall.h b/syscall.h new file mode 100644 index 0000000..015ae85 --- /dev/null +++ b/syscall.h @@ -0,0 +1,29 @@ +// Generated by gensyscalls.pl. Do not edit. +// To change syscall numbers or add new syscalls, edit gensyscalls.pl + +#define SYS_fork 1 +#define SYS_exit 2 +#define SYS_wait 3 +#define SYS_pipe 4 +#define SYS_read 5 +#define SYS_kill 6 +#define SYS_exec 7 +#define SYS_fstat 8 +#define SYS_chdir 9 +#define SYS_dup 10 +#define SYS_getpid 11 +#define SYS_sbrk 12 +#define SYS_sleep 13 +#define SYS_uptime 14 +#define SYS_open 15 +#define SYS_write 16 +#define SYS_mknod 17 +#define SYS_unlink 18 +#define SYS_link 19 +#define SYS_mkdir 20 +#define SYS_close 21 +#define SYS_getch 22 +#define SYS_greeting 23 +#define SYS_shutdown 24 +#define SYS_screen 25 +#define SYS_cls 26 diff --git a/syscall.o b/syscall.o new file mode 100644 index 0000000000000000000000000000000000000000..76526bc538b226c8587673dd36043604c32c818c GIT binary patch literal 10664 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 azrzoe|Jvaemn@v1cQwZS$W;QmdjA74U?KAW literal 0 HcmV?d00001 diff --git a/syscalltable.h b/syscalltable.h new file mode 100644 index 0000000..3250768 --- /dev/null +++ b/syscalltable.h @@ -0,0 +1,58 @@ +// Generated by gensyscalls.pl. Do not edit. +// To change syscall numbers or add new syscalls, edit gensyscalls.pl + +extern int sys_fork(void); +extern int sys_exit(void); +extern int sys_wait(void); +extern int sys_pipe(void); +extern int sys_read(void); +extern int sys_kill(void); +extern int sys_exec(void); +extern int sys_fstat(void); +extern int sys_chdir(void); +extern int sys_dup(void); +extern int sys_getpid(void); +extern int sys_sbrk(void); +extern int sys_sleep(void); +extern int sys_uptime(void); +extern int sys_open(void); +extern int sys_write(void); +extern int sys_mknod(void); +extern int sys_unlink(void); +extern int sys_link(void); +extern int sys_mkdir(void); +extern int sys_close(void); +extern int sys_getch(void); +extern int sys_greeting(void); +extern int sys_shutdown(void); +extern int sys_screen(void); +extern int sys_cls(void); + +static int(*syscalls[])(void) = { +[SYS_fork] sys_fork, +[SYS_exit] sys_exit, +[SYS_wait] sys_wait, +[SYS_pipe] sys_pipe, +[SYS_read] sys_read, +[SYS_kill] sys_kill, +[SYS_exec] sys_exec, +[SYS_fstat] sys_fstat, +[SYS_chdir] sys_chdir, +[SYS_dup] sys_dup, +[SYS_getpid] sys_getpid, +[SYS_sbrk] sys_sbrk, +[SYS_sleep] sys_sleep, +[SYS_uptime] sys_uptime, +[SYS_open] sys_open, +[SYS_write] sys_write, +[SYS_mknod] sys_mknod, +[SYS_unlink] sys_unlink, +[SYS_link] sys_link, +[SYS_mkdir] sys_mkdir, +[SYS_close] sys_close, +[SYS_getch] sys_getch, +[SYS_greeting] sys_greeting, +[SYS_shutdown] sys_shutdown, +[SYS_screen] sys_screen, +[SYS_cls] sys_cls, +}; diff --git a/sysfile.d b/sysfile.d new file mode 100644 index 0000000..74f1a20 --- /dev/null +++ b/sysfile.d @@ -0,0 +1,2 @@ +sysfile.o: sysfile.c /usr/include/stdc-predef.h types.h defs.h param.h \ + stat.h mmu.h proc.h fs.h spinlock.h sleeplock.h file.h fcntl.h diff --git a/sysfile.o b/sysfile.o new file mode 100644 index 0000000000000000000000000000000000000000..69db225a68b52dd954de21573401b6b68e6a2f75 GIT binary patch literal 24692 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 literal 0 HcmV?d00001 diff --git a/trapasm.o b/trapasm.o new file mode 100644 index 0000000000000000000000000000000000000000..b5ce65bce314ef462439e6952c8a8a138cdc1245 GIT binary patch literal 1328 zcma)5&ubG=5T4gf(<(N*QNcpRCe}(p+|`G%wY+@iub$1mDfz9>MVxh#5Jx}D_ zR2FF%wIZIla;)sWa^Ku*zxQPK^X`Y6-+zrpqn%+%yKmjsGmAUJ*-sad?nn(^rG8fC z@HI8StR#)~1D*8!rlFK+Q(?Yd4}zs@!P)wqby)TKg(-zy$B~nDP#Sl&leEM2PWq4!Q(+KJQyxyK3`y5bg##A zB<3{c6Gy2?6**HVe;S(OFH<{$3eY9NU1sZtb4^Z#b~rQYTCUAL4AJI`pKSM29YUvZ zrte!Tj(UC?JxRrH=~Rm!CW-i5Y(?Rt&StMWh>Cu9(B49-iRmzmqsPUlj`g4ufgnpj z4RrK>SVS6M40|W|ev9|c7_k81jjTb4F9^&+&q0`jF&Te3_c1<$+qt&N@}0s0_x~%8 z{n$O^Am3FQIc)3<{9=FK5U~C6<=FoC!`VHgcnLX4BZrNx!7uXtK!7ir=jBVad>gRs z9+>hG!gpd}V<8r-&Dd8+4PwDwiMx5&Tz*c@2<1HIeLN^L_)uymB`H literal 0 HcmV?d00001 diff --git a/uart.d b/uart.d new file mode 100644 index 0000000..d156629 --- /dev/null +++ b/uart.d @@ -0,0 +1,2 @@ +uart.o: uart.c /usr/include/stdc-predef.h types.h defs.h param.h traps.h \ + spinlock.h sleeplock.h fs.h file.h mmu.h proc.h x86.h diff --git a/uart.o b/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..555950b4f05baee92438784db378a35140165ad7 GIT binary patch literal 7184 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 Wk-|JIyf2sfbs*8NOiNH%zyAZg9kJ#B literal 0 HcmV?d00001 diff --git a/ulib.d b/ulib.d new file mode 100644 index 0000000..61f575e --- /dev/null +++ b/ulib.d @@ -0,0 +1,2 @@ +ulib.o: ulib.c /usr/include/stdc-predef.h types.h stat.h fcntl.h user.h \ + x86.h diff --git a/ulib.o b/ulib.o new file mode 100644 index 0000000000000000000000000000000000000000..2a6f7b7da97930a40c738b25dbb942a8b1b4e4f2 GIT binary patch literal 7100 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 Fe*iPaHO2q{ literal 0 HcmV?d00001 diff --git a/umalloc.d b/umalloc.d new file mode 100644 index 0000000..cc1d152 --- /dev/null +++ b/umalloc.d @@ -0,0 +1,2 @@ +umalloc.o: umalloc.c /usr/include/stdc-predef.h types.h stat.h user.h \ + param.h diff --git a/umalloc.o b/umalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..2041a138ce9d058a46888d3279fc5d702e1cbaf4 GIT binary patch literal 5272 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 Kw|ym`ulH}wt?R}B literal 0 HcmV?d00001 diff --git a/usertests.asm b/usertests.asm new file mode 100644 index 0000000..5154487 --- /dev/null +++ b/usertests.asm @@ -0,0 +1,6630 @@ + +_usertests: file format elf32-i386 + + +Disassembly of section .text: + +00000000
: +unsigned int rand() { + randstate = randstate * 1664525 + 1013904223; + return randstate; +} + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 51 push %ecx + e: 83 ec 0c sub $0xc,%esp + printf(1, "usertests starting\n"); + 11: 68 66 4d 00 00 push $0x4d66 + 16: 6a 01 push $0x1 + 18: e8 33 3a 00 00 call 3a50 + + if (open("usertests.ran", 0) >= 0) { + 1d: 59 pop %ecx + 1e: 58 pop %eax + 1f: 6a 00 push $0x0 + 21: 68 7a 4d 00 00 push $0x4d7a + 26: e8 10 39 00 00 call 393b + 2b: 83 c4 10 add $0x10,%esp + 2e: 85 c0 test %eax,%eax + 30: 78 13 js 45 + printf(1, "already ran user tests -- rebuild fs.img\n"); + 32: 52 push %edx + 33: 52 push %edx + 34: 68 e4 54 00 00 push $0x54e4 + 39: 6a 01 push $0x1 + 3b: e8 10 3a 00 00 call 3a50 + exit(); + 40: e8 8e 38 00 00 call 38d3 + } + close(open("usertests.ran", O_CREATE)); + 45: 50 push %eax + 46: 50 push %eax + 47: 68 00 02 00 00 push $0x200 + 4c: 68 7a 4d 00 00 push $0x4d7a + 51: e8 e5 38 00 00 call 393b + 56: 89 04 24 mov %eax,(%esp) + 59: e8 0d 39 00 00 call 396b + + argptest(); + 5e: e8 8d 35 00 00 call 35f0 + createdelete(); + 63: e8 b8 11 00 00 call 1220 + linkunlink(); + 68: e8 73 1a 00 00 call 1ae0 + concreate(); + 6d: e8 6e 17 00 00 call 17e0 + fourfiles(); + 72: e8 a9 0f 00 00 call 1020 + sharedfd(); + 77: e8 e4 0d 00 00 call e60 + + bigargtest(); + 7c: e8 2f 32 00 00 call 32b0 + bigwrite(); + 81: e8 7a 23 00 00 call 2400 + bigargtest(); + 86: e8 25 32 00 00 call 32b0 + bsstest(); + 8b: e8 b0 31 00 00 call 3240 + sbrktest(); + 90: e8 ab 2c 00 00 call 2d40 + validatetest(); + 95: e8 f6 30 00 00 call 3190 + + opentest(); + 9a: e8 61 03 00 00 call 400 + writetest(); + 9f: e8 ec 03 00 00 call 490 + writetest1(); + a4: e8 c7 05 00 00 call 670 + createtest(); + a9: e8 92 07 00 00 call 840 + + openiputtest(); + ae: e8 4d 02 00 00 call 300 + exitiputtest(); + b3: e8 48 01 00 00 call 200 + iputtest(); + b8: e8 63 00 00 00 call 120 + + mem(); + bd: e8 ce 0c 00 00 call d90 + pipe1(); + c2: e8 59 09 00 00 call a20 + preempt(); + c7: e8 e4 0a 00 00 call bb0 + exitwait(); + cc: e8 3f 0c 00 00 call d10 + + rmdot(); + d1: e8 1a 27 00 00 call 27f0 + fourteen(); + d6: e8 d5 25 00 00 call 26b0 + bigfile(); + db: e8 00 24 00 00 call 24e0 + subdir(); + e0: e8 3b 1c 00 00 call 1d20 + linktest(); + e5: e8 e6 14 00 00 call 15d0 + unlinkread(); + ea: e8 51 13 00 00 call 1440 + dirfile(); + ef: e8 7c 28 00 00 call 2970 + iref(); + f4: e8 77 2a 00 00 call 2b70 + forktest(); + f9: e8 92 2b 00 00 call 2c90 + bigdir(); // slow + fe: e8 ed 1a 00 00 call 1bf0 + + uio(); + 103: e8 78 34 00 00 call 3580 + + exectest(); + 108: e8 c3 08 00 00 call 9d0 + + exit(); + 10d: e8 c1 37 00 00 call 38d3 + 112: 66 90 xchg %ax,%ax + 114: 66 90 xchg %ax,%ax + 116: 66 90 xchg %ax,%ax + 118: 66 90 xchg %ax,%ax + 11a: 66 90 xchg %ax,%ax + 11c: 66 90 xchg %ax,%ax + 11e: 66 90 xchg %ax,%ax + +00000120 : +void iputtest(void) { + 120: 55 push %ebp + 121: 89 e5 mov %esp,%ebp + 123: 83 ec 10 sub $0x10,%esp + printf(stdout, "iput test\n"); + 126: 68 0c 3e 00 00 push $0x3e0c + 12b: ff 35 68 5e 00 00 push 0x5e68 + 131: e8 1a 39 00 00 call 3a50 + if (mkdir("iputdir") < 0) { + 136: c7 04 24 9f 3d 00 00 movl $0x3d9f,(%esp) + 13d: e8 21 38 00 00 call 3963 + 142: 83 c4 10 add $0x10,%esp + 145: 85 c0 test %eax,%eax + 147: 78 58 js 1a1 + if (chdir("iputdir") < 0) { + 149: 83 ec 0c sub $0xc,%esp + 14c: 68 9f 3d 00 00 push $0x3d9f + 151: e8 b5 37 00 00 call 390b + 156: 83 c4 10 add $0x10,%esp + 159: 85 c0 test %eax,%eax + 15b: 0f 88 85 00 00 00 js 1e6 + if (unlink("../iputdir") < 0) { + 161: 83 ec 0c sub $0xc,%esp + 164: 68 9c 3d 00 00 push $0x3d9c + 169: e8 e5 37 00 00 call 3953 + 16e: 83 c4 10 add $0x10,%esp + 171: 85 c0 test %eax,%eax + 173: 78 5a js 1cf + if (chdir("/") < 0) { + 175: 83 ec 0c sub $0xc,%esp + 178: 68 c1 3d 00 00 push $0x3dc1 + 17d: e8 89 37 00 00 call 390b + 182: 83 c4 10 add $0x10,%esp + 185: 85 c0 test %eax,%eax + 187: 78 2f js 1b8 + printf(stdout, "iput test ok\n"); + 189: 83 ec 08 sub $0x8,%esp + 18c: 68 44 3e 00 00 push $0x3e44 + 191: ff 35 68 5e 00 00 push 0x5e68 + 197: e8 b4 38 00 00 call 3a50 +} + 19c: 83 c4 10 add $0x10,%esp + 19f: c9 leave + 1a0: c3 ret + printf(stdout, "mkdir failed\n"); + 1a1: 50 push %eax + 1a2: 50 push %eax + 1a3: 68 78 3d 00 00 push $0x3d78 + 1a8: ff 35 68 5e 00 00 push 0x5e68 + 1ae: e8 9d 38 00 00 call 3a50 + exit(); + 1b3: e8 1b 37 00 00 call 38d3 + printf(stdout, "chdir / failed\n"); + 1b8: 50 push %eax + 1b9: 50 push %eax + 1ba: 68 c3 3d 00 00 push $0x3dc3 + 1bf: ff 35 68 5e 00 00 push 0x5e68 + 1c5: e8 86 38 00 00 call 3a50 + exit(); + 1ca: e8 04 37 00 00 call 38d3 + printf(stdout, "unlink ../iputdir failed\n"); + 1cf: 52 push %edx + 1d0: 52 push %edx + 1d1: 68 a7 3d 00 00 push $0x3da7 + 1d6: ff 35 68 5e 00 00 push 0x5e68 + 1dc: e8 6f 38 00 00 call 3a50 + exit(); + 1e1: e8 ed 36 00 00 call 38d3 + printf(stdout, "chdir iputdir failed\n"); + 1e6: 51 push %ecx + 1e7: 51 push %ecx + 1e8: 68 86 3d 00 00 push $0x3d86 + 1ed: ff 35 68 5e 00 00 push 0x5e68 + 1f3: e8 58 38 00 00 call 3a50 + exit(); + 1f8: e8 d6 36 00 00 call 38d3 + 1fd: 8d 76 00 lea 0x0(%esi),%esi + +00000200 : +void exitiputtest(void) { + 200: 55 push %ebp + 201: 89 e5 mov %esp,%ebp + 203: 83 ec 10 sub $0x10,%esp + printf(stdout, "exitiput test\n"); + 206: 68 d3 3d 00 00 push $0x3dd3 + 20b: ff 35 68 5e 00 00 push 0x5e68 + 211: e8 3a 38 00 00 call 3a50 + pid = fork(); + 216: e8 b0 36 00 00 call 38cb + if (pid < 0) { + 21b: 83 c4 10 add $0x10,%esp + 21e: 85 c0 test %eax,%eax + 220: 0f 88 8a 00 00 00 js 2b0 + if (pid == 0) { + 226: 75 50 jne 278 + if (mkdir("iputdir") < 0) { + 228: 83 ec 0c sub $0xc,%esp + 22b: 68 9f 3d 00 00 push $0x3d9f + 230: e8 2e 37 00 00 call 3963 + 235: 83 c4 10 add $0x10,%esp + 238: 85 c0 test %eax,%eax + 23a: 0f 88 87 00 00 00 js 2c7 + if (chdir("iputdir") < 0) { + 240: 83 ec 0c sub $0xc,%esp + 243: 68 9f 3d 00 00 push $0x3d9f + 248: e8 be 36 00 00 call 390b + 24d: 83 c4 10 add $0x10,%esp + 250: 85 c0 test %eax,%eax + 252: 0f 88 86 00 00 00 js 2de + if (unlink("../iputdir") < 0) { + 258: 83 ec 0c sub $0xc,%esp + 25b: 68 9c 3d 00 00 push $0x3d9c + 260: e8 ee 36 00 00 call 3953 + 265: 83 c4 10 add $0x10,%esp + 268: 85 c0 test %eax,%eax + 26a: 78 2c js 298 + exit(); + 26c: e8 62 36 00 00 call 38d3 + 271: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + wait(); + 278: e8 5e 36 00 00 call 38db + printf(stdout, "exitiput test ok\n"); + 27d: 83 ec 08 sub $0x8,%esp + 280: 68 f6 3d 00 00 push $0x3df6 + 285: ff 35 68 5e 00 00 push 0x5e68 + 28b: e8 c0 37 00 00 call 3a50 +} + 290: 83 c4 10 add $0x10,%esp + 293: c9 leave + 294: c3 ret + 295: 8d 76 00 lea 0x0(%esi),%esi + printf(stdout, "unlink ../iputdir failed\n"); + 298: 83 ec 08 sub $0x8,%esp + 29b: 68 a7 3d 00 00 push $0x3da7 + 2a0: ff 35 68 5e 00 00 push 0x5e68 + 2a6: e8 a5 37 00 00 call 3a50 + exit(); + 2ab: e8 23 36 00 00 call 38d3 + printf(stdout, "fork failed\n"); + 2b0: 51 push %ecx + 2b1: 51 push %ecx + 2b2: 68 b9 4c 00 00 push $0x4cb9 + 2b7: ff 35 68 5e 00 00 push 0x5e68 + 2bd: e8 8e 37 00 00 call 3a50 + exit(); + 2c2: e8 0c 36 00 00 call 38d3 + printf(stdout, "mkdir failed\n"); + 2c7: 52 push %edx + 2c8: 52 push %edx + 2c9: 68 78 3d 00 00 push $0x3d78 + 2ce: ff 35 68 5e 00 00 push 0x5e68 + 2d4: e8 77 37 00 00 call 3a50 + exit(); + 2d9: e8 f5 35 00 00 call 38d3 + printf(stdout, "child chdir failed\n"); + 2de: 50 push %eax + 2df: 50 push %eax + 2e0: 68 e2 3d 00 00 push $0x3de2 + 2e5: ff 35 68 5e 00 00 push 0x5e68 + 2eb: e8 60 37 00 00 call 3a50 + exit(); + 2f0: e8 de 35 00 00 call 38d3 + 2f5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000300 : +void openiputtest(void) { + 300: 55 push %ebp + 301: 89 e5 mov %esp,%ebp + 303: 83 ec 10 sub $0x10,%esp + printf(stdout, "openiput test\n"); + 306: 68 08 3e 00 00 push $0x3e08 + 30b: ff 35 68 5e 00 00 push 0x5e68 + 311: e8 3a 37 00 00 call 3a50 + if (mkdir("oidir") < 0) { + 316: c7 04 24 17 3e 00 00 movl $0x3e17,(%esp) + 31d: e8 41 36 00 00 call 3963 + 322: 83 c4 10 add $0x10,%esp + 325: 85 c0 test %eax,%eax + 327: 0f 88 9f 00 00 00 js 3cc + pid = fork(); + 32d: e8 99 35 00 00 call 38cb + if (pid < 0) { + 332: 85 c0 test %eax,%eax + 334: 78 7f js 3b5 + if (pid == 0) { + 336: 75 38 jne 370 + int fd = open("oidir", O_RDWR); + 338: 83 ec 08 sub $0x8,%esp + 33b: 6a 02 push $0x2 + 33d: 68 17 3e 00 00 push $0x3e17 + 342: e8 f4 35 00 00 call 393b + if (fd >= 0) { + 347: 83 c4 10 add $0x10,%esp + 34a: 85 c0 test %eax,%eax + 34c: 78 62 js 3b0 + printf(stdout, "open directory for write succeeded\n"); + 34e: 83 ec 08 sub $0x8,%esp + 351: 68 9c 4d 00 00 push $0x4d9c + 356: ff 35 68 5e 00 00 push 0x5e68 + 35c: e8 ef 36 00 00 call 3a50 + exit(); + 361: e8 6d 35 00 00 call 38d3 + 366: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36d: 8d 76 00 lea 0x0(%esi),%esi + sleep(1); + 370: 83 ec 0c sub $0xc,%esp + 373: 6a 01 push $0x1 + 375: e8 b1 35 00 00 call 392b + if (unlink("oidir") != 0) { + 37a: c7 04 24 17 3e 00 00 movl $0x3e17,(%esp) + 381: e8 cd 35 00 00 call 3953 + 386: 83 c4 10 add $0x10,%esp + 389: 85 c0 test %eax,%eax + 38b: 75 56 jne 3e3 + wait(); + 38d: e8 49 35 00 00 call 38db + printf(stdout, "openiput test ok\n"); + 392: 83 ec 08 sub $0x8,%esp + 395: 68 40 3e 00 00 push $0x3e40 + 39a: ff 35 68 5e 00 00 push 0x5e68 + 3a0: e8 ab 36 00 00 call 3a50 +} + 3a5: 83 c4 10 add $0x10,%esp + 3a8: c9 leave + 3a9: c3 ret + 3aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + exit(); + 3b0: e8 1e 35 00 00 call 38d3 + printf(stdout, "fork failed\n"); + 3b5: 52 push %edx + 3b6: 52 push %edx + 3b7: 68 b9 4c 00 00 push $0x4cb9 + 3bc: ff 35 68 5e 00 00 push 0x5e68 + 3c2: e8 89 36 00 00 call 3a50 + exit(); + 3c7: e8 07 35 00 00 call 38d3 + printf(stdout, "mkdir oidir failed\n"); + 3cc: 51 push %ecx + 3cd: 51 push %ecx + 3ce: 68 1d 3e 00 00 push $0x3e1d + 3d3: ff 35 68 5e 00 00 push 0x5e68 + 3d9: e8 72 36 00 00 call 3a50 + exit(); + 3de: e8 f0 34 00 00 call 38d3 + printf(stdout, "unlink failed\n"); + 3e3: 50 push %eax + 3e4: 50 push %eax + 3e5: 68 31 3e 00 00 push $0x3e31 + 3ea: ff 35 68 5e 00 00 push 0x5e68 + 3f0: e8 5b 36 00 00 call 3a50 + exit(); + 3f5: e8 d9 34 00 00 call 38d3 + 3fa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00000400 : +void opentest(void) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 83 ec 10 sub $0x10,%esp + printf(stdout, "open test\n"); + 406: 68 52 3e 00 00 push $0x3e52 + 40b: ff 35 68 5e 00 00 push 0x5e68 + 411: e8 3a 36 00 00 call 3a50 + fd = open("echo", 0); + 416: 58 pop %eax + 417: 5a pop %edx + 418: 6a 00 push $0x0 + 41a: 68 5d 3e 00 00 push $0x3e5d + 41f: e8 17 35 00 00 call 393b + if (fd < 0) { + 424: 83 c4 10 add $0x10,%esp + 427: 85 c0 test %eax,%eax + 429: 78 36 js 461 + close(fd); + 42b: 83 ec 0c sub $0xc,%esp + 42e: 50 push %eax + 42f: e8 37 35 00 00 call 396b + fd = open("doesnotexist", 0); + 434: 5a pop %edx + 435: 59 pop %ecx + 436: 6a 00 push $0x0 + 438: 68 75 3e 00 00 push $0x3e75 + 43d: e8 f9 34 00 00 call 393b + if (fd >= 0) { + 442: 83 c4 10 add $0x10,%esp + 445: 85 c0 test %eax,%eax + 447: 79 2f jns 478 + printf(stdout, "open test ok\n"); + 449: 83 ec 08 sub $0x8,%esp + 44c: 68 a0 3e 00 00 push $0x3ea0 + 451: ff 35 68 5e 00 00 push 0x5e68 + 457: e8 f4 35 00 00 call 3a50 +} + 45c: 83 c4 10 add $0x10,%esp + 45f: c9 leave + 460: c3 ret + printf(stdout, "open echo failed!\n"); + 461: 50 push %eax + 462: 50 push %eax + 463: 68 62 3e 00 00 push $0x3e62 + 468: ff 35 68 5e 00 00 push 0x5e68 + 46e: e8 dd 35 00 00 call 3a50 + exit(); + 473: e8 5b 34 00 00 call 38d3 + printf(stdout, "open doesnotexist succeeded!\n"); + 478: 50 push %eax + 479: 50 push %eax + 47a: 68 82 3e 00 00 push $0x3e82 + 47f: ff 35 68 5e 00 00 push 0x5e68 + 485: e8 c6 35 00 00 call 3a50 + exit(); + 48a: e8 44 34 00 00 call 38d3 + 48f: 90 nop + +00000490 : +void writetest(void) { + 490: 55 push %ebp + 491: 89 e5 mov %esp,%ebp + 493: 56 push %esi + 494: 53 push %ebx + printf(stdout, "small file test\n"); + 495: 83 ec 08 sub $0x8,%esp + 498: 68 ae 3e 00 00 push $0x3eae + 49d: ff 35 68 5e 00 00 push 0x5e68 + 4a3: e8 a8 35 00 00 call 3a50 + fd = open("small", O_CREATE | O_RDWR); + 4a8: 58 pop %eax + 4a9: 5a pop %edx + 4aa: 68 02 02 00 00 push $0x202 + 4af: 68 bf 3e 00 00 push $0x3ebf + 4b4: e8 82 34 00 00 call 393b + if (fd >= 0) { + 4b9: 83 c4 10 add $0x10,%esp + 4bc: 85 c0 test %eax,%eax + 4be: 0f 88 88 01 00 00 js 64c + printf(stdout, "creat small succeeded; ok\n"); + 4c4: 83 ec 08 sub $0x8,%esp + 4c7: 89 c6 mov %eax,%esi + for (i = 0; i < 100; i++) { + 4c9: 31 db xor %ebx,%ebx + printf(stdout, "creat small succeeded; ok\n"); + 4cb: 68 c5 3e 00 00 push $0x3ec5 + 4d0: ff 35 68 5e 00 00 push 0x5e68 + 4d6: e8 75 35 00 00 call 3a50 + 4db: 83 c4 10 add $0x10,%esp + 4de: 66 90 xchg %ax,%ax + if (write(fd, "aaaaaaaaaa", 10) != 10) { + 4e0: 83 ec 04 sub $0x4,%esp + 4e3: 6a 0a push $0xa + 4e5: 68 fc 3e 00 00 push $0x3efc + 4ea: 56 push %esi + 4eb: e8 53 34 00 00 call 3943 + 4f0: 83 c4 10 add $0x10,%esp + 4f3: 83 f8 0a cmp $0xa,%eax + 4f6: 0f 85 d9 00 00 00 jne 5d5 + if (write(fd, "bbbbbbbbbb", 10) != 10) { + 4fc: 83 ec 04 sub $0x4,%esp + 4ff: 6a 0a push $0xa + 501: 68 07 3f 00 00 push $0x3f07 + 506: 56 push %esi + 507: e8 37 34 00 00 call 3943 + 50c: 83 c4 10 add $0x10,%esp + 50f: 83 f8 0a cmp $0xa,%eax + 512: 0f 85 d6 00 00 00 jne 5ee + for (i = 0; i < 100; i++) { + 518: 83 c3 01 add $0x1,%ebx + 51b: 83 fb 64 cmp $0x64,%ebx + 51e: 75 c0 jne 4e0 + printf(stdout, "writes ok\n"); + 520: 83 ec 08 sub $0x8,%esp + 523: 68 12 3f 00 00 push $0x3f12 + 528: ff 35 68 5e 00 00 push 0x5e68 + 52e: e8 1d 35 00 00 call 3a50 + close(fd); + 533: 89 34 24 mov %esi,(%esp) + 536: e8 30 34 00 00 call 396b + fd = open("small", O_RDONLY); + 53b: 5b pop %ebx + 53c: 5e pop %esi + 53d: 6a 00 push $0x0 + 53f: 68 bf 3e 00 00 push $0x3ebf + 544: e8 f2 33 00 00 call 393b + if (fd >= 0) { + 549: 83 c4 10 add $0x10,%esp + fd = open("small", O_RDONLY); + 54c: 89 c3 mov %eax,%ebx + if (fd >= 0) { + 54e: 85 c0 test %eax,%eax + 550: 0f 88 b1 00 00 00 js 607 + printf(stdout, "open small succeeded ok\n"); + 556: 83 ec 08 sub $0x8,%esp + 559: 68 1d 3f 00 00 push $0x3f1d + 55e: ff 35 68 5e 00 00 push 0x5e68 + 564: e8 e7 34 00 00 call 3a50 + i = read(fd, buf, 2000); + 569: 83 c4 0c add $0xc,%esp + 56c: 68 d0 07 00 00 push $0x7d0 + 571: 68 a0 85 00 00 push $0x85a0 + 576: 53 push %ebx + 577: e8 6f 33 00 00 call 38eb + if (i == 2000) { + 57c: 83 c4 10 add $0x10,%esp + 57f: 3d d0 07 00 00 cmp $0x7d0,%eax + 584: 0f 85 94 00 00 00 jne 61e + printf(stdout, "read succeeded ok\n"); + 58a: 83 ec 08 sub $0x8,%esp + 58d: 68 51 3f 00 00 push $0x3f51 + 592: ff 35 68 5e 00 00 push 0x5e68 + 598: e8 b3 34 00 00 call 3a50 + close(fd); + 59d: 89 1c 24 mov %ebx,(%esp) + 5a0: e8 c6 33 00 00 call 396b + if (unlink("small") < 0) { + 5a5: c7 04 24 bf 3e 00 00 movl $0x3ebf,(%esp) + 5ac: e8 a2 33 00 00 call 3953 + 5b1: 83 c4 10 add $0x10,%esp + 5b4: 85 c0 test %eax,%eax + 5b6: 78 7d js 635 + printf(stdout, "small file test ok\n"); + 5b8: 83 ec 08 sub $0x8,%esp + 5bb: 68 79 3f 00 00 push $0x3f79 + 5c0: ff 35 68 5e 00 00 push 0x5e68 + 5c6: e8 85 34 00 00 call 3a50 +} + 5cb: 83 c4 10 add $0x10,%esp + 5ce: 8d 65 f8 lea -0x8(%ebp),%esp + 5d1: 5b pop %ebx + 5d2: 5e pop %esi + 5d3: 5d pop %ebp + 5d4: c3 ret + printf(stdout, "error: write aa %d new file failed\n", i); + 5d5: 83 ec 04 sub $0x4,%esp + 5d8: 53 push %ebx + 5d9: 68 c0 4d 00 00 push $0x4dc0 + 5de: ff 35 68 5e 00 00 push 0x5e68 + 5e4: e8 67 34 00 00 call 3a50 + exit(); + 5e9: e8 e5 32 00 00 call 38d3 + printf(stdout, "error: write bb %d new file failed\n", i); + 5ee: 83 ec 04 sub $0x4,%esp + 5f1: 53 push %ebx + 5f2: 68 e4 4d 00 00 push $0x4de4 + 5f7: ff 35 68 5e 00 00 push 0x5e68 + 5fd: e8 4e 34 00 00 call 3a50 + exit(); + 602: e8 cc 32 00 00 call 38d3 + printf(stdout, "error: open small failed!\n"); + 607: 51 push %ecx + 608: 51 push %ecx + 609: 68 36 3f 00 00 push $0x3f36 + 60e: ff 35 68 5e 00 00 push 0x5e68 + 614: e8 37 34 00 00 call 3a50 + exit(); + 619: e8 b5 32 00 00 call 38d3 + printf(stdout, "read failed\n"); + 61e: 52 push %edx + 61f: 52 push %edx + 620: 68 7d 42 00 00 push $0x427d + 625: ff 35 68 5e 00 00 push 0x5e68 + 62b: e8 20 34 00 00 call 3a50 + exit(); + 630: e8 9e 32 00 00 call 38d3 + printf(stdout, "unlink small failed\n"); + 635: 50 push %eax + 636: 50 push %eax + 637: 68 64 3f 00 00 push $0x3f64 + 63c: ff 35 68 5e 00 00 push 0x5e68 + 642: e8 09 34 00 00 call 3a50 + exit(); + 647: e8 87 32 00 00 call 38d3 + printf(stdout, "error: creat small failed!\n"); + 64c: 50 push %eax + 64d: 50 push %eax + 64e: 68 e0 3e 00 00 push $0x3ee0 + 653: ff 35 68 5e 00 00 push 0x5e68 + 659: e8 f2 33 00 00 call 3a50 + exit(); + 65e: e8 70 32 00 00 call 38d3 + 663: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 66a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00000670 : +void writetest1(void) { + 670: 55 push %ebp + 671: 89 e5 mov %esp,%ebp + 673: 56 push %esi + 674: 53 push %ebx + printf(stdout, "big files test\n"); + 675: 83 ec 08 sub $0x8,%esp + 678: 68 8d 3f 00 00 push $0x3f8d + 67d: ff 35 68 5e 00 00 push 0x5e68 + 683: e8 c8 33 00 00 call 3a50 + fd = open("big", O_CREATE | O_RDWR); + 688: 58 pop %eax + 689: 5a pop %edx + 68a: 68 02 02 00 00 push $0x202 + 68f: 68 07 40 00 00 push $0x4007 + 694: e8 a2 32 00 00 call 393b + if (fd < 0) { + 699: 83 c4 10 add $0x10,%esp + 69c: 85 c0 test %eax,%eax + 69e: 0f 88 61 01 00 00 js 805 + 6a4: 89 c6 mov %eax,%esi + for (i = 0; i < MAXFILE; i++) { + 6a6: 31 db xor %ebx,%ebx + 6a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 6af: 90 nop + if (write(fd, buf, 512) != 512) { + 6b0: 83 ec 04 sub $0x4,%esp + ((int*)buf)[0] = i; + 6b3: 89 1d a0 85 00 00 mov %ebx,0x85a0 + if (write(fd, buf, 512) != 512) { + 6b9: 68 00 02 00 00 push $0x200 + 6be: 68 a0 85 00 00 push $0x85a0 + 6c3: 56 push %esi + 6c4: e8 7a 32 00 00 call 3943 + 6c9: 83 c4 10 add $0x10,%esp + 6cc: 3d 00 02 00 00 cmp $0x200,%eax + 6d1: 0f 85 b3 00 00 00 jne 78a + for (i = 0; i < MAXFILE; i++) { + 6d7: 83 c3 01 add $0x1,%ebx + 6da: 81 fb 8c 00 00 00 cmp $0x8c,%ebx + 6e0: 75 ce jne 6b0 + close(fd); + 6e2: 83 ec 0c sub $0xc,%esp + 6e5: 56 push %esi + 6e6: e8 80 32 00 00 call 396b + fd = open("big", O_RDONLY); + 6eb: 5b pop %ebx + 6ec: 5e pop %esi + 6ed: 6a 00 push $0x0 + 6ef: 68 07 40 00 00 push $0x4007 + 6f4: e8 42 32 00 00 call 393b + if (fd < 0) { + 6f9: 83 c4 10 add $0x10,%esp + fd = open("big", O_RDONLY); + 6fc: 89 c3 mov %eax,%ebx + if (fd < 0) { + 6fe: 85 c0 test %eax,%eax + 700: 0f 88 e8 00 00 00 js 7ee + n = 0; + 706: 31 f6 xor %esi,%esi + 708: eb 1d jmp 727 + 70a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + else if (i != 512) { + 710: 3d 00 02 00 00 cmp $0x200,%eax + 715: 0f 85 9f 00 00 00 jne 7ba + if (((int*)buf)[0] != n) { + 71b: a1 a0 85 00 00 mov 0x85a0,%eax + 720: 39 f0 cmp %esi,%eax + 722: 75 7f jne 7a3 + n++; + 724: 83 c6 01 add $0x1,%esi + i = read(fd, buf, 512); + 727: 83 ec 04 sub $0x4,%esp + 72a: 68 00 02 00 00 push $0x200 + 72f: 68 a0 85 00 00 push $0x85a0 + 734: 53 push %ebx + 735: e8 b1 31 00 00 call 38eb + if (i == 0) { + 73a: 83 c4 10 add $0x10,%esp + 73d: 85 c0 test %eax,%eax + 73f: 75 cf jne 710 + if (n == MAXFILE - 1) { + 741: 81 fe 8b 00 00 00 cmp $0x8b,%esi + 747: 0f 84 86 00 00 00 je 7d3 + close(fd); + 74d: 83 ec 0c sub $0xc,%esp + 750: 53 push %ebx + 751: e8 15 32 00 00 call 396b + if (unlink("big") < 0) { + 756: c7 04 24 07 40 00 00 movl $0x4007,(%esp) + 75d: e8 f1 31 00 00 call 3953 + 762: 83 c4 10 add $0x10,%esp + 765: 85 c0 test %eax,%eax + 767: 0f 88 af 00 00 00 js 81c + printf(stdout, "big files ok\n"); + 76d: 83 ec 08 sub $0x8,%esp + 770: 68 2e 40 00 00 push $0x402e + 775: ff 35 68 5e 00 00 push 0x5e68 + 77b: e8 d0 32 00 00 call 3a50 +} + 780: 83 c4 10 add $0x10,%esp + 783: 8d 65 f8 lea -0x8(%ebp),%esp + 786: 5b pop %ebx + 787: 5e pop %esi + 788: 5d pop %ebp + 789: c3 ret + printf(stdout, "error: write big file failed\n", i); + 78a: 83 ec 04 sub $0x4,%esp + 78d: 53 push %ebx + 78e: 68 b7 3f 00 00 push $0x3fb7 + 793: ff 35 68 5e 00 00 push 0x5e68 + 799: e8 b2 32 00 00 call 3a50 + exit(); + 79e: e8 30 31 00 00 call 38d3 + printf(stdout, "read content of block %d is %d\n", + 7a3: 50 push %eax + 7a4: 56 push %esi + 7a5: 68 08 4e 00 00 push $0x4e08 + 7aa: ff 35 68 5e 00 00 push 0x5e68 + 7b0: e8 9b 32 00 00 call 3a50 + exit(); + 7b5: e8 19 31 00 00 call 38d3 + printf(stdout, "read failed %d\n", i); + 7ba: 83 ec 04 sub $0x4,%esp + 7bd: 50 push %eax + 7be: 68 0b 40 00 00 push $0x400b + 7c3: ff 35 68 5e 00 00 push 0x5e68 + 7c9: e8 82 32 00 00 call 3a50 + exit(); + 7ce: e8 00 31 00 00 call 38d3 + printf(stdout, "read only %d blocks from big", n); + 7d3: 52 push %edx + 7d4: 68 8b 00 00 00 push $0x8b + 7d9: 68 ee 3f 00 00 push $0x3fee + 7de: ff 35 68 5e 00 00 push 0x5e68 + 7e4: e8 67 32 00 00 call 3a50 + exit(); + 7e9: e8 e5 30 00 00 call 38d3 + printf(stdout, "error: open big failed!\n"); + 7ee: 51 push %ecx + 7ef: 51 push %ecx + 7f0: 68 d5 3f 00 00 push $0x3fd5 + 7f5: ff 35 68 5e 00 00 push 0x5e68 + 7fb: e8 50 32 00 00 call 3a50 + exit(); + 800: e8 ce 30 00 00 call 38d3 + printf(stdout, "error: creat big failed!\n"); + 805: 50 push %eax + 806: 50 push %eax + 807: 68 9d 3f 00 00 push $0x3f9d + 80c: ff 35 68 5e 00 00 push 0x5e68 + 812: e8 39 32 00 00 call 3a50 + exit(); + 817: e8 b7 30 00 00 call 38d3 + printf(stdout, "unlink big failed\n"); + 81c: 50 push %eax + 81d: 50 push %eax + 81e: 68 1b 40 00 00 push $0x401b + 823: ff 35 68 5e 00 00 push 0x5e68 + 829: e8 22 32 00 00 call 3a50 + exit(); + 82e: e8 a0 30 00 00 call 38d3 + 833: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 83a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00000840 : +void createtest(void) { + 840: 55 push %ebp + 841: 89 e5 mov %esp,%ebp + 843: 53 push %ebx + name[2] = '\0'; + 844: bb 30 00 00 00 mov $0x30,%ebx +void createtest(void) { + 849: 83 ec 0c sub $0xc,%esp + printf(stdout, "many creates, followed by unlink test\n"); + 84c: 68 28 4e 00 00 push $0x4e28 + 851: ff 35 68 5e 00 00 push 0x5e68 + 857: e8 f4 31 00 00 call 3a50 + name[0] = 'a'; + 85c: c6 05 90 85 00 00 61 movb $0x61,0x8590 + name[2] = '\0'; + 863: 83 c4 10 add $0x10,%esp + 866: c6 05 92 85 00 00 00 movb $0x0,0x8592 + for (i = 0; i < 52; i++) { + 86d: 8d 76 00 lea 0x0(%esi),%esi + fd = open(name, O_CREATE | O_RDWR); + 870: 83 ec 08 sub $0x8,%esp + name[1] = '0' + i; + 873: 88 1d 91 85 00 00 mov %bl,0x8591 + for (i = 0; i < 52; i++) { + 879: 83 c3 01 add $0x1,%ebx + fd = open(name, O_CREATE | O_RDWR); + 87c: 68 02 02 00 00 push $0x202 + 881: 68 90 85 00 00 push $0x8590 + 886: e8 b0 30 00 00 call 393b + close(fd); + 88b: 89 04 24 mov %eax,(%esp) + 88e: e8 d8 30 00 00 call 396b + for (i = 0; i < 52; i++) { + 893: 83 c4 10 add $0x10,%esp + 896: 80 fb 64 cmp $0x64,%bl + 899: 75 d5 jne 870 + name[0] = 'a'; + 89b: c6 05 90 85 00 00 61 movb $0x61,0x8590 + name[2] = '\0'; + 8a2: bb 30 00 00 00 mov $0x30,%ebx + 8a7: c6 05 92 85 00 00 00 movb $0x0,0x8592 + for (i = 0; i < 52; i++) { + 8ae: 66 90 xchg %ax,%ax + unlink(name); + 8b0: 83 ec 0c sub $0xc,%esp + name[1] = '0' + i; + 8b3: 88 1d 91 85 00 00 mov %bl,0x8591 + for (i = 0; i < 52; i++) { + 8b9: 83 c3 01 add $0x1,%ebx + unlink(name); + 8bc: 68 90 85 00 00 push $0x8590 + 8c1: e8 8d 30 00 00 call 3953 + for (i = 0; i < 52; i++) { + 8c6: 83 c4 10 add $0x10,%esp + 8c9: 80 fb 64 cmp $0x64,%bl + 8cc: 75 e2 jne 8b0 + printf(stdout, "many creates, followed by unlink; ok\n"); + 8ce: 83 ec 08 sub $0x8,%esp + 8d1: 68 50 4e 00 00 push $0x4e50 + 8d6: ff 35 68 5e 00 00 push 0x5e68 + 8dc: e8 6f 31 00 00 call 3a50 +} + 8e1: 8b 5d fc mov -0x4(%ebp),%ebx + 8e4: 83 c4 10 add $0x10,%esp + 8e7: c9 leave + 8e8: c3 ret + 8e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000008f0 : +void dirtest(void){ + 8f0: 55 push %ebp + 8f1: 89 e5 mov %esp,%ebp + 8f3: 83 ec 10 sub $0x10,%esp + printf(stdout, "mkdir test\n"); + 8f6: 68 3c 40 00 00 push $0x403c + 8fb: ff 35 68 5e 00 00 push 0x5e68 + 901: e8 4a 31 00 00 call 3a50 + if (mkdir("dir0") < 0) { + 906: c7 04 24 48 40 00 00 movl $0x4048,(%esp) + 90d: e8 51 30 00 00 call 3963 + 912: 83 c4 10 add $0x10,%esp + 915: 85 c0 test %eax,%eax + 917: 78 58 js 971 + if (chdir("dir0") < 0) { + 919: 83 ec 0c sub $0xc,%esp + 91c: 68 48 40 00 00 push $0x4048 + 921: e8 e5 2f 00 00 call 390b + 926: 83 c4 10 add $0x10,%esp + 929: 85 c0 test %eax,%eax + 92b: 0f 88 85 00 00 00 js 9b6 + if (chdir("..") < 0) { + 931: 83 ec 0c sub $0xc,%esp + 934: 68 ed 45 00 00 push $0x45ed + 939: e8 cd 2f 00 00 call 390b + 93e: 83 c4 10 add $0x10,%esp + 941: 85 c0 test %eax,%eax + 943: 78 5a js 99f + if (unlink("dir0") < 0) { + 945: 83 ec 0c sub $0xc,%esp + 948: 68 48 40 00 00 push $0x4048 + 94d: e8 01 30 00 00 call 3953 + 952: 83 c4 10 add $0x10,%esp + 955: 85 c0 test %eax,%eax + 957: 78 2f js 988 + printf(stdout, "mkdir test ok\n"); + 959: 83 ec 08 sub $0x8,%esp + 95c: 68 85 40 00 00 push $0x4085 + 961: ff 35 68 5e 00 00 push 0x5e68 + 967: e8 e4 30 00 00 call 3a50 +} + 96c: 83 c4 10 add $0x10,%esp + 96f: c9 leave + 970: c3 ret + printf(stdout, "mkdir failed\n"); + 971: 50 push %eax + 972: 50 push %eax + 973: 68 78 3d 00 00 push $0x3d78 + 978: ff 35 68 5e 00 00 push 0x5e68 + 97e: e8 cd 30 00 00 call 3a50 + exit(); + 983: e8 4b 2f 00 00 call 38d3 + printf(stdout, "unlink dir0 failed\n"); + 988: 50 push %eax + 989: 50 push %eax + 98a: 68 71 40 00 00 push $0x4071 + 98f: ff 35 68 5e 00 00 push 0x5e68 + 995: e8 b6 30 00 00 call 3a50 + exit(); + 99a: e8 34 2f 00 00 call 38d3 + printf(stdout, "chdir .. failed\n"); + 99f: 52 push %edx + 9a0: 52 push %edx + 9a1: 68 60 40 00 00 push $0x4060 + 9a6: ff 35 68 5e 00 00 push 0x5e68 + 9ac: e8 9f 30 00 00 call 3a50 + exit(); + 9b1: e8 1d 2f 00 00 call 38d3 + printf(stdout, "chdir dir0 failed\n"); + 9b6: 51 push %ecx + 9b7: 51 push %ecx + 9b8: 68 4d 40 00 00 push $0x404d + 9bd: ff 35 68 5e 00 00 push 0x5e68 + 9c3: e8 88 30 00 00 call 3a50 + exit(); + 9c8: e8 06 2f 00 00 call 38d3 + 9cd: 8d 76 00 lea 0x0(%esi),%esi + +000009d0 : +void exectest(void) { + 9d0: 55 push %ebp + 9d1: 89 e5 mov %esp,%ebp + 9d3: 83 ec 10 sub $0x10,%esp + printf(stdout, "exec test\n"); + 9d6: 68 94 40 00 00 push $0x4094 + 9db: ff 35 68 5e 00 00 push 0x5e68 + 9e1: e8 6a 30 00 00 call 3a50 + if (exec("echo", echoargv) < 0) { + 9e6: 5a pop %edx + 9e7: 59 pop %ecx + 9e8: 68 6c 5e 00 00 push $0x5e6c + 9ed: 68 5d 3e 00 00 push $0x3e5d + 9f2: e8 04 2f 00 00 call 38fb + 9f7: 83 c4 10 add $0x10,%esp + 9fa: 85 c0 test %eax,%eax + 9fc: 78 02 js a00 +} + 9fe: c9 leave + 9ff: c3 ret + printf(stdout, "exec echo failed\n"); + a00: 50 push %eax + a01: 50 push %eax + a02: 68 9f 40 00 00 push $0x409f + a07: ff 35 68 5e 00 00 push 0x5e68 + a0d: e8 3e 30 00 00 call 3a50 + exit(); + a12: e8 bc 2e 00 00 call 38d3 + a17: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + a1e: 66 90 xchg %ax,%ax + +00000a20 : +void pipe1(void) { + a20: 55 push %ebp + a21: 89 e5 mov %esp,%ebp + a23: 57 push %edi + a24: 56 push %esi + if (pipe(fds) != 0) { + a25: 8d 45 e0 lea -0x20(%ebp),%eax +void pipe1(void) { + a28: 53 push %ebx + a29: 83 ec 38 sub $0x38,%esp + if (pipe(fds) != 0) { + a2c: 50 push %eax + a2d: e8 b1 2e 00 00 call 38e3 + a32: 83 c4 10 add $0x10,%esp + a35: 85 c0 test %eax,%eax + a37: 0f 85 34 01 00 00 jne b71 + pid = fork(); + a3d: e8 89 2e 00 00 call 38cb + if (pid == 0) { + a42: 85 c0 test %eax,%eax + a44: 0f 84 85 00 00 00 je acf + else if (pid > 0) { + a4a: 0f 8e 34 01 00 00 jle b84 + close(fds[1]); + a50: 83 ec 0c sub $0xc,%esp + a53: ff 75 e4 push -0x1c(%ebp) + seq = 0; + a56: 31 db xor %ebx,%ebx + cc = 1; + a58: be 01 00 00 00 mov $0x1,%esi + close(fds[1]); + a5d: e8 09 2f 00 00 call 396b + total = 0; + a62: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) + while ((n = read(fds[0], buf, cc)) > 0) { + a69: 83 c4 10 add $0x10,%esp + a6c: 83 ec 04 sub $0x4,%esp + a6f: 56 push %esi + a70: 68 a0 85 00 00 push $0x85a0 + a75: ff 75 e0 push -0x20(%ebp) + a78: e8 6e 2e 00 00 call 38eb + a7d: 83 c4 10 add $0x10,%esp + a80: 89 c7 mov %eax,%edi + a82: 85 c0 test %eax,%eax + a84: 0f 8e a3 00 00 00 jle b2d + a8a: 8d 0c 1f lea (%edi,%ebx,1),%ecx + for (i = 0; i < n; i++) { + a8d: 31 c0 xor %eax,%eax + a8f: 90 nop + if ((buf[i] & 0xff) != (seq++ & 0xff)) { + a90: 89 da mov %ebx,%edx + a92: 83 c3 01 add $0x1,%ebx + a95: 38 90 a0 85 00 00 cmp %dl,0x85a0(%eax) + a9b: 75 18 jne ab5 + for (i = 0; i < n; i++) { + a9d: 83 c0 01 add $0x1,%eax + aa0: 39 d9 cmp %ebx,%ecx + aa2: 75 ec jne a90 + cc = cc * 2; + aa4: 01 f6 add %esi,%esi + aa6: b8 00 20 00 00 mov $0x2000,%eax + total += n; + aab: 01 7d d4 add %edi,-0x2c(%ebp) + aae: 39 c6 cmp %eax,%esi + ab0: 0f 4f f0 cmovg %eax,%esi + ab3: eb b7 jmp a6c + printf(1, "pipe1 oops 2\n"); + ab5: 83 ec 08 sub $0x8,%esp + ab8: 68 ce 40 00 00 push $0x40ce + abd: 6a 01 push $0x1 + abf: e8 8c 2f 00 00 call 3a50 + ac4: 83 c4 10 add $0x10,%esp +} + ac7: 8d 65 f4 lea -0xc(%ebp),%esp + aca: 5b pop %ebx + acb: 5e pop %esi + acc: 5f pop %edi + acd: 5d pop %ebp + ace: c3 ret + close(fds[0]); + acf: 83 ec 0c sub $0xc,%esp + ad2: ff 75 e0 push -0x20(%ebp) + seq = 0; + ad5: 31 db xor %ebx,%ebx + close(fds[0]); + ad7: e8 8f 2e 00 00 call 396b + adc: 83 c4 10 add $0x10,%esp + for (i = 0; i < 1033; i++) { + adf: 31 c0 xor %eax,%eax + ae1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + buf[i] = seq++; + ae8: 8d 14 18 lea (%eax,%ebx,1),%edx + for (i = 0; i < 1033; i++) { + aeb: 83 c0 01 add $0x1,%eax + buf[i] = seq++; + aee: 88 90 9f 85 00 00 mov %dl,0x859f(%eax) + for (i = 0; i < 1033; i++) { + af4: 3d 09 04 00 00 cmp $0x409,%eax + af9: 75 ed jne ae8 + if (write(fds[1], buf, 1033) != 1033) { + afb: 83 ec 04 sub $0x4,%esp + buf[i] = seq++; + afe: 81 c3 09 04 00 00 add $0x409,%ebx + if (write(fds[1], buf, 1033) != 1033) { + b04: 68 09 04 00 00 push $0x409 + b09: 68 a0 85 00 00 push $0x85a0 + b0e: ff 75 e4 push -0x1c(%ebp) + b11: e8 2d 2e 00 00 call 3943 + b16: 83 c4 10 add $0x10,%esp + b19: 3d 09 04 00 00 cmp $0x409,%eax + b1e: 75 77 jne b97 + for (n = 0; n < 5; n++) { + b20: 81 fb 2d 14 00 00 cmp $0x142d,%ebx + b26: 75 b7 jne adf + exit(); + b28: e8 a6 2d 00 00 call 38d3 + if (total != 5 * 1033) { + b2d: 81 7d d4 2d 14 00 00 cmpl $0x142d,-0x2c(%ebp) + b34: 75 26 jne b5c + close(fds[0]); + b36: 83 ec 0c sub $0xc,%esp + b39: ff 75 e0 push -0x20(%ebp) + b3c: e8 2a 2e 00 00 call 396b + wait(); + b41: e8 95 2d 00 00 call 38db + printf(1, "pipe1 ok\n"); + b46: 5a pop %edx + b47: 59 pop %ecx + b48: 68 f3 40 00 00 push $0x40f3 + b4d: 6a 01 push $0x1 + b4f: e8 fc 2e 00 00 call 3a50 + b54: 83 c4 10 add $0x10,%esp + b57: e9 6b ff ff ff jmp ac7 + printf(1, "pipe1 oops 3 total %d\n", total); + b5c: 53 push %ebx + b5d: ff 75 d4 push -0x2c(%ebp) + b60: 68 dc 40 00 00 push $0x40dc + b65: 6a 01 push $0x1 + b67: e8 e4 2e 00 00 call 3a50 + exit(); + b6c: e8 62 2d 00 00 call 38d3 + printf(1, "pipe() failed\n"); + b71: 57 push %edi + b72: 57 push %edi + b73: 68 b1 40 00 00 push $0x40b1 + b78: 6a 01 push $0x1 + b7a: e8 d1 2e 00 00 call 3a50 + exit(); + b7f: e8 4f 2d 00 00 call 38d3 + printf(1, "fork() failed\n"); + b84: 50 push %eax + b85: 50 push %eax + b86: 68 fd 40 00 00 push $0x40fd + b8b: 6a 01 push $0x1 + b8d: e8 be 2e 00 00 call 3a50 + exit(); + b92: e8 3c 2d 00 00 call 38d3 + printf(1, "pipe1 oops 1\n"); + b97: 56 push %esi + b98: 56 push %esi + b99: 68 c0 40 00 00 push $0x40c0 + b9e: 6a 01 push $0x1 + ba0: e8 ab 2e 00 00 call 3a50 + exit(); + ba5: e8 29 2d 00 00 call 38d3 + baa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00000bb0 : +void preempt(void) { + bb0: 55 push %ebp + bb1: 89 e5 mov %esp,%ebp + bb3: 57 push %edi + bb4: 56 push %esi + bb5: 53 push %ebx + bb6: 83 ec 24 sub $0x24,%esp + printf(1, "preempt: "); + bb9: 68 0c 41 00 00 push $0x410c + bbe: 6a 01 push $0x1 + bc0: e8 8b 2e 00 00 call 3a50 + pid1 = fork(); + bc5: e8 01 2d 00 00 call 38cb + if (pid1 == 0) { + bca: 83 c4 10 add $0x10,%esp + bcd: 85 c0 test %eax,%eax + bcf: 75 07 jne bd8 + for (;;) { + bd1: eb fe jmp bd1 + bd3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + bd7: 90 nop + bd8: 89 c3 mov %eax,%ebx + pid2 = fork(); + bda: e8 ec 2c 00 00 call 38cb + bdf: 89 c6 mov %eax,%esi + if (pid2 == 0) { + be1: 85 c0 test %eax,%eax + be3: 75 0b jne bf0 + for (;;) { + be5: eb fe jmp be5 + be7: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + bee: 66 90 xchg %ax,%ax + pipe(pfds); + bf0: 83 ec 0c sub $0xc,%esp + bf3: 8d 45 e0 lea -0x20(%ebp),%eax + bf6: 50 push %eax + bf7: e8 e7 2c 00 00 call 38e3 + pid3 = fork(); + bfc: e8 ca 2c 00 00 call 38cb + if (pid3 == 0) { + c01: 83 c4 10 add $0x10,%esp + pid3 = fork(); + c04: 89 c7 mov %eax,%edi + if (pid3 == 0) { + c06: 85 c0 test %eax,%eax + c08: 75 3e jne c48 + close(pfds[0]); + c0a: 83 ec 0c sub $0xc,%esp + c0d: ff 75 e0 push -0x20(%ebp) + c10: e8 56 2d 00 00 call 396b + if (write(pfds[1], "x", 1) != 1) { + c15: 83 c4 0c add $0xc,%esp + c18: 6a 01 push $0x1 + c1a: 68 d1 46 00 00 push $0x46d1 + c1f: ff 75 e4 push -0x1c(%ebp) + c22: e8 1c 2d 00 00 call 3943 + c27: 83 c4 10 add $0x10,%esp + c2a: 83 f8 01 cmp $0x1,%eax + c2d: 0f 85 b8 00 00 00 jne ceb + close(pfds[1]); + c33: 83 ec 0c sub $0xc,%esp + c36: ff 75 e4 push -0x1c(%ebp) + c39: e8 2d 2d 00 00 call 396b + c3e: 83 c4 10 add $0x10,%esp + for (;;) { + c41: eb fe jmp c41 + c43: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c47: 90 nop + close(pfds[1]); + c48: 83 ec 0c sub $0xc,%esp + c4b: ff 75 e4 push -0x1c(%ebp) + c4e: e8 18 2d 00 00 call 396b + if (read(pfds[0], buf, sizeof(buf)) != 1) { + c53: 83 c4 0c add $0xc,%esp + c56: 68 00 20 00 00 push $0x2000 + c5b: 68 a0 85 00 00 push $0x85a0 + c60: ff 75 e0 push -0x20(%ebp) + c63: e8 83 2c 00 00 call 38eb + c68: 83 c4 10 add $0x10,%esp + c6b: 83 f8 01 cmp $0x1,%eax + c6e: 75 67 jne cd7 + close(pfds[0]); + c70: 83 ec 0c sub $0xc,%esp + c73: ff 75 e0 push -0x20(%ebp) + c76: e8 f0 2c 00 00 call 396b + printf(1, "kill... "); + c7b: 58 pop %eax + c7c: 5a pop %edx + c7d: 68 3d 41 00 00 push $0x413d + c82: 6a 01 push $0x1 + c84: e8 c7 2d 00 00 call 3a50 + kill(pid1); + c89: 89 1c 24 mov %ebx,(%esp) + c8c: e8 62 2c 00 00 call 38f3 + kill(pid2); + c91: 89 34 24 mov %esi,(%esp) + c94: e8 5a 2c 00 00 call 38f3 + kill(pid3); + c99: 89 3c 24 mov %edi,(%esp) + c9c: e8 52 2c 00 00 call 38f3 + printf(1, "wait... "); + ca1: 59 pop %ecx + ca2: 5b pop %ebx + ca3: 68 46 41 00 00 push $0x4146 + ca8: 6a 01 push $0x1 + caa: e8 a1 2d 00 00 call 3a50 + wait(); + caf: e8 27 2c 00 00 call 38db + wait(); + cb4: e8 22 2c 00 00 call 38db + wait(); + cb9: e8 1d 2c 00 00 call 38db + printf(1, "preempt ok\n"); + cbe: 5e pop %esi + cbf: 5f pop %edi + cc0: 68 4f 41 00 00 push $0x414f + cc5: 6a 01 push $0x1 + cc7: e8 84 2d 00 00 call 3a50 + ccc: 83 c4 10 add $0x10,%esp +} + ccf: 8d 65 f4 lea -0xc(%ebp),%esp + cd2: 5b pop %ebx + cd3: 5e pop %esi + cd4: 5f pop %edi + cd5: 5d pop %ebp + cd6: c3 ret + printf(1, "preempt read error"); + cd7: 83 ec 08 sub $0x8,%esp + cda: 68 2a 41 00 00 push $0x412a + cdf: 6a 01 push $0x1 + ce1: e8 6a 2d 00 00 call 3a50 + ce6: 83 c4 10 add $0x10,%esp + ce9: eb e4 jmp ccf + printf(1, "preempt write error"); + ceb: 83 ec 08 sub $0x8,%esp + cee: 68 16 41 00 00 push $0x4116 + cf3: 6a 01 push $0x1 + cf5: e8 56 2d 00 00 call 3a50 + cfa: 83 c4 10 add $0x10,%esp + cfd: e9 31 ff ff ff jmp c33 + d02: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + d09: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000d10 : +void exitwait(void) { + d10: 55 push %ebp + d11: 89 e5 mov %esp,%ebp + d13: 56 push %esi + d14: be 64 00 00 00 mov $0x64,%esi + d19: 53 push %ebx + d1a: eb 14 jmp d30 + d1c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (pid) { + d20: 74 68 je d8a + if (wait() != pid) { + d22: e8 b4 2b 00 00 call 38db + d27: 39 d8 cmp %ebx,%eax + d29: 75 2d jne d58 + for (i = 0; i < 100; i++) { + d2b: 83 ee 01 sub $0x1,%esi + d2e: 74 41 je d71 + pid = fork(); + d30: e8 96 2b 00 00 call 38cb + d35: 89 c3 mov %eax,%ebx + if (pid < 0) { + d37: 85 c0 test %eax,%eax + d39: 79 e5 jns d20 + printf(1, "fork failed\n"); + d3b: 83 ec 08 sub $0x8,%esp + d3e: 68 b9 4c 00 00 push $0x4cb9 + d43: 6a 01 push $0x1 + d45: e8 06 2d 00 00 call 3a50 + return; + d4a: 83 c4 10 add $0x10,%esp +} + d4d: 8d 65 f8 lea -0x8(%ebp),%esp + d50: 5b pop %ebx + d51: 5e pop %esi + d52: 5d pop %ebp + d53: c3 ret + d54: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + printf(1, "wait wrong pid\n"); + d58: 83 ec 08 sub $0x8,%esp + d5b: 68 5b 41 00 00 push $0x415b + d60: 6a 01 push $0x1 + d62: e8 e9 2c 00 00 call 3a50 + return; + d67: 83 c4 10 add $0x10,%esp +} + d6a: 8d 65 f8 lea -0x8(%ebp),%esp + d6d: 5b pop %ebx + d6e: 5e pop %esi + d6f: 5d pop %ebp + d70: c3 ret + printf(1, "exitwait ok\n"); + d71: 83 ec 08 sub $0x8,%esp + d74: 68 6b 41 00 00 push $0x416b + d79: 6a 01 push $0x1 + d7b: e8 d0 2c 00 00 call 3a50 + d80: 83 c4 10 add $0x10,%esp +} + d83: 8d 65 f8 lea -0x8(%ebp),%esp + d86: 5b pop %ebx + d87: 5e pop %esi + d88: 5d pop %ebp + d89: c3 ret + exit(); + d8a: e8 44 2b 00 00 call 38d3 + d8f: 90 nop + +00000d90 : +void mem(void) { + d90: 55 push %ebp + d91: 89 e5 mov %esp,%ebp + d93: 56 push %esi + d94: 31 f6 xor %esi,%esi + d96: 53 push %ebx + printf(1, "mem test\n"); + d97: 83 ec 08 sub $0x8,%esp + d9a: 68 78 41 00 00 push $0x4178 + d9f: 6a 01 push $0x1 + da1: e8 aa 2c 00 00 call 3a50 + ppid = getpid(); + da6: e8 70 2b 00 00 call 391b + dab: 89 c3 mov %eax,%ebx + if ((pid = fork()) == 0) { + dad: e8 19 2b 00 00 call 38cb + db2: 83 c4 10 add $0x10,%esp + db5: 85 c0 test %eax,%eax + db7: 74 0b je dc4 + db9: e9 8a 00 00 00 jmp e48 + dbe: 66 90 xchg %ax,%ax + *(char**)m2 = m1; + dc0: 89 30 mov %esi,(%eax) + dc2: 89 c6 mov %eax,%esi + while ((m2 = malloc(10001)) != 0) { + dc4: 83 ec 0c sub $0xc,%esp + dc7: 68 11 27 00 00 push $0x2711 + dcc: e8 af 2e 00 00 call 3c80 + dd1: 83 c4 10 add $0x10,%esp + dd4: 85 c0 test %eax,%eax + dd6: 75 e8 jne dc0 + while (m1) { + dd8: 85 f6 test %esi,%esi + dda: 74 18 je df4 + ddc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + m2 = *(char**)m1; + de0: 89 f0 mov %esi,%eax + free(m1); + de2: 83 ec 0c sub $0xc,%esp + m2 = *(char**)m1; + de5: 8b 36 mov (%esi),%esi + free(m1); + de7: 50 push %eax + de8: e8 03 2e 00 00 call 3bf0 + while (m1) { + ded: 83 c4 10 add $0x10,%esp + df0: 85 f6 test %esi,%esi + df2: 75 ec jne de0 + m1 = malloc(1024 * 20); + df4: 83 ec 0c sub $0xc,%esp + df7: 68 00 50 00 00 push $0x5000 + dfc: e8 7f 2e 00 00 call 3c80 + if (m1 == 0) { + e01: 83 c4 10 add $0x10,%esp + e04: 85 c0 test %eax,%eax + e06: 74 20 je e28 + free(m1); + e08: 83 ec 0c sub $0xc,%esp + e0b: 50 push %eax + e0c: e8 df 2d 00 00 call 3bf0 + printf(1, "mem ok\n"); + e11: 58 pop %eax + e12: 5a pop %edx + e13: 68 9c 41 00 00 push $0x419c + e18: 6a 01 push $0x1 + e1a: e8 31 2c 00 00 call 3a50 + exit(); + e1f: e8 af 2a 00 00 call 38d3 + e24: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + printf(1, "couldn't allocate mem?!!\n"); + e28: 83 ec 08 sub $0x8,%esp + e2b: 68 82 41 00 00 push $0x4182 + e30: 6a 01 push $0x1 + e32: e8 19 2c 00 00 call 3a50 + kill(ppid); + e37: 89 1c 24 mov %ebx,(%esp) + e3a: e8 b4 2a 00 00 call 38f3 + exit(); + e3f: e8 8f 2a 00 00 call 38d3 + e44: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi +} + e48: 8d 65 f8 lea -0x8(%ebp),%esp + e4b: 5b pop %ebx + e4c: 5e pop %esi + e4d: 5d pop %ebp + wait(); + e4e: e9 88 2a 00 00 jmp 38db + e53: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + e5a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00000e60 : +void sharedfd(void) { + e60: 55 push %ebp + e61: 89 e5 mov %esp,%ebp + e63: 57 push %edi + e64: 56 push %esi + e65: 53 push %ebx + e66: 83 ec 34 sub $0x34,%esp + printf(1, "sharedfd test\n"); + e69: 68 a4 41 00 00 push $0x41a4 + e6e: 6a 01 push $0x1 + e70: e8 db 2b 00 00 call 3a50 + unlink("sharedfd"); + e75: c7 04 24 b3 41 00 00 movl $0x41b3,(%esp) + e7c: e8 d2 2a 00 00 call 3953 + fd = open("sharedfd", O_CREATE | O_RDWR); + e81: 5b pop %ebx + e82: 5e pop %esi + e83: 68 02 02 00 00 push $0x202 + e88: 68 b3 41 00 00 push $0x41b3 + e8d: e8 a9 2a 00 00 call 393b + if (fd < 0) { + e92: 83 c4 10 add $0x10,%esp + e95: 85 c0 test %eax,%eax + e97: 0f 88 2a 01 00 00 js fc7 + e9d: 89 c7 mov %eax,%edi + memset(buf, pid == 0 ? 'c' : 'p', sizeof(buf)); + e9f: 8d 75 de lea -0x22(%ebp),%esi + ea2: bb e8 03 00 00 mov $0x3e8,%ebx + pid = fork(); + ea7: e8 1f 2a 00 00 call 38cb + memset(buf, pid == 0 ? 'c' : 'p', sizeof(buf)); + eac: 83 f8 01 cmp $0x1,%eax + pid = fork(); + eaf: 89 45 d4 mov %eax,-0x2c(%ebp) + memset(buf, pid == 0 ? 'c' : 'p', sizeof(buf)); + eb2: 19 c0 sbb %eax,%eax + eb4: 83 ec 04 sub $0x4,%esp + eb7: 83 e0 f3 and $0xfffffff3,%eax + eba: 6a 0a push $0xa + ebc: 83 c0 70 add $0x70,%eax + ebf: 50 push %eax + ec0: 56 push %esi + ec1: e8 7a 28 00 00 call 3740 + ec6: 83 c4 10 add $0x10,%esp + ec9: eb 0a jmp ed5 + ecb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + ecf: 90 nop + for (i = 0; i < 1000; i++) { + ed0: 83 eb 01 sub $0x1,%ebx + ed3: 74 26 je efb + if (write(fd, buf, sizeof(buf)) != sizeof(buf)) { + ed5: 83 ec 04 sub $0x4,%esp + ed8: 6a 0a push $0xa + eda: 56 push %esi + edb: 57 push %edi + edc: e8 62 2a 00 00 call 3943 + ee1: 83 c4 10 add $0x10,%esp + ee4: 83 f8 0a cmp $0xa,%eax + ee7: 74 e7 je ed0 + printf(1, "fstests: write sharedfd failed\n"); + ee9: 83 ec 08 sub $0x8,%esp + eec: 68 a4 4e 00 00 push $0x4ea4 + ef1: 6a 01 push $0x1 + ef3: e8 58 2b 00 00 call 3a50 + break; + ef8: 83 c4 10 add $0x10,%esp + if (pid == 0) { + efb: 8b 4d d4 mov -0x2c(%ebp),%ecx + efe: 85 c9 test %ecx,%ecx + f00: 0f 84 f5 00 00 00 je ffb + wait(); + f06: e8 d0 29 00 00 call 38db + close(fd); + f0b: 83 ec 0c sub $0xc,%esp + nc = np = 0; + f0e: 31 db xor %ebx,%ebx + close(fd); + f10: 57 push %edi + f11: 8d 7d e8 lea -0x18(%ebp),%edi + f14: e8 52 2a 00 00 call 396b + fd = open("sharedfd", 0); + f19: 58 pop %eax + f1a: 5a pop %edx + f1b: 6a 00 push $0x0 + f1d: 68 b3 41 00 00 push $0x41b3 + f22: e8 14 2a 00 00 call 393b + if (fd < 0) { + f27: 83 c4 10 add $0x10,%esp + nc = np = 0; + f2a: 31 d2 xor %edx,%edx + fd = open("sharedfd", 0); + f2c: 89 45 d0 mov %eax,-0x30(%ebp) + if (fd < 0) { + f2f: 85 c0 test %eax,%eax + f31: 0f 88 aa 00 00 00 js fe1 + f37: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + f3e: 66 90 xchg %ax,%ax + while ((n = read(fd, buf, sizeof(buf))) > 0) { + f40: 83 ec 04 sub $0x4,%esp + f43: 89 55 d4 mov %edx,-0x2c(%ebp) + f46: 6a 0a push $0xa + f48: 56 push %esi + f49: ff 75 d0 push -0x30(%ebp) + f4c: e8 9a 29 00 00 call 38eb + f51: 83 c4 10 add $0x10,%esp + f54: 85 c0 test %eax,%eax + f56: 7e 28 jle f80 + f58: 8b 55 d4 mov -0x2c(%ebp),%edx + f5b: 89 f0 mov %esi,%eax + f5d: eb 13 jmp f72 + f5f: 90 nop + np++; + f60: 80 f9 70 cmp $0x70,%cl + f63: 0f 94 c1 sete %cl + f66: 0f b6 c9 movzbl %cl,%ecx + f69: 01 cb add %ecx,%ebx + for (i = 0; i < sizeof(buf); i++) { + f6b: 83 c0 01 add $0x1,%eax + f6e: 39 f8 cmp %edi,%eax + f70: 74 ce je f40 + if (buf[i] == 'c') { + f72: 0f b6 08 movzbl (%eax),%ecx + f75: 80 f9 63 cmp $0x63,%cl + f78: 75 e6 jne f60 + nc++; + f7a: 83 c2 01 add $0x1,%edx + if (buf[i] == 'p') { + f7d: eb ec jmp f6b + f7f: 90 nop + close(fd); + f80: 83 ec 0c sub $0xc,%esp + f83: ff 75 d0 push -0x30(%ebp) + f86: e8 e0 29 00 00 call 396b + unlink("sharedfd"); + f8b: c7 04 24 b3 41 00 00 movl $0x41b3,(%esp) + f92: e8 bc 29 00 00 call 3953 + if (nc == 10000 && np == 10000) { + f97: 8b 55 d4 mov -0x2c(%ebp),%edx + f9a: 83 c4 10 add $0x10,%esp + f9d: 81 fa 10 27 00 00 cmp $0x2710,%edx + fa3: 75 5b jne 1000 + fa5: 81 fb 10 27 00 00 cmp $0x2710,%ebx + fab: 75 53 jne 1000 + printf(1, "sharedfd ok\n"); + fad: 83 ec 08 sub $0x8,%esp + fb0: 68 bc 41 00 00 push $0x41bc + fb5: 6a 01 push $0x1 + fb7: e8 94 2a 00 00 call 3a50 + fbc: 83 c4 10 add $0x10,%esp +} + fbf: 8d 65 f4 lea -0xc(%ebp),%esp + fc2: 5b pop %ebx + fc3: 5e pop %esi + fc4: 5f pop %edi + fc5: 5d pop %ebp + fc6: c3 ret + printf(1, "fstests: cannot open sharedfd for writing"); + fc7: 83 ec 08 sub $0x8,%esp + fca: 68 78 4e 00 00 push $0x4e78 + fcf: 6a 01 push $0x1 + fd1: e8 7a 2a 00 00 call 3a50 + return; + fd6: 83 c4 10 add $0x10,%esp +} + fd9: 8d 65 f4 lea -0xc(%ebp),%esp + fdc: 5b pop %ebx + fdd: 5e pop %esi + fde: 5f pop %edi + fdf: 5d pop %ebp + fe0: c3 ret + printf(1, "fstests: cannot open sharedfd for reading\n"); + fe1: 83 ec 08 sub $0x8,%esp + fe4: 68 c4 4e 00 00 push $0x4ec4 + fe9: 6a 01 push $0x1 + feb: e8 60 2a 00 00 call 3a50 + return; + ff0: 83 c4 10 add $0x10,%esp +} + ff3: 8d 65 f4 lea -0xc(%ebp),%esp + ff6: 5b pop %ebx + ff7: 5e pop %esi + ff8: 5f pop %edi + ff9: 5d pop %ebp + ffa: c3 ret + exit(); + ffb: e8 d3 28 00 00 call 38d3 + printf(1, "sharedfd oops %d %d\n", nc, np); + 1000: 53 push %ebx + 1001: 52 push %edx + 1002: 68 c9 41 00 00 push $0x41c9 + 1007: 6a 01 push $0x1 + 1009: e8 42 2a 00 00 call 3a50 + exit(); + 100e: e8 c0 28 00 00 call 38d3 + 1013: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 101a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00001020 : +void fourfiles(void) { + 1020: 55 push %ebp + 1021: 89 e5 mov %esp,%ebp + 1023: 57 push %edi + 1024: 56 push %esi + printf(1, "fourfiles test\n"); + 1025: be de 41 00 00 mov $0x41de,%esi +void fourfiles(void) { + 102a: 53 push %ebx + for (pi = 0; pi < 4; pi++) { + 102b: 31 db xor %ebx,%ebx +void fourfiles(void) { + 102d: 83 ec 34 sub $0x34,%esp + char *names[] = { "f0", "f1", "f2", "f3" }; + 1030: c7 45 d8 de 41 00 00 movl $0x41de,-0x28(%ebp) + printf(1, "fourfiles test\n"); + 1037: 68 e4 41 00 00 push $0x41e4 + 103c: 6a 01 push $0x1 + char *names[] = { "f0", "f1", "f2", "f3" }; + 103e: c7 45 dc 27 43 00 00 movl $0x4327,-0x24(%ebp) + 1045: c7 45 e0 2b 43 00 00 movl $0x432b,-0x20(%ebp) + 104c: c7 45 e4 e1 41 00 00 movl $0x41e1,-0x1c(%ebp) + printf(1, "fourfiles test\n"); + 1053: e8 f8 29 00 00 call 3a50 + 1058: 83 c4 10 add $0x10,%esp + unlink(fname); + 105b: 83 ec 0c sub $0xc,%esp + 105e: 56 push %esi + 105f: e8 ef 28 00 00 call 3953 + pid = fork(); + 1064: e8 62 28 00 00 call 38cb + if (pid < 0) { + 1069: 83 c4 10 add $0x10,%esp + 106c: 85 c0 test %eax,%eax + 106e: 0f 88 64 01 00 00 js 11d8 + if (pid == 0) { + 1074: 0f 84 e9 00 00 00 je 1163 + for (pi = 0; pi < 4; pi++) { + 107a: 83 c3 01 add $0x1,%ebx + 107d: 83 fb 04 cmp $0x4,%ebx + 1080: 74 06 je 1088 + fname = names[pi]; + 1082: 8b 74 9d d8 mov -0x28(%ebp,%ebx,4),%esi + 1086: eb d3 jmp 105b + wait(); + 1088: e8 4e 28 00 00 call 38db + for (i = 0; i < 2; i++) { + 108d: 31 f6 xor %esi,%esi + wait(); + 108f: e8 47 28 00 00 call 38db + 1094: e8 42 28 00 00 call 38db + 1099: e8 3d 28 00 00 call 38db + fname = names[i]; + 109e: 8b 44 b5 d8 mov -0x28(%ebp,%esi,4),%eax + fd = open(fname, 0); + 10a2: 83 ec 08 sub $0x8,%esp + total = 0; + 10a5: 31 db xor %ebx,%ebx + fd = open(fname, 0); + 10a7: 6a 00 push $0x0 + 10a9: 50 push %eax + fname = names[i]; + 10aa: 89 45 d0 mov %eax,-0x30(%ebp) + fd = open(fname, 0); + 10ad: e8 89 28 00 00 call 393b + while ((n = read(fd, buf, sizeof(buf))) > 0) { + 10b2: 83 c4 10 add $0x10,%esp + fd = open(fname, 0); + 10b5: 89 45 d4 mov %eax,-0x2c(%ebp) + while ((n = read(fd, buf, sizeof(buf))) > 0) { + 10b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 10bf: 90 nop + 10c0: 83 ec 04 sub $0x4,%esp + 10c3: 68 00 20 00 00 push $0x2000 + 10c8: 68 a0 85 00 00 push $0x85a0 + 10cd: ff 75 d4 push -0x2c(%ebp) + 10d0: e8 16 28 00 00 call 38eb + 10d5: 83 c4 10 add $0x10,%esp + 10d8: 89 c7 mov %eax,%edi + 10da: 85 c0 test %eax,%eax + 10dc: 7e 20 jle 10fe + for (j = 0; j < n; j++) { + 10de: 31 c0 xor %eax,%eax + if (buf[j] != '0' + i) { + 10e0: 83 fe 01 cmp $0x1,%esi + 10e3: 0f be 88 a0 85 00 00 movsbl 0x85a0(%eax),%ecx + 10ea: 19 d2 sbb %edx,%edx + 10ec: 83 c2 31 add $0x31,%edx + 10ef: 39 d1 cmp %edx,%ecx + 10f1: 75 5c jne 114f + for (j = 0; j < n; j++) { + 10f3: 83 c0 01 add $0x1,%eax + 10f6: 39 c7 cmp %eax,%edi + 10f8: 75 e6 jne 10e0 + total += n; + 10fa: 01 fb add %edi,%ebx + 10fc: eb c2 jmp 10c0 + close(fd); + 10fe: 83 ec 0c sub $0xc,%esp + 1101: ff 75 d4 push -0x2c(%ebp) + 1104: e8 62 28 00 00 call 396b + if (total != 12 * 500) { + 1109: 83 c4 10 add $0x10,%esp + 110c: 81 fb 70 17 00 00 cmp $0x1770,%ebx + 1112: 0f 85 d4 00 00 00 jne 11ec + unlink(fname); + 1118: 83 ec 0c sub $0xc,%esp + 111b: ff 75 d0 push -0x30(%ebp) + 111e: e8 30 28 00 00 call 3953 + for (i = 0; i < 2; i++) { + 1123: 83 c4 10 add $0x10,%esp + 1126: 83 fe 01 cmp $0x1,%esi + 1129: 75 1a jne 1145 + printf(1, "fourfiles ok\n"); + 112b: 83 ec 08 sub $0x8,%esp + 112e: 68 22 42 00 00 push $0x4222 + 1133: 6a 01 push $0x1 + 1135: e8 16 29 00 00 call 3a50 +} + 113a: 83 c4 10 add $0x10,%esp + 113d: 8d 65 f4 lea -0xc(%ebp),%esp + 1140: 5b pop %ebx + 1141: 5e pop %esi + 1142: 5f pop %edi + 1143: 5d pop %ebp + 1144: c3 ret + 1145: be 01 00 00 00 mov $0x1,%esi + 114a: e9 4f ff ff ff jmp 109e + printf(1, "wrong char\n"); + 114f: 83 ec 08 sub $0x8,%esp + 1152: 68 05 42 00 00 push $0x4205 + 1157: 6a 01 push $0x1 + 1159: e8 f2 28 00 00 call 3a50 + exit(); + 115e: e8 70 27 00 00 call 38d3 + fd = open(fname, O_CREATE | O_RDWR); + 1163: 83 ec 08 sub $0x8,%esp + 1166: 68 02 02 00 00 push $0x202 + 116b: 56 push %esi + 116c: e8 ca 27 00 00 call 393b + if (fd < 0) { + 1171: 83 c4 10 add $0x10,%esp + fd = open(fname, O_CREATE | O_RDWR); + 1174: 89 c6 mov %eax,%esi + if (fd < 0) { + 1176: 85 c0 test %eax,%eax + 1178: 78 45 js 11bf + memset(buf, '0' + pi, 512); + 117a: 83 ec 04 sub $0x4,%esp + 117d: 83 c3 30 add $0x30,%ebx + 1180: 68 00 02 00 00 push $0x200 + 1185: 53 push %ebx + 1186: bb 0c 00 00 00 mov $0xc,%ebx + 118b: 68 a0 85 00 00 push $0x85a0 + 1190: e8 ab 25 00 00 call 3740 + 1195: 83 c4 10 add $0x10,%esp + if ((n = write(fd, buf, 500)) != 500) { + 1198: 83 ec 04 sub $0x4,%esp + 119b: 68 f4 01 00 00 push $0x1f4 + 11a0: 68 a0 85 00 00 push $0x85a0 + 11a5: 56 push %esi + 11a6: e8 98 27 00 00 call 3943 + 11ab: 83 c4 10 add $0x10,%esp + 11ae: 3d f4 01 00 00 cmp $0x1f4,%eax + 11b3: 75 4a jne 11ff + for (i = 0; i < 12; i++) { + 11b5: 83 eb 01 sub $0x1,%ebx + 11b8: 75 de jne 1198 + exit(); + 11ba: e8 14 27 00 00 call 38d3 + printf(1, "create failed\n"); + 11bf: 51 push %ecx + 11c0: 51 push %ecx + 11c1: 68 7f 44 00 00 push $0x447f + 11c6: 6a 01 push $0x1 + 11c8: e8 83 28 00 00 call 3a50 + exit(); + 11cd: e8 01 27 00 00 call 38d3 + 11d2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + printf(1, "fork failed\n"); + 11d8: 83 ec 08 sub $0x8,%esp + 11db: 68 b9 4c 00 00 push $0x4cb9 + 11e0: 6a 01 push $0x1 + 11e2: e8 69 28 00 00 call 3a50 + exit(); + 11e7: e8 e7 26 00 00 call 38d3 + printf(1, "wrong length %d\n", total); + 11ec: 50 push %eax + 11ed: 53 push %ebx + 11ee: 68 11 42 00 00 push $0x4211 + 11f3: 6a 01 push $0x1 + 11f5: e8 56 28 00 00 call 3a50 + exit(); + 11fa: e8 d4 26 00 00 call 38d3 + printf(1, "write failed %d\n", n); + 11ff: 52 push %edx + 1200: 50 push %eax + 1201: 68 f4 41 00 00 push $0x41f4 + 1206: 6a 01 push $0x1 + 1208: e8 43 28 00 00 call 3a50 + exit(); + 120d: e8 c1 26 00 00 call 38d3 + 1212: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1219: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00001220 : +void createdelete(void) { + 1220: 55 push %ebp + 1221: 89 e5 mov %esp,%ebp + 1223: 57 push %edi + 1224: 56 push %esi + 1225: 53 push %ebx + for (pi = 0; pi < 4; pi++) { + 1226: 31 db xor %ebx,%ebx +void createdelete(void) { + 1228: 83 ec 44 sub $0x44,%esp + printf(1, "createdelete test\n"); + 122b: 68 30 42 00 00 push $0x4230 + 1230: 6a 01 push $0x1 + 1232: e8 19 28 00 00 call 3a50 + 1237: 83 c4 10 add $0x10,%esp + pid = fork(); + 123a: e8 8c 26 00 00 call 38cb + if (pid < 0) { + 123f: 85 c0 test %eax,%eax + 1241: 0f 88 c3 01 00 00 js 140a + if (pid == 0) { + 1247: 0f 84 13 01 00 00 je 1360 + for (pi = 0; pi < 4; pi++) { + 124d: 83 c3 01 add $0x1,%ebx + 1250: 83 fb 04 cmp $0x4,%ebx + 1253: 75 e5 jne 123a + wait(); + 1255: e8 81 26 00 00 call 38db + for (i = 0; i < N; i++) { + 125a: 31 f6 xor %esi,%esi + 125c: 8d 7d c8 lea -0x38(%ebp),%edi + wait(); + 125f: e8 77 26 00 00 call 38db + 1264: e8 72 26 00 00 call 38db + 1269: e8 6d 26 00 00 call 38db + name[0] = name[1] = name[2] = 0; + 126e: c6 45 ca 00 movb $0x0,-0x36(%ebp) + for (i = 0; i < N; i++) { + 1272: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if ((i == 0 || i >= N / 2) && fd < 0) { + 1278: 85 f6 test %esi,%esi + 127a: 8d 46 30 lea 0x30(%esi),%eax + 127d: 0f 94 c3 sete %bl + 1280: 83 fe 09 cmp $0x9,%esi + 1283: 88 45 c7 mov %al,-0x39(%ebp) + 1286: 0f 9f c0 setg %al + 1289: 09 c3 or %eax,%ebx + else if ((i >= 1 && i < N / 2) && fd >= 0) { + 128b: 8d 46 ff lea -0x1(%esi),%eax + 128e: 89 45 c0 mov %eax,-0x40(%ebp) + if ((i == 0 || i >= N / 2) && fd < 0) { + 1291: 88 5d c6 mov %bl,-0x3a(%ebp) + 1294: bb 70 00 00 00 mov $0x70,%ebx + fd = open(name, 0); + 1299: 83 ec 08 sub $0x8,%esp + name[1] = '0' + i; + 129c: 0f b6 45 c7 movzbl -0x39(%ebp),%eax + name[0] = 'p' + pi; + 12a0: 88 5d c8 mov %bl,-0x38(%ebp) + fd = open(name, 0); + 12a3: 6a 00 push $0x0 + 12a5: 57 push %edi + name[1] = '0' + i; + 12a6: 88 45 c9 mov %al,-0x37(%ebp) + fd = open(name, 0); + 12a9: e8 8d 26 00 00 call 393b + if ((i == 0 || i >= N / 2) && fd < 0) { + 12ae: 83 c4 10 add $0x10,%esp + 12b1: 80 7d c6 00 cmpb $0x0,-0x3a(%ebp) + 12b5: 0f 84 85 00 00 00 je 1340 + 12bb: 85 c0 test %eax,%eax + 12bd: 0f 88 32 01 00 00 js 13f5 + else if ((i >= 1 && i < N / 2) && fd >= 0) { + 12c3: 83 7d c0 08 cmpl $0x8,-0x40(%ebp) + 12c7: 76 7b jbe 1344 + close(fd); + 12c9: 83 ec 0c sub $0xc,%esp + 12cc: 50 push %eax + 12cd: e8 99 26 00 00 call 396b + 12d2: 83 c4 10 add $0x10,%esp + for (pi = 0; pi < 4; pi++) { + 12d5: 83 c3 01 add $0x1,%ebx + 12d8: 80 fb 74 cmp $0x74,%bl + 12db: 75 bc jne 1299 + for (i = 0; i < N; i++) { + 12dd: 83 c6 01 add $0x1,%esi + 12e0: 83 fe 14 cmp $0x14,%esi + 12e3: 75 93 jne 1278 + 12e5: be 70 00 00 00 mov $0x70,%esi + 12ea: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (pi = 0; pi < 4; pi++) { + 12f0: 8d 46 c0 lea -0x40(%esi),%eax + name[0] = 'p' + i; + 12f3: bb 04 00 00 00 mov $0x4,%ebx + 12f8: 88 45 c7 mov %al,-0x39(%ebp) + unlink(name); + 12fb: 83 ec 0c sub $0xc,%esp + name[0] = 'p' + i; + 12fe: 89 f0 mov %esi,%eax + unlink(name); + 1300: 57 push %edi + name[0] = 'p' + i; + 1301: 88 45 c8 mov %al,-0x38(%ebp) + name[1] = '0' + i; + 1304: 0f b6 45 c7 movzbl -0x39(%ebp),%eax + 1308: 88 45 c9 mov %al,-0x37(%ebp) + unlink(name); + 130b: e8 43 26 00 00 call 3953 + for (pi = 0; pi < 4; pi++) { + 1310: 83 c4 10 add $0x10,%esp + 1313: 83 eb 01 sub $0x1,%ebx + 1316: 75 e3 jne 12fb + for (i = 0; i < N; i++) { + 1318: 83 c6 01 add $0x1,%esi + 131b: 89 f0 mov %esi,%eax + 131d: 3c 84 cmp $0x84,%al + 131f: 75 cf jne 12f0 + printf(1, "createdelete ok\n"); + 1321: 83 ec 08 sub $0x8,%esp + 1324: 68 43 42 00 00 push $0x4243 + 1329: 6a 01 push $0x1 + 132b: e8 20 27 00 00 call 3a50 +} + 1330: 8d 65 f4 lea -0xc(%ebp),%esp + 1333: 5b pop %ebx + 1334: 5e pop %esi + 1335: 5f pop %edi + 1336: 5d pop %ebp + 1337: c3 ret + 1338: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 133f: 90 nop + else if ((i >= 1 && i < N / 2) && fd >= 0) { + 1340: 85 c0 test %eax,%eax + 1342: 78 91 js 12d5 + printf(1, "oops createdelete %s did exist\n", name); + 1344: 50 push %eax + 1345: 57 push %edi + 1346: 68 14 4f 00 00 push $0x4f14 + 134b: 6a 01 push $0x1 + 134d: e8 fe 26 00 00 call 3a50 + exit(); + 1352: e8 7c 25 00 00 call 38d3 + 1357: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 135e: 66 90 xchg %ax,%ax + name[0] = 'p' + pi; + 1360: 83 c3 70 add $0x70,%ebx + name[2] = '\0'; + 1363: c6 45 ca 00 movb $0x0,-0x36(%ebp) + 1367: be 01 00 00 00 mov $0x1,%esi + 136c: 8d 7d c8 lea -0x38(%ebp),%edi + name[0] = 'p' + pi; + 136f: 88 5d c8 mov %bl,-0x38(%ebp) + name[2] = '\0'; + 1372: 31 db xor %ebx,%ebx + 1374: eb 15 jmp 138b + 1376: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 137d: 8d 76 00 lea 0x0(%esi),%esi + for (i = 0; i < N; i++) { + 1380: 83 fe 14 cmp $0x14,%esi + 1383: 74 6b je 13f0 + 1385: 83 c3 01 add $0x1,%ebx + 1388: 83 c6 01 add $0x1,%esi + fd = open(name, O_CREATE | O_RDWR); + 138b: 83 ec 08 sub $0x8,%esp + name[1] = '0' + i; + 138e: 8d 43 30 lea 0x30(%ebx),%eax + fd = open(name, O_CREATE | O_RDWR); + 1391: 68 02 02 00 00 push $0x202 + 1396: 57 push %edi + name[1] = '0' + i; + 1397: 88 45 c9 mov %al,-0x37(%ebp) + fd = open(name, O_CREATE | O_RDWR); + 139a: e8 9c 25 00 00 call 393b + if (fd < 0) { + 139f: 83 c4 10 add $0x10,%esp + 13a2: 85 c0 test %eax,%eax + 13a4: 78 78 js 141e + close(fd); + 13a6: 83 ec 0c sub $0xc,%esp + 13a9: 50 push %eax + 13aa: e8 bc 25 00 00 call 396b + if (i > 0 && (i % 2) == 0) { + 13af: 83 c4 10 add $0x10,%esp + 13b2: 85 db test %ebx,%ebx + 13b4: 74 cf je 1385 + 13b6: f6 c3 01 test $0x1,%bl + 13b9: 75 c5 jne 1380 + if (unlink(name) < 0) { + 13bb: 83 ec 0c sub $0xc,%esp + name[1] = '0' + (i / 2); + 13be: 89 d8 mov %ebx,%eax + if (unlink(name) < 0) { + 13c0: 57 push %edi + name[1] = '0' + (i / 2); + 13c1: d1 f8 sar %eax + 13c3: 83 c0 30 add $0x30,%eax + 13c6: 88 45 c9 mov %al,-0x37(%ebp) + if (unlink(name) < 0) { + 13c9: e8 85 25 00 00 call 3953 + 13ce: 83 c4 10 add $0x10,%esp + 13d1: 85 c0 test %eax,%eax + 13d3: 79 ab jns 1380 + printf(1, "unlink failed\n"); + 13d5: 52 push %edx + 13d6: 52 push %edx + 13d7: 68 31 3e 00 00 push $0x3e31 + 13dc: 6a 01 push $0x1 + 13de: e8 6d 26 00 00 call 3a50 + exit(); + 13e3: e8 eb 24 00 00 call 38d3 + 13e8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 13ef: 90 nop + exit(); + 13f0: e8 de 24 00 00 call 38d3 + printf(1, "oops createdelete %s didn't exist\n", name); + 13f5: 83 ec 04 sub $0x4,%esp + 13f8: 57 push %edi + 13f9: 68 f0 4e 00 00 push $0x4ef0 + 13fe: 6a 01 push $0x1 + 1400: e8 4b 26 00 00 call 3a50 + exit(); + 1405: e8 c9 24 00 00 call 38d3 + printf(1, "fork failed\n"); + 140a: 83 ec 08 sub $0x8,%esp + 140d: 68 b9 4c 00 00 push $0x4cb9 + 1412: 6a 01 push $0x1 + 1414: e8 37 26 00 00 call 3a50 + exit(); + 1419: e8 b5 24 00 00 call 38d3 + printf(1, "create failed\n"); + 141e: 83 ec 08 sub $0x8,%esp + 1421: 68 7f 44 00 00 push $0x447f + 1426: 6a 01 push $0x1 + 1428: e8 23 26 00 00 call 3a50 + exit(); + 142d: e8 a1 24 00 00 call 38d3 + 1432: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1439: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00001440 : +void unlinkread(void) { + 1440: 55 push %ebp + 1441: 89 e5 mov %esp,%ebp + 1443: 56 push %esi + 1444: 53 push %ebx + printf(1, "unlinkread test\n"); + 1445: 83 ec 08 sub $0x8,%esp + 1448: 68 54 42 00 00 push $0x4254 + 144d: 6a 01 push $0x1 + 144f: e8 fc 25 00 00 call 3a50 + fd = open("unlinkread", O_CREATE | O_RDWR); + 1454: 5b pop %ebx + 1455: 5e pop %esi + 1456: 68 02 02 00 00 push $0x202 + 145b: 68 65 42 00 00 push $0x4265 + 1460: e8 d6 24 00 00 call 393b + if (fd < 0) { + 1465: 83 c4 10 add $0x10,%esp + 1468: 85 c0 test %eax,%eax + 146a: 0f 88 e6 00 00 00 js 1556 + write(fd, "hello", 5); + 1470: 83 ec 04 sub $0x4,%esp + 1473: 89 c3 mov %eax,%ebx + 1475: 6a 05 push $0x5 + 1477: 68 8a 42 00 00 push $0x428a + 147c: 50 push %eax + 147d: e8 c1 24 00 00 call 3943 + close(fd); + 1482: 89 1c 24 mov %ebx,(%esp) + 1485: e8 e1 24 00 00 call 396b + fd = open("unlinkread", O_RDWR); + 148a: 58 pop %eax + 148b: 5a pop %edx + 148c: 6a 02 push $0x2 + 148e: 68 65 42 00 00 push $0x4265 + 1493: e8 a3 24 00 00 call 393b + if (fd < 0) { + 1498: 83 c4 10 add $0x10,%esp + fd = open("unlinkread", O_RDWR); + 149b: 89 c3 mov %eax,%ebx + if (fd < 0) { + 149d: 85 c0 test %eax,%eax + 149f: 0f 88 10 01 00 00 js 15b5 + if (unlink("unlinkread") != 0) { + 14a5: 83 ec 0c sub $0xc,%esp + 14a8: 68 65 42 00 00 push $0x4265 + 14ad: e8 a1 24 00 00 call 3953 + 14b2: 83 c4 10 add $0x10,%esp + 14b5: 85 c0 test %eax,%eax + 14b7: 0f 85 e5 00 00 00 jne 15a2 + fd1 = open("unlinkread", O_CREATE | O_RDWR); + 14bd: 83 ec 08 sub $0x8,%esp + 14c0: 68 02 02 00 00 push $0x202 + 14c5: 68 65 42 00 00 push $0x4265 + 14ca: e8 6c 24 00 00 call 393b + write(fd1, "yyy", 3); + 14cf: 83 c4 0c add $0xc,%esp + 14d2: 6a 03 push $0x3 + fd1 = open("unlinkread", O_CREATE | O_RDWR); + 14d4: 89 c6 mov %eax,%esi + write(fd1, "yyy", 3); + 14d6: 68 c2 42 00 00 push $0x42c2 + 14db: 50 push %eax + 14dc: e8 62 24 00 00 call 3943 + close(fd1); + 14e1: 89 34 24 mov %esi,(%esp) + 14e4: e8 82 24 00 00 call 396b + if (read(fd, buf, sizeof(buf)) != 5) { + 14e9: 83 c4 0c add $0xc,%esp + 14ec: 68 00 20 00 00 push $0x2000 + 14f1: 68 a0 85 00 00 push $0x85a0 + 14f6: 53 push %ebx + 14f7: e8 ef 23 00 00 call 38eb + 14fc: 83 c4 10 add $0x10,%esp + 14ff: 83 f8 05 cmp $0x5,%eax + 1502: 0f 85 87 00 00 00 jne 158f + if (buf[0] != 'h') { + 1508: 80 3d a0 85 00 00 68 cmpb $0x68,0x85a0 + 150f: 75 6b jne 157c + if (write(fd, buf, 10) != 10) { + 1511: 83 ec 04 sub $0x4,%esp + 1514: 6a 0a push $0xa + 1516: 68 a0 85 00 00 push $0x85a0 + 151b: 53 push %ebx + 151c: e8 22 24 00 00 call 3943 + 1521: 83 c4 10 add $0x10,%esp + 1524: 83 f8 0a cmp $0xa,%eax + 1527: 75 40 jne 1569 + close(fd); + 1529: 83 ec 0c sub $0xc,%esp + 152c: 53 push %ebx + 152d: e8 39 24 00 00 call 396b + unlink("unlinkread"); + 1532: c7 04 24 65 42 00 00 movl $0x4265,(%esp) + 1539: e8 15 24 00 00 call 3953 + printf(1, "unlinkread ok\n"); + 153e: 58 pop %eax + 153f: 5a pop %edx + 1540: 68 0d 43 00 00 push $0x430d + 1545: 6a 01 push $0x1 + 1547: e8 04 25 00 00 call 3a50 +} + 154c: 83 c4 10 add $0x10,%esp + 154f: 8d 65 f8 lea -0x8(%ebp),%esp + 1552: 5b pop %ebx + 1553: 5e pop %esi + 1554: 5d pop %ebp + 1555: c3 ret + printf(1, "create unlinkread failed\n"); + 1556: 51 push %ecx + 1557: 51 push %ecx + 1558: 68 70 42 00 00 push $0x4270 + 155d: 6a 01 push $0x1 + 155f: e8 ec 24 00 00 call 3a50 + exit(); + 1564: e8 6a 23 00 00 call 38d3 + printf(1, "unlinkread write failed\n"); + 1569: 51 push %ecx + 156a: 51 push %ecx + 156b: 68 f4 42 00 00 push $0x42f4 + 1570: 6a 01 push $0x1 + 1572: e8 d9 24 00 00 call 3a50 + exit(); + 1577: e8 57 23 00 00 call 38d3 + printf(1, "unlinkread wrong data\n"); + 157c: 53 push %ebx + 157d: 53 push %ebx + 157e: 68 dd 42 00 00 push $0x42dd + 1583: 6a 01 push $0x1 + 1585: e8 c6 24 00 00 call 3a50 + exit(); + 158a: e8 44 23 00 00 call 38d3 + printf(1, "unlinkread read failed"); + 158f: 56 push %esi + 1590: 56 push %esi + 1591: 68 c6 42 00 00 push $0x42c6 + 1596: 6a 01 push $0x1 + 1598: e8 b3 24 00 00 call 3a50 + exit(); + 159d: e8 31 23 00 00 call 38d3 + printf(1, "unlink unlinkread failed\n"); + 15a2: 50 push %eax + 15a3: 50 push %eax + 15a4: 68 a8 42 00 00 push $0x42a8 + 15a9: 6a 01 push $0x1 + 15ab: e8 a0 24 00 00 call 3a50 + exit(); + 15b0: e8 1e 23 00 00 call 38d3 + printf(1, "open unlinkread failed\n"); + 15b5: 50 push %eax + 15b6: 50 push %eax + 15b7: 68 90 42 00 00 push $0x4290 + 15bc: 6a 01 push $0x1 + 15be: e8 8d 24 00 00 call 3a50 + exit(); + 15c3: e8 0b 23 00 00 call 38d3 + 15c8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 15cf: 90 nop + +000015d0 : +void linktest(void) { + 15d0: 55 push %ebp + 15d1: 89 e5 mov %esp,%ebp + 15d3: 53 push %ebx + 15d4: 83 ec 0c sub $0xc,%esp + printf(1, "linktest\n"); + 15d7: 68 1c 43 00 00 push $0x431c + 15dc: 6a 01 push $0x1 + 15de: e8 6d 24 00 00 call 3a50 + unlink("lf1"); + 15e3: c7 04 24 26 43 00 00 movl $0x4326,(%esp) + 15ea: e8 64 23 00 00 call 3953 + unlink("lf2"); + 15ef: c7 04 24 2a 43 00 00 movl $0x432a,(%esp) + 15f6: e8 58 23 00 00 call 3953 + fd = open("lf1", O_CREATE | O_RDWR); + 15fb: 58 pop %eax + 15fc: 5a pop %edx + 15fd: 68 02 02 00 00 push $0x202 + 1602: 68 26 43 00 00 push $0x4326 + 1607: e8 2f 23 00 00 call 393b + if (fd < 0) { + 160c: 83 c4 10 add $0x10,%esp + 160f: 85 c0 test %eax,%eax + 1611: 0f 88 1e 01 00 00 js 1735 + if (write(fd, "hello", 5) != 5) { + 1617: 83 ec 04 sub $0x4,%esp + 161a: 89 c3 mov %eax,%ebx + 161c: 6a 05 push $0x5 + 161e: 68 8a 42 00 00 push $0x428a + 1623: 50 push %eax + 1624: e8 1a 23 00 00 call 3943 + 1629: 83 c4 10 add $0x10,%esp + 162c: 83 f8 05 cmp $0x5,%eax + 162f: 0f 85 98 01 00 00 jne 17cd + close(fd); + 1635: 83 ec 0c sub $0xc,%esp + 1638: 53 push %ebx + 1639: e8 2d 23 00 00 call 396b + if (link("lf1", "lf2") < 0) { + 163e: 5b pop %ebx + 163f: 58 pop %eax + 1640: 68 2a 43 00 00 push $0x432a + 1645: 68 26 43 00 00 push $0x4326 + 164a: e8 0c 23 00 00 call 395b + 164f: 83 c4 10 add $0x10,%esp + 1652: 85 c0 test %eax,%eax + 1654: 0f 88 60 01 00 00 js 17ba + unlink("lf1"); + 165a: 83 ec 0c sub $0xc,%esp + 165d: 68 26 43 00 00 push $0x4326 + 1662: e8 ec 22 00 00 call 3953 + if (open("lf1", 0) >= 0) { + 1667: 58 pop %eax + 1668: 5a pop %edx + 1669: 6a 00 push $0x0 + 166b: 68 26 43 00 00 push $0x4326 + 1670: e8 c6 22 00 00 call 393b + 1675: 83 c4 10 add $0x10,%esp + 1678: 85 c0 test %eax,%eax + 167a: 0f 89 27 01 00 00 jns 17a7 + fd = open("lf2", 0); + 1680: 83 ec 08 sub $0x8,%esp + 1683: 6a 00 push $0x0 + 1685: 68 2a 43 00 00 push $0x432a + 168a: e8 ac 22 00 00 call 393b + if (fd < 0) { + 168f: 83 c4 10 add $0x10,%esp + fd = open("lf2", 0); + 1692: 89 c3 mov %eax,%ebx + if (fd < 0) { + 1694: 85 c0 test %eax,%eax + 1696: 0f 88 f8 00 00 00 js 1794 + if (read(fd, buf, sizeof(buf)) != 5) { + 169c: 83 ec 04 sub $0x4,%esp + 169f: 68 00 20 00 00 push $0x2000 + 16a4: 68 a0 85 00 00 push $0x85a0 + 16a9: 50 push %eax + 16aa: e8 3c 22 00 00 call 38eb + 16af: 83 c4 10 add $0x10,%esp + 16b2: 83 f8 05 cmp $0x5,%eax + 16b5: 0f 85 c6 00 00 00 jne 1781 + close(fd); + 16bb: 83 ec 0c sub $0xc,%esp + 16be: 53 push %ebx + 16bf: e8 a7 22 00 00 call 396b + if (link("lf2", "lf2") >= 0) { + 16c4: 58 pop %eax + 16c5: 5a pop %edx + 16c6: 68 2a 43 00 00 push $0x432a + 16cb: 68 2a 43 00 00 push $0x432a + 16d0: e8 86 22 00 00 call 395b + 16d5: 83 c4 10 add $0x10,%esp + 16d8: 85 c0 test %eax,%eax + 16da: 0f 89 8e 00 00 00 jns 176e + unlink("lf2"); + 16e0: 83 ec 0c sub $0xc,%esp + 16e3: 68 2a 43 00 00 push $0x432a + 16e8: e8 66 22 00 00 call 3953 + if (link("lf2", "lf1") >= 0) { + 16ed: 59 pop %ecx + 16ee: 5b pop %ebx + 16ef: 68 26 43 00 00 push $0x4326 + 16f4: 68 2a 43 00 00 push $0x432a + 16f9: e8 5d 22 00 00 call 395b + 16fe: 83 c4 10 add $0x10,%esp + 1701: 85 c0 test %eax,%eax + 1703: 79 56 jns 175b + if (link(".", "lf1") >= 0) { + 1705: 83 ec 08 sub $0x8,%esp + 1708: 68 26 43 00 00 push $0x4326 + 170d: 68 ee 45 00 00 push $0x45ee + 1712: e8 44 22 00 00 call 395b + 1717: 83 c4 10 add $0x10,%esp + 171a: 85 c0 test %eax,%eax + 171c: 79 2a jns 1748 + printf(1, "linktest ok\n"); + 171e: 83 ec 08 sub $0x8,%esp + 1721: 68 c4 43 00 00 push $0x43c4 + 1726: 6a 01 push $0x1 + 1728: e8 23 23 00 00 call 3a50 +} + 172d: 8b 5d fc mov -0x4(%ebp),%ebx + 1730: 83 c4 10 add $0x10,%esp + 1733: c9 leave + 1734: c3 ret + printf(1, "create lf1 failed\n"); + 1735: 50 push %eax + 1736: 50 push %eax + 1737: 68 2e 43 00 00 push $0x432e + 173c: 6a 01 push $0x1 + 173e: e8 0d 23 00 00 call 3a50 + exit(); + 1743: e8 8b 21 00 00 call 38d3 + printf(1, "link . lf1 succeeded! oops\n"); + 1748: 50 push %eax + 1749: 50 push %eax + 174a: 68 a8 43 00 00 push $0x43a8 + 174f: 6a 01 push $0x1 + 1751: e8 fa 22 00 00 call 3a50 + exit(); + 1756: e8 78 21 00 00 call 38d3 + printf(1, "link non-existant succeeded! oops\n"); + 175b: 52 push %edx + 175c: 52 push %edx + 175d: 68 5c 4f 00 00 push $0x4f5c + 1762: 6a 01 push $0x1 + 1764: e8 e7 22 00 00 call 3a50 + exit(); + 1769: e8 65 21 00 00 call 38d3 + printf(1, "link lf2 lf2 succeeded! oops\n"); + 176e: 50 push %eax + 176f: 50 push %eax + 1770: 68 8a 43 00 00 push $0x438a + 1775: 6a 01 push $0x1 + 1777: e8 d4 22 00 00 call 3a50 + exit(); + 177c: e8 52 21 00 00 call 38d3 + printf(1, "read lf2 failed\n"); + 1781: 51 push %ecx + 1782: 51 push %ecx + 1783: 68 79 43 00 00 push $0x4379 + 1788: 6a 01 push $0x1 + 178a: e8 c1 22 00 00 call 3a50 + exit(); + 178f: e8 3f 21 00 00 call 38d3 + printf(1, "open lf2 failed\n"); + 1794: 53 push %ebx + 1795: 53 push %ebx + 1796: 68 68 43 00 00 push $0x4368 + 179b: 6a 01 push $0x1 + 179d: e8 ae 22 00 00 call 3a50 + exit(); + 17a2: e8 2c 21 00 00 call 38d3 + printf(1, "unlinked lf1 but it is still there!\n"); + 17a7: 50 push %eax + 17a8: 50 push %eax + 17a9: 68 34 4f 00 00 push $0x4f34 + 17ae: 6a 01 push $0x1 + 17b0: e8 9b 22 00 00 call 3a50 + exit(); + 17b5: e8 19 21 00 00 call 38d3 + printf(1, "link lf1 lf2 failed\n"); + 17ba: 51 push %ecx + 17bb: 51 push %ecx + 17bc: 68 53 43 00 00 push $0x4353 + 17c1: 6a 01 push $0x1 + 17c3: e8 88 22 00 00 call 3a50 + exit(); + 17c8: e8 06 21 00 00 call 38d3 + printf(1, "write lf1 failed\n"); + 17cd: 50 push %eax + 17ce: 50 push %eax + 17cf: 68 41 43 00 00 push $0x4341 + 17d4: 6a 01 push $0x1 + 17d6: e8 75 22 00 00 call 3a50 + exit(); + 17db: e8 f3 20 00 00 call 38d3 + +000017e0 : +void concreate(void) { + 17e0: 55 push %ebp + 17e1: 89 e5 mov %esp,%ebp + 17e3: 57 push %edi + 17e4: 56 push %esi + for (i = 0; i < 40; i++) { + 17e5: 31 f6 xor %esi,%esi +void concreate(void) { + 17e7: 53 push %ebx + 17e8: 8d 5d ad lea -0x53(%ebp),%ebx + 17eb: 83 ec 64 sub $0x64,%esp + printf(1, "concreate test\n"); + 17ee: 68 d1 43 00 00 push $0x43d1 + 17f3: 6a 01 push $0x1 + 17f5: e8 56 22 00 00 call 3a50 + file[0] = 'C'; + 17fa: c6 45 ad 43 movb $0x43,-0x53(%ebp) + file[2] = '\0'; + 17fe: 83 c4 10 add $0x10,%esp + 1801: c6 45 af 00 movb $0x0,-0x51(%ebp) + for (i = 0; i < 40; i++) { + 1805: eb 4c jmp 1853 + 1807: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 180e: 66 90 xchg %ax,%ax + 1810: 69 c6 ab aa aa aa imul $0xaaaaaaab,%esi,%eax + if (pid && (i % 3) == 1) { + 1816: 3d ab aa aa aa cmp $0xaaaaaaab,%eax + 181b: 0f 83 af 00 00 00 jae 18d0 + fd = open(file, O_CREATE | O_RDWR); + 1821: 83 ec 08 sub $0x8,%esp + 1824: 68 02 02 00 00 push $0x202 + 1829: 53 push %ebx + 182a: e8 0c 21 00 00 call 393b + if (fd < 0) { + 182f: 83 c4 10 add $0x10,%esp + 1832: 85 c0 test %eax,%eax + 1834: 78 5f js 1895 + close(fd); + 1836: 83 ec 0c sub $0xc,%esp + for (i = 0; i < 40; i++) { + 1839: 83 c6 01 add $0x1,%esi + close(fd); + 183c: 50 push %eax + 183d: e8 29 21 00 00 call 396b + 1842: 83 c4 10 add $0x10,%esp + wait(); + 1845: e8 91 20 00 00 call 38db + for (i = 0; i < 40; i++) { + 184a: 83 fe 28 cmp $0x28,%esi + 184d: 0f 84 9f 00 00 00 je 18f2 + unlink(file); + 1853: 83 ec 0c sub $0xc,%esp + file[1] = '0' + i; + 1856: 8d 46 30 lea 0x30(%esi),%eax + unlink(file); + 1859: 53 push %ebx + file[1] = '0' + i; + 185a: 88 45 ae mov %al,-0x52(%ebp) + unlink(file); + 185d: e8 f1 20 00 00 call 3953 + pid = fork(); + 1862: e8 64 20 00 00 call 38cb + if (pid && (i % 3) == 1) { + 1867: 83 c4 10 add $0x10,%esp + 186a: 85 c0 test %eax,%eax + 186c: 75 a2 jne 1810 + link("C0", file); + 186e: 69 f6 cd cc cc cc imul $0xcccccccd,%esi,%esi + else if (pid == 0 && (i % 5) == 1) { + 1874: 81 fe cd cc cc cc cmp $0xcccccccd,%esi + 187a: 73 34 jae 18b0 + fd = open(file, O_CREATE | O_RDWR); + 187c: 83 ec 08 sub $0x8,%esp + 187f: 68 02 02 00 00 push $0x202 + 1884: 53 push %ebx + 1885: e8 b1 20 00 00 call 393b + if (fd < 0) { + 188a: 83 c4 10 add $0x10,%esp + 188d: 85 c0 test %eax,%eax + 188f: 0f 89 39 02 00 00 jns 1ace + printf(1, "concreate create %s failed\n", file); + 1895: 83 ec 04 sub $0x4,%esp + 1898: 53 push %ebx + 1899: 68 e4 43 00 00 push $0x43e4 + 189e: 6a 01 push $0x1 + 18a0: e8 ab 21 00 00 call 3a50 + exit(); + 18a5: e8 29 20 00 00 call 38d3 + 18aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + link("C0", file); + 18b0: 83 ec 08 sub $0x8,%esp + 18b3: 53 push %ebx + 18b4: 68 e1 43 00 00 push $0x43e1 + 18b9: e8 9d 20 00 00 call 395b + 18be: 83 c4 10 add $0x10,%esp + exit(); + 18c1: e8 0d 20 00 00 call 38d3 + 18c6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 18cd: 8d 76 00 lea 0x0(%esi),%esi + link("C0", file); + 18d0: 83 ec 08 sub $0x8,%esp + for (i = 0; i < 40; i++) { + 18d3: 83 c6 01 add $0x1,%esi + link("C0", file); + 18d6: 53 push %ebx + 18d7: 68 e1 43 00 00 push $0x43e1 + 18dc: e8 7a 20 00 00 call 395b + 18e1: 83 c4 10 add $0x10,%esp + wait(); + 18e4: e8 f2 1f 00 00 call 38db + for (i = 0; i < 40; i++) { + 18e9: 83 fe 28 cmp $0x28,%esi + 18ec: 0f 85 61 ff ff ff jne 1853 + memset(fa, 0, sizeof(fa)); + 18f2: 83 ec 04 sub $0x4,%esp + 18f5: 8d 45 c0 lea -0x40(%ebp),%eax + 18f8: 6a 28 push $0x28 + 18fa: 6a 00 push $0x0 + 18fc: 50 push %eax + 18fd: e8 3e 1e 00 00 call 3740 + fd = open(".", 0); + 1902: 5e pop %esi + 1903: 5f pop %edi + 1904: 6a 00 push $0x0 + 1906: 68 ee 45 00 00 push $0x45ee + 190b: 8d 7d b0 lea -0x50(%ebp),%edi + 190e: e8 28 20 00 00 call 393b + n = 0; + 1913: c7 45 a4 00 00 00 00 movl $0x0,-0x5c(%ebp) + while (read(fd, &de, sizeof(de)) > 0) { + 191a: 83 c4 10 add $0x10,%esp + fd = open(".", 0); + 191d: 89 c6 mov %eax,%esi + while (read(fd, &de, sizeof(de)) > 0) { + 191f: 90 nop + 1920: 83 ec 04 sub $0x4,%esp + 1923: 6a 10 push $0x10 + 1925: 57 push %edi + 1926: 56 push %esi + 1927: e8 bf 1f 00 00 call 38eb + 192c: 83 c4 10 add $0x10,%esp + 192f: 85 c0 test %eax,%eax + 1931: 7e 3d jle 1970 + if (de.inum == 0) { + 1933: 66 83 7d b0 00 cmpw $0x0,-0x50(%ebp) + 1938: 74 e6 je 1920 + if (de.name[0] == 'C' && de.name[2] == '\0') { + 193a: 80 7d b2 43 cmpb $0x43,-0x4e(%ebp) + 193e: 75 e0 jne 1920 + 1940: 80 7d b4 00 cmpb $0x0,-0x4c(%ebp) + 1944: 75 da jne 1920 + i = de.name[1] - '0'; + 1946: 0f be 45 b3 movsbl -0x4d(%ebp),%eax + 194a: 83 e8 30 sub $0x30,%eax + if (i < 0 || i >= sizeof(fa)) { + 194d: 83 f8 27 cmp $0x27,%eax + 1950: 0f 87 60 01 00 00 ja 1ab6 + if (fa[i]) { + 1956: 80 7c 05 c0 00 cmpb $0x0,-0x40(%ebp,%eax,1) + 195b: 0f 85 3d 01 00 00 jne 1a9e + n++; + 1961: 83 45 a4 01 addl $0x1,-0x5c(%ebp) + fa[i] = 1; + 1965: c6 44 05 c0 01 movb $0x1,-0x40(%ebp,%eax,1) + n++; + 196a: eb b4 jmp 1920 + 196c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + close(fd); + 1970: 83 ec 0c sub $0xc,%esp + 1973: 56 push %esi + 1974: e8 f2 1f 00 00 call 396b + if (n != 40) { + 1979: 83 c4 10 add $0x10,%esp + 197c: 83 7d a4 28 cmpl $0x28,-0x5c(%ebp) + 1980: 0f 85 05 01 00 00 jne 1a8b + for (i = 0; i < 40; i++) { + 1986: 31 f6 xor %esi,%esi + 1988: eb 4c jmp 19d6 + 198a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + ((i % 3) == 1 && pid != 0)) { + 1990: 85 ff test %edi,%edi + 1992: 74 05 je 1999 + 1994: 83 f8 01 cmp $0x1,%eax + 1997: 74 6c je 1a05 + unlink(file); + 1999: 83 ec 0c sub $0xc,%esp + 199c: 53 push %ebx + 199d: e8 b1 1f 00 00 call 3953 + unlink(file); + 19a2: 89 1c 24 mov %ebx,(%esp) + 19a5: e8 a9 1f 00 00 call 3953 + unlink(file); + 19aa: 89 1c 24 mov %ebx,(%esp) + 19ad: e8 a1 1f 00 00 call 3953 + unlink(file); + 19b2: 89 1c 24 mov %ebx,(%esp) + 19b5: e8 99 1f 00 00 call 3953 + 19ba: 83 c4 10 add $0x10,%esp + if (pid == 0) { + 19bd: 85 ff test %edi,%edi + 19bf: 0f 84 fc fe ff ff je 18c1 + wait(); + 19c5: e8 11 1f 00 00 call 38db + for (i = 0; i < 40; i++) { + 19ca: 83 c6 01 add $0x1,%esi + 19cd: 83 fe 28 cmp $0x28,%esi + 19d0: 0f 84 8a 00 00 00 je 1a60 + file[1] = '0' + i; + 19d6: 8d 46 30 lea 0x30(%esi),%eax + 19d9: 88 45 ae mov %al,-0x52(%ebp) + pid = fork(); + 19dc: e8 ea 1e 00 00 call 38cb + 19e1: 89 c7 mov %eax,%edi + if (pid < 0) { + 19e3: 85 c0 test %eax,%eax + 19e5: 0f 88 8c 00 00 00 js 1a77 + if (((i % 3) == 0 && pid == 0) || + 19eb: b8 ab aa aa aa mov $0xaaaaaaab,%eax + 19f0: f7 e6 mul %esi + 19f2: 89 d0 mov %edx,%eax + 19f4: 83 e2 fe and $0xfffffffe,%edx + 19f7: d1 e8 shr %eax + 19f9: 01 c2 add %eax,%edx + 19fb: 89 f0 mov %esi,%eax + 19fd: 29 d0 sub %edx,%eax + 19ff: 89 c1 mov %eax,%ecx + 1a01: 09 f9 or %edi,%ecx + 1a03: 75 8b jne 1990 + close(open(file, 0)); + 1a05: 83 ec 08 sub $0x8,%esp + 1a08: 6a 00 push $0x0 + 1a0a: 53 push %ebx + 1a0b: e8 2b 1f 00 00 call 393b + 1a10: 89 04 24 mov %eax,(%esp) + 1a13: e8 53 1f 00 00 call 396b + close(open(file, 0)); + 1a18: 58 pop %eax + 1a19: 5a pop %edx + 1a1a: 6a 00 push $0x0 + 1a1c: 53 push %ebx + 1a1d: e8 19 1f 00 00 call 393b + 1a22: 89 04 24 mov %eax,(%esp) + 1a25: e8 41 1f 00 00 call 396b + close(open(file, 0)); + 1a2a: 59 pop %ecx + 1a2b: 58 pop %eax + 1a2c: 6a 00 push $0x0 + 1a2e: 53 push %ebx + 1a2f: e8 07 1f 00 00 call 393b + 1a34: 89 04 24 mov %eax,(%esp) + 1a37: e8 2f 1f 00 00 call 396b + close(open(file, 0)); + 1a3c: 58 pop %eax + 1a3d: 5a pop %edx + 1a3e: 6a 00 push $0x0 + 1a40: 53 push %ebx + 1a41: e8 f5 1e 00 00 call 393b + 1a46: 89 04 24 mov %eax,(%esp) + 1a49: e8 1d 1f 00 00 call 396b + 1a4e: 83 c4 10 add $0x10,%esp + 1a51: e9 67 ff ff ff jmp 19bd + 1a56: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1a5d: 8d 76 00 lea 0x0(%esi),%esi + printf(1, "concreate ok\n"); + 1a60: 83 ec 08 sub $0x8,%esp + 1a63: 68 36 44 00 00 push $0x4436 + 1a68: 6a 01 push $0x1 + 1a6a: e8 e1 1f 00 00 call 3a50 +} + 1a6f: 8d 65 f4 lea -0xc(%ebp),%esp + 1a72: 5b pop %ebx + 1a73: 5e pop %esi + 1a74: 5f pop %edi + 1a75: 5d pop %ebp + 1a76: c3 ret + printf(1, "fork failed\n"); + 1a77: 83 ec 08 sub $0x8,%esp + 1a7a: 68 b9 4c 00 00 push $0x4cb9 + 1a7f: 6a 01 push $0x1 + 1a81: e8 ca 1f 00 00 call 3a50 + exit(); + 1a86: e8 48 1e 00 00 call 38d3 + printf(1, "concreate not enough files in directory listing\n"); + 1a8b: 51 push %ecx + 1a8c: 51 push %ecx + 1a8d: 68 80 4f 00 00 push $0x4f80 + 1a92: 6a 01 push $0x1 + 1a94: e8 b7 1f 00 00 call 3a50 + exit(); + 1a99: e8 35 1e 00 00 call 38d3 + printf(1, "concreate duplicate file %s\n", de.name); + 1a9e: 83 ec 04 sub $0x4,%esp + 1aa1: 8d 45 b2 lea -0x4e(%ebp),%eax + 1aa4: 50 push %eax + 1aa5: 68 19 44 00 00 push $0x4419 + 1aaa: 6a 01 push $0x1 + 1aac: e8 9f 1f 00 00 call 3a50 + exit(); + 1ab1: e8 1d 1e 00 00 call 38d3 + printf(1, "concreate weird file %s\n", de.name); + 1ab6: 83 ec 04 sub $0x4,%esp + 1ab9: 8d 45 b2 lea -0x4e(%ebp),%eax + 1abc: 50 push %eax + 1abd: 68 00 44 00 00 push $0x4400 + 1ac2: 6a 01 push $0x1 + 1ac4: e8 87 1f 00 00 call 3a50 + exit(); + 1ac9: e8 05 1e 00 00 call 38d3 + close(fd); + 1ace: 83 ec 0c sub $0xc,%esp + 1ad1: 50 push %eax + 1ad2: e8 94 1e 00 00 call 396b + 1ad7: 83 c4 10 add $0x10,%esp + 1ada: e9 e2 fd ff ff jmp 18c1 + 1adf: 90 nop + +00001ae0 : +void linkunlink() { + 1ae0: 55 push %ebp + 1ae1: 89 e5 mov %esp,%ebp + 1ae3: 57 push %edi + 1ae4: 56 push %esi + 1ae5: 53 push %ebx + 1ae6: 83 ec 24 sub $0x24,%esp + printf(1, "linkunlink test\n"); + 1ae9: 68 44 44 00 00 push $0x4444 + 1aee: 6a 01 push $0x1 + 1af0: e8 5b 1f 00 00 call 3a50 + unlink("x"); + 1af5: c7 04 24 d1 46 00 00 movl $0x46d1,(%esp) + 1afc: e8 52 1e 00 00 call 3953 + pid = fork(); + 1b01: e8 c5 1d 00 00 call 38cb + if (pid < 0) { + 1b06: 83 c4 10 add $0x10,%esp + pid = fork(); + 1b09: 89 45 e4 mov %eax,-0x1c(%ebp) + if (pid < 0) { + 1b0c: 85 c0 test %eax,%eax + 1b0e: 0f 88 b6 00 00 00 js 1bca + unsigned int x = (pid ? 1 : 97); + 1b14: 83 7d e4 01 cmpl $0x1,-0x1c(%ebp) + 1b18: bb 64 00 00 00 mov $0x64,%ebx + if ((x % 3) == 0) { + 1b1d: be ab aa aa aa mov $0xaaaaaaab,%esi + unsigned int x = (pid ? 1 : 97); + 1b22: 19 ff sbb %edi,%edi + 1b24: 83 e7 60 and $0x60,%edi + 1b27: 83 c7 01 add $0x1,%edi + 1b2a: eb 1e jmp 1b4a + 1b2c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + else if ((x % 3) == 1) { + 1b30: 83 f8 01 cmp $0x1,%eax + 1b33: 74 7b je 1bb0 + unlink("x"); + 1b35: 83 ec 0c sub $0xc,%esp + 1b38: 68 d1 46 00 00 push $0x46d1 + 1b3d: e8 11 1e 00 00 call 3953 + 1b42: 83 c4 10 add $0x10,%esp + for (i = 0; i < 100; i++) { + 1b45: 83 eb 01 sub $0x1,%ebx + 1b48: 74 41 je 1b8b + x = x * 1103515245 + 12345; + 1b4a: 69 cf 6d 4e c6 41 imul $0x41c64e6d,%edi,%ecx + 1b50: 8d b9 39 30 00 00 lea 0x3039(%ecx),%edi + if ((x % 3) == 0) { + 1b56: 89 f8 mov %edi,%eax + 1b58: f7 e6 mul %esi + 1b5a: 89 d0 mov %edx,%eax + 1b5c: 83 e2 fe and $0xfffffffe,%edx + 1b5f: d1 e8 shr %eax + 1b61: 01 c2 add %eax,%edx + 1b63: 89 f8 mov %edi,%eax + 1b65: 29 d0 sub %edx,%eax + 1b67: 75 c7 jne 1b30 + close(open("x", O_RDWR | O_CREATE)); + 1b69: 83 ec 08 sub $0x8,%esp + 1b6c: 68 02 02 00 00 push $0x202 + 1b71: 68 d1 46 00 00 push $0x46d1 + 1b76: e8 c0 1d 00 00 call 393b + 1b7b: 89 04 24 mov %eax,(%esp) + 1b7e: e8 e8 1d 00 00 call 396b + 1b83: 83 c4 10 add $0x10,%esp + for (i = 0; i < 100; i++) { + 1b86: 83 eb 01 sub $0x1,%ebx + 1b89: 75 bf jne 1b4a + if (pid) { + 1b8b: 8b 45 e4 mov -0x1c(%ebp),%eax + 1b8e: 85 c0 test %eax,%eax + 1b90: 74 4b je 1bdd + wait(); + 1b92: e8 44 1d 00 00 call 38db + printf(1, "linkunlink ok\n"); + 1b97: 83 ec 08 sub $0x8,%esp + 1b9a: 68 59 44 00 00 push $0x4459 + 1b9f: 6a 01 push $0x1 + 1ba1: e8 aa 1e 00 00 call 3a50 +} + 1ba6: 8d 65 f4 lea -0xc(%ebp),%esp + 1ba9: 5b pop %ebx + 1baa: 5e pop %esi + 1bab: 5f pop %edi + 1bac: 5d pop %ebp + 1bad: c3 ret + 1bae: 66 90 xchg %ax,%ax + link("cat", "x"); + 1bb0: 83 ec 08 sub $0x8,%esp + 1bb3: 68 d1 46 00 00 push $0x46d1 + 1bb8: 68 55 44 00 00 push $0x4455 + 1bbd: e8 99 1d 00 00 call 395b + 1bc2: 83 c4 10 add $0x10,%esp + 1bc5: e9 7b ff ff ff jmp 1b45 + printf(1, "fork failed\n"); + 1bca: 52 push %edx + 1bcb: 52 push %edx + 1bcc: 68 b9 4c 00 00 push $0x4cb9 + 1bd1: 6a 01 push $0x1 + 1bd3: e8 78 1e 00 00 call 3a50 + exit(); + 1bd8: e8 f6 1c 00 00 call 38d3 + exit(); + 1bdd: e8 f1 1c 00 00 call 38d3 + 1be2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1be9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00001bf0 : +void bigdir(void) { + 1bf0: 55 push %ebp + 1bf1: 89 e5 mov %esp,%ebp + 1bf3: 57 push %edi + 1bf4: 56 push %esi + 1bf5: 53 push %ebx + 1bf6: 83 ec 24 sub $0x24,%esp + printf(1, "bigdir test\n"); + 1bf9: 68 68 44 00 00 push $0x4468 + 1bfe: 6a 01 push $0x1 + 1c00: e8 4b 1e 00 00 call 3a50 + unlink("bd"); + 1c05: c7 04 24 75 44 00 00 movl $0x4475,(%esp) + 1c0c: e8 42 1d 00 00 call 3953 + fd = open("bd", O_CREATE); + 1c11: 5a pop %edx + 1c12: 59 pop %ecx + 1c13: 68 00 02 00 00 push $0x200 + 1c18: 68 75 44 00 00 push $0x4475 + 1c1d: e8 19 1d 00 00 call 393b + if (fd < 0) { + 1c22: 83 c4 10 add $0x10,%esp + 1c25: 85 c0 test %eax,%eax + 1c27: 0f 88 de 00 00 00 js 1d0b + close(fd); + 1c2d: 83 ec 0c sub $0xc,%esp + for (i = 0; i < 500; i++) { + 1c30: 31 f6 xor %esi,%esi + 1c32: 8d 7d de lea -0x22(%ebp),%edi + close(fd); + 1c35: 50 push %eax + 1c36: e8 30 1d 00 00 call 396b + 1c3b: 83 c4 10 add $0x10,%esp + 1c3e: 66 90 xchg %ax,%ax + name[1] = '0' + (i / 64); + 1c40: 89 f0 mov %esi,%eax + if (link("bd", name) != 0) { + 1c42: 83 ec 08 sub $0x8,%esp + name[0] = 'x'; + 1c45: c6 45 de 78 movb $0x78,-0x22(%ebp) + name[1] = '0' + (i / 64); + 1c49: c1 f8 06 sar $0x6,%eax + if (link("bd", name) != 0) { + 1c4c: 57 push %edi + name[1] = '0' + (i / 64); + 1c4d: 83 c0 30 add $0x30,%eax + if (link("bd", name) != 0) { + 1c50: 68 75 44 00 00 push $0x4475 + name[1] = '0' + (i / 64); + 1c55: 88 45 df mov %al,-0x21(%ebp) + name[2] = '0' + (i % 64); + 1c58: 89 f0 mov %esi,%eax + 1c5a: 83 e0 3f and $0x3f,%eax + name[3] = '\0'; + 1c5d: c6 45 e1 00 movb $0x0,-0x1f(%ebp) + name[2] = '0' + (i % 64); + 1c61: 83 c0 30 add $0x30,%eax + 1c64: 88 45 e0 mov %al,-0x20(%ebp) + if (link("bd", name) != 0) { + 1c67: e8 ef 1c 00 00 call 395b + 1c6c: 83 c4 10 add $0x10,%esp + 1c6f: 89 c3 mov %eax,%ebx + 1c71: 85 c0 test %eax,%eax + 1c73: 75 6e jne 1ce3 + for (i = 0; i < 500; i++) { + 1c75: 83 c6 01 add $0x1,%esi + 1c78: 81 fe f4 01 00 00 cmp $0x1f4,%esi + 1c7e: 75 c0 jne 1c40 + unlink("bd"); + 1c80: 83 ec 0c sub $0xc,%esp + 1c83: 68 75 44 00 00 push $0x4475 + 1c88: e8 c6 1c 00 00 call 3953 + 1c8d: 83 c4 10 add $0x10,%esp + name[1] = '0' + (i / 64); + 1c90: 89 d8 mov %ebx,%eax + if (unlink(name) != 0) { + 1c92: 83 ec 0c sub $0xc,%esp + name[0] = 'x'; + 1c95: c6 45 de 78 movb $0x78,-0x22(%ebp) + name[1] = '0' + (i / 64); + 1c99: c1 f8 06 sar $0x6,%eax + if (unlink(name) != 0) { + 1c9c: 57 push %edi + name[1] = '0' + (i / 64); + 1c9d: 83 c0 30 add $0x30,%eax + name[3] = '\0'; + 1ca0: c6 45 e1 00 movb $0x0,-0x1f(%ebp) + name[1] = '0' + (i / 64); + 1ca4: 88 45 df mov %al,-0x21(%ebp) + name[2] = '0' + (i % 64); + 1ca7: 89 d8 mov %ebx,%eax + 1ca9: 83 e0 3f and $0x3f,%eax + 1cac: 83 c0 30 add $0x30,%eax + 1caf: 88 45 e0 mov %al,-0x20(%ebp) + if (unlink(name) != 0) { + 1cb2: e8 9c 1c 00 00 call 3953 + 1cb7: 83 c4 10 add $0x10,%esp + 1cba: 85 c0 test %eax,%eax + 1cbc: 75 39 jne 1cf7 + for (i = 0; i < 500; i++) { + 1cbe: 83 c3 01 add $0x1,%ebx + 1cc1: 81 fb f4 01 00 00 cmp $0x1f4,%ebx + 1cc7: 75 c7 jne 1c90 + printf(1, "bigdir ok\n"); + 1cc9: 83 ec 08 sub $0x8,%esp + 1ccc: 68 b7 44 00 00 push $0x44b7 + 1cd1: 6a 01 push $0x1 + 1cd3: e8 78 1d 00 00 call 3a50 + 1cd8: 83 c4 10 add $0x10,%esp +} + 1cdb: 8d 65 f4 lea -0xc(%ebp),%esp + 1cde: 5b pop %ebx + 1cdf: 5e pop %esi + 1ce0: 5f pop %edi + 1ce1: 5d pop %ebp + 1ce2: c3 ret + printf(1, "bigdir link failed\n"); + 1ce3: 83 ec 08 sub $0x8,%esp + 1ce6: 68 8e 44 00 00 push $0x448e + 1ceb: 6a 01 push $0x1 + 1ced: e8 5e 1d 00 00 call 3a50 + exit(); + 1cf2: e8 dc 1b 00 00 call 38d3 + printf(1, "bigdir unlink failed"); + 1cf7: 83 ec 08 sub $0x8,%esp + 1cfa: 68 a2 44 00 00 push $0x44a2 + 1cff: 6a 01 push $0x1 + 1d01: e8 4a 1d 00 00 call 3a50 + exit(); + 1d06: e8 c8 1b 00 00 call 38d3 + printf(1, "bigdir create failed\n"); + 1d0b: 50 push %eax + 1d0c: 50 push %eax + 1d0d: 68 78 44 00 00 push $0x4478 + 1d12: 6a 01 push $0x1 + 1d14: e8 37 1d 00 00 call 3a50 + exit(); + 1d19: e8 b5 1b 00 00 call 38d3 + 1d1e: 66 90 xchg %ax,%ax + +00001d20 : +void subdir(void) { + 1d20: 55 push %ebp + 1d21: 89 e5 mov %esp,%ebp + 1d23: 53 push %ebx + 1d24: 83 ec 0c sub $0xc,%esp + printf(1, "subdir test\n"); + 1d27: 68 c2 44 00 00 push $0x44c2 + 1d2c: 6a 01 push $0x1 + 1d2e: e8 1d 1d 00 00 call 3a50 + unlink("ff"); + 1d33: c7 04 24 4b 45 00 00 movl $0x454b,(%esp) + 1d3a: e8 14 1c 00 00 call 3953 + if (mkdir("dd") != 0) { + 1d3f: c7 04 24 e8 45 00 00 movl $0x45e8,(%esp) + 1d46: e8 18 1c 00 00 call 3963 + 1d4b: 83 c4 10 add $0x10,%esp + 1d4e: 85 c0 test %eax,%eax + 1d50: 0f 85 b3 05 00 00 jne 2309 + fd = open("dd/ff", O_CREATE | O_RDWR); + 1d56: 83 ec 08 sub $0x8,%esp + 1d59: 68 02 02 00 00 push $0x202 + 1d5e: 68 21 45 00 00 push $0x4521 + 1d63: e8 d3 1b 00 00 call 393b + if (fd < 0) { + 1d68: 83 c4 10 add $0x10,%esp + fd = open("dd/ff", O_CREATE | O_RDWR); + 1d6b: 89 c3 mov %eax,%ebx + if (fd < 0) { + 1d6d: 85 c0 test %eax,%eax + 1d6f: 0f 88 81 05 00 00 js 22f6 + write(fd, "ff", 2); + 1d75: 83 ec 04 sub $0x4,%esp + 1d78: 6a 02 push $0x2 + 1d7a: 68 4b 45 00 00 push $0x454b + 1d7f: 50 push %eax + 1d80: e8 be 1b 00 00 call 3943 + close(fd); + 1d85: 89 1c 24 mov %ebx,(%esp) + 1d88: e8 de 1b 00 00 call 396b + if (unlink("dd") >= 0) { + 1d8d: c7 04 24 e8 45 00 00 movl $0x45e8,(%esp) + 1d94: e8 ba 1b 00 00 call 3953 + 1d99: 83 c4 10 add $0x10,%esp + 1d9c: 85 c0 test %eax,%eax + 1d9e: 0f 89 3f 05 00 00 jns 22e3 + if (mkdir("/dd/dd") != 0) { + 1da4: 83 ec 0c sub $0xc,%esp + 1da7: 68 fc 44 00 00 push $0x44fc + 1dac: e8 b2 1b 00 00 call 3963 + 1db1: 83 c4 10 add $0x10,%esp + 1db4: 85 c0 test %eax,%eax + 1db6: 0f 85 14 05 00 00 jne 22d0 + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + 1dbc: 83 ec 08 sub $0x8,%esp + 1dbf: 68 02 02 00 00 push $0x202 + 1dc4: 68 1e 45 00 00 push $0x451e + 1dc9: e8 6d 1b 00 00 call 393b + if (fd < 0) { + 1dce: 83 c4 10 add $0x10,%esp + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + 1dd1: 89 c3 mov %eax,%ebx + if (fd < 0) { + 1dd3: 85 c0 test %eax,%eax + 1dd5: 0f 88 24 04 00 00 js 21ff + write(fd, "FF", 2); + 1ddb: 83 ec 04 sub $0x4,%esp + 1dde: 6a 02 push $0x2 + 1de0: 68 3f 45 00 00 push $0x453f + 1de5: 50 push %eax + 1de6: e8 58 1b 00 00 call 3943 + close(fd); + 1deb: 89 1c 24 mov %ebx,(%esp) + 1dee: e8 78 1b 00 00 call 396b + fd = open("dd/dd/../ff", 0); + 1df3: 58 pop %eax + 1df4: 5a pop %edx + 1df5: 6a 00 push $0x0 + 1df7: 68 42 45 00 00 push $0x4542 + 1dfc: e8 3a 1b 00 00 call 393b + if (fd < 0) { + 1e01: 83 c4 10 add $0x10,%esp + fd = open("dd/dd/../ff", 0); + 1e04: 89 c3 mov %eax,%ebx + if (fd < 0) { + 1e06: 85 c0 test %eax,%eax + 1e08: 0f 88 de 03 00 00 js 21ec + cc = read(fd, buf, sizeof(buf)); + 1e0e: 83 ec 04 sub $0x4,%esp + 1e11: 68 00 20 00 00 push $0x2000 + 1e16: 68 a0 85 00 00 push $0x85a0 + 1e1b: 50 push %eax + 1e1c: e8 ca 1a 00 00 call 38eb + if (cc != 2 || buf[0] != 'f') { + 1e21: 83 c4 10 add $0x10,%esp + 1e24: 83 f8 02 cmp $0x2,%eax + 1e27: 0f 85 3a 03 00 00 jne 2167 + 1e2d: 80 3d a0 85 00 00 66 cmpb $0x66,0x85a0 + 1e34: 0f 85 2d 03 00 00 jne 2167 + close(fd); + 1e3a: 83 ec 0c sub $0xc,%esp + 1e3d: 53 push %ebx + 1e3e: e8 28 1b 00 00 call 396b + if (link("dd/dd/ff", "dd/dd/ffff") != 0) { + 1e43: 59 pop %ecx + 1e44: 5b pop %ebx + 1e45: 68 82 45 00 00 push $0x4582 + 1e4a: 68 1e 45 00 00 push $0x451e + 1e4f: e8 07 1b 00 00 call 395b + 1e54: 83 c4 10 add $0x10,%esp + 1e57: 85 c0 test %eax,%eax + 1e59: 0f 85 c6 03 00 00 jne 2225 + if (unlink("dd/dd/ff") != 0) { + 1e5f: 83 ec 0c sub $0xc,%esp + 1e62: 68 1e 45 00 00 push $0x451e + 1e67: e8 e7 1a 00 00 call 3953 + 1e6c: 83 c4 10 add $0x10,%esp + 1e6f: 85 c0 test %eax,%eax + 1e71: 0f 85 16 03 00 00 jne 218d + if (open("dd/dd/ff", O_RDONLY) >= 0) { + 1e77: 83 ec 08 sub $0x8,%esp + 1e7a: 6a 00 push $0x0 + 1e7c: 68 1e 45 00 00 push $0x451e + 1e81: e8 b5 1a 00 00 call 393b + 1e86: 83 c4 10 add $0x10,%esp + 1e89: 85 c0 test %eax,%eax + 1e8b: 0f 89 2c 04 00 00 jns 22bd + if (chdir("dd") != 0) { + 1e91: 83 ec 0c sub $0xc,%esp + 1e94: 68 e8 45 00 00 push $0x45e8 + 1e99: e8 6d 1a 00 00 call 390b + 1e9e: 83 c4 10 add $0x10,%esp + 1ea1: 85 c0 test %eax,%eax + 1ea3: 0f 85 01 04 00 00 jne 22aa + if (chdir("dd/../../dd") != 0) { + 1ea9: 83 ec 0c sub $0xc,%esp + 1eac: 68 b6 45 00 00 push $0x45b6 + 1eb1: e8 55 1a 00 00 call 390b + 1eb6: 83 c4 10 add $0x10,%esp + 1eb9: 85 c0 test %eax,%eax + 1ebb: 0f 85 b9 02 00 00 jne 217a + if (chdir("dd/../../../dd") != 0) { + 1ec1: 83 ec 0c sub $0xc,%esp + 1ec4: 68 dc 45 00 00 push $0x45dc + 1ec9: e8 3d 1a 00 00 call 390b + 1ece: 83 c4 10 add $0x10,%esp + 1ed1: 85 c0 test %eax,%eax + 1ed3: 0f 85 a1 02 00 00 jne 217a + if (chdir("./..") != 0) { + 1ed9: 83 ec 0c sub $0xc,%esp + 1edc: 68 eb 45 00 00 push $0x45eb + 1ee1: e8 25 1a 00 00 call 390b + 1ee6: 83 c4 10 add $0x10,%esp + 1ee9: 85 c0 test %eax,%eax + 1eeb: 0f 85 21 03 00 00 jne 2212 + fd = open("dd/dd/ffff", 0); + 1ef1: 83 ec 08 sub $0x8,%esp + 1ef4: 6a 00 push $0x0 + 1ef6: 68 82 45 00 00 push $0x4582 + 1efb: e8 3b 1a 00 00 call 393b + if (fd < 0) { + 1f00: 83 c4 10 add $0x10,%esp + fd = open("dd/dd/ffff", 0); + 1f03: 89 c3 mov %eax,%ebx + if (fd < 0) { + 1f05: 85 c0 test %eax,%eax + 1f07: 0f 88 e0 04 00 00 js 23ed + if (read(fd, buf, sizeof(buf)) != 2) { + 1f0d: 83 ec 04 sub $0x4,%esp + 1f10: 68 00 20 00 00 push $0x2000 + 1f15: 68 a0 85 00 00 push $0x85a0 + 1f1a: 50 push %eax + 1f1b: e8 cb 19 00 00 call 38eb + 1f20: 83 c4 10 add $0x10,%esp + 1f23: 83 f8 02 cmp $0x2,%eax + 1f26: 0f 85 ae 04 00 00 jne 23da + close(fd); + 1f2c: 83 ec 0c sub $0xc,%esp + 1f2f: 53 push %ebx + 1f30: e8 36 1a 00 00 call 396b + if (open("dd/dd/ff", O_RDONLY) >= 0) { + 1f35: 58 pop %eax + 1f36: 5a pop %edx + 1f37: 6a 00 push $0x0 + 1f39: 68 1e 45 00 00 push $0x451e + 1f3e: e8 f8 19 00 00 call 393b + 1f43: 83 c4 10 add $0x10,%esp + 1f46: 85 c0 test %eax,%eax + 1f48: 0f 89 65 02 00 00 jns 21b3 + if (open("dd/ff/ff", O_CREATE | O_RDWR) >= 0) { + 1f4e: 83 ec 08 sub $0x8,%esp + 1f51: 68 02 02 00 00 push $0x202 + 1f56: 68 36 46 00 00 push $0x4636 + 1f5b: e8 db 19 00 00 call 393b + 1f60: 83 c4 10 add $0x10,%esp + 1f63: 85 c0 test %eax,%eax + 1f65: 0f 89 35 02 00 00 jns 21a0 + if (open("dd/xx/ff", O_CREATE | O_RDWR) >= 0) { + 1f6b: 83 ec 08 sub $0x8,%esp + 1f6e: 68 02 02 00 00 push $0x202 + 1f73: 68 5b 46 00 00 push $0x465b + 1f78: e8 be 19 00 00 call 393b + 1f7d: 83 c4 10 add $0x10,%esp + 1f80: 85 c0 test %eax,%eax + 1f82: 0f 89 0f 03 00 00 jns 2297 + if (open("dd", O_CREATE) >= 0) { + 1f88: 83 ec 08 sub $0x8,%esp + 1f8b: 68 00 02 00 00 push $0x200 + 1f90: 68 e8 45 00 00 push $0x45e8 + 1f95: e8 a1 19 00 00 call 393b + 1f9a: 83 c4 10 add $0x10,%esp + 1f9d: 85 c0 test %eax,%eax + 1f9f: 0f 89 df 02 00 00 jns 2284 + if (open("dd", O_RDWR) >= 0) { + 1fa5: 83 ec 08 sub $0x8,%esp + 1fa8: 6a 02 push $0x2 + 1faa: 68 e8 45 00 00 push $0x45e8 + 1faf: e8 87 19 00 00 call 393b + 1fb4: 83 c4 10 add $0x10,%esp + 1fb7: 85 c0 test %eax,%eax + 1fb9: 0f 89 b2 02 00 00 jns 2271 + if (open("dd", O_WRONLY) >= 0) { + 1fbf: 83 ec 08 sub $0x8,%esp + 1fc2: 6a 01 push $0x1 + 1fc4: 68 e8 45 00 00 push $0x45e8 + 1fc9: e8 6d 19 00 00 call 393b + 1fce: 83 c4 10 add $0x10,%esp + 1fd1: 85 c0 test %eax,%eax + 1fd3: 0f 89 85 02 00 00 jns 225e + if (link("dd/ff/ff", "dd/dd/xx") == 0) { + 1fd9: 83 ec 08 sub $0x8,%esp + 1fdc: 68 ca 46 00 00 push $0x46ca + 1fe1: 68 36 46 00 00 push $0x4636 + 1fe6: e8 70 19 00 00 call 395b + 1feb: 83 c4 10 add $0x10,%esp + 1fee: 85 c0 test %eax,%eax + 1ff0: 0f 84 55 02 00 00 je 224b + if (link("dd/xx/ff", "dd/dd/xx") == 0) { + 1ff6: 83 ec 08 sub $0x8,%esp + 1ff9: 68 ca 46 00 00 push $0x46ca + 1ffe: 68 5b 46 00 00 push $0x465b + 2003: e8 53 19 00 00 call 395b + 2008: 83 c4 10 add $0x10,%esp + 200b: 85 c0 test %eax,%eax + 200d: 0f 84 25 02 00 00 je 2238 + if (link("dd/ff", "dd/dd/ffff") == 0) { + 2013: 83 ec 08 sub $0x8,%esp + 2016: 68 82 45 00 00 push $0x4582 + 201b: 68 21 45 00 00 push $0x4521 + 2020: e8 36 19 00 00 call 395b + 2025: 83 c4 10 add $0x10,%esp + 2028: 85 c0 test %eax,%eax + 202a: 0f 84 a9 01 00 00 je 21d9 + if (mkdir("dd/ff/ff") == 0) { + 2030: 83 ec 0c sub $0xc,%esp + 2033: 68 36 46 00 00 push $0x4636 + 2038: e8 26 19 00 00 call 3963 + 203d: 83 c4 10 add $0x10,%esp + 2040: 85 c0 test %eax,%eax + 2042: 0f 84 7e 01 00 00 je 21c6 + if (mkdir("dd/xx/ff") == 0) { + 2048: 83 ec 0c sub $0xc,%esp + 204b: 68 5b 46 00 00 push $0x465b + 2050: e8 0e 19 00 00 call 3963 + 2055: 83 c4 10 add $0x10,%esp + 2058: 85 c0 test %eax,%eax + 205a: 0f 84 67 03 00 00 je 23c7 + if (mkdir("dd/dd/ffff") == 0) { + 2060: 83 ec 0c sub $0xc,%esp + 2063: 68 82 45 00 00 push $0x4582 + 2068: e8 f6 18 00 00 call 3963 + 206d: 83 c4 10 add $0x10,%esp + 2070: 85 c0 test %eax,%eax + 2072: 0f 84 3c 03 00 00 je 23b4 + if (unlink("dd/xx/ff") == 0) { + 2078: 83 ec 0c sub $0xc,%esp + 207b: 68 5b 46 00 00 push $0x465b + 2080: e8 ce 18 00 00 call 3953 + 2085: 83 c4 10 add $0x10,%esp + 2088: 85 c0 test %eax,%eax + 208a: 0f 84 11 03 00 00 je 23a1 + if (unlink("dd/ff/ff") == 0) { + 2090: 83 ec 0c sub $0xc,%esp + 2093: 68 36 46 00 00 push $0x4636 + 2098: e8 b6 18 00 00 call 3953 + 209d: 83 c4 10 add $0x10,%esp + 20a0: 85 c0 test %eax,%eax + 20a2: 0f 84 e6 02 00 00 je 238e + if (chdir("dd/ff") == 0) { + 20a8: 83 ec 0c sub $0xc,%esp + 20ab: 68 21 45 00 00 push $0x4521 + 20b0: e8 56 18 00 00 call 390b + 20b5: 83 c4 10 add $0x10,%esp + 20b8: 85 c0 test %eax,%eax + 20ba: 0f 84 bb 02 00 00 je 237b + if (chdir("dd/xx") == 0) { + 20c0: 83 ec 0c sub $0xc,%esp + 20c3: 68 cd 46 00 00 push $0x46cd + 20c8: e8 3e 18 00 00 call 390b + 20cd: 83 c4 10 add $0x10,%esp + 20d0: 85 c0 test %eax,%eax + 20d2: 0f 84 90 02 00 00 je 2368 + if (unlink("dd/dd/ffff") != 0) { + 20d8: 83 ec 0c sub $0xc,%esp + 20db: 68 82 45 00 00 push $0x4582 + 20e0: e8 6e 18 00 00 call 3953 + 20e5: 83 c4 10 add $0x10,%esp + 20e8: 85 c0 test %eax,%eax + 20ea: 0f 85 9d 00 00 00 jne 218d + if (unlink("dd/ff") != 0) { + 20f0: 83 ec 0c sub $0xc,%esp + 20f3: 68 21 45 00 00 push $0x4521 + 20f8: e8 56 18 00 00 call 3953 + 20fd: 83 c4 10 add $0x10,%esp + 2100: 85 c0 test %eax,%eax + 2102: 0f 85 4d 02 00 00 jne 2355 + if (unlink("dd") == 0) { + 2108: 83 ec 0c sub $0xc,%esp + 210b: 68 e8 45 00 00 push $0x45e8 + 2110: e8 3e 18 00 00 call 3953 + 2115: 83 c4 10 add $0x10,%esp + 2118: 85 c0 test %eax,%eax + 211a: 0f 84 22 02 00 00 je 2342 + if (unlink("dd/dd") < 0) { + 2120: 83 ec 0c sub $0xc,%esp + 2123: 68 fd 44 00 00 push $0x44fd + 2128: e8 26 18 00 00 call 3953 + 212d: 83 c4 10 add $0x10,%esp + 2130: 85 c0 test %eax,%eax + 2132: 0f 88 f7 01 00 00 js 232f + if (unlink("dd") < 0) { + 2138: 83 ec 0c sub $0xc,%esp + 213b: 68 e8 45 00 00 push $0x45e8 + 2140: e8 0e 18 00 00 call 3953 + 2145: 83 c4 10 add $0x10,%esp + 2148: 85 c0 test %eax,%eax + 214a: 0f 88 cc 01 00 00 js 231c + printf(1, "subdir ok\n"); + 2150: 83 ec 08 sub $0x8,%esp + 2153: 68 ca 47 00 00 push $0x47ca + 2158: 6a 01 push $0x1 + 215a: e8 f1 18 00 00 call 3a50 +} + 215f: 8b 5d fc mov -0x4(%ebp),%ebx + 2162: 83 c4 10 add $0x10,%esp + 2165: c9 leave + 2166: c3 ret + printf(1, "dd/dd/../ff wrong content\n"); + 2167: 50 push %eax + 2168: 50 push %eax + 2169: 68 67 45 00 00 push $0x4567 + 216e: 6a 01 push $0x1 + 2170: e8 db 18 00 00 call 3a50 + exit(); + 2175: e8 59 17 00 00 call 38d3 + printf(1, "chdir dd/../../dd failed\n"); + 217a: 50 push %eax + 217b: 50 push %eax + 217c: 68 c2 45 00 00 push $0x45c2 + 2181: 6a 01 push $0x1 + 2183: e8 c8 18 00 00 call 3a50 + exit(); + 2188: e8 46 17 00 00 call 38d3 + printf(1, "unlink dd/dd/ff failed\n"); + 218d: 50 push %eax + 218e: 50 push %eax + 218f: 68 8d 45 00 00 push $0x458d + 2194: 6a 01 push $0x1 + 2196: e8 b5 18 00 00 call 3a50 + exit(); + 219b: e8 33 17 00 00 call 38d3 + printf(1, "create dd/ff/ff succeeded!\n"); + 21a0: 51 push %ecx + 21a1: 51 push %ecx + 21a2: 68 3f 46 00 00 push $0x463f + 21a7: 6a 01 push $0x1 + 21a9: e8 a2 18 00 00 call 3a50 + exit(); + 21ae: e8 20 17 00 00 call 38d3 + printf(1, "open (unlinked) dd/dd/ff succeeded!\n"); + 21b3: 53 push %ebx + 21b4: 53 push %ebx + 21b5: 68 24 50 00 00 push $0x5024 + 21ba: 6a 01 push $0x1 + 21bc: e8 8f 18 00 00 call 3a50 + exit(); + 21c1: e8 0d 17 00 00 call 38d3 + printf(1, "mkdir dd/ff/ff succeeded!\n"); + 21c6: 51 push %ecx + 21c7: 51 push %ecx + 21c8: 68 d3 46 00 00 push $0x46d3 + 21cd: 6a 01 push $0x1 + 21cf: e8 7c 18 00 00 call 3a50 + exit(); + 21d4: e8 fa 16 00 00 call 38d3 + printf(1, "link dd/ff dd/dd/ffff succeeded!\n"); + 21d9: 53 push %ebx + 21da: 53 push %ebx + 21db: 68 94 50 00 00 push $0x5094 + 21e0: 6a 01 push $0x1 + 21e2: e8 69 18 00 00 call 3a50 + exit(); + 21e7: e8 e7 16 00 00 call 38d3 + printf(1, "open dd/dd/../ff failed\n"); + 21ec: 50 push %eax + 21ed: 50 push %eax + 21ee: 68 4e 45 00 00 push $0x454e + 21f3: 6a 01 push $0x1 + 21f5: e8 56 18 00 00 call 3a50 + exit(); + 21fa: e8 d4 16 00 00 call 38d3 + printf(1, "create dd/dd/ff failed\n"); + 21ff: 51 push %ecx + 2200: 51 push %ecx + 2201: 68 27 45 00 00 push $0x4527 + 2206: 6a 01 push $0x1 + 2208: e8 43 18 00 00 call 3a50 + exit(); + 220d: e8 c1 16 00 00 call 38d3 + printf(1, "chdir ./.. failed\n"); + 2212: 50 push %eax + 2213: 50 push %eax + 2214: 68 f0 45 00 00 push $0x45f0 + 2219: 6a 01 push $0x1 + 221b: e8 30 18 00 00 call 3a50 + exit(); + 2220: e8 ae 16 00 00 call 38d3 + printf(1, "link dd/dd/ff dd/dd/ffff failed\n"); + 2225: 52 push %edx + 2226: 52 push %edx + 2227: 68 dc 4f 00 00 push $0x4fdc + 222c: 6a 01 push $0x1 + 222e: e8 1d 18 00 00 call 3a50 + exit(); + 2233: e8 9b 16 00 00 call 38d3 + printf(1, "link dd/xx/ff dd/dd/xx succeeded!\n"); + 2238: 50 push %eax + 2239: 50 push %eax + 223a: 68 70 50 00 00 push $0x5070 + 223f: 6a 01 push $0x1 + 2241: e8 0a 18 00 00 call 3a50 + exit(); + 2246: e8 88 16 00 00 call 38d3 + printf(1, "link dd/ff/ff dd/dd/xx succeeded!\n"); + 224b: 50 push %eax + 224c: 50 push %eax + 224d: 68 4c 50 00 00 push $0x504c + 2252: 6a 01 push $0x1 + 2254: e8 f7 17 00 00 call 3a50 + exit(); + 2259: e8 75 16 00 00 call 38d3 + printf(1, "open dd wronly succeeded!\n"); + 225e: 50 push %eax + 225f: 50 push %eax + 2260: 68 af 46 00 00 push $0x46af + 2265: 6a 01 push $0x1 + 2267: e8 e4 17 00 00 call 3a50 + exit(); + 226c: e8 62 16 00 00 call 38d3 + printf(1, "open dd rdwr succeeded!\n"); + 2271: 50 push %eax + 2272: 50 push %eax + 2273: 68 96 46 00 00 push $0x4696 + 2278: 6a 01 push $0x1 + 227a: e8 d1 17 00 00 call 3a50 + exit(); + 227f: e8 4f 16 00 00 call 38d3 + printf(1, "create dd succeeded!\n"); + 2284: 50 push %eax + 2285: 50 push %eax + 2286: 68 80 46 00 00 push $0x4680 + 228b: 6a 01 push $0x1 + 228d: e8 be 17 00 00 call 3a50 + exit(); + 2292: e8 3c 16 00 00 call 38d3 + printf(1, "create dd/xx/ff succeeded!\n"); + 2297: 52 push %edx + 2298: 52 push %edx + 2299: 68 64 46 00 00 push $0x4664 + 229e: 6a 01 push $0x1 + 22a0: e8 ab 17 00 00 call 3a50 + exit(); + 22a5: e8 29 16 00 00 call 38d3 + printf(1, "chdir dd failed\n"); + 22aa: 50 push %eax + 22ab: 50 push %eax + 22ac: 68 a5 45 00 00 push $0x45a5 + 22b1: 6a 01 push $0x1 + 22b3: e8 98 17 00 00 call 3a50 + exit(); + 22b8: e8 16 16 00 00 call 38d3 + printf(1, "open (unlinked) dd/dd/ff succeeded\n"); + 22bd: 50 push %eax + 22be: 50 push %eax + 22bf: 68 00 50 00 00 push $0x5000 + 22c4: 6a 01 push $0x1 + 22c6: e8 85 17 00 00 call 3a50 + exit(); + 22cb: e8 03 16 00 00 call 38d3 + printf(1, "subdir mkdir dd/dd failed\n"); + 22d0: 53 push %ebx + 22d1: 53 push %ebx + 22d2: 68 03 45 00 00 push $0x4503 + 22d7: 6a 01 push $0x1 + 22d9: e8 72 17 00 00 call 3a50 + exit(); + 22de: e8 f0 15 00 00 call 38d3 + printf(1, "unlink dd (non-empty dir) succeeded!\n"); + 22e3: 50 push %eax + 22e4: 50 push %eax + 22e5: 68 b4 4f 00 00 push $0x4fb4 + 22ea: 6a 01 push $0x1 + 22ec: e8 5f 17 00 00 call 3a50 + exit(); + 22f1: e8 dd 15 00 00 call 38d3 + printf(1, "create dd/ff failed\n"); + 22f6: 50 push %eax + 22f7: 50 push %eax + 22f8: 68 e7 44 00 00 push $0x44e7 + 22fd: 6a 01 push $0x1 + 22ff: e8 4c 17 00 00 call 3a50 + exit(); + 2304: e8 ca 15 00 00 call 38d3 + printf(1, "subdir mkdir dd failed\n"); + 2309: 50 push %eax + 230a: 50 push %eax + 230b: 68 cf 44 00 00 push $0x44cf + 2310: 6a 01 push $0x1 + 2312: e8 39 17 00 00 call 3a50 + exit(); + 2317: e8 b7 15 00 00 call 38d3 + printf(1, "unlink dd failed\n"); + 231c: 50 push %eax + 231d: 50 push %eax + 231e: 68 b8 47 00 00 push $0x47b8 + 2323: 6a 01 push $0x1 + 2325: e8 26 17 00 00 call 3a50 + exit(); + 232a: e8 a4 15 00 00 call 38d3 + printf(1, "unlink dd/dd failed\n"); + 232f: 52 push %edx + 2330: 52 push %edx + 2331: 68 a3 47 00 00 push $0x47a3 + 2336: 6a 01 push $0x1 + 2338: e8 13 17 00 00 call 3a50 + exit(); + 233d: e8 91 15 00 00 call 38d3 + printf(1, "unlink non-empty dd succeeded!\n"); + 2342: 51 push %ecx + 2343: 51 push %ecx + 2344: 68 b8 50 00 00 push $0x50b8 + 2349: 6a 01 push $0x1 + 234b: e8 00 17 00 00 call 3a50 + exit(); + 2350: e8 7e 15 00 00 call 38d3 + printf(1, "unlink dd/ff failed\n"); + 2355: 53 push %ebx + 2356: 53 push %ebx + 2357: 68 8e 47 00 00 push $0x478e + 235c: 6a 01 push $0x1 + 235e: e8 ed 16 00 00 call 3a50 + exit(); + 2363: e8 6b 15 00 00 call 38d3 + printf(1, "chdir dd/xx succeeded!\n"); + 2368: 50 push %eax + 2369: 50 push %eax + 236a: 68 76 47 00 00 push $0x4776 + 236f: 6a 01 push $0x1 + 2371: e8 da 16 00 00 call 3a50 + exit(); + 2376: e8 58 15 00 00 call 38d3 + printf(1, "chdir dd/ff succeeded!\n"); + 237b: 50 push %eax + 237c: 50 push %eax + 237d: 68 5e 47 00 00 push $0x475e + 2382: 6a 01 push $0x1 + 2384: e8 c7 16 00 00 call 3a50 + exit(); + 2389: e8 45 15 00 00 call 38d3 + printf(1, "unlink dd/ff/ff succeeded!\n"); + 238e: 50 push %eax + 238f: 50 push %eax + 2390: 68 42 47 00 00 push $0x4742 + 2395: 6a 01 push $0x1 + 2397: e8 b4 16 00 00 call 3a50 + exit(); + 239c: e8 32 15 00 00 call 38d3 + printf(1, "unlink dd/xx/ff succeeded!\n"); + 23a1: 50 push %eax + 23a2: 50 push %eax + 23a3: 68 26 47 00 00 push $0x4726 + 23a8: 6a 01 push $0x1 + 23aa: e8 a1 16 00 00 call 3a50 + exit(); + 23af: e8 1f 15 00 00 call 38d3 + printf(1, "mkdir dd/dd/ffff succeeded!\n"); + 23b4: 50 push %eax + 23b5: 50 push %eax + 23b6: 68 09 47 00 00 push $0x4709 + 23bb: 6a 01 push $0x1 + 23bd: e8 8e 16 00 00 call 3a50 + exit(); + 23c2: e8 0c 15 00 00 call 38d3 + printf(1, "mkdir dd/xx/ff succeeded!\n"); + 23c7: 52 push %edx + 23c8: 52 push %edx + 23c9: 68 ee 46 00 00 push $0x46ee + 23ce: 6a 01 push $0x1 + 23d0: e8 7b 16 00 00 call 3a50 + exit(); + 23d5: e8 f9 14 00 00 call 38d3 + printf(1, "read dd/dd/ffff wrong len\n"); + 23da: 51 push %ecx + 23db: 51 push %ecx + 23dc: 68 1b 46 00 00 push $0x461b + 23e1: 6a 01 push $0x1 + 23e3: e8 68 16 00 00 call 3a50 + exit(); + 23e8: e8 e6 14 00 00 call 38d3 + printf(1, "open dd/dd/ffff failed\n"); + 23ed: 53 push %ebx + 23ee: 53 push %ebx + 23ef: 68 03 46 00 00 push $0x4603 + 23f4: 6a 01 push $0x1 + 23f6: e8 55 16 00 00 call 3a50 + exit(); + 23fb: e8 d3 14 00 00 call 38d3 + +00002400 : +void bigwrite(void) { + 2400: 55 push %ebp + 2401: 89 e5 mov %esp,%ebp + 2403: 56 push %esi + 2404: 53 push %ebx + for (sz = 499; sz < 12 * 512; sz += 471) { + 2405: bb f3 01 00 00 mov $0x1f3,%ebx + printf(1, "bigwrite test\n"); + 240a: 83 ec 08 sub $0x8,%esp + 240d: 68 d5 47 00 00 push $0x47d5 + 2412: 6a 01 push $0x1 + 2414: e8 37 16 00 00 call 3a50 + unlink("bigwrite"); + 2419: c7 04 24 e4 47 00 00 movl $0x47e4,(%esp) + 2420: e8 2e 15 00 00 call 3953 + 2425: 83 c4 10 add $0x10,%esp + 2428: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 242f: 90 nop + fd = open("bigwrite", O_CREATE | O_RDWR); + 2430: 83 ec 08 sub $0x8,%esp + 2433: 68 02 02 00 00 push $0x202 + 2438: 68 e4 47 00 00 push $0x47e4 + 243d: e8 f9 14 00 00 call 393b + if (fd < 0) { + 2442: 83 c4 10 add $0x10,%esp + fd = open("bigwrite", O_CREATE | O_RDWR); + 2445: 89 c6 mov %eax,%esi + if (fd < 0) { + 2447: 85 c0 test %eax,%eax + 2449: 78 7e js 24c9 + int cc = write(fd, buf, sz); + 244b: 83 ec 04 sub $0x4,%esp + 244e: 53 push %ebx + 244f: 68 a0 85 00 00 push $0x85a0 + 2454: 50 push %eax + 2455: e8 e9 14 00 00 call 3943 + if (cc != sz) { + 245a: 83 c4 10 add $0x10,%esp + 245d: 39 d8 cmp %ebx,%eax + 245f: 75 55 jne 24b6 + int cc = write(fd, buf, sz); + 2461: 83 ec 04 sub $0x4,%esp + 2464: 53 push %ebx + 2465: 68 a0 85 00 00 push $0x85a0 + 246a: 56 push %esi + 246b: e8 d3 14 00 00 call 3943 + if (cc != sz) { + 2470: 83 c4 10 add $0x10,%esp + 2473: 39 d8 cmp %ebx,%eax + 2475: 75 3f jne 24b6 + close(fd); + 2477: 83 ec 0c sub $0xc,%esp + for (sz = 499; sz < 12 * 512; sz += 471) { + 247a: 81 c3 d7 01 00 00 add $0x1d7,%ebx + close(fd); + 2480: 56 push %esi + 2481: e8 e5 14 00 00 call 396b + unlink("bigwrite"); + 2486: c7 04 24 e4 47 00 00 movl $0x47e4,(%esp) + 248d: e8 c1 14 00 00 call 3953 + for (sz = 499; sz < 12 * 512; sz += 471) { + 2492: 83 c4 10 add $0x10,%esp + 2495: 81 fb 07 18 00 00 cmp $0x1807,%ebx + 249b: 75 93 jne 2430 + printf(1, "bigwrite ok\n"); + 249d: 83 ec 08 sub $0x8,%esp + 24a0: 68 17 48 00 00 push $0x4817 + 24a5: 6a 01 push $0x1 + 24a7: e8 a4 15 00 00 call 3a50 +} + 24ac: 83 c4 10 add $0x10,%esp + 24af: 8d 65 f8 lea -0x8(%ebp),%esp + 24b2: 5b pop %ebx + 24b3: 5e pop %esi + 24b4: 5d pop %ebp + 24b5: c3 ret + printf(1, "write(%d) ret %d\n", sz, cc); + 24b6: 50 push %eax + 24b7: 53 push %ebx + 24b8: 68 05 48 00 00 push $0x4805 + 24bd: 6a 01 push $0x1 + 24bf: e8 8c 15 00 00 call 3a50 + exit(); + 24c4: e8 0a 14 00 00 call 38d3 + printf(1, "cannot create bigwrite\n"); + 24c9: 83 ec 08 sub $0x8,%esp + 24cc: 68 ed 47 00 00 push $0x47ed + 24d1: 6a 01 push $0x1 + 24d3: e8 78 15 00 00 call 3a50 + exit(); + 24d8: e8 f6 13 00 00 call 38d3 + 24dd: 8d 76 00 lea 0x0(%esi),%esi + +000024e0 : +void bigfile(void) { + 24e0: 55 push %ebp + 24e1: 89 e5 mov %esp,%ebp + 24e3: 57 push %edi + 24e4: 56 push %esi + 24e5: 53 push %ebx + 24e6: 83 ec 14 sub $0x14,%esp + printf(1, "bigfile test\n"); + 24e9: 68 24 48 00 00 push $0x4824 + 24ee: 6a 01 push $0x1 + 24f0: e8 5b 15 00 00 call 3a50 + unlink("bigfile"); + 24f5: c7 04 24 40 48 00 00 movl $0x4840,(%esp) + 24fc: e8 52 14 00 00 call 3953 + fd = open("bigfile", O_CREATE | O_RDWR); + 2501: 58 pop %eax + 2502: 5a pop %edx + 2503: 68 02 02 00 00 push $0x202 + 2508: 68 40 48 00 00 push $0x4840 + 250d: e8 29 14 00 00 call 393b + if (fd < 0) { + 2512: 83 c4 10 add $0x10,%esp + 2515: 85 c0 test %eax,%eax + 2517: 0f 88 5e 01 00 00 js 267b + 251d: 89 c6 mov %eax,%esi + for (i = 0; i < 20; i++) { + 251f: 31 db xor %ebx,%ebx + 2521: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + memset(buf, i, 600); + 2528: 83 ec 04 sub $0x4,%esp + 252b: 68 58 02 00 00 push $0x258 + 2530: 53 push %ebx + 2531: 68 a0 85 00 00 push $0x85a0 + 2536: e8 05 12 00 00 call 3740 + if (write(fd, buf, 600) != 600) { + 253b: 83 c4 0c add $0xc,%esp + 253e: 68 58 02 00 00 push $0x258 + 2543: 68 a0 85 00 00 push $0x85a0 + 2548: 56 push %esi + 2549: e8 f5 13 00 00 call 3943 + 254e: 83 c4 10 add $0x10,%esp + 2551: 3d 58 02 00 00 cmp $0x258,%eax + 2556: 0f 85 f8 00 00 00 jne 2654 + for (i = 0; i < 20; i++) { + 255c: 83 c3 01 add $0x1,%ebx + 255f: 83 fb 14 cmp $0x14,%ebx + 2562: 75 c4 jne 2528 + close(fd); + 2564: 83 ec 0c sub $0xc,%esp + 2567: 56 push %esi + 2568: e8 fe 13 00 00 call 396b + fd = open("bigfile", 0); + 256d: 5e pop %esi + 256e: 5f pop %edi + 256f: 6a 00 push $0x0 + 2571: 68 40 48 00 00 push $0x4840 + 2576: e8 c0 13 00 00 call 393b + if (fd < 0) { + 257b: 83 c4 10 add $0x10,%esp + fd = open("bigfile", 0); + 257e: 89 c6 mov %eax,%esi + if (fd < 0) { + 2580: 85 c0 test %eax,%eax + 2582: 0f 88 e0 00 00 00 js 2668 + total = 0; + 2588: 31 db xor %ebx,%ebx + for (i = 0;; i++) { + 258a: 31 ff xor %edi,%edi + 258c: eb 30 jmp 25be + 258e: 66 90 xchg %ax,%ax + if (cc != 300) { + 2590: 3d 2c 01 00 00 cmp $0x12c,%eax + 2595: 0f 85 91 00 00 00 jne 262c + if (buf[0] != i / 2 || buf[299] != i / 2) { + 259b: 89 fa mov %edi,%edx + 259d: 0f be 05 a0 85 00 00 movsbl 0x85a0,%eax + 25a4: d1 fa sar %edx + 25a6: 39 d0 cmp %edx,%eax + 25a8: 75 6e jne 2618 + 25aa: 0f be 15 cb 86 00 00 movsbl 0x86cb,%edx + 25b1: 39 d0 cmp %edx,%eax + 25b3: 75 63 jne 2618 + total += cc; + 25b5: 81 c3 2c 01 00 00 add $0x12c,%ebx + for (i = 0;; i++) { + 25bb: 83 c7 01 add $0x1,%edi + cc = read(fd, buf, 300); + 25be: 83 ec 04 sub $0x4,%esp + 25c1: 68 2c 01 00 00 push $0x12c + 25c6: 68 a0 85 00 00 push $0x85a0 + 25cb: 56 push %esi + 25cc: e8 1a 13 00 00 call 38eb + if (cc < 0) { + 25d1: 83 c4 10 add $0x10,%esp + 25d4: 85 c0 test %eax,%eax + 25d6: 78 68 js 2640 + if (cc == 0) { + 25d8: 75 b6 jne 2590 + close(fd); + 25da: 83 ec 0c sub $0xc,%esp + 25dd: 56 push %esi + 25de: e8 88 13 00 00 call 396b + if (total != 20 * 600) { + 25e3: 83 c4 10 add $0x10,%esp + 25e6: 81 fb e0 2e 00 00 cmp $0x2ee0,%ebx + 25ec: 0f 85 9c 00 00 00 jne 268e + unlink("bigfile"); + 25f2: 83 ec 0c sub $0xc,%esp + 25f5: 68 40 48 00 00 push $0x4840 + 25fa: e8 54 13 00 00 call 3953 + printf(1, "bigfile test ok\n"); + 25ff: 58 pop %eax + 2600: 5a pop %edx + 2601: 68 cf 48 00 00 push $0x48cf + 2606: 6a 01 push $0x1 + 2608: e8 43 14 00 00 call 3a50 +} + 260d: 83 c4 10 add $0x10,%esp + 2610: 8d 65 f4 lea -0xc(%ebp),%esp + 2613: 5b pop %ebx + 2614: 5e pop %esi + 2615: 5f pop %edi + 2616: 5d pop %ebp + 2617: c3 ret + printf(1, "read bigfile wrong data\n"); + 2618: 83 ec 08 sub $0x8,%esp + 261b: 68 9c 48 00 00 push $0x489c + 2620: 6a 01 push $0x1 + 2622: e8 29 14 00 00 call 3a50 + exit(); + 2627: e8 a7 12 00 00 call 38d3 + printf(1, "short read bigfile\n"); + 262c: 83 ec 08 sub $0x8,%esp + 262f: 68 88 48 00 00 push $0x4888 + 2634: 6a 01 push $0x1 + 2636: e8 15 14 00 00 call 3a50 + exit(); + 263b: e8 93 12 00 00 call 38d3 + printf(1, "read bigfile failed\n"); + 2640: 83 ec 08 sub $0x8,%esp + 2643: 68 73 48 00 00 push $0x4873 + 2648: 6a 01 push $0x1 + 264a: e8 01 14 00 00 call 3a50 + exit(); + 264f: e8 7f 12 00 00 call 38d3 + printf(1, "write bigfile failed\n"); + 2654: 83 ec 08 sub $0x8,%esp + 2657: 68 48 48 00 00 push $0x4848 + 265c: 6a 01 push $0x1 + 265e: e8 ed 13 00 00 call 3a50 + exit(); + 2663: e8 6b 12 00 00 call 38d3 + printf(1, "cannot open bigfile\n"); + 2668: 53 push %ebx + 2669: 53 push %ebx + 266a: 68 5e 48 00 00 push $0x485e + 266f: 6a 01 push $0x1 + 2671: e8 da 13 00 00 call 3a50 + exit(); + 2676: e8 58 12 00 00 call 38d3 + printf(1, "cannot create bigfile"); + 267b: 50 push %eax + 267c: 50 push %eax + 267d: 68 32 48 00 00 push $0x4832 + 2682: 6a 01 push $0x1 + 2684: e8 c7 13 00 00 call 3a50 + exit(); + 2689: e8 45 12 00 00 call 38d3 + printf(1, "read bigfile wrong total\n"); + 268e: 51 push %ecx + 268f: 51 push %ecx + 2690: 68 b5 48 00 00 push $0x48b5 + 2695: 6a 01 push $0x1 + 2697: e8 b4 13 00 00 call 3a50 + exit(); + 269c: e8 32 12 00 00 call 38d3 + 26a1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26a8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26af: 90 nop + +000026b0 : +void fourteen(void) { + 26b0: 55 push %ebp + 26b1: 89 e5 mov %esp,%ebp + 26b3: 83 ec 10 sub $0x10,%esp + printf(1, "fourteen test\n"); + 26b6: 68 e0 48 00 00 push $0x48e0 + 26bb: 6a 01 push $0x1 + 26bd: e8 8e 13 00 00 call 3a50 + if (mkdir("12345678901234") != 0) { + 26c2: c7 04 24 1b 49 00 00 movl $0x491b,(%esp) + 26c9: e8 95 12 00 00 call 3963 + 26ce: 83 c4 10 add $0x10,%esp + 26d1: 85 c0 test %eax,%eax + 26d3: 0f 85 97 00 00 00 jne 2770 + if (mkdir("12345678901234/123456789012345") != 0) { + 26d9: 83 ec 0c sub $0xc,%esp + 26dc: 68 d8 50 00 00 push $0x50d8 + 26e1: e8 7d 12 00 00 call 3963 + 26e6: 83 c4 10 add $0x10,%esp + 26e9: 85 c0 test %eax,%eax + 26eb: 0f 85 de 00 00 00 jne 27cf + fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); + 26f1: 83 ec 08 sub $0x8,%esp + 26f4: 68 00 02 00 00 push $0x200 + 26f9: 68 28 51 00 00 push $0x5128 + 26fe: e8 38 12 00 00 call 393b + if (fd < 0) { + 2703: 83 c4 10 add $0x10,%esp + 2706: 85 c0 test %eax,%eax + 2708: 0f 88 ae 00 00 00 js 27bc + close(fd); + 270e: 83 ec 0c sub $0xc,%esp + 2711: 50 push %eax + 2712: e8 54 12 00 00 call 396b + fd = open("12345678901234/12345678901234/12345678901234", 0); + 2717: 58 pop %eax + 2718: 5a pop %edx + 2719: 6a 00 push $0x0 + 271b: 68 98 51 00 00 push $0x5198 + 2720: e8 16 12 00 00 call 393b + if (fd < 0) { + 2725: 83 c4 10 add $0x10,%esp + 2728: 85 c0 test %eax,%eax + 272a: 78 7d js 27a9 + close(fd); + 272c: 83 ec 0c sub $0xc,%esp + 272f: 50 push %eax + 2730: e8 36 12 00 00 call 396b + if (mkdir("12345678901234/12345678901234") == 0) { + 2735: c7 04 24 0c 49 00 00 movl $0x490c,(%esp) + 273c: e8 22 12 00 00 call 3963 + 2741: 83 c4 10 add $0x10,%esp + 2744: 85 c0 test %eax,%eax + 2746: 74 4e je 2796 + if (mkdir("123456789012345/12345678901234") == 0) { + 2748: 83 ec 0c sub $0xc,%esp + 274b: 68 34 52 00 00 push $0x5234 + 2750: e8 0e 12 00 00 call 3963 + 2755: 83 c4 10 add $0x10,%esp + 2758: 85 c0 test %eax,%eax + 275a: 74 27 je 2783 + printf(1, "fourteen ok\n"); + 275c: 83 ec 08 sub $0x8,%esp + 275f: 68 2a 49 00 00 push $0x492a + 2764: 6a 01 push $0x1 + 2766: e8 e5 12 00 00 call 3a50 +} + 276b: 83 c4 10 add $0x10,%esp + 276e: c9 leave + 276f: c3 ret + printf(1, "mkdir 12345678901234 failed\n"); + 2770: 50 push %eax + 2771: 50 push %eax + 2772: 68 ef 48 00 00 push $0x48ef + 2777: 6a 01 push $0x1 + 2779: e8 d2 12 00 00 call 3a50 + exit(); + 277e: e8 50 11 00 00 call 38d3 + printf(1, "mkdir 12345678901234/123456789012345 succeeded!\n"); + 2783: 50 push %eax + 2784: 50 push %eax + 2785: 68 54 52 00 00 push $0x5254 + 278a: 6a 01 push $0x1 + 278c: e8 bf 12 00 00 call 3a50 + exit(); + 2791: e8 3d 11 00 00 call 38d3 + printf(1, "mkdir 12345678901234/12345678901234 succeeded!\n"); + 2796: 52 push %edx + 2797: 52 push %edx + 2798: 68 04 52 00 00 push $0x5204 + 279d: 6a 01 push $0x1 + 279f: e8 ac 12 00 00 call 3a50 + exit(); + 27a4: e8 2a 11 00 00 call 38d3 + printf(1, "open 12345678901234/12345678901234/12345678901234 failed\n"); + 27a9: 51 push %ecx + 27aa: 51 push %ecx + 27ab: 68 c8 51 00 00 push $0x51c8 + 27b0: 6a 01 push $0x1 + 27b2: e8 99 12 00 00 call 3a50 + exit(); + 27b7: e8 17 11 00 00 call 38d3 + printf(1, "create 123456789012345/123456789012345/123456789012345 failed\n"); + 27bc: 51 push %ecx + 27bd: 51 push %ecx + 27be: 68 58 51 00 00 push $0x5158 + 27c3: 6a 01 push $0x1 + 27c5: e8 86 12 00 00 call 3a50 + exit(); + 27ca: e8 04 11 00 00 call 38d3 + printf(1, "mkdir 12345678901234/123456789012345 failed\n"); + 27cf: 50 push %eax + 27d0: 50 push %eax + 27d1: 68 f8 50 00 00 push $0x50f8 + 27d6: 6a 01 push $0x1 + 27d8: e8 73 12 00 00 call 3a50 + exit(); + 27dd: e8 f1 10 00 00 call 38d3 + 27e2: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 27e9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +000027f0 : +void rmdot(void) { + 27f0: 55 push %ebp + 27f1: 89 e5 mov %esp,%ebp + 27f3: 83 ec 10 sub $0x10,%esp + printf(1, "rmdot test\n"); + 27f6: 68 37 49 00 00 push $0x4937 + 27fb: 6a 01 push $0x1 + 27fd: e8 4e 12 00 00 call 3a50 + if (mkdir("dots") != 0) { + 2802: c7 04 24 43 49 00 00 movl $0x4943,(%esp) + 2809: e8 55 11 00 00 call 3963 + 280e: 83 c4 10 add $0x10,%esp + 2811: 85 c0 test %eax,%eax + 2813: 0f 85 b0 00 00 00 jne 28c9 + if (chdir("dots") != 0) { + 2819: 83 ec 0c sub $0xc,%esp + 281c: 68 43 49 00 00 push $0x4943 + 2821: e8 e5 10 00 00 call 390b + 2826: 83 c4 10 add $0x10,%esp + 2829: 85 c0 test %eax,%eax + 282b: 0f 85 1d 01 00 00 jne 294e + if (unlink(".") == 0) { + 2831: 83 ec 0c sub $0xc,%esp + 2834: 68 ee 45 00 00 push $0x45ee + 2839: e8 15 11 00 00 call 3953 + 283e: 83 c4 10 add $0x10,%esp + 2841: 85 c0 test %eax,%eax + 2843: 0f 84 f2 00 00 00 je 293b + if (unlink("..") == 0) { + 2849: 83 ec 0c sub $0xc,%esp + 284c: 68 ed 45 00 00 push $0x45ed + 2851: e8 fd 10 00 00 call 3953 + 2856: 83 c4 10 add $0x10,%esp + 2859: 85 c0 test %eax,%eax + 285b: 0f 84 c7 00 00 00 je 2928 + if (chdir("/") != 0) { + 2861: 83 ec 0c sub $0xc,%esp + 2864: 68 c1 3d 00 00 push $0x3dc1 + 2869: e8 9d 10 00 00 call 390b + 286e: 83 c4 10 add $0x10,%esp + 2871: 85 c0 test %eax,%eax + 2873: 0f 85 9c 00 00 00 jne 2915 + if (unlink("dots/.") == 0) { + 2879: 83 ec 0c sub $0xc,%esp + 287c: 68 8b 49 00 00 push $0x498b + 2881: e8 cd 10 00 00 call 3953 + 2886: 83 c4 10 add $0x10,%esp + 2889: 85 c0 test %eax,%eax + 288b: 74 75 je 2902 + if (unlink("dots/..") == 0) { + 288d: 83 ec 0c sub $0xc,%esp + 2890: 68 a9 49 00 00 push $0x49a9 + 2895: e8 b9 10 00 00 call 3953 + 289a: 83 c4 10 add $0x10,%esp + 289d: 85 c0 test %eax,%eax + 289f: 74 4e je 28ef + if (unlink("dots") != 0) { + 28a1: 83 ec 0c sub $0xc,%esp + 28a4: 68 43 49 00 00 push $0x4943 + 28a9: e8 a5 10 00 00 call 3953 + 28ae: 83 c4 10 add $0x10,%esp + 28b1: 85 c0 test %eax,%eax + 28b3: 75 27 jne 28dc + printf(1, "rmdot ok\n"); + 28b5: 83 ec 08 sub $0x8,%esp + 28b8: 68 de 49 00 00 push $0x49de + 28bd: 6a 01 push $0x1 + 28bf: e8 8c 11 00 00 call 3a50 +} + 28c4: 83 c4 10 add $0x10,%esp + 28c7: c9 leave + 28c8: c3 ret + printf(1, "mkdir dots failed\n"); + 28c9: 50 push %eax + 28ca: 50 push %eax + 28cb: 68 48 49 00 00 push $0x4948 + 28d0: 6a 01 push $0x1 + 28d2: e8 79 11 00 00 call 3a50 + exit(); + 28d7: e8 f7 0f 00 00 call 38d3 + printf(1, "unlink dots failed!\n"); + 28dc: 50 push %eax + 28dd: 50 push %eax + 28de: 68 c9 49 00 00 push $0x49c9 + 28e3: 6a 01 push $0x1 + 28e5: e8 66 11 00 00 call 3a50 + exit(); + 28ea: e8 e4 0f 00 00 call 38d3 + printf(1, "unlink dots/.. worked!\n"); + 28ef: 52 push %edx + 28f0: 52 push %edx + 28f1: 68 b1 49 00 00 push $0x49b1 + 28f6: 6a 01 push $0x1 + 28f8: e8 53 11 00 00 call 3a50 + exit(); + 28fd: e8 d1 0f 00 00 call 38d3 + printf(1, "unlink dots/. worked!\n"); + 2902: 51 push %ecx + 2903: 51 push %ecx + 2904: 68 92 49 00 00 push $0x4992 + 2909: 6a 01 push $0x1 + 290b: e8 40 11 00 00 call 3a50 + exit(); + 2910: e8 be 0f 00 00 call 38d3 + printf(1, "chdir / failed\n"); + 2915: 50 push %eax + 2916: 50 push %eax + 2917: 68 c3 3d 00 00 push $0x3dc3 + 291c: 6a 01 push $0x1 + 291e: e8 2d 11 00 00 call 3a50 + exit(); + 2923: e8 ab 0f 00 00 call 38d3 + printf(1, "rm .. worked!\n"); + 2928: 50 push %eax + 2929: 50 push %eax + 292a: 68 7c 49 00 00 push $0x497c + 292f: 6a 01 push $0x1 + 2931: e8 1a 11 00 00 call 3a50 + exit(); + 2936: e8 98 0f 00 00 call 38d3 + printf(1, "rm . worked!\n"); + 293b: 50 push %eax + 293c: 50 push %eax + 293d: 68 6e 49 00 00 push $0x496e + 2942: 6a 01 push $0x1 + 2944: e8 07 11 00 00 call 3a50 + exit(); + 2949: e8 85 0f 00 00 call 38d3 + printf(1, "chdir dots failed\n"); + 294e: 50 push %eax + 294f: 50 push %eax + 2950: 68 5b 49 00 00 push $0x495b + 2955: 6a 01 push $0x1 + 2957: e8 f4 10 00 00 call 3a50 + exit(); + 295c: e8 72 0f 00 00 call 38d3 + 2961: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2968: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 296f: 90 nop + +00002970 : +void dirfile(void) { + 2970: 55 push %ebp + 2971: 89 e5 mov %esp,%ebp + 2973: 53 push %ebx + 2974: 83 ec 0c sub $0xc,%esp + printf(1, "dir vs file\n"); + 2977: 68 e8 49 00 00 push $0x49e8 + 297c: 6a 01 push $0x1 + 297e: e8 cd 10 00 00 call 3a50 + fd = open("dirfile", O_CREATE); + 2983: 5b pop %ebx + 2984: 58 pop %eax + 2985: 68 00 02 00 00 push $0x200 + 298a: 68 f5 49 00 00 push $0x49f5 + 298f: e8 a7 0f 00 00 call 393b + if (fd < 0) { + 2994: 83 c4 10 add $0x10,%esp + 2997: 85 c0 test %eax,%eax + 2999: 0f 88 43 01 00 00 js 2ae2 + close(fd); + 299f: 83 ec 0c sub $0xc,%esp + 29a2: 50 push %eax + 29a3: e8 c3 0f 00 00 call 396b + if (chdir("dirfile") == 0) { + 29a8: c7 04 24 f5 49 00 00 movl $0x49f5,(%esp) + 29af: e8 57 0f 00 00 call 390b + 29b4: 83 c4 10 add $0x10,%esp + 29b7: 85 c0 test %eax,%eax + 29b9: 0f 84 10 01 00 00 je 2acf + fd = open("dirfile/xx", 0); + 29bf: 83 ec 08 sub $0x8,%esp + 29c2: 6a 00 push $0x0 + 29c4: 68 2e 4a 00 00 push $0x4a2e + 29c9: e8 6d 0f 00 00 call 393b + if (fd >= 0) { + 29ce: 83 c4 10 add $0x10,%esp + 29d1: 85 c0 test %eax,%eax + 29d3: 0f 89 e3 00 00 00 jns 2abc + fd = open("dirfile/xx", O_CREATE); + 29d9: 83 ec 08 sub $0x8,%esp + 29dc: 68 00 02 00 00 push $0x200 + 29e1: 68 2e 4a 00 00 push $0x4a2e + 29e6: e8 50 0f 00 00 call 393b + if (fd >= 0) { + 29eb: 83 c4 10 add $0x10,%esp + 29ee: 85 c0 test %eax,%eax + 29f0: 0f 89 c6 00 00 00 jns 2abc + if (mkdir("dirfile/xx") == 0) { + 29f6: 83 ec 0c sub $0xc,%esp + 29f9: 68 2e 4a 00 00 push $0x4a2e + 29fe: e8 60 0f 00 00 call 3963 + 2a03: 83 c4 10 add $0x10,%esp + 2a06: 85 c0 test %eax,%eax + 2a08: 0f 84 46 01 00 00 je 2b54 + if (unlink("dirfile/xx") == 0) { + 2a0e: 83 ec 0c sub $0xc,%esp + 2a11: 68 2e 4a 00 00 push $0x4a2e + 2a16: e8 38 0f 00 00 call 3953 + 2a1b: 83 c4 10 add $0x10,%esp + 2a1e: 85 c0 test %eax,%eax + 2a20: 0f 84 1b 01 00 00 je 2b41 + if (link("README", "dirfile/xx") == 0) { + 2a26: 83 ec 08 sub $0x8,%esp + 2a29: 68 2e 4a 00 00 push $0x4a2e + 2a2e: 68 92 4a 00 00 push $0x4a92 + 2a33: e8 23 0f 00 00 call 395b + 2a38: 83 c4 10 add $0x10,%esp + 2a3b: 85 c0 test %eax,%eax + 2a3d: 0f 84 eb 00 00 00 je 2b2e + if (unlink("dirfile") != 0) { + 2a43: 83 ec 0c sub $0xc,%esp + 2a46: 68 f5 49 00 00 push $0x49f5 + 2a4b: e8 03 0f 00 00 call 3953 + 2a50: 83 c4 10 add $0x10,%esp + 2a53: 85 c0 test %eax,%eax + 2a55: 0f 85 c0 00 00 00 jne 2b1b + fd = open(".", O_RDWR); + 2a5b: 83 ec 08 sub $0x8,%esp + 2a5e: 6a 02 push $0x2 + 2a60: 68 ee 45 00 00 push $0x45ee + 2a65: e8 d1 0e 00 00 call 393b + if (fd >= 0) { + 2a6a: 83 c4 10 add $0x10,%esp + 2a6d: 85 c0 test %eax,%eax + 2a6f: 0f 89 93 00 00 00 jns 2b08 + fd = open(".", 0); + 2a75: 83 ec 08 sub $0x8,%esp + 2a78: 6a 00 push $0x0 + 2a7a: 68 ee 45 00 00 push $0x45ee + 2a7f: e8 b7 0e 00 00 call 393b + if (write(fd, "x", 1) > 0) { + 2a84: 83 c4 0c add $0xc,%esp + 2a87: 6a 01 push $0x1 + fd = open(".", 0); + 2a89: 89 c3 mov %eax,%ebx + if (write(fd, "x", 1) > 0) { + 2a8b: 68 d1 46 00 00 push $0x46d1 + 2a90: 50 push %eax + 2a91: e8 ad 0e 00 00 call 3943 + 2a96: 83 c4 10 add $0x10,%esp + 2a99: 85 c0 test %eax,%eax + 2a9b: 7f 58 jg 2af5 + close(fd); + 2a9d: 83 ec 0c sub $0xc,%esp + 2aa0: 53 push %ebx + 2aa1: e8 c5 0e 00 00 call 396b + printf(1, "dir vs file OK\n"); + 2aa6: 58 pop %eax + 2aa7: 5a pop %edx + 2aa8: 68 c5 4a 00 00 push $0x4ac5 + 2aad: 6a 01 push $0x1 + 2aaf: e8 9c 0f 00 00 call 3a50 +} + 2ab4: 8b 5d fc mov -0x4(%ebp),%ebx + 2ab7: 83 c4 10 add $0x10,%esp + 2aba: c9 leave + 2abb: c3 ret + printf(1, "create dirfile/xx succeeded!\n"); + 2abc: 50 push %eax + 2abd: 50 push %eax + 2abe: 68 39 4a 00 00 push $0x4a39 + 2ac3: 6a 01 push $0x1 + 2ac5: e8 86 0f 00 00 call 3a50 + exit(); + 2aca: e8 04 0e 00 00 call 38d3 + printf(1, "chdir dirfile succeeded!\n"); + 2acf: 52 push %edx + 2ad0: 52 push %edx + 2ad1: 68 14 4a 00 00 push $0x4a14 + 2ad6: 6a 01 push $0x1 + 2ad8: e8 73 0f 00 00 call 3a50 + exit(); + 2add: e8 f1 0d 00 00 call 38d3 + printf(1, "create dirfile failed\n"); + 2ae2: 51 push %ecx + 2ae3: 51 push %ecx + 2ae4: 68 fd 49 00 00 push $0x49fd + 2ae9: 6a 01 push $0x1 + 2aeb: e8 60 0f 00 00 call 3a50 + exit(); + 2af0: e8 de 0d 00 00 call 38d3 + printf(1, "write . succeeded!\n"); + 2af5: 51 push %ecx + 2af6: 51 push %ecx + 2af7: 68 b1 4a 00 00 push $0x4ab1 + 2afc: 6a 01 push $0x1 + 2afe: e8 4d 0f 00 00 call 3a50 + exit(); + 2b03: e8 cb 0d 00 00 call 38d3 + printf(1, "open . for writing succeeded!\n"); + 2b08: 53 push %ebx + 2b09: 53 push %ebx + 2b0a: 68 a8 52 00 00 push $0x52a8 + 2b0f: 6a 01 push $0x1 + 2b11: e8 3a 0f 00 00 call 3a50 + exit(); + 2b16: e8 b8 0d 00 00 call 38d3 + printf(1, "unlink dirfile failed!\n"); + 2b1b: 50 push %eax + 2b1c: 50 push %eax + 2b1d: 68 99 4a 00 00 push $0x4a99 + 2b22: 6a 01 push $0x1 + 2b24: e8 27 0f 00 00 call 3a50 + exit(); + 2b29: e8 a5 0d 00 00 call 38d3 + printf(1, "link to dirfile/xx succeeded!\n"); + 2b2e: 50 push %eax + 2b2f: 50 push %eax + 2b30: 68 88 52 00 00 push $0x5288 + 2b35: 6a 01 push $0x1 + 2b37: e8 14 0f 00 00 call 3a50 + exit(); + 2b3c: e8 92 0d 00 00 call 38d3 + printf(1, "unlink dirfile/xx succeeded!\n"); + 2b41: 50 push %eax + 2b42: 50 push %eax + 2b43: 68 74 4a 00 00 push $0x4a74 + 2b48: 6a 01 push $0x1 + 2b4a: e8 01 0f 00 00 call 3a50 + exit(); + 2b4f: e8 7f 0d 00 00 call 38d3 + printf(1, "mkdir dirfile/xx succeeded!\n"); + 2b54: 50 push %eax + 2b55: 50 push %eax + 2b56: 68 57 4a 00 00 push $0x4a57 + 2b5b: 6a 01 push $0x1 + 2b5d: e8 ee 0e 00 00 call 3a50 + exit(); + 2b62: e8 6c 0d 00 00 call 38d3 + 2b67: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2b6e: 66 90 xchg %ax,%ax + +00002b70 : +void iref(void) { + 2b70: 55 push %ebp + 2b71: 89 e5 mov %esp,%ebp + 2b73: 53 push %ebx + printf(1, "empty file name\n"); + 2b74: bb 33 00 00 00 mov $0x33,%ebx +void iref(void) { + 2b79: 83 ec 0c sub $0xc,%esp + printf(1, "empty file name\n"); + 2b7c: 68 d5 4a 00 00 push $0x4ad5 + 2b81: 6a 01 push $0x1 + 2b83: e8 c8 0e 00 00 call 3a50 + 2b88: 83 c4 10 add $0x10,%esp + 2b8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2b8f: 90 nop + if (mkdir("irefd") != 0) { + 2b90: 83 ec 0c sub $0xc,%esp + 2b93: 68 e6 4a 00 00 push $0x4ae6 + 2b98: e8 c6 0d 00 00 call 3963 + 2b9d: 83 c4 10 add $0x10,%esp + 2ba0: 85 c0 test %eax,%eax + 2ba2: 0f 85 bb 00 00 00 jne 2c63 + if (chdir("irefd") != 0) { + 2ba8: 83 ec 0c sub $0xc,%esp + 2bab: 68 e6 4a 00 00 push $0x4ae6 + 2bb0: e8 56 0d 00 00 call 390b + 2bb5: 83 c4 10 add $0x10,%esp + 2bb8: 85 c0 test %eax,%eax + 2bba: 0f 85 b7 00 00 00 jne 2c77 + mkdir(""); + 2bc0: 83 ec 0c sub $0xc,%esp + 2bc3: 68 9b 41 00 00 push $0x419b + 2bc8: e8 96 0d 00 00 call 3963 + link("README", ""); + 2bcd: 59 pop %ecx + 2bce: 58 pop %eax + 2bcf: 68 9b 41 00 00 push $0x419b + 2bd4: 68 92 4a 00 00 push $0x4a92 + 2bd9: e8 7d 0d 00 00 call 395b + fd = open("", O_CREATE); + 2bde: 58 pop %eax + 2bdf: 5a pop %edx + 2be0: 68 00 02 00 00 push $0x200 + 2be5: 68 9b 41 00 00 push $0x419b + 2bea: e8 4c 0d 00 00 call 393b + if (fd >= 0) { + 2bef: 83 c4 10 add $0x10,%esp + 2bf2: 85 c0 test %eax,%eax + 2bf4: 78 0c js 2c02 + close(fd); + 2bf6: 83 ec 0c sub $0xc,%esp + 2bf9: 50 push %eax + 2bfa: e8 6c 0d 00 00 call 396b + 2bff: 83 c4 10 add $0x10,%esp + fd = open("xx", O_CREATE); + 2c02: 83 ec 08 sub $0x8,%esp + 2c05: 68 00 02 00 00 push $0x200 + 2c0a: 68 d0 46 00 00 push $0x46d0 + 2c0f: e8 27 0d 00 00 call 393b + if (fd >= 0) { + 2c14: 83 c4 10 add $0x10,%esp + 2c17: 85 c0 test %eax,%eax + 2c19: 78 0c js 2c27 + close(fd); + 2c1b: 83 ec 0c sub $0xc,%esp + 2c1e: 50 push %eax + 2c1f: e8 47 0d 00 00 call 396b + 2c24: 83 c4 10 add $0x10,%esp + unlink("xx"); + 2c27: 83 ec 0c sub $0xc,%esp + 2c2a: 68 d0 46 00 00 push $0x46d0 + 2c2f: e8 1f 0d 00 00 call 3953 + for (i = 0; i < 50 + 1; i++) { + 2c34: 83 c4 10 add $0x10,%esp + 2c37: 83 eb 01 sub $0x1,%ebx + 2c3a: 0f 85 50 ff ff ff jne 2b90 + chdir("/"); + 2c40: 83 ec 0c sub $0xc,%esp + 2c43: 68 c1 3d 00 00 push $0x3dc1 + 2c48: e8 be 0c 00 00 call 390b + printf(1, "empty file name OK\n"); + 2c4d: 58 pop %eax + 2c4e: 5a pop %edx + 2c4f: 68 14 4b 00 00 push $0x4b14 + 2c54: 6a 01 push $0x1 + 2c56: e8 f5 0d 00 00 call 3a50 +} + 2c5b: 8b 5d fc mov -0x4(%ebp),%ebx + 2c5e: 83 c4 10 add $0x10,%esp + 2c61: c9 leave + 2c62: c3 ret + printf(1, "mkdir irefd failed\n"); + 2c63: 83 ec 08 sub $0x8,%esp + 2c66: 68 ec 4a 00 00 push $0x4aec + 2c6b: 6a 01 push $0x1 + 2c6d: e8 de 0d 00 00 call 3a50 + exit(); + 2c72: e8 5c 0c 00 00 call 38d3 + printf(1, "chdir irefd failed\n"); + 2c77: 83 ec 08 sub $0x8,%esp + 2c7a: 68 00 4b 00 00 push $0x4b00 + 2c7f: 6a 01 push $0x1 + 2c81: e8 ca 0d 00 00 call 3a50 + exit(); + 2c86: e8 48 0c 00 00 call 38d3 + 2c8b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2c8f: 90 nop + +00002c90 : +void forktest(void) { + 2c90: 55 push %ebp + 2c91: 89 e5 mov %esp,%ebp + 2c93: 53 push %ebx + for (n = 0; n < 1000; n++) { + 2c94: 31 db xor %ebx,%ebx +void forktest(void) { + 2c96: 83 ec 0c sub $0xc,%esp + printf(1, "fork test\n"); + 2c99: 68 28 4b 00 00 push $0x4b28 + 2c9e: 6a 01 push $0x1 + 2ca0: e8 ab 0d 00 00 call 3a50 + 2ca5: 83 c4 10 add $0x10,%esp + 2ca8: eb 13 jmp 2cbd + 2caa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (pid == 0) { + 2cb0: 74 4a je 2cfc + for (n = 0; n < 1000; n++) { + 2cb2: 83 c3 01 add $0x1,%ebx + 2cb5: 81 fb e8 03 00 00 cmp $0x3e8,%ebx + 2cbb: 74 6b je 2d28 + pid = fork(); + 2cbd: e8 09 0c 00 00 call 38cb + if (pid < 0) { + 2cc2: 85 c0 test %eax,%eax + 2cc4: 79 ea jns 2cb0 + for (; n > 0; n--) { + 2cc6: 85 db test %ebx,%ebx + 2cc8: 74 14 je 2cde + 2cca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (wait() < 0) { + 2cd0: e8 06 0c 00 00 call 38db + 2cd5: 85 c0 test %eax,%eax + 2cd7: 78 28 js 2d01 + for (; n > 0; n--) { + 2cd9: 83 eb 01 sub $0x1,%ebx + 2cdc: 75 f2 jne 2cd0 + if (wait() != -1) { + 2cde: e8 f8 0b 00 00 call 38db + 2ce3: 83 f8 ff cmp $0xffffffff,%eax + 2ce6: 75 2d jne 2d15 + printf(1, "fork test OK\n"); + 2ce8: 83 ec 08 sub $0x8,%esp + 2ceb: 68 5a 4b 00 00 push $0x4b5a + 2cf0: 6a 01 push $0x1 + 2cf2: e8 59 0d 00 00 call 3a50 +} + 2cf7: 8b 5d fc mov -0x4(%ebp),%ebx + 2cfa: c9 leave + 2cfb: c3 ret + exit(); + 2cfc: e8 d2 0b 00 00 call 38d3 + printf(1, "wait stopped early\n"); + 2d01: 83 ec 08 sub $0x8,%esp + 2d04: 68 33 4b 00 00 push $0x4b33 + 2d09: 6a 01 push $0x1 + 2d0b: e8 40 0d 00 00 call 3a50 + exit(); + 2d10: e8 be 0b 00 00 call 38d3 + printf(1, "wait got too many\n"); + 2d15: 52 push %edx + 2d16: 52 push %edx + 2d17: 68 47 4b 00 00 push $0x4b47 + 2d1c: 6a 01 push $0x1 + 2d1e: e8 2d 0d 00 00 call 3a50 + exit(); + 2d23: e8 ab 0b 00 00 call 38d3 + printf(1, "fork claimed to work 1000 times!\n"); + 2d28: 50 push %eax + 2d29: 50 push %eax + 2d2a: 68 c8 52 00 00 push $0x52c8 + 2d2f: 6a 01 push $0x1 + 2d31: e8 1a 0d 00 00 call 3a50 + exit(); + 2d36: e8 98 0b 00 00 call 38d3 + 2d3b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 2d3f: 90 nop + +00002d40 : +void sbrktest(void) { + 2d40: 55 push %ebp + 2d41: 89 e5 mov %esp,%ebp + 2d43: 57 push %edi + 2d44: 56 push %esi + for (i = 0; i < 5000; i++) { + 2d45: 31 f6 xor %esi,%esi +void sbrktest(void) { + 2d47: 53 push %ebx + 2d48: 83 ec 64 sub $0x64,%esp + printf(stdout, "sbrk test\n"); + 2d4b: 68 68 4b 00 00 push $0x4b68 + 2d50: ff 35 68 5e 00 00 push 0x5e68 + 2d56: e8 f5 0c 00 00 call 3a50 + oldbrk = sbrk(0); + 2d5b: c7 04 24 00 00 00 00 movl $0x0,(%esp) + 2d62: e8 bc 0b 00 00 call 3923 + a = sbrk(0); + 2d67: c7 04 24 00 00 00 00 movl $0x0,(%esp) + oldbrk = sbrk(0); + 2d6e: 89 45 a4 mov %eax,-0x5c(%ebp) + a = sbrk(0); + 2d71: e8 ad 0b 00 00 call 3923 + 2d76: 83 c4 10 add $0x10,%esp + 2d79: 89 c3 mov %eax,%ebx + for (i = 0; i < 5000; i++) { + 2d7b: eb 05 jmp 2d82 + 2d7d: 8d 76 00 lea 0x0(%esi),%esi + a = b + 1; + 2d80: 89 c3 mov %eax,%ebx + b = sbrk(1); + 2d82: 83 ec 0c sub $0xc,%esp + 2d85: 6a 01 push $0x1 + 2d87: e8 97 0b 00 00 call 3923 + if (b != a) { + 2d8c: 83 c4 10 add $0x10,%esp + 2d8f: 39 d8 cmp %ebx,%eax + 2d91: 0f 85 9c 02 00 00 jne 3033 + for (i = 0; i < 5000; i++) { + 2d97: 83 c6 01 add $0x1,%esi + *b = 1; + 2d9a: c6 03 01 movb $0x1,(%ebx) + a = b + 1; + 2d9d: 8d 43 01 lea 0x1(%ebx),%eax + for (i = 0; i < 5000; i++) { + 2da0: 81 fe 88 13 00 00 cmp $0x1388,%esi + 2da6: 75 d8 jne 2d80 + pid = fork(); + 2da8: e8 1e 0b 00 00 call 38cb + 2dad: 89 c6 mov %eax,%esi + if (pid < 0) { + 2daf: 85 c0 test %eax,%eax + 2db1: 0f 88 02 03 00 00 js 30b9 + c = sbrk(1); + 2db7: 83 ec 0c sub $0xc,%esp + if (c != a + 1) { + 2dba: 83 c3 02 add $0x2,%ebx + c = sbrk(1); + 2dbd: 6a 01 push $0x1 + 2dbf: e8 5f 0b 00 00 call 3923 + c = sbrk(1); + 2dc4: c7 04 24 01 00 00 00 movl $0x1,(%esp) + 2dcb: e8 53 0b 00 00 call 3923 + if (c != a + 1) { + 2dd0: 83 c4 10 add $0x10,%esp + 2dd3: 39 c3 cmp %eax,%ebx + 2dd5: 0f 85 3b 03 00 00 jne 3116 + if (pid == 0) { + 2ddb: 85 f6 test %esi,%esi + 2ddd: 0f 84 2e 03 00 00 je 3111 + wait(); + 2de3: e8 f3 0a 00 00 call 38db + a = sbrk(0); + 2de8: 83 ec 0c sub $0xc,%esp + 2deb: 6a 00 push $0x0 + 2ded: e8 31 0b 00 00 call 3923 + 2df2: 89 c3 mov %eax,%ebx + amt = (BIG) -(uint)a; + 2df4: b8 00 00 40 06 mov $0x6400000,%eax + 2df9: 29 d8 sub %ebx,%eax + p = sbrk(amt); + 2dfb: 89 04 24 mov %eax,(%esp) + 2dfe: e8 20 0b 00 00 call 3923 + if (p != a) { + 2e03: 83 c4 10 add $0x10,%esp + 2e06: 39 c3 cmp %eax,%ebx + 2e08: 0f 85 94 02 00 00 jne 30a2 + a = sbrk(0); + 2e0e: 83 ec 0c sub $0xc,%esp + *lastaddr = 99; + 2e11: c6 05 ff ff 3f 06 63 movb $0x63,0x63fffff + a = sbrk(0); + 2e18: 6a 00 push $0x0 + 2e1a: e8 04 0b 00 00 call 3923 + c = sbrk(-4096); + 2e1f: c7 04 24 00 f0 ff ff movl $0xfffff000,(%esp) + a = sbrk(0); + 2e26: 89 c3 mov %eax,%ebx + c = sbrk(-4096); + 2e28: e8 f6 0a 00 00 call 3923 + if (c == (char*)0xffffffff) { + 2e2d: 83 c4 10 add $0x10,%esp + 2e30: 83 f8 ff cmp $0xffffffff,%eax + 2e33: 0f 84 22 03 00 00 je 315b + c = sbrk(0); + 2e39: 83 ec 0c sub $0xc,%esp + 2e3c: 6a 00 push $0x0 + 2e3e: e8 e0 0a 00 00 call 3923 + if (c != a - 4096) { + 2e43: 8d 93 00 f0 ff ff lea -0x1000(%ebx),%edx + 2e49: 83 c4 10 add $0x10,%esp + 2e4c: 39 d0 cmp %edx,%eax + 2e4e: 0f 85 f0 02 00 00 jne 3144 + a = sbrk(0); + 2e54: 83 ec 0c sub $0xc,%esp + 2e57: 6a 00 push $0x0 + 2e59: e8 c5 0a 00 00 call 3923 + c = sbrk(4096); + 2e5e: c7 04 24 00 10 00 00 movl $0x1000,(%esp) + a = sbrk(0); + 2e65: 89 c3 mov %eax,%ebx + c = sbrk(4096); + 2e67: e8 b7 0a 00 00 call 3923 + if (c != a || sbrk(0) != a + 4096) { + 2e6c: 83 c4 10 add $0x10,%esp + c = sbrk(4096); + 2e6f: 89 c6 mov %eax,%esi + if (c != a || sbrk(0) != a + 4096) { + 2e71: 39 c3 cmp %eax,%ebx + 2e73: 0f 85 b4 02 00 00 jne 312d + 2e79: 83 ec 0c sub $0xc,%esp + 2e7c: 6a 00 push $0x0 + 2e7e: e8 a0 0a 00 00 call 3923 + 2e83: 8d 93 00 10 00 00 lea 0x1000(%ebx),%edx + 2e89: 83 c4 10 add $0x10,%esp + 2e8c: 39 c2 cmp %eax,%edx + 2e8e: 0f 85 99 02 00 00 jne 312d + if (*lastaddr == 99) { + 2e94: 80 3d ff ff 3f 06 63 cmpb $0x63,0x63fffff + 2e9b: 0f 84 2f 02 00 00 je 30d0 + a = sbrk(0); + 2ea1: 83 ec 0c sub $0xc,%esp + 2ea4: 6a 00 push $0x0 + 2ea6: e8 78 0a 00 00 call 3923 + c = sbrk(-(sbrk(0) - oldbrk)); + 2eab: c7 04 24 00 00 00 00 movl $0x0,(%esp) + a = sbrk(0); + 2eb2: 89 c3 mov %eax,%ebx + c = sbrk(-(sbrk(0) - oldbrk)); + 2eb4: e8 6a 0a 00 00 call 3923 + 2eb9: 89 c2 mov %eax,%edx + 2ebb: 8b 45 a4 mov -0x5c(%ebp),%eax + 2ebe: 29 d0 sub %edx,%eax + 2ec0: 89 04 24 mov %eax,(%esp) + 2ec3: e8 5b 0a 00 00 call 3923 + if (c != a) { + 2ec8: 83 c4 10 add $0x10,%esp + 2ecb: 39 c3 cmp %eax,%ebx + 2ecd: 0f 85 b8 01 00 00 jne 308b + for (a = (char*)(KERNBASE); a < (char*) (KERNBASE + 2000000); a += 50000) { + 2ed3: bb 00 00 00 80 mov $0x80000000,%ebx + 2ed8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 2edf: 90 nop + ppid = getpid(); + 2ee0: e8 36 0a 00 00 call 391b + 2ee5: 89 c6 mov %eax,%esi + pid = fork(); + 2ee7: e8 df 09 00 00 call 38cb + if (pid < 0) { + 2eec: 85 c0 test %eax,%eax + 2eee: 0f 88 5d 01 00 00 js 3051 + if (pid == 0) { + 2ef4: 0f 84 6f 01 00 00 je 3069 + wait(); + 2efa: e8 dc 09 00 00 call 38db + for (a = (char*)(KERNBASE); a < (char*) (KERNBASE + 2000000); a += 50000) { + 2eff: 81 c3 50 c3 00 00 add $0xc350,%ebx + 2f05: 81 fb 80 84 1e 80 cmp $0x801e8480,%ebx + 2f0b: 75 d3 jne 2ee0 + if (pipe(fds) != 0) { + 2f0d: 83 ec 0c sub $0xc,%esp + 2f10: 8d 45 b8 lea -0x48(%ebp),%eax + 2f13: 50 push %eax + 2f14: e8 ca 09 00 00 call 38e3 + 2f19: 83 c4 10 add $0x10,%esp + 2f1c: 85 c0 test %eax,%eax + 2f1e: 0f 85 da 01 00 00 jne 30fe + 2f24: 8d 5d c0 lea -0x40(%ebp),%ebx + 2f27: 8d 75 e8 lea -0x18(%ebp),%esi + 2f2a: 89 df mov %ebx,%edi + 2f2c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if ((pids[i] = fork()) == 0) { + 2f30: e8 96 09 00 00 call 38cb + 2f35: 89 07 mov %eax,(%edi) + 2f37: 85 c0 test %eax,%eax + 2f39: 0f 84 91 00 00 00 je 2fd0 + if (pids[i] != -1) { + 2f3f: 83 f8 ff cmp $0xffffffff,%eax + 2f42: 74 14 je 2f58 + read(fds[0], &scratch, 1); + 2f44: 83 ec 04 sub $0x4,%esp + 2f47: 8d 45 b7 lea -0x49(%ebp),%eax + 2f4a: 6a 01 push $0x1 + 2f4c: 50 push %eax + 2f4d: ff 75 b8 push -0x48(%ebp) + 2f50: e8 96 09 00 00 call 38eb + 2f55: 83 c4 10 add $0x10,%esp + for (i = 0; i < sizeof(pids) / sizeof(pids[0]); i++) { + 2f58: 83 c7 04 add $0x4,%edi + 2f5b: 39 f7 cmp %esi,%edi + 2f5d: 75 d1 jne 2f30 + c = sbrk(4096); + 2f5f: 83 ec 0c sub $0xc,%esp + 2f62: 68 00 10 00 00 push $0x1000 + 2f67: e8 b7 09 00 00 call 3923 + 2f6c: 83 c4 10 add $0x10,%esp + 2f6f: 89 c7 mov %eax,%edi + for (i = 0; i < sizeof(pids) / sizeof(pids[0]); i++) { + 2f71: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + if (pids[i] == -1) { + 2f78: 8b 03 mov (%ebx),%eax + 2f7a: 83 f8 ff cmp $0xffffffff,%eax + 2f7d: 74 11 je 2f90 + kill(pids[i]); + 2f7f: 83 ec 0c sub $0xc,%esp + 2f82: 50 push %eax + 2f83: e8 6b 09 00 00 call 38f3 + wait(); + 2f88: e8 4e 09 00 00 call 38db + 2f8d: 83 c4 10 add $0x10,%esp + for (i = 0; i < sizeof(pids) / sizeof(pids[0]); i++) { + 2f90: 83 c3 04 add $0x4,%ebx + 2f93: 39 de cmp %ebx,%esi + 2f95: 75 e1 jne 2f78 + if (c == (char*)0xffffffff) { + 2f97: 83 ff ff cmp $0xffffffff,%edi + 2f9a: 0f 84 47 01 00 00 je 30e7 + if (sbrk(0) > oldbrk) { + 2fa0: 83 ec 0c sub $0xc,%esp + 2fa3: 6a 00 push $0x0 + 2fa5: e8 79 09 00 00 call 3923 + 2faa: 83 c4 10 add $0x10,%esp + 2fad: 39 45 a4 cmp %eax,-0x5c(%ebp) + 2fb0: 72 60 jb 3012 + printf(stdout, "sbrk test OK\n"); + 2fb2: 83 ec 08 sub $0x8,%esp + 2fb5: 68 10 4c 00 00 push $0x4c10 + 2fba: ff 35 68 5e 00 00 push 0x5e68 + 2fc0: e8 8b 0a 00 00 call 3a50 +} + 2fc5: 83 c4 10 add $0x10,%esp + 2fc8: 8d 65 f4 lea -0xc(%ebp),%esp + 2fcb: 5b pop %ebx + 2fcc: 5e pop %esi + 2fcd: 5f pop %edi + 2fce: 5d pop %ebp + 2fcf: c3 ret + sbrk(BIG - (uint)sbrk(0)); + 2fd0: 83 ec 0c sub $0xc,%esp + 2fd3: 6a 00 push $0x0 + 2fd5: e8 49 09 00 00 call 3923 + 2fda: 89 c2 mov %eax,%edx + 2fdc: b8 00 00 40 06 mov $0x6400000,%eax + 2fe1: 29 d0 sub %edx,%eax + 2fe3: 89 04 24 mov %eax,(%esp) + 2fe6: e8 38 09 00 00 call 3923 + write(fds[1], "x", 1); + 2feb: 83 c4 0c add $0xc,%esp + 2fee: 6a 01 push $0x1 + 2ff0: 68 d1 46 00 00 push $0x46d1 + 2ff5: ff 75 bc push -0x44(%ebp) + 2ff8: e8 46 09 00 00 call 3943 + 2ffd: 83 c4 10 add $0x10,%esp + for (;;) { sleep(1000); + 3000: 83 ec 0c sub $0xc,%esp + 3003: 68 e8 03 00 00 push $0x3e8 + 3008: e8 1e 09 00 00 call 392b + 300d: 83 c4 10 add $0x10,%esp + 3010: eb ee jmp 3000 + sbrk(-(sbrk(0) - oldbrk)); + 3012: 83 ec 0c sub $0xc,%esp + 3015: 6a 00 push $0x0 + 3017: e8 07 09 00 00 call 3923 + 301c: 89 c2 mov %eax,%edx + 301e: 8b 45 a4 mov -0x5c(%ebp),%eax + 3021: 29 d0 sub %edx,%eax + 3023: 89 04 24 mov %eax,(%esp) + 3026: e8 f8 08 00 00 call 3923 + 302b: 83 c4 10 add $0x10,%esp + 302e: e9 7f ff ff ff jmp 2fb2 + printf(stdout, "sbrk test failed %d %x %x\n", i, a, b); + 3033: 83 ec 0c sub $0xc,%esp + 3036: 50 push %eax + 3037: 53 push %ebx + 3038: 56 push %esi + 3039: 68 73 4b 00 00 push $0x4b73 + 303e: ff 35 68 5e 00 00 push 0x5e68 + 3044: e8 07 0a 00 00 call 3a50 + exit(); + 3049: 83 c4 20 add $0x20,%esp + 304c: e8 82 08 00 00 call 38d3 + printf(stdout, "fork failed\n"); + 3051: 83 ec 08 sub $0x8,%esp + 3054: 68 b9 4c 00 00 push $0x4cb9 + 3059: ff 35 68 5e 00 00 push 0x5e68 + 305f: e8 ec 09 00 00 call 3a50 + exit(); + 3064: e8 6a 08 00 00 call 38d3 + printf(stdout, "oops could read %x = %x\n", a, *a); + 3069: 0f be 03 movsbl (%ebx),%eax + 306c: 50 push %eax + 306d: 53 push %ebx + 306e: 68 dc 4b 00 00 push $0x4bdc + 3073: ff 35 68 5e 00 00 push 0x5e68 + 3079: e8 d2 09 00 00 call 3a50 + kill(ppid); + 307e: 89 34 24 mov %esi,(%esp) + 3081: e8 6d 08 00 00 call 38f3 + exit(); + 3086: e8 48 08 00 00 call 38d3 + printf(stdout, "sbrk downsize failed, a %x c %x\n", a, c); + 308b: 50 push %eax + 308c: 53 push %ebx + 308d: 68 bc 53 00 00 push $0x53bc + 3092: ff 35 68 5e 00 00 push 0x5e68 + 3098: e8 b3 09 00 00 call 3a50 + exit(); + 309d: e8 31 08 00 00 call 38d3 + printf(stdout, "sbrk test failed to grow big address space; enough phys mem?\n"); + 30a2: 56 push %esi + 30a3: 56 push %esi + 30a4: 68 ec 52 00 00 push $0x52ec + 30a9: ff 35 68 5e 00 00 push 0x5e68 + 30af: e8 9c 09 00 00 call 3a50 + exit(); + 30b4: e8 1a 08 00 00 call 38d3 + printf(stdout, "sbrk test fork failed\n"); + 30b9: 50 push %eax + 30ba: 50 push %eax + 30bb: 68 8e 4b 00 00 push $0x4b8e + 30c0: ff 35 68 5e 00 00 push 0x5e68 + 30c6: e8 85 09 00 00 call 3a50 + exit(); + 30cb: e8 03 08 00 00 call 38d3 + printf(stdout, "sbrk de-allocation didn't really deallocate\n"); + 30d0: 51 push %ecx + 30d1: 51 push %ecx + 30d2: 68 8c 53 00 00 push $0x538c + 30d7: ff 35 68 5e 00 00 push 0x5e68 + 30dd: e8 6e 09 00 00 call 3a50 + exit(); + 30e2: e8 ec 07 00 00 call 38d3 + printf(stdout, "failed sbrk leaked memory\n"); + 30e7: 50 push %eax + 30e8: 50 push %eax + 30e9: 68 f5 4b 00 00 push $0x4bf5 + 30ee: ff 35 68 5e 00 00 push 0x5e68 + 30f4: e8 57 09 00 00 call 3a50 + exit(); + 30f9: e8 d5 07 00 00 call 38d3 + printf(1, "pipe() failed\n"); + 30fe: 52 push %edx + 30ff: 52 push %edx + 3100: 68 b1 40 00 00 push $0x40b1 + 3105: 6a 01 push $0x1 + 3107: e8 44 09 00 00 call 3a50 + exit(); + 310c: e8 c2 07 00 00 call 38d3 + exit(); + 3111: e8 bd 07 00 00 call 38d3 + printf(stdout, "sbrk test failed post-fork\n"); + 3116: 57 push %edi + 3117: 57 push %edi + 3118: 68 a5 4b 00 00 push $0x4ba5 + 311d: ff 35 68 5e 00 00 push 0x5e68 + 3123: e8 28 09 00 00 call 3a50 + exit(); + 3128: e8 a6 07 00 00 call 38d3 + printf(stdout, "sbrk re-allocation failed, a %x c %x\n", a, c); + 312d: 56 push %esi + 312e: 53 push %ebx + 312f: 68 64 53 00 00 push $0x5364 + 3134: ff 35 68 5e 00 00 push 0x5e68 + 313a: e8 11 09 00 00 call 3a50 + exit(); + 313f: e8 8f 07 00 00 call 38d3 + printf(stdout, "sbrk deallocation produced wrong address, a %x c %x\n", a, c); + 3144: 50 push %eax + 3145: 53 push %ebx + 3146: 68 2c 53 00 00 push $0x532c + 314b: ff 35 68 5e 00 00 push 0x5e68 + 3151: e8 fa 08 00 00 call 3a50 + exit(); + 3156: e8 78 07 00 00 call 38d3 + printf(stdout, "sbrk could not deallocate\n"); + 315b: 53 push %ebx + 315c: 53 push %ebx + 315d: 68 c1 4b 00 00 push $0x4bc1 + 3162: ff 35 68 5e 00 00 push 0x5e68 + 3168: e8 e3 08 00 00 call 3a50 + exit(); + 316d: e8 61 07 00 00 call 38d3 + 3172: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3179: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00003180 : +} + 3180: c3 ret + 3181: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3188: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 318f: 90 nop + +00003190 : +void validatetest(void) { + 3190: 55 push %ebp + 3191: 89 e5 mov %esp,%ebp + 3193: 56 push %esi + for (p = 0; p <= (uint)hi; p += 4096) { + 3194: 31 f6 xor %esi,%esi +void validatetest(void) { + 3196: 53 push %ebx + printf(stdout, "validate test\n"); + 3197: 83 ec 08 sub $0x8,%esp + 319a: 68 1e 4c 00 00 push $0x4c1e + 319f: ff 35 68 5e 00 00 push 0x5e68 + 31a5: e8 a6 08 00 00 call 3a50 + 31aa: 83 c4 10 add $0x10,%esp + 31ad: 8d 76 00 lea 0x0(%esi),%esi + if ((pid = fork()) == 0) { + 31b0: e8 16 07 00 00 call 38cb + 31b5: 89 c3 mov %eax,%ebx + 31b7: 85 c0 test %eax,%eax + 31b9: 74 63 je 321e + sleep(0); + 31bb: 83 ec 0c sub $0xc,%esp + 31be: 6a 00 push $0x0 + 31c0: e8 66 07 00 00 call 392b + sleep(0); + 31c5: c7 04 24 00 00 00 00 movl $0x0,(%esp) + 31cc: e8 5a 07 00 00 call 392b + kill(pid); + 31d1: 89 1c 24 mov %ebx,(%esp) + 31d4: e8 1a 07 00 00 call 38f3 + wait(); + 31d9: e8 fd 06 00 00 call 38db + if (link("nosuchfile", (char*)p) != -1) { + 31de: 58 pop %eax + 31df: 5a pop %edx + 31e0: 56 push %esi + 31e1: 68 2d 4c 00 00 push $0x4c2d + 31e6: e8 70 07 00 00 call 395b + 31eb: 83 c4 10 add $0x10,%esp + 31ee: 83 f8 ff cmp $0xffffffff,%eax + 31f1: 75 30 jne 3223 + for (p = 0; p <= (uint)hi; p += 4096) { + 31f3: 81 c6 00 10 00 00 add $0x1000,%esi + 31f9: 81 fe 00 40 11 00 cmp $0x114000,%esi + 31ff: 75 af jne 31b0 + printf(stdout, "validate ok\n"); + 3201: 83 ec 08 sub $0x8,%esp + 3204: 68 51 4c 00 00 push $0x4c51 + 3209: ff 35 68 5e 00 00 push 0x5e68 + 320f: e8 3c 08 00 00 call 3a50 +} + 3214: 83 c4 10 add $0x10,%esp + 3217: 8d 65 f8 lea -0x8(%ebp),%esp + 321a: 5b pop %ebx + 321b: 5e pop %esi + 321c: 5d pop %ebp + 321d: c3 ret + exit(); + 321e: e8 b0 06 00 00 call 38d3 + printf(stdout, "link should not succeed\n"); + 3223: 83 ec 08 sub $0x8,%esp + 3226: 68 38 4c 00 00 push $0x4c38 + 322b: ff 35 68 5e 00 00 push 0x5e68 + 3231: e8 1a 08 00 00 call 3a50 + exit(); + 3236: e8 98 06 00 00 call 38d3 + 323b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 323f: 90 nop + +00003240 : +void bsstest(void) { + 3240: 55 push %ebp + 3241: 89 e5 mov %esp,%ebp + 3243: 83 ec 10 sub $0x10,%esp + printf(stdout, "bss test\n"); + 3246: 68 5e 4c 00 00 push $0x4c5e + 324b: ff 35 68 5e 00 00 push 0x5e68 + 3251: e8 fa 07 00 00 call 3a50 + 3256: 83 c4 10 add $0x10,%esp + for (i = 0; i < sizeof(uninit); i++) { + 3259: 31 c0 xor %eax,%eax + 325b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 325f: 90 nop + if (uninit[i] != '\0') { + 3260: 80 b8 80 5e 00 00 00 cmpb $0x0,0x5e80(%eax) + 3267: 75 22 jne 328b + for (i = 0; i < sizeof(uninit); i++) { + 3269: 83 c0 01 add $0x1,%eax + 326c: 3d 10 27 00 00 cmp $0x2710,%eax + 3271: 75 ed jne 3260 + printf(stdout, "bss test ok\n"); + 3273: 83 ec 08 sub $0x8,%esp + 3276: 68 79 4c 00 00 push $0x4c79 + 327b: ff 35 68 5e 00 00 push 0x5e68 + 3281: e8 ca 07 00 00 call 3a50 +} + 3286: 83 c4 10 add $0x10,%esp + 3289: c9 leave + 328a: c3 ret + printf(stdout, "bss test failed\n"); + 328b: 83 ec 08 sub $0x8,%esp + 328e: 68 68 4c 00 00 push $0x4c68 + 3293: ff 35 68 5e 00 00 push 0x5e68 + 3299: e8 b2 07 00 00 call 3a50 + exit(); + 329e: e8 30 06 00 00 call 38d3 + 32a3: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 32aa: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +000032b0 : +void bigargtest(void) { + 32b0: 55 push %ebp + 32b1: 89 e5 mov %esp,%ebp + 32b3: 83 ec 14 sub $0x14,%esp + unlink("bigarg-ok"); + 32b6: 68 86 4c 00 00 push $0x4c86 + 32bb: e8 93 06 00 00 call 3953 + pid = fork(); + 32c0: e8 06 06 00 00 call 38cb + if (pid == 0) { + 32c5: 83 c4 10 add $0x10,%esp + 32c8: 85 c0 test %eax,%eax + 32ca: 74 44 je 3310 + else if (pid < 0) { + 32cc: 0f 88 c5 00 00 00 js 3397 + wait(); + 32d2: e8 04 06 00 00 call 38db + fd = open("bigarg-ok", 0); + 32d7: 83 ec 08 sub $0x8,%esp + 32da: 6a 00 push $0x0 + 32dc: 68 86 4c 00 00 push $0x4c86 + 32e1: e8 55 06 00 00 call 393b + if (fd < 0) { + 32e6: 83 c4 10 add $0x10,%esp + 32e9: 85 c0 test %eax,%eax + 32eb: 0f 88 8f 00 00 00 js 3380 + close(fd); + 32f1: 83 ec 0c sub $0xc,%esp + 32f4: 50 push %eax + 32f5: e8 71 06 00 00 call 396b + unlink("bigarg-ok"); + 32fa: c7 04 24 86 4c 00 00 movl $0x4c86,(%esp) + 3301: e8 4d 06 00 00 call 3953 +} + 3306: 83 c4 10 add $0x10,%esp + 3309: c9 leave + 330a: c3 ret + 330b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 330f: 90 nop + args[i] = "bigargs test: failed\n "; + 3310: c7 04 85 a0 a5 00 00 movl $0x53e0,0xa5a0(,%eax,4) + 3317: e0 53 00 00 + for (i = 0; i < MAXARG - 1; i++) { + 331b: 83 c0 01 add $0x1,%eax + 331e: 83 f8 1f cmp $0x1f,%eax + 3321: 75 ed jne 3310 + printf(stdout, "bigarg test\n"); + 3323: 51 push %ecx + 3324: 51 push %ecx + 3325: 68 90 4c 00 00 push $0x4c90 + 332a: ff 35 68 5e 00 00 push 0x5e68 + args[MAXARG - 1] = 0; + 3330: c7 05 1c a6 00 00 00 movl $0x0,0xa61c + 3337: 00 00 00 + printf(stdout, "bigarg test\n"); + 333a: e8 11 07 00 00 call 3a50 + exec("echo", args); + 333f: 58 pop %eax + 3340: 5a pop %edx + 3341: 68 a0 a5 00 00 push $0xa5a0 + 3346: 68 5d 3e 00 00 push $0x3e5d + 334b: e8 ab 05 00 00 call 38fb + printf(stdout, "bigarg test ok\n"); + 3350: 59 pop %ecx + 3351: 58 pop %eax + 3352: 68 9d 4c 00 00 push $0x4c9d + 3357: ff 35 68 5e 00 00 push 0x5e68 + 335d: e8 ee 06 00 00 call 3a50 + fd = open("bigarg-ok", O_CREATE); + 3362: 58 pop %eax + 3363: 5a pop %edx + 3364: 68 00 02 00 00 push $0x200 + 3369: 68 86 4c 00 00 push $0x4c86 + 336e: e8 c8 05 00 00 call 393b + close(fd); + 3373: 89 04 24 mov %eax,(%esp) + 3376: e8 f0 05 00 00 call 396b + exit(); + 337b: e8 53 05 00 00 call 38d3 + printf(stdout, "bigarg test failed!\n"); + 3380: 50 push %eax + 3381: 50 push %eax + 3382: 68 c6 4c 00 00 push $0x4cc6 + 3387: ff 35 68 5e 00 00 push 0x5e68 + 338d: e8 be 06 00 00 call 3a50 + exit(); + 3392: e8 3c 05 00 00 call 38d3 + printf(stdout, "bigargtest: fork failed\n"); + 3397: 52 push %edx + 3398: 52 push %edx + 3399: 68 ad 4c 00 00 push $0x4cad + 339e: ff 35 68 5e 00 00 push 0x5e68 + 33a4: e8 a7 06 00 00 call 3a50 + exit(); + 33a9: e8 25 05 00 00 call 38d3 + 33ae: 66 90 xchg %ax,%ax + +000033b0 : +void fsfull() { + 33b0: 55 push %ebp + 33b1: 89 e5 mov %esp,%ebp + 33b3: 57 push %edi + 33b4: 56 push %esi + for (nfiles = 0;; nfiles++) { + 33b5: 31 f6 xor %esi,%esi +void fsfull() { + 33b7: 53 push %ebx + 33b8: 83 ec 54 sub $0x54,%esp + printf(1, "fsfull test\n"); + 33bb: 68 db 4c 00 00 push $0x4cdb + 33c0: 6a 01 push $0x1 + 33c2: e8 89 06 00 00 call 3a50 + 33c7: 83 c4 10 add $0x10,%esp + 33ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + name[1] = '0' + nfiles / 1000; + 33d0: b8 d3 4d 62 10 mov $0x10624dd3,%eax + name[3] = '0' + (nfiles % 100) / 10; + 33d5: b9 cd cc cc cc mov $0xcccccccd,%ecx + printf(1, "writing %s\n", name); + 33da: 83 ec 04 sub $0x4,%esp + name[0] = 'f'; + 33dd: c6 45 a8 66 movb $0x66,-0x58(%ebp) + name[1] = '0' + nfiles / 1000; + 33e1: f7 e6 mul %esi + name[5] = '\0'; + 33e3: c6 45 ad 00 movb $0x0,-0x53(%ebp) + name[1] = '0' + nfiles / 1000; + 33e7: c1 ea 06 shr $0x6,%edx + 33ea: 8d 42 30 lea 0x30(%edx),%eax + 33ed: 88 45 a9 mov %al,-0x57(%ebp) + name[2] = '0' + (nfiles % 1000) / 100; + 33f0: 69 c2 e8 03 00 00 imul $0x3e8,%edx,%eax + 33f6: 89 f2 mov %esi,%edx + 33f8: 29 c2 sub %eax,%edx + 33fa: b8 1f 85 eb 51 mov $0x51eb851f,%eax + 33ff: f7 e2 mul %edx + name[3] = '0' + (nfiles % 100) / 10; + 3401: b8 1f 85 eb 51 mov $0x51eb851f,%eax + name[2] = '0' + (nfiles % 1000) / 100; + 3406: c1 ea 05 shr $0x5,%edx + 3409: 83 c2 30 add $0x30,%edx + 340c: 88 55 aa mov %dl,-0x56(%ebp) + name[3] = '0' + (nfiles % 100) / 10; + 340f: f7 e6 mul %esi + 3411: c1 ea 05 shr $0x5,%edx + 3414: 6b c2 64 imul $0x64,%edx,%eax + 3417: 89 f2 mov %esi,%edx + 3419: 29 c2 sub %eax,%edx + 341b: 89 d0 mov %edx,%eax + 341d: f7 e1 mul %ecx + name[4] = '0' + (nfiles % 10); + 341f: 89 f0 mov %esi,%eax + name[3] = '0' + (nfiles % 100) / 10; + 3421: c1 ea 03 shr $0x3,%edx + 3424: 83 c2 30 add $0x30,%edx + 3427: 88 55 ab mov %dl,-0x55(%ebp) + name[4] = '0' + (nfiles % 10); + 342a: f7 e1 mul %ecx + 342c: 89 f0 mov %esi,%eax + 342e: c1 ea 03 shr $0x3,%edx + 3431: 8d 14 92 lea (%edx,%edx,4),%edx + 3434: 01 d2 add %edx,%edx + 3436: 29 d0 sub %edx,%eax + 3438: 83 c0 30 add $0x30,%eax + 343b: 88 45 ac mov %al,-0x54(%ebp) + printf(1, "writing %s\n", name); + 343e: 8d 45 a8 lea -0x58(%ebp),%eax + 3441: 50 push %eax + 3442: 68 e8 4c 00 00 push $0x4ce8 + 3447: 6a 01 push $0x1 + 3449: e8 02 06 00 00 call 3a50 + int fd = open(name, O_CREATE | O_RDWR); + 344e: 58 pop %eax + 344f: 8d 45 a8 lea -0x58(%ebp),%eax + 3452: 5a pop %edx + 3453: 68 02 02 00 00 push $0x202 + 3458: 50 push %eax + 3459: e8 dd 04 00 00 call 393b + if (fd < 0) { + 345e: 83 c4 10 add $0x10,%esp + int fd = open(name, O_CREATE | O_RDWR); + 3461: 89 c7 mov %eax,%edi + if (fd < 0) { + 3463: 85 c0 test %eax,%eax + 3465: 78 4f js 34b6 + int total = 0; + 3467: 31 db xor %ebx,%ebx + 3469: eb 07 jmp 3472 + 346b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 346f: 90 nop + total += cc; + 3470: 01 c3 add %eax,%ebx + int cc = write(fd, buf, 512); + 3472: 83 ec 04 sub $0x4,%esp + 3475: 68 00 02 00 00 push $0x200 + 347a: 68 a0 85 00 00 push $0x85a0 + 347f: 57 push %edi + 3480: e8 be 04 00 00 call 3943 + if (cc < 512) { + 3485: 83 c4 10 add $0x10,%esp + 3488: 3d ff 01 00 00 cmp $0x1ff,%eax + 348d: 7f e1 jg 3470 + printf(1, "wrote %d bytes\n", total); + 348f: 83 ec 04 sub $0x4,%esp + 3492: 53 push %ebx + 3493: 68 04 4d 00 00 push $0x4d04 + 3498: 6a 01 push $0x1 + 349a: e8 b1 05 00 00 call 3a50 + close(fd); + 349f: 89 3c 24 mov %edi,(%esp) + 34a2: e8 c4 04 00 00 call 396b + if (total == 0) { + 34a7: 83 c4 10 add $0x10,%esp + 34aa: 85 db test %ebx,%ebx + 34ac: 74 1e je 34cc + for (nfiles = 0;; nfiles++) { + 34ae: 83 c6 01 add $0x1,%esi + 34b1: e9 1a ff ff ff jmp 33d0 + printf(1, "open %s failed\n", name); + 34b6: 83 ec 04 sub $0x4,%esp + 34b9: 8d 45 a8 lea -0x58(%ebp),%eax + 34bc: 50 push %eax + 34bd: 68 f4 4c 00 00 push $0x4cf4 + 34c2: 6a 01 push $0x1 + 34c4: e8 87 05 00 00 call 3a50 + break; + 34c9: 83 c4 10 add $0x10,%esp + name[1] = '0' + nfiles / 1000; + 34cc: bf d3 4d 62 10 mov $0x10624dd3,%edi + name[2] = '0' + (nfiles % 1000) / 100; + 34d1: bb 1f 85 eb 51 mov $0x51eb851f,%ebx + 34d6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 34dd: 8d 76 00 lea 0x0(%esi),%esi + name[1] = '0' + nfiles / 1000; + 34e0: 89 f0 mov %esi,%eax + unlink(name); + 34e2: 83 ec 0c sub $0xc,%esp + name[0] = 'f'; + 34e5: c6 45 a8 66 movb $0x66,-0x58(%ebp) + name[1] = '0' + nfiles / 1000; + 34e9: f7 e7 mul %edi + name[5] = '\0'; + 34eb: c6 45 ad 00 movb $0x0,-0x53(%ebp) + name[1] = '0' + nfiles / 1000; + 34ef: c1 ea 06 shr $0x6,%edx + 34f2: 8d 42 30 lea 0x30(%edx),%eax + 34f5: 88 45 a9 mov %al,-0x57(%ebp) + name[2] = '0' + (nfiles % 1000) / 100; + 34f8: 69 c2 e8 03 00 00 imul $0x3e8,%edx,%eax + 34fe: 89 f2 mov %esi,%edx + 3500: 29 c2 sub %eax,%edx + 3502: 89 d0 mov %edx,%eax + 3504: f7 e3 mul %ebx + name[3] = '0' + (nfiles % 100) / 10; + 3506: 89 f0 mov %esi,%eax + name[2] = '0' + (nfiles % 1000) / 100; + 3508: c1 ea 05 shr $0x5,%edx + 350b: 83 c2 30 add $0x30,%edx + 350e: 88 55 aa mov %dl,-0x56(%ebp) + name[3] = '0' + (nfiles % 100) / 10; + 3511: f7 e3 mul %ebx + 3513: c1 ea 05 shr $0x5,%edx + 3516: 6b ca 64 imul $0x64,%edx,%ecx + 3519: 89 f2 mov %esi,%edx + 351b: 29 ca sub %ecx,%edx + 351d: b9 cd cc cc cc mov $0xcccccccd,%ecx + 3522: 89 d0 mov %edx,%eax + 3524: f7 e1 mul %ecx + name[4] = '0' + (nfiles % 10); + 3526: 89 f0 mov %esi,%eax + name[3] = '0' + (nfiles % 100) / 10; + 3528: c1 ea 03 shr $0x3,%edx + 352b: 83 c2 30 add $0x30,%edx + 352e: 88 55 ab mov %dl,-0x55(%ebp) + name[4] = '0' + (nfiles % 10); + 3531: f7 e1 mul %ecx + 3533: 89 f0 mov %esi,%eax + nfiles--; + 3535: 83 ee 01 sub $0x1,%esi + name[4] = '0' + (nfiles % 10); + 3538: c1 ea 03 shr $0x3,%edx + 353b: 8d 14 92 lea (%edx,%edx,4),%edx + 353e: 01 d2 add %edx,%edx + 3540: 29 d0 sub %edx,%eax + 3542: 83 c0 30 add $0x30,%eax + 3545: 88 45 ac mov %al,-0x54(%ebp) + unlink(name); + 3548: 8d 45 a8 lea -0x58(%ebp),%eax + 354b: 50 push %eax + 354c: e8 02 04 00 00 call 3953 + while (nfiles >= 0) { + 3551: 83 c4 10 add $0x10,%esp + 3554: 83 fe ff cmp $0xffffffff,%esi + 3557: 75 87 jne 34e0 + printf(1, "fsfull test finished\n"); + 3559: 83 ec 08 sub $0x8,%esp + 355c: 68 14 4d 00 00 push $0x4d14 + 3561: 6a 01 push $0x1 + 3563: e8 e8 04 00 00 call 3a50 +} + 3568: 83 c4 10 add $0x10,%esp + 356b: 8d 65 f4 lea -0xc(%ebp),%esp + 356e: 5b pop %ebx + 356f: 5e pop %esi + 3570: 5f pop %edi + 3571: 5d pop %ebp + 3572: c3 ret + 3573: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 357a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + +00003580 : +void uio() { + 3580: 55 push %ebp + 3581: 89 e5 mov %esp,%ebp + 3583: 83 ec 10 sub $0x10,%esp + printf(1, "uio test\n"); + 3586: 68 2a 4d 00 00 push $0x4d2a + 358b: 6a 01 push $0x1 + 358d: e8 be 04 00 00 call 3a50 + pid = fork(); + 3592: e8 34 03 00 00 call 38cb + if (pid == 0) { + 3597: 83 c4 10 add $0x10,%esp + 359a: 85 c0 test %eax,%eax + 359c: 74 1b je 35b9 + else if (pid < 0) { + 359e: 78 3d js 35dd + wait(); + 35a0: e8 36 03 00 00 call 38db + printf(1, "uio test done\n"); + 35a5: 83 ec 08 sub $0x8,%esp + 35a8: 68 34 4d 00 00 push $0x4d34 + 35ad: 6a 01 push $0x1 + 35af: e8 9c 04 00 00 call 3a50 +} + 35b4: 83 c4 10 add $0x10,%esp + 35b7: c9 leave + 35b8: c3 ret + asm volatile ("outb %0,%1" : : "a" (val), "d" (port)); + 35b9: b8 09 00 00 00 mov $0x9,%eax + 35be: ba 70 00 00 00 mov $0x70,%edx + 35c3: ee out %al,(%dx) + asm volatile ("inb %1,%0" : "=a" (val) : "d" (port)); + 35c4: ba 71 00 00 00 mov $0x71,%edx + 35c9: ec in (%dx),%al + printf(1, "uio: uio succeeded; test FAILED\n"); + 35ca: 52 push %edx + 35cb: 52 push %edx + 35cc: 68 c0 54 00 00 push $0x54c0 + 35d1: 6a 01 push $0x1 + 35d3: e8 78 04 00 00 call 3a50 + exit(); + 35d8: e8 f6 02 00 00 call 38d3 + printf(1, "fork failed\n"); + 35dd: 50 push %eax + 35de: 50 push %eax + 35df: 68 b9 4c 00 00 push $0x4cb9 + 35e4: 6a 01 push $0x1 + 35e6: e8 65 04 00 00 call 3a50 + exit(); + 35eb: e8 e3 02 00 00 call 38d3 + +000035f0 : +void argptest(){ + 35f0: 55 push %ebp + 35f1: 89 e5 mov %esp,%ebp + 35f3: 53 push %ebx + 35f4: 83 ec 0c sub $0xc,%esp + fd = open("init", O_RDONLY); + 35f7: 6a 00 push $0x0 + 35f9: 68 43 4d 00 00 push $0x4d43 + 35fe: e8 38 03 00 00 call 393b + if (fd < 0) { + 3603: 83 c4 10 add $0x10,%esp + 3606: 85 c0 test %eax,%eax + 3608: 78 39 js 3643 + read(fd, sbrk(0) - 1, -1); + 360a: 83 ec 0c sub $0xc,%esp + 360d: 89 c3 mov %eax,%ebx + 360f: 6a 00 push $0x0 + 3611: e8 0d 03 00 00 call 3923 + 3616: 83 c4 0c add $0xc,%esp + 3619: 83 e8 01 sub $0x1,%eax + 361c: 6a ff push $0xffffffff + 361e: 50 push %eax + 361f: 53 push %ebx + 3620: e8 c6 02 00 00 call 38eb + close(fd); + 3625: 89 1c 24 mov %ebx,(%esp) + 3628: e8 3e 03 00 00 call 396b + printf(1, "arg test passed\n"); + 362d: 58 pop %eax + 362e: 5a pop %edx + 362f: 68 55 4d 00 00 push $0x4d55 + 3634: 6a 01 push $0x1 + 3636: e8 15 04 00 00 call 3a50 +} + 363b: 8b 5d fc mov -0x4(%ebp),%ebx + 363e: 83 c4 10 add $0x10,%esp + 3641: c9 leave + 3642: c3 ret + printf(2, "open failed\n"); + 3643: 51 push %ecx + 3644: 51 push %ecx + 3645: 68 48 4d 00 00 push $0x4d48 + 364a: 6a 02 push $0x2 + 364c: e8 ff 03 00 00 call 3a50 + exit(); + 3651: e8 7d 02 00 00 call 38d3 + 3656: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 365d: 8d 76 00 lea 0x0(%esi),%esi + +00003660 : + randstate = randstate * 1664525 + 1013904223; + 3660: 69 05 64 5e 00 00 0d imul $0x19660d,0x5e64,%eax + 3667: 66 19 00 + 366a: 05 5f f3 6e 3c add $0x3c6ef35f,%eax + 366f: a3 64 5e 00 00 mov %eax,0x5e64 +} + 3674: c3 ret + 3675: 66 90 xchg %ax,%ax + 3677: 66 90 xchg %ax,%ax + 3679: 66 90 xchg %ax,%ax + 367b: 66 90 xchg %ax,%ax + 367d: 66 90 xchg %ax,%ax + 367f: 90 nop + +00003680 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 3680: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 3681: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 3683: 89 e5 mov %esp,%ebp + 3685: 53 push %ebx + 3686: 8b 4d 08 mov 0x8(%ebp),%ecx + 3689: 8b 5d 0c mov 0xc(%ebp),%ebx + 368c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 3690: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 3694: 88 14 01 mov %dl,(%ecx,%eax,1) + 3697: 83 c0 01 add $0x1,%eax + 369a: 84 d2 test %dl,%dl + 369c: 75 f2 jne 3690 + ; + } + return os; +} + 369e: 8b 5d fc mov -0x4(%ebp),%ebx + 36a1: 89 c8 mov %ecx,%eax + 36a3: c9 leave + 36a4: c3 ret + 36a5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000036b0 : + +int strcmp(const char *p, const char *q) { + 36b0: 55 push %ebp + 36b1: 89 e5 mov %esp,%ebp + 36b3: 53 push %ebx + 36b4: 8b 55 08 mov 0x8(%ebp),%edx + 36b7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 36ba: 0f b6 02 movzbl (%edx),%eax + 36bd: 84 c0 test %al,%al + 36bf: 75 17 jne 36d8 + 36c1: eb 3a jmp 36fd + 36c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 36c7: 90 nop + 36c8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 36cc: 83 c2 01 add $0x1,%edx + 36cf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 36d2: 84 c0 test %al,%al + 36d4: 74 1a je 36f0 + p++, q++; + 36d6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 36d8: 0f b6 19 movzbl (%ecx),%ebx + 36db: 38 c3 cmp %al,%bl + 36dd: 74 e9 je 36c8 + } + return (uchar) * p - (uchar) * q; + 36df: 29 d8 sub %ebx,%eax +} + 36e1: 8b 5d fc mov -0x4(%ebp),%ebx + 36e4: c9 leave + 36e5: c3 ret + 36e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 36ed: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 36f0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 36f4: 31 c0 xor %eax,%eax + 36f6: 29 d8 sub %ebx,%eax +} + 36f8: 8b 5d fc mov -0x4(%ebp),%ebx + 36fb: c9 leave + 36fc: c3 ret + return (uchar) * p - (uchar) * q; + 36fd: 0f b6 19 movzbl (%ecx),%ebx + 3700: 31 c0 xor %eax,%eax + 3702: eb db jmp 36df + 3704: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 370b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 370f: 90 nop + +00003710 : + +uint strlen(const char *s) { + 3710: 55 push %ebp + 3711: 89 e5 mov %esp,%ebp + 3713: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 3716: 80 3a 00 cmpb $0x0,(%edx) + 3719: 74 15 je 3730 + 371b: 31 c0 xor %eax,%eax + 371d: 8d 76 00 lea 0x0(%esi),%esi + 3720: 83 c0 01 add $0x1,%eax + 3723: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 3727: 89 c1 mov %eax,%ecx + 3729: 75 f5 jne 3720 + ; + } + return n; +} + 372b: 89 c8 mov %ecx,%eax + 372d: 5d pop %ebp + 372e: c3 ret + 372f: 90 nop + for (n = 0; s[n]; n++) { + 3730: 31 c9 xor %ecx,%ecx +} + 3732: 5d pop %ebp + 3733: 89 c8 mov %ecx,%eax + 3735: c3 ret + 3736: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 373d: 8d 76 00 lea 0x0(%esi),%esi + +00003740 : + +void* memset(void *dst, int c, uint n) { + 3740: 55 push %ebp + 3741: 89 e5 mov %esp,%ebp + 3743: 57 push %edi + 3744: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 3747: 8b 4d 10 mov 0x10(%ebp),%ecx + 374a: 8b 45 0c mov 0xc(%ebp),%eax + 374d: 89 d7 mov %edx,%edi + 374f: fc cld + 3750: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 3752: 8b 7d fc mov -0x4(%ebp),%edi + 3755: 89 d0 mov %edx,%eax + 3757: c9 leave + 3758: c3 ret + 3759: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00003760 : + +char* strchr(const char *s, char c) { + 3760: 55 push %ebp + 3761: 89 e5 mov %esp,%ebp + 3763: 8b 45 08 mov 0x8(%ebp),%eax + 3766: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 376a: 0f b6 10 movzbl (%eax),%edx + 376d: 84 d2 test %dl,%dl + 376f: 75 12 jne 3783 + 3771: eb 1d jmp 3790 + 3773: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 3777: 90 nop + 3778: 0f b6 50 01 movzbl 0x1(%eax),%edx + 377c: 83 c0 01 add $0x1,%eax + 377f: 84 d2 test %dl,%dl + 3781: 74 0d je 3790 + if (*s == c) { + 3783: 38 d1 cmp %dl,%cl + 3785: 75 f1 jne 3778 + return (char*)s; + } + } + return 0; +} + 3787: 5d pop %ebp + 3788: c3 ret + 3789: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 3790: 31 c0 xor %eax,%eax +} + 3792: 5d pop %ebp + 3793: c3 ret + 3794: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 379b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 379f: 90 nop + +000037a0 : + +char* gets(char *buf, int max) { + 37a0: 55 push %ebp + 37a1: 89 e5 mov %esp,%ebp + 37a3: 57 push %edi + 37a4: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 37a5: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 37a8: 53 push %ebx + for (i = 0; i + 1 < max;) { + 37a9: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 37ab: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 37ae: eb 27 jmp 37d7 + cc = read(0, &c, 1); + 37b0: 83 ec 04 sub $0x4,%esp + 37b3: 6a 01 push $0x1 + 37b5: 57 push %edi + 37b6: 6a 00 push $0x0 + 37b8: e8 2e 01 00 00 call 38eb + if (cc < 1) { + 37bd: 83 c4 10 add $0x10,%esp + 37c0: 85 c0 test %eax,%eax + 37c2: 7e 1d jle 37e1 + break; + } + buf[i++] = c; + 37c4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 37c8: 8b 55 08 mov 0x8(%ebp),%edx + 37cb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 37cf: 3c 0a cmp $0xa,%al + 37d1: 74 1d je 37f0 + 37d3: 3c 0d cmp $0xd,%al + 37d5: 74 19 je 37f0 + for (i = 0; i + 1 < max;) { + 37d7: 89 de mov %ebx,%esi + 37d9: 83 c3 01 add $0x1,%ebx + 37dc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 37df: 7c cf jl 37b0 + break; + } + } + buf[i] = '\0'; + 37e1: 8b 45 08 mov 0x8(%ebp),%eax + 37e4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 37e8: 8d 65 f4 lea -0xc(%ebp),%esp + 37eb: 5b pop %ebx + 37ec: 5e pop %esi + 37ed: 5f pop %edi + 37ee: 5d pop %ebp + 37ef: c3 ret + buf[i] = '\0'; + 37f0: 8b 45 08 mov 0x8(%ebp),%eax + 37f3: 89 de mov %ebx,%esi + 37f5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 37f9: 8d 65 f4 lea -0xc(%ebp),%esp + 37fc: 5b pop %ebx + 37fd: 5e pop %esi + 37fe: 5f pop %edi + 37ff: 5d pop %ebp + 3800: c3 ret + 3801: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3808: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 380f: 90 nop + +00003810 : + +int stat(const char *n, struct stat *st) { + 3810: 55 push %ebp + 3811: 89 e5 mov %esp,%ebp + 3813: 56 push %esi + 3814: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 3815: 83 ec 08 sub $0x8,%esp + 3818: 6a 00 push $0x0 + 381a: ff 75 08 push 0x8(%ebp) + 381d: e8 19 01 00 00 call 393b + if (fd < 0) { + 3822: 83 c4 10 add $0x10,%esp + 3825: 85 c0 test %eax,%eax + 3827: 78 27 js 3850 + return -1; + } + r = fstat(fd, st); + 3829: 83 ec 08 sub $0x8,%esp + 382c: ff 75 0c push 0xc(%ebp) + 382f: 89 c3 mov %eax,%ebx + 3831: 50 push %eax + 3832: e8 cc 00 00 00 call 3903 + close(fd); + 3837: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 383a: 89 c6 mov %eax,%esi + close(fd); + 383c: e8 2a 01 00 00 call 396b + return r; + 3841: 83 c4 10 add $0x10,%esp +} + 3844: 8d 65 f8 lea -0x8(%ebp),%esp + 3847: 89 f0 mov %esi,%eax + 3849: 5b pop %ebx + 384a: 5e pop %esi + 384b: 5d pop %ebp + 384c: c3 ret + 384d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 3850: be ff ff ff ff mov $0xffffffff,%esi + 3855: eb ed jmp 3844 + 3857: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 385e: 66 90 xchg %ax,%ax + +00003860 : + +int atoi(const char *s) { + 3860: 55 push %ebp + 3861: 89 e5 mov %esp,%ebp + 3863: 53 push %ebx + 3864: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 3867: 0f be 02 movsbl (%edx),%eax + 386a: 8d 48 d0 lea -0x30(%eax),%ecx + 386d: 80 f9 09 cmp $0x9,%cl + n = 0; + 3870: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 3875: 77 1e ja 3895 + 3877: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 387e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 3880: 83 c2 01 add $0x1,%edx + 3883: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 3886: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 388a: 0f be 02 movsbl (%edx),%eax + 388d: 8d 58 d0 lea -0x30(%eax),%ebx + 3890: 80 fb 09 cmp $0x9,%bl + 3893: 76 eb jbe 3880 + } + return n; +} + 3895: 8b 5d fc mov -0x4(%ebp),%ebx + 3898: 89 c8 mov %ecx,%eax + 389a: c9 leave + 389b: c3 ret + 389c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000038a0 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 38a0: 55 push %ebp + 38a1: 89 e5 mov %esp,%ebp + 38a3: 57 push %edi + 38a4: 8b 45 10 mov 0x10(%ebp),%eax + 38a7: 8b 55 08 mov 0x8(%ebp),%edx + 38aa: 56 push %esi + 38ab: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 38ae: 85 c0 test %eax,%eax + 38b0: 7e 13 jle 38c5 + 38b2: 01 d0 add %edx,%eax + dst = vdst; + 38b4: 89 d7 mov %edx,%edi + 38b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 38bd: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 38c0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 38c1: 39 f8 cmp %edi,%eax + 38c3: 75 fb jne 38c0 + } + return vdst; +} + 38c5: 5e pop %esi + 38c6: 89 d0 mov %edx,%eax + 38c8: 5f pop %edi + 38c9: 5d pop %ebp + 38ca: c3 ret + +000038cb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 38cb: b8 01 00 00 00 mov $0x1,%eax + 38d0: cd 40 int $0x40 + 38d2: c3 ret + +000038d3 : +SYSCALL(exit) + 38d3: b8 02 00 00 00 mov $0x2,%eax + 38d8: cd 40 int $0x40 + 38da: c3 ret + +000038db : +SYSCALL(wait) + 38db: b8 03 00 00 00 mov $0x3,%eax + 38e0: cd 40 int $0x40 + 38e2: c3 ret + +000038e3 : +SYSCALL(pipe) + 38e3: b8 04 00 00 00 mov $0x4,%eax + 38e8: cd 40 int $0x40 + 38ea: c3 ret + +000038eb : +SYSCALL(read) + 38eb: b8 05 00 00 00 mov $0x5,%eax + 38f0: cd 40 int $0x40 + 38f2: c3 ret + +000038f3 : +SYSCALL(kill) + 38f3: b8 06 00 00 00 mov $0x6,%eax + 38f8: cd 40 int $0x40 + 38fa: c3 ret + +000038fb : +SYSCALL(exec) + 38fb: b8 07 00 00 00 mov $0x7,%eax + 3900: cd 40 int $0x40 + 3902: c3 ret + +00003903 : +SYSCALL(fstat) + 3903: b8 08 00 00 00 mov $0x8,%eax + 3908: cd 40 int $0x40 + 390a: c3 ret + +0000390b : +SYSCALL(chdir) + 390b: b8 09 00 00 00 mov $0x9,%eax + 3910: cd 40 int $0x40 + 3912: c3 ret + +00003913 : +SYSCALL(dup) + 3913: b8 0a 00 00 00 mov $0xa,%eax + 3918: cd 40 int $0x40 + 391a: c3 ret + +0000391b : +SYSCALL(getpid) + 391b: b8 0b 00 00 00 mov $0xb,%eax + 3920: cd 40 int $0x40 + 3922: c3 ret + +00003923 : +SYSCALL(sbrk) + 3923: b8 0c 00 00 00 mov $0xc,%eax + 3928: cd 40 int $0x40 + 392a: c3 ret + +0000392b : +SYSCALL(sleep) + 392b: b8 0d 00 00 00 mov $0xd,%eax + 3930: cd 40 int $0x40 + 3932: c3 ret + +00003933 : +SYSCALL(uptime) + 3933: b8 0e 00 00 00 mov $0xe,%eax + 3938: cd 40 int $0x40 + 393a: c3 ret + +0000393b : +SYSCALL(open) + 393b: b8 0f 00 00 00 mov $0xf,%eax + 3940: cd 40 int $0x40 + 3942: c3 ret + +00003943 : +SYSCALL(write) + 3943: b8 10 00 00 00 mov $0x10,%eax + 3948: cd 40 int $0x40 + 394a: c3 ret + +0000394b : +SYSCALL(mknod) + 394b: b8 11 00 00 00 mov $0x11,%eax + 3950: cd 40 int $0x40 + 3952: c3 ret + +00003953 : +SYSCALL(unlink) + 3953: b8 12 00 00 00 mov $0x12,%eax + 3958: cd 40 int $0x40 + 395a: c3 ret + +0000395b : +SYSCALL(link) + 395b: b8 13 00 00 00 mov $0x13,%eax + 3960: cd 40 int $0x40 + 3962: c3 ret + +00003963 : +SYSCALL(mkdir) + 3963: b8 14 00 00 00 mov $0x14,%eax + 3968: cd 40 int $0x40 + 396a: c3 ret + +0000396b : +SYSCALL(close) + 396b: b8 15 00 00 00 mov $0x15,%eax + 3970: cd 40 int $0x40 + 3972: c3 ret + +00003973 : +SYSCALL(getch) + 3973: b8 16 00 00 00 mov $0x16,%eax + 3978: cd 40 int $0x40 + 397a: c3 ret + +0000397b : +SYSCALL(greeting) + 397b: b8 17 00 00 00 mov $0x17,%eax + 3980: cd 40 int $0x40 + 3982: c3 ret + +00003983 : +SYSCALL(shutdown) + 3983: b8 18 00 00 00 mov $0x18,%eax + 3988: cd 40 int $0x40 + 398a: c3 ret + +0000398b : +SYSCALL(screen) + 398b: b8 19 00 00 00 mov $0x19,%eax + 3990: cd 40 int $0x40 + 3992: c3 ret + +00003993 : +SYSCALL(cls) + 3993: b8 1a 00 00 00 mov $0x1a,%eax + 3998: cd 40 int $0x40 + 399a: c3 ret + 399b: 66 90 xchg %ax,%ax + 399d: 66 90 xchg %ax,%ax + 399f: 90 nop + +000039a0 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 39a0: 55 push %ebp + 39a1: 89 e5 mov %esp,%ebp + 39a3: 57 push %edi + 39a4: 56 push %esi + 39a5: 53 push %ebx + 39a6: 83 ec 3c sub $0x3c,%esp + 39a9: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 39ac: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 39ae: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 39b1: 85 d2 test %edx,%edx + 39b3: 0f 89 7f 00 00 00 jns 3a38 + 39b9: f6 45 08 01 testb $0x1,0x8(%ebp) + 39bd: 74 79 je 3a38 + neg = 1; + 39bf: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 39c6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 39c8: 31 db xor %ebx,%ebx + 39ca: 8d 75 d7 lea -0x29(%ebp),%esi + 39cd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 39d0: 89 c8 mov %ecx,%eax + 39d2: 31 d2 xor %edx,%edx + 39d4: 89 cf mov %ecx,%edi + 39d6: f7 75 c4 divl -0x3c(%ebp) + 39d9: 0f b6 92 70 55 00 00 movzbl 0x5570(%edx),%edx + 39e0: 89 45 c0 mov %eax,-0x40(%ebp) + 39e3: 89 d8 mov %ebx,%eax + 39e5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 39e8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 39eb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 39ee: 39 7d c4 cmp %edi,-0x3c(%ebp) + 39f1: 76 dd jbe 39d0 + if (neg) { + 39f3: 8b 4d bc mov -0x44(%ebp),%ecx + 39f6: 85 c9 test %ecx,%ecx + 39f8: 74 0c je 3a06 + buf[i++] = '-'; + 39fa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 39ff: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3a01: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3a06: 8b 7d b8 mov -0x48(%ebp),%edi + 3a09: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3a0d: eb 07 jmp 3a16 + 3a0f: 90 nop + putc(fd, buf[i]); + 3a10: 0f b6 13 movzbl (%ebx),%edx + 3a13: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3a16: 83 ec 04 sub $0x4,%esp + 3a19: 88 55 d7 mov %dl,-0x29(%ebp) + 3a1c: 6a 01 push $0x1 + 3a1e: 56 push %esi + 3a1f: 57 push %edi + 3a20: e8 1e ff ff ff call 3943 + while (--i >= 0) { + 3a25: 83 c4 10 add $0x10,%esp + 3a28: 39 de cmp %ebx,%esi + 3a2a: 75 e4 jne 3a10 + } +} + 3a2c: 8d 65 f4 lea -0xc(%ebp),%esp + 3a2f: 5b pop %ebx + 3a30: 5e pop %esi + 3a31: 5f pop %edi + 3a32: 5d pop %ebp + 3a33: c3 ret + 3a34: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 3a38: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 3a3f: eb 87 jmp 39c8 + 3a41: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3a48: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3a4f: 90 nop + +00003a50 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 3a50: 55 push %ebp + 3a51: 89 e5 mov %esp,%ebp + 3a53: 57 push %edi + 3a54: 56 push %esi + 3a55: 53 push %ebx + 3a56: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 3a59: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 3a5c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 3a5f: 0f b6 13 movzbl (%ebx),%edx + 3a62: 84 d2 test %dl,%dl + 3a64: 74 6a je 3ad0 + ap = (uint*)(void*)&fmt + 1; + 3a66: 8d 45 10 lea 0x10(%ebp),%eax + 3a69: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 3a6c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 3a6f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 3a71: 89 45 d0 mov %eax,-0x30(%ebp) + 3a74: eb 36 jmp 3aac + 3a76: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3a7d: 8d 76 00 lea 0x0(%esi),%esi + 3a80: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 3a83: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 3a88: 83 f8 25 cmp $0x25,%eax + 3a8b: 74 15 je 3aa2 + write(fd, &c, 1); + 3a8d: 83 ec 04 sub $0x4,%esp + 3a90: 88 55 e7 mov %dl,-0x19(%ebp) + 3a93: 6a 01 push $0x1 + 3a95: 57 push %edi + 3a96: 56 push %esi + 3a97: e8 a7 fe ff ff call 3943 + 3a9c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 3a9f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 3aa2: 0f b6 13 movzbl (%ebx),%edx + 3aa5: 83 c3 01 add $0x1,%ebx + 3aa8: 84 d2 test %dl,%dl + 3aaa: 74 24 je 3ad0 + c = fmt[i] & 0xff; + 3aac: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 3aaf: 85 c9 test %ecx,%ecx + 3ab1: 74 cd je 3a80 + } + } + else if (state == '%') { + 3ab3: 83 f9 25 cmp $0x25,%ecx + 3ab6: 75 ea jne 3aa2 + if (c == 'd') { + 3ab8: 83 f8 25 cmp $0x25,%eax + 3abb: 0f 84 07 01 00 00 je 3bc8 + 3ac1: 83 e8 63 sub $0x63,%eax + 3ac4: 83 f8 15 cmp $0x15,%eax + 3ac7: 77 17 ja 3ae0 + 3ac9: ff 24 85 18 55 00 00 jmp *0x5518(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 3ad0: 8d 65 f4 lea -0xc(%ebp),%esp + 3ad3: 5b pop %ebx + 3ad4: 5e pop %esi + 3ad5: 5f pop %edi + 3ad6: 5d pop %ebp + 3ad7: c3 ret + 3ad8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3adf: 90 nop + write(fd, &c, 1); + 3ae0: 83 ec 04 sub $0x4,%esp + 3ae3: 88 55 d4 mov %dl,-0x2c(%ebp) + 3ae6: 6a 01 push $0x1 + 3ae8: 57 push %edi + 3ae9: 56 push %esi + 3aea: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 3aee: e8 50 fe ff ff call 3943 + putc(fd, c); + 3af3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 3af7: 83 c4 0c add $0xc,%esp + 3afa: 88 55 e7 mov %dl,-0x19(%ebp) + 3afd: 6a 01 push $0x1 + 3aff: 57 push %edi + 3b00: 56 push %esi + 3b01: e8 3d fe ff ff call 3943 + putc(fd, c); + 3b06: 83 c4 10 add $0x10,%esp + state = 0; + 3b09: 31 c9 xor %ecx,%ecx + 3b0b: eb 95 jmp 3aa2 + 3b0d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 3b10: 83 ec 0c sub $0xc,%esp + 3b13: b9 10 00 00 00 mov $0x10,%ecx + 3b18: 6a 00 push $0x0 + 3b1a: 8b 45 d0 mov -0x30(%ebp),%eax + 3b1d: 8b 10 mov (%eax),%edx + 3b1f: 89 f0 mov %esi,%eax + 3b21: e8 7a fe ff ff call 39a0 + ap++; + 3b26: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 3b2a: 83 c4 10 add $0x10,%esp + state = 0; + 3b2d: 31 c9 xor %ecx,%ecx + 3b2f: e9 6e ff ff ff jmp 3aa2 + 3b34: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 3b38: 8b 45 d0 mov -0x30(%ebp),%eax + 3b3b: 8b 10 mov (%eax),%edx + ap++; + 3b3d: 83 c0 04 add $0x4,%eax + 3b40: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 3b43: 85 d2 test %edx,%edx + 3b45: 0f 84 8d 00 00 00 je 3bd8 + while (*s != 0) { + 3b4b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 3b4e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 3b50: 84 c0 test %al,%al + 3b52: 0f 84 4a ff ff ff je 3aa2 + 3b58: 89 5d d4 mov %ebx,-0x2c(%ebp) + 3b5b: 89 d3 mov %edx,%ebx + 3b5d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 3b60: 83 ec 04 sub $0x4,%esp + s++; + 3b63: 83 c3 01 add $0x1,%ebx + 3b66: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 3b69: 6a 01 push $0x1 + 3b6b: 57 push %edi + 3b6c: 56 push %esi + 3b6d: e8 d1 fd ff ff call 3943 + while (*s != 0) { + 3b72: 0f b6 03 movzbl (%ebx),%eax + 3b75: 83 c4 10 add $0x10,%esp + 3b78: 84 c0 test %al,%al + 3b7a: 75 e4 jne 3b60 + state = 0; + 3b7c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 3b7f: 31 c9 xor %ecx,%ecx + 3b81: e9 1c ff ff ff jmp 3aa2 + 3b86: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3b8d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 3b90: 83 ec 0c sub $0xc,%esp + 3b93: b9 0a 00 00 00 mov $0xa,%ecx + 3b98: 6a 01 push $0x1 + 3b9a: e9 7b ff ff ff jmp 3b1a + 3b9f: 90 nop + putc(fd, *ap); + 3ba0: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 3ba3: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 3ba6: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 3ba8: 6a 01 push $0x1 + 3baa: 57 push %edi + 3bab: 56 push %esi + putc(fd, *ap); + 3bac: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 3baf: e8 8f fd ff ff call 3943 + ap++; + 3bb4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 3bb8: 83 c4 10 add $0x10,%esp + state = 0; + 3bbb: 31 c9 xor %ecx,%ecx + 3bbd: e9 e0 fe ff ff jmp 3aa2 + 3bc2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 3bc8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 3bcb: 83 ec 04 sub $0x4,%esp + 3bce: e9 2a ff ff ff jmp 3afd + 3bd3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 3bd7: 90 nop + s = "(null)"; + 3bd8: ba 0e 55 00 00 mov $0x550e,%edx + while (*s != 0) { + 3bdd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 3be0: b8 28 00 00 00 mov $0x28,%eax + 3be5: 89 d3 mov %edx,%ebx + 3be7: e9 74 ff ff ff jmp 3b60 + 3bec: 66 90 xchg %ax,%ax + 3bee: 66 90 xchg %ax,%ax + +00003bf0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 3bf0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 3bf1: a1 20 a6 00 00 mov 0xa620,%eax +void free(void *ap) { + 3bf6: 89 e5 mov %esp,%ebp + 3bf8: 57 push %edi + 3bf9: 56 push %esi + 3bfa: 53 push %ebx + 3bfb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 3bfe: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 3c01: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3c08: 89 c2 mov %eax,%edx + 3c0a: 8b 00 mov (%eax),%eax + 3c0c: 39 ca cmp %ecx,%edx + 3c0e: 73 30 jae 3c40 + 3c10: 39 c1 cmp %eax,%ecx + 3c12: 72 04 jb 3c18 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 3c14: 39 c2 cmp %eax,%edx + 3c16: 72 f0 jb 3c08 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 3c18: 8b 73 fc mov -0x4(%ebx),%esi + 3c1b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 3c1e: 39 f8 cmp %edi,%eax + 3c20: 74 30 je 3c52 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 3c22: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 3c25: 8b 42 04 mov 0x4(%edx),%eax + 3c28: 8d 34 c2 lea (%edx,%eax,8),%esi + 3c2b: 39 f1 cmp %esi,%ecx + 3c2d: 74 3a je 3c69 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 3c2f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 3c31: 5b pop %ebx + freep = p; + 3c32: 89 15 20 a6 00 00 mov %edx,0xa620 +} + 3c38: 5e pop %esi + 3c39: 5f pop %edi + 3c3a: 5d pop %ebp + 3c3b: c3 ret + 3c3c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 3c40: 39 c2 cmp %eax,%edx + 3c42: 72 c4 jb 3c08 + 3c44: 39 c1 cmp %eax,%ecx + 3c46: 73 c0 jae 3c08 + if (bp + bp->s.size == p->s.ptr) { + 3c48: 8b 73 fc mov -0x4(%ebx),%esi + 3c4b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 3c4e: 39 f8 cmp %edi,%eax + 3c50: 75 d0 jne 3c22 + bp->s.size += p->s.ptr->s.size; + 3c52: 03 70 04 add 0x4(%eax),%esi + 3c55: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 3c58: 8b 02 mov (%edx),%eax + 3c5a: 8b 00 mov (%eax),%eax + 3c5c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 3c5f: 8b 42 04 mov 0x4(%edx),%eax + 3c62: 8d 34 c2 lea (%edx,%eax,8),%esi + 3c65: 39 f1 cmp %esi,%ecx + 3c67: 75 c6 jne 3c2f + p->s.size += bp->s.size; + 3c69: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 3c6c: 89 15 20 a6 00 00 mov %edx,0xa620 + p->s.size += bp->s.size; + 3c72: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 3c75: 8b 4b f8 mov -0x8(%ebx),%ecx + 3c78: 89 0a mov %ecx,(%edx) +} + 3c7a: 5b pop %ebx + 3c7b: 5e pop %esi + 3c7c: 5f pop %edi + 3c7d: 5d pop %ebp + 3c7e: c3 ret + 3c7f: 90 nop + +00003c80 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 3c80: 55 push %ebp + 3c81: 89 e5 mov %esp,%ebp + 3c83: 57 push %edi + 3c84: 56 push %esi + 3c85: 53 push %ebx + 3c86: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 3c89: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 3c8c: 8b 3d 20 a6 00 00 mov 0xa620,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 3c92: 8d 70 07 lea 0x7(%eax),%esi + 3c95: c1 ee 03 shr $0x3,%esi + 3c98: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 3c9b: 85 ff test %edi,%edi + 3c9d: 0f 84 9d 00 00 00 je 3d40 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 3ca3: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 3ca5: 8b 4a 04 mov 0x4(%edx),%ecx + 3ca8: 39 f1 cmp %esi,%ecx + 3caa: 73 6a jae 3d16 + 3cac: bb 00 10 00 00 mov $0x1000,%ebx + 3cb1: 39 de cmp %ebx,%esi + 3cb3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 3cb6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 3cbd: 89 45 e4 mov %eax,-0x1c(%ebp) + 3cc0: eb 17 jmp 3cd9 + 3cc2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 3cc8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 3cca: 8b 48 04 mov 0x4(%eax),%ecx + 3ccd: 39 f1 cmp %esi,%ecx + 3ccf: 73 4f jae 3d20 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 3cd1: 8b 3d 20 a6 00 00 mov 0xa620,%edi + 3cd7: 89 c2 mov %eax,%edx + 3cd9: 39 d7 cmp %edx,%edi + 3cdb: 75 eb jne 3cc8 + p = sbrk(nu * sizeof(Header)); + 3cdd: 83 ec 0c sub $0xc,%esp + 3ce0: ff 75 e4 push -0x1c(%ebp) + 3ce3: e8 3b fc ff ff call 3923 + if (p == (char*)-1) { + 3ce8: 83 c4 10 add $0x10,%esp + 3ceb: 83 f8 ff cmp $0xffffffff,%eax + 3cee: 74 1c je 3d0c + hp->s.size = nu; + 3cf0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 3cf3: 83 ec 0c sub $0xc,%esp + 3cf6: 83 c0 08 add $0x8,%eax + 3cf9: 50 push %eax + 3cfa: e8 f1 fe ff ff call 3bf0 + return freep; + 3cff: 8b 15 20 a6 00 00 mov 0xa620,%edx + if ((p = morecore(nunits)) == 0) { + 3d05: 83 c4 10 add $0x10,%esp + 3d08: 85 d2 test %edx,%edx + 3d0a: 75 bc jne 3cc8 + return 0; + } + } + } +} + 3d0c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 3d0f: 31 c0 xor %eax,%eax +} + 3d11: 5b pop %ebx + 3d12: 5e pop %esi + 3d13: 5f pop %edi + 3d14: 5d pop %ebp + 3d15: c3 ret + if (p->s.size >= nunits) { + 3d16: 89 d0 mov %edx,%eax + 3d18: 89 fa mov %edi,%edx + 3d1a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 3d20: 39 ce cmp %ecx,%esi + 3d22: 74 4c je 3d70 + p->s.size -= nunits; + 3d24: 29 f1 sub %esi,%ecx + 3d26: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 3d29: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 3d2c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 3d2f: 89 15 20 a6 00 00 mov %edx,0xa620 +} + 3d35: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 3d38: 83 c0 08 add $0x8,%eax +} + 3d3b: 5b pop %ebx + 3d3c: 5e pop %esi + 3d3d: 5f pop %edi + 3d3e: 5d pop %ebp + 3d3f: c3 ret + base.s.ptr = freep = prevp = &base; + 3d40: c7 05 20 a6 00 00 24 movl $0xa624,0xa620 + 3d47: a6 00 00 + base.s.size = 0; + 3d4a: bf 24 a6 00 00 mov $0xa624,%edi + base.s.ptr = freep = prevp = &base; + 3d4f: c7 05 24 a6 00 00 24 movl $0xa624,0xa624 + 3d56: a6 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 3d59: 89 fa mov %edi,%edx + base.s.size = 0; + 3d5b: c7 05 28 a6 00 00 00 movl $0x0,0xa628 + 3d62: 00 00 00 + if (p->s.size >= nunits) { + 3d65: e9 42 ff ff ff jmp 3cac + 3d6a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 3d70: 8b 08 mov (%eax),%ecx + 3d72: 89 0a mov %ecx,(%edx) + 3d74: eb b9 jmp 3d2f diff --git a/usertests.d b/usertests.d new file mode 100644 index 0000000..a4933d3 --- /dev/null +++ b/usertests.d @@ -0,0 +1,2 @@ +usertests.o: usertests.c /usr/include/stdc-predef.h param.h types.h \ + stat.h user.h fs.h fcntl.h syscall.h traps.h memlayout.h diff --git a/usertests.o b/usertests.o new file mode 100644 index 0000000000000000000000000000000000000000..7162c9ba5e92591fde8553d48563ac82e30c9091 GIT binary patch literal 73980 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
    KzhdiGst`mhlkUWSghy|X{ z%qi7rPa&<1$0f!{!aP|D)x{~fHZ~_NxxCycE!B{UH>GHl*Vxk1L16Iel!Tu(2+8Ip z0r?!lkXSxZ#Q5>3n{qJQqZ;Y+0FWd|n7pU~Ti2CUVwIuT%kk%VZ$u-0X*KI7>IGT& zAL{E&CI#_}DYZ0gFk1(0kUm>LX=>r);;&j4;C`GCoy*G;?IP)bp9)ibeIk>j6PWyt zNkBc7A~mIpYg){pE|~4&gGSr2zTR7|LGk7)Y3~@+ToFG@3Zl6|*`6aJt9ikAUi13= zzDbfNg5o__U;l4v3-ktxptIwZ1-!ur{jT%Ihc^gSz*55$qfL@VNpU6CZV}J^8s=<( zbyL6IrTrr{Wpy$g=sdlg39Q?Y#Z+@)f~tBw9$z=FV(DTp&s%OKbJj+yYU-c{R$?tP z219(1&2v>*7f2ZLRhBkzvaBn^a#oonZ^+PLXPte{xx)vO^4up8^p#J92PGzD78b!Y ze9gjA*jH5ns#g0YNMD@iA3>;QAwvFQtX^c@%v2yrIfHV2FOXE6S>+~W2TE%{iC4#k zuBb_c8BrHOH*}~ZRL{b$nD>z=7_s!sGp>#u&l;7nh)D~!5DMPU@sY%s}&! zM2J|~vZ+3o)nIL1Rdsb)X{4;UX2B9~)i{@KQB@ULSX>FnFCpb?=U~gH%KN0J2*zTh zcRl{c^ryKZ30uSfER$cPx~jHrAX&U3vKozW*q4^+1u6DsTw$v$8APaLlvJY(8WFJz z%8KEUT)kG+K1r=Cm>E&T%6&xZe?jy50#xYjGQm^MJfg%#4YW2Exjz{^% z_W>`K71zuiST&z(0Z@8r5l`qCg-lxUyhH;9N_iE)Tgq$8W7v&)ordUFfi*oBJQAS- z%O*q{G!eZpX9<`S3c`^pD{7-W9*9*`d9pMWDXprcgH={|yJS6xbPFQY#kI9kwzdp` zsTKjEwywB_ia?&ma%+k!jnR`P8CT{PURh`qj4mw9A7^+=4tQrt9eRfCMf5`mk9$9y zUF|m&UR=yJRF*AP-mjHO;F&Y0MILbvZ{ZTDDpxyAa#qyh8+#gfv^S&Fo(WYJET~!x zr4y(*!Qc+N_xcKFzKekOgO~xdA-)_ZIy1HpZ{-Vv2|i{ zZ$wDs^Y%S(gVGAw$jNC39{W+Fra4c$!ZNgEJ-U7h$H_I&3Q=bhE*KMR}v;zvT(E7xk&dlBzgqX7F`V zi>?2jCsFCR?btTY27&em&UBzo;`E&~o8!lq)D-pKbNP`9^(Atil`JqhttZI;W3hOR zi3O9yCncet>c{^}p?FpQ8(YNPp_y%yZSlXfZDMySzo@IytC8dtg=!x*HeL+GP)Jb8 z;8YkXSx{WD5aSYZxXg;=4IVr=QU|D395g<&dD9>G=GIg#<`OhgTv}RFhAFDHy11ll zgdU02(IvHVu0x-b^8WN%QB@hKuBj@Gm7qqoT=is}89^MbkCezvtIO4t4fN(^7E}r( zF?#ZYd|qTiELwm)kzY6F94)uBYH?+4#ZrABlqAxdP1PKXDO2s7Bme*SqYW?Gn>8<2Et zd?^;*5tHJU(cw}QPIn)SGaLZPk1&LcwiMi9E50&X?Zvke(_saqwRUFvfK;6cSyFXo zU!(JSB>KDVNuQw84jP_9Vi8!B`9ni8$h<7jU4A%Q0Y?L zUzttJa3-LYVFAA+$S}D!9@B)0|K!D`3IkgsTN!`TJ7IRf&hu0({oaue4u<|I$gyWbsFdnw^j`zo z+@Z>WG}?m8-1Iw)i~(P%tk$z}wKf=M+`+6JZfBaVEigQ-X_)-oF;-%p0fNmmFVsjr z2r6iDL`W7NAmwkInI#}TKpiGK`rfV}7J}&80YnXmk4Y>B(Hg_jybi=`-9fAbG1dif z1Be&ffZ&~6LDqwqjEH644&v%Ch`T{ViSVD_KH3+={UFx#0r3ckYILjl1c)>e&w%LJ z4+NjgI7Q+W5S{vi*agDv0fGZ+!08~~1Y!3C@n;YpGwU4?H{!7t^8*sN^=}>ou_y}! zJN0f@%cM2icLu?+va}0`??9Y|X8_F~LCk|SO^&}^X&`Kv`m6RJ!XUn;-}y zM5`KS?!lM&qT8DB<3cP2+cCXqU=_O9+~T?>%cbMM;Bhx)HnNOdOfQDH9y$FS!|0j^ zAsgNFbC8pc-LY}In|3j2+$%DE}&-4peKf=iPUK zU8AtsNVBK2uff-ks4C-9WR|+ES=iq2o8=aiTHt1okG(w)AGZWrU#qa2k^Ut<*_HTu z1Lduf5~J2_GaJeO2cJ9eG0X70D2Ja8C2txer5f3rCZ2{GYVtlGf z^ja0y%gh^w8}1_XA+%V8UJQtY3dZy`iM1CPq3J-+bJyn?2D{DNGzQLQ(Rd@28J-0C z7(Q(62vD6-LYh4jgtT@x2yqefH>igVG9LhO4~Z8*Fz}drKuEFoK}fOBK?rk=7QNULWHxE! zW-VG~0FF2@M|Yzg|IyI^mm@B{!Z^e8pU{g?KHaT`i_#S4rV$vLgQ6AiXOClW8)dW% z)!=Wzbp#))+Gy>j_5qcH#Mi$zaDkjXFpwRbZPpt`~1krBQEUxv9BS<-E{gOK(< z0D>Xed`c59g4jU|?f@aCcmo6{GxIwTQrw0qBy_b0AxIYwG1_t1nl58ZUbSJGZU@dZ z=~#0cmTvWOuq<*SXBx&3j@?c7rJ)_=rM1RlCxx`VVe4{nmBmh*+29=w2?O!T;J^G| z?6iMcc(yHf*CBJU6Cuy7$X|<(RczEdX$OG3gVa_cbAV(LnT_IC;bWBm$tJ?~)!^eI z#scd=EC)j^9Ur$N3fDV5i4`Kv2^4m(cg`Tvh}24aGOj@JdM9@=Fnhz3%dO&tb;c4$ z`sQBb-@#H9#tKJ*%;!kGkB>P5jTggR1mZkYWKPw@0!^#~A)R!;Mz(6=br8}wf6>UN znmDD2jDeoy(=~CvCMId3L=!h@;x0`*tclk^aG7Dg2}1Pw2!z!BBM2@r%yzk6)>$CZ zVG(l@2x(Uog!t1!5K?Nb&UyfZ7~v(2yrGG|gJAqJ{{ccA^k zP9qaEapI1VJfm@3V=QPL?!s11x)=v1GfBMT=`tJ1hq`C(U# zJN`tTjIt}8^x5#@!ECM0p=mrp~3J_BJqndaUgtX}ujqK9MevQ1X zkxw=9rACfxF7gl~gvEuiKeQk79Je&EXePct zK~kiD4MHs9_VujR4TKotY)xFIv&uEHR1-IA;(ib!@C8l03_|q&y+;0|k-ux?6OA0x z$oCqt(L*9I3_|3z*GLzQ^w&tPMn-C6w1*g>8Stn_LhE~DqLlV?$xM%WRC!caEdKbT z4(5H}kP4pwAtu?QiBCa@OZ)&r9KeCu1Zf9CkRIBQXK7+02oZR-CQ3j^Q?Av>B8{xp zNRvkH(8wl@JgSi=HS&r^c6o>q;wY&J?K~Z;Kxr=bFl=tEYVITlfgc})huTmEnKvS} z79Uw2*M_o)?L_(|a&c80>OkldB;Uu!d>f*rSs#NCNBIVX7^6!s!>DAfxgcc3Tna+W zGZTdHJOx4~x7|AHBM>6zA0R|>tKJ@w4nhppMI#Z74ARIjjf~aE#TuEak(nB)&`705 zuG7d$4>3Y#Bm7MZ9qefse@Da3P25}2ghk4PsV-1_tlFi3#D?c0nTt>M1<1Od>=j0d z$|?sun^^_ODqt3DS{9Nu*=pd|<71u&3yQr8G;u!&vBe`GXad9R2}(>@4nmAt141mf z4TNyN0zz^B2=xVWG}A9VCL?s2jUBOVV7+#bwQu4!kPW=gPMM9G_zO^X;X_UDv!#La zTN%b&e9UYV60zMuNZn_Ekl}JM2+^+$gtTTM2vKwi2w~m;LYSWbA&oa;eI)c=(xp3uY|O&kOv%y`{|lH3l2NIo5eWL>C< zS(;d?iH(|gLKAO*5PiPXgwx$aP6Ht=JxddpYN8B;D8Eb-w}ViVt|oXGAv}NA#P^!W zh69s&m;pitPE;ccHS!CMtkB5K8o5m)_iE%pjXbN77d5h1BX4TteT{si zk$-698;uw}v|EA@4YM`UQ6qgca)w5RYvg>5Owz~|8o5Rzr5dTx$YPB&YGkcO?$pSy zHS(B7wrXUDMs{oD&l-70BcEyHutt8+$j=%{)k889gtYxMjr7#WV2zxmk+B-NSR+$4 zGE*ZJ8mZLCbsAZzky|vfQ6u+h3;rrkKhFqYUII$%&$ z7)w*gE?7JPf>!J5O$W~ zgOEDKZao{^dysmGNWC%JZj05tkrl@ADn91h5F;buV-PZaJ_m7+g{+=97!zbB2pQ@n zAY||_1|duH8$d|$`#{LR-lmaPKuDkM@(3ezF7*AUwG+Yf6f4-|A}8YxsPm1L`XDa$ zh6k2I>u)WIsysp%fRD88TT3kSSEP3ns|1%!2^~{#6oC)J@wZmaY>2r6$$Wfr%8QNf ztW?%wZ`ihcNS67%p3uk(AXvL{cb>_LyZ1Fhe*yTc zwKWG$D^9~>T6Xqx%1hRvqnF`h?godb^d}HvnGZB^6oj-f1;?>6cXk6IjU5C+y5k}c zQfdkaVXo4|Eg;1B_k)m9&w-Fqe*ht+KGet$n#jDY=D&du zbDQWk$!ZHivbyOWJrjgfI!+T4K!|atY2+%6%+pAfMwV%0l}6TU#)EHU$2Fm33JgE;Ku!c4>Kc5HhCE10kb)oF*n{;xbL# z3_|+mX%J${V<4m_vf6qAhiKv)5Ms*ZAf(hSAf(h2Af(i85TeHGAcXmCO&ro$Uuon= zjhxg-2Krcvw*|rCYTWbIl8pQAMo4Z3S_U@X--u5>hvghiW-7a`OvAkwd}MYol~2Bf z^dE`gEZb^JE86KenI|$2h}e}sds2Z9W)RcrNS<{_EyG9lbEegW*zb|vMJ{xRY4s#z z;f&}jKpAr2Yo&=k8w%X}pq*{W;qN@KT#b);F0@we2}0~O0fh9{LJ-nh{Flf=EYSr2 zO|c-if)Kku2SSFzVGz;*Ha6oTkpK2nsyJU0V?jtyTmeFg$3VzDauWy{Nt-p#;~=E? z(;C^UkvBE+zD7RM$UijljfWU=%Ykce={DO4eGGHFZt}NTo{?_jZ8~<_J~M?@d7n@`Bx^AUsbUidDgL}BsIediK}c79t&wj%#5fC&%Hp=D=~lzncC$^JcstWt zm}fj-rmcfbd!Uio_*e^v0Lmg%faE2Fc&qC{W$6l}%kXj6LCAwR zlbb-uIs2_3#12n^;9Y<74$gqVjjsFa$di7P+|^EDbN)d>D=qGDdGkw%TI z^$_En3*i`M7t=LEoncJNqO2Wjr^by{!q6_Zta=F%mzWk zXtN1l4b|`u@#Rf?PK9PzErz)aEj}L~SgKKg+mL9Y8P=eL)OHsLF~fF^><1zCII4;4 zkjKo|LWvprgOE}abku_L$DvrwQKik(Pa;kuNmzqef0@Bn#al zI=2HMrTS`wzak~b`5GDPAzT3C=Ey-9>lP5^CO)M@3)P50UWGAUq(P2@L4=32L3o#2 z^yd#VNn=NX5FXy_7NQ7*)H_cje0YY4(dK)2>=g&`^)IQH4+W)h%9|_|e~d~$z$Y84 zNTbQq>6(n$Nc{}>1a;~QIa2Xxt=xDJQs3Yvg?oF}P+l%zm!PC!B_}Rc3!_meHmkc*N!^Ky3ko ziM^YuttSZ4@oW$hpe_R;s?E{Jbs$8w+ca?}2vO}(jXbH5S2eOnBkyX2^|O@Gnx;Pp z;(L6|P1g^=aZ)h8fiZY5iQ@UW;JWV1&tLwnLUEJrIN_oex5kz5;}3 zb`uCunh!z>@}fpKi3+k`BX4^MWFJQ@Qtl@Z(rNrHE$O0a&CW%;>MLEYHRsT+Vcd~M zDRa|)=$l38ARzg|Q4H=DyRRU_MDw(P<)QT6wL{sYy%LOo6)@kbE9$0wYMc8*|)E;wf~(OAP= zV!J6Q6k$S29tGn;GPC4Jmf#|L5(>zn$U+d(m3L@j8wj!2Uo>$5g!JI&8ad)2sPGV! z750CE5J?s?W!O?Hi6B4fawm1U)_fRg_F$B!(wmB*@+h7m;xS3}BvNZW8WqVij1pmZ zjfR*7=rnBbJK&SW{Q1b2FC38J*(vvFaD~ZbUXL8nssV)R^s_aDfAz1rrZpe%n>|cD zNoH=kb|C7o5jRIb{!n~UGm$6;F_VcdNGu1j1fMLHd}SDF1Ee0X}&T!${tpgL3#}G4J%V zkijo%gQpjFP#bcYc>qO+vq2~wK7}CZqT?XsAsh#JGJj=&kWTC36@!F}jb$bs-x_Av z;q!W!Bb?!B6SA!iFYq)KEuMh9P_B7FC%d)E?cw(A)W&SGt2Irl0(rhF=^7OMu%k#64=-t* zYvyGKHOuT}q@|soW@Ag2bsF*}o7={uk)f!EIo+9-Mm^eS?M-N(+_bitMp};$Es&jN zPU%4YoCGy2RNF2t!4V0O9ws^4x0m)?l-rRqI%tihSr>F-;f}e6vMi0)!%^15!?j`- zI9X?1Mp~`PbkP+`8T5v-ch>|~j3&*-F74q44bv^nWRhB9n;7V&bI}tKHWjgm}NWBK$x;uyWe8fonK3E4`!-mn>@^yvdv?d!Ep7}&NOO(<&^ z{Wzxkd-|o(9|;JRTPeibi|T&Rl`QN~D4YdCE)S zu2_c-cEl(1P?g8XZX1$qrlqNJ6f`tso}ZS6=Ek96{ZODQ8huuMkCfpAyNzO-Xu$J>qXXuD z48g@Q5JUVwSO7!a2w59Kp-@-rT72DVAt7-bS*B^YeDpVjW46JYL-s!{b86_H)=!pM z5c*`0@)1tP%ZL%JcO4Y0qMpPC+ur%L&#ZV0~$RuEceZUi2>+q_$4hxs6J zuI7Xk_YO=-AtM7!8Kq`nXzqMa^H-aw){;iLd_>l3-h|6Ti&jK7hc2&?NA&$xn6v}` z+*>dsh42V&K`3XJ2~)gc{fVZy&w19tJ#@QFSoba z-6|m5-HWge`-3ku7TI4}_rsK-J3^0!0$jc#EfJhV(&aqd1LHabj_G0 zcJ1=bp(WP?y8dyrI`p{t6fO3Yd6cQ6<}s#@nJ-#My=c9{*1TeEv60&5>~L|};lAyP zthe2xOgFUpRV!S6)#~Y1BKzr92ay)dTt3OF%=3`*GEC8uzDbz7RmyZgy|ZfYRlAM~ z-D^J0%hTowTKR;zhI-v=-)qa|qzzZv75X%U%Xa5Y+I)q32hDqj`-BVdRrfWTevf;A zm%qE;G4DIKk?wUCNtEnhrFxl8#XNu?Q#w}LOkVu$q zjjo$RPAihNBwMvciPppX^b^i&!pBUGAQ`L_<@tlf0c&+f!@Kvk7r_a74+DMNJ}x79 zoAVBQlvQij=0l(%!(l0B7&>^^Inur7OaVRZR~#_jpXIItNYYC%+z6C3PL|yw=h-) z869+NzXSinwcYAtL`!lV)&7m{rTSN4m;PUaYkkJnHv_Au1 zS5-7OFPnpyt6fu4N)_pP_fp*K3mFU<9m-LA`7%(;?xG@hsa|`=e3z*^?WY+qp0>Yd z#QImObzxkd3Gdn4)YCm#TytS$o3kq9N$gH&Mahfa>Mus6bKBRy1HTfV+&AS zXJ~B3ERD^&Mq{hYdobRljHievX$9Smxwt%KK936rve);4PSB+eVdoh#EQv4Yz-`XS zm-v!j1^QL<&-A1}o1d8ierBFz`gQ9IdViz+pP1J|--K@91bLUUnW1~L^O%#d;j!f# z&5L_o+$TI34SC9WfjKWYyOVM}72+573sHuFVm5rZAoN={pdi#>|A~{t-|WNmfW!9J zoGXrnPBKuR46Sy&HhLC4g_SOrMQo8VUPAW71D0G5SnpbP-EWqM-nE{z{TQz6cll%r z{+TI+&Wz#fn4V7G;ylDi1 zak8)~W7b2^9`g`gV1>2XqJdZA3Kdo}aKQ(x<4hg5?&P{>i@noppf(cE!9&LBsBkT# zQUThtg4OS3jD^9ilelPiW%$v0=qvPhdEZ{oMcq(ax6`S}=>r*?1`a`N3Jp2O8oD`j z&IoJR=Fo^a%zeiEoyqI(%=b)3O<3=lADPZsGSWUW|4XC4v9_=UTd;Nt)vm`p`&avm zq+arj2u<$9K_eUunj62wz@8NPrMV8{o(tK>B)!A@8(aA|^F~_dMr$KmxzW0tsb?`I zu*_cTeI#|y@b0#<(7#v+&Tjn|ZDQHBX9L*Mw}#6b-P+X~*)NT_;VH}bhcH(N@s#-* zGk!4tB^LOXd57hUlxE)nMVwJW-fi8h(LY)rQ$5bBiceH?cS=p&pivb9v~L4VxGzaQ z7iexT49;Fywuf>nK+SJrBw`2wa;xq$`XZO;;E_o~|(dCX2ps6ITvgKs;mFwFU4BYn#=o&Tu74 zePM0n;M{0GWP{h&P3jpT^@LMvjUl}@7(KzSmPu0&qnj@d9X7v0w@<>uKWosX7l$_3 z_uIH?+cdknyl0M>4})|ucKdYpj40D|K&`YFNf<6n}iudR=_(b!#7r7KHX$e`K1CRfd&smpAbB z;?Zf9`lT&C;$*Z+J*>!#vwZX}s2r{~HW*z`AFvskKde({Yz{q)pyTI>6D@s!T%*ShJNO3 zE`O%WJHsKPJ0z_$v05q!?Xq?S2bFIN7{g;8z|k?l8(_aSnfkR!-9wvkachlgqvvMO zTi9#0M$gl+KHOsN!V?rsZ4T`+|7xZRothHD#Qvd)NLGl7-?ku2DaLQ~g3H(YsX43< zmi(cD$*gViH6X7kv#SwU%dqfOmQ=mPg6EcF;xQ7E^=e4kc$-#pCJ zVQvkkajV2zOY-OP9(l+}<>*fx1LKYv=PWYvdTkDky8@}gdH8z6yoL4-RH+N0qSQ%r zyTS$hUa*h@gzR)Tu3y8K;_R9eVfbc`Kr+nx!`y)e|J*e=_zM~1V4FGcuh6X~HtU%F z&7Wv%iGc;7$E=;~u4aGiF5dq2b|Y6p>9T84`dV)Ru$IwzEldtkZ(E;pbboFgW$Gv| zTrAxkpRwGpL==|*cQFJ{MfF&V==sL4-E?`cRV{IQtR~;>=95(VN%Jns-h@a2@Q>C< ztl}f1vE8K`me@jd8>6vtTx<(gT(7C6%RNfe2!6Rgi(FZ8<)G@j$k+}9!}Tx!Won%vo`Exbj0K-)PKsa z=}-@wFSEm5Huodtxwgw2DmsP_g3z;ILBrxCirQS>R|y%zDP#CJJ6w$+GRqEMyE!zg znhM!6rV_X=v4-nhX|?6@4v9L8>)96-j2|EG2j0O@3+c8apx}jcb+CaP{Wk@7 zG5FUuJ|5-g3-qz3!yBI=qaakh#zb8DgK0P&rQ^>H)h{!gEHR1`N=pl6J!WE&_W>BP zPG^xzLIra|H(=Zuj<=w>e4328!?Rj#!)iSzv zSLdr}3p&F5sdWY~)D#~O-Q}L1Wp=kRLo(N2$?~)L73G)H4(Bf<>@3r9vYmEr8^@XJ ze&?jPrW1b2aol=Ez7BG0oD87#4)%D1kY!gFg?rd(_$rkDoz8aaRS=rvbapcxrvg&b zAk}fFJ7KwQm8s>08GhJ1f;o3`9g$KDsth&Yw_i!?< z3ip_aYbU$oH&SmWRqwY-Zx-H~q{3yQLW(=c!Ho*A9dgof&2VE7{2BP$Z;qF(_bNtp zi?_H%_(rAnQZ~8`zMOW?N~P^|rK!@$172h6H#kXvZ?{E7E=<^CmV7(y=R*vP*4}OH zI9JiMs$4i*>H0WYobGmn#g^tm!xK(66}Oj~?lsD4-ypd|lU?XG?sHByuOl7DPAv)# zYM{tS#0hVAQb$0>AkPX7juRdx4R%;Bdnv^|KybC7orjDx&B*Ymnc-1T1yXxl zgC@Whvs7!G4tC#gL@d&Q7MY0^Y+_5&{{W$zAt&4EI0EEct#fzL`7K}PwYRpYZ>t-f z)~=m;kJCo<-0F11HJ$EoxmS^0IT9_%7P%>Gk=MCS7C19tB*)G$H^iHUvr#rJf;_t@ zH$2MjQWWmV9v-63O|wTit$9Ja@yi<_8*P{5TxqcFW~uD+J@}B*nc2%#E+pQVBzU_oc+h_@R;oE) ziE}sk@^CUj+hn_+qZzm)M}Q^DK#TxS#mN8~j{pm4oYwr3VZkp%flNjL1OXB34aRU= z$E})5~&06G~>5fDsGo3S0OS_TInYm8Ra=g?n*}n$4GP<3TC+w zl09u?5lRj?1YJ$L{m4rq7$q27(;{x^V8pEs91v}sF7EkG4&+Psxf`60Vt3Q&#p?)_ z9Hmljnbcx~*=tBxZ_;yWY~+sbT*jH zo>_DN9*4vMxZ~`i0|<1zw9GIe4v( z1jx1AiNa;6f))!xM;7!U$9c*v$GD}!7#!)rSTgZ(>7#TsGsS%crR)Pz*jDmvv7M6V zLyoiLad1Oe_!1~{!{Y}U8XDYOcl-3|(_Qq0c?h|7?J9N;hUlUqI9F$@H^u}U2Vs!& z3>Z?r5sfm?8it0fBGu8DFD_9r#gz7q1n(d?42>Q0N=!V2!C+^g<5ARJT+ZY;B;cqE z5N&N#!cYw)!ySM?+|I@P$!E7as(xt4eyDfVG{UjZNE0ps_j^t!kkqLYwD0W>M1VJ) z-mg1Z^*|edXN_R?Tqg^SSc1?-z4nP-DejUDu%5ki{hR*4MuLAj_-Ll{9cT38+eKLVNGHs`!YxiW+~*RK_LPWp)Bs6Ttdd0gk#)=} zj@Vr>HoAoS&?XqGS&lQy=~C!q^mV$}OLCnw$X@KET}%5+%$eb|qZP7H^n&bLJ$HaF zLyHu|J6@H2>_z2REx|$~!89E`Z+9u@yjb^3rxUMsBVzPpRS8N(1dS8SXFyrx-dQ!>-?Q$nFQKon4CWZgwve zLYH8yc5^eFjD>*E9nNU?`?Un!D^iF%H2efwJY4G_@ zbK!68oo=g~PV1d^L!3@?(6;4hevZ>_#01czKw~XTJCJ14r;9!Mp~>d!fNqc;YU9p# z*E?tB0 zze+~|<@mM`Lez+LoIBa0mq0Ij;Y*n0IN3~;c_PD}@eZmtopz&~E-$h@7!gQuvg?8A z0*^Qrfq5>1QMS`*gwuYM)2R%=D2YxSjxx`=SiO?qglX2H_;f_EY^UD{r_&&(Uw7y9 zTwrr0!gVadC5G;Q6Mm3c^ey~gIvlJWmWYS2HX15Ekb|z0HQ}M8K(*B^+PB(^D8aQU zCIh%O;*45_$UXuAENvS4bkO78>Xf3fs8gGZjfx)|0r!Rt+hLyrSl1yu%*s8$_)tjm z$QPy&MPM@N3h{7H*{>{iU*7(5qIxNaeX`&16xnerE5SONwQT*ps_`ArPpKxLb@3_D zZ-P=&iejQ`OZI&%n(KtQtPAI8Ve*F zu{i|`mkc)xfxojouZZI)WdnSm4MG@}$K8=XYI?%p8+~3vQ8l%vKoQ1r?k&u6$eJtLh0IGpj`Etj(YtO%K*mCtkzl&msp3{O z5&a?8>9Uq3uG!FliTDYTC@UhgiK}$Wj>0k|V6P1rN1R0FdREbj+&~*-R5+kf~NgV^vZCrQjyzU{EZh!s5e&5dR3H$=?%(r1%pjF zE!HLc0zC%XNOTC?Rhk#$G8KxKi{96wyd4X#KVY{jayo|3qCe(9)7G*)O&U*J+oyA? zp9=mThlQ)8_z_Hz}79#X@ji*0(V!`mT`g8;WYW40&J9EZLln#Kuy6+Rk7F_ z>7=8l+7<~tea{&|K+_fuL9l~kH zAqfa})RcJJ(e73k?+}I%h(WaA*@G7p(A$Yo;oHFGIwMPw zrUV)>sa}t(n~cvAG7H{`f3aP%m$Wu^(Bk0E}zQ;3b98k_~xES7P#<4kcs-_D(@8URnoYBL>P*qVz^ zbtcjQM+`yy)Bzz(GB)?A;M2pE!KU;C2g zckH%XXfRC0++O7#z~I41s>jBzlifxg7RsTWgtCM^O!}M9b_32SWRPPHm3ZsMPl>Kk zr$kP8UvOZg-Qc9l;baQV2_#-^m1Rm+uG6WGVd8YEdWmesv9d{VFOz7U?b=m1dq9J- z#a{mDQ3?)3DMupU1~0yT`Fk`9>kEm1wYi51583rahj1Q>7=DfP)U~P$`yifo4v$6m zw8Pwnm^cq>Uq3(u+-j>H%{{y-wr=nc|2)xKKyZxLD;XRJ{)%A^yrm;OLN6A$aKNEl z7g>Pem_<%w0^up4cG2m7HLwD8Cy?l6XvJd+oTB+oN_Rz9pN0(`T~zuSQBt>7Z&%UU zfK`+q9MYE1%)V*jt#96j{A)pGgRks;l+;{ z*xmw68r0tIj%bJWwC6N@sndQ64**|Lvks3WZctvEbhQ1{KJ3rcJ|6_V3J1^FP;i#= z;2uF3o@ybh8?W|)*MqY*eATr(lmkuWA7sJx@a%}CTy{|Z}xhubbQYmvfR$(SqG}i#&K_M03 zk+BS9vBp-tIbRCZh>VdCWMOTPCJg@WeaT4AUQjA!6_-h@K~0u=X`Y2MSFRvq(kut- zW$h&D+IW@Dz#*2~rf3j&8#GT2pmt8?aA5e2Vb_e+ihTO9K9J+?M5Q-NjFscfrwMJ2 zGxL-=zH8uO(p)85K=U3aiz)WCx^?2Xe-wFHxJ#h~V6g^+!=_j&Qs;C^-zSxEC9Dp+ z^yvmdBMmBcn(yTEYS$G>M6^%|12VM@zw{1=!F*XTx5vVjrwnU7$DHn*E#($rMC;wC zoykDTW@DD&J|QM6PANBYgDSAh=l+Ffz}r=2@DU6bo=C5!GtJ4xVS(wi#~D%`-phdI zhbPGaD`p?rSiG)MYzRg`k!mVWob0CM;Y-5P?bi+5C7S7ugfdvOm7 z2NOJ(UpT3-Us_&tCCJ`PFXop_<7i8F`)xzQXEqe<1jW9iL-RPJwUd5@cbw4+s>^Al zBd3w`WaFGpi(I~Wd&5j|Vyvgt>4{y(69Eg_i}7$|hAEQgGx|0}buI?>eAqG@qlm4_ zG3^xG!a)#CQA69m$>pta({Vq>+w^eywcJ~jY((6pBAADnG0eLiA*HLG!U%~r$cDTE zgDZHC4rlGHd8dbcIZvJR1w!Wrh{Ki=mDm{d_xR@)tk!lPlS$u(>&(PDzVlvawRw6t zn+p%=tZ;S%Z=$7e;S3w&_DT;Yht-Kmb70aoR|DWpuFKq)WlL~dwiAJ@els8w`=X_E z%ZY$+-Z8|9jCVQ^nCtMUr~f@pkC@YcS`h2^lG9_N({Er9>+lYXWPdAL(sW$ni=vFn z++TU8kvJyC4K^nwupWZ(xHC#|@Bg+z#=>dXv_W~?T>y-ZN|Rk1`x7I>gqH1`{utWs z$Ep!2L;n{onCSFR(3UOOkko?AOPwCW9mILIV*~2O+67yG$4-}XzEv1|aMSkmQ>?k_ zkyD9YOX}rR-OEFGlT&8yYm2gT&_Q#v=N^CyRwAs}?bIeG>uUB9nxEyQE`n#MFxk2u zWRY~PQ|GjYyNz@=G(Z|AQQqT)fc6KRo<~tuPNaI@<77&Z2TL}NoiU*M=$p~6WI#=9 z9fGgASY_F$xn-4QH5DaD7T1(SM^&7C?%9!n zbLW=Mi443POy!kT1NrtSyp~TTYU{vVhqrfC6xZ_oWWrIkumbPttbrW|R#(9^Wi^_) zxMco7yg#f?Uht>D>WVTD#kET+OQLuSa#gH$V61X+MP=#0y5c!}1N=a|>X7B|qO;nl zE{*qz>6hH&O_Z^P;y=Eb4E4fbd4Zakly9*$aZMs+zl zVG!P@R#7~tw)~pHCA9@LRdWaNg_gCo3o%581m0j-@_*orzxT4ls9RE9R+}3YNw^pn zjU9Vlq~DY|vC6ub*C_+@Vv@|ee#nsA!NdA{F#f?UpMk-jxpXq#b`v(cq=)c$ykSIu z;h%oUAAb(P7~MMDXpPBmtYxXMfoC+Hr-}f+5TAqie2-6@XM^yJ^LR>;br3TDmB90$ z@Lc5atRW8`$hjqfXO>@AKj2&N(Z5&X*EQw_y8%xYn5nx*?-{K$Bk#NT6yWJP{^m;( zZ`&Ym1lb|*MDSqIBcOfW(G9kB|7*L^RB2~F@aW&p@p+PLF$p~Srxkpj1%4BZGa;To z&7gnK$mf}GqkTiD!Lc?=BlddD5dPnQU;j>&&p%%A+nrTQbb$*Yn!gmGe~iKBAAN&8 zz9F>OH&K4tRG%K5KpV7O4*Eg=ELTv**oKhxoHjG~F2?6V@akVd^Le#?GZOVvm1=Dh zQ-dMvmyo4@2+x-_hHV|+;MnaGg@Kj!+{rTdHwSzg(JwRBvrp?_kqK#R+cEG(@UJiE z<37LgA&*=6P%mV6#j}a}2RVJ-aSgUT%S;u|z#yRBR-9|phvaf@dBp9lD%6Lo(V{Q8HyeSYeGLCDvg_Tck=`WMZ8 zKCy@OM8HQxhcm&ee?Z>n)qQtRfv6)*|Y zxn3SGOyfaXf1YN27b30yn7>~qaAi6lpM#LeIh*{Gan*m!*Z)qI7}K-xIf&TG`J4RZ zxavRVFTh97-ORrOmgdTwU=L8RI1v^(wnB(D08^*zf3{>1`+c#!-r=}cUi{~!41d71fplk(q0 zTF=AGe;a8%r!xIs692)Z^cP9#qe$y{mgQx=(YMSyh#3Rr1iYV zbT_2++{W}d*!z=OL|QKGQW!d$FDA#YpQI&h!eTb*yH(32FVu_S}rLj?2uyo8<_~x2n8@_|Nb^sR z_s_gE<6~QTW^jSe9dGVnL+>fn-c{bd?d=lra&&HaE9(619N*d`z||})t*SHh zjt#GgFOTn%xu=&JWOI*qR92KilmEA|Gmp2a?A!Q0B4Zq6&X8HoIU!SKA&2saQfA?p zavak+GGr_>p%9W;Wr{+EGL~7%kYuPQQpiwAROG#`wZFUfJkR^jyFZ`pyRYka-@kiU zYp=EUI=8+2y*%FW1jQ-*yj3Ii2q9brm6qs ztxpF*JiF*|7e|+|*0_D_as9g18n@3S&fCh=Z}D^_-p$mw6YZ=2FX4~EAB#W9RQ=b9 z&n7;P_+sMAiLW8Pp7>_sJ|?(ddx-lO;C2ra|B?6=;yzY8{s;cw)*5eCoku+ng+%8o zW}RQ3L#_2ur>d!O)wHkrkD2QKv!*^cv~yhbI$3Lel1$CZ0Q{Fs)gNhJ^{1JtKZ|(q z%W8@*Chni6b9^=N^`_#RiEksmoA^QEhlw92{v+`##D69J7rsy49%r;!Q2W2=aTLOj zMf=y2-F{X3>c78#xm;uXrufg8>USIB9f@}(-jnzs;=_r*LVPOz3~TjkCHezX?QgKJ z_IKkSwATMiI*Y!5)+L0Xf0<0x%O<*B9#i8iLcD~v+Np-FW2$@u`zqhux=2Vjmy&)^ z+tpgnWK-n^*;l!drt*%nujgcI?FVzwi%gY&$G*x3H_p?3wH<#K{(e*QchtV(Ulad^ z_&MU2?Cbfnsl5J$Kj;0^RDIWVJiV!S7SZwSrs8>t7b0GaxNjBg_`}325wAwPHt|-( zI}rExE$8oppJJ_fonfu{n-7=T*Y?_DYQDa(uYP`Mt@5|6RX$o@C(PWU=e>fd@{ihA z`C8VR-)89NOpUXxef6U^ehU6z{Nbj?H^#o&nnZjW@tMTu+gCeFi7zLaaex3L&;&+Ls(}~LC$|QPR*-Z66*1r1x2=S`KYgrf9bt2dT zc7ncfnCH2-srmHXd|cjl_AzI`x8Net^ZbFe+S_QVKU?gpKfWWc=jjaoS^SImSFLq? zy@O7pk6AvSqksCIl$6_+b& z>bz7&be?k7%2O8|k8WbB-ZS`Z@Sn%;hM$DrAAd0ZNc=JQbMP19zin!~AHfsmL)wqf zznJRpU!wbYkFK$JJo!!e{(()ihUj_nb#KqpbNKD;t6mptjW4*Lhc42jSc^m9E0mi^ zxv8e+X9k=D7mCjJuC?-gg!V0Jtq-A(qkVS}=gDqroP|Z#FKMmvHPH3YEzoVzJx$I3 z5d2a2W6g*4-O5znRc5(RXrEbL^M}5I{!Mhde_5+tf8cfAETa9K*76IOF*+|2Z%n)y z@s{Xz)_Q;TKqp!2crwmZe}WruJfh=+wYJx1E~n$hF>AH+qp5khVQTyR?YR2kUo>@| zSX0}vo2ht`=y-o?wL1+x%UbzXSS$Yr=w0Z8=+magd(OV{T*AMGf3Lp32lD{)Lf;9) zerfnHtSGwOI;Q&5z|^>XOAL>z4@`lB;j5;`w@mc@`o6Wsxf^}nTI0QIDsMI&E8Ko= z(d|8gu7<8{YFtfBx@Q>r4 z!as|D5&tTF7Uc})Q*{0Ursk)zsrjh`8^FeJf~j%5XKEfUo0^AoI(Il<7SZ`iS!;X8 zp&v0dt|6xCPc&73xvBaaMc3bEt@@vuDt{QBbX@uT1MiOifPdA#>fONq6W`}9`x!-- z&uS`P8T@kiHPCgf)vuQ5_SV`ST}}0~H-56U%8f_AYOVgijb1@~1KPi??L50oR5sc}Au|1^F}{0{hC@q6O; z!}rfnJMS?3(fE__r{T}SpO3!;ex%A)9&N4ppJ=W5UtlW#JNA`-C4Aq$@_&lnXRZ8S zpudDC?W^2H^i_BrKTYm%-i)H>H7~j_y11#bW$`QESHZ7kU;BLn{Kojr?5n>m@!R1i z;P=Guga0D_F#MPCC)ij1Y4|ho-?Fd#OYoQBufgAd|1tg{{NwnUbu97x7cw=!B~2Yy zYMGkHdZwOTO_dugy1kLsnx`?Q=4A%{9Ba+kF#Z_(sy`Y3HT-$_OYxWEuQk=L{lpIwKY>1Dt?{2VHNJf6yYm+k z?Kek1XRT)kQ~COv8v78@)bUN{Tg~HdO3OvdMElT^l5A5``udox^1m~X4eH?_b@O%85=-V(#bMNx^i|%JWYi+L>ba`}rbR%?I zbVqB=Z!&ridJ=k?wdQvTdKvm-^bTv)KZgDqeHr}=I<4l`{mUr2`~&C*(G}6vt+ih_ zMmIx0YwG>d4nG0E2Yw&?7x7=he;I!Q{uKO~_I12_3x5&*GW+W18vOP6AKO>?Pw@BR zAF{9V$MH|$pT)n3e--}*{%!my?Q0%a2GRMmS!?|F;}^g$ieCyp4!;t9HT=5v)t`9$ zCiu_bx50lNzZ-rMet-PI_#^Sh;7`V%jz1fJfqnJ=9sHH}YwfE)oAI~d@3yb2@__y%y;@?{|Ja3sz&1VkLdGg^G!Y^T8?Z)7j$FFK%^*jK$IYvmb<9%rrncQ$$f zda0@HvI>74{wDnW_=oXNpwCz<|3&mwYxOfn@o+!$i2mGF9Q}~B`rXJ>KbzZ68wx#V zt$HJ@HNMI49k|MI?MvHC)jMuKt$<7=xQ!oGGVEtJ<>wVW-h$RX?^vhP=OlC;;tj1eZ%?CJqdSBj-;I9&{|Nrq_}}24$G?pK z3;r$qyZC8Khx2=3rpKAXTK&j_UkJYh{zLfX@vGw3#BYh;0lz1@kG1x%S4{0k6Y-~7 zYu=Wkms_jcPV^r1N%XhY+D^ZsZ(3`+WGWNxe>Ql(=+8-|&@t93R~P-bwc2Teejc5O z?q{vz$|zI)9gjcNTJtj>{Wf}qsqORu{wDmb_`C2A;vdF8f&VT3_xL~A*ZbpF{G0fH z+t+qVr)%TxM*2S)~em+77$X2dp*kr%cW3PxwFMhsuWi%%b}pZLRHA99_m*?UqAVvDQ2^ME?u@ zw5fS%gWn0i8~$MYk@)jWeLsEQ%&YesJSe&!N3GS)8B=-B<6p-A1^*WQUHr7VhVJs2 zMQ@)R*2H7_3$-vbXju5w>n>-~7q)OX`s#M7%!ZYRI!az#w#D`8*xVol9|CF0eI*CF13 zcvIpnh_@!*$yEQlnaY#ocshN5GS$u?`)X$x@zKO55}!(Z2JyM})z3x5-yyz|_*(nQ zzlr!(;-3)TZ(sGlApRxslf=IxegXdq{;%*4;&)B;KW({i|9ww&k1twu`?<|%U9Y#V z@f9%@FJ)ixSTkDtt$oF-n2Oi3um06HqxHGWzT*Ef6(3?>@sVb<_6PflPcyY&Ei|=# zSHbnB=6|!P{b#4>`g^Ra>V1g*$&A+e2m8u**HnAy%ZJO~XDXgUbUcsg@z__sSX1!| z_Ooj}k9DI^=s8pIcBbN;M8|vMr{E99A8sn|8^q^Y>-e?M)cDq#8pjsmJFRs*JZ|cE zcn1Hhwd!5BzDL(pOwIef6~g_=VtPEL;sr$at0=mZseZ@U*E#YL^rNQg)v~Yhjq#gW zs~^vq>PK5s9 z>wTVVt^N*ujnze=KG(G|>G+TZLq)%sfa z@O|>t&kUh({VY(MAjo$=%mH$n&tKB?_!>N`PJQ}Y&VkBqDn zy-)8ym5<7*<0aHohN3cu|F1xlHk!9Xl*(y$4OkUwN&>AzOu!bfEgTFNnMJhD%~T$b z-|KSDpf8$gUl(L!lDrO0ce(Nq@hB!8$~h^S!=Z zzAfwmli-VR1RM`vgKxqma25OzZi9Q_VR#argO}kA_%}?SHr&5xm=6|(Wno2F6Fv@` zLa#^kI6J}@V1M`$91UNEZ@>j`8T7+wHKaZE_l&R>w^HWni#QP;uYM-F_oe z+ocI?j^7U55q358zUfVTJpN?(8va}8h45`t^){imz@4W0aS(bvq4hWLNBA@R6Q;jc z<<##yrpiAEAA0+ZhJOLa!^dKO25xYCqYB{?1fi&%+z=5BRsK`swu< z!;FUcU{P2WR)jU-RAKb!c>1-!S?vwU>`ULj)D{6bodtZ9lzX<)o>%+ z0r$hB@H9LRufm%!q|c1bml5WG1z>UL^^Y!B8PA}Z)P3dyT>ut`v9L0%4dY=m*cx_*iO}mR-Hz|` zXO1&HKJ+`L_Jb904gMy$6CQxa;2HP>yasPUf5vuunP5)%04xFHU=>&gHiFGz8<+rl z!52-9XDE86sqxH#@4}VveN*Lw^_wcU9Y0vNDSZ@u!c_migO}iScpK{XnS*j!q3KxHGvGY<4qO8_n;P$S^w*}wc?NpjsP)hAhN)v` zdVO)TpBYA*@{6H^b)|~OSZlnMU@h1XHiNBUXP5|6;BYt&PJ?fn>if8Mg`YvM zPqlyCRDZsO7vL|@>rx%RCuf*hU@lk)mV#cN>hh1m$KVt28Q2bbovOr};o=#g*& zd>zh(OW}JkShuSB+tK@Aux?fUDfIX73j7`3g&A}q#Qn(*y?)iY7>t3HU@h1XJ_TFB zPSERBohKO%g=63p7_3iKxrONEa4q~8?t-5~uS<3Qf5VILSNIo9t7{G}cOT3R3&YZ| zJgf%2PSy2-b*f?ubbHth_JM=oDCl*ou0I{V1>c6N;YPRv?uSR=X?Pw6>sFQbCfXNH z+>Y0+nmJ$r=yj|1V_{`j8^*(6ovO;UMt6pZFa>&Ds`HJ7Q{im52(EzZ;1;+W2J29j z=LGsY_>-ykv)84XrD2?@^6{qL$4|o6usuwKePD{Idc)vYI2F!@i{J{l4tm|H>+gn# z;0buvR6j4EZ=$1h?a}?b9~OtDVP#kiHiAuHPg8jZ!WpLeF%P~2*T7A1Cp-X;!87m& zcn#iyQMzX6{Fz`*_y8;c<6sq72R4GuVX$si`4Z5*-~c!rj)T+S9Jm;+gzMo}xCed# zzlL5X>v8-9e}i{m9$jGcycRT7uCl4^R1Ma~kB7}*YuFhk!W1|Rj)hZUu+CQPEJCk< zUT5p}x4_--5Ih0B-qz(V!Rzog)NKHQcvk3jw=Q1%m^`SQbJFa}nFwO~W| z6l?`M!JaS~4uxaj6gUemGBy5p(Z@}V|0KKsFT=m!U6@sW8*up?FpsHx!Fpbe>tSoL zDy$0|!>3_e*aarR7vTsv9(sMR^S%j}z*X==xDD=whv7+h4qk>gU^cI-)i`pQYA4Rr zI4i)%;Nvh@|EqXQbXWKS90*^6BTeO>g!Z~%=bsN3!*@-U+W>?0!78_#_yJS>I|k3d zAK*233woWf%V&Z)q3_vgzXXhfRbUxf-{4qOaZ!ri9E zdk}rz)Oat#Kj0mhxkxyk4HkqC!g8=8tOpyyHm3TM0DHj!a5x+Xr@=XJFw=+ z`~rRr&%&SJZ}1NE`d{~}w5jpO!0NCzYzm)-Eltf|XLPWxSM?LEl`jPjgJa=T=ykj< zw+OC)>);j`tlL$&L+BImtf}_X77a6#sd8R_YrnXu{*;EX_`$kc`8DwC;y;Og3bw#c zFw8cP1A}$6X|%oseHQ)%e}i}6y~V?ltxb)$J@oon>wa(qd-xdETd@r~0VbL1??5;VKUj~e@-xx%;k)pCxEX!| z55h0uH}FUJGyDUlDG}~p7E}GmjxKF#{$gM?SPRxO)xRfU3mB}&mER2=tix5_0qDu5 z@=k;E;bOQ3u7jIQ<@0)6^8h>s&%htxHFyg~l?>O*1ara%Unf;1sB2Zh+a4uW}_ri1VH<&9b zoaZqZ{QjHreueI+*KQ|RHzek|C#?OuV)n>0v-LwF44%NX{X!&l)+SV-H@^!!&&2g(`1{g4cns$7-)9tW2><)}7@P5(s23lWd1M099unuenpNGBS z5ID-zzEsrIwuph{Veo#GUme}R)I5%6|4YmMcEr~QARH1zNHS(k&)!&l(D@C$eg z7Sa3H^`3#<;dHnWo`zYp0fTm6OPFYC-a>Kx2ldijEX3q~VRnza>enSPF1gFV9{ZYT%&wk`Tvv^!-ZW<@s9nHQ~FT7OQ)1>9eN~n?H!6s2wr#W)Tv*W z0jZ<9>q}yf{>g5^4TekUw@tfs`46jKQn&w8OuydRC6ZYEioCSlA<&(B_wv0lLUBpD zwMU$8FA^KvvLoD7m+l>cdx2;^{-2LvzgJmJWALb>e_K=vzxKa=zxbicrvAz2P#rz} zxPOm+6SH*K*RB=PW)0ThmJzMBdjyYJ%Jl%R4VUwygr2GMt-KcA_uY=`M)EzZ*LsWm zlW)87Eodl%M-f<2bh{PMF1I?;d18*&<8`E5pU3r`-}?^_x9f7x!pOY*+(g${9pDj3 z-CR2LI1XwYeN@ilaK9tt@cTGb^-!9oTFVwIlSd?$Ae}m2jbCJFvYbz+lz;Li>vg1# zUWTr{q~FSjOnR!=m{hM_?!pMoi;jtrM!s`E;uJ zC*Kaej?~f1P`o-)#5*~UNNkIA>UYu72Kryt$d>zeU@&9mbt^h{mu zw~hK+yesf<%+CujlCSfo@HvBGK^d3xW;Y{`DJqxx5s9VK3%}N(GInWqe4~XdH(b#tbfLvI+yF^-L7MRj=_EpN4A^yedkIw4WZJzbdA`Rc|=}% T+oUd6qd-(BTO_Dh_nd0N-`B%GQIR+vks(&w4)nkWwE?aIrg zHTyX2HRnTXjkR5qWLM5&7OO-3ttJk%}U*XSga~;^Uk(Go^8(B%%0gr&(GMqp61?t?CBfe z&pcfNU-tAOc+1ld!26zl0zULKYpr|w1^7EpFN1&Zv;qI*={ERhPrm~H;^|fJ4NtFw zZ+iMY_*YN!UR$1)m0sEwGmJA?4RPtmeIuy}BWcH-4jiT-D>e%=X|$p^m1xkHrpfwo zB({!B+cBmugMJowjr95^k<~QLjC9*cFOoshiIX-2QyZP0HB4@_q?sC%#Yt0aYmh~~ z)kJIqQwf4>-ZP#u?v()F4<7vhTWf-dc^+lr3=wC8=Ym*K%=2(iT)b56S~m;pz$`7W z7$*&Am=BQHu{7V+QnUf9K-lm+yY`;4lA(UBN8>|y9CY8a!u!l z=mqPuFQECLu3@+wP+5XFPon00H=+G{>nL&^bF9bSu_o)?$8b5IvIfE4J99psDaYyi z08t@PV=dZq4FA5HxDodV@5_02-!3@oaeZhT5SI&@U+HrL+icr@auO5#MY;E2eb#op b0F|E*A4$}hM&qx`kK4in4RcR%adE!^R1D~G literal 0 HcmV?d00001 diff --git a/vectors.S b/vectors.S new file mode 100644 index 0000000..9e4041a --- /dev/null +++ b/vectors.S @@ -0,0 +1,1537 @@ +# generated by vectors.pl - do not edit +# handlers +.globl alltraps +.globl vector0 +vector0: + pushl $0 + pushl $0 + jmp alltraps +.globl vector1 +vector1: + pushl $0 + pushl $1 + jmp alltraps +.globl vector2 +vector2: + pushl $0 + pushl $2 + jmp alltraps +.globl vector3 +vector3: + pushl $0 + pushl $3 + jmp alltraps +.globl vector4 +vector4: + pushl $0 + pushl $4 + jmp alltraps +.globl vector5 +vector5: + pushl $0 + pushl $5 + jmp alltraps +.globl vector6 +vector6: + pushl $0 + pushl $6 + jmp alltraps +.globl vector7 +vector7: + pushl $0 + pushl $7 + jmp alltraps +.globl vector8 +vector8: + pushl $8 + jmp alltraps +.globl vector9 +vector9: + pushl $0 + pushl $9 + jmp alltraps +.globl vector10 +vector10: + pushl $10 + jmp alltraps +.globl vector11 +vector11: + pushl $11 + jmp alltraps +.globl vector12 +vector12: + pushl $12 + jmp alltraps +.globl vector13 +vector13: + pushl $13 + jmp alltraps +.globl vector14 +vector14: + pushl $14 + jmp alltraps +.globl vector15 +vector15: + pushl $0 + pushl $15 + jmp alltraps +.globl vector16 +vector16: + pushl $0 + pushl $16 + jmp alltraps +.globl vector17 +vector17: + pushl $17 + jmp alltraps +.globl vector18 +vector18: + pushl $0 + pushl $18 + jmp alltraps +.globl vector19 +vector19: + pushl $0 + pushl $19 + jmp alltraps +.globl vector20 +vector20: + pushl $0 + pushl $20 + jmp alltraps +.globl vector21 +vector21: + pushl $0 + pushl $21 + jmp alltraps +.globl vector22 +vector22: + pushl $0 + pushl $22 + jmp alltraps +.globl vector23 +vector23: + pushl $0 + pushl $23 + jmp alltraps +.globl vector24 +vector24: + pushl $0 + pushl $24 + jmp alltraps +.globl vector25 +vector25: + pushl $0 + pushl $25 + jmp alltraps +.globl vector26 +vector26: + pushl $0 + pushl $26 + jmp alltraps +.globl vector27 +vector27: + pushl $0 + pushl $27 + jmp alltraps +.globl vector28 +vector28: + pushl $0 + pushl $28 + jmp alltraps +.globl vector29 +vector29: + pushl $0 + pushl $29 + jmp alltraps +.globl vector30 +vector30: + pushl $0 + pushl $30 + jmp alltraps +.globl vector31 +vector31: + pushl $0 + pushl $31 + jmp alltraps +.globl vector32 +vector32: + pushl $0 + pushl $32 + jmp alltraps +.globl vector33 +vector33: + pushl $0 + pushl $33 + jmp alltraps +.globl vector34 +vector34: + pushl $0 + pushl $34 + jmp alltraps +.globl vector35 +vector35: + pushl $0 + pushl $35 + jmp alltraps +.globl vector36 +vector36: + pushl $0 + pushl $36 + jmp alltraps +.globl vector37 +vector37: + pushl $0 + pushl $37 + jmp alltraps +.globl vector38 +vector38: + pushl $0 + pushl $38 + jmp alltraps +.globl vector39 +vector39: + pushl $0 + pushl $39 + jmp alltraps +.globl vector40 +vector40: + pushl $0 + pushl $40 + jmp alltraps +.globl vector41 +vector41: + pushl $0 + pushl $41 + jmp alltraps +.globl vector42 +vector42: + pushl $0 + pushl $42 + jmp alltraps +.globl vector43 +vector43: + pushl $0 + pushl $43 + jmp alltraps +.globl vector44 +vector44: + pushl $0 + pushl $44 + jmp alltraps +.globl vector45 +vector45: + pushl $0 + pushl $45 + jmp alltraps +.globl vector46 +vector46: + pushl $0 + pushl $46 + jmp alltraps +.globl vector47 +vector47: + pushl $0 + pushl $47 + jmp alltraps +.globl vector48 +vector48: + pushl $0 + pushl $48 + jmp alltraps +.globl vector49 +vector49: + pushl $0 + pushl $49 + jmp alltraps +.globl vector50 +vector50: + pushl $0 + pushl $50 + jmp alltraps +.globl vector51 +vector51: + pushl $0 + pushl $51 + jmp alltraps +.globl vector52 +vector52: + pushl $0 + pushl $52 + jmp alltraps +.globl vector53 +vector53: + pushl $0 + pushl $53 + jmp alltraps +.globl vector54 +vector54: + pushl $0 + pushl $54 + jmp alltraps +.globl vector55 +vector55: + pushl $0 + pushl $55 + jmp alltraps +.globl vector56 +vector56: + pushl $0 + pushl $56 + jmp alltraps +.globl vector57 +vector57: + pushl $0 + pushl $57 + jmp alltraps +.globl vector58 +vector58: + pushl $0 + pushl $58 + jmp alltraps +.globl vector59 +vector59: + pushl $0 + pushl $59 + jmp alltraps +.globl vector60 +vector60: + pushl $0 + pushl $60 + jmp alltraps +.globl vector61 +vector61: + pushl $0 + pushl $61 + jmp alltraps +.globl vector62 +vector62: + pushl $0 + pushl $62 + jmp alltraps +.globl vector63 +vector63: + pushl $0 + pushl $63 + jmp alltraps +.globl vector64 +vector64: + pushl $0 + pushl $64 + jmp alltraps +.globl vector65 +vector65: + pushl $0 + pushl $65 + jmp alltraps +.globl vector66 +vector66: + pushl $0 + pushl $66 + jmp alltraps +.globl vector67 +vector67: + pushl $0 + pushl $67 + jmp alltraps +.globl vector68 +vector68: + pushl $0 + pushl $68 + jmp alltraps +.globl vector69 +vector69: + pushl $0 + pushl $69 + jmp alltraps +.globl vector70 +vector70: + pushl $0 + pushl $70 + jmp alltraps +.globl vector71 +vector71: + pushl $0 + pushl $71 + jmp alltraps +.globl vector72 +vector72: + pushl $0 + pushl $72 + jmp alltraps +.globl vector73 +vector73: + pushl $0 + pushl $73 + jmp alltraps +.globl vector74 +vector74: + pushl $0 + pushl $74 + jmp alltraps +.globl vector75 +vector75: + pushl $0 + pushl $75 + jmp alltraps +.globl vector76 +vector76: + pushl $0 + pushl $76 + jmp alltraps +.globl vector77 +vector77: + pushl $0 + pushl $77 + jmp alltraps +.globl vector78 +vector78: + pushl $0 + pushl $78 + jmp alltraps +.globl vector79 +vector79: + pushl $0 + pushl $79 + jmp alltraps +.globl vector80 +vector80: + pushl $0 + pushl $80 + jmp alltraps +.globl vector81 +vector81: + pushl $0 + pushl $81 + jmp alltraps +.globl vector82 +vector82: + pushl $0 + pushl $82 + jmp alltraps +.globl vector83 +vector83: + pushl $0 + pushl $83 + jmp alltraps +.globl vector84 +vector84: + pushl $0 + pushl $84 + jmp alltraps +.globl vector85 +vector85: + pushl $0 + pushl $85 + jmp alltraps +.globl vector86 +vector86: + pushl $0 + pushl $86 + jmp alltraps +.globl vector87 +vector87: + pushl $0 + pushl $87 + jmp alltraps +.globl vector88 +vector88: + pushl $0 + pushl $88 + jmp alltraps +.globl vector89 +vector89: + pushl $0 + pushl $89 + jmp alltraps +.globl vector90 +vector90: + pushl $0 + pushl $90 + jmp alltraps +.globl vector91 +vector91: + pushl $0 + pushl $91 + jmp alltraps +.globl vector92 +vector92: + pushl $0 + pushl $92 + jmp alltraps +.globl vector93 +vector93: + pushl $0 + pushl $93 + jmp alltraps +.globl vector94 +vector94: + pushl $0 + pushl $94 + jmp alltraps +.globl vector95 +vector95: + pushl $0 + pushl $95 + jmp alltraps +.globl vector96 +vector96: + pushl $0 + pushl $96 + jmp alltraps +.globl vector97 +vector97: + pushl $0 + pushl $97 + jmp alltraps +.globl vector98 +vector98: + pushl $0 + pushl $98 + jmp alltraps +.globl vector99 +vector99: + pushl $0 + pushl $99 + jmp alltraps +.globl vector100 +vector100: + pushl $0 + pushl $100 + jmp alltraps +.globl vector101 +vector101: + pushl $0 + pushl $101 + jmp alltraps +.globl vector102 +vector102: + pushl $0 + pushl $102 + jmp alltraps +.globl vector103 +vector103: + pushl $0 + pushl $103 + jmp alltraps +.globl vector104 +vector104: + pushl $0 + pushl $104 + jmp alltraps +.globl vector105 +vector105: + pushl $0 + pushl $105 + jmp alltraps +.globl vector106 +vector106: + pushl $0 + pushl $106 + jmp alltraps +.globl vector107 +vector107: + pushl $0 + pushl $107 + jmp alltraps +.globl vector108 +vector108: + pushl $0 + pushl $108 + jmp alltraps +.globl vector109 +vector109: + pushl $0 + pushl $109 + jmp alltraps +.globl vector110 +vector110: + pushl $0 + pushl $110 + jmp alltraps +.globl vector111 +vector111: + pushl $0 + pushl $111 + jmp alltraps +.globl vector112 +vector112: + pushl $0 + pushl $112 + jmp alltraps +.globl vector113 +vector113: + pushl $0 + pushl $113 + jmp alltraps +.globl vector114 +vector114: + pushl $0 + pushl $114 + jmp alltraps +.globl vector115 +vector115: + pushl $0 + pushl $115 + jmp alltraps +.globl vector116 +vector116: + pushl $0 + pushl $116 + jmp alltraps +.globl vector117 +vector117: + pushl $0 + pushl $117 + jmp alltraps +.globl vector118 +vector118: + pushl $0 + pushl $118 + jmp alltraps +.globl vector119 +vector119: + pushl $0 + pushl $119 + jmp alltraps +.globl vector120 +vector120: + pushl $0 + pushl $120 + jmp alltraps +.globl vector121 +vector121: + pushl $0 + pushl $121 + jmp alltraps +.globl vector122 +vector122: + pushl $0 + pushl $122 + jmp alltraps +.globl vector123 +vector123: + pushl $0 + pushl $123 + jmp alltraps +.globl vector124 +vector124: + pushl $0 + pushl $124 + jmp alltraps +.globl vector125 +vector125: + pushl $0 + pushl $125 + jmp alltraps +.globl vector126 +vector126: + pushl $0 + pushl $126 + jmp alltraps +.globl vector127 +vector127: + pushl $0 + pushl $127 + jmp alltraps +.globl vector128 +vector128: + pushl $0 + pushl $128 + jmp alltraps +.globl vector129 +vector129: + pushl $0 + pushl $129 + jmp alltraps +.globl vector130 +vector130: + pushl $0 + pushl $130 + jmp alltraps +.globl vector131 +vector131: + pushl $0 + pushl $131 + jmp alltraps +.globl vector132 +vector132: + pushl $0 + pushl $132 + jmp alltraps +.globl vector133 +vector133: + pushl $0 + pushl $133 + jmp alltraps +.globl vector134 +vector134: + pushl $0 + pushl $134 + jmp alltraps +.globl vector135 +vector135: + pushl $0 + pushl $135 + jmp alltraps +.globl vector136 +vector136: + pushl $0 + pushl $136 + jmp alltraps +.globl vector137 +vector137: + pushl $0 + pushl $137 + jmp alltraps +.globl vector138 +vector138: + pushl $0 + pushl $138 + jmp alltraps +.globl vector139 +vector139: + pushl $0 + pushl $139 + jmp alltraps +.globl vector140 +vector140: + pushl $0 + pushl $140 + jmp alltraps +.globl vector141 +vector141: + pushl $0 + pushl $141 + jmp alltraps +.globl vector142 +vector142: + pushl $0 + pushl $142 + jmp alltraps +.globl vector143 +vector143: + pushl $0 + pushl $143 + jmp alltraps +.globl vector144 +vector144: + pushl $0 + pushl $144 + jmp alltraps +.globl vector145 +vector145: + pushl $0 + pushl $145 + jmp alltraps +.globl vector146 +vector146: + pushl $0 + pushl $146 + jmp alltraps +.globl vector147 +vector147: + pushl $0 + pushl $147 + jmp alltraps +.globl vector148 +vector148: + pushl $0 + pushl $148 + jmp alltraps +.globl vector149 +vector149: + pushl $0 + pushl $149 + jmp alltraps +.globl vector150 +vector150: + pushl $0 + pushl $150 + jmp alltraps +.globl vector151 +vector151: + pushl $0 + pushl $151 + jmp alltraps +.globl vector152 +vector152: + pushl $0 + pushl $152 + jmp alltraps +.globl vector153 +vector153: + pushl $0 + pushl $153 + jmp alltraps +.globl vector154 +vector154: + pushl $0 + pushl $154 + jmp alltraps +.globl vector155 +vector155: + pushl $0 + pushl $155 + jmp alltraps +.globl vector156 +vector156: + pushl $0 + pushl $156 + jmp alltraps +.globl vector157 +vector157: + pushl $0 + pushl $157 + jmp alltraps +.globl vector158 +vector158: + pushl $0 + pushl $158 + jmp alltraps +.globl vector159 +vector159: + pushl $0 + pushl $159 + jmp alltraps +.globl vector160 +vector160: + pushl $0 + pushl $160 + jmp alltraps +.globl vector161 +vector161: + pushl $0 + pushl $161 + jmp alltraps +.globl vector162 +vector162: + pushl $0 + pushl $162 + jmp alltraps +.globl vector163 +vector163: + pushl $0 + pushl $163 + jmp alltraps +.globl vector164 +vector164: + pushl $0 + pushl $164 + jmp alltraps +.globl vector165 +vector165: + pushl $0 + pushl $165 + jmp alltraps +.globl vector166 +vector166: + pushl $0 + pushl $166 + jmp alltraps +.globl vector167 +vector167: + pushl $0 + pushl $167 + jmp alltraps +.globl vector168 +vector168: + pushl $0 + pushl $168 + jmp alltraps +.globl vector169 +vector169: + pushl $0 + pushl $169 + jmp alltraps +.globl vector170 +vector170: + pushl $0 + pushl $170 + jmp alltraps +.globl vector171 +vector171: + pushl $0 + pushl $171 + jmp alltraps +.globl vector172 +vector172: + pushl $0 + pushl $172 + jmp alltraps +.globl vector173 +vector173: + pushl $0 + pushl $173 + jmp alltraps +.globl vector174 +vector174: + pushl $0 + pushl $174 + jmp alltraps +.globl vector175 +vector175: + pushl $0 + pushl $175 + jmp alltraps +.globl vector176 +vector176: + pushl $0 + pushl $176 + jmp alltraps +.globl vector177 +vector177: + pushl $0 + pushl $177 + jmp alltraps +.globl vector178 +vector178: + pushl $0 + pushl $178 + jmp alltraps +.globl vector179 +vector179: + pushl $0 + pushl $179 + jmp alltraps +.globl vector180 +vector180: + pushl $0 + pushl $180 + jmp alltraps +.globl vector181 +vector181: + pushl $0 + pushl $181 + jmp alltraps +.globl vector182 +vector182: + pushl $0 + pushl $182 + jmp alltraps +.globl vector183 +vector183: + pushl $0 + pushl $183 + jmp alltraps +.globl vector184 +vector184: + pushl $0 + pushl $184 + jmp alltraps +.globl vector185 +vector185: + pushl $0 + pushl $185 + jmp alltraps +.globl vector186 +vector186: + pushl $0 + pushl $186 + jmp alltraps +.globl vector187 +vector187: + pushl $0 + pushl $187 + jmp alltraps +.globl vector188 +vector188: + pushl $0 + pushl $188 + jmp alltraps +.globl vector189 +vector189: + pushl $0 + pushl $189 + jmp alltraps +.globl vector190 +vector190: + pushl $0 + pushl $190 + jmp alltraps +.globl vector191 +vector191: + pushl $0 + pushl $191 + jmp alltraps +.globl vector192 +vector192: + pushl $0 + pushl $192 + jmp alltraps +.globl vector193 +vector193: + pushl $0 + pushl $193 + jmp alltraps +.globl vector194 +vector194: + pushl $0 + pushl $194 + jmp alltraps +.globl vector195 +vector195: + pushl $0 + pushl $195 + jmp alltraps +.globl vector196 +vector196: + pushl $0 + pushl $196 + jmp alltraps +.globl vector197 +vector197: + pushl $0 + pushl $197 + jmp alltraps +.globl vector198 +vector198: + pushl $0 + pushl $198 + jmp alltraps +.globl vector199 +vector199: + pushl $0 + pushl $199 + jmp alltraps +.globl vector200 +vector200: + pushl $0 + pushl $200 + jmp alltraps +.globl vector201 +vector201: + pushl $0 + pushl $201 + jmp alltraps +.globl vector202 +vector202: + pushl $0 + pushl $202 + jmp alltraps +.globl vector203 +vector203: + pushl $0 + pushl $203 + jmp alltraps +.globl vector204 +vector204: + pushl $0 + pushl $204 + jmp alltraps +.globl vector205 +vector205: + pushl $0 + pushl $205 + jmp alltraps +.globl vector206 +vector206: + pushl $0 + pushl $206 + jmp alltraps +.globl vector207 +vector207: + pushl $0 + pushl $207 + jmp alltraps +.globl vector208 +vector208: + pushl $0 + pushl $208 + jmp alltraps +.globl vector209 +vector209: + pushl $0 + pushl $209 + jmp alltraps +.globl vector210 +vector210: + pushl $0 + pushl $210 + jmp alltraps +.globl vector211 +vector211: + pushl $0 + pushl $211 + jmp alltraps +.globl vector212 +vector212: + pushl $0 + pushl $212 + jmp alltraps +.globl vector213 +vector213: + pushl $0 + pushl $213 + jmp alltraps +.globl vector214 +vector214: + pushl $0 + pushl $214 + jmp alltraps +.globl vector215 +vector215: + pushl $0 + pushl $215 + jmp alltraps +.globl vector216 +vector216: + pushl $0 + pushl $216 + jmp alltraps +.globl vector217 +vector217: + pushl $0 + pushl $217 + jmp alltraps +.globl vector218 +vector218: + pushl $0 + pushl $218 + jmp alltraps +.globl vector219 +vector219: + pushl $0 + pushl $219 + jmp alltraps +.globl vector220 +vector220: + pushl $0 + pushl $220 + jmp alltraps +.globl vector221 +vector221: + pushl $0 + pushl $221 + jmp alltraps +.globl vector222 +vector222: + pushl $0 + pushl $222 + jmp alltraps +.globl vector223 +vector223: + pushl $0 + pushl $223 + jmp alltraps +.globl vector224 +vector224: + pushl $0 + pushl $224 + jmp alltraps +.globl vector225 +vector225: + pushl $0 + pushl $225 + jmp alltraps +.globl vector226 +vector226: + pushl $0 + pushl $226 + jmp alltraps +.globl vector227 +vector227: + pushl $0 + pushl $227 + jmp alltraps +.globl vector228 +vector228: + pushl $0 + pushl $228 + jmp alltraps +.globl vector229 +vector229: + pushl $0 + pushl $229 + jmp alltraps +.globl vector230 +vector230: + pushl $0 + pushl $230 + jmp alltraps +.globl vector231 +vector231: + pushl $0 + pushl $231 + jmp alltraps +.globl vector232 +vector232: + pushl $0 + pushl $232 + jmp alltraps +.globl vector233 +vector233: + pushl $0 + pushl $233 + jmp alltraps +.globl vector234 +vector234: + pushl $0 + pushl $234 + jmp alltraps +.globl vector235 +vector235: + pushl $0 + pushl $235 + jmp alltraps +.globl vector236 +vector236: + pushl $0 + pushl $236 + jmp alltraps +.globl vector237 +vector237: + pushl $0 + pushl $237 + jmp alltraps +.globl vector238 +vector238: + pushl $0 + pushl $238 + jmp alltraps +.globl vector239 +vector239: + pushl $0 + pushl $239 + jmp alltraps +.globl vector240 +vector240: + pushl $0 + pushl $240 + jmp alltraps +.globl vector241 +vector241: + pushl $0 + pushl $241 + jmp alltraps +.globl vector242 +vector242: + pushl $0 + pushl $242 + jmp alltraps +.globl vector243 +vector243: + pushl $0 + pushl $243 + jmp alltraps +.globl vector244 +vector244: + pushl $0 + pushl $244 + jmp alltraps +.globl vector245 +vector245: + pushl $0 + pushl $245 + jmp alltraps +.globl vector246 +vector246: + pushl $0 + pushl $246 + jmp alltraps +.globl vector247 +vector247: + pushl $0 + pushl $247 + jmp alltraps +.globl vector248 +vector248: + pushl $0 + pushl $248 + jmp alltraps +.globl vector249 +vector249: + pushl $0 + pushl $249 + jmp alltraps +.globl vector250 +vector250: + pushl $0 + pushl $250 + jmp alltraps +.globl vector251 +vector251: + pushl $0 + pushl $251 + jmp alltraps +.globl vector252 +vector252: + pushl $0 + pushl $252 + jmp alltraps +.globl vector253 +vector253: + pushl $0 + pushl $253 + jmp alltraps +.globl vector254 +vector254: + pushl $0 + pushl $254 + jmp alltraps +.globl vector255 +vector255: + pushl $0 + pushl $255 + jmp alltraps + +# vector table +.data +.globl vectors +vectors: + .long vector0 + .long vector1 + .long vector2 + .long vector3 + .long vector4 + .long vector5 + .long vector6 + .long vector7 + .long vector8 + .long vector9 + .long vector10 + .long vector11 + .long vector12 + .long vector13 + .long vector14 + .long vector15 + .long vector16 + .long vector17 + .long vector18 + .long vector19 + .long vector20 + .long vector21 + .long vector22 + .long vector23 + .long vector24 + .long vector25 + .long vector26 + .long vector27 + .long vector28 + .long vector29 + .long vector30 + .long vector31 + .long vector32 + .long vector33 + .long vector34 + .long vector35 + .long vector36 + .long vector37 + .long vector38 + .long vector39 + .long vector40 + .long vector41 + .long vector42 + .long vector43 + .long vector44 + .long vector45 + .long vector46 + .long vector47 + .long vector48 + .long vector49 + .long vector50 + .long vector51 + .long vector52 + .long vector53 + .long vector54 + .long vector55 + .long vector56 + .long vector57 + .long vector58 + .long vector59 + .long vector60 + .long vector61 + .long vector62 + .long vector63 + .long vector64 + .long vector65 + .long vector66 + .long vector67 + .long vector68 + .long vector69 + .long vector70 + .long vector71 + .long vector72 + .long vector73 + .long vector74 + .long vector75 + .long vector76 + .long vector77 + .long vector78 + .long vector79 + .long vector80 + .long vector81 + .long vector82 + .long vector83 + .long vector84 + .long vector85 + .long vector86 + .long vector87 + .long vector88 + .long vector89 + .long vector90 + .long vector91 + .long vector92 + .long vector93 + .long vector94 + .long vector95 + .long vector96 + .long vector97 + .long vector98 + .long vector99 + .long vector100 + .long vector101 + .long vector102 + .long vector103 + .long vector104 + .long vector105 + .long vector106 + .long vector107 + .long vector108 + .long vector109 + .long vector110 + .long vector111 + .long vector112 + .long vector113 + .long vector114 + .long vector115 + .long vector116 + .long vector117 + .long vector118 + .long vector119 + .long vector120 + .long vector121 + .long vector122 + .long vector123 + .long vector124 + .long vector125 + .long vector126 + .long vector127 + .long vector128 + .long vector129 + .long vector130 + .long vector131 + .long vector132 + .long vector133 + .long vector134 + .long vector135 + .long vector136 + .long vector137 + .long vector138 + .long vector139 + .long vector140 + .long vector141 + .long vector142 + .long vector143 + .long vector144 + .long vector145 + .long vector146 + .long vector147 + .long vector148 + .long vector149 + .long vector150 + .long vector151 + .long vector152 + .long vector153 + .long vector154 + .long vector155 + .long vector156 + .long vector157 + .long vector158 + .long vector159 + .long vector160 + .long vector161 + .long vector162 + .long vector163 + .long vector164 + .long vector165 + .long vector166 + .long vector167 + .long vector168 + .long vector169 + .long vector170 + .long vector171 + .long vector172 + .long vector173 + .long vector174 + .long vector175 + .long vector176 + .long vector177 + .long vector178 + .long vector179 + .long vector180 + .long vector181 + .long vector182 + .long vector183 + .long vector184 + .long vector185 + .long vector186 + .long vector187 + .long vector188 + .long vector189 + .long vector190 + .long vector191 + .long vector192 + .long vector193 + .long vector194 + .long vector195 + .long vector196 + .long vector197 + .long vector198 + .long vector199 + .long vector200 + .long vector201 + .long vector202 + .long vector203 + .long vector204 + .long vector205 + .long vector206 + .long vector207 + .long vector208 + .long vector209 + .long vector210 + .long vector211 + .long vector212 + .long vector213 + .long vector214 + .long vector215 + .long vector216 + .long vector217 + .long vector218 + .long vector219 + .long vector220 + .long vector221 + .long vector222 + .long vector223 + .long vector224 + .long vector225 + .long vector226 + .long vector227 + .long vector228 + .long vector229 + .long vector230 + .long vector231 + .long vector232 + .long vector233 + .long vector234 + .long vector235 + .long vector236 + .long vector237 + .long vector238 + .long vector239 + .long vector240 + .long vector241 + .long vector242 + .long vector243 + .long vector244 + .long vector245 + .long vector246 + .long vector247 + .long vector248 + .long vector249 + .long vector250 + .long vector251 + .long vector252 + .long vector253 + .long vector254 + .long vector255 diff --git a/vectors.o b/vectors.o new file mode 100644 index 0000000000000000000000000000000000000000..6e18ee30c99fa49953445011fcfbf4505e60f47e GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/wc.asm b/wc.asm new file mode 100644 index 0000000..3053056 --- /dev/null +++ b/wc.asm @@ -0,0 +1,1319 @@ + +_wc: file format elf32-i386 + + +Disassembly of section .text: + +00000000
    : + exit(); + } + printf(1, "%d %d %d %s\n", l, w, c, name); +} + +int main(int argc, char *argv[]) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 57 push %edi + e: 56 push %esi + f: be 01 00 00 00 mov $0x1,%esi + 14: 53 push %ebx + 15: 51 push %ecx + 16: 83 ec 18 sub $0x18,%esp + 19: 8b 01 mov (%ecx),%eax + 1b: 8b 59 04 mov 0x4(%ecx),%ebx + 1e: 89 45 e4 mov %eax,-0x1c(%ebp) + 21: 83 c3 04 add $0x4,%ebx + int fd, i; + + if (argc <= 1) { + 24: 83 f8 01 cmp $0x1,%eax + 27: 7e 56 jle 7f + 29: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + wc(0, ""); + exit(); + } + + for (i = 1; i < argc; i++) { + if ((fd = open(argv[i], 0)) < 0) { + 30: 83 ec 08 sub $0x8,%esp + 33: 6a 00 push $0x0 + 35: ff 33 push (%ebx) + 37: e8 ff 03 00 00 call 43b + 3c: 83 c4 10 add $0x10,%esp + 3f: 89 c7 mov %eax,%edi + 41: 85 c0 test %eax,%eax + 43: 78 26 js 6b + printf(1, "wc: cannot open %s\n", argv[i]); + exit(); + } + wc(fd, argv[i]); + 45: 83 ec 08 sub $0x8,%esp + 48: ff 33 push (%ebx) + for (i = 1; i < argc; i++) { + 4a: 83 c6 01 add $0x1,%esi + 4d: 83 c3 04 add $0x4,%ebx + wc(fd, argv[i]); + 50: 50 push %eax + 51: e8 4a 00 00 00 call a0 + close(fd); + 56: 89 3c 24 mov %edi,(%esp) + 59: e8 0d 04 00 00 call 46b + for (i = 1; i < argc; i++) { + 5e: 83 c4 10 add $0x10,%esp + 61: 39 75 e4 cmp %esi,-0x1c(%ebp) + 64: 75 ca jne 30 + } + exit(); + 66: e8 68 03 00 00 call 3d3 + printf(1, "wc: cannot open %s\n", argv[i]); + 6b: 50 push %eax + 6c: ff 33 push (%ebx) + 6e: 68 9b 08 00 00 push $0x89b + 73: 6a 01 push $0x1 + 75: e8 d6 04 00 00 call 550 + exit(); + 7a: e8 54 03 00 00 call 3d3 + wc(0, ""); + 7f: 52 push %edx + 80: 52 push %edx + 81: 68 8d 08 00 00 push $0x88d + 86: 6a 00 push $0x0 + 88: e8 13 00 00 00 call a0 + exit(); + 8d: e8 41 03 00 00 call 3d3 + 92: 66 90 xchg %ax,%ax + 94: 66 90 xchg %ax,%ax + 96: 66 90 xchg %ax,%ax + 98: 66 90 xchg %ax,%ax + 9a: 66 90 xchg %ax,%ax + 9c: 66 90 xchg %ax,%ax + 9e: 66 90 xchg %ax,%ax + +000000a0 : +void wc(int fd, char *name) { + a0: 55 push %ebp + a1: 89 e5 mov %esp,%ebp + a3: 57 push %edi + a4: 56 push %esi + a5: 53 push %ebx + l = w = c = 0; + a6: 31 db xor %ebx,%ebx +void wc(int fd, char *name) { + a8: 83 ec 1c sub $0x1c,%esp + inword = 0; + ab: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) + l = w = c = 0; + b2: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) + b9: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) + while ((n = read(fd, buf, sizeof(buf))) > 0) { + c0: 83 ec 04 sub $0x4,%esp + c3: 68 00 02 00 00 push $0x200 + c8: 68 00 0c 00 00 push $0xc00 + cd: ff 75 08 push 0x8(%ebp) + d0: e8 16 03 00 00 call 3eb + d5: 83 c4 10 add $0x10,%esp + d8: 89 c6 mov %eax,%esi + da: 85 c0 test %eax,%eax + dc: 7e 62 jle 140 + for (i = 0; i < n; i++) { + de: 31 ff xor %edi,%edi + e0: eb 14 jmp f6 + e2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + inword = 0; + e8: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) + for (i = 0; i < n; i++) { + ef: 83 c7 01 add $0x1,%edi + f2: 39 fe cmp %edi,%esi + f4: 74 42 je 138 + if (buf[i] == '\n') { + f6: 0f be 87 00 0c 00 00 movsbl 0xc00(%edi),%eax + l++; + fd: 31 c9 xor %ecx,%ecx + ff: 3c 0a cmp $0xa,%al + 101: 0f 94 c1 sete %cl + if (strchr(" \r\t\n\v", buf[i])) { + 104: 83 ec 08 sub $0x8,%esp + 107: 50 push %eax + l++; + 108: 01 cb add %ecx,%ebx + if (strchr(" \r\t\n\v", buf[i])) { + 10a: 68 78 08 00 00 push $0x878 + 10f: e8 4c 01 00 00 call 260 + 114: 83 c4 10 add $0x10,%esp + 117: 85 c0 test %eax,%eax + 119: 75 cd jne e8 + else if (!inword) { + 11b: 8b 55 e4 mov -0x1c(%ebp),%edx + 11e: 85 d2 test %edx,%edx + 120: 75 cd jne ef + for (i = 0; i < n; i++) { + 122: 83 c7 01 add $0x1,%edi + w++; + 125: 83 45 e0 01 addl $0x1,-0x20(%ebp) + inword = 1; + 129: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp) + for (i = 0; i < n; i++) { + 130: 39 fe cmp %edi,%esi + 132: 75 c2 jne f6 + 134: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + c++; + 138: 01 75 dc add %esi,-0x24(%ebp) + 13b: eb 83 jmp c0 + 13d: 8d 76 00 lea 0x0(%esi),%esi + if (n < 0) { + 140: 75 24 jne 166 + printf(1, "%d %d %d %s\n", l, w, c, name); + 142: 83 ec 08 sub $0x8,%esp + 145: ff 75 0c push 0xc(%ebp) + 148: ff 75 dc push -0x24(%ebp) + 14b: ff 75 e0 push -0x20(%ebp) + 14e: 53 push %ebx + 14f: 68 8e 08 00 00 push $0x88e + 154: 6a 01 push $0x1 + 156: e8 f5 03 00 00 call 550 +} + 15b: 83 c4 20 add $0x20,%esp + 15e: 8d 65 f4 lea -0xc(%ebp),%esp + 161: 5b pop %ebx + 162: 5e pop %esi + 163: 5f pop %edi + 164: 5d pop %ebp + 165: c3 ret + printf(1, "wc: read error\n"); + 166: 50 push %eax + 167: 50 push %eax + 168: 68 7e 08 00 00 push $0x87e + 16d: 6a 01 push $0x1 + 16f: e8 dc 03 00 00 call 550 + exit(); + 174: e8 5a 02 00 00 call 3d3 + 179: 66 90 xchg %ax,%ax + 17b: 66 90 xchg %ax,%ax + 17d: 66 90 xchg %ax,%ax + 17f: 90 nop + +00000180 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 180: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 181: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 183: 89 e5 mov %esp,%ebp + 185: 53 push %ebx + 186: 8b 4d 08 mov 0x8(%ebp),%ecx + 189: 8b 5d 0c mov 0xc(%ebp),%ebx + 18c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 190: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 194: 88 14 01 mov %dl,(%ecx,%eax,1) + 197: 83 c0 01 add $0x1,%eax + 19a: 84 d2 test %dl,%dl + 19c: 75 f2 jne 190 + ; + } + return os; +} + 19e: 8b 5d fc mov -0x4(%ebp),%ebx + 1a1: 89 c8 mov %ecx,%eax + 1a3: c9 leave + 1a4: c3 ret + 1a5: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ac: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000001b0 : + +int strcmp(const char *p, const char *q) { + 1b0: 55 push %ebp + 1b1: 89 e5 mov %esp,%ebp + 1b3: 53 push %ebx + 1b4: 8b 55 08 mov 0x8(%ebp),%edx + 1b7: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 1ba: 0f b6 02 movzbl (%edx),%eax + 1bd: 84 c0 test %al,%al + 1bf: 75 17 jne 1d8 + 1c1: eb 3a jmp 1fd + 1c3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 1c7: 90 nop + 1c8: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 1cc: 83 c2 01 add $0x1,%edx + 1cf: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 1d2: 84 c0 test %al,%al + 1d4: 74 1a je 1f0 + p++, q++; + 1d6: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 1d8: 0f b6 19 movzbl (%ecx),%ebx + 1db: 38 c3 cmp %al,%bl + 1dd: 74 e9 je 1c8 + } + return (uchar) * p - (uchar) * q; + 1df: 29 d8 sub %ebx,%eax +} + 1e1: 8b 5d fc mov -0x4(%ebp),%ebx + 1e4: c9 leave + 1e5: c3 ret + 1e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1ed: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + 1f0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + 1f4: 31 c0 xor %eax,%eax + 1f6: 29 d8 sub %ebx,%eax +} + 1f8: 8b 5d fc mov -0x4(%ebp),%ebx + 1fb: c9 leave + 1fc: c3 ret + return (uchar) * p - (uchar) * q; + 1fd: 0f b6 19 movzbl (%ecx),%ebx + 200: 31 c0 xor %eax,%eax + 202: eb db jmp 1df + 204: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 20f: 90 nop + +00000210 : + +uint strlen(const char *s) { + 210: 55 push %ebp + 211: 89 e5 mov %esp,%ebp + 213: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + 216: 80 3a 00 cmpb $0x0,(%edx) + 219: 74 15 je 230 + 21b: 31 c0 xor %eax,%eax + 21d: 8d 76 00 lea 0x0(%esi),%esi + 220: 83 c0 01 add $0x1,%eax + 223: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + 227: 89 c1 mov %eax,%ecx + 229: 75 f5 jne 220 + ; + } + return n; +} + 22b: 89 c8 mov %ecx,%eax + 22d: 5d pop %ebp + 22e: c3 ret + 22f: 90 nop + for (n = 0; s[n]; n++) { + 230: 31 c9 xor %ecx,%ecx +} + 232: 5d pop %ebp + 233: 89 c8 mov %ecx,%eax + 235: c3 ret + 236: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 23d: 8d 76 00 lea 0x0(%esi),%esi + +00000240 : + +void* memset(void *dst, int c, uint n) { + 240: 55 push %ebp + 241: 89 e5 mov %esp,%ebp + 243: 57 push %edi + 244: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + 247: 8b 4d 10 mov 0x10(%ebp),%ecx + 24a: 8b 45 0c mov 0xc(%ebp),%eax + 24d: 89 d7 mov %edx,%edi + 24f: fc cld + 250: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 252: 8b 7d fc mov -0x4(%ebp),%edi + 255: 89 d0 mov %edx,%eax + 257: c9 leave + 258: c3 ret + 259: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000260 : + +char* strchr(const char *s, char c) { + 260: 55 push %ebp + 261: 89 e5 mov %esp,%ebp + 263: 8b 45 08 mov 0x8(%ebp),%eax + 266: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 26a: 0f b6 10 movzbl (%eax),%edx + 26d: 84 d2 test %dl,%dl + 26f: 75 12 jne 283 + 271: eb 1d jmp 290 + 273: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 277: 90 nop + 278: 0f b6 50 01 movzbl 0x1(%eax),%edx + 27c: 83 c0 01 add $0x1,%eax + 27f: 84 d2 test %dl,%dl + 281: 74 0d je 290 + if (*s == c) { + 283: 38 d1 cmp %dl,%cl + 285: 75 f1 jne 278 + return (char*)s; + } + } + return 0; +} + 287: 5d pop %ebp + 288: c3 ret + 289: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 290: 31 c0 xor %eax,%eax +} + 292: 5d pop %ebp + 293: c3 ret + 294: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 29b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 29f: 90 nop + +000002a0 : + +char* gets(char *buf, int max) { + 2a0: 55 push %ebp + 2a1: 89 e5 mov %esp,%ebp + 2a3: 57 push %edi + 2a4: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 2a5: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 2a8: 53 push %ebx + for (i = 0; i + 1 < max;) { + 2a9: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 2ab: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 2ae: eb 27 jmp 2d7 + cc = read(0, &c, 1); + 2b0: 83 ec 04 sub $0x4,%esp + 2b3: 6a 01 push $0x1 + 2b5: 57 push %edi + 2b6: 6a 00 push $0x0 + 2b8: e8 2e 01 00 00 call 3eb + if (cc < 1) { + 2bd: 83 c4 10 add $0x10,%esp + 2c0: 85 c0 test %eax,%eax + 2c2: 7e 1d jle 2e1 + break; + } + buf[i++] = c; + 2c4: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 2c8: 8b 55 08 mov 0x8(%ebp),%edx + 2cb: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 2cf: 3c 0a cmp $0xa,%al + 2d1: 74 1d je 2f0 + 2d3: 3c 0d cmp $0xd,%al + 2d5: 74 19 je 2f0 + for (i = 0; i + 1 < max;) { + 2d7: 89 de mov %ebx,%esi + 2d9: 83 c3 01 add $0x1,%ebx + 2dc: 3b 5d 0c cmp 0xc(%ebp),%ebx + 2df: 7c cf jl 2b0 + break; + } + } + buf[i] = '\0'; + 2e1: 8b 45 08 mov 0x8(%ebp),%eax + 2e4: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 2e8: 8d 65 f4 lea -0xc(%ebp),%esp + 2eb: 5b pop %ebx + 2ec: 5e pop %esi + 2ed: 5f pop %edi + 2ee: 5d pop %ebp + 2ef: c3 ret + buf[i] = '\0'; + 2f0: 8b 45 08 mov 0x8(%ebp),%eax + 2f3: 89 de mov %ebx,%esi + 2f5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 2f9: 8d 65 f4 lea -0xc(%ebp),%esp + 2fc: 5b pop %ebx + 2fd: 5e pop %esi + 2fe: 5f pop %edi + 2ff: 5d pop %ebp + 300: c3 ret + 301: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 308: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 30f: 90 nop + +00000310 : + +int stat(const char *n, struct stat *st) { + 310: 55 push %ebp + 311: 89 e5 mov %esp,%ebp + 313: 56 push %esi + 314: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 315: 83 ec 08 sub $0x8,%esp + 318: 6a 00 push $0x0 + 31a: ff 75 08 push 0x8(%ebp) + 31d: e8 19 01 00 00 call 43b + if (fd < 0) { + 322: 83 c4 10 add $0x10,%esp + 325: 85 c0 test %eax,%eax + 327: 78 27 js 350 + return -1; + } + r = fstat(fd, st); + 329: 83 ec 08 sub $0x8,%esp + 32c: ff 75 0c push 0xc(%ebp) + 32f: 89 c3 mov %eax,%ebx + 331: 50 push %eax + 332: e8 cc 00 00 00 call 403 + close(fd); + 337: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 33a: 89 c6 mov %eax,%esi + close(fd); + 33c: e8 2a 01 00 00 call 46b + return r; + 341: 83 c4 10 add $0x10,%esp +} + 344: 8d 65 f8 lea -0x8(%ebp),%esp + 347: 89 f0 mov %esi,%eax + 349: 5b pop %ebx + 34a: 5e pop %esi + 34b: 5d pop %ebp + 34c: c3 ret + 34d: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 350: be ff ff ff ff mov $0xffffffff,%esi + 355: eb ed jmp 344 + 357: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 35e: 66 90 xchg %ax,%ax + +00000360 : + +int atoi(const char *s) { + 360: 55 push %ebp + 361: 89 e5 mov %esp,%ebp + 363: 53 push %ebx + 364: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 367: 0f be 02 movsbl (%edx),%eax + 36a: 8d 48 d0 lea -0x30(%eax),%ecx + 36d: 80 f9 09 cmp $0x9,%cl + n = 0; + 370: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 375: 77 1e ja 395 + 377: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 37e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 380: 83 c2 01 add $0x1,%edx + 383: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 386: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 38a: 0f be 02 movsbl (%edx),%eax + 38d: 8d 58 d0 lea -0x30(%eax),%ebx + 390: 80 fb 09 cmp $0x9,%bl + 393: 76 eb jbe 380 + } + return n; +} + 395: 8b 5d fc mov -0x4(%ebp),%ebx + 398: 89 c8 mov %ecx,%eax + 39a: c9 leave + 39b: c3 ret + 39c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +000003a0 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 3a0: 55 push %ebp + 3a1: 89 e5 mov %esp,%ebp + 3a3: 57 push %edi + 3a4: 8b 45 10 mov 0x10(%ebp),%eax + 3a7: 8b 55 08 mov 0x8(%ebp),%edx + 3aa: 56 push %esi + 3ab: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 3ae: 85 c0 test %eax,%eax + 3b0: 7e 13 jle 3c5 + 3b2: 01 d0 add %edx,%eax + dst = vdst; + 3b4: 89 d7 mov %edx,%edi + 3b6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3bd: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 3c0: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 3c1: 39 f8 cmp %edi,%eax + 3c3: 75 fb jne 3c0 + } + return vdst; +} + 3c5: 5e pop %esi + 3c6: 89 d0 mov %edx,%eax + 3c8: 5f pop %edi + 3c9: 5d pop %ebp + 3ca: c3 ret + +000003cb : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 3cb: b8 01 00 00 00 mov $0x1,%eax + 3d0: cd 40 int $0x40 + 3d2: c3 ret + +000003d3 : +SYSCALL(exit) + 3d3: b8 02 00 00 00 mov $0x2,%eax + 3d8: cd 40 int $0x40 + 3da: c3 ret + +000003db : +SYSCALL(wait) + 3db: b8 03 00 00 00 mov $0x3,%eax + 3e0: cd 40 int $0x40 + 3e2: c3 ret + +000003e3 : +SYSCALL(pipe) + 3e3: b8 04 00 00 00 mov $0x4,%eax + 3e8: cd 40 int $0x40 + 3ea: c3 ret + +000003eb : +SYSCALL(read) + 3eb: b8 05 00 00 00 mov $0x5,%eax + 3f0: cd 40 int $0x40 + 3f2: c3 ret + +000003f3 : +SYSCALL(kill) + 3f3: b8 06 00 00 00 mov $0x6,%eax + 3f8: cd 40 int $0x40 + 3fa: c3 ret + +000003fb : +SYSCALL(exec) + 3fb: b8 07 00 00 00 mov $0x7,%eax + 400: cd 40 int $0x40 + 402: c3 ret + +00000403 : +SYSCALL(fstat) + 403: b8 08 00 00 00 mov $0x8,%eax + 408: cd 40 int $0x40 + 40a: c3 ret + +0000040b : +SYSCALL(chdir) + 40b: b8 09 00 00 00 mov $0x9,%eax + 410: cd 40 int $0x40 + 412: c3 ret + +00000413 : +SYSCALL(dup) + 413: b8 0a 00 00 00 mov $0xa,%eax + 418: cd 40 int $0x40 + 41a: c3 ret + +0000041b : +SYSCALL(getpid) + 41b: b8 0b 00 00 00 mov $0xb,%eax + 420: cd 40 int $0x40 + 422: c3 ret + +00000423 : +SYSCALL(sbrk) + 423: b8 0c 00 00 00 mov $0xc,%eax + 428: cd 40 int $0x40 + 42a: c3 ret + +0000042b : +SYSCALL(sleep) + 42b: b8 0d 00 00 00 mov $0xd,%eax + 430: cd 40 int $0x40 + 432: c3 ret + +00000433 : +SYSCALL(uptime) + 433: b8 0e 00 00 00 mov $0xe,%eax + 438: cd 40 int $0x40 + 43a: c3 ret + +0000043b : +SYSCALL(open) + 43b: b8 0f 00 00 00 mov $0xf,%eax + 440: cd 40 int $0x40 + 442: c3 ret + +00000443 : +SYSCALL(write) + 443: b8 10 00 00 00 mov $0x10,%eax + 448: cd 40 int $0x40 + 44a: c3 ret + +0000044b : +SYSCALL(mknod) + 44b: b8 11 00 00 00 mov $0x11,%eax + 450: cd 40 int $0x40 + 452: c3 ret + +00000453 : +SYSCALL(unlink) + 453: b8 12 00 00 00 mov $0x12,%eax + 458: cd 40 int $0x40 + 45a: c3 ret + +0000045b : +SYSCALL(link) + 45b: b8 13 00 00 00 mov $0x13,%eax + 460: cd 40 int $0x40 + 462: c3 ret + +00000463 : +SYSCALL(mkdir) + 463: b8 14 00 00 00 mov $0x14,%eax + 468: cd 40 int $0x40 + 46a: c3 ret + +0000046b : +SYSCALL(close) + 46b: b8 15 00 00 00 mov $0x15,%eax + 470: cd 40 int $0x40 + 472: c3 ret + +00000473 : +SYSCALL(getch) + 473: b8 16 00 00 00 mov $0x16,%eax + 478: cd 40 int $0x40 + 47a: c3 ret + +0000047b : +SYSCALL(greeting) + 47b: b8 17 00 00 00 mov $0x17,%eax + 480: cd 40 int $0x40 + 482: c3 ret + +00000483 : +SYSCALL(shutdown) + 483: b8 18 00 00 00 mov $0x18,%eax + 488: cd 40 int $0x40 + 48a: c3 ret + +0000048b : +SYSCALL(screen) + 48b: b8 19 00 00 00 mov $0x19,%eax + 490: cd 40 int $0x40 + 492: c3 ret + +00000493 : +SYSCALL(cls) + 493: b8 1a 00 00 00 mov $0x1a,%eax + 498: cd 40 int $0x40 + 49a: c3 ret + 49b: 66 90 xchg %ax,%ax + 49d: 66 90 xchg %ax,%ax + 49f: 90 nop + +000004a0 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 4a0: 55 push %ebp + 4a1: 89 e5 mov %esp,%ebp + 4a3: 57 push %edi + 4a4: 56 push %esi + 4a5: 53 push %ebx + 4a6: 83 ec 3c sub $0x3c,%esp + 4a9: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 4ac: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 4ae: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 4b1: 85 d2 test %edx,%edx + 4b3: 0f 89 7f 00 00 00 jns 538 + 4b9: f6 45 08 01 testb $0x1,0x8(%ebp) + 4bd: 74 79 je 538 + neg = 1; + 4bf: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 4c6: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 4c8: 31 db xor %ebx,%ebx + 4ca: 8d 75 d7 lea -0x29(%ebp),%esi + 4cd: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 4d0: 89 c8 mov %ecx,%eax + 4d2: 31 d2 xor %edx,%edx + 4d4: 89 cf mov %ecx,%edi + 4d6: f7 75 c4 divl -0x3c(%ebp) + 4d9: 0f b6 92 10 09 00 00 movzbl 0x910(%edx),%edx + 4e0: 89 45 c0 mov %eax,-0x40(%ebp) + 4e3: 89 d8 mov %ebx,%eax + 4e5: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 4e8: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 4eb: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 4ee: 39 7d c4 cmp %edi,-0x3c(%ebp) + 4f1: 76 dd jbe 4d0 + if (neg) { + 4f3: 8b 4d bc mov -0x44(%ebp),%ecx + 4f6: 85 c9 test %ecx,%ecx + 4f8: 74 0c je 506 + buf[i++] = '-'; + 4fa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 4ff: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 501: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 506: 8b 7d b8 mov -0x48(%ebp),%edi + 509: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 50d: eb 07 jmp 516 + 50f: 90 nop + putc(fd, buf[i]); + 510: 0f b6 13 movzbl (%ebx),%edx + 513: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 516: 83 ec 04 sub $0x4,%esp + 519: 88 55 d7 mov %dl,-0x29(%ebp) + 51c: 6a 01 push $0x1 + 51e: 56 push %esi + 51f: 57 push %edi + 520: e8 1e ff ff ff call 443 + while (--i >= 0) { + 525: 83 c4 10 add $0x10,%esp + 528: 39 de cmp %ebx,%esi + 52a: 75 e4 jne 510 + } +} + 52c: 8d 65 f4 lea -0xc(%ebp),%esp + 52f: 5b pop %ebx + 530: 5e pop %esi + 531: 5f pop %edi + 532: 5d pop %ebp + 533: c3 ret + 534: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 538: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 53f: eb 87 jmp 4c8 + 541: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 548: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 54f: 90 nop + +00000550 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 550: 55 push %ebp + 551: 89 e5 mov %esp,%ebp + 553: 57 push %edi + 554: 56 push %esi + 555: 53 push %ebx + 556: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 559: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 55c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 55f: 0f b6 13 movzbl (%ebx),%edx + 562: 84 d2 test %dl,%dl + 564: 74 6a je 5d0 + ap = (uint*)(void*)&fmt + 1; + 566: 8d 45 10 lea 0x10(%ebp),%eax + 569: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 56c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 56f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 571: 89 45 d0 mov %eax,-0x30(%ebp) + 574: eb 36 jmp 5ac + 576: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 57d: 8d 76 00 lea 0x0(%esi),%esi + 580: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 583: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 588: 83 f8 25 cmp $0x25,%eax + 58b: 74 15 je 5a2 + write(fd, &c, 1); + 58d: 83 ec 04 sub $0x4,%esp + 590: 88 55 e7 mov %dl,-0x19(%ebp) + 593: 6a 01 push $0x1 + 595: 57 push %edi + 596: 56 push %esi + 597: e8 a7 fe ff ff call 443 + 59c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 59f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 5a2: 0f b6 13 movzbl (%ebx),%edx + 5a5: 83 c3 01 add $0x1,%ebx + 5a8: 84 d2 test %dl,%dl + 5aa: 74 24 je 5d0 + c = fmt[i] & 0xff; + 5ac: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 5af: 85 c9 test %ecx,%ecx + 5b1: 74 cd je 580 + } + } + else if (state == '%') { + 5b3: 83 f9 25 cmp $0x25,%ecx + 5b6: 75 ea jne 5a2 + if (c == 'd') { + 5b8: 83 f8 25 cmp $0x25,%eax + 5bb: 0f 84 07 01 00 00 je 6c8 + 5c1: 83 e8 63 sub $0x63,%eax + 5c4: 83 f8 15 cmp $0x15,%eax + 5c7: 77 17 ja 5e0 + 5c9: ff 24 85 b8 08 00 00 jmp *0x8b8(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 5d0: 8d 65 f4 lea -0xc(%ebp),%esp + 5d3: 5b pop %ebx + 5d4: 5e pop %esi + 5d5: 5f pop %edi + 5d6: 5d pop %ebp + 5d7: c3 ret + 5d8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5df: 90 nop + write(fd, &c, 1); + 5e0: 83 ec 04 sub $0x4,%esp + 5e3: 88 55 d4 mov %dl,-0x2c(%ebp) + 5e6: 6a 01 push $0x1 + 5e8: 57 push %edi + 5e9: 56 push %esi + 5ea: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 5ee: e8 50 fe ff ff call 443 + putc(fd, c); + 5f3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 5f7: 83 c4 0c add $0xc,%esp + 5fa: 88 55 e7 mov %dl,-0x19(%ebp) + 5fd: 6a 01 push $0x1 + 5ff: 57 push %edi + 600: 56 push %esi + 601: e8 3d fe ff ff call 443 + putc(fd, c); + 606: 83 c4 10 add $0x10,%esp + state = 0; + 609: 31 c9 xor %ecx,%ecx + 60b: eb 95 jmp 5a2 + 60d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 610: 83 ec 0c sub $0xc,%esp + 613: b9 10 00 00 00 mov $0x10,%ecx + 618: 6a 00 push $0x0 + 61a: 8b 45 d0 mov -0x30(%ebp),%eax + 61d: 8b 10 mov (%eax),%edx + 61f: 89 f0 mov %esi,%eax + 621: e8 7a fe ff ff call 4a0 + ap++; + 626: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 62a: 83 c4 10 add $0x10,%esp + state = 0; + 62d: 31 c9 xor %ecx,%ecx + 62f: e9 6e ff ff ff jmp 5a2 + 634: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 638: 8b 45 d0 mov -0x30(%ebp),%eax + 63b: 8b 10 mov (%eax),%edx + ap++; + 63d: 83 c0 04 add $0x4,%eax + 640: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 643: 85 d2 test %edx,%edx + 645: 0f 84 8d 00 00 00 je 6d8 + while (*s != 0) { + 64b: 0f b6 02 movzbl (%edx),%eax + state = 0; + 64e: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 650: 84 c0 test %al,%al + 652: 0f 84 4a ff ff ff je 5a2 + 658: 89 5d d4 mov %ebx,-0x2c(%ebp) + 65b: 89 d3 mov %edx,%ebx + 65d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 660: 83 ec 04 sub $0x4,%esp + s++; + 663: 83 c3 01 add $0x1,%ebx + 666: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 669: 6a 01 push $0x1 + 66b: 57 push %edi + 66c: 56 push %esi + 66d: e8 d1 fd ff ff call 443 + while (*s != 0) { + 672: 0f b6 03 movzbl (%ebx),%eax + 675: 83 c4 10 add $0x10,%esp + 678: 84 c0 test %al,%al + 67a: 75 e4 jne 660 + state = 0; + 67c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 67f: 31 c9 xor %ecx,%ecx + 681: e9 1c ff ff ff jmp 5a2 + 686: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 68d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 690: 83 ec 0c sub $0xc,%esp + 693: b9 0a 00 00 00 mov $0xa,%ecx + 698: 6a 01 push $0x1 + 69a: e9 7b ff ff ff jmp 61a + 69f: 90 nop + putc(fd, *ap); + 6a0: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 6a3: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 6a6: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 6a8: 6a 01 push $0x1 + 6aa: 57 push %edi + 6ab: 56 push %esi + putc(fd, *ap); + 6ac: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 6af: e8 8f fd ff ff call 443 + ap++; + 6b4: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 6b8: 83 c4 10 add $0x10,%esp + state = 0; + 6bb: 31 c9 xor %ecx,%ecx + 6bd: e9 e0 fe ff ff jmp 5a2 + 6c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 6c8: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 6cb: 83 ec 04 sub $0x4,%esp + 6ce: e9 2a ff ff ff jmp 5fd + 6d3: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 6d7: 90 nop + s = "(null)"; + 6d8: ba af 08 00 00 mov $0x8af,%edx + while (*s != 0) { + 6dd: 89 5d d4 mov %ebx,-0x2c(%ebp) + 6e0: b8 28 00 00 00 mov $0x28,%eax + 6e5: 89 d3 mov %edx,%ebx + 6e7: e9 74 ff ff ff jmp 660 + 6ec: 66 90 xchg %ax,%ax + 6ee: 66 90 xchg %ax,%ax + +000006f0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 6f0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 6f1: a1 00 0e 00 00 mov 0xe00,%eax +void free(void *ap) { + 6f6: 89 e5 mov %esp,%ebp + 6f8: 57 push %edi + 6f9: 56 push %esi + 6fa: 53 push %ebx + 6fb: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 6fe: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 701: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 708: 89 c2 mov %eax,%edx + 70a: 8b 00 mov (%eax),%eax + 70c: 39 ca cmp %ecx,%edx + 70e: 73 30 jae 740 + 710: 39 c1 cmp %eax,%ecx + 712: 72 04 jb 718 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 714: 39 c2 cmp %eax,%edx + 716: 72 f0 jb 708 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 718: 8b 73 fc mov -0x4(%ebx),%esi + 71b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 71e: 39 f8 cmp %edi,%eax + 720: 74 30 je 752 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 722: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 725: 8b 42 04 mov 0x4(%edx),%eax + 728: 8d 34 c2 lea (%edx,%eax,8),%esi + 72b: 39 f1 cmp %esi,%ecx + 72d: 74 3a je 769 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 72f: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 731: 5b pop %ebx + freep = p; + 732: 89 15 00 0e 00 00 mov %edx,0xe00 +} + 738: 5e pop %esi + 739: 5f pop %edi + 73a: 5d pop %ebp + 73b: c3 ret + 73c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 740: 39 c2 cmp %eax,%edx + 742: 72 c4 jb 708 + 744: 39 c1 cmp %eax,%ecx + 746: 73 c0 jae 708 + if (bp + bp->s.size == p->s.ptr) { + 748: 8b 73 fc mov -0x4(%ebx),%esi + 74b: 8d 3c f1 lea (%ecx,%esi,8),%edi + 74e: 39 f8 cmp %edi,%eax + 750: 75 d0 jne 722 + bp->s.size += p->s.ptr->s.size; + 752: 03 70 04 add 0x4(%eax),%esi + 755: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 758: 8b 02 mov (%edx),%eax + 75a: 8b 00 mov (%eax),%eax + 75c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 75f: 8b 42 04 mov 0x4(%edx),%eax + 762: 8d 34 c2 lea (%edx,%eax,8),%esi + 765: 39 f1 cmp %esi,%ecx + 767: 75 c6 jne 72f + p->s.size += bp->s.size; + 769: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 76c: 89 15 00 0e 00 00 mov %edx,0xe00 + p->s.size += bp->s.size; + 772: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 775: 8b 4b f8 mov -0x8(%ebx),%ecx + 778: 89 0a mov %ecx,(%edx) +} + 77a: 5b pop %ebx + 77b: 5e pop %esi + 77c: 5f pop %edi + 77d: 5d pop %ebp + 77e: c3 ret + 77f: 90 nop + +00000780 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 780: 55 push %ebp + 781: 89 e5 mov %esp,%ebp + 783: 57 push %edi + 784: 56 push %esi + 785: 53 push %ebx + 786: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 789: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 78c: 8b 3d 00 0e 00 00 mov 0xe00,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 792: 8d 70 07 lea 0x7(%eax),%esi + 795: c1 ee 03 shr $0x3,%esi + 798: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 79b: 85 ff test %edi,%edi + 79d: 0f 84 9d 00 00 00 je 840 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 7a3: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 7a5: 8b 4a 04 mov 0x4(%edx),%ecx + 7a8: 39 f1 cmp %esi,%ecx + 7aa: 73 6a jae 816 + 7ac: bb 00 10 00 00 mov $0x1000,%ebx + 7b1: 39 de cmp %ebx,%esi + 7b3: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 7b6: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 7bd: 89 45 e4 mov %eax,-0x1c(%ebp) + 7c0: eb 17 jmp 7d9 + 7c2: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 7c8: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 7ca: 8b 48 04 mov 0x4(%eax),%ecx + 7cd: 39 f1 cmp %esi,%ecx + 7cf: 73 4f jae 820 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 7d1: 8b 3d 00 0e 00 00 mov 0xe00,%edi + 7d7: 89 c2 mov %eax,%edx + 7d9: 39 d7 cmp %edx,%edi + 7db: 75 eb jne 7c8 + p = sbrk(nu * sizeof(Header)); + 7dd: 83 ec 0c sub $0xc,%esp + 7e0: ff 75 e4 push -0x1c(%ebp) + 7e3: e8 3b fc ff ff call 423 + if (p == (char*)-1) { + 7e8: 83 c4 10 add $0x10,%esp + 7eb: 83 f8 ff cmp $0xffffffff,%eax + 7ee: 74 1c je 80c + hp->s.size = nu; + 7f0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 7f3: 83 ec 0c sub $0xc,%esp + 7f6: 83 c0 08 add $0x8,%eax + 7f9: 50 push %eax + 7fa: e8 f1 fe ff ff call 6f0 + return freep; + 7ff: 8b 15 00 0e 00 00 mov 0xe00,%edx + if ((p = morecore(nunits)) == 0) { + 805: 83 c4 10 add $0x10,%esp + 808: 85 d2 test %edx,%edx + 80a: 75 bc jne 7c8 + return 0; + } + } + } +} + 80c: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 80f: 31 c0 xor %eax,%eax +} + 811: 5b pop %ebx + 812: 5e pop %esi + 813: 5f pop %edi + 814: 5d pop %ebp + 815: c3 ret + if (p->s.size >= nunits) { + 816: 89 d0 mov %edx,%eax + 818: 89 fa mov %edi,%edx + 81a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 820: 39 ce cmp %ecx,%esi + 822: 74 4c je 870 + p->s.size -= nunits; + 824: 29 f1 sub %esi,%ecx + 826: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 829: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 82c: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 82f: 89 15 00 0e 00 00 mov %edx,0xe00 +} + 835: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 838: 83 c0 08 add $0x8,%eax +} + 83b: 5b pop %ebx + 83c: 5e pop %esi + 83d: 5f pop %edi + 83e: 5d pop %ebp + 83f: c3 ret + base.s.ptr = freep = prevp = &base; + 840: c7 05 00 0e 00 00 04 movl $0xe04,0xe00 + 847: 0e 00 00 + base.s.size = 0; + 84a: bf 04 0e 00 00 mov $0xe04,%edi + base.s.ptr = freep = prevp = &base; + 84f: c7 05 04 0e 00 00 04 movl $0xe04,0xe04 + 856: 0e 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 859: 89 fa mov %edi,%edx + base.s.size = 0; + 85b: c7 05 08 0e 00 00 00 movl $0x0,0xe08 + 862: 00 00 00 + if (p->s.size >= nunits) { + 865: e9 42 ff ff ff jmp 7ac + 86a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 870: 8b 08 mov (%eax),%ecx + 872: 89 0a mov %ecx,(%edx) + 874: eb b9 jmp 82f diff --git a/wc.d b/wc.d new file mode 100644 index 0000000..6adc498 --- /dev/null +++ b/wc.d @@ -0,0 +1 @@ +wc.o: wc.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/wc.o b/wc.o new file mode 100644 index 0000000000000000000000000000000000000000..df9fa60fd5da13013c9175df8c3edc9a385723cd GIT binary patch literal 5500 zcma)Adu&_P9X`kR9>_Rn)MoP5R1gM)>PxJsSoz-?rZy9>GGm; z-Ipjj*ZqC~7YU`y?yv|6F-&I0kNoM%%*;&b?fR*+M^8V|-!}7M)AY+!8RybDx$(1N zXWbjeC~SMTy{hiHpOr30dgU*41nYkEwEy1mU6+pj%6|_orS6Lo0hss3&-^#1iz|in z-~X^QJudtfc+dFNGyeNC{>8rGt6}r7G-2Y?-Y54zxc`B-dV7b%a|*2m%M!1ttcr?> z^rm>;OAW-md_I@25-SGc=C4pCv^Jf}W^=`OZp_QZS5Rom^xZ9P>C#_k9=W1t>J8@D zcTef^!sGJzz3x=^rP5n&=~MZ{?&%+`qzkfrSj?=mt?nxCJ51@U(2lj^X7L3C#sQSPdnl%ibclqFGEzp;nVH#dRwvazhnO zNZFN<)tXZqz*V{`lP!v>`ygVCGV>V;tMCR;)s)rr`-4KNa1UtZpb^T2YgBcDoJI|i z(A|n!E&Mixy3v|&3ViK4_=Lh*Uw1v}RpIlrqlq@I7pe~ODsA$YS=B5h8eG)~@%0r^ zn6Uz)+t`doF4qAlJW2NXS78~eLL-;g>du}O6-ltmuc3y!h_mGk4v3aY>bp@n znNCKu)KK7|?njmFXgFZG8_iD{@j(y=DLH`VyCe>yd6mQwE1`!rW;(PHVJ6=+kruLo zdsSROmCs*=3}l7wF@zLXKv=PWmXn|!Lq$Rno#D5@oT4BrBGt_B9n{w;7!j4);vZoC zM!|%r)E0{nrxDdji^@8>+yiC{>eWlY$jU~_j)8v^Ro(=KizAC@J|giGGeZlD-zN9ag8Efj-y(Or zEjKyiM^3pn?bh3ydehe#Ms&}}vochSxM$@B+XMZ%Z(PxZ&|TY|3HWcnKM2kMK^L2V zu85%HNE-d5pOhef8La6x9%?=1#^02(PxmSNjGAHRnM@&{z3wxT zdG0lN?lXDr{cld4p=WoxFKC~g#%Hhb*~z;s6k#I26?aQthf{TTC^0-_Z$1)zY zsluTw($8gcej(v!Co5*K)6RG@ATJXb26ozy8 zVtn4DjOEe&AZ^BlcQAul(l(s0iF7h8){J@snbexX;Qqcth2DH_Xich6@Ct=dFI!yu zKeRf4Zv29mPvYBfOIO#X_zk=I{cO=UlbdMsHQV;Y+O^5n^{b3nG;zbD$iq8?d@Lfb zt#;in!YKQwp@fsqGt|MX*^mt&` zN*;KN!P^WzV32!|<340~_DB2g8T_%qUmE<_U;{QP?f6N^{~c~L{3e5U5b+LeHMra0 zeFldN9xymYM4UqgCk-Aq_?*EP48CaaC4+AhvFCnIL|%U+qW=#KeroWF!AjUtUt{nZ zgG&tFXmE|ec7vM@b`#N0uie`Qj1>4VH+odC{QWU*P{~ z_{Gd0{0@V>r^sV#;NPp@%#i2zCgbY;0-kpq`Rj<-FTC4`-0#Gj4Q?jF{_jNC$ASEc z=_P^}$-<#gJO;pGKEPp1<-L()(K}ca$$?ZcC6fJxf=K3bWN6)%Yy)d-AV}ql{#YOx z@cR9s{h91w4!)XB_4nt!@pA1*ET0jO=rhJUptOnpc&VekHH)(%g^fWfkAn^uOZ%fC^;`2 zpN*FSZGAwBLs0A~6IinFIlJ>XC$Cv$nT~gIdB4NB@9j8nL}vRvR^|gzJdJzg1`?*& z&^*iK@m@tdo=c8{=hBYj>!7Ub?qHdA#$8$2DL)khAf=58C>G6z?G( z?^|0e`5g$#<6T6MR>&9+PuOg{*Fe*UI+pct>a;E!K{2Bx!5+ z4(xaz*<$Vf00C)RK7n0%u{!-GL1DKN?f6rNEu3eTKckk9x4wRE{&*kT^: + +#include "types.h" +#include "stat.h" +#include "user.h" + +int main(void) { + 0: 8d 4c 24 04 lea 0x4(%esp),%ecx + 4: 83 e4 f0 and $0xfffffff0,%esp + 7: ff 71 fc push -0x4(%ecx) + a: 55 push %ebp + b: 89 e5 mov %esp,%ebp + d: 51 push %ecx + e: 83 ec 04 sub $0x4,%esp + if (fork() > 0) { + 11: e8 65 02 00 00 call 27b + 16: 85 c0 test %eax,%eax + 18: 7e 0d jle 27 + sleep(5); // Let child exit before parent. + 1a: 83 ec 0c sub $0xc,%esp + 1d: 6a 05 push $0x5 + 1f: e8 b7 02 00 00 call 2db + 24: 83 c4 10 add $0x10,%esp + } + exit(); + 27: e8 57 02 00 00 call 283 + 2c: 66 90 xchg %ax,%ax + 2e: 66 90 xchg %ax,%ax + +00000030 : +#include "stat.h" +#include "fcntl.h" +#include "user.h" +#include "x86.h" + +char*strcpy(char *s, const char *t) { + 30: 55 push %ebp + char *os; + + os = s; + while ((*s++ = *t++) != 0) { + 31: 31 c0 xor %eax,%eax +char*strcpy(char *s, const char *t) { + 33: 89 e5 mov %esp,%ebp + 35: 53 push %ebx + 36: 8b 4d 08 mov 0x8(%ebp),%ecx + 39: 8b 5d 0c mov 0xc(%ebp),%ebx + 3c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + while ((*s++ = *t++) != 0) { + 40: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx + 44: 88 14 01 mov %dl,(%ecx,%eax,1) + 47: 83 c0 01 add $0x1,%eax + 4a: 84 d2 test %dl,%dl + 4c: 75 f2 jne 40 + ; + } + return os; +} + 4e: 8b 5d fc mov -0x4(%ebp),%ebx + 51: 89 c8 mov %ecx,%eax + 53: c9 leave + 54: c3 ret + 55: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000060 : + +int strcmp(const char *p, const char *q) { + 60: 55 push %ebp + 61: 89 e5 mov %esp,%ebp + 63: 53 push %ebx + 64: 8b 55 08 mov 0x8(%ebp),%edx + 67: 8b 4d 0c mov 0xc(%ebp),%ecx + while (*p && *p == *q) { + 6a: 0f b6 02 movzbl (%edx),%eax + 6d: 84 c0 test %al,%al + 6f: 75 17 jne 88 + 71: eb 3a jmp ad + 73: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 77: 90 nop + 78: 0f b6 42 01 movzbl 0x1(%edx),%eax + p++, q++; + 7c: 83 c2 01 add $0x1,%edx + 7f: 8d 59 01 lea 0x1(%ecx),%ebx + while (*p && *p == *q) { + 82: 84 c0 test %al,%al + 84: 74 1a je a0 + p++, q++; + 86: 89 d9 mov %ebx,%ecx + while (*p && *p == *q) { + 88: 0f b6 19 movzbl (%ecx),%ebx + 8b: 38 c3 cmp %al,%bl + 8d: 74 e9 je 78 + } + return (uchar) * p - (uchar) * q; + 8f: 29 d8 sub %ebx,%eax +} + 91: 8b 5d fc mov -0x4(%ebp),%ebx + 94: c9 leave + 95: c3 ret + 96: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 9d: 8d 76 00 lea 0x0(%esi),%esi + return (uchar) * p - (uchar) * q; + a0: 0f b6 59 01 movzbl 0x1(%ecx),%ebx + a4: 31 c0 xor %eax,%eax + a6: 29 d8 sub %ebx,%eax +} + a8: 8b 5d fc mov -0x4(%ebp),%ebx + ab: c9 leave + ac: c3 ret + return (uchar) * p - (uchar) * q; + ad: 0f b6 19 movzbl (%ecx),%ebx + b0: 31 c0 xor %eax,%eax + b2: eb db jmp 8f + b4: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + bb: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + bf: 90 nop + +000000c0 : + +uint strlen(const char *s) { + c0: 55 push %ebp + c1: 89 e5 mov %esp,%ebp + c3: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + for (n = 0; s[n]; n++) { + c6: 80 3a 00 cmpb $0x0,(%edx) + c9: 74 15 je e0 + cb: 31 c0 xor %eax,%eax + cd: 8d 76 00 lea 0x0(%esi),%esi + d0: 83 c0 01 add $0x1,%eax + d3: 80 3c 02 00 cmpb $0x0,(%edx,%eax,1) + d7: 89 c1 mov %eax,%ecx + d9: 75 f5 jne d0 + ; + } + return n; +} + db: 89 c8 mov %ecx,%eax + dd: 5d pop %ebp + de: c3 ret + df: 90 nop + for (n = 0; s[n]; n++) { + e0: 31 c9 xor %ecx,%ecx +} + e2: 5d pop %ebp + e3: 89 c8 mov %ecx,%eax + e5: c3 ret + e6: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + ed: 8d 76 00 lea 0x0(%esi),%esi + +000000f0 : + +void* memset(void *dst, int c, uint n) { + f0: 55 push %ebp + f1: 89 e5 mov %esp,%ebp + f3: 57 push %edi + f4: 8b 55 08 mov 0x8(%ebp),%edx + "d" (port), "0" (addr), "1" (cnt) : + "cc"); +} + +static inline void stosb(void *addr, int data, int cnt) { + asm volatile ("cld; rep stosb" : + f7: 8b 4d 10 mov 0x10(%ebp),%ecx + fa: 8b 45 0c mov 0xc(%ebp),%eax + fd: 89 d7 mov %edx,%edi + ff: fc cld + 100: f3 aa rep stos %al,%es:(%edi) + stosb(dst, c, n); + return dst; +} + 102: 8b 7d fc mov -0x4(%ebp),%edi + 105: 89 d0 mov %edx,%eax + 107: c9 leave + 108: c3 ret + 109: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + +00000110 : + +char* strchr(const char *s, char c) { + 110: 55 push %ebp + 111: 89 e5 mov %esp,%ebp + 113: 8b 45 08 mov 0x8(%ebp),%eax + 116: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx + for (; *s; s++) { + 11a: 0f b6 10 movzbl (%eax),%edx + 11d: 84 d2 test %dl,%dl + 11f: 75 12 jne 133 + 121: eb 1d jmp 140 + 123: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 127: 90 nop + 128: 0f b6 50 01 movzbl 0x1(%eax),%edx + 12c: 83 c0 01 add $0x1,%eax + 12f: 84 d2 test %dl,%dl + 131: 74 0d je 140 + if (*s == c) { + 133: 38 d1 cmp %dl,%cl + 135: 75 f1 jne 128 + return (char*)s; + } + } + return 0; +} + 137: 5d pop %ebp + 138: c3 ret + 139: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + return 0; + 140: 31 c0 xor %eax,%eax +} + 142: 5d pop %ebp + 143: c3 ret + 144: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 14b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 14f: 90 nop + +00000150 : + +char* gets(char *buf, int max) { + 150: 55 push %ebp + 151: 89 e5 mov %esp,%ebp + 153: 57 push %edi + 154: 56 push %esi + int i, cc; + char c; + + for (i = 0; i + 1 < max;) { + cc = read(0, &c, 1); + 155: 8d 7d e7 lea -0x19(%ebp),%edi +char* gets(char *buf, int max) { + 158: 53 push %ebx + for (i = 0; i + 1 < max;) { + 159: 31 db xor %ebx,%ebx +char* gets(char *buf, int max) { + 15b: 83 ec 1c sub $0x1c,%esp + for (i = 0; i + 1 < max;) { + 15e: eb 27 jmp 187 + cc = read(0, &c, 1); + 160: 83 ec 04 sub $0x4,%esp + 163: 6a 01 push $0x1 + 165: 57 push %edi + 166: 6a 00 push $0x0 + 168: e8 2e 01 00 00 call 29b + if (cc < 1) { + 16d: 83 c4 10 add $0x10,%esp + 170: 85 c0 test %eax,%eax + 172: 7e 1d jle 191 + break; + } + buf[i++] = c; + 174: 0f b6 45 e7 movzbl -0x19(%ebp),%eax + 178: 8b 55 08 mov 0x8(%ebp),%edx + 17b: 88 44 1a ff mov %al,-0x1(%edx,%ebx,1) + if (c == '\n' || c == '\r') { + 17f: 3c 0a cmp $0xa,%al + 181: 74 1d je 1a0 + 183: 3c 0d cmp $0xd,%al + 185: 74 19 je 1a0 + for (i = 0; i + 1 < max;) { + 187: 89 de mov %ebx,%esi + 189: 83 c3 01 add $0x1,%ebx + 18c: 3b 5d 0c cmp 0xc(%ebp),%ebx + 18f: 7c cf jl 160 + break; + } + } + buf[i] = '\0'; + 191: 8b 45 08 mov 0x8(%ebp),%eax + 194: c6 04 30 00 movb $0x0,(%eax,%esi,1) + return buf; +} + 198: 8d 65 f4 lea -0xc(%ebp),%esp + 19b: 5b pop %ebx + 19c: 5e pop %esi + 19d: 5f pop %edi + 19e: 5d pop %ebp + 19f: c3 ret + buf[i] = '\0'; + 1a0: 8b 45 08 mov 0x8(%ebp),%eax + 1a3: 89 de mov %ebx,%esi + 1a5: c6 04 30 00 movb $0x0,(%eax,%esi,1) +} + 1a9: 8d 65 f4 lea -0xc(%ebp),%esp + 1ac: 5b pop %ebx + 1ad: 5e pop %esi + 1ae: 5f pop %edi + 1af: 5d pop %ebp + 1b0: c3 ret + 1b1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1b8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 1bf: 90 nop + +000001c0 : + +int stat(const char *n, struct stat *st) { + 1c0: 55 push %ebp + 1c1: 89 e5 mov %esp,%ebp + 1c3: 56 push %esi + 1c4: 53 push %ebx + int fd; + int r; + + fd = open(n, O_RDONLY); + 1c5: 83 ec 08 sub $0x8,%esp + 1c8: 6a 00 push $0x0 + 1ca: ff 75 08 push 0x8(%ebp) + 1cd: e8 19 01 00 00 call 2eb + if (fd < 0) { + 1d2: 83 c4 10 add $0x10,%esp + 1d5: 85 c0 test %eax,%eax + 1d7: 78 27 js 200 + return -1; + } + r = fstat(fd, st); + 1d9: 83 ec 08 sub $0x8,%esp + 1dc: ff 75 0c push 0xc(%ebp) + 1df: 89 c3 mov %eax,%ebx + 1e1: 50 push %eax + 1e2: e8 cc 00 00 00 call 2b3 + close(fd); + 1e7: 89 1c 24 mov %ebx,(%esp) + r = fstat(fd, st); + 1ea: 89 c6 mov %eax,%esi + close(fd); + 1ec: e8 2a 01 00 00 call 31b + return r; + 1f1: 83 c4 10 add $0x10,%esp +} + 1f4: 8d 65 f8 lea -0x8(%ebp),%esp + 1f7: 89 f0 mov %esi,%eax + 1f9: 5b pop %ebx + 1fa: 5e pop %esi + 1fb: 5d pop %ebp + 1fc: c3 ret + 1fd: 8d 76 00 lea 0x0(%esi),%esi + return -1; + 200: be ff ff ff ff mov $0xffffffff,%esi + 205: eb ed jmp 1f4 + 207: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 20e: 66 90 xchg %ax,%ax + +00000210 : + +int atoi(const char *s) { + 210: 55 push %ebp + 211: 89 e5 mov %esp,%ebp + 213: 53 push %ebx + 214: 8b 55 08 mov 0x8(%ebp),%edx + int n; + + n = 0; + while ('0' <= *s && *s <= '9') { + 217: 0f be 02 movsbl (%edx),%eax + 21a: 8d 48 d0 lea -0x30(%eax),%ecx + 21d: 80 f9 09 cmp $0x9,%cl + n = 0; + 220: b9 00 00 00 00 mov $0x0,%ecx + while ('0' <= *s && *s <= '9') { + 225: 77 1e ja 245 + 227: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 22e: 66 90 xchg %ax,%ax + n = n * 10 + *s++ - '0'; + 230: 83 c2 01 add $0x1,%edx + 233: 8d 0c 89 lea (%ecx,%ecx,4),%ecx + 236: 8d 4c 48 d0 lea -0x30(%eax,%ecx,2),%ecx + while ('0' <= *s && *s <= '9') { + 23a: 0f be 02 movsbl (%edx),%eax + 23d: 8d 58 d0 lea -0x30(%eax),%ebx + 240: 80 fb 09 cmp $0x9,%bl + 243: 76 eb jbe 230 + } + return n; +} + 245: 8b 5d fc mov -0x4(%ebp),%ebx + 248: 89 c8 mov %ecx,%eax + 24a: c9 leave + 24b: c3 ret + 24c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + +00000250 : + +void* memmove(void *vdst, const void *vsrc, int n) { + 250: 55 push %ebp + 251: 89 e5 mov %esp,%ebp + 253: 57 push %edi + 254: 8b 45 10 mov 0x10(%ebp),%eax + 257: 8b 55 08 mov 0x8(%ebp),%edx + 25a: 56 push %esi + 25b: 8b 75 0c mov 0xc(%ebp),%esi + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + while (n-- > 0) { + 25e: 85 c0 test %eax,%eax + 260: 7e 13 jle 275 + 262: 01 d0 add %edx,%eax + dst = vdst; + 264: 89 d7 mov %edx,%edi + 266: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 26d: 8d 76 00 lea 0x0(%esi),%esi + *dst++ = *src++; + 270: a4 movsb %ds:(%esi),%es:(%edi) + while (n-- > 0) { + 271: 39 f8 cmp %edi,%eax + 273: 75 fb jne 270 + } + return vdst; +} + 275: 5e pop %esi + 276: 89 d0 mov %edx,%eax + 278: 5f pop %edi + 279: 5d pop %ebp + 27a: c3 ret + +0000027b : +name: \ + movl $SYS_ ## name, %eax; \ + int $T_SYSCALL; \ + ret + +SYSCALL(fork) + 27b: b8 01 00 00 00 mov $0x1,%eax + 280: cd 40 int $0x40 + 282: c3 ret + +00000283 : +SYSCALL(exit) + 283: b8 02 00 00 00 mov $0x2,%eax + 288: cd 40 int $0x40 + 28a: c3 ret + +0000028b : +SYSCALL(wait) + 28b: b8 03 00 00 00 mov $0x3,%eax + 290: cd 40 int $0x40 + 292: c3 ret + +00000293 : +SYSCALL(pipe) + 293: b8 04 00 00 00 mov $0x4,%eax + 298: cd 40 int $0x40 + 29a: c3 ret + +0000029b : +SYSCALL(read) + 29b: b8 05 00 00 00 mov $0x5,%eax + 2a0: cd 40 int $0x40 + 2a2: c3 ret + +000002a3 : +SYSCALL(kill) + 2a3: b8 06 00 00 00 mov $0x6,%eax + 2a8: cd 40 int $0x40 + 2aa: c3 ret + +000002ab : +SYSCALL(exec) + 2ab: b8 07 00 00 00 mov $0x7,%eax + 2b0: cd 40 int $0x40 + 2b2: c3 ret + +000002b3 : +SYSCALL(fstat) + 2b3: b8 08 00 00 00 mov $0x8,%eax + 2b8: cd 40 int $0x40 + 2ba: c3 ret + +000002bb : +SYSCALL(chdir) + 2bb: b8 09 00 00 00 mov $0x9,%eax + 2c0: cd 40 int $0x40 + 2c2: c3 ret + +000002c3 : +SYSCALL(dup) + 2c3: b8 0a 00 00 00 mov $0xa,%eax + 2c8: cd 40 int $0x40 + 2ca: c3 ret + +000002cb : +SYSCALL(getpid) + 2cb: b8 0b 00 00 00 mov $0xb,%eax + 2d0: cd 40 int $0x40 + 2d2: c3 ret + +000002d3 : +SYSCALL(sbrk) + 2d3: b8 0c 00 00 00 mov $0xc,%eax + 2d8: cd 40 int $0x40 + 2da: c3 ret + +000002db : +SYSCALL(sleep) + 2db: b8 0d 00 00 00 mov $0xd,%eax + 2e0: cd 40 int $0x40 + 2e2: c3 ret + +000002e3 : +SYSCALL(uptime) + 2e3: b8 0e 00 00 00 mov $0xe,%eax + 2e8: cd 40 int $0x40 + 2ea: c3 ret + +000002eb : +SYSCALL(open) + 2eb: b8 0f 00 00 00 mov $0xf,%eax + 2f0: cd 40 int $0x40 + 2f2: c3 ret + +000002f3 : +SYSCALL(write) + 2f3: b8 10 00 00 00 mov $0x10,%eax + 2f8: cd 40 int $0x40 + 2fa: c3 ret + +000002fb : +SYSCALL(mknod) + 2fb: b8 11 00 00 00 mov $0x11,%eax + 300: cd 40 int $0x40 + 302: c3 ret + +00000303 : +SYSCALL(unlink) + 303: b8 12 00 00 00 mov $0x12,%eax + 308: cd 40 int $0x40 + 30a: c3 ret + +0000030b : +SYSCALL(link) + 30b: b8 13 00 00 00 mov $0x13,%eax + 310: cd 40 int $0x40 + 312: c3 ret + +00000313 : +SYSCALL(mkdir) + 313: b8 14 00 00 00 mov $0x14,%eax + 318: cd 40 int $0x40 + 31a: c3 ret + +0000031b : +SYSCALL(close) + 31b: b8 15 00 00 00 mov $0x15,%eax + 320: cd 40 int $0x40 + 322: c3 ret + +00000323 : +SYSCALL(getch) + 323: b8 16 00 00 00 mov $0x16,%eax + 328: cd 40 int $0x40 + 32a: c3 ret + +0000032b : +SYSCALL(greeting) + 32b: b8 17 00 00 00 mov $0x17,%eax + 330: cd 40 int $0x40 + 332: c3 ret + +00000333 : +SYSCALL(shutdown) + 333: b8 18 00 00 00 mov $0x18,%eax + 338: cd 40 int $0x40 + 33a: c3 ret + +0000033b : +SYSCALL(screen) + 33b: b8 19 00 00 00 mov $0x19,%eax + 340: cd 40 int $0x40 + 342: c3 ret + +00000343 : +SYSCALL(cls) + 343: b8 1a 00 00 00 mov $0x1a,%eax + 348: cd 40 int $0x40 + 34a: c3 ret + 34b: 66 90 xchg %ax,%ax + 34d: 66 90 xchg %ax,%ax + 34f: 90 nop + +00000350 : + +static void putc(int fd, char c) { + write(fd, &c, 1); +} + +static void printint(int fd, int xx, int base, int sgn) { + 350: 55 push %ebp + 351: 89 e5 mov %esp,%ebp + 353: 57 push %edi + 354: 56 push %esi + 355: 53 push %ebx + 356: 83 ec 3c sub $0x3c,%esp + 359: 89 4d c4 mov %ecx,-0x3c(%ebp) + uint x; + + neg = 0; + if (sgn && xx < 0) { + neg = 1; + x = -xx; + 35c: 89 d1 mov %edx,%ecx +static void printint(int fd, int xx, int base, int sgn) { + 35e: 89 45 b8 mov %eax,-0x48(%ebp) + if (sgn && xx < 0) { + 361: 85 d2 test %edx,%edx + 363: 0f 89 7f 00 00 00 jns 3e8 + 369: f6 45 08 01 testb $0x1,0x8(%ebp) + 36d: 74 79 je 3e8 + neg = 1; + 36f: c7 45 bc 01 00 00 00 movl $0x1,-0x44(%ebp) + x = -xx; + 376: f7 d9 neg %ecx + } + else { + x = xx; + } + + i = 0; + 378: 31 db xor %ebx,%ebx + 37a: 8d 75 d7 lea -0x29(%ebp),%esi + 37d: 8d 76 00 lea 0x0(%esi),%esi + do { + buf[i++] = digits[x % base]; + 380: 89 c8 mov %ecx,%eax + 382: 31 d2 xor %edx,%edx + 384: 89 cf mov %ecx,%edi + 386: f7 75 c4 divl -0x3c(%ebp) + 389: 0f b6 92 88 07 00 00 movzbl 0x788(%edx),%edx + 390: 89 45 c0 mov %eax,-0x40(%ebp) + 393: 89 d8 mov %ebx,%eax + 395: 8d 5b 01 lea 0x1(%ebx),%ebx + } + while ((x /= base) != 0); + 398: 8b 4d c0 mov -0x40(%ebp),%ecx + buf[i++] = digits[x % base]; + 39b: 88 14 1e mov %dl,(%esi,%ebx,1) + while ((x /= base) != 0); + 39e: 39 7d c4 cmp %edi,-0x3c(%ebp) + 3a1: 76 dd jbe 380 + if (neg) { + 3a3: 8b 4d bc mov -0x44(%ebp),%ecx + 3a6: 85 c9 test %ecx,%ecx + 3a8: 74 0c je 3b6 + buf[i++] = '-'; + 3aa: c6 44 1d d8 2d movb $0x2d,-0x28(%ebp,%ebx,1) + buf[i++] = digits[x % base]; + 3af: 89 d8 mov %ebx,%eax + buf[i++] = '-'; + 3b1: ba 2d 00 00 00 mov $0x2d,%edx + } + + while (--i >= 0) { + 3b6: 8b 7d b8 mov -0x48(%ebp),%edi + 3b9: 8d 5c 05 d7 lea -0x29(%ebp,%eax,1),%ebx + 3bd: eb 07 jmp 3c6 + 3bf: 90 nop + putc(fd, buf[i]); + 3c0: 0f b6 13 movzbl (%ebx),%edx + 3c3: 83 eb 01 sub $0x1,%ebx + write(fd, &c, 1); + 3c6: 83 ec 04 sub $0x4,%esp + 3c9: 88 55 d7 mov %dl,-0x29(%ebp) + 3cc: 6a 01 push $0x1 + 3ce: 56 push %esi + 3cf: 57 push %edi + 3d0: e8 1e ff ff ff call 2f3 + while (--i >= 0) { + 3d5: 83 c4 10 add $0x10,%esp + 3d8: 39 de cmp %ebx,%esi + 3da: 75 e4 jne 3c0 + } +} + 3dc: 8d 65 f4 lea -0xc(%ebp),%esp + 3df: 5b pop %ebx + 3e0: 5e pop %esi + 3e1: 5f pop %edi + 3e2: 5d pop %ebp + 3e3: c3 ret + 3e4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + neg = 0; + 3e8: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp) + 3ef: eb 87 jmp 378 + 3f1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3f8: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 3ff: 90 nop + +00000400 : + +// Print to the given fd. Only understands %d, %x, %p, %s. +void printf(int fd, const char *fmt, ...) { + 400: 55 push %ebp + 401: 89 e5 mov %esp,%ebp + 403: 57 push %edi + 404: 56 push %esi + 405: 53 push %ebx + 406: 83 ec 2c sub $0x2c,%esp + int c, i, state; + uint *ap; + + state = 0; + ap = (uint*)(void*)&fmt + 1; + for (i = 0; fmt[i]; i++) { + 409: 8b 5d 0c mov 0xc(%ebp),%ebx +void printf(int fd, const char *fmt, ...) { + 40c: 8b 75 08 mov 0x8(%ebp),%esi + for (i = 0; fmt[i]; i++) { + 40f: 0f b6 13 movzbl (%ebx),%edx + 412: 84 d2 test %dl,%dl + 414: 74 6a je 480 + ap = (uint*)(void*)&fmt + 1; + 416: 8d 45 10 lea 0x10(%ebp),%eax + 419: 83 c3 01 add $0x1,%ebx + write(fd, &c, 1); + 41c: 8d 7d e7 lea -0x19(%ebp),%edi + state = 0; + 41f: 31 c9 xor %ecx,%ecx + ap = (uint*)(void*)&fmt + 1; + 421: 89 45 d0 mov %eax,-0x30(%ebp) + 424: eb 36 jmp 45c + 426: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 42d: 8d 76 00 lea 0x0(%esi),%esi + 430: 89 4d d4 mov %ecx,-0x2c(%ebp) + c = fmt[i] & 0xff; + if (state == 0) { + if (c == '%') { + state = '%'; + 433: b9 25 00 00 00 mov $0x25,%ecx + if (c == '%') { + 438: 83 f8 25 cmp $0x25,%eax + 43b: 74 15 je 452 + write(fd, &c, 1); + 43d: 83 ec 04 sub $0x4,%esp + 440: 88 55 e7 mov %dl,-0x19(%ebp) + 443: 6a 01 push $0x1 + 445: 57 push %edi + 446: 56 push %esi + 447: e8 a7 fe ff ff call 2f3 + 44c: 8b 4d d4 mov -0x2c(%ebp),%ecx + } + else { + putc(fd, c); + 44f: 83 c4 10 add $0x10,%esp + for (i = 0; fmt[i]; i++) { + 452: 0f b6 13 movzbl (%ebx),%edx + 455: 83 c3 01 add $0x1,%ebx + 458: 84 d2 test %dl,%dl + 45a: 74 24 je 480 + c = fmt[i] & 0xff; + 45c: 0f b6 c2 movzbl %dl,%eax + if (state == 0) { + 45f: 85 c9 test %ecx,%ecx + 461: 74 cd je 430 + } + } + else if (state == '%') { + 463: 83 f9 25 cmp $0x25,%ecx + 466: 75 ea jne 452 + if (c == 'd') { + 468: 83 f8 25 cmp $0x25,%eax + 46b: 0f 84 07 01 00 00 je 578 + 471: 83 e8 63 sub $0x63,%eax + 474: 83 f8 15 cmp $0x15,%eax + 477: 77 17 ja 490 + 479: ff 24 85 30 07 00 00 jmp *0x730(,%eax,4) + putc(fd, c); + } + state = 0; + } + } +} + 480: 8d 65 f4 lea -0xc(%ebp),%esp + 483: 5b pop %ebx + 484: 5e pop %esi + 485: 5f pop %edi + 486: 5d pop %ebp + 487: c3 ret + 488: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 48f: 90 nop + write(fd, &c, 1); + 490: 83 ec 04 sub $0x4,%esp + 493: 88 55 d4 mov %dl,-0x2c(%ebp) + 496: 6a 01 push $0x1 + 498: 57 push %edi + 499: 56 push %esi + 49a: c6 45 e7 25 movb $0x25,-0x19(%ebp) + 49e: e8 50 fe ff ff call 2f3 + putc(fd, c); + 4a3: 0f b6 55 d4 movzbl -0x2c(%ebp),%edx + write(fd, &c, 1); + 4a7: 83 c4 0c add $0xc,%esp + 4aa: 88 55 e7 mov %dl,-0x19(%ebp) + 4ad: 6a 01 push $0x1 + 4af: 57 push %edi + 4b0: 56 push %esi + 4b1: e8 3d fe ff ff call 2f3 + putc(fd, c); + 4b6: 83 c4 10 add $0x10,%esp + state = 0; + 4b9: 31 c9 xor %ecx,%ecx + 4bb: eb 95 jmp 452 + 4bd: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 16, 0); + 4c0: 83 ec 0c sub $0xc,%esp + 4c3: b9 10 00 00 00 mov $0x10,%ecx + 4c8: 6a 00 push $0x0 + 4ca: 8b 45 d0 mov -0x30(%ebp),%eax + 4cd: 8b 10 mov (%eax),%edx + 4cf: 89 f0 mov %esi,%eax + 4d1: e8 7a fe ff ff call 350 + ap++; + 4d6: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 4da: 83 c4 10 add $0x10,%esp + state = 0; + 4dd: 31 c9 xor %ecx,%ecx + 4df: e9 6e ff ff ff jmp 452 + 4e4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + s = (char*)*ap; + 4e8: 8b 45 d0 mov -0x30(%ebp),%eax + 4eb: 8b 10 mov (%eax),%edx + ap++; + 4ed: 83 c0 04 add $0x4,%eax + 4f0: 89 45 d0 mov %eax,-0x30(%ebp) + if (s == 0) { + 4f3: 85 d2 test %edx,%edx + 4f5: 0f 84 8d 00 00 00 je 588 + while (*s != 0) { + 4fb: 0f b6 02 movzbl (%edx),%eax + state = 0; + 4fe: 31 c9 xor %ecx,%ecx + while (*s != 0) { + 500: 84 c0 test %al,%al + 502: 0f 84 4a ff ff ff je 452 + 508: 89 5d d4 mov %ebx,-0x2c(%ebp) + 50b: 89 d3 mov %edx,%ebx + 50d: 8d 76 00 lea 0x0(%esi),%esi + write(fd, &c, 1); + 510: 83 ec 04 sub $0x4,%esp + s++; + 513: 83 c3 01 add $0x1,%ebx + 516: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 519: 6a 01 push $0x1 + 51b: 57 push %edi + 51c: 56 push %esi + 51d: e8 d1 fd ff ff call 2f3 + while (*s != 0) { + 522: 0f b6 03 movzbl (%ebx),%eax + 525: 83 c4 10 add $0x10,%esp + 528: 84 c0 test %al,%al + 52a: 75 e4 jne 510 + state = 0; + 52c: 8b 5d d4 mov -0x2c(%ebp),%ebx + 52f: 31 c9 xor %ecx,%ecx + 531: e9 1c ff ff ff jmp 452 + 536: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 53d: 8d 76 00 lea 0x0(%esi),%esi + printint(fd, *ap, 10, 1); + 540: 83 ec 0c sub $0xc,%esp + 543: b9 0a 00 00 00 mov $0xa,%ecx + 548: 6a 01 push $0x1 + 54a: e9 7b ff ff ff jmp 4ca + 54f: 90 nop + putc(fd, *ap); + 550: 8b 45 d0 mov -0x30(%ebp),%eax + write(fd, &c, 1); + 553: 83 ec 04 sub $0x4,%esp + putc(fd, *ap); + 556: 8b 00 mov (%eax),%eax + write(fd, &c, 1); + 558: 6a 01 push $0x1 + 55a: 57 push %edi + 55b: 56 push %esi + putc(fd, *ap); + 55c: 88 45 e7 mov %al,-0x19(%ebp) + write(fd, &c, 1); + 55f: e8 8f fd ff ff call 2f3 + ap++; + 564: 83 45 d0 04 addl $0x4,-0x30(%ebp) + 568: 83 c4 10 add $0x10,%esp + state = 0; + 56b: 31 c9 xor %ecx,%ecx + 56d: e9 e0 fe ff ff jmp 452 + 572: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + putc(fd, c); + 578: 88 55 e7 mov %dl,-0x19(%ebp) + write(fd, &c, 1); + 57b: 83 ec 04 sub $0x4,%esp + 57e: e9 2a ff ff ff jmp 4ad + 583: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 587: 90 nop + s = "(null)"; + 588: ba 28 07 00 00 mov $0x728,%edx + while (*s != 0) { + 58d: 89 5d d4 mov %ebx,-0x2c(%ebp) + 590: b8 28 00 00 00 mov $0x28,%eax + 595: 89 d3 mov %edx,%ebx + 597: e9 74 ff ff ff jmp 510 + 59c: 66 90 xchg %ax,%ax + 59e: 66 90 xchg %ax,%ax + +000005a0 : +typedef union header Header; + +static Header base; +static Header *freep; + +void free(void *ap) { + 5a0: 55 push %ebp + Header *bp, *p; + + bp = (Header*)ap - 1; + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5a1: a1 30 0a 00 00 mov 0xa30,%eax +void free(void *ap) { + 5a6: 89 e5 mov %esp,%ebp + 5a8: 57 push %edi + 5a9: 56 push %esi + 5aa: 53 push %ebx + 5ab: 8b 5d 08 mov 0x8(%ebp),%ebx + bp = (Header*)ap - 1; + 5ae: 8d 4b f8 lea -0x8(%ebx),%ecx + for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) { + 5b1: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi + 5b8: 89 c2 mov %eax,%edx + 5ba: 8b 00 mov (%eax),%eax + 5bc: 39 ca cmp %ecx,%edx + 5be: 73 30 jae 5f0 + 5c0: 39 c1 cmp %eax,%ecx + 5c2: 72 04 jb 5c8 + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5c4: 39 c2 cmp %eax,%edx + 5c6: 72 f0 jb 5b8 + break; + } + } + if (bp + bp->s.size == p->s.ptr) { + 5c8: 8b 73 fc mov -0x4(%ebx),%esi + 5cb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5ce: 39 f8 cmp %edi,%eax + 5d0: 74 30 je 602 + bp->s.size += p->s.ptr->s.size; + bp->s.ptr = p->s.ptr->s.ptr; + 5d2: 89 43 f8 mov %eax,-0x8(%ebx) + } + else { + bp->s.ptr = p->s.ptr; + } + if (p + p->s.size == bp) { + 5d5: 8b 42 04 mov 0x4(%edx),%eax + 5d8: 8d 34 c2 lea (%edx,%eax,8),%esi + 5db: 39 f1 cmp %esi,%ecx + 5dd: 74 3a je 619 + p->s.size += bp->s.size; + p->s.ptr = bp->s.ptr; + 5df: 89 0a mov %ecx,(%edx) + } + else { + p->s.ptr = bp; + } + freep = p; +} + 5e1: 5b pop %ebx + freep = p; + 5e2: 89 15 30 0a 00 00 mov %edx,0xa30 +} + 5e8: 5e pop %esi + 5e9: 5f pop %edi + 5ea: 5d pop %ebp + 5eb: c3 ret + 5ec: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) { + 5f0: 39 c2 cmp %eax,%edx + 5f2: 72 c4 jb 5b8 + 5f4: 39 c1 cmp %eax,%ecx + 5f6: 73 c0 jae 5b8 + if (bp + bp->s.size == p->s.ptr) { + 5f8: 8b 73 fc mov -0x4(%ebx),%esi + 5fb: 8d 3c f1 lea (%ecx,%esi,8),%edi + 5fe: 39 f8 cmp %edi,%eax + 600: 75 d0 jne 5d2 + bp->s.size += p->s.ptr->s.size; + 602: 03 70 04 add 0x4(%eax),%esi + 605: 89 73 fc mov %esi,-0x4(%ebx) + bp->s.ptr = p->s.ptr->s.ptr; + 608: 8b 02 mov (%edx),%eax + 60a: 8b 00 mov (%eax),%eax + 60c: 89 43 f8 mov %eax,-0x8(%ebx) + if (p + p->s.size == bp) { + 60f: 8b 42 04 mov 0x4(%edx),%eax + 612: 8d 34 c2 lea (%edx,%eax,8),%esi + 615: 39 f1 cmp %esi,%ecx + 617: 75 c6 jne 5df + p->s.size += bp->s.size; + 619: 03 43 fc add -0x4(%ebx),%eax + freep = p; + 61c: 89 15 30 0a 00 00 mov %edx,0xa30 + p->s.size += bp->s.size; + 622: 89 42 04 mov %eax,0x4(%edx) + p->s.ptr = bp->s.ptr; + 625: 8b 4b f8 mov -0x8(%ebx),%ecx + 628: 89 0a mov %ecx,(%edx) +} + 62a: 5b pop %ebx + 62b: 5e pop %esi + 62c: 5f pop %edi + 62d: 5d pop %ebp + 62e: c3 ret + 62f: 90 nop + +00000630 : + hp->s.size = nu; + free((void*)(hp + 1)); + return freep; +} + +void* malloc(uint nbytes) { + 630: 55 push %ebp + 631: 89 e5 mov %esp,%ebp + 633: 57 push %edi + 634: 56 push %esi + 635: 53 push %ebx + 636: 83 ec 1c sub $0x1c,%esp + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 639: 8b 45 08 mov 0x8(%ebp),%eax + if ((prevp = freep) == 0) { + 63c: 8b 3d 30 0a 00 00 mov 0xa30,%edi + nunits = (nbytes + sizeof(Header) - 1) / sizeof(Header) + 1; + 642: 8d 70 07 lea 0x7(%eax),%esi + 645: c1 ee 03 shr $0x3,%esi + 648: 83 c6 01 add $0x1,%esi + if ((prevp = freep) == 0) { + 64b: 85 ff test %edi,%edi + 64d: 0f 84 9d 00 00 00 je 6f0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 653: 8b 17 mov (%edi),%edx + if (p->s.size >= nunits) { + 655: 8b 4a 04 mov 0x4(%edx),%ecx + 658: 39 f1 cmp %esi,%ecx + 65a: 73 6a jae 6c6 + 65c: bb 00 10 00 00 mov $0x1000,%ebx + 661: 39 de cmp %ebx,%esi + 663: 0f 43 de cmovae %esi,%ebx + p = sbrk(nu * sizeof(Header)); + 666: 8d 04 dd 00 00 00 00 lea 0x0(,%ebx,8),%eax + 66d: 89 45 e4 mov %eax,-0x1c(%ebp) + 670: eb 17 jmp 689 + 672: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 678: 8b 02 mov (%edx),%eax + if (p->s.size >= nunits) { + 67a: 8b 48 04 mov 0x4(%eax),%ecx + 67d: 39 f1 cmp %esi,%ecx + 67f: 73 4f jae 6d0 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if (p == freep) { + 681: 8b 3d 30 0a 00 00 mov 0xa30,%edi + 687: 89 c2 mov %eax,%edx + 689: 39 d7 cmp %edx,%edi + 68b: 75 eb jne 678 + p = sbrk(nu * sizeof(Header)); + 68d: 83 ec 0c sub $0xc,%esp + 690: ff 75 e4 push -0x1c(%ebp) + 693: e8 3b fc ff ff call 2d3 + if (p == (char*)-1) { + 698: 83 c4 10 add $0x10,%esp + 69b: 83 f8 ff cmp $0xffffffff,%eax + 69e: 74 1c je 6bc + hp->s.size = nu; + 6a0: 89 58 04 mov %ebx,0x4(%eax) + free((void*)(hp + 1)); + 6a3: 83 ec 0c sub $0xc,%esp + 6a6: 83 c0 08 add $0x8,%eax + 6a9: 50 push %eax + 6aa: e8 f1 fe ff ff call 5a0 + return freep; + 6af: 8b 15 30 0a 00 00 mov 0xa30,%edx + if ((p = morecore(nunits)) == 0) { + 6b5: 83 c4 10 add $0x10,%esp + 6b8: 85 d2 test %edx,%edx + 6ba: 75 bc jne 678 + return 0; + } + } + } +} + 6bc: 8d 65 f4 lea -0xc(%ebp),%esp + return 0; + 6bf: 31 c0 xor %eax,%eax +} + 6c1: 5b pop %ebx + 6c2: 5e pop %esi + 6c3: 5f pop %edi + 6c4: 5d pop %ebp + 6c5: c3 ret + if (p->s.size >= nunits) { + 6c6: 89 d0 mov %edx,%eax + 6c8: 89 fa mov %edi,%edx + 6ca: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + if (p->s.size == nunits) { + 6d0: 39 ce cmp %ecx,%esi + 6d2: 74 4c je 720 + p->s.size -= nunits; + 6d4: 29 f1 sub %esi,%ecx + 6d6: 89 48 04 mov %ecx,0x4(%eax) + p += p->s.size; + 6d9: 8d 04 c8 lea (%eax,%ecx,8),%eax + p->s.size = nunits; + 6dc: 89 70 04 mov %esi,0x4(%eax) + freep = prevp; + 6df: 89 15 30 0a 00 00 mov %edx,0xa30 +} + 6e5: 8d 65 f4 lea -0xc(%ebp),%esp + return (void*)(p + 1); + 6e8: 83 c0 08 add $0x8,%eax +} + 6eb: 5b pop %ebx + 6ec: 5e pop %esi + 6ed: 5f pop %edi + 6ee: 5d pop %ebp + 6ef: c3 ret + base.s.ptr = freep = prevp = &base; + 6f0: c7 05 30 0a 00 00 34 movl $0xa34,0xa30 + 6f7: 0a 00 00 + base.s.size = 0; + 6fa: bf 34 0a 00 00 mov $0xa34,%edi + base.s.ptr = freep = prevp = &base; + 6ff: c7 05 34 0a 00 00 34 movl $0xa34,0xa34 + 706: 0a 00 00 + for (p = prevp->s.ptr;; prevp = p, p = p->s.ptr) { + 709: 89 fa mov %edi,%edx + base.s.size = 0; + 70b: c7 05 38 0a 00 00 00 movl $0x0,0xa38 + 712: 00 00 00 + if (p->s.size >= nunits) { + 715: e9 42 ff ff ff jmp 65c + 71a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi + prevp->s.ptr = p->s.ptr; + 720: 8b 08 mov (%eax),%ecx + 722: 89 0a mov %ecx,(%edx) + 724: eb b9 jmp 6df diff --git a/zombie.d b/zombie.d new file mode 100644 index 0000000..c3e36f5 --- /dev/null +++ b/zombie.d @@ -0,0 +1 @@ +zombie.o: zombie.c /usr/include/stdc-predef.h types.h stat.h user.h diff --git a/zombie.o b/zombie.o new file mode 100644 index 0000000000000000000000000000000000000000..db656c227ee3ad2275017fc1c25a284015dab977 GIT binary patch literal 2708 zcma)7O=uid9Di?TC)v1Zl1*xxm}*vuG?nh8NlU7=t!Znm(Ne#N3W{-dGua)xI}_(a zlTzD5km^AZJQP91lLrraQ1I%ZAgG`RJu9N%p$7$T4aDE?&3nnDQ0O1t{Qe)m_kUmi z_vZ5HvyVwBg%K$%v1JMIOIH>-q+mh}i`|B*@V&F+#kD{G*?4_@{@uTxS-W2RdwpYL zBBS~4}>}0`y09LVR z`#~b?LFk1p`y`<22K8a3pNHB_rzq{9*H+%1ekLd>ow5CB^5eoT06P@M@tLQ>z#JOF zkpq}rQPWCTmm?k-vHFgbA1*&s-a9fk zbVZIF9l`V*x!r$sL?T(YE#?5Fn|rZK&&^#baUXzrET)l*o&N&5NA%EI#QjOuctwh>OHJYrOKSTG(GJcIJ8f@ zh1kh+gvble3VE?4M|+FKcX04k_*hI7RX~sSN-;NJ7gBMe-%2m)Yo8JHmo;OgDE{3r zI?>7%WM*&AUhfI+H6OmBkNi(3lhtHl{g+$!=UoP0ru97ozh+(*Q+_YuK6pz*NA z;~JmP_`Jrp#ubfgMBKagHD1;DsYdRsw6Zmlr{)Dz<6}PDAI@t^L7EQKH|-L2On?~Q!a zjohH==@c0$3Yu*{PPX~le&CrTn1xa4UQl);?C=5!C&2x6@P^dXz08L4S_|sJV^y~; zqhPY8O{Hf4xUKG{-tW~sY`KzK@%WBn+fmDz+={2_0u(duEOefk5ml=&=<7k7MWghh z#)g4+qVf4><9H|0%v_-g*3;)yw3ry{FQ0E5`96S;`8XGok3Rs@2ddZw<0C3sOzc(I zMrY_t7*#4-OzdUY`EkF-xLhO0rQeJjLpOb(il1QMC%Gvm7Q&OycMbWt56s6`#pJsJ z-SmMf{(!MSMT?2?zUA}%h<;mxBUUV+bu z;e7!Ib;J7#ynG!P-Zz?O`u}DMOgqS<{D4NCSDW%Xct