diff --git a/fs.img b/fs.img new file mode 100644 index 0000000000000000000000000000000000000000..034205224950365a6513e4170cb6c88b03806acd Binary files /dev/null and b/fs.img differ diff --git a/kernel/bio.d b/kernel/bio.d new file mode 100644 index 0000000000000000000000000000000000000000..8d73dc8a9fcfaf9186460fdcef4824063ea7ff9d --- /dev/null +++ b/kernel/bio.d @@ -0,0 +1,3 @@ +kernel/bio.o: kernel/bio.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/spinlock.h kernel/sleeplock.h \ + kernel/riscv.h kernel/defs.h kernel/fs.h kernel/buf.h diff --git a/kernel/bio.o b/kernel/bio.o new file mode 100644 index 0000000000000000000000000000000000000000..a3d632ad27eded7a4a0161d621bcd3df8f0b9f9b Binary files /dev/null and b/kernel/bio.o differ diff --git a/kernel/console.d b/kernel/console.d new file mode 100644 index 0000000000000000000000000000000000000000..dcf3a94e3fe1df8dccb7287b7fd61424f3f89b79 --- /dev/null +++ b/kernel/console.d @@ -0,0 +1,6 @@ +kernel/console.o: kernel/console.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h \ + /usr/lib/gcc-cross/riscv64-linux-gnu/11/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/kernel/console.o b/kernel/console.o new file mode 100644 index 0000000000000000000000000000000000000000..ffcaade723d7299af840868beac0882fb27fc44c Binary files /dev/null and b/kernel/console.o differ diff --git a/kernel/entry.o b/kernel/entry.o new file mode 100644 index 0000000000000000000000000000000000000000..e7dc260ed4d22c454f040271d969d91a731f79d9 Binary files /dev/null and b/kernel/entry.o differ diff --git a/kernel/exec.d b/kernel/exec.d new file mode 100644 index 0000000000000000000000000000000000000000..75a3efe07eb6fad474345f406015009652c63df2 --- /dev/null +++ b/kernel/exec.d @@ -0,0 +1,3 @@ +kernel/exec.o: kernel/exec.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/spinlock.h kernel/proc.h kernel/defs.h kernel/elf.h diff --git a/kernel/exec.o b/kernel/exec.o new file mode 100644 index 0000000000000000000000000000000000000000..722a107a528f36871a2ffdf2dd95ef25f33f5afa Binary files /dev/null and b/kernel/exec.o differ diff --git a/kernel/file.d b/kernel/file.d new file mode 100644 index 0000000000000000000000000000000000000000..235efb6bdc34bdbae1bfa0764b27c6015b783253 --- /dev/null +++ b/kernel/file.d @@ -0,0 +1,4 @@ +kernel/file.o: kernel/file.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/riscv.h kernel/defs.h kernel/param.h kernel/fs.h \ + kernel/spinlock.h kernel/sleeplock.h kernel/file.h kernel/stat.h \ + kernel/proc.h diff --git a/kernel/file.o b/kernel/file.o new file mode 100644 index 0000000000000000000000000000000000000000..d7544a2d7715742429432da48237765d54a43414 Binary files /dev/null and b/kernel/file.o differ diff --git a/kernel/fs.d b/kernel/fs.d new file mode 100644 index 0000000000000000000000000000000000000000..2024e285740b7ff8df015c5ff006bc84ce7fca50 --- /dev/null +++ b/kernel/fs.d @@ -0,0 +1,4 @@ +kernel/fs.o: kernel/fs.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/riscv.h kernel/defs.h kernel/param.h kernel/stat.h \ + kernel/spinlock.h kernel/proc.h kernel/sleeplock.h kernel/fs.h \ + kernel/buf.h kernel/file.h diff --git a/kernel/fs.o b/kernel/fs.o new file mode 100644 index 0000000000000000000000000000000000000000..75d1351dc718168a45c2acaaa0234450f44b4ad1 Binary files /dev/null and b/kernel/fs.o differ diff --git a/kernel/kalloc.d b/kernel/kalloc.d new file mode 100644 index 0000000000000000000000000000000000000000..8c27a1cbce1ff112b5ef00e1d4ed4cf3c77989cb --- /dev/null +++ b/kernel/kalloc.d @@ -0,0 +1,4 @@ +kernel/kalloc.o: kernel/kalloc.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/param.h kernel/memlayout.h kernel/spinlock.h kernel/riscv.h \ + kernel/defs.h diff --git a/kernel/kalloc.o b/kernel/kalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..95a552b6167a441377fdd4bac481c8954a0385bb Binary files /dev/null and b/kernel/kalloc.o differ diff --git a/kernel/kernel b/kernel/kernel new file mode 100755 index 0000000000000000000000000000000000000000..93ab5aee28a4e9305171346047acd4b6cb423007 Binary files /dev/null and b/kernel/kernel differ diff --git a/kernel/kernel.asm b/kernel/kernel.asm new file mode 100644 index 0000000000000000000000000000000000000000..3155e47ec38cb07eb5d1ecd943fcf62d25f92926 --- /dev/null +++ b/kernel/kernel.asm @@ -0,0 +1,12492 @@ + +kernel/kernel: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000080000000 <_entry>: + 80000000: 00008117 auipc sp,0x8 + 80000004: a6013103 ld sp,-1440(sp) # 80007a60 <_GLOBAL_OFFSET_TABLE_+0x8> + 80000008: 6505 lui a0,0x1 + 8000000a: f14025f3 csrr a1,mhartid + 8000000e: 0585 addi a1,a1,1 + 80000010: 02b50533 mul a0,a0,a1 + 80000014: 912a add sp,sp,a0 + 80000016: 04a000ef jal ra,80000060 <start> + +000000008000001a <spin>: + 8000001a: a001 j 8000001a <spin> + +000000008000001c <timerinit>: +} + +// ask each hart to generate timer interrupts. +void +timerinit() +{ + 8000001c: 1141 addi sp,sp,-16 + 8000001e: e422 sd s0,8(sp) + 80000020: 0800 addi s0,sp,16 +#define MIE_STIE (1L << 5) // supervisor timer +static inline uint64 +r_mie() +{ + uint64 x; + asm volatile("csrr %0, mie" : "=r" (x) ); + 80000022: 304027f3 csrr a5,mie + // enable supervisor-mode timer interrupts. + w_mie(r_mie() | MIE_STIE); + 80000026: 0207e793 ori a5,a5,32 +} + +static inline void +w_mie(uint64 x) +{ + asm volatile("csrw mie, %0" : : "r" (x)); + 8000002a: 30479073 csrw mie,a5 +static inline uint64 +r_menvcfg() +{ + uint64 x; + // asm volatile("csrr %0, menvcfg" : "=r" (x) ); + asm volatile("csrr %0, 0x30a" : "=r" (x) ); + 8000002e: 30a027f3 csrr a5,0x30a + + // enable the sstc extension (i.e. stimecmp). + w_menvcfg(r_menvcfg() | (1L << 63)); + 80000032: 577d li a4,-1 + 80000034: 177e slli a4,a4,0x3f + 80000036: 8fd9 or a5,a5,a4 + +static inline void +w_menvcfg(uint64 x) +{ + // asm volatile("csrw menvcfg, %0" : : "r" (x)); + asm volatile("csrw 0x30a, %0" : : "r" (x)); + 80000038: 30a79073 csrw 0x30a,a5 + +static inline uint64 +r_mcounteren() +{ + uint64 x; + asm volatile("csrr %0, mcounteren" : "=r" (x) ); + 8000003c: 306027f3 csrr a5,mcounteren + + // allow supervisor to use stimecmp and time. + w_mcounteren(r_mcounteren() | 2); + 80000040: 0027e793 ori a5,a5,2 + asm volatile("csrw mcounteren, %0" : : "r" (x)); + 80000044: 30679073 csrw mcounteren,a5 +// machine-mode cycle counter +static inline uint64 +r_time() +{ + uint64 x; + asm volatile("csrr %0, time" : "=r" (x) ); + 80000048: c01027f3 rdtime a5 + + // ask for the very first timer interrupt. + w_stimecmp(r_time() + 1000000); + 8000004c: 000f4737 lui a4,0xf4 + 80000050: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 80000054: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 80000056: 14d79073 csrw 0x14d,a5 +} + 8000005a: 6422 ld s0,8(sp) + 8000005c: 0141 addi sp,sp,16 + 8000005e: 8082 ret + +0000000080000060 <start>: +{ + 80000060: 1141 addi sp,sp,-16 + 80000062: e406 sd ra,8(sp) + 80000064: e022 sd s0,0(sp) + 80000066: 0800 addi s0,sp,16 + asm volatile("csrr %0, mstatus" : "=r" (x) ); + 80000068: 300027f3 csrr a5,mstatus + x &= ~MSTATUS_MPP_MASK; + 8000006c: 7779 lui a4,0xffffe + 8000006e: 7ff70713 addi a4,a4,2047 # ffffffffffffe7ff <end+0xffffffff7ffdc00f> + 80000072: 8ff9 and a5,a5,a4 + x |= MSTATUS_MPP_S; + 80000074: 6705 lui a4,0x1 + 80000076: 80070713 addi a4,a4,-2048 # 800 <_entry-0x7ffff800> + 8000007a: 8fd9 or a5,a5,a4 + asm volatile("csrw mstatus, %0" : : "r" (x)); + 8000007c: 30079073 csrw mstatus,a5 + asm volatile("csrw mepc, %0" : : "r" (x)); + 80000080: 00001797 auipc a5,0x1 + 80000084: d8e78793 addi a5,a5,-626 # 80000e0e <main> + 80000088: 34179073 csrw mepc,a5 + asm volatile("csrw satp, %0" : : "r" (x)); + 8000008c: 4781 li a5,0 + 8000008e: 18079073 csrw satp,a5 + asm volatile("csrw medeleg, %0" : : "r" (x)); + 80000092: 67c1 lui a5,0x10 + 80000094: 17fd addi a5,a5,-1 # ffff <_entry-0x7fff0001> + 80000096: 30279073 csrw medeleg,a5 + asm volatile("csrw mideleg, %0" : : "r" (x)); + 8000009a: 30379073 csrw mideleg,a5 + asm volatile("csrr %0, sie" : "=r" (x) ); + 8000009e: 104027f3 csrr a5,sie + w_sie(r_sie() | SIE_SEIE | SIE_STIE | SIE_SSIE); + 800000a2: 2227e793 ori a5,a5,546 + asm volatile("csrw sie, %0" : : "r" (x)); + 800000a6: 10479073 csrw sie,a5 + asm volatile("csrw pmpaddr0, %0" : : "r" (x)); + 800000aa: 57fd li a5,-1 + 800000ac: 83a9 srli a5,a5,0xa + 800000ae: 3b079073 csrw pmpaddr0,a5 + asm volatile("csrw pmpcfg0, %0" : : "r" (x)); + 800000b2: 47bd li a5,15 + 800000b4: 3a079073 csrw pmpcfg0,a5 + timerinit(); + 800000b8: f65ff0ef jal ra,8000001c <timerinit> + asm volatile("csrr %0, mhartid" : "=r" (x) ); + 800000bc: f14027f3 csrr a5,mhartid + w_tp(id); + 800000c0: 2781 sext.w a5,a5 +} + +static inline void +w_tp(uint64 x) +{ + asm volatile("mv tp, %0" : : "r" (x)); + 800000c2: 823e mv tp,a5 + asm volatile("mret"); + 800000c4: 30200073 mret +} + 800000c8: 60a2 ld ra,8(sp) + 800000ca: 6402 ld s0,0(sp) + 800000cc: 0141 addi sp,sp,16 + 800000ce: 8082 ret + +00000000800000d0 <consolewrite>: +// +// user write()s to the console go here. +// +int +consolewrite(int user_src, uint64 src, int n) +{ + 800000d0: 715d addi sp,sp,-80 + 800000d2: e486 sd ra,72(sp) + 800000d4: e0a2 sd s0,64(sp) + 800000d6: fc26 sd s1,56(sp) + 800000d8: f84a sd s2,48(sp) + 800000da: f44e sd s3,40(sp) + 800000dc: f052 sd s4,32(sp) + 800000de: ec56 sd s5,24(sp) + 800000e0: 0880 addi s0,sp,80 + int i; + + for(i = 0; i < n; i++){ + 800000e2: 04c05363 blez a2,80000128 <consolewrite+0x58> + 800000e6: 8a2a mv s4,a0 + 800000e8: 84ae mv s1,a1 + 800000ea: 89b2 mv s3,a2 + 800000ec: 4901 li s2,0 + char c; + if(either_copyin(&c, user_src, src+i, 1) == -1) + 800000ee: 5afd li s5,-1 + 800000f0: 4685 li a3,1 + 800000f2: 8626 mv a2,s1 + 800000f4: 85d2 mv a1,s4 + 800000f6: fbf40513 addi a0,s0,-65 + 800000fa: 0c8020ef jal ra,800021c2 <either_copyin> + 800000fe: 01550b63 beq a0,s5,80000114 <consolewrite+0x44> + break; + uartputc(c); + 80000102: fbf44503 lbu a0,-65(s0) + 80000106: 7da000ef jal ra,800008e0 <uartputc> + for(i = 0; i < n; i++){ + 8000010a: 2905 addiw s2,s2,1 + 8000010c: 0485 addi s1,s1,1 + 8000010e: ff2991e3 bne s3,s2,800000f0 <consolewrite+0x20> + 80000112: 894e mv s2,s3 + } + + return i; +} + 80000114: 854a mv a0,s2 + 80000116: 60a6 ld ra,72(sp) + 80000118: 6406 ld s0,64(sp) + 8000011a: 74e2 ld s1,56(sp) + 8000011c: 7942 ld s2,48(sp) + 8000011e: 79a2 ld s3,40(sp) + 80000120: 7a02 ld s4,32(sp) + 80000122: 6ae2 ld s5,24(sp) + 80000124: 6161 addi sp,sp,80 + 80000126: 8082 ret + for(i = 0; i < n; i++){ + 80000128: 4901 li s2,0 + 8000012a: b7ed j 80000114 <consolewrite+0x44> + +000000008000012c <consoleread>: +// user_dist indicates whether dst is a user +// or kernel address. +// +int +consoleread(int user_dst, uint64 dst, int n) +{ + 8000012c: 7159 addi sp,sp,-112 + 8000012e: f486 sd ra,104(sp) + 80000130: f0a2 sd s0,96(sp) + 80000132: eca6 sd s1,88(sp) + 80000134: e8ca sd s2,80(sp) + 80000136: e4ce sd s3,72(sp) + 80000138: e0d2 sd s4,64(sp) + 8000013a: fc56 sd s5,56(sp) + 8000013c: f85a sd s6,48(sp) + 8000013e: f45e sd s7,40(sp) + 80000140: f062 sd s8,32(sp) + 80000142: ec66 sd s9,24(sp) + 80000144: e86a sd s10,16(sp) + 80000146: 1880 addi s0,sp,112 + 80000148: 8aaa mv s5,a0 + 8000014a: 8a2e mv s4,a1 + 8000014c: 89b2 mv s3,a2 + uint target; + int c; + char cbuf; + + target = n; + 8000014e: 00060b1b sext.w s6,a2 + acquire(&cons.lock); + 80000152: 00010517 auipc a0,0x10 + 80000156: 96e50513 addi a0,a0,-1682 # 8000fac0 <cons> + 8000015a: 23f000ef jal ra,80000b98 <acquire> + while(n > 0){ + // wait until interrupt handler has put some + // input into cons.buffer. + while(cons.r == cons.w){ + 8000015e: 00010497 auipc s1,0x10 + 80000162: 96248493 addi s1,s1,-1694 # 8000fac0 <cons> + if(killed(myproc())){ + release(&cons.lock); + return -1; + } + sleep(&cons.r, &cons.lock); + 80000166: 00010917 auipc s2,0x10 + 8000016a: 9f290913 addi s2,s2,-1550 # 8000fb58 <cons+0x98> + } + + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; + + if(c == C('D')){ // end-of-file + 8000016e: 4b91 li s7,4 + break; + } + + // copy the input byte to the user-space buffer. + cbuf = c; + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) + 80000170: 5c7d li s8,-1 + break; + + dst++; + --n; + + if(c == '\n'){ + 80000172: 4ca9 li s9,10 + while(n > 0){ + 80000174: 07305363 blez s3,800001da <consoleread+0xae> + while(cons.r == cons.w){ + 80000178: 0984a783 lw a5,152(s1) + 8000017c: 09c4a703 lw a4,156(s1) + 80000180: 02f71163 bne a4,a5,800001a2 <consoleread+0x76> + if(killed(myproc())){ + 80000184: 6a6010ef jal ra,8000182a <myproc> + 80000188: 6cd010ef jal ra,80002054 <killed> + 8000018c: e125 bnez a0,800001ec <consoleread+0xc0> + sleep(&cons.r, &cons.lock); + 8000018e: 85a6 mv a1,s1 + 80000190: 854a mv a0,s2 + 80000192: 48b010ef jal ra,80001e1c <sleep> + while(cons.r == cons.w){ + 80000196: 0984a783 lw a5,152(s1) + 8000019a: 09c4a703 lw a4,156(s1) + 8000019e: fef703e3 beq a4,a5,80000184 <consoleread+0x58> + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; + 800001a2: 0017871b addiw a4,a5,1 + 800001a6: 08e4ac23 sw a4,152(s1) + 800001aa: 07f7f713 andi a4,a5,127 + 800001ae: 9726 add a4,a4,s1 + 800001b0: 01874703 lbu a4,24(a4) + 800001b4: 00070d1b sext.w s10,a4 + if(c == C('D')){ // end-of-file + 800001b8: 057d0f63 beq s10,s7,80000216 <consoleread+0xea> + cbuf = c; + 800001bc: f8e40fa3 sb a4,-97(s0) + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) + 800001c0: 4685 li a3,1 + 800001c2: f9f40613 addi a2,s0,-97 + 800001c6: 85d2 mv a1,s4 + 800001c8: 8556 mv a0,s5 + 800001ca: 7af010ef jal ra,80002178 <either_copyout> + 800001ce: 01850663 beq a0,s8,800001da <consoleread+0xae> + dst++; + 800001d2: 0a05 addi s4,s4,1 + --n; + 800001d4: 39fd addiw s3,s3,-1 + if(c == '\n'){ + 800001d6: f99d1fe3 bne s10,s9,80000174 <consoleread+0x48> + // a whole line has arrived, return to + // the user-level read(). + break; + } + } + release(&cons.lock); + 800001da: 00010517 auipc a0,0x10 + 800001de: 8e650513 addi a0,a0,-1818 # 8000fac0 <cons> + 800001e2: 24f000ef jal ra,80000c30 <release> + + return target - n; + 800001e6: 413b053b subw a0,s6,s3 + 800001ea: a801 j 800001fa <consoleread+0xce> + release(&cons.lock); + 800001ec: 00010517 auipc a0,0x10 + 800001f0: 8d450513 addi a0,a0,-1836 # 8000fac0 <cons> + 800001f4: 23d000ef jal ra,80000c30 <release> + return -1; + 800001f8: 557d li a0,-1 +} + 800001fa: 70a6 ld ra,104(sp) + 800001fc: 7406 ld s0,96(sp) + 800001fe: 64e6 ld s1,88(sp) + 80000200: 6946 ld s2,80(sp) + 80000202: 69a6 ld s3,72(sp) + 80000204: 6a06 ld s4,64(sp) + 80000206: 7ae2 ld s5,56(sp) + 80000208: 7b42 ld s6,48(sp) + 8000020a: 7ba2 ld s7,40(sp) + 8000020c: 7c02 ld s8,32(sp) + 8000020e: 6ce2 ld s9,24(sp) + 80000210: 6d42 ld s10,16(sp) + 80000212: 6165 addi sp,sp,112 + 80000214: 8082 ret + if(n < target){ + 80000216: 0009871b sext.w a4,s3 + 8000021a: fd6770e3 bgeu a4,s6,800001da <consoleread+0xae> + cons.r--; + 8000021e: 00010717 auipc a4,0x10 + 80000222: 92f72d23 sw a5,-1734(a4) # 8000fb58 <cons+0x98> + 80000226: bf55 j 800001da <consoleread+0xae> + +0000000080000228 <consputc>: +{ + 80000228: 1141 addi sp,sp,-16 + 8000022a: e406 sd ra,8(sp) + 8000022c: e022 sd s0,0(sp) + 8000022e: 0800 addi s0,sp,16 + if(c == BACKSPACE){ + 80000230: 10000793 li a5,256 + 80000234: 00f50863 beq a0,a5,80000244 <consputc+0x1c> + uartputc_sync(c); + 80000238: 5d2000ef jal ra,8000080a <uartputc_sync> +} + 8000023c: 60a2 ld ra,8(sp) + 8000023e: 6402 ld s0,0(sp) + 80000240: 0141 addi sp,sp,16 + 80000242: 8082 ret + uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); + 80000244: 4521 li a0,8 + 80000246: 5c4000ef jal ra,8000080a <uartputc_sync> + 8000024a: 02000513 li a0,32 + 8000024e: 5bc000ef jal ra,8000080a <uartputc_sync> + 80000252: 4521 li a0,8 + 80000254: 5b6000ef jal ra,8000080a <uartputc_sync> + 80000258: b7d5 j 8000023c <consputc+0x14> + +000000008000025a <consoleintr>: +// do erase/kill processing, append to cons.buf, +// wake up consoleread() if a whole line has arrived. +// +void +consoleintr(int c) +{ + 8000025a: 1101 addi sp,sp,-32 + 8000025c: ec06 sd ra,24(sp) + 8000025e: e822 sd s0,16(sp) + 80000260: e426 sd s1,8(sp) + 80000262: e04a sd s2,0(sp) + 80000264: 1000 addi s0,sp,32 + 80000266: 84aa mv s1,a0 + acquire(&cons.lock); + 80000268: 00010517 auipc a0,0x10 + 8000026c: 85850513 addi a0,a0,-1960 # 8000fac0 <cons> + 80000270: 129000ef jal ra,80000b98 <acquire> + + switch(c){ + 80000274: 47d5 li a5,21 + 80000276: 0af48063 beq s1,a5,80000316 <consoleintr+0xbc> + 8000027a: 0297c663 blt a5,s1,800002a6 <consoleintr+0x4c> + 8000027e: 47a1 li a5,8 + 80000280: 0cf48f63 beq s1,a5,8000035e <consoleintr+0x104> + 80000284: 47c1 li a5,16 + 80000286: 10f49063 bne s1,a5,80000386 <consoleintr+0x12c> + case C('P'): // Print process list. + procdump(); + 8000028a: 783010ef jal ra,8000220c <procdump> + } + } + break; + } + + release(&cons.lock); + 8000028e: 00010517 auipc a0,0x10 + 80000292: 83250513 addi a0,a0,-1998 # 8000fac0 <cons> + 80000296: 19b000ef jal ra,80000c30 <release> +} + 8000029a: 60e2 ld ra,24(sp) + 8000029c: 6442 ld s0,16(sp) + 8000029e: 64a2 ld s1,8(sp) + 800002a0: 6902 ld s2,0(sp) + 800002a2: 6105 addi sp,sp,32 + 800002a4: 8082 ret + switch(c){ + 800002a6: 07f00793 li a5,127 + 800002aa: 0af48a63 beq s1,a5,8000035e <consoleintr+0x104> + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 800002ae: 00010717 auipc a4,0x10 + 800002b2: 81270713 addi a4,a4,-2030 # 8000fac0 <cons> + 800002b6: 0a072783 lw a5,160(a4) + 800002ba: 09872703 lw a4,152(a4) + 800002be: 9f99 subw a5,a5,a4 + 800002c0: 07f00713 li a4,127 + 800002c4: fcf765e3 bltu a4,a5,8000028e <consoleintr+0x34> + c = (c == '\r') ? '\n' : c; + 800002c8: 47b5 li a5,13 + 800002ca: 0cf48163 beq s1,a5,8000038c <consoleintr+0x132> + consputc(c); + 800002ce: 8526 mv a0,s1 + 800002d0: f59ff0ef jal ra,80000228 <consputc> + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 800002d4: 0000f797 auipc a5,0xf + 800002d8: 7ec78793 addi a5,a5,2028 # 8000fac0 <cons> + 800002dc: 0a07a683 lw a3,160(a5) + 800002e0: 0016871b addiw a4,a3,1 + 800002e4: 0007061b sext.w a2,a4 + 800002e8: 0ae7a023 sw a4,160(a5) + 800002ec: 07f6f693 andi a3,a3,127 + 800002f0: 97b6 add a5,a5,a3 + 800002f2: 00978c23 sb s1,24(a5) + if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){ + 800002f6: 47a9 li a5,10 + 800002f8: 0af48f63 beq s1,a5,800003b6 <consoleintr+0x15c> + 800002fc: 4791 li a5,4 + 800002fe: 0af48c63 beq s1,a5,800003b6 <consoleintr+0x15c> + 80000302: 00010797 auipc a5,0x10 + 80000306: 8567a783 lw a5,-1962(a5) # 8000fb58 <cons+0x98> + 8000030a: 9f1d subw a4,a4,a5 + 8000030c: 08000793 li a5,128 + 80000310: f6f71fe3 bne a4,a5,8000028e <consoleintr+0x34> + 80000314: a04d j 800003b6 <consoleintr+0x15c> + while(cons.e != cons.w && + 80000316: 0000f717 auipc a4,0xf + 8000031a: 7aa70713 addi a4,a4,1962 # 8000fac0 <cons> + 8000031e: 0a072783 lw a5,160(a4) + 80000322: 09c72703 lw a4,156(a4) + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000326: 0000f497 auipc s1,0xf + 8000032a: 79a48493 addi s1,s1,1946 # 8000fac0 <cons> + while(cons.e != cons.w && + 8000032e: 4929 li s2,10 + 80000330: f4f70fe3 beq a4,a5,8000028e <consoleintr+0x34> + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000334: 37fd addiw a5,a5,-1 + 80000336: 07f7f713 andi a4,a5,127 + 8000033a: 9726 add a4,a4,s1 + while(cons.e != cons.w && + 8000033c: 01874703 lbu a4,24(a4) + 80000340: f52707e3 beq a4,s2,8000028e <consoleintr+0x34> + cons.e--; + 80000344: 0af4a023 sw a5,160(s1) + consputc(BACKSPACE); + 80000348: 10000513 li a0,256 + 8000034c: eddff0ef jal ra,80000228 <consputc> + while(cons.e != cons.w && + 80000350: 0a04a783 lw a5,160(s1) + 80000354: 09c4a703 lw a4,156(s1) + 80000358: fcf71ee3 bne a4,a5,80000334 <consoleintr+0xda> + 8000035c: bf0d j 8000028e <consoleintr+0x34> + if(cons.e != cons.w){ + 8000035e: 0000f717 auipc a4,0xf + 80000362: 76270713 addi a4,a4,1890 # 8000fac0 <cons> + 80000366: 0a072783 lw a5,160(a4) + 8000036a: 09c72703 lw a4,156(a4) + 8000036e: f2f700e3 beq a4,a5,8000028e <consoleintr+0x34> + cons.e--; + 80000372: 37fd addiw a5,a5,-1 + 80000374: 0000f717 auipc a4,0xf + 80000378: 7ef72623 sw a5,2028(a4) # 8000fb60 <cons+0xa0> + consputc(BACKSPACE); + 8000037c: 10000513 li a0,256 + 80000380: ea9ff0ef jal ra,80000228 <consputc> + 80000384: b729 j 8000028e <consoleintr+0x34> + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 80000386: f00484e3 beqz s1,8000028e <consoleintr+0x34> + 8000038a: b715 j 800002ae <consoleintr+0x54> + consputc(c); + 8000038c: 4529 li a0,10 + 8000038e: e9bff0ef jal ra,80000228 <consputc> + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 80000392: 0000f797 auipc a5,0xf + 80000396: 72e78793 addi a5,a5,1838 # 8000fac0 <cons> + 8000039a: 0a07a703 lw a4,160(a5) + 8000039e: 0017069b addiw a3,a4,1 + 800003a2: 0006861b sext.w a2,a3 + 800003a6: 0ad7a023 sw a3,160(a5) + 800003aa: 07f77713 andi a4,a4,127 + 800003ae: 97ba add a5,a5,a4 + 800003b0: 4729 li a4,10 + 800003b2: 00e78c23 sb a4,24(a5) + cons.w = cons.e; + 800003b6: 0000f797 auipc a5,0xf + 800003ba: 7ac7a323 sw a2,1958(a5) # 8000fb5c <cons+0x9c> + wakeup(&cons.r); + 800003be: 0000f517 auipc a0,0xf + 800003c2: 79a50513 addi a0,a0,1946 # 8000fb58 <cons+0x98> + 800003c6: 2a3010ef jal ra,80001e68 <wakeup> + 800003ca: b5d1 j 8000028e <consoleintr+0x34> + +00000000800003cc <consoleinit>: + +void +consoleinit(void) +{ + 800003cc: 1141 addi sp,sp,-16 + 800003ce: e406 sd ra,8(sp) + 800003d0: e022 sd s0,0(sp) + 800003d2: 0800 addi s0,sp,16 + initlock(&cons.lock, "cons"); + 800003d4: 00007597 auipc a1,0x7 + 800003d8: c3c58593 addi a1,a1,-964 # 80007010 <etext+0x10> + 800003dc: 0000f517 auipc a0,0xf + 800003e0: 6e450513 addi a0,a0,1764 # 8000fac0 <cons> + 800003e4: 734000ef jal ra,80000b18 <initlock> + + uartinit(); + 800003e8: 3d6000ef jal ra,800007be <uartinit> + + // connect read and write system calls + // to consoleread and consolewrite. + devsw[CONSOLE].read = consoleread; + 800003ec: 00021797 auipc a5,0x21 + 800003f0: 26c78793 addi a5,a5,620 # 80021658 <devsw> + 800003f4: 00000717 auipc a4,0x0 + 800003f8: d3870713 addi a4,a4,-712 # 8000012c <consoleread> + 800003fc: eb98 sd a4,16(a5) + devsw[CONSOLE].write = consolewrite; + 800003fe: 00000717 auipc a4,0x0 + 80000402: cd270713 addi a4,a4,-814 # 800000d0 <consolewrite> + 80000406: ef98 sd a4,24(a5) +} + 80000408: 60a2 ld ra,8(sp) + 8000040a: 6402 ld s0,0(sp) + 8000040c: 0141 addi sp,sp,16 + 8000040e: 8082 ret + +0000000080000410 <printint>: + +static char digits[] = "0123456789abcdef"; + +static void +printint(long long xx, int base, int sign) +{ + 80000410: 7179 addi sp,sp,-48 + 80000412: f406 sd ra,40(sp) + 80000414: f022 sd s0,32(sp) + 80000416: ec26 sd s1,24(sp) + 80000418: e84a sd s2,16(sp) + 8000041a: 1800 addi s0,sp,48 + char buf[16]; + int i; + unsigned long long x; + + if(sign && (sign = (xx < 0))) + 8000041c: c219 beqz a2,80000422 <printint+0x12> + 8000041e: 06054e63 bltz a0,8000049a <printint+0x8a> + x = -xx; + else + x = xx; + 80000422: 4881 li a7,0 + 80000424: fd040693 addi a3,s0,-48 + + i = 0; + 80000428: 4781 li a5,0 + do { + buf[i++] = digits[x % base]; + 8000042a: 00007617 auipc a2,0x7 + 8000042e: c0e60613 addi a2,a2,-1010 # 80007038 <digits> + 80000432: 883e mv a6,a5 + 80000434: 2785 addiw a5,a5,1 + 80000436: 02b57733 remu a4,a0,a1 + 8000043a: 9732 add a4,a4,a2 + 8000043c: 00074703 lbu a4,0(a4) + 80000440: 00e68023 sb a4,0(a3) + } while((x /= base) != 0); + 80000444: 872a mv a4,a0 + 80000446: 02b55533 divu a0,a0,a1 + 8000044a: 0685 addi a3,a3,1 + 8000044c: feb773e3 bgeu a4,a1,80000432 <printint+0x22> + + if(sign) + 80000450: 00088a63 beqz a7,80000464 <printint+0x54> + buf[i++] = '-'; + 80000454: 1781 addi a5,a5,-32 + 80000456: 97a2 add a5,a5,s0 + 80000458: 02d00713 li a4,45 + 8000045c: fee78823 sb a4,-16(a5) + 80000460: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 80000464: 02f05563 blez a5,8000048e <printint+0x7e> + 80000468: fd040713 addi a4,s0,-48 + 8000046c: 00f704b3 add s1,a4,a5 + 80000470: fff70913 addi s2,a4,-1 + 80000474: 993e add s2,s2,a5 + 80000476: 37fd addiw a5,a5,-1 + 80000478: 1782 slli a5,a5,0x20 + 8000047a: 9381 srli a5,a5,0x20 + 8000047c: 40f90933 sub s2,s2,a5 + consputc(buf[i]); + 80000480: fff4c503 lbu a0,-1(s1) + 80000484: da5ff0ef jal ra,80000228 <consputc> + while(--i >= 0) + 80000488: 14fd addi s1,s1,-1 + 8000048a: ff249be3 bne s1,s2,80000480 <printint+0x70> +} + 8000048e: 70a2 ld ra,40(sp) + 80000490: 7402 ld s0,32(sp) + 80000492: 64e2 ld s1,24(sp) + 80000494: 6942 ld s2,16(sp) + 80000496: 6145 addi sp,sp,48 + 80000498: 8082 ret + x = -xx; + 8000049a: 40a00533 neg a0,a0 + if(sign && (sign = (xx < 0))) + 8000049e: 4885 li a7,1 + x = -xx; + 800004a0: b751 j 80000424 <printint+0x14> + +00000000800004a2 <printf>: +} + +// Print to the console. +int +printf(char *fmt, ...) +{ + 800004a2: 7155 addi sp,sp,-208 + 800004a4: e506 sd ra,136(sp) + 800004a6: e122 sd s0,128(sp) + 800004a8: fca6 sd s1,120(sp) + 800004aa: f8ca sd s2,112(sp) + 800004ac: f4ce sd s3,104(sp) + 800004ae: f0d2 sd s4,96(sp) + 800004b0: ecd6 sd s5,88(sp) + 800004b2: e8da sd s6,80(sp) + 800004b4: e4de sd s7,72(sp) + 800004b6: e0e2 sd s8,64(sp) + 800004b8: fc66 sd s9,56(sp) + 800004ba: f86a sd s10,48(sp) + 800004bc: f46e sd s11,40(sp) + 800004be: 0900 addi s0,sp,144 + 800004c0: 8a2a mv s4,a0 + 800004c2: e40c sd a1,8(s0) + 800004c4: e810 sd a2,16(s0) + 800004c6: ec14 sd a3,24(s0) + 800004c8: f018 sd a4,32(s0) + 800004ca: f41c sd a5,40(s0) + 800004cc: 03043823 sd a6,48(s0) + 800004d0: 03143c23 sd a7,56(s0) + va_list ap; + int i, cx, c0, c1, c2, locking; + char *s; + + locking = pr.locking; + 800004d4: 0000f797 auipc a5,0xf + 800004d8: 6ac7a783 lw a5,1708(a5) # 8000fb80 <pr+0x18> + 800004dc: f6f43c23 sd a5,-136(s0) + if(locking) + 800004e0: eb9d bnez a5,80000516 <printf+0x74> + acquire(&pr.lock); + + va_start(ap, fmt); + 800004e2: 00840793 addi a5,s0,8 + 800004e6: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 800004ea: 00054503 lbu a0,0(a0) + 800004ee: 24050463 beqz a0,80000736 <printf+0x294> + 800004f2: 4981 li s3,0 + if(cx != '%'){ + 800004f4: 02500a93 li s5,37 + i++; + c0 = fmt[i+0] & 0xff; + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 800004f8: 06400b13 li s6,100 + printint(va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 800004fc: 06c00c13 li s8,108 + printint(va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 80000500: 07500c93 li s9,117 + printint(va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 80000504: 07800d13 li s10,120 + printint(va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 80000508: 07000d93 li s11,112 + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); + 8000050c: 00007b97 auipc s7,0x7 + 80000510: b2cb8b93 addi s7,s7,-1236 # 80007038 <digits> + 80000514: a081 j 80000554 <printf+0xb2> + acquire(&pr.lock); + 80000516: 0000f517 auipc a0,0xf + 8000051a: 65250513 addi a0,a0,1618 # 8000fb68 <pr> + 8000051e: 67a000ef jal ra,80000b98 <acquire> + va_start(ap, fmt); + 80000522: 00840793 addi a5,s0,8 + 80000526: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 8000052a: 000a4503 lbu a0,0(s4) + 8000052e: f171 bnez a0,800004f2 <printf+0x50> +#endif + } + va_end(ap); + + if(locking) + release(&pr.lock); + 80000530: 0000f517 auipc a0,0xf + 80000534: 63850513 addi a0,a0,1592 # 8000fb68 <pr> + 80000538: 6f8000ef jal ra,80000c30 <release> + 8000053c: aaed j 80000736 <printf+0x294> + consputc(cx); + 8000053e: cebff0ef jal ra,80000228 <consputc> + continue; + 80000542: 84ce mv s1,s3 + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 80000544: 0014899b addiw s3,s1,1 + 80000548: 013a07b3 add a5,s4,s3 + 8000054c: 0007c503 lbu a0,0(a5) + 80000550: 1c050f63 beqz a0,8000072e <printf+0x28c> + if(cx != '%'){ + 80000554: ff5515e3 bne a0,s5,8000053e <printf+0x9c> + i++; + 80000558: 0019849b addiw s1,s3,1 + c0 = fmt[i+0] & 0xff; + 8000055c: 009a07b3 add a5,s4,s1 + 80000560: 0007c903 lbu s2,0(a5) + if(c0) c1 = fmt[i+1] & 0xff; + 80000564: 1c090563 beqz s2,8000072e <printf+0x28c> + 80000568: 0017c783 lbu a5,1(a5) + c1 = c2 = 0; + 8000056c: 86be mv a3,a5 + if(c1) c2 = fmt[i+2] & 0xff; + 8000056e: c789 beqz a5,80000578 <printf+0xd6> + 80000570: 009a0733 add a4,s4,s1 + 80000574: 00274683 lbu a3,2(a4) + if(c0 == 'd'){ + 80000578: 03690463 beq s2,s6,800005a0 <printf+0xfe> + } else if(c0 == 'l' && c1 == 'd'){ + 8000057c: 03890e63 beq s2,s8,800005b8 <printf+0x116> + } else if(c0 == 'u'){ + 80000580: 0b990d63 beq s2,s9,8000063a <printf+0x198> + } else if(c0 == 'x'){ + 80000584: 11a90363 beq s2,s10,8000068a <printf+0x1e8> + } else if(c0 == 'p'){ + 80000588: 13b90b63 beq s2,s11,800006be <printf+0x21c> + } else if(c0 == 's'){ + 8000058c: 07300793 li a5,115 + 80000590: 16f90363 beq s2,a5,800006f6 <printf+0x254> + } else if(c0 == '%'){ + 80000594: 03591c63 bne s2,s5,800005cc <printf+0x12a> + consputc('%'); + 80000598: 8556 mv a0,s5 + 8000059a: c8fff0ef jal ra,80000228 <consputc> + 8000059e: b75d j 80000544 <printf+0xa2> + printint(va_arg(ap, int), 10, 1); + 800005a0: f8843783 ld a5,-120(s0) + 800005a4: 00878713 addi a4,a5,8 + 800005a8: f8e43423 sd a4,-120(s0) + 800005ac: 4605 li a2,1 + 800005ae: 45a9 li a1,10 + 800005b0: 4388 lw a0,0(a5) + 800005b2: e5fff0ef jal ra,80000410 <printint> + 800005b6: b779 j 80000544 <printf+0xa2> + } else if(c0 == 'l' && c1 == 'd'){ + 800005b8: 03678163 beq a5,s6,800005da <printf+0x138> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 800005bc: 03878d63 beq a5,s8,800005f6 <printf+0x154> + } else if(c0 == 'l' && c1 == 'u'){ + 800005c0: 09978963 beq a5,s9,80000652 <printf+0x1b0> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 800005c4: 03878b63 beq a5,s8,800005fa <printf+0x158> + } else if(c0 == 'l' && c1 == 'x'){ + 800005c8: 0da78d63 beq a5,s10,800006a2 <printf+0x200> + consputc('%'); + 800005cc: 8556 mv a0,s5 + 800005ce: c5bff0ef jal ra,80000228 <consputc> + consputc(c0); + 800005d2: 854a mv a0,s2 + 800005d4: c55ff0ef jal ra,80000228 <consputc> + 800005d8: b7b5 j 80000544 <printf+0xa2> + printint(va_arg(ap, uint64), 10, 1); + 800005da: f8843783 ld a5,-120(s0) + 800005de: 00878713 addi a4,a5,8 + 800005e2: f8e43423 sd a4,-120(s0) + 800005e6: 4605 li a2,1 + 800005e8: 45a9 li a1,10 + 800005ea: 6388 ld a0,0(a5) + 800005ec: e25ff0ef jal ra,80000410 <printint> + i += 1; + 800005f0: 0029849b addiw s1,s3,2 + 800005f4: bf81 j 80000544 <printf+0xa2> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 800005f6: 03668463 beq a3,s6,8000061e <printf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 800005fa: 07968a63 beq a3,s9,8000066e <printf+0x1cc> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 800005fe: fda697e3 bne a3,s10,800005cc <printf+0x12a> + printint(va_arg(ap, uint64), 16, 0); + 80000602: f8843783 ld a5,-120(s0) + 80000606: 00878713 addi a4,a5,8 + 8000060a: f8e43423 sd a4,-120(s0) + 8000060e: 4601 li a2,0 + 80000610: 45c1 li a1,16 + 80000612: 6388 ld a0,0(a5) + 80000614: dfdff0ef jal ra,80000410 <printint> + i += 2; + 80000618: 0039849b addiw s1,s3,3 + 8000061c: b725 j 80000544 <printf+0xa2> + printint(va_arg(ap, uint64), 10, 1); + 8000061e: f8843783 ld a5,-120(s0) + 80000622: 00878713 addi a4,a5,8 + 80000626: f8e43423 sd a4,-120(s0) + 8000062a: 4605 li a2,1 + 8000062c: 45a9 li a1,10 + 8000062e: 6388 ld a0,0(a5) + 80000630: de1ff0ef jal ra,80000410 <printint> + i += 2; + 80000634: 0039849b addiw s1,s3,3 + 80000638: b731 j 80000544 <printf+0xa2> + printint(va_arg(ap, int), 10, 0); + 8000063a: f8843783 ld a5,-120(s0) + 8000063e: 00878713 addi a4,a5,8 + 80000642: f8e43423 sd a4,-120(s0) + 80000646: 4601 li a2,0 + 80000648: 45a9 li a1,10 + 8000064a: 4388 lw a0,0(a5) + 8000064c: dc5ff0ef jal ra,80000410 <printint> + 80000650: bdd5 j 80000544 <printf+0xa2> + printint(va_arg(ap, uint64), 10, 0); + 80000652: f8843783 ld a5,-120(s0) + 80000656: 00878713 addi a4,a5,8 + 8000065a: f8e43423 sd a4,-120(s0) + 8000065e: 4601 li a2,0 + 80000660: 45a9 li a1,10 + 80000662: 6388 ld a0,0(a5) + 80000664: dadff0ef jal ra,80000410 <printint> + i += 1; + 80000668: 0029849b addiw s1,s3,2 + 8000066c: bde1 j 80000544 <printf+0xa2> + printint(va_arg(ap, uint64), 10, 0); + 8000066e: f8843783 ld a5,-120(s0) + 80000672: 00878713 addi a4,a5,8 + 80000676: f8e43423 sd a4,-120(s0) + 8000067a: 4601 li a2,0 + 8000067c: 45a9 li a1,10 + 8000067e: 6388 ld a0,0(a5) + 80000680: d91ff0ef jal ra,80000410 <printint> + i += 2; + 80000684: 0039849b addiw s1,s3,3 + 80000688: bd75 j 80000544 <printf+0xa2> + printint(va_arg(ap, int), 16, 0); + 8000068a: f8843783 ld a5,-120(s0) + 8000068e: 00878713 addi a4,a5,8 + 80000692: f8e43423 sd a4,-120(s0) + 80000696: 4601 li a2,0 + 80000698: 45c1 li a1,16 + 8000069a: 4388 lw a0,0(a5) + 8000069c: d75ff0ef jal ra,80000410 <printint> + 800006a0: b555 j 80000544 <printf+0xa2> + printint(va_arg(ap, uint64), 16, 0); + 800006a2: f8843783 ld a5,-120(s0) + 800006a6: 00878713 addi a4,a5,8 + 800006aa: f8e43423 sd a4,-120(s0) + 800006ae: 4601 li a2,0 + 800006b0: 45c1 li a1,16 + 800006b2: 6388 ld a0,0(a5) + 800006b4: d5dff0ef jal ra,80000410 <printint> + i += 1; + 800006b8: 0029849b addiw s1,s3,2 + 800006bc: b561 j 80000544 <printf+0xa2> + printptr(va_arg(ap, uint64)); + 800006be: f8843783 ld a5,-120(s0) + 800006c2: 00878713 addi a4,a5,8 + 800006c6: f8e43423 sd a4,-120(s0) + 800006ca: 0007b983 ld s3,0(a5) + consputc('0'); + 800006ce: 03000513 li a0,48 + 800006d2: b57ff0ef jal ra,80000228 <consputc> + consputc('x'); + 800006d6: 856a mv a0,s10 + 800006d8: b51ff0ef jal ra,80000228 <consputc> + 800006dc: 4941 li s2,16 + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); + 800006de: 03c9d793 srli a5,s3,0x3c + 800006e2: 97de add a5,a5,s7 + 800006e4: 0007c503 lbu a0,0(a5) + 800006e8: b41ff0ef jal ra,80000228 <consputc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 800006ec: 0992 slli s3,s3,0x4 + 800006ee: 397d addiw s2,s2,-1 + 800006f0: fe0917e3 bnez s2,800006de <printf+0x23c> + 800006f4: bd81 j 80000544 <printf+0xa2> + if((s = va_arg(ap, char*)) == 0) + 800006f6: f8843783 ld a5,-120(s0) + 800006fa: 00878713 addi a4,a5,8 + 800006fe: f8e43423 sd a4,-120(s0) + 80000702: 0007b903 ld s2,0(a5) + 80000706: 00090d63 beqz s2,80000720 <printf+0x27e> + for(; *s; s++) + 8000070a: 00094503 lbu a0,0(s2) + 8000070e: e2050be3 beqz a0,80000544 <printf+0xa2> + consputc(*s); + 80000712: b17ff0ef jal ra,80000228 <consputc> + for(; *s; s++) + 80000716: 0905 addi s2,s2,1 + 80000718: 00094503 lbu a0,0(s2) + 8000071c: f97d bnez a0,80000712 <printf+0x270> + 8000071e: b51d j 80000544 <printf+0xa2> + s = "(null)"; + 80000720: 00007917 auipc s2,0x7 + 80000724: 8f890913 addi s2,s2,-1800 # 80007018 <etext+0x18> + for(; *s; s++) + 80000728: 02800513 li a0,40 + 8000072c: b7dd j 80000712 <printf+0x270> + if(locking) + 8000072e: f7843783 ld a5,-136(s0) + 80000732: de079fe3 bnez a5,80000530 <printf+0x8e> + + return 0; +} + 80000736: 4501 li a0,0 + 80000738: 60aa ld ra,136(sp) + 8000073a: 640a ld s0,128(sp) + 8000073c: 74e6 ld s1,120(sp) + 8000073e: 7946 ld s2,112(sp) + 80000740: 79a6 ld s3,104(sp) + 80000742: 7a06 ld s4,96(sp) + 80000744: 6ae6 ld s5,88(sp) + 80000746: 6b46 ld s6,80(sp) + 80000748: 6ba6 ld s7,72(sp) + 8000074a: 6c06 ld s8,64(sp) + 8000074c: 7ce2 ld s9,56(sp) + 8000074e: 7d42 ld s10,48(sp) + 80000750: 7da2 ld s11,40(sp) + 80000752: 6169 addi sp,sp,208 + 80000754: 8082 ret + +0000000080000756 <panic>: + +void +panic(char *s) +{ + 80000756: 1101 addi sp,sp,-32 + 80000758: ec06 sd ra,24(sp) + 8000075a: e822 sd s0,16(sp) + 8000075c: e426 sd s1,8(sp) + 8000075e: 1000 addi s0,sp,32 + 80000760: 84aa mv s1,a0 + pr.locking = 0; + 80000762: 0000f797 auipc a5,0xf + 80000766: 4007af23 sw zero,1054(a5) # 8000fb80 <pr+0x18> + printf("panic: "); + 8000076a: 00007517 auipc a0,0x7 + 8000076e: 8b650513 addi a0,a0,-1866 # 80007020 <etext+0x20> + 80000772: d31ff0ef jal ra,800004a2 <printf> + printf("%s\n", s); + 80000776: 85a6 mv a1,s1 + 80000778: 00007517 auipc a0,0x7 + 8000077c: 8b050513 addi a0,a0,-1872 # 80007028 <etext+0x28> + 80000780: d23ff0ef jal ra,800004a2 <printf> + panicked = 1; // freeze uart output from other CPUs + 80000784: 4785 li a5,1 + 80000786: 00007717 auipc a4,0x7 + 8000078a: 2ef72d23 sw a5,762(a4) # 80007a80 <panicked> + for(;;) + 8000078e: a001 j 8000078e <panic+0x38> + +0000000080000790 <printfinit>: + ; +} + +void +printfinit(void) +{ + 80000790: 1101 addi sp,sp,-32 + 80000792: ec06 sd ra,24(sp) + 80000794: e822 sd s0,16(sp) + 80000796: e426 sd s1,8(sp) + 80000798: 1000 addi s0,sp,32 + initlock(&pr.lock, "pr"); + 8000079a: 0000f497 auipc s1,0xf + 8000079e: 3ce48493 addi s1,s1,974 # 8000fb68 <pr> + 800007a2: 00007597 auipc a1,0x7 + 800007a6: 88e58593 addi a1,a1,-1906 # 80007030 <etext+0x30> + 800007aa: 8526 mv a0,s1 + 800007ac: 36c000ef jal ra,80000b18 <initlock> + pr.locking = 1; + 800007b0: 4785 li a5,1 + 800007b2: cc9c sw a5,24(s1) +} + 800007b4: 60e2 ld ra,24(sp) + 800007b6: 6442 ld s0,16(sp) + 800007b8: 64a2 ld s1,8(sp) + 800007ba: 6105 addi sp,sp,32 + 800007bc: 8082 ret + +00000000800007be <uartinit>: + +void uartstart(); + +void +uartinit(void) +{ + 800007be: 1141 addi sp,sp,-16 + 800007c0: e406 sd ra,8(sp) + 800007c2: e022 sd s0,0(sp) + 800007c4: 0800 addi s0,sp,16 + // disable interrupts. + WriteReg(IER, 0x00); + 800007c6: 100007b7 lui a5,0x10000 + 800007ca: 000780a3 sb zero,1(a5) # 10000001 <_entry-0x6fffffff> + + // special mode to set baud rate. + WriteReg(LCR, LCR_BAUD_LATCH); + 800007ce: f8000713 li a4,-128 + 800007d2: 00e781a3 sb a4,3(a5) + + // LSB for baud rate of 38.4K. + WriteReg(0, 0x03); + 800007d6: 470d li a4,3 + 800007d8: 00e78023 sb a4,0(a5) + + // MSB for baud rate of 38.4K. + WriteReg(1, 0x00); + 800007dc: 000780a3 sb zero,1(a5) + + // leave set-baud mode, + // and set word length to 8 bits, no parity. + WriteReg(LCR, LCR_EIGHT_BITS); + 800007e0: 00e781a3 sb a4,3(a5) + + // reset and enable FIFOs. + WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR); + 800007e4: 469d li a3,7 + 800007e6: 00d78123 sb a3,2(a5) + + // enable transmit and receive interrupts. + WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE); + 800007ea: 00e780a3 sb a4,1(a5) + + initlock(&uart_tx_lock, "uart"); + 800007ee: 00007597 auipc a1,0x7 + 800007f2: 86258593 addi a1,a1,-1950 # 80007050 <digits+0x18> + 800007f6: 0000f517 auipc a0,0xf + 800007fa: 39250513 addi a0,a0,914 # 8000fb88 <uart_tx_lock> + 800007fe: 31a000ef jal ra,80000b18 <initlock> +} + 80000802: 60a2 ld ra,8(sp) + 80000804: 6402 ld s0,0(sp) + 80000806: 0141 addi sp,sp,16 + 80000808: 8082 ret + +000000008000080a <uartputc_sync>: +// use interrupts, for use by kernel printf() and +// to echo characters. it spins waiting for the uart's +// output register to be empty. +void +uartputc_sync(int c) +{ + 8000080a: 1101 addi sp,sp,-32 + 8000080c: ec06 sd ra,24(sp) + 8000080e: e822 sd s0,16(sp) + 80000810: e426 sd s1,8(sp) + 80000812: 1000 addi s0,sp,32 + 80000814: 84aa mv s1,a0 + push_off(); + 80000816: 342000ef jal ra,80000b58 <push_off> + + if(panicked){ + 8000081a: 00007797 auipc a5,0x7 + 8000081e: 2667a783 lw a5,614(a5) # 80007a80 <panicked> + for(;;) + ; + } + + // wait for Transmit Holding Empty to be set in LSR. + while((ReadReg(LSR) & LSR_TX_IDLE) == 0) + 80000822: 10000737 lui a4,0x10000 + if(panicked){ + 80000826: c391 beqz a5,8000082a <uartputc_sync+0x20> + for(;;) + 80000828: a001 j 80000828 <uartputc_sync+0x1e> + while((ReadReg(LSR) & LSR_TX_IDLE) == 0) + 8000082a: 00574783 lbu a5,5(a4) # 10000005 <_entry-0x6ffffffb> + 8000082e: 0207f793 andi a5,a5,32 + 80000832: dfe5 beqz a5,8000082a <uartputc_sync+0x20> + ; + WriteReg(THR, c); + 80000834: 0ff4f513 zext.b a0,s1 + 80000838: 100007b7 lui a5,0x10000 + 8000083c: 00a78023 sb a0,0(a5) # 10000000 <_entry-0x70000000> + + pop_off(); + 80000840: 39c000ef jal ra,80000bdc <pop_off> +} + 80000844: 60e2 ld ra,24(sp) + 80000846: 6442 ld s0,16(sp) + 80000848: 64a2 ld s1,8(sp) + 8000084a: 6105 addi sp,sp,32 + 8000084c: 8082 ret + +000000008000084e <uartstart>: +// called from both the top- and bottom-half. +void +uartstart() +{ + while(1){ + if(uart_tx_w == uart_tx_r){ + 8000084e: 00007797 auipc a5,0x7 + 80000852: 23a7b783 ld a5,570(a5) # 80007a88 <uart_tx_r> + 80000856: 00007717 auipc a4,0x7 + 8000085a: 23a73703 ld a4,570(a4) # 80007a90 <uart_tx_w> + 8000085e: 06f70c63 beq a4,a5,800008d6 <uartstart+0x88> +{ + 80000862: 7139 addi sp,sp,-64 + 80000864: fc06 sd ra,56(sp) + 80000866: f822 sd s0,48(sp) + 80000868: f426 sd s1,40(sp) + 8000086a: f04a sd s2,32(sp) + 8000086c: ec4e sd s3,24(sp) + 8000086e: e852 sd s4,16(sp) + 80000870: e456 sd s5,8(sp) + 80000872: 0080 addi s0,sp,64 + // transmit buffer is empty. + ReadReg(ISR); + return; + } + + if((ReadReg(LSR) & LSR_TX_IDLE) == 0){ + 80000874: 10000937 lui s2,0x10000 + // so we cannot give it another byte. + // it will interrupt when it's ready for a new byte. + return; + } + + int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]; + 80000878: 0000fa17 auipc s4,0xf + 8000087c: 310a0a13 addi s4,s4,784 # 8000fb88 <uart_tx_lock> + uart_tx_r += 1; + 80000880: 00007497 auipc s1,0x7 + 80000884: 20848493 addi s1,s1,520 # 80007a88 <uart_tx_r> + if(uart_tx_w == uart_tx_r){ + 80000888: 00007997 auipc s3,0x7 + 8000088c: 20898993 addi s3,s3,520 # 80007a90 <uart_tx_w> + if((ReadReg(LSR) & LSR_TX_IDLE) == 0){ + 80000890: 00594703 lbu a4,5(s2) # 10000005 <_entry-0x6ffffffb> + 80000894: 02077713 andi a4,a4,32 + 80000898: c715 beqz a4,800008c4 <uartstart+0x76> + int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]; + 8000089a: 01f7f713 andi a4,a5,31 + 8000089e: 9752 add a4,a4,s4 + 800008a0: 01874a83 lbu s5,24(a4) + uart_tx_r += 1; + 800008a4: 0785 addi a5,a5,1 + 800008a6: e09c sd a5,0(s1) + + // maybe uartputc() is waiting for space in the buffer. + wakeup(&uart_tx_r); + 800008a8: 8526 mv a0,s1 + 800008aa: 5be010ef jal ra,80001e68 <wakeup> + + WriteReg(THR, c); + 800008ae: 01590023 sb s5,0(s2) + if(uart_tx_w == uart_tx_r){ + 800008b2: 609c ld a5,0(s1) + 800008b4: 0009b703 ld a4,0(s3) + 800008b8: fcf71ce3 bne a4,a5,80000890 <uartstart+0x42> + ReadReg(ISR); + 800008bc: 100007b7 lui a5,0x10000 + 800008c0: 0027c783 lbu a5,2(a5) # 10000002 <_entry-0x6ffffffe> + } +} + 800008c4: 70e2 ld ra,56(sp) + 800008c6: 7442 ld s0,48(sp) + 800008c8: 74a2 ld s1,40(sp) + 800008ca: 7902 ld s2,32(sp) + 800008cc: 69e2 ld s3,24(sp) + 800008ce: 6a42 ld s4,16(sp) + 800008d0: 6aa2 ld s5,8(sp) + 800008d2: 6121 addi sp,sp,64 + 800008d4: 8082 ret + ReadReg(ISR); + 800008d6: 100007b7 lui a5,0x10000 + 800008da: 0027c783 lbu a5,2(a5) # 10000002 <_entry-0x6ffffffe> + return; + 800008de: 8082 ret + +00000000800008e0 <uartputc>: +{ + 800008e0: 7179 addi sp,sp,-48 + 800008e2: f406 sd ra,40(sp) + 800008e4: f022 sd s0,32(sp) + 800008e6: ec26 sd s1,24(sp) + 800008e8: e84a sd s2,16(sp) + 800008ea: e44e sd s3,8(sp) + 800008ec: e052 sd s4,0(sp) + 800008ee: 1800 addi s0,sp,48 + 800008f0: 8a2a mv s4,a0 + acquire(&uart_tx_lock); + 800008f2: 0000f517 auipc a0,0xf + 800008f6: 29650513 addi a0,a0,662 # 8000fb88 <uart_tx_lock> + 800008fa: 29e000ef jal ra,80000b98 <acquire> + if(panicked){ + 800008fe: 00007797 auipc a5,0x7 + 80000902: 1827a783 lw a5,386(a5) # 80007a80 <panicked> + 80000906: efbd bnez a5,80000984 <uartputc+0xa4> + while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ + 80000908: 00007717 auipc a4,0x7 + 8000090c: 18873703 ld a4,392(a4) # 80007a90 <uart_tx_w> + 80000910: 00007797 auipc a5,0x7 + 80000914: 1787b783 ld a5,376(a5) # 80007a88 <uart_tx_r> + 80000918: 02078793 addi a5,a5,32 + sleep(&uart_tx_r, &uart_tx_lock); + 8000091c: 0000f997 auipc s3,0xf + 80000920: 26c98993 addi s3,s3,620 # 8000fb88 <uart_tx_lock> + 80000924: 00007497 auipc s1,0x7 + 80000928: 16448493 addi s1,s1,356 # 80007a88 <uart_tx_r> + while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ + 8000092c: 00007917 auipc s2,0x7 + 80000930: 16490913 addi s2,s2,356 # 80007a90 <uart_tx_w> + 80000934: 00e79d63 bne a5,a4,8000094e <uartputc+0x6e> + sleep(&uart_tx_r, &uart_tx_lock); + 80000938: 85ce mv a1,s3 + 8000093a: 8526 mv a0,s1 + 8000093c: 4e0010ef jal ra,80001e1c <sleep> + while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ + 80000940: 00093703 ld a4,0(s2) + 80000944: 609c ld a5,0(s1) + 80000946: 02078793 addi a5,a5,32 + 8000094a: fee787e3 beq a5,a4,80000938 <uartputc+0x58> + uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE] = c; + 8000094e: 0000f497 auipc s1,0xf + 80000952: 23a48493 addi s1,s1,570 # 8000fb88 <uart_tx_lock> + 80000956: 01f77793 andi a5,a4,31 + 8000095a: 97a6 add a5,a5,s1 + 8000095c: 01478c23 sb s4,24(a5) + uart_tx_w += 1; + 80000960: 0705 addi a4,a4,1 + 80000962: 00007797 auipc a5,0x7 + 80000966: 12e7b723 sd a4,302(a5) # 80007a90 <uart_tx_w> + uartstart(); + 8000096a: ee5ff0ef jal ra,8000084e <uartstart> + release(&uart_tx_lock); + 8000096e: 8526 mv a0,s1 + 80000970: 2c0000ef jal ra,80000c30 <release> +} + 80000974: 70a2 ld ra,40(sp) + 80000976: 7402 ld s0,32(sp) + 80000978: 64e2 ld s1,24(sp) + 8000097a: 6942 ld s2,16(sp) + 8000097c: 69a2 ld s3,8(sp) + 8000097e: 6a02 ld s4,0(sp) + 80000980: 6145 addi sp,sp,48 + 80000982: 8082 ret + for(;;) + 80000984: a001 j 80000984 <uartputc+0xa4> + +0000000080000986 <uartgetc>: + +// read one input character from the UART. +// return -1 if none is waiting. +int +uartgetc(void) +{ + 80000986: 1141 addi sp,sp,-16 + 80000988: e422 sd s0,8(sp) + 8000098a: 0800 addi s0,sp,16 + if(ReadReg(LSR) & 0x01){ + 8000098c: 100007b7 lui a5,0x10000 + 80000990: 0057c783 lbu a5,5(a5) # 10000005 <_entry-0x6ffffffb> + 80000994: 8b85 andi a5,a5,1 + 80000996: cb81 beqz a5,800009a6 <uartgetc+0x20> + // input data is ready. + return ReadReg(RHR); + 80000998: 100007b7 lui a5,0x10000 + 8000099c: 0007c503 lbu a0,0(a5) # 10000000 <_entry-0x70000000> + } else { + return -1; + } +} + 800009a0: 6422 ld s0,8(sp) + 800009a2: 0141 addi sp,sp,16 + 800009a4: 8082 ret + return -1; + 800009a6: 557d li a0,-1 + 800009a8: bfe5 j 800009a0 <uartgetc+0x1a> + +00000000800009aa <uartintr>: +// handle a uart interrupt, raised because input has +// arrived, or the uart is ready for more output, or +// both. called from devintr(). +void +uartintr(void) +{ + 800009aa: 1101 addi sp,sp,-32 + 800009ac: ec06 sd ra,24(sp) + 800009ae: e822 sd s0,16(sp) + 800009b0: e426 sd s1,8(sp) + 800009b2: 1000 addi s0,sp,32 + // read and process incoming characters. + while(1){ + int c = uartgetc(); + if(c == -1) + 800009b4: 54fd li s1,-1 + 800009b6: a019 j 800009bc <uartintr+0x12> + break; + consoleintr(c); + 800009b8: 8a3ff0ef jal ra,8000025a <consoleintr> + int c = uartgetc(); + 800009bc: fcbff0ef jal ra,80000986 <uartgetc> + if(c == -1) + 800009c0: fe951ce3 bne a0,s1,800009b8 <uartintr+0xe> + } + + // send buffered characters. + acquire(&uart_tx_lock); + 800009c4: 0000f497 auipc s1,0xf + 800009c8: 1c448493 addi s1,s1,452 # 8000fb88 <uart_tx_lock> + 800009cc: 8526 mv a0,s1 + 800009ce: 1ca000ef jal ra,80000b98 <acquire> + uartstart(); + 800009d2: e7dff0ef jal ra,8000084e <uartstart> + release(&uart_tx_lock); + 800009d6: 8526 mv a0,s1 + 800009d8: 258000ef jal ra,80000c30 <release> +} + 800009dc: 60e2 ld ra,24(sp) + 800009de: 6442 ld s0,16(sp) + 800009e0: 64a2 ld s1,8(sp) + 800009e2: 6105 addi sp,sp,32 + 800009e4: 8082 ret + +00000000800009e6 <kfree>: +// which normally should have been returned by a +// call to kalloc(). (The exception is when +// initializing the allocator; see kinit above.) +void +kfree(void *pa) +{ + 800009e6: 1101 addi sp,sp,-32 + 800009e8: ec06 sd ra,24(sp) + 800009ea: e822 sd s0,16(sp) + 800009ec: e426 sd s1,8(sp) + 800009ee: e04a sd s2,0(sp) + 800009f0: 1000 addi s0,sp,32 + struct run *r; + + if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP) + 800009f2: 03451793 slli a5,a0,0x34 + 800009f6: e7a9 bnez a5,80000a40 <kfree+0x5a> + 800009f8: 84aa mv s1,a0 + 800009fa: 00022797 auipc a5,0x22 + 800009fe: df678793 addi a5,a5,-522 # 800227f0 <end> + 80000a02: 02f56f63 bltu a0,a5,80000a40 <kfree+0x5a> + 80000a06: 47c5 li a5,17 + 80000a08: 07ee slli a5,a5,0x1b + 80000a0a: 02f57b63 bgeu a0,a5,80000a40 <kfree+0x5a> + panic("kfree"); + + // Fill with junk to catch dangling refs. + memset(pa, 1, PGSIZE); + 80000a0e: 6605 lui a2,0x1 + 80000a10: 4585 li a1,1 + 80000a12: 25a000ef jal ra,80000c6c <memset> + + r = (struct run*)pa; + + acquire(&kmem.lock); + 80000a16: 0000f917 auipc s2,0xf + 80000a1a: 1aa90913 addi s2,s2,426 # 8000fbc0 <kmem> + 80000a1e: 854a mv a0,s2 + 80000a20: 178000ef jal ra,80000b98 <acquire> + r->next = kmem.freelist; + 80000a24: 01893783 ld a5,24(s2) + 80000a28: e09c sd a5,0(s1) + kmem.freelist = r; + 80000a2a: 00993c23 sd s1,24(s2) + release(&kmem.lock); + 80000a2e: 854a mv a0,s2 + 80000a30: 200000ef jal ra,80000c30 <release> +} + 80000a34: 60e2 ld ra,24(sp) + 80000a36: 6442 ld s0,16(sp) + 80000a38: 64a2 ld s1,8(sp) + 80000a3a: 6902 ld s2,0(sp) + 80000a3c: 6105 addi sp,sp,32 + 80000a3e: 8082 ret + panic("kfree"); + 80000a40: 00006517 auipc a0,0x6 + 80000a44: 61850513 addi a0,a0,1560 # 80007058 <digits+0x20> + 80000a48: d0fff0ef jal ra,80000756 <panic> + +0000000080000a4c <freerange>: +{ + 80000a4c: 7179 addi sp,sp,-48 + 80000a4e: f406 sd ra,40(sp) + 80000a50: f022 sd s0,32(sp) + 80000a52: ec26 sd s1,24(sp) + 80000a54: e84a sd s2,16(sp) + 80000a56: e44e sd s3,8(sp) + 80000a58: e052 sd s4,0(sp) + 80000a5a: 1800 addi s0,sp,48 + p = (char*)PGROUNDUP((uint64)pa_start); + 80000a5c: 6785 lui a5,0x1 + 80000a5e: fff78713 addi a4,a5,-1 # fff <_entry-0x7ffff001> + 80000a62: 00e504b3 add s1,a0,a4 + 80000a66: 777d lui a4,0xfffff + 80000a68: 8cf9 and s1,s1,a4 + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000a6a: 94be add s1,s1,a5 + 80000a6c: 0095ec63 bltu a1,s1,80000a84 <freerange+0x38> + 80000a70: 892e mv s2,a1 + kfree(p); + 80000a72: 7a7d lui s4,0xfffff + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000a74: 6985 lui s3,0x1 + kfree(p); + 80000a76: 01448533 add a0,s1,s4 + 80000a7a: f6dff0ef jal ra,800009e6 <kfree> + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000a7e: 94ce add s1,s1,s3 + 80000a80: fe997be3 bgeu s2,s1,80000a76 <freerange+0x2a> +} + 80000a84: 70a2 ld ra,40(sp) + 80000a86: 7402 ld s0,32(sp) + 80000a88: 64e2 ld s1,24(sp) + 80000a8a: 6942 ld s2,16(sp) + 80000a8c: 69a2 ld s3,8(sp) + 80000a8e: 6a02 ld s4,0(sp) + 80000a90: 6145 addi sp,sp,48 + 80000a92: 8082 ret + +0000000080000a94 <kinit>: +{ + 80000a94: 1141 addi sp,sp,-16 + 80000a96: e406 sd ra,8(sp) + 80000a98: e022 sd s0,0(sp) + 80000a9a: 0800 addi s0,sp,16 + initlock(&kmem.lock, "kmem"); + 80000a9c: 00006597 auipc a1,0x6 + 80000aa0: 5c458593 addi a1,a1,1476 # 80007060 <digits+0x28> + 80000aa4: 0000f517 auipc a0,0xf + 80000aa8: 11c50513 addi a0,a0,284 # 8000fbc0 <kmem> + 80000aac: 06c000ef jal ra,80000b18 <initlock> + freerange(end, (void*)PHYSTOP); + 80000ab0: 45c5 li a1,17 + 80000ab2: 05ee slli a1,a1,0x1b + 80000ab4: 00022517 auipc a0,0x22 + 80000ab8: d3c50513 addi a0,a0,-708 # 800227f0 <end> + 80000abc: f91ff0ef jal ra,80000a4c <freerange> +} + 80000ac0: 60a2 ld ra,8(sp) + 80000ac2: 6402 ld s0,0(sp) + 80000ac4: 0141 addi sp,sp,16 + 80000ac6: 8082 ret + +0000000080000ac8 <kalloc>: +// Allocate one 4096-byte page of physical memory. +// Returns a pointer that the kernel can use. +// Returns 0 if the memory cannot be allocated. +void * +kalloc(void) +{ + 80000ac8: 1101 addi sp,sp,-32 + 80000aca: ec06 sd ra,24(sp) + 80000acc: e822 sd s0,16(sp) + 80000ace: e426 sd s1,8(sp) + 80000ad0: 1000 addi s0,sp,32 + struct run *r; + + acquire(&kmem.lock); + 80000ad2: 0000f497 auipc s1,0xf + 80000ad6: 0ee48493 addi s1,s1,238 # 8000fbc0 <kmem> + 80000ada: 8526 mv a0,s1 + 80000adc: 0bc000ef jal ra,80000b98 <acquire> + r = kmem.freelist; + 80000ae0: 6c84 ld s1,24(s1) + if(r) + 80000ae2: c485 beqz s1,80000b0a <kalloc+0x42> + kmem.freelist = r->next; + 80000ae4: 609c ld a5,0(s1) + 80000ae6: 0000f517 auipc a0,0xf + 80000aea: 0da50513 addi a0,a0,218 # 8000fbc0 <kmem> + 80000aee: ed1c sd a5,24(a0) + release(&kmem.lock); + 80000af0: 140000ef jal ra,80000c30 <release> + + if(r) + memset((char*)r, 5, PGSIZE); // fill with junk + 80000af4: 6605 lui a2,0x1 + 80000af6: 4595 li a1,5 + 80000af8: 8526 mv a0,s1 + 80000afa: 172000ef jal ra,80000c6c <memset> + return (void*)r; +} + 80000afe: 8526 mv a0,s1 + 80000b00: 60e2 ld ra,24(sp) + 80000b02: 6442 ld s0,16(sp) + 80000b04: 64a2 ld s1,8(sp) + 80000b06: 6105 addi sp,sp,32 + 80000b08: 8082 ret + release(&kmem.lock); + 80000b0a: 0000f517 auipc a0,0xf + 80000b0e: 0b650513 addi a0,a0,182 # 8000fbc0 <kmem> + 80000b12: 11e000ef jal ra,80000c30 <release> + if(r) + 80000b16: b7e5 j 80000afe <kalloc+0x36> + +0000000080000b18 <initlock>: +#include "proc.h" +#include "defs.h" + +void +initlock(struct spinlock *lk, char *name) +{ + 80000b18: 1141 addi sp,sp,-16 + 80000b1a: e422 sd s0,8(sp) + 80000b1c: 0800 addi s0,sp,16 + lk->name = name; + 80000b1e: e50c sd a1,8(a0) + lk->locked = 0; + 80000b20: 00052023 sw zero,0(a0) + lk->cpu = 0; + 80000b24: 00053823 sd zero,16(a0) +} + 80000b28: 6422 ld s0,8(sp) + 80000b2a: 0141 addi sp,sp,16 + 80000b2c: 8082 ret + +0000000080000b2e <holding>: +// Interrupts must be off. +int +holding(struct spinlock *lk) +{ + int r; + r = (lk->locked && lk->cpu == mycpu()); + 80000b2e: 411c lw a5,0(a0) + 80000b30: e399 bnez a5,80000b36 <holding+0x8> + 80000b32: 4501 li a0,0 + return r; +} + 80000b34: 8082 ret +{ + 80000b36: 1101 addi sp,sp,-32 + 80000b38: ec06 sd ra,24(sp) + 80000b3a: e822 sd s0,16(sp) + 80000b3c: e426 sd s1,8(sp) + 80000b3e: 1000 addi s0,sp,32 + r = (lk->locked && lk->cpu == mycpu()); + 80000b40: 6904 ld s1,16(a0) + 80000b42: 4cd000ef jal ra,8000180e <mycpu> + 80000b46: 40a48533 sub a0,s1,a0 + 80000b4a: 00153513 seqz a0,a0 +} + 80000b4e: 60e2 ld ra,24(sp) + 80000b50: 6442 ld s0,16(sp) + 80000b52: 64a2 ld s1,8(sp) + 80000b54: 6105 addi sp,sp,32 + 80000b56: 8082 ret + +0000000080000b58 <push_off>: +// it takes two pop_off()s to undo two push_off()s. Also, if interrupts +// are initially off, then push_off, pop_off leaves them off. + +void +push_off(void) +{ + 80000b58: 1101 addi sp,sp,-32 + 80000b5a: ec06 sd ra,24(sp) + 80000b5c: e822 sd s0,16(sp) + 80000b5e: e426 sd s1,8(sp) + 80000b60: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000b62: 100024f3 csrr s1,sstatus + 80000b66: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80000b6a: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000b6c: 10079073 csrw sstatus,a5 + int old = intr_get(); + + intr_off(); + if(mycpu()->noff == 0) + 80000b70: 49f000ef jal ra,8000180e <mycpu> + 80000b74: 5d3c lw a5,120(a0) + 80000b76: cb99 beqz a5,80000b8c <push_off+0x34> + mycpu()->intena = old; + mycpu()->noff += 1; + 80000b78: 497000ef jal ra,8000180e <mycpu> + 80000b7c: 5d3c lw a5,120(a0) + 80000b7e: 2785 addiw a5,a5,1 + 80000b80: dd3c sw a5,120(a0) +} + 80000b82: 60e2 ld ra,24(sp) + 80000b84: 6442 ld s0,16(sp) + 80000b86: 64a2 ld s1,8(sp) + 80000b88: 6105 addi sp,sp,32 + 80000b8a: 8082 ret + mycpu()->intena = old; + 80000b8c: 483000ef jal ra,8000180e <mycpu> + return (x & SSTATUS_SIE) != 0; + 80000b90: 8085 srli s1,s1,0x1 + 80000b92: 8885 andi s1,s1,1 + 80000b94: dd64 sw s1,124(a0) + 80000b96: b7cd j 80000b78 <push_off+0x20> + +0000000080000b98 <acquire>: +{ + 80000b98: 1101 addi sp,sp,-32 + 80000b9a: ec06 sd ra,24(sp) + 80000b9c: e822 sd s0,16(sp) + 80000b9e: e426 sd s1,8(sp) + 80000ba0: 1000 addi s0,sp,32 + 80000ba2: 84aa mv s1,a0 + push_off(); // disable interrupts to avoid deadlock. + 80000ba4: fb5ff0ef jal ra,80000b58 <push_off> + if(holding(lk)) + 80000ba8: 8526 mv a0,s1 + 80000baa: f85ff0ef jal ra,80000b2e <holding> + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000bae: 4705 li a4,1 + if(holding(lk)) + 80000bb0: e105 bnez a0,80000bd0 <acquire+0x38> + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000bb2: 87ba mv a5,a4 + 80000bb4: 0cf4a7af amoswap.w.aq a5,a5,(s1) + 80000bb8: 2781 sext.w a5,a5 + 80000bba: ffe5 bnez a5,80000bb2 <acquire+0x1a> + __sync_synchronize(); + 80000bbc: 0ff0000f fence + lk->cpu = mycpu(); + 80000bc0: 44f000ef jal ra,8000180e <mycpu> + 80000bc4: e888 sd a0,16(s1) +} + 80000bc6: 60e2 ld ra,24(sp) + 80000bc8: 6442 ld s0,16(sp) + 80000bca: 64a2 ld s1,8(sp) + 80000bcc: 6105 addi sp,sp,32 + 80000bce: 8082 ret + panic("acquire"); + 80000bd0: 00006517 auipc a0,0x6 + 80000bd4: 49850513 addi a0,a0,1176 # 80007068 <digits+0x30> + 80000bd8: b7fff0ef jal ra,80000756 <panic> + +0000000080000bdc <pop_off>: + +void +pop_off(void) +{ + 80000bdc: 1141 addi sp,sp,-16 + 80000bde: e406 sd ra,8(sp) + 80000be0: e022 sd s0,0(sp) + 80000be2: 0800 addi s0,sp,16 + struct cpu *c = mycpu(); + 80000be4: 42b000ef jal ra,8000180e <mycpu> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000be8: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80000bec: 8b89 andi a5,a5,2 + if(intr_get()) + 80000bee: e78d bnez a5,80000c18 <pop_off+0x3c> + panic("pop_off - interruptible"); + if(c->noff < 1) + 80000bf0: 5d3c lw a5,120(a0) + 80000bf2: 02f05963 blez a5,80000c24 <pop_off+0x48> + panic("pop_off"); + c->noff -= 1; + 80000bf6: 37fd addiw a5,a5,-1 + 80000bf8: 0007871b sext.w a4,a5 + 80000bfc: dd3c sw a5,120(a0) + if(c->noff == 0 && c->intena) + 80000bfe: eb09 bnez a4,80000c10 <pop_off+0x34> + 80000c00: 5d7c lw a5,124(a0) + 80000c02: c799 beqz a5,80000c10 <pop_off+0x34> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000c04: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80000c08: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000c0c: 10079073 csrw sstatus,a5 + intr_on(); +} + 80000c10: 60a2 ld ra,8(sp) + 80000c12: 6402 ld s0,0(sp) + 80000c14: 0141 addi sp,sp,16 + 80000c16: 8082 ret + panic("pop_off - interruptible"); + 80000c18: 00006517 auipc a0,0x6 + 80000c1c: 45850513 addi a0,a0,1112 # 80007070 <digits+0x38> + 80000c20: b37ff0ef jal ra,80000756 <panic> + panic("pop_off"); + 80000c24: 00006517 auipc a0,0x6 + 80000c28: 46450513 addi a0,a0,1124 # 80007088 <digits+0x50> + 80000c2c: b2bff0ef jal ra,80000756 <panic> + +0000000080000c30 <release>: +{ + 80000c30: 1101 addi sp,sp,-32 + 80000c32: ec06 sd ra,24(sp) + 80000c34: e822 sd s0,16(sp) + 80000c36: e426 sd s1,8(sp) + 80000c38: 1000 addi s0,sp,32 + 80000c3a: 84aa mv s1,a0 + if(!holding(lk)) + 80000c3c: ef3ff0ef jal ra,80000b2e <holding> + 80000c40: c105 beqz a0,80000c60 <release+0x30> + lk->cpu = 0; + 80000c42: 0004b823 sd zero,16(s1) + __sync_synchronize(); + 80000c46: 0ff0000f fence + __sync_lock_release(&lk->locked); + 80000c4a: 0f50000f fence iorw,ow + 80000c4e: 0804a02f amoswap.w zero,zero,(s1) + pop_off(); + 80000c52: f8bff0ef jal ra,80000bdc <pop_off> +} + 80000c56: 60e2 ld ra,24(sp) + 80000c58: 6442 ld s0,16(sp) + 80000c5a: 64a2 ld s1,8(sp) + 80000c5c: 6105 addi sp,sp,32 + 80000c5e: 8082 ret + panic("release"); + 80000c60: 00006517 auipc a0,0x6 + 80000c64: 43050513 addi a0,a0,1072 # 80007090 <digits+0x58> + 80000c68: aefff0ef jal ra,80000756 <panic> + +0000000080000c6c <memset>: +#include "types.h" + +void* +memset(void *dst, int c, uint n) +{ + 80000c6c: 1141 addi sp,sp,-16 + 80000c6e: e422 sd s0,8(sp) + 80000c70: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 80000c72: ca19 beqz a2,80000c88 <memset+0x1c> + 80000c74: 87aa mv a5,a0 + 80000c76: 1602 slli a2,a2,0x20 + 80000c78: 9201 srli a2,a2,0x20 + 80000c7a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 80000c7e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 80000c82: 0785 addi a5,a5,1 + 80000c84: fee79de3 bne a5,a4,80000c7e <memset+0x12> + } + return dst; +} + 80000c88: 6422 ld s0,8(sp) + 80000c8a: 0141 addi sp,sp,16 + 80000c8c: 8082 ret + +0000000080000c8e <memcmp>: + +int +memcmp(const void *v1, const void *v2, uint n) +{ + 80000c8e: 1141 addi sp,sp,-16 + 80000c90: e422 sd s0,8(sp) + 80000c92: 0800 addi s0,sp,16 + const uchar *s1, *s2; + + s1 = v1; + s2 = v2; + while(n-- > 0){ + 80000c94: ca05 beqz a2,80000cc4 <memcmp+0x36> + 80000c96: fff6069b addiw a3,a2,-1 # fff <_entry-0x7ffff001> + 80000c9a: 1682 slli a3,a3,0x20 + 80000c9c: 9281 srli a3,a3,0x20 + 80000c9e: 0685 addi a3,a3,1 + 80000ca0: 96aa add a3,a3,a0 + if(*s1 != *s2) + 80000ca2: 00054783 lbu a5,0(a0) + 80000ca6: 0005c703 lbu a4,0(a1) + 80000caa: 00e79863 bne a5,a4,80000cba <memcmp+0x2c> + return *s1 - *s2; + s1++, s2++; + 80000cae: 0505 addi a0,a0,1 + 80000cb0: 0585 addi a1,a1,1 + while(n-- > 0){ + 80000cb2: fed518e3 bne a0,a3,80000ca2 <memcmp+0x14> + } + + return 0; + 80000cb6: 4501 li a0,0 + 80000cb8: a019 j 80000cbe <memcmp+0x30> + return *s1 - *s2; + 80000cba: 40e7853b subw a0,a5,a4 +} + 80000cbe: 6422 ld s0,8(sp) + 80000cc0: 0141 addi sp,sp,16 + 80000cc2: 8082 ret + return 0; + 80000cc4: 4501 li a0,0 + 80000cc6: bfe5 j 80000cbe <memcmp+0x30> + +0000000080000cc8 <memmove>: + +void* +memmove(void *dst, const void *src, uint n) +{ + 80000cc8: 1141 addi sp,sp,-16 + 80000cca: e422 sd s0,8(sp) + 80000ccc: 0800 addi s0,sp,16 + const char *s; + char *d; + + if(n == 0) + 80000cce: c205 beqz a2,80000cee <memmove+0x26> + return dst; + + s = src; + d = dst; + if(s < d && s + n > d){ + 80000cd0: 02a5e263 bltu a1,a0,80000cf4 <memmove+0x2c> + s += n; + d += n; + while(n-- > 0) + *--d = *--s; + } else + while(n-- > 0) + 80000cd4: 1602 slli a2,a2,0x20 + 80000cd6: 9201 srli a2,a2,0x20 + 80000cd8: 00c587b3 add a5,a1,a2 +{ + 80000cdc: 872a mv a4,a0 + *d++ = *s++; + 80000cde: 0585 addi a1,a1,1 + 80000ce0: 0705 addi a4,a4,1 # fffffffffffff001 <end+0xffffffff7ffdc811> + 80000ce2: fff5c683 lbu a3,-1(a1) + 80000ce6: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 80000cea: fef59ae3 bne a1,a5,80000cde <memmove+0x16> + + return dst; +} + 80000cee: 6422 ld s0,8(sp) + 80000cf0: 0141 addi sp,sp,16 + 80000cf2: 8082 ret + if(s < d && s + n > d){ + 80000cf4: 02061693 slli a3,a2,0x20 + 80000cf8: 9281 srli a3,a3,0x20 + 80000cfa: 00d58733 add a4,a1,a3 + 80000cfe: fce57be3 bgeu a0,a4,80000cd4 <memmove+0xc> + d += n; + 80000d02: 96aa add a3,a3,a0 + while(n-- > 0) + 80000d04: fff6079b addiw a5,a2,-1 + 80000d08: 1782 slli a5,a5,0x20 + 80000d0a: 9381 srli a5,a5,0x20 + 80000d0c: fff7c793 not a5,a5 + 80000d10: 97ba add a5,a5,a4 + *--d = *--s; + 80000d12: 177d addi a4,a4,-1 + 80000d14: 16fd addi a3,a3,-1 + 80000d16: 00074603 lbu a2,0(a4) + 80000d1a: 00c68023 sb a2,0(a3) + while(n-- > 0) + 80000d1e: fee79ae3 bne a5,a4,80000d12 <memmove+0x4a> + 80000d22: b7f1 j 80000cee <memmove+0x26> + +0000000080000d24 <memcpy>: + +// memcpy exists to placate GCC. Use memmove. +void* +memcpy(void *dst, const void *src, uint n) +{ + 80000d24: 1141 addi sp,sp,-16 + 80000d26: e406 sd ra,8(sp) + 80000d28: e022 sd s0,0(sp) + 80000d2a: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 80000d2c: f9dff0ef jal ra,80000cc8 <memmove> +} + 80000d30: 60a2 ld ra,8(sp) + 80000d32: 6402 ld s0,0(sp) + 80000d34: 0141 addi sp,sp,16 + 80000d36: 8082 ret + +0000000080000d38 <strncmp>: + +int +strncmp(const char *p, const char *q, uint n) +{ + 80000d38: 1141 addi sp,sp,-16 + 80000d3a: e422 sd s0,8(sp) + 80000d3c: 0800 addi s0,sp,16 + while(n > 0 && *p && *p == *q) + 80000d3e: ce11 beqz a2,80000d5a <strncmp+0x22> + 80000d40: 00054783 lbu a5,0(a0) + 80000d44: cf89 beqz a5,80000d5e <strncmp+0x26> + 80000d46: 0005c703 lbu a4,0(a1) + 80000d4a: 00f71a63 bne a4,a5,80000d5e <strncmp+0x26> + n--, p++, q++; + 80000d4e: 367d addiw a2,a2,-1 + 80000d50: 0505 addi a0,a0,1 + 80000d52: 0585 addi a1,a1,1 + while(n > 0 && *p && *p == *q) + 80000d54: f675 bnez a2,80000d40 <strncmp+0x8> + if(n == 0) + return 0; + 80000d56: 4501 li a0,0 + 80000d58: a809 j 80000d6a <strncmp+0x32> + 80000d5a: 4501 li a0,0 + 80000d5c: a039 j 80000d6a <strncmp+0x32> + if(n == 0) + 80000d5e: ca09 beqz a2,80000d70 <strncmp+0x38> + return (uchar)*p - (uchar)*q; + 80000d60: 00054503 lbu a0,0(a0) + 80000d64: 0005c783 lbu a5,0(a1) + 80000d68: 9d1d subw a0,a0,a5 +} + 80000d6a: 6422 ld s0,8(sp) + 80000d6c: 0141 addi sp,sp,16 + 80000d6e: 8082 ret + return 0; + 80000d70: 4501 li a0,0 + 80000d72: bfe5 j 80000d6a <strncmp+0x32> + +0000000080000d74 <strncpy>: + +char* +strncpy(char *s, const char *t, int n) +{ + 80000d74: 1141 addi sp,sp,-16 + 80000d76: e422 sd s0,8(sp) + 80000d78: 0800 addi s0,sp,16 + char *os; + + os = s; + while(n-- > 0 && (*s++ = *t++) != 0) + 80000d7a: 872a mv a4,a0 + 80000d7c: 8832 mv a6,a2 + 80000d7e: 367d addiw a2,a2,-1 + 80000d80: 01005963 blez a6,80000d92 <strncpy+0x1e> + 80000d84: 0705 addi a4,a4,1 + 80000d86: 0005c783 lbu a5,0(a1) + 80000d8a: fef70fa3 sb a5,-1(a4) + 80000d8e: 0585 addi a1,a1,1 + 80000d90: f7f5 bnez a5,80000d7c <strncpy+0x8> + ; + while(n-- > 0) + 80000d92: 86ba mv a3,a4 + 80000d94: 00c05c63 blez a2,80000dac <strncpy+0x38> + *s++ = 0; + 80000d98: 0685 addi a3,a3,1 + 80000d9a: fe068fa3 sb zero,-1(a3) + while(n-- > 0) + 80000d9e: 40d707bb subw a5,a4,a3 + 80000da2: 37fd addiw a5,a5,-1 + 80000da4: 010787bb addw a5,a5,a6 + 80000da8: fef048e3 bgtz a5,80000d98 <strncpy+0x24> + return os; +} + 80000dac: 6422 ld s0,8(sp) + 80000dae: 0141 addi sp,sp,16 + 80000db0: 8082 ret + +0000000080000db2 <safestrcpy>: + +// Like strncpy but guaranteed to NUL-terminate. +char* +safestrcpy(char *s, const char *t, int n) +{ + 80000db2: 1141 addi sp,sp,-16 + 80000db4: e422 sd s0,8(sp) + 80000db6: 0800 addi s0,sp,16 + char *os; + + os = s; + if(n <= 0) + 80000db8: 02c05363 blez a2,80000dde <safestrcpy+0x2c> + 80000dbc: fff6069b addiw a3,a2,-1 + 80000dc0: 1682 slli a3,a3,0x20 + 80000dc2: 9281 srli a3,a3,0x20 + 80000dc4: 96ae add a3,a3,a1 + 80000dc6: 87aa mv a5,a0 + return os; + while(--n > 0 && (*s++ = *t++) != 0) + 80000dc8: 00d58963 beq a1,a3,80000dda <safestrcpy+0x28> + 80000dcc: 0585 addi a1,a1,1 + 80000dce: 0785 addi a5,a5,1 + 80000dd0: fff5c703 lbu a4,-1(a1) + 80000dd4: fee78fa3 sb a4,-1(a5) + 80000dd8: fb65 bnez a4,80000dc8 <safestrcpy+0x16> + ; + *s = 0; + 80000dda: 00078023 sb zero,0(a5) + return os; +} + 80000dde: 6422 ld s0,8(sp) + 80000de0: 0141 addi sp,sp,16 + 80000de2: 8082 ret + +0000000080000de4 <strlen>: + +int +strlen(const char *s) +{ + 80000de4: 1141 addi sp,sp,-16 + 80000de6: e422 sd s0,8(sp) + 80000de8: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 80000dea: 00054783 lbu a5,0(a0) + 80000dee: cf91 beqz a5,80000e0a <strlen+0x26> + 80000df0: 0505 addi a0,a0,1 + 80000df2: 87aa mv a5,a0 + 80000df4: 4685 li a3,1 + 80000df6: 9e89 subw a3,a3,a0 + 80000df8: 00f6853b addw a0,a3,a5 + 80000dfc: 0785 addi a5,a5,1 + 80000dfe: fff7c703 lbu a4,-1(a5) + 80000e02: fb7d bnez a4,80000df8 <strlen+0x14> + ; + return n; +} + 80000e04: 6422 ld s0,8(sp) + 80000e06: 0141 addi sp,sp,16 + 80000e08: 8082 ret + for(n = 0; s[n]; n++) + 80000e0a: 4501 li a0,0 + 80000e0c: bfe5 j 80000e04 <strlen+0x20> + +0000000080000e0e <main>: +volatile static int started = 0; + +// start() jumps here in supervisor mode on all CPUs. +void +main() +{ + 80000e0e: 1141 addi sp,sp,-16 + 80000e10: e406 sd ra,8(sp) + 80000e12: e022 sd s0,0(sp) + 80000e14: 0800 addi s0,sp,16 + if(cpuid() == 0){ + 80000e16: 1e9000ef jal ra,800017fe <cpuid> + virtio_disk_init(); // emulated hard disk + userinit(); // first user process + __sync_synchronize(); + started = 1; + } else { + while(started == 0) + 80000e1a: 00007717 auipc a4,0x7 + 80000e1e: c7e70713 addi a4,a4,-898 # 80007a98 <started> + if(cpuid() == 0){ + 80000e22: c51d beqz a0,80000e50 <main+0x42> + while(started == 0) + 80000e24: 431c lw a5,0(a4) + 80000e26: 2781 sext.w a5,a5 + 80000e28: dff5 beqz a5,80000e24 <main+0x16> + ; + __sync_synchronize(); + 80000e2a: 0ff0000f fence + printf("hart %d starting\n", cpuid()); + 80000e2e: 1d1000ef jal ra,800017fe <cpuid> + 80000e32: 85aa mv a1,a0 + 80000e34: 00006517 auipc a0,0x6 + 80000e38: 27c50513 addi a0,a0,636 # 800070b0 <digits+0x78> + 80000e3c: e66ff0ef jal ra,800004a2 <printf> + kvminithart(); // turn on paging + 80000e40: 080000ef jal ra,80000ec0 <kvminithart> + trapinithart(); // install kernel trap vector + 80000e44: 4fa010ef jal ra,8000233e <trapinithart> + plicinithart(); // ask PLIC for device interrupts + 80000e48: 35c040ef jal ra,800051a4 <plicinithart> + } + + scheduler(); + 80000e4c: 637000ef jal ra,80001c82 <scheduler> + consoleinit(); + 80000e50: d7cff0ef jal ra,800003cc <consoleinit> + printfinit(); + 80000e54: 93dff0ef jal ra,80000790 <printfinit> + printf("\n"); + 80000e58: 00006517 auipc a0,0x6 + 80000e5c: 26850513 addi a0,a0,616 # 800070c0 <digits+0x88> + 80000e60: e42ff0ef jal ra,800004a2 <printf> + printf("xv6 kernel is booting\n"); + 80000e64: 00006517 auipc a0,0x6 + 80000e68: 23450513 addi a0,a0,564 # 80007098 <digits+0x60> + 80000e6c: e36ff0ef jal ra,800004a2 <printf> + printf("\n"); + 80000e70: 00006517 auipc a0,0x6 + 80000e74: 25050513 addi a0,a0,592 # 800070c0 <digits+0x88> + 80000e78: e2aff0ef jal ra,800004a2 <printf> + kinit(); // physical page allocator + 80000e7c: c19ff0ef jal ra,80000a94 <kinit> + kvminit(); // create kernel page table + 80000e80: 2ca000ef jal ra,8000114a <kvminit> + kvminithart(); // turn on paging + 80000e84: 03c000ef jal ra,80000ec0 <kvminithart> + procinit(); // process table + 80000e88: 0cf000ef jal ra,80001756 <procinit> + trapinit(); // trap vectors + 80000e8c: 48e010ef jal ra,8000231a <trapinit> + trapinithart(); // install kernel trap vector + 80000e90: 4ae010ef jal ra,8000233e <trapinithart> + plicinit(); // set up interrupt controller + 80000e94: 2fa040ef jal ra,8000518e <plicinit> + plicinithart(); // ask PLIC for device interrupts + 80000e98: 30c040ef jal ra,800051a4 <plicinithart> + binit(); // buffer cache + 80000e9c: 385010ef jal ra,80002a20 <binit> + iinit(); // inode table + 80000ea0: 160020ef jal ra,80003000 <iinit> + fileinit(); // file table + 80000ea4: 703020ef jal ra,80003da6 <fileinit> + virtio_disk_init(); // emulated hard disk + 80000ea8: 3ec040ef jal ra,80005294 <virtio_disk_init> + userinit(); // first user process + 80000eac: 401000ef jal ra,80001aac <userinit> + __sync_synchronize(); + 80000eb0: 0ff0000f fence + started = 1; + 80000eb4: 4785 li a5,1 + 80000eb6: 00007717 auipc a4,0x7 + 80000eba: bef72123 sw a5,-1054(a4) # 80007a98 <started> + 80000ebe: b779 j 80000e4c <main+0x3e> + +0000000080000ec0 <kvminithart>: + +// Switch h/w page table register to the kernel's page table, +// and enable paging. +void +kvminithart() +{ + 80000ec0: 1141 addi sp,sp,-16 + 80000ec2: e422 sd s0,8(sp) + 80000ec4: 0800 addi s0,sp,16 +// flush the TLB. +static inline void +sfence_vma() +{ + // the zero, zero means flush all TLB entries. + asm volatile("sfence.vma zero, zero"); + 80000ec6: 12000073 sfence.vma + // wait for any previous writes to the page table memory to finish. + sfence_vma(); + + w_satp(MAKE_SATP(kernel_pagetable)); + 80000eca: 00007797 auipc a5,0x7 + 80000ece: bd67b783 ld a5,-1066(a5) # 80007aa0 <kernel_pagetable> + 80000ed2: 83b1 srli a5,a5,0xc + 80000ed4: 577d li a4,-1 + 80000ed6: 177e slli a4,a4,0x3f + 80000ed8: 8fd9 or a5,a5,a4 + asm volatile("csrw satp, %0" : : "r" (x)); + 80000eda: 18079073 csrw satp,a5 + asm volatile("sfence.vma zero, zero"); + 80000ede: 12000073 sfence.vma + + // flush stale entries from the TLB. + sfence_vma(); +} + 80000ee2: 6422 ld s0,8(sp) + 80000ee4: 0141 addi sp,sp,16 + 80000ee6: 8082 ret + +0000000080000ee8 <walk>: +// 21..29 -- 9 bits of level-1 index. +// 12..20 -- 9 bits of level-0 index. +// 0..11 -- 12 bits of byte offset within the page. +pte_t * +walk(pagetable_t pagetable, uint64 va, int alloc) +{ + 80000ee8: 7139 addi sp,sp,-64 + 80000eea: fc06 sd ra,56(sp) + 80000eec: f822 sd s0,48(sp) + 80000eee: f426 sd s1,40(sp) + 80000ef0: f04a sd s2,32(sp) + 80000ef2: ec4e sd s3,24(sp) + 80000ef4: e852 sd s4,16(sp) + 80000ef6: e456 sd s5,8(sp) + 80000ef8: e05a sd s6,0(sp) + 80000efa: 0080 addi s0,sp,64 + 80000efc: 84aa mv s1,a0 + 80000efe: 89ae mv s3,a1 + 80000f00: 8ab2 mv s5,a2 + if(va >= MAXVA) + 80000f02: 57fd li a5,-1 + 80000f04: 83e9 srli a5,a5,0x1a + 80000f06: 4a79 li s4,30 + panic("walk"); + + for(int level = 2; level > 0; level--) { + 80000f08: 4b31 li s6,12 + if(va >= MAXVA) + 80000f0a: 02b7fc63 bgeu a5,a1,80000f42 <walk+0x5a> + panic("walk"); + 80000f0e: 00006517 auipc a0,0x6 + 80000f12: 1ba50513 addi a0,a0,442 # 800070c8 <digits+0x90> + 80000f16: 841ff0ef jal ra,80000756 <panic> + pte_t *pte = &pagetable[PX(level, va)]; + if(*pte & PTE_V) { + pagetable = (pagetable_t)PTE2PA(*pte); + } else { + if(!alloc || (pagetable = (pde_t*)kalloc()) == 0) + 80000f1a: 060a8263 beqz s5,80000f7e <walk+0x96> + 80000f1e: babff0ef jal ra,80000ac8 <kalloc> + 80000f22: 84aa mv s1,a0 + 80000f24: c139 beqz a0,80000f6a <walk+0x82> + return 0; + memset(pagetable, 0, PGSIZE); + 80000f26: 6605 lui a2,0x1 + 80000f28: 4581 li a1,0 + 80000f2a: d43ff0ef jal ra,80000c6c <memset> + *pte = PA2PTE(pagetable) | PTE_V; + 80000f2e: 00c4d793 srli a5,s1,0xc + 80000f32: 07aa slli a5,a5,0xa + 80000f34: 0017e793 ori a5,a5,1 + 80000f38: 00f93023 sd a5,0(s2) + for(int level = 2; level > 0; level--) { + 80000f3c: 3a5d addiw s4,s4,-9 # ffffffffffffeff7 <end+0xffffffff7ffdc807> + 80000f3e: 036a0063 beq s4,s6,80000f5e <walk+0x76> + pte_t *pte = &pagetable[PX(level, va)]; + 80000f42: 0149d933 srl s2,s3,s4 + 80000f46: 1ff97913 andi s2,s2,511 + 80000f4a: 090e slli s2,s2,0x3 + 80000f4c: 9926 add s2,s2,s1 + if(*pte & PTE_V) { + 80000f4e: 00093483 ld s1,0(s2) + 80000f52: 0014f793 andi a5,s1,1 + 80000f56: d3f1 beqz a5,80000f1a <walk+0x32> + pagetable = (pagetable_t)PTE2PA(*pte); + 80000f58: 80a9 srli s1,s1,0xa + 80000f5a: 04b2 slli s1,s1,0xc + 80000f5c: b7c5 j 80000f3c <walk+0x54> + } + } + return &pagetable[PX(0, va)]; + 80000f5e: 00c9d513 srli a0,s3,0xc + 80000f62: 1ff57513 andi a0,a0,511 + 80000f66: 050e slli a0,a0,0x3 + 80000f68: 9526 add a0,a0,s1 +} + 80000f6a: 70e2 ld ra,56(sp) + 80000f6c: 7442 ld s0,48(sp) + 80000f6e: 74a2 ld s1,40(sp) + 80000f70: 7902 ld s2,32(sp) + 80000f72: 69e2 ld s3,24(sp) + 80000f74: 6a42 ld s4,16(sp) + 80000f76: 6aa2 ld s5,8(sp) + 80000f78: 6b02 ld s6,0(sp) + 80000f7a: 6121 addi sp,sp,64 + 80000f7c: 8082 ret + return 0; + 80000f7e: 4501 li a0,0 + 80000f80: b7ed j 80000f6a <walk+0x82> + +0000000080000f82 <walkaddr>: +walkaddr(pagetable_t pagetable, uint64 va) +{ + pte_t *pte; + uint64 pa; + + if(va >= MAXVA) + 80000f82: 57fd li a5,-1 + 80000f84: 83e9 srli a5,a5,0x1a + 80000f86: 00b7f463 bgeu a5,a1,80000f8e <walkaddr+0xc> + return 0; + 80000f8a: 4501 li a0,0 + return 0; + if((*pte & PTE_U) == 0) + return 0; + pa = PTE2PA(*pte); + return pa; +} + 80000f8c: 8082 ret +{ + 80000f8e: 1141 addi sp,sp,-16 + 80000f90: e406 sd ra,8(sp) + 80000f92: e022 sd s0,0(sp) + 80000f94: 0800 addi s0,sp,16 + pte = walk(pagetable, va, 0); + 80000f96: 4601 li a2,0 + 80000f98: f51ff0ef jal ra,80000ee8 <walk> + if(pte == 0) + 80000f9c: c105 beqz a0,80000fbc <walkaddr+0x3a> + if((*pte & PTE_V) == 0) + 80000f9e: 611c ld a5,0(a0) + if((*pte & PTE_U) == 0) + 80000fa0: 0117f693 andi a3,a5,17 + 80000fa4: 4745 li a4,17 + return 0; + 80000fa6: 4501 li a0,0 + if((*pte & PTE_U) == 0) + 80000fa8: 00e68663 beq a3,a4,80000fb4 <walkaddr+0x32> +} + 80000fac: 60a2 ld ra,8(sp) + 80000fae: 6402 ld s0,0(sp) + 80000fb0: 0141 addi sp,sp,16 + 80000fb2: 8082 ret + pa = PTE2PA(*pte); + 80000fb4: 83a9 srli a5,a5,0xa + 80000fb6: 00c79513 slli a0,a5,0xc + return pa; + 80000fba: bfcd j 80000fac <walkaddr+0x2a> + return 0; + 80000fbc: 4501 li a0,0 + 80000fbe: b7fd j 80000fac <walkaddr+0x2a> + +0000000080000fc0 <mappages>: +// va and size MUST be page-aligned. +// Returns 0 on success, -1 if walk() couldn't +// allocate a needed page-table page. +int +mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) +{ + 80000fc0: 715d addi sp,sp,-80 + 80000fc2: e486 sd ra,72(sp) + 80000fc4: e0a2 sd s0,64(sp) + 80000fc6: fc26 sd s1,56(sp) + 80000fc8: f84a sd s2,48(sp) + 80000fca: f44e sd s3,40(sp) + 80000fcc: f052 sd s4,32(sp) + 80000fce: ec56 sd s5,24(sp) + 80000fd0: e85a sd s6,16(sp) + 80000fd2: e45e sd s7,8(sp) + 80000fd4: 0880 addi s0,sp,80 + uint64 a, last; + pte_t *pte; + + if((va % PGSIZE) != 0) + 80000fd6: 03459793 slli a5,a1,0x34 + 80000fda: e7a9 bnez a5,80001024 <mappages+0x64> + 80000fdc: 8aaa mv s5,a0 + 80000fde: 8b3a mv s6,a4 + panic("mappages: va not aligned"); + + if((size % PGSIZE) != 0) + 80000fe0: 03461793 slli a5,a2,0x34 + 80000fe4: e7b1 bnez a5,80001030 <mappages+0x70> + panic("mappages: size not aligned"); + + if(size == 0) + 80000fe6: ca39 beqz a2,8000103c <mappages+0x7c> + panic("mappages: size"); + + a = va; + last = va + size - PGSIZE; + 80000fe8: 77fd lui a5,0xfffff + 80000fea: 963e add a2,a2,a5 + 80000fec: 00b609b3 add s3,a2,a1 + a = va; + 80000ff0: 892e mv s2,a1 + 80000ff2: 40b68a33 sub s4,a3,a1 + if(*pte & PTE_V) + panic("mappages: remap"); + *pte = PA2PTE(pa) | perm | PTE_V; + if(a == last) + break; + a += PGSIZE; + 80000ff6: 6b85 lui s7,0x1 + 80000ff8: 012a04b3 add s1,s4,s2 + if((pte = walk(pagetable, a, 1)) == 0) + 80000ffc: 4605 li a2,1 + 80000ffe: 85ca mv a1,s2 + 80001000: 8556 mv a0,s5 + 80001002: ee7ff0ef jal ra,80000ee8 <walk> + 80001006: c539 beqz a0,80001054 <mappages+0x94> + if(*pte & PTE_V) + 80001008: 611c ld a5,0(a0) + 8000100a: 8b85 andi a5,a5,1 + 8000100c: ef95 bnez a5,80001048 <mappages+0x88> + *pte = PA2PTE(pa) | perm | PTE_V; + 8000100e: 80b1 srli s1,s1,0xc + 80001010: 04aa slli s1,s1,0xa + 80001012: 0164e4b3 or s1,s1,s6 + 80001016: 0014e493 ori s1,s1,1 + 8000101a: e104 sd s1,0(a0) + if(a == last) + 8000101c: 05390863 beq s2,s3,8000106c <mappages+0xac> + a += PGSIZE; + 80001020: 995e add s2,s2,s7 + if((pte = walk(pagetable, a, 1)) == 0) + 80001022: bfd9 j 80000ff8 <mappages+0x38> + panic("mappages: va not aligned"); + 80001024: 00006517 auipc a0,0x6 + 80001028: 0ac50513 addi a0,a0,172 # 800070d0 <digits+0x98> + 8000102c: f2aff0ef jal ra,80000756 <panic> + panic("mappages: size not aligned"); + 80001030: 00006517 auipc a0,0x6 + 80001034: 0c050513 addi a0,a0,192 # 800070f0 <digits+0xb8> + 80001038: f1eff0ef jal ra,80000756 <panic> + panic("mappages: size"); + 8000103c: 00006517 auipc a0,0x6 + 80001040: 0d450513 addi a0,a0,212 # 80007110 <digits+0xd8> + 80001044: f12ff0ef jal ra,80000756 <panic> + panic("mappages: remap"); + 80001048: 00006517 auipc a0,0x6 + 8000104c: 0d850513 addi a0,a0,216 # 80007120 <digits+0xe8> + 80001050: f06ff0ef jal ra,80000756 <panic> + return -1; + 80001054: 557d li a0,-1 + pa += PGSIZE; + } + return 0; +} + 80001056: 60a6 ld ra,72(sp) + 80001058: 6406 ld s0,64(sp) + 8000105a: 74e2 ld s1,56(sp) + 8000105c: 7942 ld s2,48(sp) + 8000105e: 79a2 ld s3,40(sp) + 80001060: 7a02 ld s4,32(sp) + 80001062: 6ae2 ld s5,24(sp) + 80001064: 6b42 ld s6,16(sp) + 80001066: 6ba2 ld s7,8(sp) + 80001068: 6161 addi sp,sp,80 + 8000106a: 8082 ret + return 0; + 8000106c: 4501 li a0,0 + 8000106e: b7e5 j 80001056 <mappages+0x96> + +0000000080001070 <kvmmap>: +{ + 80001070: 1141 addi sp,sp,-16 + 80001072: e406 sd ra,8(sp) + 80001074: e022 sd s0,0(sp) + 80001076: 0800 addi s0,sp,16 + 80001078: 87b6 mv a5,a3 + if(mappages(kpgtbl, va, sz, pa, perm) != 0) + 8000107a: 86b2 mv a3,a2 + 8000107c: 863e mv a2,a5 + 8000107e: f43ff0ef jal ra,80000fc0 <mappages> + 80001082: e509 bnez a0,8000108c <kvmmap+0x1c> +} + 80001084: 60a2 ld ra,8(sp) + 80001086: 6402 ld s0,0(sp) + 80001088: 0141 addi sp,sp,16 + 8000108a: 8082 ret + panic("kvmmap"); + 8000108c: 00006517 auipc a0,0x6 + 80001090: 0a450513 addi a0,a0,164 # 80007130 <digits+0xf8> + 80001094: ec2ff0ef jal ra,80000756 <panic> + +0000000080001098 <kvmmake>: +{ + 80001098: 1101 addi sp,sp,-32 + 8000109a: ec06 sd ra,24(sp) + 8000109c: e822 sd s0,16(sp) + 8000109e: e426 sd s1,8(sp) + 800010a0: e04a sd s2,0(sp) + 800010a2: 1000 addi s0,sp,32 + kpgtbl = (pagetable_t) kalloc(); + 800010a4: a25ff0ef jal ra,80000ac8 <kalloc> + 800010a8: 84aa mv s1,a0 + memset(kpgtbl, 0, PGSIZE); + 800010aa: 6605 lui a2,0x1 + 800010ac: 4581 li a1,0 + 800010ae: bbfff0ef jal ra,80000c6c <memset> + kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); + 800010b2: 4719 li a4,6 + 800010b4: 6685 lui a3,0x1 + 800010b6: 10000637 lui a2,0x10000 + 800010ba: 100005b7 lui a1,0x10000 + 800010be: 8526 mv a0,s1 + 800010c0: fb1ff0ef jal ra,80001070 <kvmmap> + kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + 800010c4: 4719 li a4,6 + 800010c6: 6685 lui a3,0x1 + 800010c8: 10001637 lui a2,0x10001 + 800010cc: 100015b7 lui a1,0x10001 + 800010d0: 8526 mv a0,s1 + 800010d2: f9fff0ef jal ra,80001070 <kvmmap> + kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W); + 800010d6: 4719 li a4,6 + 800010d8: 040006b7 lui a3,0x4000 + 800010dc: 0c000637 lui a2,0xc000 + 800010e0: 0c0005b7 lui a1,0xc000 + 800010e4: 8526 mv a0,s1 + 800010e6: f8bff0ef jal ra,80001070 <kvmmap> + kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + 800010ea: 00006917 auipc s2,0x6 + 800010ee: f1690913 addi s2,s2,-234 # 80007000 <etext> + 800010f2: 4729 li a4,10 + 800010f4: 80006697 auipc a3,0x80006 + 800010f8: f0c68693 addi a3,a3,-244 # 7000 <_entry-0x7fff9000> + 800010fc: 4605 li a2,1 + 800010fe: 067e slli a2,a2,0x1f + 80001100: 85b2 mv a1,a2 + 80001102: 8526 mv a0,s1 + 80001104: f6dff0ef jal ra,80001070 <kvmmap> + kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + 80001108: 4719 li a4,6 + 8000110a: 46c5 li a3,17 + 8000110c: 06ee slli a3,a3,0x1b + 8000110e: 412686b3 sub a3,a3,s2 + 80001112: 864a mv a2,s2 + 80001114: 85ca mv a1,s2 + 80001116: 8526 mv a0,s1 + 80001118: f59ff0ef jal ra,80001070 <kvmmap> + kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + 8000111c: 4729 li a4,10 + 8000111e: 6685 lui a3,0x1 + 80001120: 00005617 auipc a2,0x5 + 80001124: ee060613 addi a2,a2,-288 # 80006000 <_trampoline> + 80001128: 040005b7 lui a1,0x4000 + 8000112c: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 8000112e: 05b2 slli a1,a1,0xc + 80001130: 8526 mv a0,s1 + 80001132: f3fff0ef jal ra,80001070 <kvmmap> + proc_mapstacks(kpgtbl); + 80001136: 8526 mv a0,s1 + 80001138: 594000ef jal ra,800016cc <proc_mapstacks> +} + 8000113c: 8526 mv a0,s1 + 8000113e: 60e2 ld ra,24(sp) + 80001140: 6442 ld s0,16(sp) + 80001142: 64a2 ld s1,8(sp) + 80001144: 6902 ld s2,0(sp) + 80001146: 6105 addi sp,sp,32 + 80001148: 8082 ret + +000000008000114a <kvminit>: +{ + 8000114a: 1141 addi sp,sp,-16 + 8000114c: e406 sd ra,8(sp) + 8000114e: e022 sd s0,0(sp) + 80001150: 0800 addi s0,sp,16 + kernel_pagetable = kvmmake(); + 80001152: f47ff0ef jal ra,80001098 <kvmmake> + 80001156: 00007797 auipc a5,0x7 + 8000115a: 94a7b523 sd a0,-1718(a5) # 80007aa0 <kernel_pagetable> +} + 8000115e: 60a2 ld ra,8(sp) + 80001160: 6402 ld s0,0(sp) + 80001162: 0141 addi sp,sp,16 + 80001164: 8082 ret + +0000000080001166 <uvmunmap>: +// Remove npages of mappings starting from va. va must be +// page-aligned. The mappings must exist. +// Optionally free the physical memory. +void +uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) +{ + 80001166: 715d addi sp,sp,-80 + 80001168: e486 sd ra,72(sp) + 8000116a: e0a2 sd s0,64(sp) + 8000116c: fc26 sd s1,56(sp) + 8000116e: f84a sd s2,48(sp) + 80001170: f44e sd s3,40(sp) + 80001172: f052 sd s4,32(sp) + 80001174: ec56 sd s5,24(sp) + 80001176: e85a sd s6,16(sp) + 80001178: e45e sd s7,8(sp) + 8000117a: 0880 addi s0,sp,80 + uint64 a; + pte_t *pte; + + if((va % PGSIZE) != 0) + 8000117c: 03459793 slli a5,a1,0x34 + 80001180: e795 bnez a5,800011ac <uvmunmap+0x46> + 80001182: 8a2a mv s4,a0 + 80001184: 892e mv s2,a1 + 80001186: 8ab6 mv s5,a3 + panic("uvmunmap: not aligned"); + + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 80001188: 0632 slli a2,a2,0xc + 8000118a: 00b609b3 add s3,a2,a1 + if((pte = walk(pagetable, a, 0)) == 0) + panic("uvmunmap: walk"); + if((*pte & PTE_V) == 0) + panic("uvmunmap: not mapped"); + if(PTE_FLAGS(*pte) == PTE_V) + 8000118e: 4b85 li s7,1 + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 80001190: 6b05 lui s6,0x1 + 80001192: 0535ea63 bltu a1,s3,800011e6 <uvmunmap+0x80> + uint64 pa = PTE2PA(*pte); + kfree((void*)pa); + } + *pte = 0; + } +} + 80001196: 60a6 ld ra,72(sp) + 80001198: 6406 ld s0,64(sp) + 8000119a: 74e2 ld s1,56(sp) + 8000119c: 7942 ld s2,48(sp) + 8000119e: 79a2 ld s3,40(sp) + 800011a0: 7a02 ld s4,32(sp) + 800011a2: 6ae2 ld s5,24(sp) + 800011a4: 6b42 ld s6,16(sp) + 800011a6: 6ba2 ld s7,8(sp) + 800011a8: 6161 addi sp,sp,80 + 800011aa: 8082 ret + panic("uvmunmap: not aligned"); + 800011ac: 00006517 auipc a0,0x6 + 800011b0: f8c50513 addi a0,a0,-116 # 80007138 <digits+0x100> + 800011b4: da2ff0ef jal ra,80000756 <panic> + panic("uvmunmap: walk"); + 800011b8: 00006517 auipc a0,0x6 + 800011bc: f9850513 addi a0,a0,-104 # 80007150 <digits+0x118> + 800011c0: d96ff0ef jal ra,80000756 <panic> + panic("uvmunmap: not mapped"); + 800011c4: 00006517 auipc a0,0x6 + 800011c8: f9c50513 addi a0,a0,-100 # 80007160 <digits+0x128> + 800011cc: d8aff0ef jal ra,80000756 <panic> + panic("uvmunmap: not a leaf"); + 800011d0: 00006517 auipc a0,0x6 + 800011d4: fa850513 addi a0,a0,-88 # 80007178 <digits+0x140> + 800011d8: d7eff0ef jal ra,80000756 <panic> + *pte = 0; + 800011dc: 0004b023 sd zero,0(s1) + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 800011e0: 995a add s2,s2,s6 + 800011e2: fb397ae3 bgeu s2,s3,80001196 <uvmunmap+0x30> + if((pte = walk(pagetable, a, 0)) == 0) + 800011e6: 4601 li a2,0 + 800011e8: 85ca mv a1,s2 + 800011ea: 8552 mv a0,s4 + 800011ec: cfdff0ef jal ra,80000ee8 <walk> + 800011f0: 84aa mv s1,a0 + 800011f2: d179 beqz a0,800011b8 <uvmunmap+0x52> + if((*pte & PTE_V) == 0) + 800011f4: 6108 ld a0,0(a0) + 800011f6: 00157793 andi a5,a0,1 + 800011fa: d7e9 beqz a5,800011c4 <uvmunmap+0x5e> + if(PTE_FLAGS(*pte) == PTE_V) + 800011fc: 3ff57793 andi a5,a0,1023 + 80001200: fd7788e3 beq a5,s7,800011d0 <uvmunmap+0x6a> + if(do_free){ + 80001204: fc0a8ce3 beqz s5,800011dc <uvmunmap+0x76> + uint64 pa = PTE2PA(*pte); + 80001208: 8129 srli a0,a0,0xa + kfree((void*)pa); + 8000120a: 0532 slli a0,a0,0xc + 8000120c: fdaff0ef jal ra,800009e6 <kfree> + 80001210: b7f1 j 800011dc <uvmunmap+0x76> + +0000000080001212 <uvmcreate>: + +// create an empty user page table. +// returns 0 if out of memory. +pagetable_t +uvmcreate() +{ + 80001212: 1101 addi sp,sp,-32 + 80001214: ec06 sd ra,24(sp) + 80001216: e822 sd s0,16(sp) + 80001218: e426 sd s1,8(sp) + 8000121a: 1000 addi s0,sp,32 + pagetable_t pagetable; + pagetable = (pagetable_t) kalloc(); + 8000121c: 8adff0ef jal ra,80000ac8 <kalloc> + 80001220: 84aa mv s1,a0 + if(pagetable == 0) + 80001222: c509 beqz a0,8000122c <uvmcreate+0x1a> + return 0; + memset(pagetable, 0, PGSIZE); + 80001224: 6605 lui a2,0x1 + 80001226: 4581 li a1,0 + 80001228: a45ff0ef jal ra,80000c6c <memset> + return pagetable; +} + 8000122c: 8526 mv a0,s1 + 8000122e: 60e2 ld ra,24(sp) + 80001230: 6442 ld s0,16(sp) + 80001232: 64a2 ld s1,8(sp) + 80001234: 6105 addi sp,sp,32 + 80001236: 8082 ret + +0000000080001238 <uvmfirst>: +// Load the user initcode into address 0 of pagetable, +// for the very first process. +// sz must be less than a page. +void +uvmfirst(pagetable_t pagetable, uchar *src, uint sz) +{ + 80001238: 7179 addi sp,sp,-48 + 8000123a: f406 sd ra,40(sp) + 8000123c: f022 sd s0,32(sp) + 8000123e: ec26 sd s1,24(sp) + 80001240: e84a sd s2,16(sp) + 80001242: e44e sd s3,8(sp) + 80001244: e052 sd s4,0(sp) + 80001246: 1800 addi s0,sp,48 + char *mem; + + if(sz >= PGSIZE) + 80001248: 6785 lui a5,0x1 + 8000124a: 04f67063 bgeu a2,a5,8000128a <uvmfirst+0x52> + 8000124e: 8a2a mv s4,a0 + 80001250: 89ae mv s3,a1 + 80001252: 84b2 mv s1,a2 + panic("uvmfirst: more than a page"); + mem = kalloc(); + 80001254: 875ff0ef jal ra,80000ac8 <kalloc> + 80001258: 892a mv s2,a0 + memset(mem, 0, PGSIZE); + 8000125a: 6605 lui a2,0x1 + 8000125c: 4581 li a1,0 + 8000125e: a0fff0ef jal ra,80000c6c <memset> + mappages(pagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X|PTE_U); + 80001262: 4779 li a4,30 + 80001264: 86ca mv a3,s2 + 80001266: 6605 lui a2,0x1 + 80001268: 4581 li a1,0 + 8000126a: 8552 mv a0,s4 + 8000126c: d55ff0ef jal ra,80000fc0 <mappages> + memmove(mem, src, sz); + 80001270: 8626 mv a2,s1 + 80001272: 85ce mv a1,s3 + 80001274: 854a mv a0,s2 + 80001276: a53ff0ef jal ra,80000cc8 <memmove> +} + 8000127a: 70a2 ld ra,40(sp) + 8000127c: 7402 ld s0,32(sp) + 8000127e: 64e2 ld s1,24(sp) + 80001280: 6942 ld s2,16(sp) + 80001282: 69a2 ld s3,8(sp) + 80001284: 6a02 ld s4,0(sp) + 80001286: 6145 addi sp,sp,48 + 80001288: 8082 ret + panic("uvmfirst: more than a page"); + 8000128a: 00006517 auipc a0,0x6 + 8000128e: f0650513 addi a0,a0,-250 # 80007190 <digits+0x158> + 80001292: cc4ff0ef jal ra,80000756 <panic> + +0000000080001296 <uvmdealloc>: +// 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. +uint64 +uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) +{ + 80001296: 1101 addi sp,sp,-32 + 80001298: ec06 sd ra,24(sp) + 8000129a: e822 sd s0,16(sp) + 8000129c: e426 sd s1,8(sp) + 8000129e: 1000 addi s0,sp,32 + if(newsz >= oldsz) + return oldsz; + 800012a0: 84ae mv s1,a1 + if(newsz >= oldsz) + 800012a2: 00b67d63 bgeu a2,a1,800012bc <uvmdealloc+0x26> + 800012a6: 84b2 mv s1,a2 + + if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){ + 800012a8: 6785 lui a5,0x1 + 800012aa: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800012ac: 00f60733 add a4,a2,a5 + 800012b0: 76fd lui a3,0xfffff + 800012b2: 8f75 and a4,a4,a3 + 800012b4: 97ae add a5,a5,a1 + 800012b6: 8ff5 and a5,a5,a3 + 800012b8: 00f76863 bltu a4,a5,800012c8 <uvmdealloc+0x32> + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + } + + return newsz; +} + 800012bc: 8526 mv a0,s1 + 800012be: 60e2 ld ra,24(sp) + 800012c0: 6442 ld s0,16(sp) + 800012c2: 64a2 ld s1,8(sp) + 800012c4: 6105 addi sp,sp,32 + 800012c6: 8082 ret + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + 800012c8: 8f99 sub a5,a5,a4 + 800012ca: 83b1 srli a5,a5,0xc + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + 800012cc: 4685 li a3,1 + 800012ce: 0007861b sext.w a2,a5 + 800012d2: 85ba mv a1,a4 + 800012d4: e93ff0ef jal ra,80001166 <uvmunmap> + 800012d8: b7d5 j 800012bc <uvmdealloc+0x26> + +00000000800012da <uvmalloc>: + if(newsz < oldsz) + 800012da: 08b66963 bltu a2,a1,8000136c <uvmalloc+0x92> +{ + 800012de: 7139 addi sp,sp,-64 + 800012e0: fc06 sd ra,56(sp) + 800012e2: f822 sd s0,48(sp) + 800012e4: f426 sd s1,40(sp) + 800012e6: f04a sd s2,32(sp) + 800012e8: ec4e sd s3,24(sp) + 800012ea: e852 sd s4,16(sp) + 800012ec: e456 sd s5,8(sp) + 800012ee: e05a sd s6,0(sp) + 800012f0: 0080 addi s0,sp,64 + 800012f2: 8aaa mv s5,a0 + 800012f4: 8a32 mv s4,a2 + oldsz = PGROUNDUP(oldsz); + 800012f6: 6785 lui a5,0x1 + 800012f8: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800012fa: 95be add a1,a1,a5 + 800012fc: 77fd lui a5,0xfffff + 800012fe: 00f5f9b3 and s3,a1,a5 + for(a = oldsz; a < newsz; a += PGSIZE){ + 80001302: 06c9f763 bgeu s3,a2,80001370 <uvmalloc+0x96> + 80001306: 894e mv s2,s3 + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 80001308: 0126eb13 ori s6,a3,18 + mem = kalloc(); + 8000130c: fbcff0ef jal ra,80000ac8 <kalloc> + 80001310: 84aa mv s1,a0 + if(mem == 0){ + 80001312: c11d beqz a0,80001338 <uvmalloc+0x5e> + memset(mem, 0, PGSIZE); + 80001314: 6605 lui a2,0x1 + 80001316: 4581 li a1,0 + 80001318: 955ff0ef jal ra,80000c6c <memset> + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 8000131c: 875a mv a4,s6 + 8000131e: 86a6 mv a3,s1 + 80001320: 6605 lui a2,0x1 + 80001322: 85ca mv a1,s2 + 80001324: 8556 mv a0,s5 + 80001326: c9bff0ef jal ra,80000fc0 <mappages> + 8000132a: e51d bnez a0,80001358 <uvmalloc+0x7e> + for(a = oldsz; a < newsz; a += PGSIZE){ + 8000132c: 6785 lui a5,0x1 + 8000132e: 993e add s2,s2,a5 + 80001330: fd496ee3 bltu s2,s4,8000130c <uvmalloc+0x32> + return newsz; + 80001334: 8552 mv a0,s4 + 80001336: a039 j 80001344 <uvmalloc+0x6a> + uvmdealloc(pagetable, a, oldsz); + 80001338: 864e mv a2,s3 + 8000133a: 85ca mv a1,s2 + 8000133c: 8556 mv a0,s5 + 8000133e: f59ff0ef jal ra,80001296 <uvmdealloc> + return 0; + 80001342: 4501 li a0,0 +} + 80001344: 70e2 ld ra,56(sp) + 80001346: 7442 ld s0,48(sp) + 80001348: 74a2 ld s1,40(sp) + 8000134a: 7902 ld s2,32(sp) + 8000134c: 69e2 ld s3,24(sp) + 8000134e: 6a42 ld s4,16(sp) + 80001350: 6aa2 ld s5,8(sp) + 80001352: 6b02 ld s6,0(sp) + 80001354: 6121 addi sp,sp,64 + 80001356: 8082 ret + kfree(mem); + 80001358: 8526 mv a0,s1 + 8000135a: e8cff0ef jal ra,800009e6 <kfree> + uvmdealloc(pagetable, a, oldsz); + 8000135e: 864e mv a2,s3 + 80001360: 85ca mv a1,s2 + 80001362: 8556 mv a0,s5 + 80001364: f33ff0ef jal ra,80001296 <uvmdealloc> + return 0; + 80001368: 4501 li a0,0 + 8000136a: bfe9 j 80001344 <uvmalloc+0x6a> + return oldsz; + 8000136c: 852e mv a0,a1 +} + 8000136e: 8082 ret + return newsz; + 80001370: 8532 mv a0,a2 + 80001372: bfc9 j 80001344 <uvmalloc+0x6a> + +0000000080001374 <freewalk>: + +// Recursively free page-table pages. +// All leaf mappings must already have been removed. +void +freewalk(pagetable_t pagetable) +{ + 80001374: 7179 addi sp,sp,-48 + 80001376: f406 sd ra,40(sp) + 80001378: f022 sd s0,32(sp) + 8000137a: ec26 sd s1,24(sp) + 8000137c: e84a sd s2,16(sp) + 8000137e: e44e sd s3,8(sp) + 80001380: e052 sd s4,0(sp) + 80001382: 1800 addi s0,sp,48 + 80001384: 8a2a mv s4,a0 + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + 80001386: 84aa mv s1,a0 + 80001388: 6905 lui s2,0x1 + 8000138a: 992a add s2,s2,a0 + pte_t pte = pagetable[i]; + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 8000138c: 4985 li s3,1 + 8000138e: a819 j 800013a4 <freewalk+0x30> + // this PTE points to a lower-level page table. + uint64 child = PTE2PA(pte); + 80001390: 83a9 srli a5,a5,0xa + freewalk((pagetable_t)child); + 80001392: 00c79513 slli a0,a5,0xc + 80001396: fdfff0ef jal ra,80001374 <freewalk> + pagetable[i] = 0; + 8000139a: 0004b023 sd zero,0(s1) + for(int i = 0; i < 512; i++){ + 8000139e: 04a1 addi s1,s1,8 + 800013a0: 01248f63 beq s1,s2,800013be <freewalk+0x4a> + pte_t pte = pagetable[i]; + 800013a4: 609c ld a5,0(s1) + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 800013a6: 00f7f713 andi a4,a5,15 + 800013aa: ff3703e3 beq a4,s3,80001390 <freewalk+0x1c> + } else if(pte & PTE_V){ + 800013ae: 8b85 andi a5,a5,1 + 800013b0: d7fd beqz a5,8000139e <freewalk+0x2a> + panic("freewalk: leaf"); + 800013b2: 00006517 auipc a0,0x6 + 800013b6: dfe50513 addi a0,a0,-514 # 800071b0 <digits+0x178> + 800013ba: b9cff0ef jal ra,80000756 <panic> + } + } + kfree((void*)pagetable); + 800013be: 8552 mv a0,s4 + 800013c0: e26ff0ef jal ra,800009e6 <kfree> +} + 800013c4: 70a2 ld ra,40(sp) + 800013c6: 7402 ld s0,32(sp) + 800013c8: 64e2 ld s1,24(sp) + 800013ca: 6942 ld s2,16(sp) + 800013cc: 69a2 ld s3,8(sp) + 800013ce: 6a02 ld s4,0(sp) + 800013d0: 6145 addi sp,sp,48 + 800013d2: 8082 ret + +00000000800013d4 <uvmfree>: + +// Free user memory pages, +// then free page-table pages. +void +uvmfree(pagetable_t pagetable, uint64 sz) +{ + 800013d4: 1101 addi sp,sp,-32 + 800013d6: ec06 sd ra,24(sp) + 800013d8: e822 sd s0,16(sp) + 800013da: e426 sd s1,8(sp) + 800013dc: 1000 addi s0,sp,32 + 800013de: 84aa mv s1,a0 + if(sz > 0) + 800013e0: e989 bnez a1,800013f2 <uvmfree+0x1e> + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + freewalk(pagetable); + 800013e2: 8526 mv a0,s1 + 800013e4: f91ff0ef jal ra,80001374 <freewalk> +} + 800013e8: 60e2 ld ra,24(sp) + 800013ea: 6442 ld s0,16(sp) + 800013ec: 64a2 ld s1,8(sp) + 800013ee: 6105 addi sp,sp,32 + 800013f0: 8082 ret + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + 800013f2: 6785 lui a5,0x1 + 800013f4: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800013f6: 95be add a1,a1,a5 + 800013f8: 4685 li a3,1 + 800013fa: 00c5d613 srli a2,a1,0xc + 800013fe: 4581 li a1,0 + 80001400: d67ff0ef jal ra,80001166 <uvmunmap> + 80001404: bff9 j 800013e2 <uvmfree+0xe> + +0000000080001406 <uvmcopy>: + pte_t *pte; + uint64 pa, i; + uint flags; + char *mem; + + for(i = 0; i < sz; i += PGSIZE){ + 80001406: c65d beqz a2,800014b4 <uvmcopy+0xae> +{ + 80001408: 715d addi sp,sp,-80 + 8000140a: e486 sd ra,72(sp) + 8000140c: e0a2 sd s0,64(sp) + 8000140e: fc26 sd s1,56(sp) + 80001410: f84a sd s2,48(sp) + 80001412: f44e sd s3,40(sp) + 80001414: f052 sd s4,32(sp) + 80001416: ec56 sd s5,24(sp) + 80001418: e85a sd s6,16(sp) + 8000141a: e45e sd s7,8(sp) + 8000141c: 0880 addi s0,sp,80 + 8000141e: 8b2a mv s6,a0 + 80001420: 8aae mv s5,a1 + 80001422: 8a32 mv s4,a2 + for(i = 0; i < sz; i += PGSIZE){ + 80001424: 4981 li s3,0 + if((pte = walk(old, i, 0)) == 0) + 80001426: 4601 li a2,0 + 80001428: 85ce mv a1,s3 + 8000142a: 855a mv a0,s6 + 8000142c: abdff0ef jal ra,80000ee8 <walk> + 80001430: c121 beqz a0,80001470 <uvmcopy+0x6a> + panic("uvmcopy: pte should exist"); + if((*pte & PTE_V) == 0) + 80001432: 6118 ld a4,0(a0) + 80001434: 00177793 andi a5,a4,1 + 80001438: c3b1 beqz a5,8000147c <uvmcopy+0x76> + panic("uvmcopy: page not present"); + pa = PTE2PA(*pte); + 8000143a: 00a75593 srli a1,a4,0xa + 8000143e: 00c59b93 slli s7,a1,0xc + flags = PTE_FLAGS(*pte); + 80001442: 3ff77493 andi s1,a4,1023 + if((mem = kalloc()) == 0) + 80001446: e82ff0ef jal ra,80000ac8 <kalloc> + 8000144a: 892a mv s2,a0 + 8000144c: c129 beqz a0,8000148e <uvmcopy+0x88> + goto err; + memmove(mem, (char*)pa, PGSIZE); + 8000144e: 6605 lui a2,0x1 + 80001450: 85de mv a1,s7 + 80001452: 877ff0ef jal ra,80000cc8 <memmove> + if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0){ + 80001456: 8726 mv a4,s1 + 80001458: 86ca mv a3,s2 + 8000145a: 6605 lui a2,0x1 + 8000145c: 85ce mv a1,s3 + 8000145e: 8556 mv a0,s5 + 80001460: b61ff0ef jal ra,80000fc0 <mappages> + 80001464: e115 bnez a0,80001488 <uvmcopy+0x82> + for(i = 0; i < sz; i += PGSIZE){ + 80001466: 6785 lui a5,0x1 + 80001468: 99be add s3,s3,a5 + 8000146a: fb49eee3 bltu s3,s4,80001426 <uvmcopy+0x20> + 8000146e: a805 j 8000149e <uvmcopy+0x98> + panic("uvmcopy: pte should exist"); + 80001470: 00006517 auipc a0,0x6 + 80001474: d5050513 addi a0,a0,-688 # 800071c0 <digits+0x188> + 80001478: adeff0ef jal ra,80000756 <panic> + panic("uvmcopy: page not present"); + 8000147c: 00006517 auipc a0,0x6 + 80001480: d6450513 addi a0,a0,-668 # 800071e0 <digits+0x1a8> + 80001484: ad2ff0ef jal ra,80000756 <panic> + kfree(mem); + 80001488: 854a mv a0,s2 + 8000148a: d5cff0ef jal ra,800009e6 <kfree> + } + } + return 0; + + err: + uvmunmap(new, 0, i / PGSIZE, 1); + 8000148e: 4685 li a3,1 + 80001490: 00c9d613 srli a2,s3,0xc + 80001494: 4581 li a1,0 + 80001496: 8556 mv a0,s5 + 80001498: ccfff0ef jal ra,80001166 <uvmunmap> + return -1; + 8000149c: 557d li a0,-1 +} + 8000149e: 60a6 ld ra,72(sp) + 800014a0: 6406 ld s0,64(sp) + 800014a2: 74e2 ld s1,56(sp) + 800014a4: 7942 ld s2,48(sp) + 800014a6: 79a2 ld s3,40(sp) + 800014a8: 7a02 ld s4,32(sp) + 800014aa: 6ae2 ld s5,24(sp) + 800014ac: 6b42 ld s6,16(sp) + 800014ae: 6ba2 ld s7,8(sp) + 800014b0: 6161 addi sp,sp,80 + 800014b2: 8082 ret + return 0; + 800014b4: 4501 li a0,0 +} + 800014b6: 8082 ret + +00000000800014b8 <uvmclear>: + +// mark a PTE invalid for user access. +// used by exec for the user stack guard page. +void +uvmclear(pagetable_t pagetable, uint64 va) +{ + 800014b8: 1141 addi sp,sp,-16 + 800014ba: e406 sd ra,8(sp) + 800014bc: e022 sd s0,0(sp) + 800014be: 0800 addi s0,sp,16 + pte_t *pte; + + pte = walk(pagetable, va, 0); + 800014c0: 4601 li a2,0 + 800014c2: a27ff0ef jal ra,80000ee8 <walk> + if(pte == 0) + 800014c6: c901 beqz a0,800014d6 <uvmclear+0x1e> + panic("uvmclear"); + *pte &= ~PTE_U; + 800014c8: 611c ld a5,0(a0) + 800014ca: 9bbd andi a5,a5,-17 + 800014cc: e11c sd a5,0(a0) +} + 800014ce: 60a2 ld ra,8(sp) + 800014d0: 6402 ld s0,0(sp) + 800014d2: 0141 addi sp,sp,16 + 800014d4: 8082 ret + panic("uvmclear"); + 800014d6: 00006517 auipc a0,0x6 + 800014da: d2a50513 addi a0,a0,-726 # 80007200 <digits+0x1c8> + 800014de: a78ff0ef jal ra,80000756 <panic> + +00000000800014e2 <copyout>: +copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len) +{ + uint64 n, va0, pa0; + pte_t *pte; + + while(len > 0){ + 800014e2: c6c9 beqz a3,8000156c <copyout+0x8a> +{ + 800014e4: 711d addi sp,sp,-96 + 800014e6: ec86 sd ra,88(sp) + 800014e8: e8a2 sd s0,80(sp) + 800014ea: e4a6 sd s1,72(sp) + 800014ec: e0ca sd s2,64(sp) + 800014ee: fc4e sd s3,56(sp) + 800014f0: f852 sd s4,48(sp) + 800014f2: f456 sd s5,40(sp) + 800014f4: f05a sd s6,32(sp) + 800014f6: ec5e sd s7,24(sp) + 800014f8: e862 sd s8,16(sp) + 800014fa: e466 sd s9,8(sp) + 800014fc: e06a sd s10,0(sp) + 800014fe: 1080 addi s0,sp,96 + 80001500: 8baa mv s7,a0 + 80001502: 8aae mv s5,a1 + 80001504: 8b32 mv s6,a2 + 80001506: 89b6 mv s3,a3 + va0 = PGROUNDDOWN(dstva); + 80001508: 74fd lui s1,0xfffff + 8000150a: 8ced and s1,s1,a1 + if(va0 >= MAXVA) + 8000150c: 57fd li a5,-1 + 8000150e: 83e9 srli a5,a5,0x1a + 80001510: 0697e063 bltu a5,s1,80001570 <copyout+0x8e> + return -1; + pte = walk(pagetable, va0, 0); + if(pte == 0 || (*pte & PTE_V) == 0 || (*pte & PTE_U) == 0 || + 80001514: 4cd5 li s9,21 + 80001516: 6d05 lui s10,0x1 + if(va0 >= MAXVA) + 80001518: 8c3e mv s8,a5 + 8000151a: a025 j 80001542 <copyout+0x60> + (*pte & PTE_W) == 0) + return -1; + pa0 = PTE2PA(*pte); + 8000151c: 83a9 srli a5,a5,0xa + 8000151e: 07b2 slli a5,a5,0xc + n = PGSIZE - (dstva - va0); + if(n > len) + n = len; + memmove((void *)(pa0 + (dstva - va0)), src, n); + 80001520: 409a8533 sub a0,s5,s1 + 80001524: 0009061b sext.w a2,s2 + 80001528: 85da mv a1,s6 + 8000152a: 953e add a0,a0,a5 + 8000152c: f9cff0ef jal ra,80000cc8 <memmove> + + len -= n; + 80001530: 412989b3 sub s3,s3,s2 + src += n; + 80001534: 9b4a add s6,s6,s2 + while(len > 0){ + 80001536: 02098963 beqz s3,80001568 <copyout+0x86> + if(va0 >= MAXVA) + 8000153a: 034c6d63 bltu s8,s4,80001574 <copyout+0x92> + va0 = PGROUNDDOWN(dstva); + 8000153e: 84d2 mv s1,s4 + dstva = va0 + PGSIZE; + 80001540: 8ad2 mv s5,s4 + pte = walk(pagetable, va0, 0); + 80001542: 4601 li a2,0 + 80001544: 85a6 mv a1,s1 + 80001546: 855e mv a0,s7 + 80001548: 9a1ff0ef jal ra,80000ee8 <walk> + if(pte == 0 || (*pte & PTE_V) == 0 || (*pte & PTE_U) == 0 || + 8000154c: c515 beqz a0,80001578 <copyout+0x96> + 8000154e: 611c ld a5,0(a0) + 80001550: 0157f713 andi a4,a5,21 + 80001554: 05971163 bne a4,s9,80001596 <copyout+0xb4> + n = PGSIZE - (dstva - va0); + 80001558: 01a48a33 add s4,s1,s10 + 8000155c: 415a0933 sub s2,s4,s5 + 80001560: fb29fee3 bgeu s3,s2,8000151c <copyout+0x3a> + 80001564: 894e mv s2,s3 + 80001566: bf5d j 8000151c <copyout+0x3a> + } + return 0; + 80001568: 4501 li a0,0 + 8000156a: a801 j 8000157a <copyout+0x98> + 8000156c: 4501 li a0,0 +} + 8000156e: 8082 ret + return -1; + 80001570: 557d li a0,-1 + 80001572: a021 j 8000157a <copyout+0x98> + 80001574: 557d li a0,-1 + 80001576: a011 j 8000157a <copyout+0x98> + return -1; + 80001578: 557d li a0,-1 +} + 8000157a: 60e6 ld ra,88(sp) + 8000157c: 6446 ld s0,80(sp) + 8000157e: 64a6 ld s1,72(sp) + 80001580: 6906 ld s2,64(sp) + 80001582: 79e2 ld s3,56(sp) + 80001584: 7a42 ld s4,48(sp) + 80001586: 7aa2 ld s5,40(sp) + 80001588: 7b02 ld s6,32(sp) + 8000158a: 6be2 ld s7,24(sp) + 8000158c: 6c42 ld s8,16(sp) + 8000158e: 6ca2 ld s9,8(sp) + 80001590: 6d02 ld s10,0(sp) + 80001592: 6125 addi sp,sp,96 + 80001594: 8082 ret + return -1; + 80001596: 557d li a0,-1 + 80001598: b7cd j 8000157a <copyout+0x98> + +000000008000159a <copyin>: +int +copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) +{ + uint64 n, va0, pa0; + + while(len > 0){ + 8000159a: c6a5 beqz a3,80001602 <copyin+0x68> +{ + 8000159c: 715d addi sp,sp,-80 + 8000159e: e486 sd ra,72(sp) + 800015a0: e0a2 sd s0,64(sp) + 800015a2: fc26 sd s1,56(sp) + 800015a4: f84a sd s2,48(sp) + 800015a6: f44e sd s3,40(sp) + 800015a8: f052 sd s4,32(sp) + 800015aa: ec56 sd s5,24(sp) + 800015ac: e85a sd s6,16(sp) + 800015ae: e45e sd s7,8(sp) + 800015b0: e062 sd s8,0(sp) + 800015b2: 0880 addi s0,sp,80 + 800015b4: 8b2a mv s6,a0 + 800015b6: 8a2e mv s4,a1 + 800015b8: 8c32 mv s8,a2 + 800015ba: 89b6 mv s3,a3 + va0 = PGROUNDDOWN(srcva); + 800015bc: 7bfd lui s7,0xfffff + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) + return -1; + n = PGSIZE - (srcva - va0); + 800015be: 6a85 lui s5,0x1 + 800015c0: a00d j 800015e2 <copyin+0x48> + if(n > len) + n = len; + memmove(dst, (void *)(pa0 + (srcva - va0)), n); + 800015c2: 018505b3 add a1,a0,s8 + 800015c6: 0004861b sext.w a2,s1 + 800015ca: 412585b3 sub a1,a1,s2 + 800015ce: 8552 mv a0,s4 + 800015d0: ef8ff0ef jal ra,80000cc8 <memmove> + + len -= n; + 800015d4: 409989b3 sub s3,s3,s1 + dst += n; + 800015d8: 9a26 add s4,s4,s1 + srcva = va0 + PGSIZE; + 800015da: 01590c33 add s8,s2,s5 + while(len > 0){ + 800015de: 02098063 beqz s3,800015fe <copyin+0x64> + va0 = PGROUNDDOWN(srcva); + 800015e2: 017c7933 and s2,s8,s7 + pa0 = walkaddr(pagetable, va0); + 800015e6: 85ca mv a1,s2 + 800015e8: 855a mv a0,s6 + 800015ea: 999ff0ef jal ra,80000f82 <walkaddr> + if(pa0 == 0) + 800015ee: cd01 beqz a0,80001606 <copyin+0x6c> + n = PGSIZE - (srcva - va0); + 800015f0: 418904b3 sub s1,s2,s8 + 800015f4: 94d6 add s1,s1,s5 + 800015f6: fc99f6e3 bgeu s3,s1,800015c2 <copyin+0x28> + 800015fa: 84ce mv s1,s3 + 800015fc: b7d9 j 800015c2 <copyin+0x28> + } + return 0; + 800015fe: 4501 li a0,0 + 80001600: a021 j 80001608 <copyin+0x6e> + 80001602: 4501 li a0,0 +} + 80001604: 8082 ret + return -1; + 80001606: 557d li a0,-1 +} + 80001608: 60a6 ld ra,72(sp) + 8000160a: 6406 ld s0,64(sp) + 8000160c: 74e2 ld s1,56(sp) + 8000160e: 7942 ld s2,48(sp) + 80001610: 79a2 ld s3,40(sp) + 80001612: 7a02 ld s4,32(sp) + 80001614: 6ae2 ld s5,24(sp) + 80001616: 6b42 ld s6,16(sp) + 80001618: 6ba2 ld s7,8(sp) + 8000161a: 6c02 ld s8,0(sp) + 8000161c: 6161 addi sp,sp,80 + 8000161e: 8082 ret + +0000000080001620 <copyinstr>: +copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) +{ + uint64 n, va0, pa0; + int got_null = 0; + + while(got_null == 0 && max > 0){ + 80001620: c2cd beqz a3,800016c2 <copyinstr+0xa2> +{ + 80001622: 715d addi sp,sp,-80 + 80001624: e486 sd ra,72(sp) + 80001626: e0a2 sd s0,64(sp) + 80001628: fc26 sd s1,56(sp) + 8000162a: f84a sd s2,48(sp) + 8000162c: f44e sd s3,40(sp) + 8000162e: f052 sd s4,32(sp) + 80001630: ec56 sd s5,24(sp) + 80001632: e85a sd s6,16(sp) + 80001634: e45e sd s7,8(sp) + 80001636: 0880 addi s0,sp,80 + 80001638: 8a2a mv s4,a0 + 8000163a: 8b2e mv s6,a1 + 8000163c: 8bb2 mv s7,a2 + 8000163e: 84b6 mv s1,a3 + va0 = PGROUNDDOWN(srcva); + 80001640: 7afd lui s5,0xfffff + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) + return -1; + n = PGSIZE - (srcva - va0); + 80001642: 6985 lui s3,0x1 + 80001644: a02d j 8000166e <copyinstr+0x4e> + n = max; + + char *p = (char *) (pa0 + (srcva - va0)); + while(n > 0){ + if(*p == '\0'){ + *dst = '\0'; + 80001646: 00078023 sb zero,0(a5) # 1000 <_entry-0x7ffff000> + 8000164a: 4785 li a5,1 + dst++; + } + + srcva = va0 + PGSIZE; + } + if(got_null){ + 8000164c: 37fd addiw a5,a5,-1 + 8000164e: 0007851b sext.w a0,a5 + return 0; + } else { + return -1; + } +} + 80001652: 60a6 ld ra,72(sp) + 80001654: 6406 ld s0,64(sp) + 80001656: 74e2 ld s1,56(sp) + 80001658: 7942 ld s2,48(sp) + 8000165a: 79a2 ld s3,40(sp) + 8000165c: 7a02 ld s4,32(sp) + 8000165e: 6ae2 ld s5,24(sp) + 80001660: 6b42 ld s6,16(sp) + 80001662: 6ba2 ld s7,8(sp) + 80001664: 6161 addi sp,sp,80 + 80001666: 8082 ret + srcva = va0 + PGSIZE; + 80001668: 01390bb3 add s7,s2,s3 + while(got_null == 0 && max > 0){ + 8000166c: c4b9 beqz s1,800016ba <copyinstr+0x9a> + va0 = PGROUNDDOWN(srcva); + 8000166e: 015bf933 and s2,s7,s5 + pa0 = walkaddr(pagetable, va0); + 80001672: 85ca mv a1,s2 + 80001674: 8552 mv a0,s4 + 80001676: 90dff0ef jal ra,80000f82 <walkaddr> + if(pa0 == 0) + 8000167a: c131 beqz a0,800016be <copyinstr+0x9e> + n = PGSIZE - (srcva - va0); + 8000167c: 417906b3 sub a3,s2,s7 + 80001680: 96ce add a3,a3,s3 + 80001682: 00d4f363 bgeu s1,a3,80001688 <copyinstr+0x68> + 80001686: 86a6 mv a3,s1 + char *p = (char *) (pa0 + (srcva - va0)); + 80001688: 955e add a0,a0,s7 + 8000168a: 41250533 sub a0,a0,s2 + while(n > 0){ + 8000168e: dee9 beqz a3,80001668 <copyinstr+0x48> + 80001690: 87da mv a5,s6 + if(*p == '\0'){ + 80001692: 41650633 sub a2,a0,s6 + 80001696: fff48593 addi a1,s1,-1 # ffffffffffffefff <end+0xffffffff7ffdc80f> + 8000169a: 95da add a1,a1,s6 + while(n > 0){ + 8000169c: 96da add a3,a3,s6 + if(*p == '\0'){ + 8000169e: 00f60733 add a4,a2,a5 + 800016a2: 00074703 lbu a4,0(a4) + 800016a6: d345 beqz a4,80001646 <copyinstr+0x26> + *dst = *p; + 800016a8: 00e78023 sb a4,0(a5) + --max; + 800016ac: 40f584b3 sub s1,a1,a5 + dst++; + 800016b0: 0785 addi a5,a5,1 + while(n > 0){ + 800016b2: fed796e3 bne a5,a3,8000169e <copyinstr+0x7e> + dst++; + 800016b6: 8b3e mv s6,a5 + 800016b8: bf45 j 80001668 <copyinstr+0x48> + 800016ba: 4781 li a5,0 + 800016bc: bf41 j 8000164c <copyinstr+0x2c> + return -1; + 800016be: 557d li a0,-1 + 800016c0: bf49 j 80001652 <copyinstr+0x32> + int got_null = 0; + 800016c2: 4781 li a5,0 + if(got_null){ + 800016c4: 37fd addiw a5,a5,-1 + 800016c6: 0007851b sext.w a0,a5 +} + 800016ca: 8082 ret + +00000000800016cc <proc_mapstacks>: +// Allocate a page for each process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +void +proc_mapstacks(pagetable_t kpgtbl) +{ + 800016cc: 7139 addi sp,sp,-64 + 800016ce: fc06 sd ra,56(sp) + 800016d0: f822 sd s0,48(sp) + 800016d2: f426 sd s1,40(sp) + 800016d4: f04a sd s2,32(sp) + 800016d6: ec4e sd s3,24(sp) + 800016d8: e852 sd s4,16(sp) + 800016da: e456 sd s5,8(sp) + 800016dc: e05a sd s6,0(sp) + 800016de: 0080 addi s0,sp,64 + 800016e0: 89aa mv s3,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 800016e2: 0000f497 auipc s1,0xf + 800016e6: 92e48493 addi s1,s1,-1746 # 80010010 <proc> + char *pa = kalloc(); + if(pa == 0) + panic("kalloc"); + uint64 va = KSTACK((int) (p - proc)); + 800016ea: 8b26 mv s6,s1 + 800016ec: 00006a97 auipc s5,0x6 + 800016f0: 914a8a93 addi s5,s5,-1772 # 80007000 <etext> + 800016f4: 04000937 lui s2,0x4000 + 800016f8: 197d addi s2,s2,-1 # 3ffffff <_entry-0x7c000001> + 800016fa: 0932 slli s2,s2,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 800016fc: 00016a17 auipc s4,0x16 + 80001700: d14a0a13 addi s4,s4,-748 # 80017410 <tickslock> + char *pa = kalloc(); + 80001704: bc4ff0ef jal ra,80000ac8 <kalloc> + 80001708: 862a mv a2,a0 + if(pa == 0) + 8000170a: c121 beqz a0,8000174a <proc_mapstacks+0x7e> + uint64 va = KSTACK((int) (p - proc)); + 8000170c: 416485b3 sub a1,s1,s6 + 80001710: 8591 srai a1,a1,0x4 + 80001712: 000ab783 ld a5,0(s5) + 80001716: 02f585b3 mul a1,a1,a5 + 8000171a: 2585 addiw a1,a1,1 + 8000171c: 00d5959b slliw a1,a1,0xd + kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); + 80001720: 4719 li a4,6 + 80001722: 6685 lui a3,0x1 + 80001724: 40b905b3 sub a1,s2,a1 + 80001728: 854e mv a0,s3 + 8000172a: 947ff0ef jal ra,80001070 <kvmmap> + for(p = proc; p < &proc[NPROC]; p++) { + 8000172e: 1d048493 addi s1,s1,464 + 80001732: fd4499e3 bne s1,s4,80001704 <proc_mapstacks+0x38> + } +} + 80001736: 70e2 ld ra,56(sp) + 80001738: 7442 ld s0,48(sp) + 8000173a: 74a2 ld s1,40(sp) + 8000173c: 7902 ld s2,32(sp) + 8000173e: 69e2 ld s3,24(sp) + 80001740: 6a42 ld s4,16(sp) + 80001742: 6aa2 ld s5,8(sp) + 80001744: 6b02 ld s6,0(sp) + 80001746: 6121 addi sp,sp,64 + 80001748: 8082 ret + panic("kalloc"); + 8000174a: 00006517 auipc a0,0x6 + 8000174e: ac650513 addi a0,a0,-1338 # 80007210 <digits+0x1d8> + 80001752: 804ff0ef jal ra,80000756 <panic> + +0000000080001756 <procinit>: + +// initialize the proc table. +void +procinit(void) +{ + 80001756: 7139 addi sp,sp,-64 + 80001758: fc06 sd ra,56(sp) + 8000175a: f822 sd s0,48(sp) + 8000175c: f426 sd s1,40(sp) + 8000175e: f04a sd s2,32(sp) + 80001760: ec4e sd s3,24(sp) + 80001762: e852 sd s4,16(sp) + 80001764: e456 sd s5,8(sp) + 80001766: e05a sd s6,0(sp) + 80001768: 0080 addi s0,sp,64 + struct proc *p; + + initlock(&pid_lock, "nextpid"); + 8000176a: 00006597 auipc a1,0x6 + 8000176e: aae58593 addi a1,a1,-1362 # 80007218 <digits+0x1e0> + 80001772: 0000e517 auipc a0,0xe + 80001776: 46e50513 addi a0,a0,1134 # 8000fbe0 <pid_lock> + 8000177a: b9eff0ef jal ra,80000b18 <initlock> + initlock(&wait_lock, "wait_lock"); + 8000177e: 00006597 auipc a1,0x6 + 80001782: aa258593 addi a1,a1,-1374 # 80007220 <digits+0x1e8> + 80001786: 0000e517 auipc a0,0xe + 8000178a: 47250513 addi a0,a0,1138 # 8000fbf8 <wait_lock> + 8000178e: b8aff0ef jal ra,80000b18 <initlock> + for(p = proc; p < &proc[NPROC]; p++) { + 80001792: 0000f497 auipc s1,0xf + 80001796: 87e48493 addi s1,s1,-1922 # 80010010 <proc> + initlock(&p->lock, "proc"); + 8000179a: 00006b17 auipc s6,0x6 + 8000179e: a96b0b13 addi s6,s6,-1386 # 80007230 <digits+0x1f8> + p->state = UNUSED; + p->kstack = KSTACK((int) (p - proc)); + 800017a2: 8aa6 mv s5,s1 + 800017a4: 00006a17 auipc s4,0x6 + 800017a8: 85ca0a13 addi s4,s4,-1956 # 80007000 <etext> + 800017ac: 04000937 lui s2,0x4000 + 800017b0: 197d addi s2,s2,-1 # 3ffffff <_entry-0x7c000001> + 800017b2: 0932 slli s2,s2,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 800017b4: 00016997 auipc s3,0x16 + 800017b8: c5c98993 addi s3,s3,-932 # 80017410 <tickslock> + initlock(&p->lock, "proc"); + 800017bc: 85da mv a1,s6 + 800017be: 8526 mv a0,s1 + 800017c0: b58ff0ef jal ra,80000b18 <initlock> + p->state = UNUSED; + 800017c4: 0004ac23 sw zero,24(s1) + p->kstack = KSTACK((int) (p - proc)); + 800017c8: 415487b3 sub a5,s1,s5 + 800017cc: 8791 srai a5,a5,0x4 + 800017ce: 000a3703 ld a4,0(s4) + 800017d2: 02e787b3 mul a5,a5,a4 + 800017d6: 2785 addiw a5,a5,1 + 800017d8: 00d7979b slliw a5,a5,0xd + 800017dc: 40f907b3 sub a5,s2,a5 + 800017e0: e0bc sd a5,64(s1) + for(p = proc; p < &proc[NPROC]; p++) { + 800017e2: 1d048493 addi s1,s1,464 + 800017e6: fd349be3 bne s1,s3,800017bc <procinit+0x66> + } +} + 800017ea: 70e2 ld ra,56(sp) + 800017ec: 7442 ld s0,48(sp) + 800017ee: 74a2 ld s1,40(sp) + 800017f0: 7902 ld s2,32(sp) + 800017f2: 69e2 ld s3,24(sp) + 800017f4: 6a42 ld s4,16(sp) + 800017f6: 6aa2 ld s5,8(sp) + 800017f8: 6b02 ld s6,0(sp) + 800017fa: 6121 addi sp,sp,64 + 800017fc: 8082 ret + +00000000800017fe <cpuid>: +// Must be called with interrupts disabled, +// to prevent race with process being moved +// to a different CPU. +int +cpuid() +{ + 800017fe: 1141 addi sp,sp,-16 + 80001800: e422 sd s0,8(sp) + 80001802: 0800 addi s0,sp,16 + asm volatile("mv %0, tp" : "=r" (x) ); + 80001804: 8512 mv a0,tp + int id = r_tp(); + return id; +} + 80001806: 2501 sext.w a0,a0 + 80001808: 6422 ld s0,8(sp) + 8000180a: 0141 addi sp,sp,16 + 8000180c: 8082 ret + +000000008000180e <mycpu>: + +// Return this CPU's cpu struct. +// Interrupts must be disabled. +struct cpu* +mycpu(void) +{ + 8000180e: 1141 addi sp,sp,-16 + 80001810: e422 sd s0,8(sp) + 80001812: 0800 addi s0,sp,16 + 80001814: 8792 mv a5,tp + int id = cpuid(); + struct cpu *c = &cpus[id]; + 80001816: 2781 sext.w a5,a5 + 80001818: 079e slli a5,a5,0x7 + return c; +} + 8000181a: 0000e517 auipc a0,0xe + 8000181e: 3f650513 addi a0,a0,1014 # 8000fc10 <cpus> + 80001822: 953e add a0,a0,a5 + 80001824: 6422 ld s0,8(sp) + 80001826: 0141 addi sp,sp,16 + 80001828: 8082 ret + +000000008000182a <myproc>: + +// Return the current struct proc *, or zero if none. +struct proc* +myproc(void) +{ + 8000182a: 1101 addi sp,sp,-32 + 8000182c: ec06 sd ra,24(sp) + 8000182e: e822 sd s0,16(sp) + 80001830: e426 sd s1,8(sp) + 80001832: 1000 addi s0,sp,32 + push_off(); + 80001834: b24ff0ef jal ra,80000b58 <push_off> + 80001838: 8792 mv a5,tp + struct cpu *c = mycpu(); + struct proc *p = c->proc; + 8000183a: 2781 sext.w a5,a5 + 8000183c: 079e slli a5,a5,0x7 + 8000183e: 0000e717 auipc a4,0xe + 80001842: 3a270713 addi a4,a4,930 # 8000fbe0 <pid_lock> + 80001846: 97ba add a5,a5,a4 + 80001848: 7b84 ld s1,48(a5) + pop_off(); + 8000184a: b92ff0ef jal ra,80000bdc <pop_off> + return p; +} + 8000184e: 8526 mv a0,s1 + 80001850: 60e2 ld ra,24(sp) + 80001852: 6442 ld s0,16(sp) + 80001854: 64a2 ld s1,8(sp) + 80001856: 6105 addi sp,sp,32 + 80001858: 8082 ret + +000000008000185a <forkret>: + +// A fork child's very first scheduling by scheduler() +// will swtch to forkret. +void +forkret(void) +{ + 8000185a: 1141 addi sp,sp,-16 + 8000185c: e406 sd ra,8(sp) + 8000185e: e022 sd s0,0(sp) + 80001860: 0800 addi s0,sp,16 + static int first = 1; + + // Still holding p->lock from scheduler. + release(&myproc()->lock); + 80001862: fc9ff0ef jal ra,8000182a <myproc> + 80001866: bcaff0ef jal ra,80000c30 <release> + + if (first) { + 8000186a: 00006797 auipc a5,0x6 + 8000186e: 1a67a783 lw a5,422(a5) # 80007a10 <first.1> + 80001872: e799 bnez a5,80001880 <forkret+0x26> + first = 0; + // ensure other cores see first=0. + __sync_synchronize(); + } + + usertrapret(); + 80001874: 2e3000ef jal ra,80002356 <usertrapret> +} + 80001878: 60a2 ld ra,8(sp) + 8000187a: 6402 ld s0,0(sp) + 8000187c: 0141 addi sp,sp,16 + 8000187e: 8082 ret + fsinit(ROOTDEV); + 80001880: 4505 li a0,1 + 80001882: 712010ef jal ra,80002f94 <fsinit> + first = 0; + 80001886: 00006797 auipc a5,0x6 + 8000188a: 1807a523 sw zero,394(a5) # 80007a10 <first.1> + __sync_synchronize(); + 8000188e: 0ff0000f fence + 80001892: b7cd j 80001874 <forkret+0x1a> + +0000000080001894 <allocpid>: +{ + 80001894: 1101 addi sp,sp,-32 + 80001896: ec06 sd ra,24(sp) + 80001898: e822 sd s0,16(sp) + 8000189a: e426 sd s1,8(sp) + 8000189c: e04a sd s2,0(sp) + 8000189e: 1000 addi s0,sp,32 + acquire(&pid_lock); + 800018a0: 0000e917 auipc s2,0xe + 800018a4: 34090913 addi s2,s2,832 # 8000fbe0 <pid_lock> + 800018a8: 854a mv a0,s2 + 800018aa: aeeff0ef jal ra,80000b98 <acquire> + pid = nextpid; + 800018ae: 00006797 auipc a5,0x6 + 800018b2: 16678793 addi a5,a5,358 # 80007a14 <nextpid> + 800018b6: 4384 lw s1,0(a5) + nextpid = nextpid + 1; + 800018b8: 0014871b addiw a4,s1,1 + 800018bc: c398 sw a4,0(a5) + release(&pid_lock); + 800018be: 854a mv a0,s2 + 800018c0: b70ff0ef jal ra,80000c30 <release> +} + 800018c4: 8526 mv a0,s1 + 800018c6: 60e2 ld ra,24(sp) + 800018c8: 6442 ld s0,16(sp) + 800018ca: 64a2 ld s1,8(sp) + 800018cc: 6902 ld s2,0(sp) + 800018ce: 6105 addi sp,sp,32 + 800018d0: 8082 ret + +00000000800018d2 <proc_pagetable>: +{ + 800018d2: 1101 addi sp,sp,-32 + 800018d4: ec06 sd ra,24(sp) + 800018d6: e822 sd s0,16(sp) + 800018d8: e426 sd s1,8(sp) + 800018da: e04a sd s2,0(sp) + 800018dc: 1000 addi s0,sp,32 + 800018de: 892a mv s2,a0 + pagetable = uvmcreate(); + 800018e0: 933ff0ef jal ra,80001212 <uvmcreate> + 800018e4: 84aa mv s1,a0 + if(pagetable == 0) + 800018e6: cd05 beqz a0,8000191e <proc_pagetable+0x4c> + if(mappages(pagetable, TRAMPOLINE, PGSIZE, + 800018e8: 4729 li a4,10 + 800018ea: 00004697 auipc a3,0x4 + 800018ee: 71668693 addi a3,a3,1814 # 80006000 <_trampoline> + 800018f2: 6605 lui a2,0x1 + 800018f4: 040005b7 lui a1,0x4000 + 800018f8: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 800018fa: 05b2 slli a1,a1,0xc + 800018fc: ec4ff0ef jal ra,80000fc0 <mappages> + 80001900: 02054663 bltz a0,8000192c <proc_pagetable+0x5a> + if(mappages(pagetable, TRAPFRAME, PGSIZE, + 80001904: 4719 li a4,6 + 80001906: 05893683 ld a3,88(s2) + 8000190a: 6605 lui a2,0x1 + 8000190c: 020005b7 lui a1,0x2000 + 80001910: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001912: 05b6 slli a1,a1,0xd + 80001914: 8526 mv a0,s1 + 80001916: eaaff0ef jal ra,80000fc0 <mappages> + 8000191a: 00054f63 bltz a0,80001938 <proc_pagetable+0x66> +} + 8000191e: 8526 mv a0,s1 + 80001920: 60e2 ld ra,24(sp) + 80001922: 6442 ld s0,16(sp) + 80001924: 64a2 ld s1,8(sp) + 80001926: 6902 ld s2,0(sp) + 80001928: 6105 addi sp,sp,32 + 8000192a: 8082 ret + uvmfree(pagetable, 0); + 8000192c: 4581 li a1,0 + 8000192e: 8526 mv a0,s1 + 80001930: aa5ff0ef jal ra,800013d4 <uvmfree> + return 0; + 80001934: 4481 li s1,0 + 80001936: b7e5 j 8000191e <proc_pagetable+0x4c> + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001938: 4681 li a3,0 + 8000193a: 4605 li a2,1 + 8000193c: 040005b7 lui a1,0x4000 + 80001940: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001942: 05b2 slli a1,a1,0xc + 80001944: 8526 mv a0,s1 + 80001946: 821ff0ef jal ra,80001166 <uvmunmap> + uvmfree(pagetable, 0); + 8000194a: 4581 li a1,0 + 8000194c: 8526 mv a0,s1 + 8000194e: a87ff0ef jal ra,800013d4 <uvmfree> + return 0; + 80001952: 4481 li s1,0 + 80001954: b7e9 j 8000191e <proc_pagetable+0x4c> + +0000000080001956 <proc_freepagetable>: +{ + 80001956: 1101 addi sp,sp,-32 + 80001958: ec06 sd ra,24(sp) + 8000195a: e822 sd s0,16(sp) + 8000195c: e426 sd s1,8(sp) + 8000195e: e04a sd s2,0(sp) + 80001960: 1000 addi s0,sp,32 + 80001962: 84aa mv s1,a0 + 80001964: 892e mv s2,a1 + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001966: 4681 li a3,0 + 80001968: 4605 li a2,1 + 8000196a: 040005b7 lui a1,0x4000 + 8000196e: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001970: 05b2 slli a1,a1,0xc + 80001972: ff4ff0ef jal ra,80001166 <uvmunmap> + uvmunmap(pagetable, TRAPFRAME, 1, 0); + 80001976: 4681 li a3,0 + 80001978: 4605 li a2,1 + 8000197a: 020005b7 lui a1,0x2000 + 8000197e: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001980: 05b6 slli a1,a1,0xd + 80001982: 8526 mv a0,s1 + 80001984: fe2ff0ef jal ra,80001166 <uvmunmap> + uvmfree(pagetable, sz); + 80001988: 85ca mv a1,s2 + 8000198a: 8526 mv a0,s1 + 8000198c: a49ff0ef jal ra,800013d4 <uvmfree> +} + 80001990: 60e2 ld ra,24(sp) + 80001992: 6442 ld s0,16(sp) + 80001994: 64a2 ld s1,8(sp) + 80001996: 6902 ld s2,0(sp) + 80001998: 6105 addi sp,sp,32 + 8000199a: 8082 ret + +000000008000199c <freeproc>: +{ + 8000199c: 1101 addi sp,sp,-32 + 8000199e: ec06 sd ra,24(sp) + 800019a0: e822 sd s0,16(sp) + 800019a2: e426 sd s1,8(sp) + 800019a4: 1000 addi s0,sp,32 + 800019a6: 84aa mv s1,a0 + if(p->trapframe) + 800019a8: 6d28 ld a0,88(a0) + 800019aa: c119 beqz a0,800019b0 <freeproc+0x14> + kfree((void*)p->trapframe); + 800019ac: 83aff0ef jal ra,800009e6 <kfree> + p->trapframe = 0; + 800019b0: 0404bc23 sd zero,88(s1) + if(p->pagetable) + 800019b4: 68a8 ld a0,80(s1) + 800019b6: c501 beqz a0,800019be <freeproc+0x22> + proc_freepagetable(p->pagetable, p->sz); + 800019b8: 64ac ld a1,72(s1) + 800019ba: f9dff0ef jal ra,80001956 <proc_freepagetable> + p->pagetable = 0; + 800019be: 0404b823 sd zero,80(s1) + p->sz = 0; + 800019c2: 0404b423 sd zero,72(s1) + p->pid = 0; + 800019c6: 0204a823 sw zero,48(s1) + p->parent = 0; + 800019ca: 0204bc23 sd zero,56(s1) + p->name[0] = 0; + 800019ce: 14048c23 sb zero,344(s1) + p->chan = 0; + 800019d2: 0204b023 sd zero,32(s1) + p->killed = 0; + 800019d6: 0204a423 sw zero,40(s1) + p->xstate = 0; + 800019da: 0204a623 sw zero,44(s1) + p->state = UNUSED; + 800019de: 0004ac23 sw zero,24(s1) +} + 800019e2: 60e2 ld ra,24(sp) + 800019e4: 6442 ld s0,16(sp) + 800019e6: 64a2 ld s1,8(sp) + 800019e8: 6105 addi sp,sp,32 + 800019ea: 8082 ret + +00000000800019ec <allocproc>: +{ + 800019ec: 1101 addi sp,sp,-32 + 800019ee: ec06 sd ra,24(sp) + 800019f0: e822 sd s0,16(sp) + 800019f2: e426 sd s1,8(sp) + 800019f4: e04a sd s2,0(sp) + 800019f6: 1000 addi s0,sp,32 + for(i=0;i<24;i++) + 800019f8: 0000e797 auipc a5,0xe + 800019fc: 78478793 addi a5,a5,1924 # 8001017c <proc+0x16c> + 80001a00: 0000e717 auipc a4,0xe + 80001a04: 7dc70713 addi a4,a4,2012 # 800101dc <proc+0x1cc> + p->syscall_count[i] = 0; + 80001a08: 0007a023 sw zero,0(a5) + for(i=0;i<24;i++) + 80001a0c: 0791 addi a5,a5,4 + 80001a0e: fee79de3 bne a5,a4,80001a08 <allocproc+0x1c> + for(p = proc; p < &proc[NPROC]; p++) { + 80001a12: 0000e497 auipc s1,0xe + 80001a16: 5fe48493 addi s1,s1,1534 # 80010010 <proc> + 80001a1a: 00016917 auipc s2,0x16 + 80001a1e: 9f690913 addi s2,s2,-1546 # 80017410 <tickslock> + acquire(&p->lock); + 80001a22: 8526 mv a0,s1 + 80001a24: 974ff0ef jal ra,80000b98 <acquire> + if(p->state == UNUSED) { + 80001a28: 4c9c lw a5,24(s1) + 80001a2a: cb91 beqz a5,80001a3e <allocproc+0x52> + release(&p->lock); + 80001a2c: 8526 mv a0,s1 + 80001a2e: a02ff0ef jal ra,80000c30 <release> + for(p = proc; p < &proc[NPROC]; p++) { + 80001a32: 1d048493 addi s1,s1,464 + 80001a36: ff2496e3 bne s1,s2,80001a22 <allocproc+0x36> + return 0; + 80001a3a: 4481 li s1,0 + 80001a3c: a089 j 80001a7e <allocproc+0x92> + p->pid = allocpid(); + 80001a3e: e57ff0ef jal ra,80001894 <allocpid> + 80001a42: d888 sw a0,48(s1) + p->state = USED; + 80001a44: 4785 li a5,1 + 80001a46: cc9c sw a5,24(s1) + if((p->trapframe = (struct trapframe *)kalloc()) == 0){ + 80001a48: 880ff0ef jal ra,80000ac8 <kalloc> + 80001a4c: 892a mv s2,a0 + 80001a4e: eca8 sd a0,88(s1) + 80001a50: cd15 beqz a0,80001a8c <allocproc+0xa0> + p->pagetable = proc_pagetable(p); + 80001a52: 8526 mv a0,s1 + 80001a54: e7fff0ef jal ra,800018d2 <proc_pagetable> + 80001a58: 892a mv s2,a0 + 80001a5a: e8a8 sd a0,80(s1) + if(p->pagetable == 0){ + 80001a5c: c121 beqz a0,80001a9c <allocproc+0xb0> + memset(&p->context, 0, sizeof(p->context)); + 80001a5e: 07000613 li a2,112 + 80001a62: 4581 li a1,0 + 80001a64: 06048513 addi a0,s1,96 + 80001a68: a04ff0ef jal ra,80000c6c <memset> + p->context.ra = (uint64)forkret; + 80001a6c: 00000797 auipc a5,0x0 + 80001a70: dee78793 addi a5,a5,-530 # 8000185a <forkret> + 80001a74: f0bc sd a5,96(s1) + p->context.sp = p->kstack + PGSIZE; + 80001a76: 60bc ld a5,64(s1) + 80001a78: 6705 lui a4,0x1 + 80001a7a: 97ba add a5,a5,a4 + 80001a7c: f4bc sd a5,104(s1) +} + 80001a7e: 8526 mv a0,s1 + 80001a80: 60e2 ld ra,24(sp) + 80001a82: 6442 ld s0,16(sp) + 80001a84: 64a2 ld s1,8(sp) + 80001a86: 6902 ld s2,0(sp) + 80001a88: 6105 addi sp,sp,32 + 80001a8a: 8082 ret + freeproc(p); + 80001a8c: 8526 mv a0,s1 + 80001a8e: f0fff0ef jal ra,8000199c <freeproc> + release(&p->lock); + 80001a92: 8526 mv a0,s1 + 80001a94: 99cff0ef jal ra,80000c30 <release> + return 0; + 80001a98: 84ca mv s1,s2 + 80001a9a: b7d5 j 80001a7e <allocproc+0x92> + freeproc(p); + 80001a9c: 8526 mv a0,s1 + 80001a9e: effff0ef jal ra,8000199c <freeproc> + release(&p->lock); + 80001aa2: 8526 mv a0,s1 + 80001aa4: 98cff0ef jal ra,80000c30 <release> + return 0; + 80001aa8: 84ca mv s1,s2 + 80001aaa: bfd1 j 80001a7e <allocproc+0x92> + +0000000080001aac <userinit>: +{ + 80001aac: 1101 addi sp,sp,-32 + 80001aae: ec06 sd ra,24(sp) + 80001ab0: e822 sd s0,16(sp) + 80001ab2: e426 sd s1,8(sp) + 80001ab4: 1000 addi s0,sp,32 + p = allocproc(); + 80001ab6: f37ff0ef jal ra,800019ec <allocproc> + 80001aba: 84aa mv s1,a0 + initproc = p; + 80001abc: 00006797 auipc a5,0x6 + 80001ac0: fea7b623 sd a0,-20(a5) # 80007aa8 <initproc> + uvmfirst(p->pagetable, initcode, sizeof(initcode)); + 80001ac4: 03400613 li a2,52 + 80001ac8: 00006597 auipc a1,0x6 + 80001acc: f5858593 addi a1,a1,-168 # 80007a20 <initcode> + 80001ad0: 6928 ld a0,80(a0) + 80001ad2: f66ff0ef jal ra,80001238 <uvmfirst> + p->sz = PGSIZE; + 80001ad6: 6785 lui a5,0x1 + 80001ad8: e4bc sd a5,72(s1) + p->trapframe->epc = 0; // user program counter + 80001ada: 6cb8 ld a4,88(s1) + 80001adc: 00073c23 sd zero,24(a4) # 1018 <_entry-0x7fffefe8> + p->trapframe->sp = PGSIZE; // user stack pointer + 80001ae0: 6cb8 ld a4,88(s1) + 80001ae2: fb1c sd a5,48(a4) + safestrcpy(p->name, "initcode", sizeof(p->name)); + 80001ae4: 4641 li a2,16 + 80001ae6: 00005597 auipc a1,0x5 + 80001aea: 75258593 addi a1,a1,1874 # 80007238 <digits+0x200> + 80001aee: 15848513 addi a0,s1,344 + 80001af2: ac0ff0ef jal ra,80000db2 <safestrcpy> + p->cwd = namei("/"); + 80001af6: 00005517 auipc a0,0x5 + 80001afa: 75250513 addi a0,a0,1874 # 80007248 <digits+0x210> + 80001afe: 57d010ef jal ra,8000387a <namei> + 80001b02: 14a4b823 sd a0,336(s1) + p->state = RUNNABLE; + 80001b06: 478d li a5,3 + 80001b08: cc9c sw a5,24(s1) + release(&p->lock); + 80001b0a: 8526 mv a0,s1 + 80001b0c: 924ff0ef jal ra,80000c30 <release> +} + 80001b10: 60e2 ld ra,24(sp) + 80001b12: 6442 ld s0,16(sp) + 80001b14: 64a2 ld s1,8(sp) + 80001b16: 6105 addi sp,sp,32 + 80001b18: 8082 ret + +0000000080001b1a <growproc>: +{ + 80001b1a: 1101 addi sp,sp,-32 + 80001b1c: ec06 sd ra,24(sp) + 80001b1e: e822 sd s0,16(sp) + 80001b20: e426 sd s1,8(sp) + 80001b22: e04a sd s2,0(sp) + 80001b24: 1000 addi s0,sp,32 + 80001b26: 892a mv s2,a0 + struct proc *p = myproc(); + 80001b28: d03ff0ef jal ra,8000182a <myproc> + 80001b2c: 84aa mv s1,a0 + sz = p->sz; + 80001b2e: 652c ld a1,72(a0) + if(n > 0){ + 80001b30: 01204c63 bgtz s2,80001b48 <growproc+0x2e> + } else if(n < 0){ + 80001b34: 02094463 bltz s2,80001b5c <growproc+0x42> + p->sz = sz; + 80001b38: e4ac sd a1,72(s1) + return 0; + 80001b3a: 4501 li a0,0 +} + 80001b3c: 60e2 ld ra,24(sp) + 80001b3e: 6442 ld s0,16(sp) + 80001b40: 64a2 ld s1,8(sp) + 80001b42: 6902 ld s2,0(sp) + 80001b44: 6105 addi sp,sp,32 + 80001b46: 8082 ret + if((sz = uvmalloc(p->pagetable, sz, sz + n, PTE_W)) == 0) { + 80001b48: 4691 li a3,4 + 80001b4a: 00b90633 add a2,s2,a1 + 80001b4e: 6928 ld a0,80(a0) + 80001b50: f8aff0ef jal ra,800012da <uvmalloc> + 80001b54: 85aa mv a1,a0 + 80001b56: f16d bnez a0,80001b38 <growproc+0x1e> + return -1; + 80001b58: 557d li a0,-1 + 80001b5a: b7cd j 80001b3c <growproc+0x22> + sz = uvmdealloc(p->pagetable, sz, sz + n); + 80001b5c: 00b90633 add a2,s2,a1 + 80001b60: 6928 ld a0,80(a0) + 80001b62: f34ff0ef jal ra,80001296 <uvmdealloc> + 80001b66: 85aa mv a1,a0 + 80001b68: bfc1 j 80001b38 <growproc+0x1e> + +0000000080001b6a <fork>: +{ + 80001b6a: 7139 addi sp,sp,-64 + 80001b6c: fc06 sd ra,56(sp) + 80001b6e: f822 sd s0,48(sp) + 80001b70: f426 sd s1,40(sp) + 80001b72: f04a sd s2,32(sp) + 80001b74: ec4e sd s3,24(sp) + 80001b76: e852 sd s4,16(sp) + 80001b78: e456 sd s5,8(sp) + 80001b7a: 0080 addi s0,sp,64 + struct proc *p = myproc(); + 80001b7c: cafff0ef jal ra,8000182a <myproc> + 80001b80: 8aaa mv s5,a0 + if((np = allocproc()) == 0){ + 80001b82: e6bff0ef jal ra,800019ec <allocproc> + 80001b86: 0e050c63 beqz a0,80001c7e <fork+0x114> + 80001b8a: 89aa mv s3,a0 + if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ + 80001b8c: 048ab603 ld a2,72(s5) + 80001b90: 692c ld a1,80(a0) + 80001b92: 050ab503 ld a0,80(s5) + 80001b96: 871ff0ef jal ra,80001406 <uvmcopy> + 80001b9a: 04054e63 bltz a0,80001bf6 <fork+0x8c> + np->sz = p->sz; + 80001b9e: 048ab783 ld a5,72(s5) + 80001ba2: 04f9b423 sd a5,72(s3) + np->parent=p; + 80001ba6: 0359bc23 sd s5,56(s3) + np->trace_mask=p->trace_mask; + 80001baa: 168aa783 lw a5,360(s5) + 80001bae: 16f9a423 sw a5,360(s3) + *(np->trapframe) = *(p->trapframe); + 80001bb2: 058ab683 ld a3,88(s5) + 80001bb6: 87b6 mv a5,a3 + 80001bb8: 0589b703 ld a4,88(s3) + 80001bbc: 12068693 addi a3,a3,288 + 80001bc0: 0007b803 ld a6,0(a5) # 1000 <_entry-0x7ffff000> + 80001bc4: 6788 ld a0,8(a5) + 80001bc6: 6b8c ld a1,16(a5) + 80001bc8: 6f90 ld a2,24(a5) + 80001bca: 01073023 sd a6,0(a4) + 80001bce: e708 sd a0,8(a4) + 80001bd0: eb0c sd a1,16(a4) + 80001bd2: ef10 sd a2,24(a4) + 80001bd4: 02078793 addi a5,a5,32 + 80001bd8: 02070713 addi a4,a4,32 + 80001bdc: fed792e3 bne a5,a3,80001bc0 <fork+0x56> + np->trapframe->a0 = 0; + 80001be0: 0589b783 ld a5,88(s3) + 80001be4: 0607b823 sd zero,112(a5) + for(i = 0; i < NOFILE; i++) + 80001be8: 0d0a8493 addi s1,s5,208 + 80001bec: 0d098913 addi s2,s3,208 + 80001bf0: 150a8a13 addi s4,s5,336 + 80001bf4: a829 j 80001c0e <fork+0xa4> + freeproc(np); + 80001bf6: 854e mv a0,s3 + 80001bf8: da5ff0ef jal ra,8000199c <freeproc> + release(&np->lock); + 80001bfc: 854e mv a0,s3 + 80001bfe: 832ff0ef jal ra,80000c30 <release> + return -1; + 80001c02: 597d li s2,-1 + 80001c04: a09d j 80001c6a <fork+0x100> + for(i = 0; i < NOFILE; i++) + 80001c06: 04a1 addi s1,s1,8 + 80001c08: 0921 addi s2,s2,8 + 80001c0a: 01448963 beq s1,s4,80001c1c <fork+0xb2> + if(p->ofile[i]) + 80001c0e: 6088 ld a0,0(s1) + 80001c10: d97d beqz a0,80001c06 <fork+0x9c> + np->ofile[i] = filedup(p->ofile[i]); + 80001c12: 216020ef jal ra,80003e28 <filedup> + 80001c16: 00a93023 sd a0,0(s2) + 80001c1a: b7f5 j 80001c06 <fork+0x9c> + np->cwd = idup(p->cwd); + 80001c1c: 150ab503 ld a0,336(s5) + 80001c20: 56c010ef jal ra,8000318c <idup> + 80001c24: 14a9b823 sd a0,336(s3) + safestrcpy(np->name, p->name, sizeof(p->name)); + 80001c28: 4641 li a2,16 + 80001c2a: 158a8593 addi a1,s5,344 + 80001c2e: 15898513 addi a0,s3,344 + 80001c32: 980ff0ef jal ra,80000db2 <safestrcpy> + pid = np->pid; + 80001c36: 0309a903 lw s2,48(s3) + release(&np->lock); + 80001c3a: 854e mv a0,s3 + 80001c3c: ff5fe0ef jal ra,80000c30 <release> + acquire(&wait_lock); + 80001c40: 0000e497 auipc s1,0xe + 80001c44: fb848493 addi s1,s1,-72 # 8000fbf8 <wait_lock> + 80001c48: 8526 mv a0,s1 + 80001c4a: f4ffe0ef jal ra,80000b98 <acquire> + np->parent = p; + 80001c4e: 0359bc23 sd s5,56(s3) + release(&wait_lock); + 80001c52: 8526 mv a0,s1 + 80001c54: fddfe0ef jal ra,80000c30 <release> + acquire(&np->lock); + 80001c58: 854e mv a0,s3 + 80001c5a: f3ffe0ef jal ra,80000b98 <acquire> + np->state = RUNNABLE; + 80001c5e: 478d li a5,3 + 80001c60: 00f9ac23 sw a5,24(s3) + release(&np->lock); + 80001c64: 854e mv a0,s3 + 80001c66: fcbfe0ef jal ra,80000c30 <release> +} + 80001c6a: 854a mv a0,s2 + 80001c6c: 70e2 ld ra,56(sp) + 80001c6e: 7442 ld s0,48(sp) + 80001c70: 74a2 ld s1,40(sp) + 80001c72: 7902 ld s2,32(sp) + 80001c74: 69e2 ld s3,24(sp) + 80001c76: 6a42 ld s4,16(sp) + 80001c78: 6aa2 ld s5,8(sp) + 80001c7a: 6121 addi sp,sp,64 + 80001c7c: 8082 ret + return -1; + 80001c7e: 597d li s2,-1 + 80001c80: b7ed j 80001c6a <fork+0x100> + +0000000080001c82 <scheduler>: +{ + 80001c82: 715d addi sp,sp,-80 + 80001c84: e486 sd ra,72(sp) + 80001c86: e0a2 sd s0,64(sp) + 80001c88: fc26 sd s1,56(sp) + 80001c8a: f84a sd s2,48(sp) + 80001c8c: f44e sd s3,40(sp) + 80001c8e: f052 sd s4,32(sp) + 80001c90: ec56 sd s5,24(sp) + 80001c92: e85a sd s6,16(sp) + 80001c94: e45e sd s7,8(sp) + 80001c96: e062 sd s8,0(sp) + 80001c98: 0880 addi s0,sp,80 + 80001c9a: 8792 mv a5,tp + int id = r_tp(); + 80001c9c: 2781 sext.w a5,a5 + c->proc = 0; + 80001c9e: 00779b13 slli s6,a5,0x7 + 80001ca2: 0000e717 auipc a4,0xe + 80001ca6: f3e70713 addi a4,a4,-194 # 8000fbe0 <pid_lock> + 80001caa: 975a add a4,a4,s6 + 80001cac: 02073823 sd zero,48(a4) + swtch(&c->context, &p->context); + 80001cb0: 0000e717 auipc a4,0xe + 80001cb4: f6870713 addi a4,a4,-152 # 8000fc18 <cpus+0x8> + 80001cb8: 9b3a add s6,s6,a4 + p->state = RUNNING; + 80001cba: 4c11 li s8,4 + c->proc = p; + 80001cbc: 079e slli a5,a5,0x7 + 80001cbe: 0000ea17 auipc s4,0xe + 80001cc2: f22a0a13 addi s4,s4,-222 # 8000fbe0 <pid_lock> + 80001cc6: 9a3e add s4,s4,a5 + found = 1; + 80001cc8: 4b85 li s7,1 + for(p = proc; p < &proc[NPROC]; p++) { + 80001cca: 00015997 auipc s3,0x15 + 80001cce: 74698993 addi s3,s3,1862 # 80017410 <tickslock> + 80001cd2: a0a9 j 80001d1c <scheduler+0x9a> + release(&p->lock); + 80001cd4: 8526 mv a0,s1 + 80001cd6: f5bfe0ef jal ra,80000c30 <release> + for(p = proc; p < &proc[NPROC]; p++) { + 80001cda: 1d048493 addi s1,s1,464 + 80001cde: 03348563 beq s1,s3,80001d08 <scheduler+0x86> + acquire(&p->lock); + 80001ce2: 8526 mv a0,s1 + 80001ce4: eb5fe0ef jal ra,80000b98 <acquire> + if(p->state == RUNNABLE) { + 80001ce8: 4c9c lw a5,24(s1) + 80001cea: ff2795e3 bne a5,s2,80001cd4 <scheduler+0x52> + p->state = RUNNING; + 80001cee: 0184ac23 sw s8,24(s1) + c->proc = p; + 80001cf2: 029a3823 sd s1,48(s4) + swtch(&c->context, &p->context); + 80001cf6: 06048593 addi a1,s1,96 + 80001cfa: 855a mv a0,s6 + 80001cfc: 5b4000ef jal ra,800022b0 <swtch> + c->proc = 0; + 80001d00: 020a3823 sd zero,48(s4) + found = 1; + 80001d04: 8ade mv s5,s7 + 80001d06: b7f9 j 80001cd4 <scheduler+0x52> + if(found == 0) { + 80001d08: 000a9a63 bnez s5,80001d1c <scheduler+0x9a> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001d0c: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80001d10: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001d14: 10079073 csrw sstatus,a5 + asm volatile("wfi"); + 80001d18: 10500073 wfi + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001d1c: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80001d20: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001d24: 10079073 csrw sstatus,a5 + int found = 0; + 80001d28: 4a81 li s5,0 + for(p = proc; p < &proc[NPROC]; p++) { + 80001d2a: 0000e497 auipc s1,0xe + 80001d2e: 2e648493 addi s1,s1,742 # 80010010 <proc> + if(p->state == RUNNABLE) { + 80001d32: 490d li s2,3 + 80001d34: b77d j 80001ce2 <scheduler+0x60> + +0000000080001d36 <sched>: +{ + 80001d36: 7179 addi sp,sp,-48 + 80001d38: f406 sd ra,40(sp) + 80001d3a: f022 sd s0,32(sp) + 80001d3c: ec26 sd s1,24(sp) + 80001d3e: e84a sd s2,16(sp) + 80001d40: e44e sd s3,8(sp) + 80001d42: 1800 addi s0,sp,48 + struct proc *p = myproc(); + 80001d44: ae7ff0ef jal ra,8000182a <myproc> + 80001d48: 84aa mv s1,a0 + if(!holding(&p->lock)) + 80001d4a: de5fe0ef jal ra,80000b2e <holding> + 80001d4e: c92d beqz a0,80001dc0 <sched+0x8a> + asm volatile("mv %0, tp" : "=r" (x) ); + 80001d50: 8792 mv a5,tp + if(mycpu()->noff != 1) + 80001d52: 2781 sext.w a5,a5 + 80001d54: 079e slli a5,a5,0x7 + 80001d56: 0000e717 auipc a4,0xe + 80001d5a: e8a70713 addi a4,a4,-374 # 8000fbe0 <pid_lock> + 80001d5e: 97ba add a5,a5,a4 + 80001d60: 0a87a703 lw a4,168(a5) + 80001d64: 4785 li a5,1 + 80001d66: 06f71363 bne a4,a5,80001dcc <sched+0x96> + if(p->state == RUNNING) + 80001d6a: 4c98 lw a4,24(s1) + 80001d6c: 4791 li a5,4 + 80001d6e: 06f70563 beq a4,a5,80001dd8 <sched+0xa2> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001d72: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80001d76: 8b89 andi a5,a5,2 + if(intr_get()) + 80001d78: e7b5 bnez a5,80001de4 <sched+0xae> + asm volatile("mv %0, tp" : "=r" (x) ); + 80001d7a: 8792 mv a5,tp + intena = mycpu()->intena; + 80001d7c: 0000e917 auipc s2,0xe + 80001d80: e6490913 addi s2,s2,-412 # 8000fbe0 <pid_lock> + 80001d84: 2781 sext.w a5,a5 + 80001d86: 079e slli a5,a5,0x7 + 80001d88: 97ca add a5,a5,s2 + 80001d8a: 0ac7a983 lw s3,172(a5) + 80001d8e: 8792 mv a5,tp + swtch(&p->context, &mycpu()->context); + 80001d90: 2781 sext.w a5,a5 + 80001d92: 079e slli a5,a5,0x7 + 80001d94: 0000e597 auipc a1,0xe + 80001d98: e8458593 addi a1,a1,-380 # 8000fc18 <cpus+0x8> + 80001d9c: 95be add a1,a1,a5 + 80001d9e: 06048513 addi a0,s1,96 + 80001da2: 50e000ef jal ra,800022b0 <swtch> + 80001da6: 8792 mv a5,tp + mycpu()->intena = intena; + 80001da8: 2781 sext.w a5,a5 + 80001daa: 079e slli a5,a5,0x7 + 80001dac: 993e add s2,s2,a5 + 80001dae: 0b392623 sw s3,172(s2) +} + 80001db2: 70a2 ld ra,40(sp) + 80001db4: 7402 ld s0,32(sp) + 80001db6: 64e2 ld s1,24(sp) + 80001db8: 6942 ld s2,16(sp) + 80001dba: 69a2 ld s3,8(sp) + 80001dbc: 6145 addi sp,sp,48 + 80001dbe: 8082 ret + panic("sched p->lock"); + 80001dc0: 00005517 auipc a0,0x5 + 80001dc4: 49050513 addi a0,a0,1168 # 80007250 <digits+0x218> + 80001dc8: 98ffe0ef jal ra,80000756 <panic> + panic("sched locks"); + 80001dcc: 00005517 auipc a0,0x5 + 80001dd0: 49450513 addi a0,a0,1172 # 80007260 <digits+0x228> + 80001dd4: 983fe0ef jal ra,80000756 <panic> + panic("sched running"); + 80001dd8: 00005517 auipc a0,0x5 + 80001ddc: 49850513 addi a0,a0,1176 # 80007270 <digits+0x238> + 80001de0: 977fe0ef jal ra,80000756 <panic> + panic("sched interruptible"); + 80001de4: 00005517 auipc a0,0x5 + 80001de8: 49c50513 addi a0,a0,1180 # 80007280 <digits+0x248> + 80001dec: 96bfe0ef jal ra,80000756 <panic> + +0000000080001df0 <yield>: +{ + 80001df0: 1101 addi sp,sp,-32 + 80001df2: ec06 sd ra,24(sp) + 80001df4: e822 sd s0,16(sp) + 80001df6: e426 sd s1,8(sp) + 80001df8: 1000 addi s0,sp,32 + struct proc *p = myproc(); + 80001dfa: a31ff0ef jal ra,8000182a <myproc> + 80001dfe: 84aa mv s1,a0 + acquire(&p->lock); + 80001e00: d99fe0ef jal ra,80000b98 <acquire> + p->state = RUNNABLE; + 80001e04: 478d li a5,3 + 80001e06: cc9c sw a5,24(s1) + sched(); + 80001e08: f2fff0ef jal ra,80001d36 <sched> + release(&p->lock); + 80001e0c: 8526 mv a0,s1 + 80001e0e: e23fe0ef jal ra,80000c30 <release> +} + 80001e12: 60e2 ld ra,24(sp) + 80001e14: 6442 ld s0,16(sp) + 80001e16: 64a2 ld s1,8(sp) + 80001e18: 6105 addi sp,sp,32 + 80001e1a: 8082 ret + +0000000080001e1c <sleep>: + +// Atomically release lock and sleep on chan. +// Reacquires lock when awakened. +void +sleep(void *chan, struct spinlock *lk) +{ + 80001e1c: 7179 addi sp,sp,-48 + 80001e1e: f406 sd ra,40(sp) + 80001e20: f022 sd s0,32(sp) + 80001e22: ec26 sd s1,24(sp) + 80001e24: e84a sd s2,16(sp) + 80001e26: e44e sd s3,8(sp) + 80001e28: 1800 addi s0,sp,48 + 80001e2a: 89aa mv s3,a0 + 80001e2c: 892e mv s2,a1 + struct proc *p = myproc(); + 80001e2e: 9fdff0ef jal ra,8000182a <myproc> + 80001e32: 84aa mv s1,a0 + // Once we hold p->lock, we can be + // guaranteed that we won't miss any wakeup + // (wakeup locks p->lock), + // so it's okay to release lk. + + acquire(&p->lock); //DOC: sleeplock1 + 80001e34: d65fe0ef jal ra,80000b98 <acquire> + release(lk); + 80001e38: 854a mv a0,s2 + 80001e3a: df7fe0ef jal ra,80000c30 <release> + + // Go to sleep. + p->chan = chan; + 80001e3e: 0334b023 sd s3,32(s1) + p->state = SLEEPING; + 80001e42: 4789 li a5,2 + 80001e44: cc9c sw a5,24(s1) + + sched(); + 80001e46: ef1ff0ef jal ra,80001d36 <sched> + + // Tidy up. + p->chan = 0; + 80001e4a: 0204b023 sd zero,32(s1) + + // Reacquire original lock. + release(&p->lock); + 80001e4e: 8526 mv a0,s1 + 80001e50: de1fe0ef jal ra,80000c30 <release> + acquire(lk); + 80001e54: 854a mv a0,s2 + 80001e56: d43fe0ef jal ra,80000b98 <acquire> +} + 80001e5a: 70a2 ld ra,40(sp) + 80001e5c: 7402 ld s0,32(sp) + 80001e5e: 64e2 ld s1,24(sp) + 80001e60: 6942 ld s2,16(sp) + 80001e62: 69a2 ld s3,8(sp) + 80001e64: 6145 addi sp,sp,48 + 80001e66: 8082 ret + +0000000080001e68 <wakeup>: + +// Wake up all processes sleeping on chan. +// Must be called without any p->lock. +void +wakeup(void *chan) +{ + 80001e68: 7139 addi sp,sp,-64 + 80001e6a: fc06 sd ra,56(sp) + 80001e6c: f822 sd s0,48(sp) + 80001e6e: f426 sd s1,40(sp) + 80001e70: f04a sd s2,32(sp) + 80001e72: ec4e sd s3,24(sp) + 80001e74: e852 sd s4,16(sp) + 80001e76: e456 sd s5,8(sp) + 80001e78: 0080 addi s0,sp,64 + 80001e7a: 8a2a mv s4,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 80001e7c: 0000e497 auipc s1,0xe + 80001e80: 19448493 addi s1,s1,404 # 80010010 <proc> + if(p != myproc()){ + acquire(&p->lock); + if(p->state == SLEEPING && p->chan == chan) { + 80001e84: 4989 li s3,2 + p->state = RUNNABLE; + 80001e86: 4a8d li s5,3 + for(p = proc; p < &proc[NPROC]; p++) { + 80001e88: 00015917 auipc s2,0x15 + 80001e8c: 58890913 addi s2,s2,1416 # 80017410 <tickslock> + 80001e90: a801 j 80001ea0 <wakeup+0x38> + } + release(&p->lock); + 80001e92: 8526 mv a0,s1 + 80001e94: d9dfe0ef jal ra,80000c30 <release> + for(p = proc; p < &proc[NPROC]; p++) { + 80001e98: 1d048493 addi s1,s1,464 + 80001e9c: 03248263 beq s1,s2,80001ec0 <wakeup+0x58> + if(p != myproc()){ + 80001ea0: 98bff0ef jal ra,8000182a <myproc> + 80001ea4: fea48ae3 beq s1,a0,80001e98 <wakeup+0x30> + acquire(&p->lock); + 80001ea8: 8526 mv a0,s1 + 80001eaa: ceffe0ef jal ra,80000b98 <acquire> + if(p->state == SLEEPING && p->chan == chan) { + 80001eae: 4c9c lw a5,24(s1) + 80001eb0: ff3791e3 bne a5,s3,80001e92 <wakeup+0x2a> + 80001eb4: 709c ld a5,32(s1) + 80001eb6: fd479ee3 bne a5,s4,80001e92 <wakeup+0x2a> + p->state = RUNNABLE; + 80001eba: 0154ac23 sw s5,24(s1) + 80001ebe: bfd1 j 80001e92 <wakeup+0x2a> + } + } +} + 80001ec0: 70e2 ld ra,56(sp) + 80001ec2: 7442 ld s0,48(sp) + 80001ec4: 74a2 ld s1,40(sp) + 80001ec6: 7902 ld s2,32(sp) + 80001ec8: 69e2 ld s3,24(sp) + 80001eca: 6a42 ld s4,16(sp) + 80001ecc: 6aa2 ld s5,8(sp) + 80001ece: 6121 addi sp,sp,64 + 80001ed0: 8082 ret + +0000000080001ed2 <reparent>: +{ + 80001ed2: 7179 addi sp,sp,-48 + 80001ed4: f406 sd ra,40(sp) + 80001ed6: f022 sd s0,32(sp) + 80001ed8: ec26 sd s1,24(sp) + 80001eda: e84a sd s2,16(sp) + 80001edc: e44e sd s3,8(sp) + 80001ede: e052 sd s4,0(sp) + 80001ee0: 1800 addi s0,sp,48 + 80001ee2: 892a mv s2,a0 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001ee4: 0000e497 auipc s1,0xe + 80001ee8: 12c48493 addi s1,s1,300 # 80010010 <proc> + pp->parent = initproc; + 80001eec: 00006a17 auipc s4,0x6 + 80001ef0: bbca0a13 addi s4,s4,-1092 # 80007aa8 <initproc> + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001ef4: 00015997 auipc s3,0x15 + 80001ef8: 51c98993 addi s3,s3,1308 # 80017410 <tickslock> + 80001efc: a029 j 80001f06 <reparent+0x34> + 80001efe: 1d048493 addi s1,s1,464 + 80001f02: 01348b63 beq s1,s3,80001f18 <reparent+0x46> + if(pp->parent == p){ + 80001f06: 7c9c ld a5,56(s1) + 80001f08: ff279be3 bne a5,s2,80001efe <reparent+0x2c> + pp->parent = initproc; + 80001f0c: 000a3503 ld a0,0(s4) + 80001f10: fc88 sd a0,56(s1) + wakeup(initproc); + 80001f12: f57ff0ef jal ra,80001e68 <wakeup> + 80001f16: b7e5 j 80001efe <reparent+0x2c> +} + 80001f18: 70a2 ld ra,40(sp) + 80001f1a: 7402 ld s0,32(sp) + 80001f1c: 64e2 ld s1,24(sp) + 80001f1e: 6942 ld s2,16(sp) + 80001f20: 69a2 ld s3,8(sp) + 80001f22: 6a02 ld s4,0(sp) + 80001f24: 6145 addi sp,sp,48 + 80001f26: 8082 ret + +0000000080001f28 <exit>: +{ + 80001f28: 7179 addi sp,sp,-48 + 80001f2a: f406 sd ra,40(sp) + 80001f2c: f022 sd s0,32(sp) + 80001f2e: ec26 sd s1,24(sp) + 80001f30: e84a sd s2,16(sp) + 80001f32: e44e sd s3,8(sp) + 80001f34: e052 sd s4,0(sp) + 80001f36: 1800 addi s0,sp,48 + 80001f38: 8a2a mv s4,a0 + struct proc *p = myproc(); + 80001f3a: 8f1ff0ef jal ra,8000182a <myproc> + 80001f3e: 89aa mv s3,a0 + if(p == initproc) + 80001f40: 00006797 auipc a5,0x6 + 80001f44: b687b783 ld a5,-1176(a5) # 80007aa8 <initproc> + 80001f48: 0d050493 addi s1,a0,208 + 80001f4c: 15050913 addi s2,a0,336 + 80001f50: 00a79f63 bne a5,a0,80001f6e <exit+0x46> + panic("init exiting"); + 80001f54: 00005517 auipc a0,0x5 + 80001f58: 34450513 addi a0,a0,836 # 80007298 <digits+0x260> + 80001f5c: ffafe0ef jal ra,80000756 <panic> + fileclose(f); + 80001f60: 70f010ef jal ra,80003e6e <fileclose> + p->ofile[fd] = 0; + 80001f64: 0004b023 sd zero,0(s1) + for(int fd = 0; fd < NOFILE; fd++){ + 80001f68: 04a1 addi s1,s1,8 + 80001f6a: 01248563 beq s1,s2,80001f74 <exit+0x4c> + if(p->ofile[fd]){ + 80001f6e: 6088 ld a0,0(s1) + 80001f70: f965 bnez a0,80001f60 <exit+0x38> + 80001f72: bfdd j 80001f68 <exit+0x40> + begin_op(); + 80001f74: 2e3010ef jal ra,80003a56 <begin_op> + iput(p->cwd); + 80001f78: 1509b503 ld a0,336(s3) + 80001f7c: 3c4010ef jal ra,80003340 <iput> + end_op(); + 80001f80: 345010ef jal ra,80003ac4 <end_op> + p->cwd = 0; + 80001f84: 1409b823 sd zero,336(s3) + acquire(&wait_lock); + 80001f88: 0000e497 auipc s1,0xe + 80001f8c: c7048493 addi s1,s1,-912 # 8000fbf8 <wait_lock> + 80001f90: 8526 mv a0,s1 + 80001f92: c07fe0ef jal ra,80000b98 <acquire> + reparent(p); + 80001f96: 854e mv a0,s3 + 80001f98: f3bff0ef jal ra,80001ed2 <reparent> + wakeup(p->parent); + 80001f9c: 0389b503 ld a0,56(s3) + 80001fa0: ec9ff0ef jal ra,80001e68 <wakeup> + acquire(&p->lock); + 80001fa4: 854e mv a0,s3 + 80001fa6: bf3fe0ef jal ra,80000b98 <acquire> + p->xstate = status; + 80001faa: 0349a623 sw s4,44(s3) + p->state = ZOMBIE; + 80001fae: 4795 li a5,5 + 80001fb0: 00f9ac23 sw a5,24(s3) + release(&wait_lock); + 80001fb4: 8526 mv a0,s1 + 80001fb6: c7bfe0ef jal ra,80000c30 <release> + sched(); + 80001fba: d7dff0ef jal ra,80001d36 <sched> + panic("zombie exit"); + 80001fbe: 00005517 auipc a0,0x5 + 80001fc2: 2ea50513 addi a0,a0,746 # 800072a8 <digits+0x270> + 80001fc6: f90fe0ef jal ra,80000756 <panic> + +0000000080001fca <kill>: +// Kill the process with the given pid. +// The victim won't exit until it tries to return +// to user space (see usertrap() in trap.c). +int +kill(int pid) +{ + 80001fca: 7179 addi sp,sp,-48 + 80001fcc: f406 sd ra,40(sp) + 80001fce: f022 sd s0,32(sp) + 80001fd0: ec26 sd s1,24(sp) + 80001fd2: e84a sd s2,16(sp) + 80001fd4: e44e sd s3,8(sp) + 80001fd6: 1800 addi s0,sp,48 + 80001fd8: 892a mv s2,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++){ + 80001fda: 0000e497 auipc s1,0xe + 80001fde: 03648493 addi s1,s1,54 # 80010010 <proc> + 80001fe2: 00015997 auipc s3,0x15 + 80001fe6: 42e98993 addi s3,s3,1070 # 80017410 <tickslock> + acquire(&p->lock); + 80001fea: 8526 mv a0,s1 + 80001fec: badfe0ef jal ra,80000b98 <acquire> + if(p->pid == pid){ + 80001ff0: 589c lw a5,48(s1) + 80001ff2: 01278b63 beq a5,s2,80002008 <kill+0x3e> + p->state = RUNNABLE; + } + release(&p->lock); + return 0; + } + release(&p->lock); + 80001ff6: 8526 mv a0,s1 + 80001ff8: c39fe0ef jal ra,80000c30 <release> + for(p = proc; p < &proc[NPROC]; p++){ + 80001ffc: 1d048493 addi s1,s1,464 + 80002000: ff3495e3 bne s1,s3,80001fea <kill+0x20> + } + return -1; + 80002004: 557d li a0,-1 + 80002006: a819 j 8000201c <kill+0x52> + p->killed = 1; + 80002008: 4785 li a5,1 + 8000200a: d49c sw a5,40(s1) + if(p->state == SLEEPING){ + 8000200c: 4c98 lw a4,24(s1) + 8000200e: 4789 li a5,2 + 80002010: 00f70d63 beq a4,a5,8000202a <kill+0x60> + release(&p->lock); + 80002014: 8526 mv a0,s1 + 80002016: c1bfe0ef jal ra,80000c30 <release> + return 0; + 8000201a: 4501 li a0,0 +} + 8000201c: 70a2 ld ra,40(sp) + 8000201e: 7402 ld s0,32(sp) + 80002020: 64e2 ld s1,24(sp) + 80002022: 6942 ld s2,16(sp) + 80002024: 69a2 ld s3,8(sp) + 80002026: 6145 addi sp,sp,48 + 80002028: 8082 ret + p->state = RUNNABLE; + 8000202a: 478d li a5,3 + 8000202c: cc9c sw a5,24(s1) + 8000202e: b7dd j 80002014 <kill+0x4a> + +0000000080002030 <setkilled>: + +void +setkilled(struct proc *p) +{ + 80002030: 1101 addi sp,sp,-32 + 80002032: ec06 sd ra,24(sp) + 80002034: e822 sd s0,16(sp) + 80002036: e426 sd s1,8(sp) + 80002038: 1000 addi s0,sp,32 + 8000203a: 84aa mv s1,a0 + acquire(&p->lock); + 8000203c: b5dfe0ef jal ra,80000b98 <acquire> + p->killed = 1; + 80002040: 4785 li a5,1 + 80002042: d49c sw a5,40(s1) + release(&p->lock); + 80002044: 8526 mv a0,s1 + 80002046: bebfe0ef jal ra,80000c30 <release> +} + 8000204a: 60e2 ld ra,24(sp) + 8000204c: 6442 ld s0,16(sp) + 8000204e: 64a2 ld s1,8(sp) + 80002050: 6105 addi sp,sp,32 + 80002052: 8082 ret + +0000000080002054 <killed>: + +int +killed(struct proc *p) +{ + 80002054: 1101 addi sp,sp,-32 + 80002056: ec06 sd ra,24(sp) + 80002058: e822 sd s0,16(sp) + 8000205a: e426 sd s1,8(sp) + 8000205c: e04a sd s2,0(sp) + 8000205e: 1000 addi s0,sp,32 + 80002060: 84aa mv s1,a0 + int k; + + acquire(&p->lock); + 80002062: b37fe0ef jal ra,80000b98 <acquire> + k = p->killed; + 80002066: 0284a903 lw s2,40(s1) + release(&p->lock); + 8000206a: 8526 mv a0,s1 + 8000206c: bc5fe0ef jal ra,80000c30 <release> + return k; +} + 80002070: 854a mv a0,s2 + 80002072: 60e2 ld ra,24(sp) + 80002074: 6442 ld s0,16(sp) + 80002076: 64a2 ld s1,8(sp) + 80002078: 6902 ld s2,0(sp) + 8000207a: 6105 addi sp,sp,32 + 8000207c: 8082 ret + +000000008000207e <wait>: +{ + 8000207e: 715d addi sp,sp,-80 + 80002080: e486 sd ra,72(sp) + 80002082: e0a2 sd s0,64(sp) + 80002084: fc26 sd s1,56(sp) + 80002086: f84a sd s2,48(sp) + 80002088: f44e sd s3,40(sp) + 8000208a: f052 sd s4,32(sp) + 8000208c: ec56 sd s5,24(sp) + 8000208e: e85a sd s6,16(sp) + 80002090: e45e sd s7,8(sp) + 80002092: e062 sd s8,0(sp) + 80002094: 0880 addi s0,sp,80 + 80002096: 8b2a mv s6,a0 + struct proc *p = myproc(); + 80002098: f92ff0ef jal ra,8000182a <myproc> + 8000209c: 892a mv s2,a0 + acquire(&wait_lock); + 8000209e: 0000e517 auipc a0,0xe + 800020a2: b5a50513 addi a0,a0,-1190 # 8000fbf8 <wait_lock> + 800020a6: af3fe0ef jal ra,80000b98 <acquire> + havekids = 0; + 800020aa: 4b81 li s7,0 + if(pp->state == ZOMBIE){ + 800020ac: 4a15 li s4,5 + havekids = 1; + 800020ae: 4a85 li s5,1 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 800020b0: 00015997 auipc s3,0x15 + 800020b4: 36098993 addi s3,s3,864 # 80017410 <tickslock> + sleep(p, &wait_lock); //DOC: wait-sleep + 800020b8: 0000ec17 auipc s8,0xe + 800020bc: b40c0c13 addi s8,s8,-1216 # 8000fbf8 <wait_lock> + havekids = 0; + 800020c0: 875e mv a4,s7 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 800020c2: 0000e497 auipc s1,0xe + 800020c6: f4e48493 addi s1,s1,-178 # 80010010 <proc> + 800020ca: a899 j 80002120 <wait+0xa2> + pid = pp->pid; + 800020cc: 0304a983 lw s3,48(s1) + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + 800020d0: 000b0c63 beqz s6,800020e8 <wait+0x6a> + 800020d4: 4691 li a3,4 + 800020d6: 02c48613 addi a2,s1,44 + 800020da: 85da mv a1,s6 + 800020dc: 05093503 ld a0,80(s2) + 800020e0: c02ff0ef jal ra,800014e2 <copyout> + 800020e4: 00054f63 bltz a0,80002102 <wait+0x84> + freeproc(pp); + 800020e8: 8526 mv a0,s1 + 800020ea: 8b3ff0ef jal ra,8000199c <freeproc> + release(&pp->lock); + 800020ee: 8526 mv a0,s1 + 800020f0: b41fe0ef jal ra,80000c30 <release> + release(&wait_lock); + 800020f4: 0000e517 auipc a0,0xe + 800020f8: b0450513 addi a0,a0,-1276 # 8000fbf8 <wait_lock> + 800020fc: b35fe0ef jal ra,80000c30 <release> + return pid; + 80002100: a891 j 80002154 <wait+0xd6> + release(&pp->lock); + 80002102: 8526 mv a0,s1 + 80002104: b2dfe0ef jal ra,80000c30 <release> + release(&wait_lock); + 80002108: 0000e517 auipc a0,0xe + 8000210c: af050513 addi a0,a0,-1296 # 8000fbf8 <wait_lock> + 80002110: b21fe0ef jal ra,80000c30 <release> + return -1; + 80002114: 59fd li s3,-1 + 80002116: a83d j 80002154 <wait+0xd6> + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80002118: 1d048493 addi s1,s1,464 + 8000211c: 03348063 beq s1,s3,8000213c <wait+0xbe> + if(pp->parent == p){ + 80002120: 7c9c ld a5,56(s1) + 80002122: ff279be3 bne a5,s2,80002118 <wait+0x9a> + acquire(&pp->lock); + 80002126: 8526 mv a0,s1 + 80002128: a71fe0ef jal ra,80000b98 <acquire> + if(pp->state == ZOMBIE){ + 8000212c: 4c9c lw a5,24(s1) + 8000212e: f9478fe3 beq a5,s4,800020cc <wait+0x4e> + release(&pp->lock); + 80002132: 8526 mv a0,s1 + 80002134: afdfe0ef jal ra,80000c30 <release> + havekids = 1; + 80002138: 8756 mv a4,s5 + 8000213a: bff9 j 80002118 <wait+0x9a> + if(!havekids || killed(p)){ + 8000213c: c709 beqz a4,80002146 <wait+0xc8> + 8000213e: 854a mv a0,s2 + 80002140: f15ff0ef jal ra,80002054 <killed> + 80002144: c50d beqz a0,8000216e <wait+0xf0> + release(&wait_lock); + 80002146: 0000e517 auipc a0,0xe + 8000214a: ab250513 addi a0,a0,-1358 # 8000fbf8 <wait_lock> + 8000214e: ae3fe0ef jal ra,80000c30 <release> + return -1; + 80002152: 59fd li s3,-1 +} + 80002154: 854e mv a0,s3 + 80002156: 60a6 ld ra,72(sp) + 80002158: 6406 ld s0,64(sp) + 8000215a: 74e2 ld s1,56(sp) + 8000215c: 7942 ld s2,48(sp) + 8000215e: 79a2 ld s3,40(sp) + 80002160: 7a02 ld s4,32(sp) + 80002162: 6ae2 ld s5,24(sp) + 80002164: 6b42 ld s6,16(sp) + 80002166: 6ba2 ld s7,8(sp) + 80002168: 6c02 ld s8,0(sp) + 8000216a: 6161 addi sp,sp,80 + 8000216c: 8082 ret + sleep(p, &wait_lock); //DOC: wait-sleep + 8000216e: 85e2 mv a1,s8 + 80002170: 854a mv a0,s2 + 80002172: cabff0ef jal ra,80001e1c <sleep> + havekids = 0; + 80002176: b7a9 j 800020c0 <wait+0x42> + +0000000080002178 <either_copyout>: +// Copy to either a user address, or kernel address, +// depending on usr_dst. +// Returns 0 on success, -1 on error. +int +either_copyout(int user_dst, uint64 dst, void *src, uint64 len) +{ + 80002178: 7179 addi sp,sp,-48 + 8000217a: f406 sd ra,40(sp) + 8000217c: f022 sd s0,32(sp) + 8000217e: ec26 sd s1,24(sp) + 80002180: e84a sd s2,16(sp) + 80002182: e44e sd s3,8(sp) + 80002184: e052 sd s4,0(sp) + 80002186: 1800 addi s0,sp,48 + 80002188: 84aa mv s1,a0 + 8000218a: 892e mv s2,a1 + 8000218c: 89b2 mv s3,a2 + 8000218e: 8a36 mv s4,a3 + struct proc *p = myproc(); + 80002190: e9aff0ef jal ra,8000182a <myproc> + if(user_dst){ + 80002194: cc99 beqz s1,800021b2 <either_copyout+0x3a> + return copyout(p->pagetable, dst, src, len); + 80002196: 86d2 mv a3,s4 + 80002198: 864e mv a2,s3 + 8000219a: 85ca mv a1,s2 + 8000219c: 6928 ld a0,80(a0) + 8000219e: b44ff0ef jal ra,800014e2 <copyout> + } else { + memmove((char *)dst, src, len); + return 0; + } +} + 800021a2: 70a2 ld ra,40(sp) + 800021a4: 7402 ld s0,32(sp) + 800021a6: 64e2 ld s1,24(sp) + 800021a8: 6942 ld s2,16(sp) + 800021aa: 69a2 ld s3,8(sp) + 800021ac: 6a02 ld s4,0(sp) + 800021ae: 6145 addi sp,sp,48 + 800021b0: 8082 ret + memmove((char *)dst, src, len); + 800021b2: 000a061b sext.w a2,s4 + 800021b6: 85ce mv a1,s3 + 800021b8: 854a mv a0,s2 + 800021ba: b0ffe0ef jal ra,80000cc8 <memmove> + return 0; + 800021be: 8526 mv a0,s1 + 800021c0: b7cd j 800021a2 <either_copyout+0x2a> + +00000000800021c2 <either_copyin>: +// Copy from either a user address, or kernel address, +// depending on usr_src. +// Returns 0 on success, -1 on error. +int +either_copyin(void *dst, int user_src, uint64 src, uint64 len) +{ + 800021c2: 7179 addi sp,sp,-48 + 800021c4: f406 sd ra,40(sp) + 800021c6: f022 sd s0,32(sp) + 800021c8: ec26 sd s1,24(sp) + 800021ca: e84a sd s2,16(sp) + 800021cc: e44e sd s3,8(sp) + 800021ce: e052 sd s4,0(sp) + 800021d0: 1800 addi s0,sp,48 + 800021d2: 892a mv s2,a0 + 800021d4: 84ae mv s1,a1 + 800021d6: 89b2 mv s3,a2 + 800021d8: 8a36 mv s4,a3 + struct proc *p = myproc(); + 800021da: e50ff0ef jal ra,8000182a <myproc> + if(user_src){ + 800021de: cc99 beqz s1,800021fc <either_copyin+0x3a> + return copyin(p->pagetable, dst, src, len); + 800021e0: 86d2 mv a3,s4 + 800021e2: 864e mv a2,s3 + 800021e4: 85ca mv a1,s2 + 800021e6: 6928 ld a0,80(a0) + 800021e8: bb2ff0ef jal ra,8000159a <copyin> + } else { + memmove(dst, (char*)src, len); + return 0; + } +} + 800021ec: 70a2 ld ra,40(sp) + 800021ee: 7402 ld s0,32(sp) + 800021f0: 64e2 ld s1,24(sp) + 800021f2: 6942 ld s2,16(sp) + 800021f4: 69a2 ld s3,8(sp) + 800021f6: 6a02 ld s4,0(sp) + 800021f8: 6145 addi sp,sp,48 + 800021fa: 8082 ret + memmove(dst, (char*)src, len); + 800021fc: 000a061b sext.w a2,s4 + 80002200: 85ce mv a1,s3 + 80002202: 854a mv a0,s2 + 80002204: ac5fe0ef jal ra,80000cc8 <memmove> + return 0; + 80002208: 8526 mv a0,s1 + 8000220a: b7cd j 800021ec <either_copyin+0x2a> + +000000008000220c <procdump>: +// 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) +{ + 8000220c: 715d addi sp,sp,-80 + 8000220e: e486 sd ra,72(sp) + 80002210: e0a2 sd s0,64(sp) + 80002212: fc26 sd s1,56(sp) + 80002214: f84a sd s2,48(sp) + 80002216: f44e sd s3,40(sp) + 80002218: f052 sd s4,32(sp) + 8000221a: ec56 sd s5,24(sp) + 8000221c: e85a sd s6,16(sp) + 8000221e: e45e sd s7,8(sp) + 80002220: 0880 addi s0,sp,80 + [ZOMBIE] "zombie" + }; + struct proc *p; + char *state; + + printf("\n"); + 80002222: 00005517 auipc a0,0x5 + 80002226: e9e50513 addi a0,a0,-354 # 800070c0 <digits+0x88> + 8000222a: a78fe0ef jal ra,800004a2 <printf> + for(p = proc; p < &proc[NPROC]; p++){ + 8000222e: 0000e497 auipc s1,0xe + 80002232: f3a48493 addi s1,s1,-198 # 80010168 <proc+0x158> + 80002236: 00015917 auipc s2,0x15 + 8000223a: 33290913 addi s2,s2,818 # 80017568 <bcache+0x140> + if(p->state == UNUSED) + continue; + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 8000223e: 4b15 li s6,5 + state = states[p->state]; + else + state = "???"; + 80002240: 00005997 auipc s3,0x5 + 80002244: 07898993 addi s3,s3,120 # 800072b8 <digits+0x280> + printf("%d %s %s", p->pid, state, p->name); + 80002248: 00005a97 auipc s5,0x5 + 8000224c: 078a8a93 addi s5,s5,120 # 800072c0 <digits+0x288> + printf("\n"); + 80002250: 00005a17 auipc s4,0x5 + 80002254: e70a0a13 addi s4,s4,-400 # 800070c0 <digits+0x88> + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002258: 00005b97 auipc s7,0x5 + 8000225c: 0a8b8b93 addi s7,s7,168 # 80007300 <states.0> + 80002260: a829 j 8000227a <procdump+0x6e> + printf("%d %s %s", p->pid, state, p->name); + 80002262: ed86a583 lw a1,-296(a3) + 80002266: 8556 mv a0,s5 + 80002268: a3afe0ef jal ra,800004a2 <printf> + printf("\n"); + 8000226c: 8552 mv a0,s4 + 8000226e: a34fe0ef jal ra,800004a2 <printf> + for(p = proc; p < &proc[NPROC]; p++){ + 80002272: 1d048493 addi s1,s1,464 + 80002276: 03248263 beq s1,s2,8000229a <procdump+0x8e> + if(p->state == UNUSED) + 8000227a: 86a6 mv a3,s1 + 8000227c: ec04a783 lw a5,-320(s1) + 80002280: dbed beqz a5,80002272 <procdump+0x66> + state = "???"; + 80002282: 864e mv a2,s3 + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002284: fcfb6fe3 bltu s6,a5,80002262 <procdump+0x56> + 80002288: 02079713 slli a4,a5,0x20 + 8000228c: 01d75793 srli a5,a4,0x1d + 80002290: 97de add a5,a5,s7 + 80002292: 6390 ld a2,0(a5) + 80002294: f679 bnez a2,80002262 <procdump+0x56> + state = "???"; + 80002296: 864e mv a2,s3 + 80002298: b7e9 j 80002262 <procdump+0x56> + } +} + 8000229a: 60a6 ld ra,72(sp) + 8000229c: 6406 ld s0,64(sp) + 8000229e: 74e2 ld s1,56(sp) + 800022a0: 7942 ld s2,48(sp) + 800022a2: 79a2 ld s3,40(sp) + 800022a4: 7a02 ld s4,32(sp) + 800022a6: 6ae2 ld s5,24(sp) + 800022a8: 6b42 ld s6,16(sp) + 800022aa: 6ba2 ld s7,8(sp) + 800022ac: 6161 addi sp,sp,80 + 800022ae: 8082 ret + +00000000800022b0 <swtch>: + 800022b0: 00153023 sd ra,0(a0) + 800022b4: 00253423 sd sp,8(a0) + 800022b8: e900 sd s0,16(a0) + 800022ba: ed04 sd s1,24(a0) + 800022bc: 03253023 sd s2,32(a0) + 800022c0: 03353423 sd s3,40(a0) + 800022c4: 03453823 sd s4,48(a0) + 800022c8: 03553c23 sd s5,56(a0) + 800022cc: 05653023 sd s6,64(a0) + 800022d0: 05753423 sd s7,72(a0) + 800022d4: 05853823 sd s8,80(a0) + 800022d8: 05953c23 sd s9,88(a0) + 800022dc: 07a53023 sd s10,96(a0) + 800022e0: 07b53423 sd s11,104(a0) + 800022e4: 0005b083 ld ra,0(a1) + 800022e8: 0085b103 ld sp,8(a1) + 800022ec: 6980 ld s0,16(a1) + 800022ee: 6d84 ld s1,24(a1) + 800022f0: 0205b903 ld s2,32(a1) + 800022f4: 0285b983 ld s3,40(a1) + 800022f8: 0305ba03 ld s4,48(a1) + 800022fc: 0385ba83 ld s5,56(a1) + 80002300: 0405bb03 ld s6,64(a1) + 80002304: 0485bb83 ld s7,72(a1) + 80002308: 0505bc03 ld s8,80(a1) + 8000230c: 0585bc83 ld s9,88(a1) + 80002310: 0605bd03 ld s10,96(a1) + 80002314: 0685bd83 ld s11,104(a1) + 80002318: 8082 ret + +000000008000231a <trapinit>: + +extern int devintr(); + +void +trapinit(void) +{ + 8000231a: 1141 addi sp,sp,-16 + 8000231c: e406 sd ra,8(sp) + 8000231e: e022 sd s0,0(sp) + 80002320: 0800 addi s0,sp,16 + initlock(&tickslock, "time"); + 80002322: 00005597 auipc a1,0x5 + 80002326: 00e58593 addi a1,a1,14 # 80007330 <states.0+0x30> + 8000232a: 00015517 auipc a0,0x15 + 8000232e: 0e650513 addi a0,a0,230 # 80017410 <tickslock> + 80002332: fe6fe0ef jal ra,80000b18 <initlock> +} + 80002336: 60a2 ld ra,8(sp) + 80002338: 6402 ld s0,0(sp) + 8000233a: 0141 addi sp,sp,16 + 8000233c: 8082 ret + +000000008000233e <trapinithart>: + +// set up to take exceptions and traps while in the kernel. +void +trapinithart(void) +{ + 8000233e: 1141 addi sp,sp,-16 + 80002340: e422 sd s0,8(sp) + 80002342: 0800 addi s0,sp,16 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002344: 00003797 auipc a5,0x3 + 80002348: dec78793 addi a5,a5,-532 # 80005130 <kernelvec> + 8000234c: 10579073 csrw stvec,a5 + w_stvec((uint64)kernelvec); +} + 80002350: 6422 ld s0,8(sp) + 80002352: 0141 addi sp,sp,16 + 80002354: 8082 ret + +0000000080002356 <usertrapret>: +// +// return to user space +// +void +usertrapret(void) +{ + 80002356: 1141 addi sp,sp,-16 + 80002358: e406 sd ra,8(sp) + 8000235a: e022 sd s0,0(sp) + 8000235c: 0800 addi s0,sp,16 + struct proc *p = myproc(); + 8000235e: cccff0ef jal ra,8000182a <myproc> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002362: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80002366: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80002368: 10079073 csrw sstatus,a5 + // kerneltrap() to usertrap(), so turn off interrupts until + // we're back in user space, where usertrap() is correct. + intr_off(); + + // send syscalls, interrupts, and exceptions to uservec in trampoline.S + uint64 trampoline_uservec = TRAMPOLINE + (uservec - trampoline); + 8000236c: 00004697 auipc a3,0x4 + 80002370: c9468693 addi a3,a3,-876 # 80006000 <_trampoline> + 80002374: 00004717 auipc a4,0x4 + 80002378: c8c70713 addi a4,a4,-884 # 80006000 <_trampoline> + 8000237c: 8f15 sub a4,a4,a3 + 8000237e: 040007b7 lui a5,0x4000 + 80002382: 17fd addi a5,a5,-1 # 3ffffff <_entry-0x7c000001> + 80002384: 07b2 slli a5,a5,0xc + 80002386: 973e add a4,a4,a5 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002388: 10571073 csrw stvec,a4 + w_stvec(trampoline_uservec); + + // set up trapframe values that uservec will need when + // the process next traps into the kernel. + p->trapframe->kernel_satp = r_satp(); // kernel page table + 8000238c: 6d38 ld a4,88(a0) + asm volatile("csrr %0, satp" : "=r" (x) ); + 8000238e: 18002673 csrr a2,satp + 80002392: e310 sd a2,0(a4) + p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack + 80002394: 6d30 ld a2,88(a0) + 80002396: 6138 ld a4,64(a0) + 80002398: 6585 lui a1,0x1 + 8000239a: 972e add a4,a4,a1 + 8000239c: e618 sd a4,8(a2) + p->trapframe->kernel_trap = (uint64)usertrap; + 8000239e: 6d38 ld a4,88(a0) + 800023a0: 00000617 auipc a2,0x0 + 800023a4: 10c60613 addi a2,a2,268 # 800024ac <usertrap> + 800023a8: eb10 sd a2,16(a4) + p->trapframe->kernel_hartid = r_tp(); // hartid for cpuid() + 800023aa: 6d38 ld a4,88(a0) + asm volatile("mv %0, tp" : "=r" (x) ); + 800023ac: 8612 mv a2,tp + 800023ae: f310 sd a2,32(a4) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 800023b0: 10002773 csrr a4,sstatus + // set up the registers that trampoline.S's sret will use + // to get to user space. + + // set S Previous Privilege mode to User. + unsigned long x = r_sstatus(); + x &= ~SSTATUS_SPP; // clear SPP to 0 for user mode + 800023b4: eff77713 andi a4,a4,-257 + x |= SSTATUS_SPIE; // enable interrupts in user mode + 800023b8: 02076713 ori a4,a4,32 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 800023bc: 10071073 csrw sstatus,a4 + w_sstatus(x); + + // set S Exception Program Counter to the saved user pc. + w_sepc(p->trapframe->epc); + 800023c0: 6d38 ld a4,88(a0) + asm volatile("csrw sepc, %0" : : "r" (x)); + 800023c2: 6f18 ld a4,24(a4) + 800023c4: 14171073 csrw sepc,a4 + + // tell trampoline.S the user page table to switch to. + uint64 satp = MAKE_SATP(p->pagetable); + 800023c8: 6928 ld a0,80(a0) + 800023ca: 8131 srli a0,a0,0xc + + // jump to userret in trampoline.S at the top of memory, which + // switches to the user page table, restores user registers, + // and switches to user mode with sret. + uint64 trampoline_userret = TRAMPOLINE + (userret - trampoline); + 800023cc: 00004717 auipc a4,0x4 + 800023d0: cd070713 addi a4,a4,-816 # 8000609c <userret> + 800023d4: 8f15 sub a4,a4,a3 + 800023d6: 97ba add a5,a5,a4 + ((void (*)(uint64))trampoline_userret)(satp); + 800023d8: 577d li a4,-1 + 800023da: 177e slli a4,a4,0x3f + 800023dc: 8d59 or a0,a0,a4 + 800023de: 9782 jalr a5 +} + 800023e0: 60a2 ld ra,8(sp) + 800023e2: 6402 ld s0,0(sp) + 800023e4: 0141 addi sp,sp,16 + 800023e6: 8082 ret + +00000000800023e8 <clockintr>: + w_sstatus(sstatus); +} + +void +clockintr() +{ + 800023e8: 1101 addi sp,sp,-32 + 800023ea: ec06 sd ra,24(sp) + 800023ec: e822 sd s0,16(sp) + 800023ee: e426 sd s1,8(sp) + 800023f0: 1000 addi s0,sp,32 + if(cpuid() == 0){ + 800023f2: c0cff0ef jal ra,800017fe <cpuid> + 800023f6: cd19 beqz a0,80002414 <clockintr+0x2c> + asm volatile("csrr %0, time" : "=r" (x) ); + 800023f8: c01027f3 rdtime a5 + } + + // ask for the next timer interrupt. this also clears + // the interrupt request. 1000000 is about a tenth + // of a second. + w_stimecmp(r_time() + 1000000); + 800023fc: 000f4737 lui a4,0xf4 + 80002400: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 80002404: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 80002406: 14d79073 csrw 0x14d,a5 +} + 8000240a: 60e2 ld ra,24(sp) + 8000240c: 6442 ld s0,16(sp) + 8000240e: 64a2 ld s1,8(sp) + 80002410: 6105 addi sp,sp,32 + 80002412: 8082 ret + acquire(&tickslock); + 80002414: 00015497 auipc s1,0x15 + 80002418: ffc48493 addi s1,s1,-4 # 80017410 <tickslock> + 8000241c: 8526 mv a0,s1 + 8000241e: f7afe0ef jal ra,80000b98 <acquire> + ticks++; + 80002422: 00005517 auipc a0,0x5 + 80002426: 68e50513 addi a0,a0,1678 # 80007ab0 <ticks> + 8000242a: 411c lw a5,0(a0) + 8000242c: 2785 addiw a5,a5,1 + 8000242e: c11c sw a5,0(a0) + wakeup(&ticks); + 80002430: a39ff0ef jal ra,80001e68 <wakeup> + release(&tickslock); + 80002434: 8526 mv a0,s1 + 80002436: ffafe0ef jal ra,80000c30 <release> + 8000243a: bf7d j 800023f8 <clockintr+0x10> + +000000008000243c <devintr>: +// returns 2 if timer interrupt, +// 1 if other device, +// 0 if not recognized. +int +devintr() +{ + 8000243c: 1101 addi sp,sp,-32 + 8000243e: ec06 sd ra,24(sp) + 80002440: e822 sd s0,16(sp) + 80002442: e426 sd s1,8(sp) + 80002444: 1000 addi s0,sp,32 + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002446: 14202773 csrr a4,scause + uint64 scause = r_scause(); + + if(scause == 0x8000000000000009L){ + 8000244a: 57fd li a5,-1 + 8000244c: 17fe slli a5,a5,0x3f + 8000244e: 07a5 addi a5,a5,9 + 80002450: 00f70d63 beq a4,a5,8000246a <devintr+0x2e> + // now allowed to interrupt again. + if(irq) + plic_complete(irq); + + return 1; + } else if(scause == 0x8000000000000005L){ + 80002454: 57fd li a5,-1 + 80002456: 17fe slli a5,a5,0x3f + 80002458: 0795 addi a5,a5,5 + // timer interrupt. + clockintr(); + return 2; + } else { + return 0; + 8000245a: 4501 li a0,0 + } else if(scause == 0x8000000000000005L){ + 8000245c: 04f70463 beq a4,a5,800024a4 <devintr+0x68> + } +} + 80002460: 60e2 ld ra,24(sp) + 80002462: 6442 ld s0,16(sp) + 80002464: 64a2 ld s1,8(sp) + 80002466: 6105 addi sp,sp,32 + 80002468: 8082 ret + int irq = plic_claim(); + 8000246a: 56f020ef jal ra,800051d8 <plic_claim> + 8000246e: 84aa mv s1,a0 + if(irq == UART0_IRQ){ + 80002470: 47a9 li a5,10 + 80002472: 02f50363 beq a0,a5,80002498 <devintr+0x5c> + } else if(irq == VIRTIO0_IRQ){ + 80002476: 4785 li a5,1 + 80002478: 02f50363 beq a0,a5,8000249e <devintr+0x62> + return 1; + 8000247c: 4505 li a0,1 + } else if(irq){ + 8000247e: d0ed beqz s1,80002460 <devintr+0x24> + printf("unexpected interrupt irq=%d\n", irq); + 80002480: 85a6 mv a1,s1 + 80002482: 00005517 auipc a0,0x5 + 80002486: eb650513 addi a0,a0,-330 # 80007338 <states.0+0x38> + 8000248a: 818fe0ef jal ra,800004a2 <printf> + plic_complete(irq); + 8000248e: 8526 mv a0,s1 + 80002490: 569020ef jal ra,800051f8 <plic_complete> + return 1; + 80002494: 4505 li a0,1 + 80002496: b7e9 j 80002460 <devintr+0x24> + uartintr(); + 80002498: d12fe0ef jal ra,800009aa <uartintr> + 8000249c: bfcd j 8000248e <devintr+0x52> + virtio_disk_intr(); + 8000249e: 1c6030ef jal ra,80005664 <virtio_disk_intr> + 800024a2: b7f5 j 8000248e <devintr+0x52> + clockintr(); + 800024a4: f45ff0ef jal ra,800023e8 <clockintr> + return 2; + 800024a8: 4509 li a0,2 + 800024aa: bf5d j 80002460 <devintr+0x24> + +00000000800024ac <usertrap>: +{ + 800024ac: 1101 addi sp,sp,-32 + 800024ae: ec06 sd ra,24(sp) + 800024b0: e822 sd s0,16(sp) + 800024b2: e426 sd s1,8(sp) + 800024b4: e04a sd s2,0(sp) + 800024b6: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 800024b8: 100027f3 csrr a5,sstatus + if((r_sstatus() & SSTATUS_SPP) != 0) + 800024bc: 1007f793 andi a5,a5,256 + 800024c0: ef85 bnez a5,800024f8 <usertrap+0x4c> + asm volatile("csrw stvec, %0" : : "r" (x)); + 800024c2: 00003797 auipc a5,0x3 + 800024c6: c6e78793 addi a5,a5,-914 # 80005130 <kernelvec> + 800024ca: 10579073 csrw stvec,a5 + struct proc *p = myproc(); + 800024ce: b5cff0ef jal ra,8000182a <myproc> + 800024d2: 84aa mv s1,a0 + p->trapframe->epc = r_sepc(); + 800024d4: 6d3c ld a5,88(a0) + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800024d6: 14102773 csrr a4,sepc + 800024da: ef98 sd a4,24(a5) + asm volatile("csrr %0, scause" : "=r" (x) ); + 800024dc: 14202773 csrr a4,scause + if(r_scause() == 8){ + 800024e0: 47a1 li a5,8 + 800024e2: 02f70163 beq a4,a5,80002504 <usertrap+0x58> + } else if((which_dev = devintr()) != 0){ + 800024e6: f57ff0ef jal ra,8000243c <devintr> + 800024ea: 892a mv s2,a0 + 800024ec: c135 beqz a0,80002550 <usertrap+0xa4> + if(killed(p)) + 800024ee: 8526 mv a0,s1 + 800024f0: b65ff0ef jal ra,80002054 <killed> + 800024f4: cd1d beqz a0,80002532 <usertrap+0x86> + 800024f6: a81d j 8000252c <usertrap+0x80> + panic("usertrap: not from user mode"); + 800024f8: 00005517 auipc a0,0x5 + 800024fc: e6050513 addi a0,a0,-416 # 80007358 <states.0+0x58> + 80002500: a56fe0ef jal ra,80000756 <panic> + if(killed(p)) + 80002504: b51ff0ef jal ra,80002054 <killed> + 80002508: e121 bnez a0,80002548 <usertrap+0x9c> + p->trapframe->epc += 4; + 8000250a: 6cb8 ld a4,88(s1) + 8000250c: 6f1c ld a5,24(a4) + 8000250e: 0791 addi a5,a5,4 + 80002510: ef1c sd a5,24(a4) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002512: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80002516: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 8000251a: 10079073 csrw sstatus,a5 + syscall(); + 8000251e: 248000ef jal ra,80002766 <syscall> + if(killed(p)) + 80002522: 8526 mv a0,s1 + 80002524: b31ff0ef jal ra,80002054 <killed> + 80002528: c901 beqz a0,80002538 <usertrap+0x8c> + 8000252a: 4901 li s2,0 + exit(-1); + 8000252c: 557d li a0,-1 + 8000252e: 9fbff0ef jal ra,80001f28 <exit> + if(which_dev == 2) + 80002532: 4789 li a5,2 + 80002534: 04f90563 beq s2,a5,8000257e <usertrap+0xd2> + usertrapret(); + 80002538: e1fff0ef jal ra,80002356 <usertrapret> +} + 8000253c: 60e2 ld ra,24(sp) + 8000253e: 6442 ld s0,16(sp) + 80002540: 64a2 ld s1,8(sp) + 80002542: 6902 ld s2,0(sp) + 80002544: 6105 addi sp,sp,32 + 80002546: 8082 ret + exit(-1); + 80002548: 557d li a0,-1 + 8000254a: 9dfff0ef jal ra,80001f28 <exit> + 8000254e: bf75 j 8000250a <usertrap+0x5e> + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002550: 142025f3 csrr a1,scause + printf("usertrap(): unexpected scause 0x%lx pid=%d\n", r_scause(), p->pid); + 80002554: 5890 lw a2,48(s1) + 80002556: 00005517 auipc a0,0x5 + 8000255a: e2250513 addi a0,a0,-478 # 80007378 <states.0+0x78> + 8000255e: f45fd0ef jal ra,800004a2 <printf> + asm volatile("csrr %0, sepc" : "=r" (x) ); + 80002562: 141025f3 csrr a1,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 80002566: 14302673 csrr a2,stval + printf(" sepc=0x%lx stval=0x%lx\n", r_sepc(), r_stval()); + 8000256a: 00005517 auipc a0,0x5 + 8000256e: e3e50513 addi a0,a0,-450 # 800073a8 <states.0+0xa8> + 80002572: f31fd0ef jal ra,800004a2 <printf> + setkilled(p); + 80002576: 8526 mv a0,s1 + 80002578: ab9ff0ef jal ra,80002030 <setkilled> + 8000257c: b75d j 80002522 <usertrap+0x76> + yield(); + 8000257e: 873ff0ef jal ra,80001df0 <yield> + 80002582: bf5d j 80002538 <usertrap+0x8c> + +0000000080002584 <kerneltrap>: +{ + 80002584: 7179 addi sp,sp,-48 + 80002586: f406 sd ra,40(sp) + 80002588: f022 sd s0,32(sp) + 8000258a: ec26 sd s1,24(sp) + 8000258c: e84a sd s2,16(sp) + 8000258e: e44e sd s3,8(sp) + 80002590: 1800 addi s0,sp,48 + asm volatile("csrr %0, sepc" : "=r" (x) ); + 80002592: 14102973 csrr s2,sepc + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002596: 100024f3 csrr s1,sstatus + asm volatile("csrr %0, scause" : "=r" (x) ); + 8000259a: 142029f3 csrr s3,scause + if((sstatus & SSTATUS_SPP) == 0) + 8000259e: 1004f793 andi a5,s1,256 + 800025a2: c795 beqz a5,800025ce <kerneltrap+0x4a> + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 800025a4: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 800025a8: 8b89 andi a5,a5,2 + if(intr_get() != 0) + 800025aa: eb85 bnez a5,800025da <kerneltrap+0x56> + if((which_dev = devintr()) == 0){ + 800025ac: e91ff0ef jal ra,8000243c <devintr> + 800025b0: c91d beqz a0,800025e6 <kerneltrap+0x62> + if(which_dev == 2 && myproc() != 0) + 800025b2: 4789 li a5,2 + 800025b4: 04f50a63 beq a0,a5,80002608 <kerneltrap+0x84> + asm volatile("csrw sepc, %0" : : "r" (x)); + 800025b8: 14191073 csrw sepc,s2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 800025bc: 10049073 csrw sstatus,s1 +} + 800025c0: 70a2 ld ra,40(sp) + 800025c2: 7402 ld s0,32(sp) + 800025c4: 64e2 ld s1,24(sp) + 800025c6: 6942 ld s2,16(sp) + 800025c8: 69a2 ld s3,8(sp) + 800025ca: 6145 addi sp,sp,48 + 800025cc: 8082 ret + panic("kerneltrap: not from supervisor mode"); + 800025ce: 00005517 auipc a0,0x5 + 800025d2: e0250513 addi a0,a0,-510 # 800073d0 <states.0+0xd0> + 800025d6: 980fe0ef jal ra,80000756 <panic> + panic("kerneltrap: interrupts enabled"); + 800025da: 00005517 auipc a0,0x5 + 800025de: e1e50513 addi a0,a0,-482 # 800073f8 <states.0+0xf8> + 800025e2: 974fe0ef jal ra,80000756 <panic> + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800025e6: 14102673 csrr a2,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 800025ea: 143026f3 csrr a3,stval + printf("scause=0x%lx sepc=0x%lx stval=0x%lx\n", scause, r_sepc(), r_stval()); + 800025ee: 85ce mv a1,s3 + 800025f0: 00005517 auipc a0,0x5 + 800025f4: e2850513 addi a0,a0,-472 # 80007418 <states.0+0x118> + 800025f8: eabfd0ef jal ra,800004a2 <printf> + panic("kerneltrap"); + 800025fc: 00005517 auipc a0,0x5 + 80002600: e4450513 addi a0,a0,-444 # 80007440 <states.0+0x140> + 80002604: 952fe0ef jal ra,80000756 <panic> + if(which_dev == 2 && myproc() != 0) + 80002608: a22ff0ef jal ra,8000182a <myproc> + 8000260c: d555 beqz a0,800025b8 <kerneltrap+0x34> + yield(); + 8000260e: fe2ff0ef jal ra,80001df0 <yield> + 80002612: b75d j 800025b8 <kerneltrap+0x34> + +0000000080002614 <argraw>: + return strlen(buf); +} + +static uint64 +argraw(int n) +{ + 80002614: 1101 addi sp,sp,-32 + 80002616: ec06 sd ra,24(sp) + 80002618: e822 sd s0,16(sp) + 8000261a: e426 sd s1,8(sp) + 8000261c: 1000 addi s0,sp,32 + 8000261e: 84aa mv s1,a0 + struct proc *p = myproc(); + 80002620: a0aff0ef jal ra,8000182a <myproc> + switch (n) { + 80002624: 4795 li a5,5 + 80002626: 0497e163 bltu a5,s1,80002668 <argraw+0x54> + 8000262a: 048a slli s1,s1,0x2 + 8000262c: 00005717 auipc a4,0x5 + 80002630: f0c70713 addi a4,a4,-244 # 80007538 <states.0+0x238> + 80002634: 94ba add s1,s1,a4 + 80002636: 409c lw a5,0(s1) + 80002638: 97ba add a5,a5,a4 + 8000263a: 8782 jr a5 + case 0: + return p->trapframe->a0; + 8000263c: 6d3c ld a5,88(a0) + 8000263e: 7ba8 ld a0,112(a5) + case 5: + return p->trapframe->a5; + } + panic("argraw"); + return -1; +} + 80002640: 60e2 ld ra,24(sp) + 80002642: 6442 ld s0,16(sp) + 80002644: 64a2 ld s1,8(sp) + 80002646: 6105 addi sp,sp,32 + 80002648: 8082 ret + return p->trapframe->a1; + 8000264a: 6d3c ld a5,88(a0) + 8000264c: 7fa8 ld a0,120(a5) + 8000264e: bfcd j 80002640 <argraw+0x2c> + return p->trapframe->a2; + 80002650: 6d3c ld a5,88(a0) + 80002652: 63c8 ld a0,128(a5) + 80002654: b7f5 j 80002640 <argraw+0x2c> + return p->trapframe->a3; + 80002656: 6d3c ld a5,88(a0) + 80002658: 67c8 ld a0,136(a5) + 8000265a: b7dd j 80002640 <argraw+0x2c> + return p->trapframe->a4; + 8000265c: 6d3c ld a5,88(a0) + 8000265e: 6bc8 ld a0,144(a5) + 80002660: b7c5 j 80002640 <argraw+0x2c> + return p->trapframe->a5; + 80002662: 6d3c ld a5,88(a0) + 80002664: 6fc8 ld a0,152(a5) + 80002666: bfe9 j 80002640 <argraw+0x2c> + panic("argraw"); + 80002668: 00005517 auipc a0,0x5 + 8000266c: de850513 addi a0,a0,-536 # 80007450 <states.0+0x150> + 80002670: 8e6fe0ef jal ra,80000756 <panic> + +0000000080002674 <fetchaddr>: +{ + 80002674: 1101 addi sp,sp,-32 + 80002676: ec06 sd ra,24(sp) + 80002678: e822 sd s0,16(sp) + 8000267a: e426 sd s1,8(sp) + 8000267c: e04a sd s2,0(sp) + 8000267e: 1000 addi s0,sp,32 + 80002680: 84aa mv s1,a0 + 80002682: 892e mv s2,a1 + struct proc *p = myproc(); + 80002684: 9a6ff0ef jal ra,8000182a <myproc> + if(addr >= p->sz || addr+sizeof(uint64) > p->sz) // both tests needed, in case of overflow + 80002688: 653c ld a5,72(a0) + 8000268a: 02f4f663 bgeu s1,a5,800026b6 <fetchaddr+0x42> + 8000268e: 00848713 addi a4,s1,8 + 80002692: 02e7e463 bltu a5,a4,800026ba <fetchaddr+0x46> + if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0) + 80002696: 46a1 li a3,8 + 80002698: 8626 mv a2,s1 + 8000269a: 85ca mv a1,s2 + 8000269c: 6928 ld a0,80(a0) + 8000269e: efdfe0ef jal ra,8000159a <copyin> + 800026a2: 00a03533 snez a0,a0 + 800026a6: 40a00533 neg a0,a0 +} + 800026aa: 60e2 ld ra,24(sp) + 800026ac: 6442 ld s0,16(sp) + 800026ae: 64a2 ld s1,8(sp) + 800026b0: 6902 ld s2,0(sp) + 800026b2: 6105 addi sp,sp,32 + 800026b4: 8082 ret + return -1; + 800026b6: 557d li a0,-1 + 800026b8: bfcd j 800026aa <fetchaddr+0x36> + 800026ba: 557d li a0,-1 + 800026bc: b7fd j 800026aa <fetchaddr+0x36> + +00000000800026be <fetchstr>: +{ + 800026be: 7179 addi sp,sp,-48 + 800026c0: f406 sd ra,40(sp) + 800026c2: f022 sd s0,32(sp) + 800026c4: ec26 sd s1,24(sp) + 800026c6: e84a sd s2,16(sp) + 800026c8: e44e sd s3,8(sp) + 800026ca: 1800 addi s0,sp,48 + 800026cc: 892a mv s2,a0 + 800026ce: 84ae mv s1,a1 + 800026d0: 89b2 mv s3,a2 + struct proc *p = myproc(); + 800026d2: 958ff0ef jal ra,8000182a <myproc> + if(copyinstr(p->pagetable, buf, addr, max) < 0) + 800026d6: 86ce mv a3,s3 + 800026d8: 864a mv a2,s2 + 800026da: 85a6 mv a1,s1 + 800026dc: 6928 ld a0,80(a0) + 800026de: f43fe0ef jal ra,80001620 <copyinstr> + 800026e2: 00054c63 bltz a0,800026fa <fetchstr+0x3c> + return strlen(buf); + 800026e6: 8526 mv a0,s1 + 800026e8: efcfe0ef jal ra,80000de4 <strlen> +} + 800026ec: 70a2 ld ra,40(sp) + 800026ee: 7402 ld s0,32(sp) + 800026f0: 64e2 ld s1,24(sp) + 800026f2: 6942 ld s2,16(sp) + 800026f4: 69a2 ld s3,8(sp) + 800026f6: 6145 addi sp,sp,48 + 800026f8: 8082 ret + return -1; + 800026fa: 557d li a0,-1 + 800026fc: bfc5 j 800026ec <fetchstr+0x2e> + +00000000800026fe <argint>: + +// Fetch the nth 32-bit system call argument. +void +argint(int n, int *ip) +{ + 800026fe: 1101 addi sp,sp,-32 + 80002700: ec06 sd ra,24(sp) + 80002702: e822 sd s0,16(sp) + 80002704: e426 sd s1,8(sp) + 80002706: 1000 addi s0,sp,32 + 80002708: 84ae mv s1,a1 + *ip = argraw(n); + 8000270a: f0bff0ef jal ra,80002614 <argraw> + 8000270e: c088 sw a0,0(s1) +} + 80002710: 60e2 ld ra,24(sp) + 80002712: 6442 ld s0,16(sp) + 80002714: 64a2 ld s1,8(sp) + 80002716: 6105 addi sp,sp,32 + 80002718: 8082 ret + +000000008000271a <argaddr>: +// Retrieve an argument as a pointer. +// Doesn't check for legality, since +// copyin/copyout will do that. +void +argaddr(int n, uint64 *ip) +{ + 8000271a: 1101 addi sp,sp,-32 + 8000271c: ec06 sd ra,24(sp) + 8000271e: e822 sd s0,16(sp) + 80002720: e426 sd s1,8(sp) + 80002722: 1000 addi s0,sp,32 + 80002724: 84ae mv s1,a1 + *ip = argraw(n); + 80002726: eefff0ef jal ra,80002614 <argraw> + 8000272a: e088 sd a0,0(s1) +} + 8000272c: 60e2 ld ra,24(sp) + 8000272e: 6442 ld s0,16(sp) + 80002730: 64a2 ld s1,8(sp) + 80002732: 6105 addi sp,sp,32 + 80002734: 8082 ret + +0000000080002736 <argstr>: +// Fetch the nth word-sized system call argument as a null-terminated string. +// Copies into buf, at most max. +// Returns string length if OK (including nul), -1 if error. +int +argstr(int n, char *buf, int max) +{ + 80002736: 7179 addi sp,sp,-48 + 80002738: f406 sd ra,40(sp) + 8000273a: f022 sd s0,32(sp) + 8000273c: ec26 sd s1,24(sp) + 8000273e: e84a sd s2,16(sp) + 80002740: 1800 addi s0,sp,48 + 80002742: 84ae mv s1,a1 + 80002744: 8932 mv s2,a2 + uint64 addr; + argaddr(n, &addr); + 80002746: fd840593 addi a1,s0,-40 + 8000274a: fd1ff0ef jal ra,8000271a <argaddr> + return fetchstr(addr, buf, max); + 8000274e: 864a mv a2,s2 + 80002750: 85a6 mv a1,s1 + 80002752: fd843503 ld a0,-40(s0) + 80002756: f69ff0ef jal ra,800026be <fetchstr> +} + 8000275a: 70a2 ld ra,40(sp) + 8000275c: 7402 ld s0,32(sp) + 8000275e: 64e2 ld s1,24(sp) + 80002760: 6942 ld s2,16(sp) + 80002762: 6145 addi sp,sp,48 + 80002764: 8082 ret + +0000000080002766 <syscall>: +[SYS_close] "close", +[SYS_trace] "trace", +}; +void +syscall(void) +{ + 80002766: 1101 addi sp,sp,-32 + 80002768: ec06 sd ra,24(sp) + 8000276a: e822 sd s0,16(sp) + 8000276c: e426 sd s1,8(sp) + 8000276e: e04a sd s2,0(sp) + 80002770: 1000 addi s0,sp,32 + int num; + struct proc *p = myproc(); + 80002772: 8b8ff0ef jal ra,8000182a <myproc> + 80002776: 84aa mv s1,a0 + + num = p->trapframe->a7; + 80002778: 6d3c ld a5,88(a0) + 8000277a: 77dc ld a5,168(a5) + 8000277c: 0007891b sext.w s2,a5 + if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { + 80002780: 37fd addiw a5,a5,-1 + 80002782: 475d li a4,23 + 80002784: 06f76163 bltu a4,a5,800027e6 <syscall+0x80> + 80002788: 00391713 slli a4,s2,0x3 + 8000278c: 00005797 auipc a5,0x5 + 80002790: dc478793 addi a5,a5,-572 # 80007550 <syscalls> + 80002794: 97ba add a5,a5,a4 + 80002796: 639c ld a5,0(a5) + 80002798: c7b9 beqz a5,800027e6 <syscall+0x80> + uint64 ret=syscalls[num](); + 8000279a: 9782 jalr a5 + p->trapframe->a0=ret; + 8000279c: 6cbc ld a5,88(s1) + 8000279e: fba8 sd a0,112(a5) + + if(num < NUM_SYSCALLS) { + 800027a0: 47dd li a5,23 + 800027a2: 0127ca63 blt a5,s2,800027b6 <syscall+0x50> + p->syscall_count[num]++; + 800027a6: 00291793 slli a5,s2,0x2 + 800027aa: 97a6 add a5,a5,s1 + 800027ac: 16c7a703 lw a4,364(a5) + 800027b0: 2705 addiw a4,a4,1 + 800027b2: 16e7a623 sw a4,364(a5) + } + if((1<<num)&p->trace_mask){ + 800027b6: 4705 li a4,1 + 800027b8: 0127173b sllw a4,a4,s2 + 800027bc: 1684a783 lw a5,360(s1) + 800027c0: 8ff9 and a5,a5,a4 + 800027c2: 2781 sext.w a5,a5 + 800027c4: cf95 beqz a5,80002800 <syscall+0x9a> + printf("%d: syscall %s -> %llu\n",p->pid,syscall_name[num],(unsigned long long)ret); + 800027c6: 090e slli s2,s2,0x3 + 800027c8: 00005797 auipc a5,0x5 + 800027cc: d8878793 addi a5,a5,-632 # 80007550 <syscalls> + 800027d0: 97ca add a5,a5,s2 + 800027d2: 86aa mv a3,a0 + 800027d4: 67f0 ld a2,200(a5) + 800027d6: 588c lw a1,48(s1) + 800027d8: 00005517 auipc a0,0x5 + 800027dc: c8050513 addi a0,a0,-896 # 80007458 <states.0+0x158> + 800027e0: cc3fd0ef jal ra,800004a2 <printf> + 800027e4: a831 j 80002800 <syscall+0x9a> + } + } else { + printf("%d %s: unknown sys call %d\n", + 800027e6: 86ca mv a3,s2 + 800027e8: 15848613 addi a2,s1,344 + 800027ec: 588c lw a1,48(s1) + 800027ee: 00005517 auipc a0,0x5 + 800027f2: c8250513 addi a0,a0,-894 # 80007470 <states.0+0x170> + 800027f6: cadfd0ef jal ra,800004a2 <printf> + p->pid, p->name, num); + p->trapframe->a0 = -1; + 800027fa: 6cbc ld a5,88(s1) + 800027fc: 577d li a4,-1 + 800027fe: fbb8 sd a4,112(a5) + } +} + 80002800: 60e2 ld ra,24(sp) + 80002802: 6442 ld s0,16(sp) + 80002804: 64a2 ld s1,8(sp) + 80002806: 6902 ld s2,0(sp) + 80002808: 6105 addi sp,sp,32 + 8000280a: 8082 ret + +000000008000280c <sys_exit>: +#include "spinlock.h" +#include "proc.h" + +uint64 +sys_exit(void) +{ + 8000280c: 1101 addi sp,sp,-32 + 8000280e: ec06 sd ra,24(sp) + 80002810: e822 sd s0,16(sp) + 80002812: 1000 addi s0,sp,32 + int n; + argint(0, &n); + 80002814: fec40593 addi a1,s0,-20 + 80002818: 4501 li a0,0 + 8000281a: ee5ff0ef jal ra,800026fe <argint> + exit(n); + 8000281e: fec42503 lw a0,-20(s0) + 80002822: f06ff0ef jal ra,80001f28 <exit> + return 0; // not reached +} + 80002826: 4501 li a0,0 + 80002828: 60e2 ld ra,24(sp) + 8000282a: 6442 ld s0,16(sp) + 8000282c: 6105 addi sp,sp,32 + 8000282e: 8082 ret + +0000000080002830 <sys_getpid>: + +uint64 +sys_getpid(void) +{ + 80002830: 1141 addi sp,sp,-16 + 80002832: e406 sd ra,8(sp) + 80002834: e022 sd s0,0(sp) + 80002836: 0800 addi s0,sp,16 + return myproc()->pid; + 80002838: ff3fe0ef jal ra,8000182a <myproc> +} + 8000283c: 5908 lw a0,48(a0) + 8000283e: 60a2 ld ra,8(sp) + 80002840: 6402 ld s0,0(sp) + 80002842: 0141 addi sp,sp,16 + 80002844: 8082 ret + +0000000080002846 <sys_fork>: + +uint64 +sys_fork(void) +{ + 80002846: 1141 addi sp,sp,-16 + 80002848: e406 sd ra,8(sp) + 8000284a: e022 sd s0,0(sp) + 8000284c: 0800 addi s0,sp,16 + return fork(); + 8000284e: b1cff0ef jal ra,80001b6a <fork> +} + 80002852: 60a2 ld ra,8(sp) + 80002854: 6402 ld s0,0(sp) + 80002856: 0141 addi sp,sp,16 + 80002858: 8082 ret + +000000008000285a <sys_wait>: + +uint64 +sys_wait(void) +{ + 8000285a: 1101 addi sp,sp,-32 + 8000285c: ec06 sd ra,24(sp) + 8000285e: e822 sd s0,16(sp) + 80002860: 1000 addi s0,sp,32 + uint64 p; + argaddr(0, &p); + 80002862: fe840593 addi a1,s0,-24 + 80002866: 4501 li a0,0 + 80002868: eb3ff0ef jal ra,8000271a <argaddr> + return wait(p); + 8000286c: fe843503 ld a0,-24(s0) + 80002870: 80fff0ef jal ra,8000207e <wait> +} + 80002874: 60e2 ld ra,24(sp) + 80002876: 6442 ld s0,16(sp) + 80002878: 6105 addi sp,sp,32 + 8000287a: 8082 ret + +000000008000287c <sys_sbrk>: + +uint64 +sys_sbrk(void) +{ + 8000287c: 7179 addi sp,sp,-48 + 8000287e: f406 sd ra,40(sp) + 80002880: f022 sd s0,32(sp) + 80002882: ec26 sd s1,24(sp) + 80002884: 1800 addi s0,sp,48 + uint64 addr; + int n; + + argint(0, &n); + 80002886: fdc40593 addi a1,s0,-36 + 8000288a: 4501 li a0,0 + 8000288c: e73ff0ef jal ra,800026fe <argint> + addr = myproc()->sz; + 80002890: f9bfe0ef jal ra,8000182a <myproc> + 80002894: 6524 ld s1,72(a0) + if(growproc(n) < 0) + 80002896: fdc42503 lw a0,-36(s0) + 8000289a: a80ff0ef jal ra,80001b1a <growproc> + 8000289e: 00054863 bltz a0,800028ae <sys_sbrk+0x32> + return -1; + return addr; +} + 800028a2: 8526 mv a0,s1 + 800028a4: 70a2 ld ra,40(sp) + 800028a6: 7402 ld s0,32(sp) + 800028a8: 64e2 ld s1,24(sp) + 800028aa: 6145 addi sp,sp,48 + 800028ac: 8082 ret + return -1; + 800028ae: 54fd li s1,-1 + 800028b0: bfcd j 800028a2 <sys_sbrk+0x26> + +00000000800028b2 <sys_sleep>: + +uint64 +sys_sleep(void) +{ + 800028b2: 7139 addi sp,sp,-64 + 800028b4: fc06 sd ra,56(sp) + 800028b6: f822 sd s0,48(sp) + 800028b8: f426 sd s1,40(sp) + 800028ba: f04a sd s2,32(sp) + 800028bc: ec4e sd s3,24(sp) + 800028be: 0080 addi s0,sp,64 + int n; + uint ticks0; + + argint(0, &n); + 800028c0: fcc40593 addi a1,s0,-52 + 800028c4: 4501 li a0,0 + 800028c6: e39ff0ef jal ra,800026fe <argint> + if(n < 0) + 800028ca: fcc42783 lw a5,-52(s0) + 800028ce: 0607c563 bltz a5,80002938 <sys_sleep+0x86> + n = 0; + acquire(&tickslock); + 800028d2: 00015517 auipc a0,0x15 + 800028d6: b3e50513 addi a0,a0,-1218 # 80017410 <tickslock> + 800028da: abefe0ef jal ra,80000b98 <acquire> + ticks0 = ticks; + 800028de: 00005917 auipc s2,0x5 + 800028e2: 1d292903 lw s2,466(s2) # 80007ab0 <ticks> + while(ticks - ticks0 < n){ + 800028e6: fcc42783 lw a5,-52(s0) + 800028ea: cb8d beqz a5,8000291c <sys_sleep+0x6a> + if(killed(myproc())){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + 800028ec: 00015997 auipc s3,0x15 + 800028f0: b2498993 addi s3,s3,-1244 # 80017410 <tickslock> + 800028f4: 00005497 auipc s1,0x5 + 800028f8: 1bc48493 addi s1,s1,444 # 80007ab0 <ticks> + if(killed(myproc())){ + 800028fc: f2ffe0ef jal ra,8000182a <myproc> + 80002900: f54ff0ef jal ra,80002054 <killed> + 80002904: ed0d bnez a0,8000293e <sys_sleep+0x8c> + sleep(&ticks, &tickslock); + 80002906: 85ce mv a1,s3 + 80002908: 8526 mv a0,s1 + 8000290a: d12ff0ef jal ra,80001e1c <sleep> + while(ticks - ticks0 < n){ + 8000290e: 409c lw a5,0(s1) + 80002910: 412787bb subw a5,a5,s2 + 80002914: fcc42703 lw a4,-52(s0) + 80002918: fee7e2e3 bltu a5,a4,800028fc <sys_sleep+0x4a> + } + release(&tickslock); + 8000291c: 00015517 auipc a0,0x15 + 80002920: af450513 addi a0,a0,-1292 # 80017410 <tickslock> + 80002924: b0cfe0ef jal ra,80000c30 <release> + return 0; + 80002928: 4501 li a0,0 +} + 8000292a: 70e2 ld ra,56(sp) + 8000292c: 7442 ld s0,48(sp) + 8000292e: 74a2 ld s1,40(sp) + 80002930: 7902 ld s2,32(sp) + 80002932: 69e2 ld s3,24(sp) + 80002934: 6121 addi sp,sp,64 + 80002936: 8082 ret + n = 0; + 80002938: fc042623 sw zero,-52(s0) + 8000293c: bf59 j 800028d2 <sys_sleep+0x20> + release(&tickslock); + 8000293e: 00015517 auipc a0,0x15 + 80002942: ad250513 addi a0,a0,-1326 # 80017410 <tickslock> + 80002946: aeafe0ef jal ra,80000c30 <release> + return -1; + 8000294a: 557d li a0,-1 + 8000294c: bff9 j 8000292a <sys_sleep+0x78> + +000000008000294e <sys_kill>: + +uint64 +sys_kill(void) +{ + 8000294e: 1101 addi sp,sp,-32 + 80002950: ec06 sd ra,24(sp) + 80002952: e822 sd s0,16(sp) + 80002954: 1000 addi s0,sp,32 + int pid; + + argint(0, &pid); + 80002956: fec40593 addi a1,s0,-20 + 8000295a: 4501 li a0,0 + 8000295c: da3ff0ef jal ra,800026fe <argint> + return kill(pid); + 80002960: fec42503 lw a0,-20(s0) + 80002964: e66ff0ef jal ra,80001fca <kill> +} + 80002968: 60e2 ld ra,24(sp) + 8000296a: 6442 ld s0,16(sp) + 8000296c: 6105 addi sp,sp,32 + 8000296e: 8082 ret + +0000000080002970 <sys_uptime>: + +// return how many clock tick interrupts have occurred +// since start. +uint64 +sys_uptime(void) +{ + 80002970: 1101 addi sp,sp,-32 + 80002972: ec06 sd ra,24(sp) + 80002974: e822 sd s0,16(sp) + 80002976: e426 sd s1,8(sp) + 80002978: 1000 addi s0,sp,32 + uint xticks; + + acquire(&tickslock); + 8000297a: 00015517 auipc a0,0x15 + 8000297e: a9650513 addi a0,a0,-1386 # 80017410 <tickslock> + 80002982: a16fe0ef jal ra,80000b98 <acquire> + xticks = ticks; + 80002986: 00005497 auipc s1,0x5 + 8000298a: 12a4a483 lw s1,298(s1) # 80007ab0 <ticks> + release(&tickslock); + 8000298e: 00015517 auipc a0,0x15 + 80002992: a8250513 addi a0,a0,-1406 # 80017410 <tickslock> + 80002996: a9afe0ef jal ra,80000c30 <release> + return xticks; +} + 8000299a: 02049513 slli a0,s1,0x20 + 8000299e: 9101 srli a0,a0,0x20 + 800029a0: 60e2 ld ra,24(sp) + 800029a2: 6442 ld s0,16(sp) + 800029a4: 64a2 ld s1,8(sp) + 800029a6: 6105 addi sp,sp,32 + 800029a8: 8082 ret + +00000000800029aa <sys_trace>: + + + +uint64 +sys_trace(void) +{ + 800029aa: 1101 addi sp,sp,-32 + 800029ac: ec06 sd ra,24(sp) + 800029ae: e822 sd s0,16(sp) + 800029b0: 1000 addi s0,sp,32 + uint mask; + argint(0,(int*)&mask); + 800029b2: fec40593 addi a1,s0,-20 + 800029b6: 4501 li a0,0 + 800029b8: d47ff0ef jal ra,800026fe <argint> + if(mask<0) + return -1; + struct proc* p=myproc(); + 800029bc: e6ffe0ef jal ra,8000182a <myproc> + p->trace_mask |= mask; + 800029c0: 16852783 lw a5,360(a0) + 800029c4: fec42703 lw a4,-20(s0) + 800029c8: 8fd9 or a5,a5,a4 + 800029ca: 16f52423 sw a5,360(a0) + return 0; +} + 800029ce: 4501 li a0,0 + 800029d0: 60e2 ld ra,24(sp) + 800029d2: 6442 ld s0,16(sp) + 800029d4: 6105 addi sp,sp,32 + 800029d6: 8082 ret + +00000000800029d8 <sys_mycall>: + + +uint64 +sys_mycall(void) +{ + 800029d8: 1141 addi sp,sp,-16 + 800029da: e422 sd s0,8(sp) + 800029dc: 0800 addi s0,sp,16 + return 666; +} + 800029de: 29a00513 li a0,666 + 800029e2: 6422 ld s0,8(sp) + 800029e4: 0141 addi sp,sp,16 + 800029e6: 8082 ret + +00000000800029e8 <sys_GSCinfo>: + +uint64 +sys_GSCinfo(void) { + 800029e8: 7179 addi sp,sp,-48 + 800029ea: f406 sd ra,40(sp) + 800029ec: f022 sd s0,32(sp) + 800029ee: ec26 sd s1,24(sp) + 800029f0: 1800 addi s0,sp,48 + struct proc *p = myproc(); // 获å–当å‰è¿›ç¨‹ + 800029f2: e39fe0ef jal ra,8000182a <myproc> + 800029f6: 84aa mv s1,a0 + uint64 addr; // ç”¨æˆ·ç©ºé—´åœ°å€ + argaddr(0, &addr); + 800029f8: fd840593 addi a1,s0,-40 + 800029fc: 4501 li a0,0 + 800029fe: d1dff0ef jal ra,8000271a <argaddr> + // 从用户程åºèŽ·å–ä¼ å…¥çš„ç¼“å†²åŒºåœ°å€ + if ( addr< 0) + return -1; + + // å°† syscall_count 数组å¤åˆ¶åˆ°ç”¨æˆ·ç©ºé—´ + if (copyout(p->pagetable, addr, (char *)p->syscall_count, NUM_SYSCALLS * sizeof(int)) < 0) + 80002a02: 06000693 li a3,96 + 80002a06: 16c48613 addi a2,s1,364 + 80002a0a: fd843583 ld a1,-40(s0) + 80002a0e: 68a8 ld a0,80(s1) + 80002a10: ad3fe0ef jal ra,800014e2 <copyout> + return -1; + + return 0; +} + 80002a14: 957d srai a0,a0,0x3f + 80002a16: 70a2 ld ra,40(sp) + 80002a18: 7402 ld s0,32(sp) + 80002a1a: 64e2 ld s1,24(sp) + 80002a1c: 6145 addi sp,sp,48 + 80002a1e: 8082 ret + +0000000080002a20 <binit>: + struct buf head; +} bcache; + +void +binit(void) +{ + 80002a20: 7179 addi sp,sp,-48 + 80002a22: f406 sd ra,40(sp) + 80002a24: f022 sd s0,32(sp) + 80002a26: ec26 sd s1,24(sp) + 80002a28: e84a sd s2,16(sp) + 80002a2a: e44e sd s3,8(sp) + 80002a2c: e052 sd s4,0(sp) + 80002a2e: 1800 addi s0,sp,48 + struct buf *b; + + initlock(&bcache.lock, "bcache"); + 80002a30: 00005597 auipc a1,0x5 + 80002a34: ca058593 addi a1,a1,-864 # 800076d0 <syscall_name+0xb8> + 80002a38: 00015517 auipc a0,0x15 + 80002a3c: 9f050513 addi a0,a0,-1552 # 80017428 <bcache> + 80002a40: 8d8fe0ef jal ra,80000b18 <initlock> + + // Create linked list of buffers + bcache.head.prev = &bcache.head; + 80002a44: 0001d797 auipc a5,0x1d + 80002a48: 9e478793 addi a5,a5,-1564 # 8001f428 <bcache+0x8000> + 80002a4c: 0001d717 auipc a4,0x1d + 80002a50: c4470713 addi a4,a4,-956 # 8001f690 <bcache+0x8268> + 80002a54: 2ae7b823 sd a4,688(a5) + bcache.head.next = &bcache.head; + 80002a58: 2ae7bc23 sd a4,696(a5) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002a5c: 00015497 auipc s1,0x15 + 80002a60: 9e448493 addi s1,s1,-1564 # 80017440 <bcache+0x18> + b->next = bcache.head.next; + 80002a64: 893e mv s2,a5 + b->prev = &bcache.head; + 80002a66: 89ba mv s3,a4 + initsleeplock(&b->lock, "buffer"); + 80002a68: 00005a17 auipc s4,0x5 + 80002a6c: c70a0a13 addi s4,s4,-912 # 800076d8 <syscall_name+0xc0> + b->next = bcache.head.next; + 80002a70: 2b893783 ld a5,696(s2) + 80002a74: e8bc sd a5,80(s1) + b->prev = &bcache.head; + 80002a76: 0534b423 sd s3,72(s1) + initsleeplock(&b->lock, "buffer"); + 80002a7a: 85d2 mv a1,s4 + 80002a7c: 01048513 addi a0,s1,16 + 80002a80: 228010ef jal ra,80003ca8 <initsleeplock> + bcache.head.next->prev = b; + 80002a84: 2b893783 ld a5,696(s2) + 80002a88: e7a4 sd s1,72(a5) + bcache.head.next = b; + 80002a8a: 2a993c23 sd s1,696(s2) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002a8e: 45848493 addi s1,s1,1112 + 80002a92: fd349fe3 bne s1,s3,80002a70 <binit+0x50> + } +} + 80002a96: 70a2 ld ra,40(sp) + 80002a98: 7402 ld s0,32(sp) + 80002a9a: 64e2 ld s1,24(sp) + 80002a9c: 6942 ld s2,16(sp) + 80002a9e: 69a2 ld s3,8(sp) + 80002aa0: 6a02 ld s4,0(sp) + 80002aa2: 6145 addi sp,sp,48 + 80002aa4: 8082 ret + +0000000080002aa6 <bread>: +} + +// Return a locked buf with the contents of the indicated block. +struct buf* +bread(uint dev, uint blockno) +{ + 80002aa6: 7179 addi sp,sp,-48 + 80002aa8: f406 sd ra,40(sp) + 80002aaa: f022 sd s0,32(sp) + 80002aac: ec26 sd s1,24(sp) + 80002aae: e84a sd s2,16(sp) + 80002ab0: e44e sd s3,8(sp) + 80002ab2: 1800 addi s0,sp,48 + 80002ab4: 892a mv s2,a0 + 80002ab6: 89ae mv s3,a1 + acquire(&bcache.lock); + 80002ab8: 00015517 auipc a0,0x15 + 80002abc: 97050513 addi a0,a0,-1680 # 80017428 <bcache> + 80002ac0: 8d8fe0ef jal ra,80000b98 <acquire> + for(b = bcache.head.next; b != &bcache.head; b = b->next){ + 80002ac4: 0001d497 auipc s1,0x1d + 80002ac8: c1c4b483 ld s1,-996(s1) # 8001f6e0 <bcache+0x82b8> + 80002acc: 0001d797 auipc a5,0x1d + 80002ad0: bc478793 addi a5,a5,-1084 # 8001f690 <bcache+0x8268> + 80002ad4: 02f48b63 beq s1,a5,80002b0a <bread+0x64> + 80002ad8: 873e mv a4,a5 + 80002ada: a021 j 80002ae2 <bread+0x3c> + 80002adc: 68a4 ld s1,80(s1) + 80002ade: 02e48663 beq s1,a4,80002b0a <bread+0x64> + if(b->dev == dev && b->blockno == blockno){ + 80002ae2: 449c lw a5,8(s1) + 80002ae4: ff279ce3 bne a5,s2,80002adc <bread+0x36> + 80002ae8: 44dc lw a5,12(s1) + 80002aea: ff3799e3 bne a5,s3,80002adc <bread+0x36> + b->refcnt++; + 80002aee: 40bc lw a5,64(s1) + 80002af0: 2785 addiw a5,a5,1 + 80002af2: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002af4: 00015517 auipc a0,0x15 + 80002af8: 93450513 addi a0,a0,-1740 # 80017428 <bcache> + 80002afc: 934fe0ef jal ra,80000c30 <release> + acquiresleep(&b->lock); + 80002b00: 01048513 addi a0,s1,16 + 80002b04: 1da010ef jal ra,80003cde <acquiresleep> + return b; + 80002b08: a889 j 80002b5a <bread+0xb4> + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002b0a: 0001d497 auipc s1,0x1d + 80002b0e: bce4b483 ld s1,-1074(s1) # 8001f6d8 <bcache+0x82b0> + 80002b12: 0001d797 auipc a5,0x1d + 80002b16: b7e78793 addi a5,a5,-1154 # 8001f690 <bcache+0x8268> + 80002b1a: 00f48863 beq s1,a5,80002b2a <bread+0x84> + 80002b1e: 873e mv a4,a5 + if(b->refcnt == 0) { + 80002b20: 40bc lw a5,64(s1) + 80002b22: cb91 beqz a5,80002b36 <bread+0x90> + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002b24: 64a4 ld s1,72(s1) + 80002b26: fee49de3 bne s1,a4,80002b20 <bread+0x7a> + panic("bget: no buffers"); + 80002b2a: 00005517 auipc a0,0x5 + 80002b2e: bb650513 addi a0,a0,-1098 # 800076e0 <syscall_name+0xc8> + 80002b32: c25fd0ef jal ra,80000756 <panic> + b->dev = dev; + 80002b36: 0124a423 sw s2,8(s1) + b->blockno = blockno; + 80002b3a: 0134a623 sw s3,12(s1) + b->valid = 0; + 80002b3e: 0004a023 sw zero,0(s1) + b->refcnt = 1; + 80002b42: 4785 li a5,1 + 80002b44: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002b46: 00015517 auipc a0,0x15 + 80002b4a: 8e250513 addi a0,a0,-1822 # 80017428 <bcache> + 80002b4e: 8e2fe0ef jal ra,80000c30 <release> + acquiresleep(&b->lock); + 80002b52: 01048513 addi a0,s1,16 + 80002b56: 188010ef jal ra,80003cde <acquiresleep> + struct buf *b; + + b = bget(dev, blockno); + if(!b->valid) { + 80002b5a: 409c lw a5,0(s1) + 80002b5c: cb89 beqz a5,80002b6e <bread+0xc8> + virtio_disk_rw(b, 0); + b->valid = 1; + } + return b; +} + 80002b5e: 8526 mv a0,s1 + 80002b60: 70a2 ld ra,40(sp) + 80002b62: 7402 ld s0,32(sp) + 80002b64: 64e2 ld s1,24(sp) + 80002b66: 6942 ld s2,16(sp) + 80002b68: 69a2 ld s3,8(sp) + 80002b6a: 6145 addi sp,sp,48 + 80002b6c: 8082 ret + virtio_disk_rw(b, 0); + 80002b6e: 4581 li a1,0 + 80002b70: 8526 mv a0,s1 + 80002b72: 0d9020ef jal ra,8000544a <virtio_disk_rw> + b->valid = 1; + 80002b76: 4785 li a5,1 + 80002b78: c09c sw a5,0(s1) + return b; + 80002b7a: b7d5 j 80002b5e <bread+0xb8> + +0000000080002b7c <bwrite>: + +// Write b's contents to disk. Must be locked. +void +bwrite(struct buf *b) +{ + 80002b7c: 1101 addi sp,sp,-32 + 80002b7e: ec06 sd ra,24(sp) + 80002b80: e822 sd s0,16(sp) + 80002b82: e426 sd s1,8(sp) + 80002b84: 1000 addi s0,sp,32 + 80002b86: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002b88: 0541 addi a0,a0,16 + 80002b8a: 1d2010ef jal ra,80003d5c <holdingsleep> + 80002b8e: c911 beqz a0,80002ba2 <bwrite+0x26> + panic("bwrite"); + virtio_disk_rw(b, 1); + 80002b90: 4585 li a1,1 + 80002b92: 8526 mv a0,s1 + 80002b94: 0b7020ef jal ra,8000544a <virtio_disk_rw> +} + 80002b98: 60e2 ld ra,24(sp) + 80002b9a: 6442 ld s0,16(sp) + 80002b9c: 64a2 ld s1,8(sp) + 80002b9e: 6105 addi sp,sp,32 + 80002ba0: 8082 ret + panic("bwrite"); + 80002ba2: 00005517 auipc a0,0x5 + 80002ba6: b5650513 addi a0,a0,-1194 # 800076f8 <syscall_name+0xe0> + 80002baa: badfd0ef jal ra,80000756 <panic> + +0000000080002bae <brelse>: + +// Release a locked buffer. +// Move to the head of the most-recently-used list. +void +brelse(struct buf *b) +{ + 80002bae: 1101 addi sp,sp,-32 + 80002bb0: ec06 sd ra,24(sp) + 80002bb2: e822 sd s0,16(sp) + 80002bb4: e426 sd s1,8(sp) + 80002bb6: e04a sd s2,0(sp) + 80002bb8: 1000 addi s0,sp,32 + 80002bba: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002bbc: 01050913 addi s2,a0,16 + 80002bc0: 854a mv a0,s2 + 80002bc2: 19a010ef jal ra,80003d5c <holdingsleep> + 80002bc6: c13d beqz a0,80002c2c <brelse+0x7e> + panic("brelse"); + + releasesleep(&b->lock); + 80002bc8: 854a mv a0,s2 + 80002bca: 15a010ef jal ra,80003d24 <releasesleep> + + acquire(&bcache.lock); + 80002bce: 00015517 auipc a0,0x15 + 80002bd2: 85a50513 addi a0,a0,-1958 # 80017428 <bcache> + 80002bd6: fc3fd0ef jal ra,80000b98 <acquire> + b->refcnt--; + 80002bda: 40bc lw a5,64(s1) + 80002bdc: 37fd addiw a5,a5,-1 + 80002bde: 0007871b sext.w a4,a5 + 80002be2: c0bc sw a5,64(s1) + if (b->refcnt == 0) { + 80002be4: eb05 bnez a4,80002c14 <brelse+0x66> + // no one is waiting for it. + b->next->prev = b->prev; + 80002be6: 68bc ld a5,80(s1) + 80002be8: 64b8 ld a4,72(s1) + 80002bea: e7b8 sd a4,72(a5) + b->prev->next = b->next; + 80002bec: 64bc ld a5,72(s1) + 80002bee: 68b8 ld a4,80(s1) + 80002bf0: ebb8 sd a4,80(a5) + b->next = bcache.head.next; + 80002bf2: 0001d797 auipc a5,0x1d + 80002bf6: 83678793 addi a5,a5,-1994 # 8001f428 <bcache+0x8000> + 80002bfa: 2b87b703 ld a4,696(a5) + 80002bfe: e8b8 sd a4,80(s1) + b->prev = &bcache.head; + 80002c00: 0001d717 auipc a4,0x1d + 80002c04: a9070713 addi a4,a4,-1392 # 8001f690 <bcache+0x8268> + 80002c08: e4b8 sd a4,72(s1) + bcache.head.next->prev = b; + 80002c0a: 2b87b703 ld a4,696(a5) + 80002c0e: e724 sd s1,72(a4) + bcache.head.next = b; + 80002c10: 2a97bc23 sd s1,696(a5) + } + + release(&bcache.lock); + 80002c14: 00015517 auipc a0,0x15 + 80002c18: 81450513 addi a0,a0,-2028 # 80017428 <bcache> + 80002c1c: 814fe0ef jal ra,80000c30 <release> +} + 80002c20: 60e2 ld ra,24(sp) + 80002c22: 6442 ld s0,16(sp) + 80002c24: 64a2 ld s1,8(sp) + 80002c26: 6902 ld s2,0(sp) + 80002c28: 6105 addi sp,sp,32 + 80002c2a: 8082 ret + panic("brelse"); + 80002c2c: 00005517 auipc a0,0x5 + 80002c30: ad450513 addi a0,a0,-1324 # 80007700 <syscall_name+0xe8> + 80002c34: b23fd0ef jal ra,80000756 <panic> + +0000000080002c38 <bpin>: + +void +bpin(struct buf *b) { + 80002c38: 1101 addi sp,sp,-32 + 80002c3a: ec06 sd ra,24(sp) + 80002c3c: e822 sd s0,16(sp) + 80002c3e: e426 sd s1,8(sp) + 80002c40: 1000 addi s0,sp,32 + 80002c42: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002c44: 00014517 auipc a0,0x14 + 80002c48: 7e450513 addi a0,a0,2020 # 80017428 <bcache> + 80002c4c: f4dfd0ef jal ra,80000b98 <acquire> + b->refcnt++; + 80002c50: 40bc lw a5,64(s1) + 80002c52: 2785 addiw a5,a5,1 + 80002c54: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002c56: 00014517 auipc a0,0x14 + 80002c5a: 7d250513 addi a0,a0,2002 # 80017428 <bcache> + 80002c5e: fd3fd0ef jal ra,80000c30 <release> +} + 80002c62: 60e2 ld ra,24(sp) + 80002c64: 6442 ld s0,16(sp) + 80002c66: 64a2 ld s1,8(sp) + 80002c68: 6105 addi sp,sp,32 + 80002c6a: 8082 ret + +0000000080002c6c <bunpin>: + +void +bunpin(struct buf *b) { + 80002c6c: 1101 addi sp,sp,-32 + 80002c6e: ec06 sd ra,24(sp) + 80002c70: e822 sd s0,16(sp) + 80002c72: e426 sd s1,8(sp) + 80002c74: 1000 addi s0,sp,32 + 80002c76: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002c78: 00014517 auipc a0,0x14 + 80002c7c: 7b050513 addi a0,a0,1968 # 80017428 <bcache> + 80002c80: f19fd0ef jal ra,80000b98 <acquire> + b->refcnt--; + 80002c84: 40bc lw a5,64(s1) + 80002c86: 37fd addiw a5,a5,-1 + 80002c88: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002c8a: 00014517 auipc a0,0x14 + 80002c8e: 79e50513 addi a0,a0,1950 # 80017428 <bcache> + 80002c92: f9ffd0ef jal ra,80000c30 <release> +} + 80002c96: 60e2 ld ra,24(sp) + 80002c98: 6442 ld s0,16(sp) + 80002c9a: 64a2 ld s1,8(sp) + 80002c9c: 6105 addi sp,sp,32 + 80002c9e: 8082 ret + +0000000080002ca0 <bfree>: +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ + 80002ca0: 1101 addi sp,sp,-32 + 80002ca2: ec06 sd ra,24(sp) + 80002ca4: e822 sd s0,16(sp) + 80002ca6: e426 sd s1,8(sp) + 80002ca8: e04a sd s2,0(sp) + 80002caa: 1000 addi s0,sp,32 + 80002cac: 84ae mv s1,a1 + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); + 80002cae: 00d5d59b srliw a1,a1,0xd + 80002cb2: 0001d797 auipc a5,0x1d + 80002cb6: e527a783 lw a5,-430(a5) # 8001fb04 <sb+0x1c> + 80002cba: 9dbd addw a1,a1,a5 + 80002cbc: debff0ef jal ra,80002aa6 <bread> + bi = b % BPB; + m = 1 << (bi % 8); + 80002cc0: 0074f713 andi a4,s1,7 + 80002cc4: 4785 li a5,1 + 80002cc6: 00e797bb sllw a5,a5,a4 + if((bp->data[bi/8] & m) == 0) + 80002cca: 14ce slli s1,s1,0x33 + 80002ccc: 90d9 srli s1,s1,0x36 + 80002cce: 00950733 add a4,a0,s1 + 80002cd2: 05874703 lbu a4,88(a4) + 80002cd6: 00e7f6b3 and a3,a5,a4 + 80002cda: c29d beqz a3,80002d00 <bfree+0x60> + 80002cdc: 892a mv s2,a0 + panic("freeing free block"); + bp->data[bi/8] &= ~m; + 80002cde: 94aa add s1,s1,a0 + 80002ce0: fff7c793 not a5,a5 + 80002ce4: 8f7d and a4,a4,a5 + 80002ce6: 04e48c23 sb a4,88(s1) + log_write(bp); + 80002cea: 6ef000ef jal ra,80003bd8 <log_write> + brelse(bp); + 80002cee: 854a mv a0,s2 + 80002cf0: ebfff0ef jal ra,80002bae <brelse> +} + 80002cf4: 60e2 ld ra,24(sp) + 80002cf6: 6442 ld s0,16(sp) + 80002cf8: 64a2 ld s1,8(sp) + 80002cfa: 6902 ld s2,0(sp) + 80002cfc: 6105 addi sp,sp,32 + 80002cfe: 8082 ret + panic("freeing free block"); + 80002d00: 00005517 auipc a0,0x5 + 80002d04: a0850513 addi a0,a0,-1528 # 80007708 <syscall_name+0xf0> + 80002d08: a4ffd0ef jal ra,80000756 <panic> + +0000000080002d0c <balloc>: +{ + 80002d0c: 711d addi sp,sp,-96 + 80002d0e: ec86 sd ra,88(sp) + 80002d10: e8a2 sd s0,80(sp) + 80002d12: e4a6 sd s1,72(sp) + 80002d14: e0ca sd s2,64(sp) + 80002d16: fc4e sd s3,56(sp) + 80002d18: f852 sd s4,48(sp) + 80002d1a: f456 sd s5,40(sp) + 80002d1c: f05a sd s6,32(sp) + 80002d1e: ec5e sd s7,24(sp) + 80002d20: e862 sd s8,16(sp) + 80002d22: e466 sd s9,8(sp) + 80002d24: 1080 addi s0,sp,96 + for(b = 0; b < sb.size; b += BPB){ + 80002d26: 0001d797 auipc a5,0x1d + 80002d2a: dc67a783 lw a5,-570(a5) # 8001faec <sb+0x4> + 80002d2e: cff1 beqz a5,80002e0a <balloc+0xfe> + 80002d30: 8baa mv s7,a0 + 80002d32: 4a81 li s5,0 + bp = bread(dev, BBLOCK(b, sb)); + 80002d34: 0001db17 auipc s6,0x1d + 80002d38: db4b0b13 addi s6,s6,-588 # 8001fae8 <sb> + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002d3c: 4c01 li s8,0 + m = 1 << (bi % 8); + 80002d3e: 4985 li s3,1 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002d40: 6a09 lui s4,0x2 + for(b = 0; b < sb.size; b += BPB){ + 80002d42: 6c89 lui s9,0x2 + 80002d44: a0b5 j 80002db0 <balloc+0xa4> + bp->data[bi/8] |= m; // Mark block in use. + 80002d46: 97ca add a5,a5,s2 + 80002d48: 8e55 or a2,a2,a3 + 80002d4a: 04c78c23 sb a2,88(a5) + log_write(bp); + 80002d4e: 854a mv a0,s2 + 80002d50: 689000ef jal ra,80003bd8 <log_write> + brelse(bp); + 80002d54: 854a mv a0,s2 + 80002d56: e59ff0ef jal ra,80002bae <brelse> + bp = bread(dev, bno); + 80002d5a: 85a6 mv a1,s1 + 80002d5c: 855e mv a0,s7 + 80002d5e: d49ff0ef jal ra,80002aa6 <bread> + 80002d62: 892a mv s2,a0 + memset(bp->data, 0, BSIZE); + 80002d64: 40000613 li a2,1024 + 80002d68: 4581 li a1,0 + 80002d6a: 05850513 addi a0,a0,88 + 80002d6e: efffd0ef jal ra,80000c6c <memset> + log_write(bp); + 80002d72: 854a mv a0,s2 + 80002d74: 665000ef jal ra,80003bd8 <log_write> + brelse(bp); + 80002d78: 854a mv a0,s2 + 80002d7a: e35ff0ef jal ra,80002bae <brelse> +} + 80002d7e: 8526 mv a0,s1 + 80002d80: 60e6 ld ra,88(sp) + 80002d82: 6446 ld s0,80(sp) + 80002d84: 64a6 ld s1,72(sp) + 80002d86: 6906 ld s2,64(sp) + 80002d88: 79e2 ld s3,56(sp) + 80002d8a: 7a42 ld s4,48(sp) + 80002d8c: 7aa2 ld s5,40(sp) + 80002d8e: 7b02 ld s6,32(sp) + 80002d90: 6be2 ld s7,24(sp) + 80002d92: 6c42 ld s8,16(sp) + 80002d94: 6ca2 ld s9,8(sp) + 80002d96: 6125 addi sp,sp,96 + 80002d98: 8082 ret + brelse(bp); + 80002d9a: 854a mv a0,s2 + 80002d9c: e13ff0ef jal ra,80002bae <brelse> + for(b = 0; b < sb.size; b += BPB){ + 80002da0: 015c87bb addw a5,s9,s5 + 80002da4: 00078a9b sext.w s5,a5 + 80002da8: 004b2703 lw a4,4(s6) + 80002dac: 04eaff63 bgeu s5,a4,80002e0a <balloc+0xfe> + bp = bread(dev, BBLOCK(b, sb)); + 80002db0: 41fad79b sraiw a5,s5,0x1f + 80002db4: 0137d79b srliw a5,a5,0x13 + 80002db8: 015787bb addw a5,a5,s5 + 80002dbc: 40d7d79b sraiw a5,a5,0xd + 80002dc0: 01cb2583 lw a1,28(s6) + 80002dc4: 9dbd addw a1,a1,a5 + 80002dc6: 855e mv a0,s7 + 80002dc8: cdfff0ef jal ra,80002aa6 <bread> + 80002dcc: 892a mv s2,a0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002dce: 004b2503 lw a0,4(s6) + 80002dd2: 000a849b sext.w s1,s5 + 80002dd6: 8762 mv a4,s8 + 80002dd8: fca4f1e3 bgeu s1,a0,80002d9a <balloc+0x8e> + m = 1 << (bi % 8); + 80002ddc: 00777693 andi a3,a4,7 + 80002de0: 00d996bb sllw a3,s3,a3 + if((bp->data[bi/8] & m) == 0){ // Is block free? + 80002de4: 41f7579b sraiw a5,a4,0x1f + 80002de8: 01d7d79b srliw a5,a5,0x1d + 80002dec: 9fb9 addw a5,a5,a4 + 80002dee: 4037d79b sraiw a5,a5,0x3 + 80002df2: 00f90633 add a2,s2,a5 + 80002df6: 05864603 lbu a2,88(a2) + 80002dfa: 00c6f5b3 and a1,a3,a2 + 80002dfe: d5a1 beqz a1,80002d46 <balloc+0x3a> + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002e00: 2705 addiw a4,a4,1 + 80002e02: 2485 addiw s1,s1,1 + 80002e04: fd471ae3 bne a4,s4,80002dd8 <balloc+0xcc> + 80002e08: bf49 j 80002d9a <balloc+0x8e> + printf("balloc: out of blocks\n"); + 80002e0a: 00005517 auipc a0,0x5 + 80002e0e: 91650513 addi a0,a0,-1770 # 80007720 <syscall_name+0x108> + 80002e12: e90fd0ef jal ra,800004a2 <printf> + return 0; + 80002e16: 4481 li s1,0 + 80002e18: b79d j 80002d7e <balloc+0x72> + +0000000080002e1a <bmap>: +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +// returns 0 if out of disk space. +static uint +bmap(struct inode *ip, uint bn) +{ + 80002e1a: 7179 addi sp,sp,-48 + 80002e1c: f406 sd ra,40(sp) + 80002e1e: f022 sd s0,32(sp) + 80002e20: ec26 sd s1,24(sp) + 80002e22: e84a sd s2,16(sp) + 80002e24: e44e sd s3,8(sp) + 80002e26: e052 sd s4,0(sp) + 80002e28: 1800 addi s0,sp,48 + 80002e2a: 89aa mv s3,a0 + uint addr, *a; + struct buf *bp; + + if(bn < NDIRECT){ + 80002e2c: 47ad li a5,11 + 80002e2e: 02b7e663 bltu a5,a1,80002e5a <bmap+0x40> + if((addr = ip->addrs[bn]) == 0){ + 80002e32: 02059793 slli a5,a1,0x20 + 80002e36: 01e7d593 srli a1,a5,0x1e + 80002e3a: 00b504b3 add s1,a0,a1 + 80002e3e: 0504a903 lw s2,80(s1) + 80002e42: 06091663 bnez s2,80002eae <bmap+0x94> + addr = balloc(ip->dev); + 80002e46: 4108 lw a0,0(a0) + 80002e48: ec5ff0ef jal ra,80002d0c <balloc> + 80002e4c: 0005091b sext.w s2,a0 + if(addr == 0) + 80002e50: 04090f63 beqz s2,80002eae <bmap+0x94> + return 0; + ip->addrs[bn] = addr; + 80002e54: 0524a823 sw s2,80(s1) + 80002e58: a899 j 80002eae <bmap+0x94> + } + return addr; + } + bn -= NDIRECT; + 80002e5a: ff45849b addiw s1,a1,-12 + 80002e5e: 0004871b sext.w a4,s1 + + if(bn < NINDIRECT){ + 80002e62: 0ff00793 li a5,255 + 80002e66: 06e7eb63 bltu a5,a4,80002edc <bmap+0xc2> + // Load indirect block, allocating if necessary. + if((addr = ip->addrs[NDIRECT]) == 0){ + 80002e6a: 08052903 lw s2,128(a0) + 80002e6e: 00091b63 bnez s2,80002e84 <bmap+0x6a> + addr = balloc(ip->dev); + 80002e72: 4108 lw a0,0(a0) + 80002e74: e99ff0ef jal ra,80002d0c <balloc> + 80002e78: 0005091b sext.w s2,a0 + if(addr == 0) + 80002e7c: 02090963 beqz s2,80002eae <bmap+0x94> + return 0; + ip->addrs[NDIRECT] = addr; + 80002e80: 0929a023 sw s2,128(s3) + } + bp = bread(ip->dev, addr); + 80002e84: 85ca mv a1,s2 + 80002e86: 0009a503 lw a0,0(s3) + 80002e8a: c1dff0ef jal ra,80002aa6 <bread> + 80002e8e: 8a2a mv s4,a0 + a = (uint*)bp->data; + 80002e90: 05850793 addi a5,a0,88 + if((addr = a[bn]) == 0){ + 80002e94: 02049713 slli a4,s1,0x20 + 80002e98: 01e75593 srli a1,a4,0x1e + 80002e9c: 00b784b3 add s1,a5,a1 + 80002ea0: 0004a903 lw s2,0(s1) + 80002ea4: 00090e63 beqz s2,80002ec0 <bmap+0xa6> + if(addr){ + a[bn] = addr; + log_write(bp); + } + } + brelse(bp); + 80002ea8: 8552 mv a0,s4 + 80002eaa: d05ff0ef jal ra,80002bae <brelse> + return addr; + } + + panic("bmap: out of range"); +} + 80002eae: 854a mv a0,s2 + 80002eb0: 70a2 ld ra,40(sp) + 80002eb2: 7402 ld s0,32(sp) + 80002eb4: 64e2 ld s1,24(sp) + 80002eb6: 6942 ld s2,16(sp) + 80002eb8: 69a2 ld s3,8(sp) + 80002eba: 6a02 ld s4,0(sp) + 80002ebc: 6145 addi sp,sp,48 + 80002ebe: 8082 ret + addr = balloc(ip->dev); + 80002ec0: 0009a503 lw a0,0(s3) + 80002ec4: e49ff0ef jal ra,80002d0c <balloc> + 80002ec8: 0005091b sext.w s2,a0 + if(addr){ + 80002ecc: fc090ee3 beqz s2,80002ea8 <bmap+0x8e> + a[bn] = addr; + 80002ed0: 0124a023 sw s2,0(s1) + log_write(bp); + 80002ed4: 8552 mv a0,s4 + 80002ed6: 503000ef jal ra,80003bd8 <log_write> + 80002eda: b7f9 j 80002ea8 <bmap+0x8e> + panic("bmap: out of range"); + 80002edc: 00005517 auipc a0,0x5 + 80002ee0: 85c50513 addi a0,a0,-1956 # 80007738 <syscall_name+0x120> + 80002ee4: 873fd0ef jal ra,80000756 <panic> + +0000000080002ee8 <iget>: +{ + 80002ee8: 7179 addi sp,sp,-48 + 80002eea: f406 sd ra,40(sp) + 80002eec: f022 sd s0,32(sp) + 80002eee: ec26 sd s1,24(sp) + 80002ef0: e84a sd s2,16(sp) + 80002ef2: e44e sd s3,8(sp) + 80002ef4: e052 sd s4,0(sp) + 80002ef6: 1800 addi s0,sp,48 + 80002ef8: 89aa mv s3,a0 + 80002efa: 8a2e mv s4,a1 + acquire(&itable.lock); + 80002efc: 0001d517 auipc a0,0x1d + 80002f00: c0c50513 addi a0,a0,-1012 # 8001fb08 <itable> + 80002f04: c95fd0ef jal ra,80000b98 <acquire> + empty = 0; + 80002f08: 4901 li s2,0 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 80002f0a: 0001d497 auipc s1,0x1d + 80002f0e: c1648493 addi s1,s1,-1002 # 8001fb20 <itable+0x18> + 80002f12: 0001e697 auipc a3,0x1e + 80002f16: 69e68693 addi a3,a3,1694 # 800215b0 <log> + 80002f1a: a039 j 80002f28 <iget+0x40> + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 80002f1c: 02090963 beqz s2,80002f4e <iget+0x66> + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 80002f20: 08848493 addi s1,s1,136 + 80002f24: 02d48863 beq s1,a3,80002f54 <iget+0x6c> + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ + 80002f28: 449c lw a5,8(s1) + 80002f2a: fef059e3 blez a5,80002f1c <iget+0x34> + 80002f2e: 4098 lw a4,0(s1) + 80002f30: ff3716e3 bne a4,s3,80002f1c <iget+0x34> + 80002f34: 40d8 lw a4,4(s1) + 80002f36: ff4713e3 bne a4,s4,80002f1c <iget+0x34> + ip->ref++; + 80002f3a: 2785 addiw a5,a5,1 + 80002f3c: c49c sw a5,8(s1) + release(&itable.lock); + 80002f3e: 0001d517 auipc a0,0x1d + 80002f42: bca50513 addi a0,a0,-1078 # 8001fb08 <itable> + 80002f46: cebfd0ef jal ra,80000c30 <release> + return ip; + 80002f4a: 8926 mv s2,s1 + 80002f4c: a02d j 80002f76 <iget+0x8e> + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 80002f4e: fbe9 bnez a5,80002f20 <iget+0x38> + 80002f50: 8926 mv s2,s1 + 80002f52: b7f9 j 80002f20 <iget+0x38> + if(empty == 0) + 80002f54: 02090a63 beqz s2,80002f88 <iget+0xa0> + ip->dev = dev; + 80002f58: 01392023 sw s3,0(s2) + ip->inum = inum; + 80002f5c: 01492223 sw s4,4(s2) + ip->ref = 1; + 80002f60: 4785 li a5,1 + 80002f62: 00f92423 sw a5,8(s2) + ip->valid = 0; + 80002f66: 04092023 sw zero,64(s2) + release(&itable.lock); + 80002f6a: 0001d517 auipc a0,0x1d + 80002f6e: b9e50513 addi a0,a0,-1122 # 8001fb08 <itable> + 80002f72: cbffd0ef jal ra,80000c30 <release> +} + 80002f76: 854a mv a0,s2 + 80002f78: 70a2 ld ra,40(sp) + 80002f7a: 7402 ld s0,32(sp) + 80002f7c: 64e2 ld s1,24(sp) + 80002f7e: 6942 ld s2,16(sp) + 80002f80: 69a2 ld s3,8(sp) + 80002f82: 6a02 ld s4,0(sp) + 80002f84: 6145 addi sp,sp,48 + 80002f86: 8082 ret + panic("iget: no inodes"); + 80002f88: 00004517 auipc a0,0x4 + 80002f8c: 7c850513 addi a0,a0,1992 # 80007750 <syscall_name+0x138> + 80002f90: fc6fd0ef jal ra,80000756 <panic> + +0000000080002f94 <fsinit>: +fsinit(int dev) { + 80002f94: 7179 addi sp,sp,-48 + 80002f96: f406 sd ra,40(sp) + 80002f98: f022 sd s0,32(sp) + 80002f9a: ec26 sd s1,24(sp) + 80002f9c: e84a sd s2,16(sp) + 80002f9e: e44e sd s3,8(sp) + 80002fa0: 1800 addi s0,sp,48 + 80002fa2: 892a mv s2,a0 + bp = bread(dev, 1); + 80002fa4: 4585 li a1,1 + 80002fa6: b01ff0ef jal ra,80002aa6 <bread> + 80002faa: 84aa mv s1,a0 + memmove(sb, bp->data, sizeof(*sb)); + 80002fac: 0001d997 auipc s3,0x1d + 80002fb0: b3c98993 addi s3,s3,-1220 # 8001fae8 <sb> + 80002fb4: 02000613 li a2,32 + 80002fb8: 05850593 addi a1,a0,88 + 80002fbc: 854e mv a0,s3 + 80002fbe: d0bfd0ef jal ra,80000cc8 <memmove> + brelse(bp); + 80002fc2: 8526 mv a0,s1 + 80002fc4: bebff0ef jal ra,80002bae <brelse> + if(sb.magic != FSMAGIC) + 80002fc8: 0009a703 lw a4,0(s3) + 80002fcc: 102037b7 lui a5,0x10203 + 80002fd0: 04078793 addi a5,a5,64 # 10203040 <_entry-0x6fdfcfc0> + 80002fd4: 02f71063 bne a4,a5,80002ff4 <fsinit+0x60> + initlog(dev, &sb); + 80002fd8: 0001d597 auipc a1,0x1d + 80002fdc: b1058593 addi a1,a1,-1264 # 8001fae8 <sb> + 80002fe0: 854a mv a0,s2 + 80002fe2: 1e3000ef jal ra,800039c4 <initlog> +} + 80002fe6: 70a2 ld ra,40(sp) + 80002fe8: 7402 ld s0,32(sp) + 80002fea: 64e2 ld s1,24(sp) + 80002fec: 6942 ld s2,16(sp) + 80002fee: 69a2 ld s3,8(sp) + 80002ff0: 6145 addi sp,sp,48 + 80002ff2: 8082 ret + panic("invalid file system"); + 80002ff4: 00004517 auipc a0,0x4 + 80002ff8: 76c50513 addi a0,a0,1900 # 80007760 <syscall_name+0x148> + 80002ffc: f5afd0ef jal ra,80000756 <panic> + +0000000080003000 <iinit>: +{ + 80003000: 7179 addi sp,sp,-48 + 80003002: f406 sd ra,40(sp) + 80003004: f022 sd s0,32(sp) + 80003006: ec26 sd s1,24(sp) + 80003008: e84a sd s2,16(sp) + 8000300a: e44e sd s3,8(sp) + 8000300c: 1800 addi s0,sp,48 + initlock(&itable.lock, "itable"); + 8000300e: 00004597 auipc a1,0x4 + 80003012: 76a58593 addi a1,a1,1898 # 80007778 <syscall_name+0x160> + 80003016: 0001d517 auipc a0,0x1d + 8000301a: af250513 addi a0,a0,-1294 # 8001fb08 <itable> + 8000301e: afbfd0ef jal ra,80000b18 <initlock> + for(i = 0; i < NINODE; i++) { + 80003022: 0001d497 auipc s1,0x1d + 80003026: b0e48493 addi s1,s1,-1266 # 8001fb30 <itable+0x28> + 8000302a: 0001e997 auipc s3,0x1e + 8000302e: 59698993 addi s3,s3,1430 # 800215c0 <log+0x10> + initsleeplock(&itable.inode[i].lock, "inode"); + 80003032: 00004917 auipc s2,0x4 + 80003036: 74e90913 addi s2,s2,1870 # 80007780 <syscall_name+0x168> + 8000303a: 85ca mv a1,s2 + 8000303c: 8526 mv a0,s1 + 8000303e: 46b000ef jal ra,80003ca8 <initsleeplock> + for(i = 0; i < NINODE; i++) { + 80003042: 08848493 addi s1,s1,136 + 80003046: ff349ae3 bne s1,s3,8000303a <iinit+0x3a> +} + 8000304a: 70a2 ld ra,40(sp) + 8000304c: 7402 ld s0,32(sp) + 8000304e: 64e2 ld s1,24(sp) + 80003050: 6942 ld s2,16(sp) + 80003052: 69a2 ld s3,8(sp) + 80003054: 6145 addi sp,sp,48 + 80003056: 8082 ret + +0000000080003058 <ialloc>: +{ + 80003058: 715d addi sp,sp,-80 + 8000305a: e486 sd ra,72(sp) + 8000305c: e0a2 sd s0,64(sp) + 8000305e: fc26 sd s1,56(sp) + 80003060: f84a sd s2,48(sp) + 80003062: f44e sd s3,40(sp) + 80003064: f052 sd s4,32(sp) + 80003066: ec56 sd s5,24(sp) + 80003068: e85a sd s6,16(sp) + 8000306a: e45e sd s7,8(sp) + 8000306c: 0880 addi s0,sp,80 + for(inum = 1; inum < sb.ninodes; inum++){ + 8000306e: 0001d717 auipc a4,0x1d + 80003072: a8672703 lw a4,-1402(a4) # 8001faf4 <sb+0xc> + 80003076: 4785 li a5,1 + 80003078: 04e7f663 bgeu a5,a4,800030c4 <ialloc+0x6c> + 8000307c: 8aaa mv s5,a0 + 8000307e: 8bae mv s7,a1 + 80003080: 4485 li s1,1 + bp = bread(dev, IBLOCK(inum, sb)); + 80003082: 0001da17 auipc s4,0x1d + 80003086: a66a0a13 addi s4,s4,-1434 # 8001fae8 <sb> + 8000308a: 00048b1b sext.w s6,s1 + 8000308e: 0044d593 srli a1,s1,0x4 + 80003092: 018a2783 lw a5,24(s4) + 80003096: 9dbd addw a1,a1,a5 + 80003098: 8556 mv a0,s5 + 8000309a: a0dff0ef jal ra,80002aa6 <bread> + 8000309e: 892a mv s2,a0 + dip = (struct dinode*)bp->data + inum%IPB; + 800030a0: 05850993 addi s3,a0,88 + 800030a4: 00f4f793 andi a5,s1,15 + 800030a8: 079a slli a5,a5,0x6 + 800030aa: 99be add s3,s3,a5 + if(dip->type == 0){ // a free inode + 800030ac: 00099783 lh a5,0(s3) + 800030b0: cf85 beqz a5,800030e8 <ialloc+0x90> + brelse(bp); + 800030b2: afdff0ef jal ra,80002bae <brelse> + for(inum = 1; inum < sb.ninodes; inum++){ + 800030b6: 0485 addi s1,s1,1 + 800030b8: 00ca2703 lw a4,12(s4) + 800030bc: 0004879b sext.w a5,s1 + 800030c0: fce7e5e3 bltu a5,a4,8000308a <ialloc+0x32> + printf("ialloc: no inodes\n"); + 800030c4: 00004517 auipc a0,0x4 + 800030c8: 6c450513 addi a0,a0,1732 # 80007788 <syscall_name+0x170> + 800030cc: bd6fd0ef jal ra,800004a2 <printf> + return 0; + 800030d0: 4501 li a0,0 +} + 800030d2: 60a6 ld ra,72(sp) + 800030d4: 6406 ld s0,64(sp) + 800030d6: 74e2 ld s1,56(sp) + 800030d8: 7942 ld s2,48(sp) + 800030da: 79a2 ld s3,40(sp) + 800030dc: 7a02 ld s4,32(sp) + 800030de: 6ae2 ld s5,24(sp) + 800030e0: 6b42 ld s6,16(sp) + 800030e2: 6ba2 ld s7,8(sp) + 800030e4: 6161 addi sp,sp,80 + 800030e6: 8082 ret + memset(dip, 0, sizeof(*dip)); + 800030e8: 04000613 li a2,64 + 800030ec: 4581 li a1,0 + 800030ee: 854e mv a0,s3 + 800030f0: b7dfd0ef jal ra,80000c6c <memset> + dip->type = type; + 800030f4: 01799023 sh s7,0(s3) + log_write(bp); // mark it allocated on the disk + 800030f8: 854a mv a0,s2 + 800030fa: 2df000ef jal ra,80003bd8 <log_write> + brelse(bp); + 800030fe: 854a mv a0,s2 + 80003100: aafff0ef jal ra,80002bae <brelse> + return iget(dev, inum); + 80003104: 85da mv a1,s6 + 80003106: 8556 mv a0,s5 + 80003108: de1ff0ef jal ra,80002ee8 <iget> + 8000310c: b7d9 j 800030d2 <ialloc+0x7a> + +000000008000310e <iupdate>: +{ + 8000310e: 1101 addi sp,sp,-32 + 80003110: ec06 sd ra,24(sp) + 80003112: e822 sd s0,16(sp) + 80003114: e426 sd s1,8(sp) + 80003116: e04a sd s2,0(sp) + 80003118: 1000 addi s0,sp,32 + 8000311a: 84aa mv s1,a0 + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 8000311c: 415c lw a5,4(a0) + 8000311e: 0047d79b srliw a5,a5,0x4 + 80003122: 0001d597 auipc a1,0x1d + 80003126: 9de5a583 lw a1,-1570(a1) # 8001fb00 <sb+0x18> + 8000312a: 9dbd addw a1,a1,a5 + 8000312c: 4108 lw a0,0(a0) + 8000312e: 979ff0ef jal ra,80002aa6 <bread> + 80003132: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003134: 05850793 addi a5,a0,88 + 80003138: 40d8 lw a4,4(s1) + 8000313a: 8b3d andi a4,a4,15 + 8000313c: 071a slli a4,a4,0x6 + 8000313e: 97ba add a5,a5,a4 + dip->type = ip->type; + 80003140: 04449703 lh a4,68(s1) + 80003144: 00e79023 sh a4,0(a5) + dip->major = ip->major; + 80003148: 04649703 lh a4,70(s1) + 8000314c: 00e79123 sh a4,2(a5) + dip->minor = ip->minor; + 80003150: 04849703 lh a4,72(s1) + 80003154: 00e79223 sh a4,4(a5) + dip->nlink = ip->nlink; + 80003158: 04a49703 lh a4,74(s1) + 8000315c: 00e79323 sh a4,6(a5) + dip->size = ip->size; + 80003160: 44f8 lw a4,76(s1) + 80003162: c798 sw a4,8(a5) + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); + 80003164: 03400613 li a2,52 + 80003168: 05048593 addi a1,s1,80 + 8000316c: 00c78513 addi a0,a5,12 + 80003170: b59fd0ef jal ra,80000cc8 <memmove> + log_write(bp); + 80003174: 854a mv a0,s2 + 80003176: 263000ef jal ra,80003bd8 <log_write> + brelse(bp); + 8000317a: 854a mv a0,s2 + 8000317c: a33ff0ef jal ra,80002bae <brelse> +} + 80003180: 60e2 ld ra,24(sp) + 80003182: 6442 ld s0,16(sp) + 80003184: 64a2 ld s1,8(sp) + 80003186: 6902 ld s2,0(sp) + 80003188: 6105 addi sp,sp,32 + 8000318a: 8082 ret + +000000008000318c <idup>: +{ + 8000318c: 1101 addi sp,sp,-32 + 8000318e: ec06 sd ra,24(sp) + 80003190: e822 sd s0,16(sp) + 80003192: e426 sd s1,8(sp) + 80003194: 1000 addi s0,sp,32 + 80003196: 84aa mv s1,a0 + acquire(&itable.lock); + 80003198: 0001d517 auipc a0,0x1d + 8000319c: 97050513 addi a0,a0,-1680 # 8001fb08 <itable> + 800031a0: 9f9fd0ef jal ra,80000b98 <acquire> + ip->ref++; + 800031a4: 449c lw a5,8(s1) + 800031a6: 2785 addiw a5,a5,1 + 800031a8: c49c sw a5,8(s1) + release(&itable.lock); + 800031aa: 0001d517 auipc a0,0x1d + 800031ae: 95e50513 addi a0,a0,-1698 # 8001fb08 <itable> + 800031b2: a7ffd0ef jal ra,80000c30 <release> +} + 800031b6: 8526 mv a0,s1 + 800031b8: 60e2 ld ra,24(sp) + 800031ba: 6442 ld s0,16(sp) + 800031bc: 64a2 ld s1,8(sp) + 800031be: 6105 addi sp,sp,32 + 800031c0: 8082 ret + +00000000800031c2 <ilock>: +{ + 800031c2: 1101 addi sp,sp,-32 + 800031c4: ec06 sd ra,24(sp) + 800031c6: e822 sd s0,16(sp) + 800031c8: e426 sd s1,8(sp) + 800031ca: e04a sd s2,0(sp) + 800031cc: 1000 addi s0,sp,32 + if(ip == 0 || ip->ref < 1) + 800031ce: c105 beqz a0,800031ee <ilock+0x2c> + 800031d0: 84aa mv s1,a0 + 800031d2: 451c lw a5,8(a0) + 800031d4: 00f05d63 blez a5,800031ee <ilock+0x2c> + acquiresleep(&ip->lock); + 800031d8: 0541 addi a0,a0,16 + 800031da: 305000ef jal ra,80003cde <acquiresleep> + if(ip->valid == 0){ + 800031de: 40bc lw a5,64(s1) + 800031e0: cf89 beqz a5,800031fa <ilock+0x38> +} + 800031e2: 60e2 ld ra,24(sp) + 800031e4: 6442 ld s0,16(sp) + 800031e6: 64a2 ld s1,8(sp) + 800031e8: 6902 ld s2,0(sp) + 800031ea: 6105 addi sp,sp,32 + 800031ec: 8082 ret + panic("ilock"); + 800031ee: 00004517 auipc a0,0x4 + 800031f2: 5b250513 addi a0,a0,1458 # 800077a0 <syscall_name+0x188> + 800031f6: d60fd0ef jal ra,80000756 <panic> + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 800031fa: 40dc lw a5,4(s1) + 800031fc: 0047d79b srliw a5,a5,0x4 + 80003200: 0001d597 auipc a1,0x1d + 80003204: 9005a583 lw a1,-1792(a1) # 8001fb00 <sb+0x18> + 80003208: 9dbd addw a1,a1,a5 + 8000320a: 4088 lw a0,0(s1) + 8000320c: 89bff0ef jal ra,80002aa6 <bread> + 80003210: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003212: 05850593 addi a1,a0,88 + 80003216: 40dc lw a5,4(s1) + 80003218: 8bbd andi a5,a5,15 + 8000321a: 079a slli a5,a5,0x6 + 8000321c: 95be add a1,a1,a5 + ip->type = dip->type; + 8000321e: 00059783 lh a5,0(a1) + 80003222: 04f49223 sh a5,68(s1) + ip->major = dip->major; + 80003226: 00259783 lh a5,2(a1) + 8000322a: 04f49323 sh a5,70(s1) + ip->minor = dip->minor; + 8000322e: 00459783 lh a5,4(a1) + 80003232: 04f49423 sh a5,72(s1) + ip->nlink = dip->nlink; + 80003236: 00659783 lh a5,6(a1) + 8000323a: 04f49523 sh a5,74(s1) + ip->size = dip->size; + 8000323e: 459c lw a5,8(a1) + 80003240: c4fc sw a5,76(s1) + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); + 80003242: 03400613 li a2,52 + 80003246: 05b1 addi a1,a1,12 + 80003248: 05048513 addi a0,s1,80 + 8000324c: a7dfd0ef jal ra,80000cc8 <memmove> + brelse(bp); + 80003250: 854a mv a0,s2 + 80003252: 95dff0ef jal ra,80002bae <brelse> + ip->valid = 1; + 80003256: 4785 li a5,1 + 80003258: c0bc sw a5,64(s1) + if(ip->type == 0) + 8000325a: 04449783 lh a5,68(s1) + 8000325e: f3d1 bnez a5,800031e2 <ilock+0x20> + panic("ilock: no type"); + 80003260: 00004517 auipc a0,0x4 + 80003264: 54850513 addi a0,a0,1352 # 800077a8 <syscall_name+0x190> + 80003268: ceefd0ef jal ra,80000756 <panic> + +000000008000326c <iunlock>: +{ + 8000326c: 1101 addi sp,sp,-32 + 8000326e: ec06 sd ra,24(sp) + 80003270: e822 sd s0,16(sp) + 80003272: e426 sd s1,8(sp) + 80003274: e04a sd s2,0(sp) + 80003276: 1000 addi s0,sp,32 + if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) + 80003278: c505 beqz a0,800032a0 <iunlock+0x34> + 8000327a: 84aa mv s1,a0 + 8000327c: 01050913 addi s2,a0,16 + 80003280: 854a mv a0,s2 + 80003282: 2db000ef jal ra,80003d5c <holdingsleep> + 80003286: cd09 beqz a0,800032a0 <iunlock+0x34> + 80003288: 449c lw a5,8(s1) + 8000328a: 00f05b63 blez a5,800032a0 <iunlock+0x34> + releasesleep(&ip->lock); + 8000328e: 854a mv a0,s2 + 80003290: 295000ef jal ra,80003d24 <releasesleep> +} + 80003294: 60e2 ld ra,24(sp) + 80003296: 6442 ld s0,16(sp) + 80003298: 64a2 ld s1,8(sp) + 8000329a: 6902 ld s2,0(sp) + 8000329c: 6105 addi sp,sp,32 + 8000329e: 8082 ret + panic("iunlock"); + 800032a0: 00004517 auipc a0,0x4 + 800032a4: 51850513 addi a0,a0,1304 # 800077b8 <syscall_name+0x1a0> + 800032a8: caefd0ef jal ra,80000756 <panic> + +00000000800032ac <itrunc>: + +// Truncate inode (discard contents). +// Caller must hold ip->lock. +void +itrunc(struct inode *ip) +{ + 800032ac: 7179 addi sp,sp,-48 + 800032ae: f406 sd ra,40(sp) + 800032b0: f022 sd s0,32(sp) + 800032b2: ec26 sd s1,24(sp) + 800032b4: e84a sd s2,16(sp) + 800032b6: e44e sd s3,8(sp) + 800032b8: e052 sd s4,0(sp) + 800032ba: 1800 addi s0,sp,48 + 800032bc: 89aa mv s3,a0 + int i, j; + struct buf *bp; + uint *a; + + for(i = 0; i < NDIRECT; i++){ + 800032be: 05050493 addi s1,a0,80 + 800032c2: 08050913 addi s2,a0,128 + 800032c6: a021 j 800032ce <itrunc+0x22> + 800032c8: 0491 addi s1,s1,4 + 800032ca: 01248b63 beq s1,s2,800032e0 <itrunc+0x34> + if(ip->addrs[i]){ + 800032ce: 408c lw a1,0(s1) + 800032d0: dde5 beqz a1,800032c8 <itrunc+0x1c> + bfree(ip->dev, ip->addrs[i]); + 800032d2: 0009a503 lw a0,0(s3) + 800032d6: 9cbff0ef jal ra,80002ca0 <bfree> + ip->addrs[i] = 0; + 800032da: 0004a023 sw zero,0(s1) + 800032de: b7ed j 800032c8 <itrunc+0x1c> + } + } + + if(ip->addrs[NDIRECT]){ + 800032e0: 0809a583 lw a1,128(s3) + 800032e4: ed91 bnez a1,80003300 <itrunc+0x54> + brelse(bp); + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; + 800032e6: 0409a623 sw zero,76(s3) + iupdate(ip); + 800032ea: 854e mv a0,s3 + 800032ec: e23ff0ef jal ra,8000310e <iupdate> +} + 800032f0: 70a2 ld ra,40(sp) + 800032f2: 7402 ld s0,32(sp) + 800032f4: 64e2 ld s1,24(sp) + 800032f6: 6942 ld s2,16(sp) + 800032f8: 69a2 ld s3,8(sp) + 800032fa: 6a02 ld s4,0(sp) + 800032fc: 6145 addi sp,sp,48 + 800032fe: 8082 ret + bp = bread(ip->dev, ip->addrs[NDIRECT]); + 80003300: 0009a503 lw a0,0(s3) + 80003304: fa2ff0ef jal ra,80002aa6 <bread> + 80003308: 8a2a mv s4,a0 + for(j = 0; j < NINDIRECT; j++){ + 8000330a: 05850493 addi s1,a0,88 + 8000330e: 45850913 addi s2,a0,1112 + 80003312: a021 j 8000331a <itrunc+0x6e> + 80003314: 0491 addi s1,s1,4 + 80003316: 01248963 beq s1,s2,80003328 <itrunc+0x7c> + if(a[j]) + 8000331a: 408c lw a1,0(s1) + 8000331c: dde5 beqz a1,80003314 <itrunc+0x68> + bfree(ip->dev, a[j]); + 8000331e: 0009a503 lw a0,0(s3) + 80003322: 97fff0ef jal ra,80002ca0 <bfree> + 80003326: b7fd j 80003314 <itrunc+0x68> + brelse(bp); + 80003328: 8552 mv a0,s4 + 8000332a: 885ff0ef jal ra,80002bae <brelse> + bfree(ip->dev, ip->addrs[NDIRECT]); + 8000332e: 0809a583 lw a1,128(s3) + 80003332: 0009a503 lw a0,0(s3) + 80003336: 96bff0ef jal ra,80002ca0 <bfree> + ip->addrs[NDIRECT] = 0; + 8000333a: 0809a023 sw zero,128(s3) + 8000333e: b765 j 800032e6 <itrunc+0x3a> + +0000000080003340 <iput>: +{ + 80003340: 1101 addi sp,sp,-32 + 80003342: ec06 sd ra,24(sp) + 80003344: e822 sd s0,16(sp) + 80003346: e426 sd s1,8(sp) + 80003348: e04a sd s2,0(sp) + 8000334a: 1000 addi s0,sp,32 + 8000334c: 84aa mv s1,a0 + acquire(&itable.lock); + 8000334e: 0001c517 auipc a0,0x1c + 80003352: 7ba50513 addi a0,a0,1978 # 8001fb08 <itable> + 80003356: 843fd0ef jal ra,80000b98 <acquire> + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 8000335a: 4498 lw a4,8(s1) + 8000335c: 4785 li a5,1 + 8000335e: 02f70163 beq a4,a5,80003380 <iput+0x40> + ip->ref--; + 80003362: 449c lw a5,8(s1) + 80003364: 37fd addiw a5,a5,-1 + 80003366: c49c sw a5,8(s1) + release(&itable.lock); + 80003368: 0001c517 auipc a0,0x1c + 8000336c: 7a050513 addi a0,a0,1952 # 8001fb08 <itable> + 80003370: 8c1fd0ef jal ra,80000c30 <release> +} + 80003374: 60e2 ld ra,24(sp) + 80003376: 6442 ld s0,16(sp) + 80003378: 64a2 ld s1,8(sp) + 8000337a: 6902 ld s2,0(sp) + 8000337c: 6105 addi sp,sp,32 + 8000337e: 8082 ret + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 80003380: 40bc lw a5,64(s1) + 80003382: d3e5 beqz a5,80003362 <iput+0x22> + 80003384: 04a49783 lh a5,74(s1) + 80003388: ffe9 bnez a5,80003362 <iput+0x22> + acquiresleep(&ip->lock); + 8000338a: 01048913 addi s2,s1,16 + 8000338e: 854a mv a0,s2 + 80003390: 14f000ef jal ra,80003cde <acquiresleep> + release(&itable.lock); + 80003394: 0001c517 auipc a0,0x1c + 80003398: 77450513 addi a0,a0,1908 # 8001fb08 <itable> + 8000339c: 895fd0ef jal ra,80000c30 <release> + itrunc(ip); + 800033a0: 8526 mv a0,s1 + 800033a2: f0bff0ef jal ra,800032ac <itrunc> + ip->type = 0; + 800033a6: 04049223 sh zero,68(s1) + iupdate(ip); + 800033aa: 8526 mv a0,s1 + 800033ac: d63ff0ef jal ra,8000310e <iupdate> + ip->valid = 0; + 800033b0: 0404a023 sw zero,64(s1) + releasesleep(&ip->lock); + 800033b4: 854a mv a0,s2 + 800033b6: 16f000ef jal ra,80003d24 <releasesleep> + acquire(&itable.lock); + 800033ba: 0001c517 auipc a0,0x1c + 800033be: 74e50513 addi a0,a0,1870 # 8001fb08 <itable> + 800033c2: fd6fd0ef jal ra,80000b98 <acquire> + 800033c6: bf71 j 80003362 <iput+0x22> + +00000000800033c8 <iunlockput>: +{ + 800033c8: 1101 addi sp,sp,-32 + 800033ca: ec06 sd ra,24(sp) + 800033cc: e822 sd s0,16(sp) + 800033ce: e426 sd s1,8(sp) + 800033d0: 1000 addi s0,sp,32 + 800033d2: 84aa mv s1,a0 + iunlock(ip); + 800033d4: e99ff0ef jal ra,8000326c <iunlock> + iput(ip); + 800033d8: 8526 mv a0,s1 + 800033da: f67ff0ef jal ra,80003340 <iput> +} + 800033de: 60e2 ld ra,24(sp) + 800033e0: 6442 ld s0,16(sp) + 800033e2: 64a2 ld s1,8(sp) + 800033e4: 6105 addi sp,sp,32 + 800033e6: 8082 ret + +00000000800033e8 <stati>: + +// Copy stat information from inode. +// Caller must hold ip->lock. +void +stati(struct inode *ip, struct stat *st) +{ + 800033e8: 1141 addi sp,sp,-16 + 800033ea: e422 sd s0,8(sp) + 800033ec: 0800 addi s0,sp,16 + st->dev = ip->dev; + 800033ee: 411c lw a5,0(a0) + 800033f0: c19c sw a5,0(a1) + st->ino = ip->inum; + 800033f2: 415c lw a5,4(a0) + 800033f4: c1dc sw a5,4(a1) + st->type = ip->type; + 800033f6: 04451783 lh a5,68(a0) + 800033fa: 00f59423 sh a5,8(a1) + st->nlink = ip->nlink; + 800033fe: 04a51783 lh a5,74(a0) + 80003402: 00f59523 sh a5,10(a1) + st->size = ip->size; + 80003406: 04c56783 lwu a5,76(a0) + 8000340a: e99c sd a5,16(a1) +} + 8000340c: 6422 ld s0,8(sp) + 8000340e: 0141 addi sp,sp,16 + 80003410: 8082 ret + +0000000080003412 <readi>: +readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 80003412: 457c lw a5,76(a0) + 80003414: 0cd7ef63 bltu a5,a3,800034f2 <readi+0xe0> +{ + 80003418: 7159 addi sp,sp,-112 + 8000341a: f486 sd ra,104(sp) + 8000341c: f0a2 sd s0,96(sp) + 8000341e: eca6 sd s1,88(sp) + 80003420: e8ca sd s2,80(sp) + 80003422: e4ce sd s3,72(sp) + 80003424: e0d2 sd s4,64(sp) + 80003426: fc56 sd s5,56(sp) + 80003428: f85a sd s6,48(sp) + 8000342a: f45e sd s7,40(sp) + 8000342c: f062 sd s8,32(sp) + 8000342e: ec66 sd s9,24(sp) + 80003430: e86a sd s10,16(sp) + 80003432: e46e sd s11,8(sp) + 80003434: 1880 addi s0,sp,112 + 80003436: 8b2a mv s6,a0 + 80003438: 8bae mv s7,a1 + 8000343a: 8a32 mv s4,a2 + 8000343c: 84b6 mv s1,a3 + 8000343e: 8aba mv s5,a4 + if(off > ip->size || off + n < off) + 80003440: 9f35 addw a4,a4,a3 + return 0; + 80003442: 4501 li a0,0 + if(off > ip->size || off + n < off) + 80003444: 08d76663 bltu a4,a3,800034d0 <readi+0xbe> + if(off + n > ip->size) + 80003448: 00e7f463 bgeu a5,a4,80003450 <readi+0x3e> + n = ip->size - off; + 8000344c: 40d78abb subw s5,a5,a3 + + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ + 80003450: 080a8f63 beqz s5,800034ee <readi+0xdc> + 80003454: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 80003456: 40000c93 li s9,1024 + if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) { + 8000345a: 5c7d li s8,-1 + 8000345c: a80d j 8000348e <readi+0x7c> + 8000345e: 020d1d93 slli s11,s10,0x20 + 80003462: 020ddd93 srli s11,s11,0x20 + 80003466: 05890613 addi a2,s2,88 + 8000346a: 86ee mv a3,s11 + 8000346c: 963a add a2,a2,a4 + 8000346e: 85d2 mv a1,s4 + 80003470: 855e mv a0,s7 + 80003472: d07fe0ef jal ra,80002178 <either_copyout> + 80003476: 05850763 beq a0,s8,800034c4 <readi+0xb2> + brelse(bp); + tot = -1; + break; + } + brelse(bp); + 8000347a: 854a mv a0,s2 + 8000347c: f32ff0ef jal ra,80002bae <brelse> + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ + 80003480: 013d09bb addw s3,s10,s3 + 80003484: 009d04bb addw s1,s10,s1 + 80003488: 9a6e add s4,s4,s11 + 8000348a: 0559f163 bgeu s3,s5,800034cc <readi+0xba> + uint addr = bmap(ip, off/BSIZE); + 8000348e: 00a4d59b srliw a1,s1,0xa + 80003492: 855a mv a0,s6 + 80003494: 987ff0ef jal ra,80002e1a <bmap> + 80003498: 0005059b sext.w a1,a0 + if(addr == 0) + 8000349c: c985 beqz a1,800034cc <readi+0xba> + bp = bread(ip->dev, addr); + 8000349e: 000b2503 lw a0,0(s6) + 800034a2: e04ff0ef jal ra,80002aa6 <bread> + 800034a6: 892a mv s2,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 800034a8: 3ff4f713 andi a4,s1,1023 + 800034ac: 40ec87bb subw a5,s9,a4 + 800034b0: 413a86bb subw a3,s5,s3 + 800034b4: 8d3e mv s10,a5 + 800034b6: 2781 sext.w a5,a5 + 800034b8: 0006861b sext.w a2,a3 + 800034bc: faf671e3 bgeu a2,a5,8000345e <readi+0x4c> + 800034c0: 8d36 mv s10,a3 + 800034c2: bf71 j 8000345e <readi+0x4c> + brelse(bp); + 800034c4: 854a mv a0,s2 + 800034c6: ee8ff0ef jal ra,80002bae <brelse> + tot = -1; + 800034ca: 59fd li s3,-1 + } + return tot; + 800034cc: 0009851b sext.w a0,s3 +} + 800034d0: 70a6 ld ra,104(sp) + 800034d2: 7406 ld s0,96(sp) + 800034d4: 64e6 ld s1,88(sp) + 800034d6: 6946 ld s2,80(sp) + 800034d8: 69a6 ld s3,72(sp) + 800034da: 6a06 ld s4,64(sp) + 800034dc: 7ae2 ld s5,56(sp) + 800034de: 7b42 ld s6,48(sp) + 800034e0: 7ba2 ld s7,40(sp) + 800034e2: 7c02 ld s8,32(sp) + 800034e4: 6ce2 ld s9,24(sp) + 800034e6: 6d42 ld s10,16(sp) + 800034e8: 6da2 ld s11,8(sp) + 800034ea: 6165 addi sp,sp,112 + 800034ec: 8082 ret + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ + 800034ee: 89d6 mv s3,s5 + 800034f0: bff1 j 800034cc <readi+0xba> + return 0; + 800034f2: 4501 li a0,0 +} + 800034f4: 8082 ret + +00000000800034f6 <writei>: +writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 800034f6: 457c lw a5,76(a0) + 800034f8: 0ed7ea63 bltu a5,a3,800035ec <writei+0xf6> +{ + 800034fc: 7159 addi sp,sp,-112 + 800034fe: f486 sd ra,104(sp) + 80003500: f0a2 sd s0,96(sp) + 80003502: eca6 sd s1,88(sp) + 80003504: e8ca sd s2,80(sp) + 80003506: e4ce sd s3,72(sp) + 80003508: e0d2 sd s4,64(sp) + 8000350a: fc56 sd s5,56(sp) + 8000350c: f85a sd s6,48(sp) + 8000350e: f45e sd s7,40(sp) + 80003510: f062 sd s8,32(sp) + 80003512: ec66 sd s9,24(sp) + 80003514: e86a sd s10,16(sp) + 80003516: e46e sd s11,8(sp) + 80003518: 1880 addi s0,sp,112 + 8000351a: 8aaa mv s5,a0 + 8000351c: 8bae mv s7,a1 + 8000351e: 8a32 mv s4,a2 + 80003520: 8936 mv s2,a3 + 80003522: 8b3a mv s6,a4 + if(off > ip->size || off + n < off) + 80003524: 00e687bb addw a5,a3,a4 + 80003528: 0cd7e463 bltu a5,a3,800035f0 <writei+0xfa> + return -1; + if(off + n > MAXFILE*BSIZE) + 8000352c: 00043737 lui a4,0x43 + 80003530: 0cf76263 bltu a4,a5,800035f4 <writei+0xfe> + return -1; + + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ + 80003534: 0a0b0a63 beqz s6,800035e8 <writei+0xf2> + 80003538: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 8000353a: 40000c93 li s9,1024 + if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { + 8000353e: 5c7d li s8,-1 + 80003540: a825 j 80003578 <writei+0x82> + 80003542: 020d1d93 slli s11,s10,0x20 + 80003546: 020ddd93 srli s11,s11,0x20 + 8000354a: 05848513 addi a0,s1,88 + 8000354e: 86ee mv a3,s11 + 80003550: 8652 mv a2,s4 + 80003552: 85de mv a1,s7 + 80003554: 953a add a0,a0,a4 + 80003556: c6dfe0ef jal ra,800021c2 <either_copyin> + 8000355a: 05850a63 beq a0,s8,800035ae <writei+0xb8> + brelse(bp); + break; + } + log_write(bp); + 8000355e: 8526 mv a0,s1 + 80003560: 678000ef jal ra,80003bd8 <log_write> + brelse(bp); + 80003564: 8526 mv a0,s1 + 80003566: e48ff0ef jal ra,80002bae <brelse> + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ + 8000356a: 013d09bb addw s3,s10,s3 + 8000356e: 012d093b addw s2,s10,s2 + 80003572: 9a6e add s4,s4,s11 + 80003574: 0569f063 bgeu s3,s6,800035b4 <writei+0xbe> + uint addr = bmap(ip, off/BSIZE); + 80003578: 00a9559b srliw a1,s2,0xa + 8000357c: 8556 mv a0,s5 + 8000357e: 89dff0ef jal ra,80002e1a <bmap> + 80003582: 0005059b sext.w a1,a0 + if(addr == 0) + 80003586: c59d beqz a1,800035b4 <writei+0xbe> + bp = bread(ip->dev, addr); + 80003588: 000aa503 lw a0,0(s5) + 8000358c: d1aff0ef jal ra,80002aa6 <bread> + 80003590: 84aa mv s1,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 80003592: 3ff97713 andi a4,s2,1023 + 80003596: 40ec87bb subw a5,s9,a4 + 8000359a: 413b06bb subw a3,s6,s3 + 8000359e: 8d3e mv s10,a5 + 800035a0: 2781 sext.w a5,a5 + 800035a2: 0006861b sext.w a2,a3 + 800035a6: f8f67ee3 bgeu a2,a5,80003542 <writei+0x4c> + 800035aa: 8d36 mv s10,a3 + 800035ac: bf59 j 80003542 <writei+0x4c> + brelse(bp); + 800035ae: 8526 mv a0,s1 + 800035b0: dfeff0ef jal ra,80002bae <brelse> + } + + if(off > ip->size) + 800035b4: 04caa783 lw a5,76(s5) + 800035b8: 0127f463 bgeu a5,s2,800035c0 <writei+0xca> + ip->size = off; + 800035bc: 052aa623 sw s2,76(s5) + + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); + 800035c0: 8556 mv a0,s5 + 800035c2: b4dff0ef jal ra,8000310e <iupdate> + + return tot; + 800035c6: 0009851b sext.w a0,s3 +} + 800035ca: 70a6 ld ra,104(sp) + 800035cc: 7406 ld s0,96(sp) + 800035ce: 64e6 ld s1,88(sp) + 800035d0: 6946 ld s2,80(sp) + 800035d2: 69a6 ld s3,72(sp) + 800035d4: 6a06 ld s4,64(sp) + 800035d6: 7ae2 ld s5,56(sp) + 800035d8: 7b42 ld s6,48(sp) + 800035da: 7ba2 ld s7,40(sp) + 800035dc: 7c02 ld s8,32(sp) + 800035de: 6ce2 ld s9,24(sp) + 800035e0: 6d42 ld s10,16(sp) + 800035e2: 6da2 ld s11,8(sp) + 800035e4: 6165 addi sp,sp,112 + 800035e6: 8082 ret + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ + 800035e8: 89da mv s3,s6 + 800035ea: bfd9 j 800035c0 <writei+0xca> + return -1; + 800035ec: 557d li a0,-1 +} + 800035ee: 8082 ret + return -1; + 800035f0: 557d li a0,-1 + 800035f2: bfe1 j 800035ca <writei+0xd4> + return -1; + 800035f4: 557d li a0,-1 + 800035f6: bfd1 j 800035ca <writei+0xd4> + +00000000800035f8 <namecmp>: + +// Directories + +int +namecmp(const char *s, const char *t) +{ + 800035f8: 1141 addi sp,sp,-16 + 800035fa: e406 sd ra,8(sp) + 800035fc: e022 sd s0,0(sp) + 800035fe: 0800 addi s0,sp,16 + return strncmp(s, t, DIRSIZ); + 80003600: 4639 li a2,14 + 80003602: f36fd0ef jal ra,80000d38 <strncmp> +} + 80003606: 60a2 ld ra,8(sp) + 80003608: 6402 ld s0,0(sp) + 8000360a: 0141 addi sp,sp,16 + 8000360c: 8082 ret + +000000008000360e <dirlookup>: + +// 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) +{ + 8000360e: 7139 addi sp,sp,-64 + 80003610: fc06 sd ra,56(sp) + 80003612: f822 sd s0,48(sp) + 80003614: f426 sd s1,40(sp) + 80003616: f04a sd s2,32(sp) + 80003618: ec4e sd s3,24(sp) + 8000361a: e852 sd s4,16(sp) + 8000361c: 0080 addi s0,sp,64 + uint off, inum; + struct dirent de; + + if(dp->type != T_DIR) + 8000361e: 04451703 lh a4,68(a0) + 80003622: 4785 li a5,1 + 80003624: 00f71a63 bne a4,a5,80003638 <dirlookup+0x2a> + 80003628: 892a mv s2,a0 + 8000362a: 89ae mv s3,a1 + 8000362c: 8a32 mv s4,a2 + panic("dirlookup not DIR"); + + for(off = 0; off < dp->size; off += sizeof(de)){ + 8000362e: 457c lw a5,76(a0) + 80003630: 4481 li s1,0 + inum = de.inum; + return iget(dp->dev, inum); + } + } + + return 0; + 80003632: 4501 li a0,0 + for(off = 0; off < dp->size; off += sizeof(de)){ + 80003634: e39d bnez a5,8000365a <dirlookup+0x4c> + 80003636: a095 j 8000369a <dirlookup+0x8c> + panic("dirlookup not DIR"); + 80003638: 00004517 auipc a0,0x4 + 8000363c: 18850513 addi a0,a0,392 # 800077c0 <syscall_name+0x1a8> + 80003640: 916fd0ef jal ra,80000756 <panic> + panic("dirlookup read"); + 80003644: 00004517 auipc a0,0x4 + 80003648: 19450513 addi a0,a0,404 # 800077d8 <syscall_name+0x1c0> + 8000364c: 90afd0ef jal ra,80000756 <panic> + for(off = 0; off < dp->size; off += sizeof(de)){ + 80003650: 24c1 addiw s1,s1,16 + 80003652: 04c92783 lw a5,76(s2) + 80003656: 04f4f163 bgeu s1,a5,80003698 <dirlookup+0x8a> + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 8000365a: 4741 li a4,16 + 8000365c: 86a6 mv a3,s1 + 8000365e: fc040613 addi a2,s0,-64 + 80003662: 4581 li a1,0 + 80003664: 854a mv a0,s2 + 80003666: dadff0ef jal ra,80003412 <readi> + 8000366a: 47c1 li a5,16 + 8000366c: fcf51ce3 bne a0,a5,80003644 <dirlookup+0x36> + if(de.inum == 0) + 80003670: fc045783 lhu a5,-64(s0) + 80003674: dff1 beqz a5,80003650 <dirlookup+0x42> + if(namecmp(name, de.name) == 0){ + 80003676: fc240593 addi a1,s0,-62 + 8000367a: 854e mv a0,s3 + 8000367c: f7dff0ef jal ra,800035f8 <namecmp> + 80003680: f961 bnez a0,80003650 <dirlookup+0x42> + if(poff) + 80003682: 000a0463 beqz s4,8000368a <dirlookup+0x7c> + *poff = off; + 80003686: 009a2023 sw s1,0(s4) + return iget(dp->dev, inum); + 8000368a: fc045583 lhu a1,-64(s0) + 8000368e: 00092503 lw a0,0(s2) + 80003692: 857ff0ef jal ra,80002ee8 <iget> + 80003696: a011 j 8000369a <dirlookup+0x8c> + return 0; + 80003698: 4501 li a0,0 +} + 8000369a: 70e2 ld ra,56(sp) + 8000369c: 7442 ld s0,48(sp) + 8000369e: 74a2 ld s1,40(sp) + 800036a0: 7902 ld s2,32(sp) + 800036a2: 69e2 ld s3,24(sp) + 800036a4: 6a42 ld s4,16(sp) + 800036a6: 6121 addi sp,sp,64 + 800036a8: 8082 ret + +00000000800036aa <namex>: +// 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) +{ + 800036aa: 711d addi sp,sp,-96 + 800036ac: ec86 sd ra,88(sp) + 800036ae: e8a2 sd s0,80(sp) + 800036b0: e4a6 sd s1,72(sp) + 800036b2: e0ca sd s2,64(sp) + 800036b4: fc4e sd s3,56(sp) + 800036b6: f852 sd s4,48(sp) + 800036b8: f456 sd s5,40(sp) + 800036ba: f05a sd s6,32(sp) + 800036bc: ec5e sd s7,24(sp) + 800036be: e862 sd s8,16(sp) + 800036c0: e466 sd s9,8(sp) + 800036c2: e06a sd s10,0(sp) + 800036c4: 1080 addi s0,sp,96 + 800036c6: 84aa mv s1,a0 + 800036c8: 8b2e mv s6,a1 + 800036ca: 8ab2 mv s5,a2 + struct inode *ip, *next; + + if(*path == '/') + 800036cc: 00054703 lbu a4,0(a0) + 800036d0: 02f00793 li a5,47 + 800036d4: 00f70f63 beq a4,a5,800036f2 <namex+0x48> + ip = iget(ROOTDEV, ROOTINO); + else + ip = idup(myproc()->cwd); + 800036d8: 952fe0ef jal ra,8000182a <myproc> + 800036dc: 15053503 ld a0,336(a0) + 800036e0: aadff0ef jal ra,8000318c <idup> + 800036e4: 8a2a mv s4,a0 + while(*path == '/') + 800036e6: 02f00913 li s2,47 + if(len >= DIRSIZ) + 800036ea: 4cb5 li s9,13 + len = path - s; + 800036ec: 4b81 li s7,0 + + while((path = skipelem(path, name)) != 0){ + ilock(ip); + if(ip->type != T_DIR){ + 800036ee: 4c05 li s8,1 + 800036f0: a879 j 8000378e <namex+0xe4> + ip = iget(ROOTDEV, ROOTINO); + 800036f2: 4585 li a1,1 + 800036f4: 4505 li a0,1 + 800036f6: ff2ff0ef jal ra,80002ee8 <iget> + 800036fa: 8a2a mv s4,a0 + 800036fc: b7ed j 800036e6 <namex+0x3c> + iunlockput(ip); + 800036fe: 8552 mv a0,s4 + 80003700: cc9ff0ef jal ra,800033c8 <iunlockput> + return 0; + 80003704: 4a01 li s4,0 + if(nameiparent){ + iput(ip); + return 0; + } + return ip; +} + 80003706: 8552 mv a0,s4 + 80003708: 60e6 ld ra,88(sp) + 8000370a: 6446 ld s0,80(sp) + 8000370c: 64a6 ld s1,72(sp) + 8000370e: 6906 ld s2,64(sp) + 80003710: 79e2 ld s3,56(sp) + 80003712: 7a42 ld s4,48(sp) + 80003714: 7aa2 ld s5,40(sp) + 80003716: 7b02 ld s6,32(sp) + 80003718: 6be2 ld s7,24(sp) + 8000371a: 6c42 ld s8,16(sp) + 8000371c: 6ca2 ld s9,8(sp) + 8000371e: 6d02 ld s10,0(sp) + 80003720: 6125 addi sp,sp,96 + 80003722: 8082 ret + iunlock(ip); + 80003724: 8552 mv a0,s4 + 80003726: b47ff0ef jal ra,8000326c <iunlock> + return ip; + 8000372a: bff1 j 80003706 <namex+0x5c> + iunlockput(ip); + 8000372c: 8552 mv a0,s4 + 8000372e: c9bff0ef jal ra,800033c8 <iunlockput> + return 0; + 80003732: 8a4e mv s4,s3 + 80003734: bfc9 j 80003706 <namex+0x5c> + len = path - s; + 80003736: 40998633 sub a2,s3,s1 + 8000373a: 00060d1b sext.w s10,a2 + if(len >= DIRSIZ) + 8000373e: 09acd063 bge s9,s10,800037be <namex+0x114> + memmove(name, s, DIRSIZ); + 80003742: 4639 li a2,14 + 80003744: 85a6 mv a1,s1 + 80003746: 8556 mv a0,s5 + 80003748: d80fd0ef jal ra,80000cc8 <memmove> + 8000374c: 84ce mv s1,s3 + while(*path == '/') + 8000374e: 0004c783 lbu a5,0(s1) + 80003752: 01279763 bne a5,s2,80003760 <namex+0xb6> + path++; + 80003756: 0485 addi s1,s1,1 + while(*path == '/') + 80003758: 0004c783 lbu a5,0(s1) + 8000375c: ff278de3 beq a5,s2,80003756 <namex+0xac> + ilock(ip); + 80003760: 8552 mv a0,s4 + 80003762: a61ff0ef jal ra,800031c2 <ilock> + if(ip->type != T_DIR){ + 80003766: 044a1783 lh a5,68(s4) + 8000376a: f9879ae3 bne a5,s8,800036fe <namex+0x54> + if(nameiparent && *path == '\0'){ + 8000376e: 000b0563 beqz s6,80003778 <namex+0xce> + 80003772: 0004c783 lbu a5,0(s1) + 80003776: d7dd beqz a5,80003724 <namex+0x7a> + if((next = dirlookup(ip, name, 0)) == 0){ + 80003778: 865e mv a2,s7 + 8000377a: 85d6 mv a1,s5 + 8000377c: 8552 mv a0,s4 + 8000377e: e91ff0ef jal ra,8000360e <dirlookup> + 80003782: 89aa mv s3,a0 + 80003784: d545 beqz a0,8000372c <namex+0x82> + iunlockput(ip); + 80003786: 8552 mv a0,s4 + 80003788: c41ff0ef jal ra,800033c8 <iunlockput> + ip = next; + 8000378c: 8a4e mv s4,s3 + while(*path == '/') + 8000378e: 0004c783 lbu a5,0(s1) + 80003792: 01279763 bne a5,s2,800037a0 <namex+0xf6> + path++; + 80003796: 0485 addi s1,s1,1 + while(*path == '/') + 80003798: 0004c783 lbu a5,0(s1) + 8000379c: ff278de3 beq a5,s2,80003796 <namex+0xec> + if(*path == 0) + 800037a0: cb8d beqz a5,800037d2 <namex+0x128> + while(*path != '/' && *path != 0) + 800037a2: 0004c783 lbu a5,0(s1) + 800037a6: 89a6 mv s3,s1 + len = path - s; + 800037a8: 8d5e mv s10,s7 + 800037aa: 865e mv a2,s7 + while(*path != '/' && *path != 0) + 800037ac: 01278963 beq a5,s2,800037be <namex+0x114> + 800037b0: d3d9 beqz a5,80003736 <namex+0x8c> + path++; + 800037b2: 0985 addi s3,s3,1 + while(*path != '/' && *path != 0) + 800037b4: 0009c783 lbu a5,0(s3) + 800037b8: ff279ce3 bne a5,s2,800037b0 <namex+0x106> + 800037bc: bfad j 80003736 <namex+0x8c> + memmove(name, s, len); + 800037be: 2601 sext.w a2,a2 + 800037c0: 85a6 mv a1,s1 + 800037c2: 8556 mv a0,s5 + 800037c4: d04fd0ef jal ra,80000cc8 <memmove> + name[len] = 0; + 800037c8: 9d56 add s10,s10,s5 + 800037ca: 000d0023 sb zero,0(s10) # 1000 <_entry-0x7ffff000> + 800037ce: 84ce mv s1,s3 + 800037d0: bfbd j 8000374e <namex+0xa4> + if(nameiparent){ + 800037d2: f20b0ae3 beqz s6,80003706 <namex+0x5c> + iput(ip); + 800037d6: 8552 mv a0,s4 + 800037d8: b69ff0ef jal ra,80003340 <iput> + return 0; + 800037dc: 4a01 li s4,0 + 800037de: b725 j 80003706 <namex+0x5c> + +00000000800037e0 <dirlink>: +{ + 800037e0: 7139 addi sp,sp,-64 + 800037e2: fc06 sd ra,56(sp) + 800037e4: f822 sd s0,48(sp) + 800037e6: f426 sd s1,40(sp) + 800037e8: f04a sd s2,32(sp) + 800037ea: ec4e sd s3,24(sp) + 800037ec: e852 sd s4,16(sp) + 800037ee: 0080 addi s0,sp,64 + 800037f0: 892a mv s2,a0 + 800037f2: 8a2e mv s4,a1 + 800037f4: 89b2 mv s3,a2 + if((ip = dirlookup(dp, name, 0)) != 0){ + 800037f6: 4601 li a2,0 + 800037f8: e17ff0ef jal ra,8000360e <dirlookup> + 800037fc: e52d bnez a0,80003866 <dirlink+0x86> + for(off = 0; off < dp->size; off += sizeof(de)){ + 800037fe: 04c92483 lw s1,76(s2) + 80003802: c48d beqz s1,8000382c <dirlink+0x4c> + 80003804: 4481 li s1,0 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80003806: 4741 li a4,16 + 80003808: 86a6 mv a3,s1 + 8000380a: fc040613 addi a2,s0,-64 + 8000380e: 4581 li a1,0 + 80003810: 854a mv a0,s2 + 80003812: c01ff0ef jal ra,80003412 <readi> + 80003816: 47c1 li a5,16 + 80003818: 04f51b63 bne a0,a5,8000386e <dirlink+0x8e> + if(de.inum == 0) + 8000381c: fc045783 lhu a5,-64(s0) + 80003820: c791 beqz a5,8000382c <dirlink+0x4c> + for(off = 0; off < dp->size; off += sizeof(de)){ + 80003822: 24c1 addiw s1,s1,16 + 80003824: 04c92783 lw a5,76(s2) + 80003828: fcf4efe3 bltu s1,a5,80003806 <dirlink+0x26> + strncpy(de.name, name, DIRSIZ); + 8000382c: 4639 li a2,14 + 8000382e: 85d2 mv a1,s4 + 80003830: fc240513 addi a0,s0,-62 + 80003834: d40fd0ef jal ra,80000d74 <strncpy> + de.inum = inum; + 80003838: fd341023 sh s3,-64(s0) + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 8000383c: 4741 li a4,16 + 8000383e: 86a6 mv a3,s1 + 80003840: fc040613 addi a2,s0,-64 + 80003844: 4581 li a1,0 + 80003846: 854a mv a0,s2 + 80003848: cafff0ef jal ra,800034f6 <writei> + 8000384c: 1541 addi a0,a0,-16 + 8000384e: 00a03533 snez a0,a0 + 80003852: 40a00533 neg a0,a0 +} + 80003856: 70e2 ld ra,56(sp) + 80003858: 7442 ld s0,48(sp) + 8000385a: 74a2 ld s1,40(sp) + 8000385c: 7902 ld s2,32(sp) + 8000385e: 69e2 ld s3,24(sp) + 80003860: 6a42 ld s4,16(sp) + 80003862: 6121 addi sp,sp,64 + 80003864: 8082 ret + iput(ip); + 80003866: adbff0ef jal ra,80003340 <iput> + return -1; + 8000386a: 557d li a0,-1 + 8000386c: b7ed j 80003856 <dirlink+0x76> + panic("dirlink read"); + 8000386e: 00004517 auipc a0,0x4 + 80003872: f7a50513 addi a0,a0,-134 # 800077e8 <syscall_name+0x1d0> + 80003876: ee1fc0ef jal ra,80000756 <panic> + +000000008000387a <namei>: + +struct inode* +namei(char *path) +{ + 8000387a: 1101 addi sp,sp,-32 + 8000387c: ec06 sd ra,24(sp) + 8000387e: e822 sd s0,16(sp) + 80003880: 1000 addi s0,sp,32 + char name[DIRSIZ]; + return namex(path, 0, name); + 80003882: fe040613 addi a2,s0,-32 + 80003886: 4581 li a1,0 + 80003888: e23ff0ef jal ra,800036aa <namex> +} + 8000388c: 60e2 ld ra,24(sp) + 8000388e: 6442 ld s0,16(sp) + 80003890: 6105 addi sp,sp,32 + 80003892: 8082 ret + +0000000080003894 <nameiparent>: + +struct inode* +nameiparent(char *path, char *name) +{ + 80003894: 1141 addi sp,sp,-16 + 80003896: e406 sd ra,8(sp) + 80003898: e022 sd s0,0(sp) + 8000389a: 0800 addi s0,sp,16 + 8000389c: 862e mv a2,a1 + return namex(path, 1, name); + 8000389e: 4585 li a1,1 + 800038a0: e0bff0ef jal ra,800036aa <namex> +} + 800038a4: 60a2 ld ra,8(sp) + 800038a6: 6402 ld s0,0(sp) + 800038a8: 0141 addi sp,sp,16 + 800038aa: 8082 ret + +00000000800038ac <write_head>: +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ + 800038ac: 1101 addi sp,sp,-32 + 800038ae: ec06 sd ra,24(sp) + 800038b0: e822 sd s0,16(sp) + 800038b2: e426 sd s1,8(sp) + 800038b4: e04a sd s2,0(sp) + 800038b6: 1000 addi s0,sp,32 + struct buf *buf = bread(log.dev, log.start); + 800038b8: 0001e917 auipc s2,0x1e + 800038bc: cf890913 addi s2,s2,-776 # 800215b0 <log> + 800038c0: 01892583 lw a1,24(s2) + 800038c4: 02892503 lw a0,40(s2) + 800038c8: 9deff0ef jal ra,80002aa6 <bread> + 800038cc: 84aa mv s1,a0 + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; + 800038ce: 02c92683 lw a3,44(s2) + 800038d2: cd34 sw a3,88(a0) + for (i = 0; i < log.lh.n; i++) { + 800038d4: 02d05863 blez a3,80003904 <write_head+0x58> + 800038d8: 0001e797 auipc a5,0x1e + 800038dc: d0878793 addi a5,a5,-760 # 800215e0 <log+0x30> + 800038e0: 05c50713 addi a4,a0,92 + 800038e4: 36fd addiw a3,a3,-1 + 800038e6: 02069613 slli a2,a3,0x20 + 800038ea: 01e65693 srli a3,a2,0x1e + 800038ee: 0001e617 auipc a2,0x1e + 800038f2: cf660613 addi a2,a2,-778 # 800215e4 <log+0x34> + 800038f6: 96b2 add a3,a3,a2 + hb->block[i] = log.lh.block[i]; + 800038f8: 4390 lw a2,0(a5) + 800038fa: c310 sw a2,0(a4) + for (i = 0; i < log.lh.n; i++) { + 800038fc: 0791 addi a5,a5,4 + 800038fe: 0711 addi a4,a4,4 # 43004 <_entry-0x7ffbcffc> + 80003900: fed79ce3 bne a5,a3,800038f8 <write_head+0x4c> + } + bwrite(buf); + 80003904: 8526 mv a0,s1 + 80003906: a76ff0ef jal ra,80002b7c <bwrite> + brelse(buf); + 8000390a: 8526 mv a0,s1 + 8000390c: aa2ff0ef jal ra,80002bae <brelse> +} + 80003910: 60e2 ld ra,24(sp) + 80003912: 6442 ld s0,16(sp) + 80003914: 64a2 ld s1,8(sp) + 80003916: 6902 ld s2,0(sp) + 80003918: 6105 addi sp,sp,32 + 8000391a: 8082 ret + +000000008000391c <install_trans>: + for (tail = 0; tail < log.lh.n; tail++) { + 8000391c: 0001e797 auipc a5,0x1e + 80003920: cc07a783 lw a5,-832(a5) # 800215dc <log+0x2c> + 80003924: 08f05f63 blez a5,800039c2 <install_trans+0xa6> +{ + 80003928: 7139 addi sp,sp,-64 + 8000392a: fc06 sd ra,56(sp) + 8000392c: f822 sd s0,48(sp) + 8000392e: f426 sd s1,40(sp) + 80003930: f04a sd s2,32(sp) + 80003932: ec4e sd s3,24(sp) + 80003934: e852 sd s4,16(sp) + 80003936: e456 sd s5,8(sp) + 80003938: e05a sd s6,0(sp) + 8000393a: 0080 addi s0,sp,64 + 8000393c: 8b2a mv s6,a0 + 8000393e: 0001ea97 auipc s5,0x1e + 80003942: ca2a8a93 addi s5,s5,-862 # 800215e0 <log+0x30> + for (tail = 0; tail < log.lh.n; tail++) { + 80003946: 4a01 li s4,0 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 80003948: 0001e997 auipc s3,0x1e + 8000394c: c6898993 addi s3,s3,-920 # 800215b0 <log> + 80003950: a829 j 8000396a <install_trans+0x4e> + brelse(lbuf); + 80003952: 854a mv a0,s2 + 80003954: a5aff0ef jal ra,80002bae <brelse> + brelse(dbuf); + 80003958: 8526 mv a0,s1 + 8000395a: a54ff0ef jal ra,80002bae <brelse> + for (tail = 0; tail < log.lh.n; tail++) { + 8000395e: 2a05 addiw s4,s4,1 + 80003960: 0a91 addi s5,s5,4 + 80003962: 02c9a783 lw a5,44(s3) + 80003966: 04fa5463 bge s4,a5,800039ae <install_trans+0x92> + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 8000396a: 0189a583 lw a1,24(s3) + 8000396e: 014585bb addw a1,a1,s4 + 80003972: 2585 addiw a1,a1,1 + 80003974: 0289a503 lw a0,40(s3) + 80003978: 92eff0ef jal ra,80002aa6 <bread> + 8000397c: 892a mv s2,a0 + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst + 8000397e: 000aa583 lw a1,0(s5) + 80003982: 0289a503 lw a0,40(s3) + 80003986: 920ff0ef jal ra,80002aa6 <bread> + 8000398a: 84aa mv s1,a0 + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst + 8000398c: 40000613 li a2,1024 + 80003990: 05890593 addi a1,s2,88 + 80003994: 05850513 addi a0,a0,88 + 80003998: b30fd0ef jal ra,80000cc8 <memmove> + bwrite(dbuf); // write dst to disk + 8000399c: 8526 mv a0,s1 + 8000399e: 9deff0ef jal ra,80002b7c <bwrite> + if(recovering == 0) + 800039a2: fa0b18e3 bnez s6,80003952 <install_trans+0x36> + bunpin(dbuf); + 800039a6: 8526 mv a0,s1 + 800039a8: ac4ff0ef jal ra,80002c6c <bunpin> + 800039ac: b75d j 80003952 <install_trans+0x36> +} + 800039ae: 70e2 ld ra,56(sp) + 800039b0: 7442 ld s0,48(sp) + 800039b2: 74a2 ld s1,40(sp) + 800039b4: 7902 ld s2,32(sp) + 800039b6: 69e2 ld s3,24(sp) + 800039b8: 6a42 ld s4,16(sp) + 800039ba: 6aa2 ld s5,8(sp) + 800039bc: 6b02 ld s6,0(sp) + 800039be: 6121 addi sp,sp,64 + 800039c0: 8082 ret + 800039c2: 8082 ret + +00000000800039c4 <initlog>: +{ + 800039c4: 7179 addi sp,sp,-48 + 800039c6: f406 sd ra,40(sp) + 800039c8: f022 sd s0,32(sp) + 800039ca: ec26 sd s1,24(sp) + 800039cc: e84a sd s2,16(sp) + 800039ce: e44e sd s3,8(sp) + 800039d0: 1800 addi s0,sp,48 + 800039d2: 892a mv s2,a0 + 800039d4: 89ae mv s3,a1 + initlock(&log.lock, "log"); + 800039d6: 0001e497 auipc s1,0x1e + 800039da: bda48493 addi s1,s1,-1062 # 800215b0 <log> + 800039de: 00004597 auipc a1,0x4 + 800039e2: e1a58593 addi a1,a1,-486 # 800077f8 <syscall_name+0x1e0> + 800039e6: 8526 mv a0,s1 + 800039e8: 930fd0ef jal ra,80000b18 <initlock> + log.start = sb->logstart; + 800039ec: 0149a583 lw a1,20(s3) + 800039f0: cc8c sw a1,24(s1) + log.size = sb->nlog; + 800039f2: 0109a783 lw a5,16(s3) + 800039f6: ccdc sw a5,28(s1) + log.dev = dev; + 800039f8: 0324a423 sw s2,40(s1) + struct buf *buf = bread(log.dev, log.start); + 800039fc: 854a mv a0,s2 + 800039fe: 8a8ff0ef jal ra,80002aa6 <bread> + log.lh.n = lh->n; + 80003a02: 4d34 lw a3,88(a0) + 80003a04: d4d4 sw a3,44(s1) + for (i = 0; i < log.lh.n; i++) { + 80003a06: 02d05663 blez a3,80003a32 <initlog+0x6e> + 80003a0a: 05c50793 addi a5,a0,92 + 80003a0e: 0001e717 auipc a4,0x1e + 80003a12: bd270713 addi a4,a4,-1070 # 800215e0 <log+0x30> + 80003a16: 36fd addiw a3,a3,-1 + 80003a18: 02069613 slli a2,a3,0x20 + 80003a1c: 01e65693 srli a3,a2,0x1e + 80003a20: 06050613 addi a2,a0,96 + 80003a24: 96b2 add a3,a3,a2 + log.lh.block[i] = lh->block[i]; + 80003a26: 4390 lw a2,0(a5) + 80003a28: c310 sw a2,0(a4) + for (i = 0; i < log.lh.n; i++) { + 80003a2a: 0791 addi a5,a5,4 + 80003a2c: 0711 addi a4,a4,4 + 80003a2e: fed79ce3 bne a5,a3,80003a26 <initlog+0x62> + brelse(buf); + 80003a32: 97cff0ef jal ra,80002bae <brelse> + +static void +recover_from_log(void) +{ + read_head(); + install_trans(1); // if committed, copy from log to disk + 80003a36: 4505 li a0,1 + 80003a38: ee5ff0ef jal ra,8000391c <install_trans> + log.lh.n = 0; + 80003a3c: 0001e797 auipc a5,0x1e + 80003a40: ba07a023 sw zero,-1120(a5) # 800215dc <log+0x2c> + write_head(); // clear the log + 80003a44: e69ff0ef jal ra,800038ac <write_head> +} + 80003a48: 70a2 ld ra,40(sp) + 80003a4a: 7402 ld s0,32(sp) + 80003a4c: 64e2 ld s1,24(sp) + 80003a4e: 6942 ld s2,16(sp) + 80003a50: 69a2 ld s3,8(sp) + 80003a52: 6145 addi sp,sp,48 + 80003a54: 8082 ret + +0000000080003a56 <begin_op>: +} + +// called at the start of each FS system call. +void +begin_op(void) +{ + 80003a56: 1101 addi sp,sp,-32 + 80003a58: ec06 sd ra,24(sp) + 80003a5a: e822 sd s0,16(sp) + 80003a5c: e426 sd s1,8(sp) + 80003a5e: e04a sd s2,0(sp) + 80003a60: 1000 addi s0,sp,32 + acquire(&log.lock); + 80003a62: 0001e517 auipc a0,0x1e + 80003a66: b4e50513 addi a0,a0,-1202 # 800215b0 <log> + 80003a6a: 92efd0ef jal ra,80000b98 <acquire> + while(1){ + if(log.committing){ + 80003a6e: 0001e497 auipc s1,0x1e + 80003a72: b4248493 addi s1,s1,-1214 # 800215b0 <log> + sleep(&log, &log.lock); + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){ + 80003a76: 4979 li s2,30 + 80003a78: a029 j 80003a82 <begin_op+0x2c> + sleep(&log, &log.lock); + 80003a7a: 85a6 mv a1,s1 + 80003a7c: 8526 mv a0,s1 + 80003a7e: b9efe0ef jal ra,80001e1c <sleep> + if(log.committing){ + 80003a82: 50dc lw a5,36(s1) + 80003a84: fbfd bnez a5,80003a7a <begin_op+0x24> + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){ + 80003a86: 5098 lw a4,32(s1) + 80003a88: 2705 addiw a4,a4,1 + 80003a8a: 0007069b sext.w a3,a4 + 80003a8e: 0027179b slliw a5,a4,0x2 + 80003a92: 9fb9 addw a5,a5,a4 + 80003a94: 0017979b slliw a5,a5,0x1 + 80003a98: 54d8 lw a4,44(s1) + 80003a9a: 9fb9 addw a5,a5,a4 + 80003a9c: 00f95763 bge s2,a5,80003aaa <begin_op+0x54> + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); + 80003aa0: 85a6 mv a1,s1 + 80003aa2: 8526 mv a0,s1 + 80003aa4: b78fe0ef jal ra,80001e1c <sleep> + 80003aa8: bfe9 j 80003a82 <begin_op+0x2c> + } else { + log.outstanding += 1; + 80003aaa: 0001e517 auipc a0,0x1e + 80003aae: b0650513 addi a0,a0,-1274 # 800215b0 <log> + 80003ab2: d114 sw a3,32(a0) + release(&log.lock); + 80003ab4: 97cfd0ef jal ra,80000c30 <release> + break; + } + } +} + 80003ab8: 60e2 ld ra,24(sp) + 80003aba: 6442 ld s0,16(sp) + 80003abc: 64a2 ld s1,8(sp) + 80003abe: 6902 ld s2,0(sp) + 80003ac0: 6105 addi sp,sp,32 + 80003ac2: 8082 ret + +0000000080003ac4 <end_op>: + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ + 80003ac4: 7139 addi sp,sp,-64 + 80003ac6: fc06 sd ra,56(sp) + 80003ac8: f822 sd s0,48(sp) + 80003aca: f426 sd s1,40(sp) + 80003acc: f04a sd s2,32(sp) + 80003ace: ec4e sd s3,24(sp) + 80003ad0: e852 sd s4,16(sp) + 80003ad2: e456 sd s5,8(sp) + 80003ad4: 0080 addi s0,sp,64 + int do_commit = 0; + + acquire(&log.lock); + 80003ad6: 0001e497 auipc s1,0x1e + 80003ada: ada48493 addi s1,s1,-1318 # 800215b0 <log> + 80003ade: 8526 mv a0,s1 + 80003ae0: 8b8fd0ef jal ra,80000b98 <acquire> + log.outstanding -= 1; + 80003ae4: 509c lw a5,32(s1) + 80003ae6: 37fd addiw a5,a5,-1 + 80003ae8: 0007891b sext.w s2,a5 + 80003aec: d09c sw a5,32(s1) + if(log.committing) + 80003aee: 50dc lw a5,36(s1) + 80003af0: ef9d bnez a5,80003b2e <end_op+0x6a> + panic("log.committing"); + if(log.outstanding == 0){ + 80003af2: 04091463 bnez s2,80003b3a <end_op+0x76> + do_commit = 1; + log.committing = 1; + 80003af6: 0001e497 auipc s1,0x1e + 80003afa: aba48493 addi s1,s1,-1350 # 800215b0 <log> + 80003afe: 4785 li a5,1 + 80003b00: d0dc sw a5,36(s1) + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); + 80003b02: 8526 mv a0,s1 + 80003b04: 92cfd0ef jal ra,80000c30 <release> +} + +static void +commit() +{ + if (log.lh.n > 0) { + 80003b08: 54dc lw a5,44(s1) + 80003b0a: 04f04b63 bgtz a5,80003b60 <end_op+0x9c> + acquire(&log.lock); + 80003b0e: 0001e497 auipc s1,0x1e + 80003b12: aa248493 addi s1,s1,-1374 # 800215b0 <log> + 80003b16: 8526 mv a0,s1 + 80003b18: 880fd0ef jal ra,80000b98 <acquire> + log.committing = 0; + 80003b1c: 0204a223 sw zero,36(s1) + wakeup(&log); + 80003b20: 8526 mv a0,s1 + 80003b22: b46fe0ef jal ra,80001e68 <wakeup> + release(&log.lock); + 80003b26: 8526 mv a0,s1 + 80003b28: 908fd0ef jal ra,80000c30 <release> +} + 80003b2c: a00d j 80003b4e <end_op+0x8a> + panic("log.committing"); + 80003b2e: 00004517 auipc a0,0x4 + 80003b32: cd250513 addi a0,a0,-814 # 80007800 <syscall_name+0x1e8> + 80003b36: c21fc0ef jal ra,80000756 <panic> + wakeup(&log); + 80003b3a: 0001e497 auipc s1,0x1e + 80003b3e: a7648493 addi s1,s1,-1418 # 800215b0 <log> + 80003b42: 8526 mv a0,s1 + 80003b44: b24fe0ef jal ra,80001e68 <wakeup> + release(&log.lock); + 80003b48: 8526 mv a0,s1 + 80003b4a: 8e6fd0ef jal ra,80000c30 <release> +} + 80003b4e: 70e2 ld ra,56(sp) + 80003b50: 7442 ld s0,48(sp) + 80003b52: 74a2 ld s1,40(sp) + 80003b54: 7902 ld s2,32(sp) + 80003b56: 69e2 ld s3,24(sp) + 80003b58: 6a42 ld s4,16(sp) + 80003b5a: 6aa2 ld s5,8(sp) + 80003b5c: 6121 addi sp,sp,64 + 80003b5e: 8082 ret + for (tail = 0; tail < log.lh.n; tail++) { + 80003b60: 0001ea97 auipc s5,0x1e + 80003b64: a80a8a93 addi s5,s5,-1408 # 800215e0 <log+0x30> + struct buf *to = bread(log.dev, log.start+tail+1); // log block + 80003b68: 0001ea17 auipc s4,0x1e + 80003b6c: a48a0a13 addi s4,s4,-1464 # 800215b0 <log> + 80003b70: 018a2583 lw a1,24(s4) + 80003b74: 012585bb addw a1,a1,s2 + 80003b78: 2585 addiw a1,a1,1 + 80003b7a: 028a2503 lw a0,40(s4) + 80003b7e: f29fe0ef jal ra,80002aa6 <bread> + 80003b82: 84aa mv s1,a0 + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block + 80003b84: 000aa583 lw a1,0(s5) + 80003b88: 028a2503 lw a0,40(s4) + 80003b8c: f1bfe0ef jal ra,80002aa6 <bread> + 80003b90: 89aa mv s3,a0 + memmove(to->data, from->data, BSIZE); + 80003b92: 40000613 li a2,1024 + 80003b96: 05850593 addi a1,a0,88 + 80003b9a: 05848513 addi a0,s1,88 + 80003b9e: 92afd0ef jal ra,80000cc8 <memmove> + bwrite(to); // write the log + 80003ba2: 8526 mv a0,s1 + 80003ba4: fd9fe0ef jal ra,80002b7c <bwrite> + brelse(from); + 80003ba8: 854e mv a0,s3 + 80003baa: 804ff0ef jal ra,80002bae <brelse> + brelse(to); + 80003bae: 8526 mv a0,s1 + 80003bb0: ffffe0ef jal ra,80002bae <brelse> + for (tail = 0; tail < log.lh.n; tail++) { + 80003bb4: 2905 addiw s2,s2,1 + 80003bb6: 0a91 addi s5,s5,4 + 80003bb8: 02ca2783 lw a5,44(s4) + 80003bbc: faf94ae3 blt s2,a5,80003b70 <end_op+0xac> + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit + 80003bc0: cedff0ef jal ra,800038ac <write_head> + install_trans(0); // Now install writes to home locations + 80003bc4: 4501 li a0,0 + 80003bc6: d57ff0ef jal ra,8000391c <install_trans> + log.lh.n = 0; + 80003bca: 0001e797 auipc a5,0x1e + 80003bce: a007a923 sw zero,-1518(a5) # 800215dc <log+0x2c> + write_head(); // Erase the transaction from the log + 80003bd2: cdbff0ef jal ra,800038ac <write_head> + 80003bd6: bf25 j 80003b0e <end_op+0x4a> + +0000000080003bd8 <log_write>: +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ + 80003bd8: 1101 addi sp,sp,-32 + 80003bda: ec06 sd ra,24(sp) + 80003bdc: e822 sd s0,16(sp) + 80003bde: e426 sd s1,8(sp) + 80003be0: e04a sd s2,0(sp) + 80003be2: 1000 addi s0,sp,32 + 80003be4: 84aa mv s1,a0 + int i; + + acquire(&log.lock); + 80003be6: 0001e917 auipc s2,0x1e + 80003bea: 9ca90913 addi s2,s2,-1590 # 800215b0 <log> + 80003bee: 854a mv a0,s2 + 80003bf0: fa9fc0ef jal ra,80000b98 <acquire> + if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) + 80003bf4: 02c92603 lw a2,44(s2) + 80003bf8: 47f5 li a5,29 + 80003bfa: 06c7c363 blt a5,a2,80003c60 <log_write+0x88> + 80003bfe: 0001e797 auipc a5,0x1e + 80003c02: 9ce7a783 lw a5,-1586(a5) # 800215cc <log+0x1c> + 80003c06: 37fd addiw a5,a5,-1 + 80003c08: 04f65c63 bge a2,a5,80003c60 <log_write+0x88> + panic("too big a transaction"); + if (log.outstanding < 1) + 80003c0c: 0001e797 auipc a5,0x1e + 80003c10: 9c47a783 lw a5,-1596(a5) # 800215d0 <log+0x20> + 80003c14: 04f05c63 blez a5,80003c6c <log_write+0x94> + panic("log_write outside of trans"); + + for (i = 0; i < log.lh.n; i++) { + 80003c18: 4781 li a5,0 + 80003c1a: 04c05f63 blez a2,80003c78 <log_write+0xa0> + if (log.lh.block[i] == b->blockno) // log absorption + 80003c1e: 44cc lw a1,12(s1) + 80003c20: 0001e717 auipc a4,0x1e + 80003c24: 9c070713 addi a4,a4,-1600 # 800215e0 <log+0x30> + for (i = 0; i < log.lh.n; i++) { + 80003c28: 4781 li a5,0 + if (log.lh.block[i] == b->blockno) // log absorption + 80003c2a: 4314 lw a3,0(a4) + 80003c2c: 04b68663 beq a3,a1,80003c78 <log_write+0xa0> + for (i = 0; i < log.lh.n; i++) { + 80003c30: 2785 addiw a5,a5,1 + 80003c32: 0711 addi a4,a4,4 + 80003c34: fef61be3 bne a2,a5,80003c2a <log_write+0x52> + break; + } + log.lh.block[i] = b->blockno; + 80003c38: 0621 addi a2,a2,8 + 80003c3a: 060a slli a2,a2,0x2 + 80003c3c: 0001e797 auipc a5,0x1e + 80003c40: 97478793 addi a5,a5,-1676 # 800215b0 <log> + 80003c44: 97b2 add a5,a5,a2 + 80003c46: 44d8 lw a4,12(s1) + 80003c48: cb98 sw a4,16(a5) + if (i == log.lh.n) { // Add new block to log? + bpin(b); + 80003c4a: 8526 mv a0,s1 + 80003c4c: fedfe0ef jal ra,80002c38 <bpin> + log.lh.n++; + 80003c50: 0001e717 auipc a4,0x1e + 80003c54: 96070713 addi a4,a4,-1696 # 800215b0 <log> + 80003c58: 575c lw a5,44(a4) + 80003c5a: 2785 addiw a5,a5,1 + 80003c5c: d75c sw a5,44(a4) + 80003c5e: a80d j 80003c90 <log_write+0xb8> + panic("too big a transaction"); + 80003c60: 00004517 auipc a0,0x4 + 80003c64: bb050513 addi a0,a0,-1104 # 80007810 <syscall_name+0x1f8> + 80003c68: aeffc0ef jal ra,80000756 <panic> + panic("log_write outside of trans"); + 80003c6c: 00004517 auipc a0,0x4 + 80003c70: bbc50513 addi a0,a0,-1092 # 80007828 <syscall_name+0x210> + 80003c74: ae3fc0ef jal ra,80000756 <panic> + log.lh.block[i] = b->blockno; + 80003c78: 00878693 addi a3,a5,8 + 80003c7c: 068a slli a3,a3,0x2 + 80003c7e: 0001e717 auipc a4,0x1e + 80003c82: 93270713 addi a4,a4,-1742 # 800215b0 <log> + 80003c86: 9736 add a4,a4,a3 + 80003c88: 44d4 lw a3,12(s1) + 80003c8a: cb14 sw a3,16(a4) + if (i == log.lh.n) { // Add new block to log? + 80003c8c: faf60fe3 beq a2,a5,80003c4a <log_write+0x72> + } + release(&log.lock); + 80003c90: 0001e517 auipc a0,0x1e + 80003c94: 92050513 addi a0,a0,-1760 # 800215b0 <log> + 80003c98: f99fc0ef jal ra,80000c30 <release> +} + 80003c9c: 60e2 ld ra,24(sp) + 80003c9e: 6442 ld s0,16(sp) + 80003ca0: 64a2 ld s1,8(sp) + 80003ca2: 6902 ld s2,0(sp) + 80003ca4: 6105 addi sp,sp,32 + 80003ca6: 8082 ret + +0000000080003ca8 <initsleeplock>: +#include "proc.h" +#include "sleeplock.h" + +void +initsleeplock(struct sleeplock *lk, char *name) +{ + 80003ca8: 1101 addi sp,sp,-32 + 80003caa: ec06 sd ra,24(sp) + 80003cac: e822 sd s0,16(sp) + 80003cae: e426 sd s1,8(sp) + 80003cb0: e04a sd s2,0(sp) + 80003cb2: 1000 addi s0,sp,32 + 80003cb4: 84aa mv s1,a0 + 80003cb6: 892e mv s2,a1 + initlock(&lk->lk, "sleep lock"); + 80003cb8: 00004597 auipc a1,0x4 + 80003cbc: b9058593 addi a1,a1,-1136 # 80007848 <syscall_name+0x230> + 80003cc0: 0521 addi a0,a0,8 + 80003cc2: e57fc0ef jal ra,80000b18 <initlock> + lk->name = name; + 80003cc6: 0324b023 sd s2,32(s1) + lk->locked = 0; + 80003cca: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003cce: 0204a423 sw zero,40(s1) +} + 80003cd2: 60e2 ld ra,24(sp) + 80003cd4: 6442 ld s0,16(sp) + 80003cd6: 64a2 ld s1,8(sp) + 80003cd8: 6902 ld s2,0(sp) + 80003cda: 6105 addi sp,sp,32 + 80003cdc: 8082 ret + +0000000080003cde <acquiresleep>: + +void +acquiresleep(struct sleeplock *lk) +{ + 80003cde: 1101 addi sp,sp,-32 + 80003ce0: ec06 sd ra,24(sp) + 80003ce2: e822 sd s0,16(sp) + 80003ce4: e426 sd s1,8(sp) + 80003ce6: e04a sd s2,0(sp) + 80003ce8: 1000 addi s0,sp,32 + 80003cea: 84aa mv s1,a0 + acquire(&lk->lk); + 80003cec: 00850913 addi s2,a0,8 + 80003cf0: 854a mv a0,s2 + 80003cf2: ea7fc0ef jal ra,80000b98 <acquire> + while (lk->locked) { + 80003cf6: 409c lw a5,0(s1) + 80003cf8: c799 beqz a5,80003d06 <acquiresleep+0x28> + sleep(lk, &lk->lk); + 80003cfa: 85ca mv a1,s2 + 80003cfc: 8526 mv a0,s1 + 80003cfe: 91efe0ef jal ra,80001e1c <sleep> + while (lk->locked) { + 80003d02: 409c lw a5,0(s1) + 80003d04: fbfd bnez a5,80003cfa <acquiresleep+0x1c> + } + lk->locked = 1; + 80003d06: 4785 li a5,1 + 80003d08: c09c sw a5,0(s1) + lk->pid = myproc()->pid; + 80003d0a: b21fd0ef jal ra,8000182a <myproc> + 80003d0e: 591c lw a5,48(a0) + 80003d10: d49c sw a5,40(s1) + release(&lk->lk); + 80003d12: 854a mv a0,s2 + 80003d14: f1dfc0ef jal ra,80000c30 <release> +} + 80003d18: 60e2 ld ra,24(sp) + 80003d1a: 6442 ld s0,16(sp) + 80003d1c: 64a2 ld s1,8(sp) + 80003d1e: 6902 ld s2,0(sp) + 80003d20: 6105 addi sp,sp,32 + 80003d22: 8082 ret + +0000000080003d24 <releasesleep>: + +void +releasesleep(struct sleeplock *lk) +{ + 80003d24: 1101 addi sp,sp,-32 + 80003d26: ec06 sd ra,24(sp) + 80003d28: e822 sd s0,16(sp) + 80003d2a: e426 sd s1,8(sp) + 80003d2c: e04a sd s2,0(sp) + 80003d2e: 1000 addi s0,sp,32 + 80003d30: 84aa mv s1,a0 + acquire(&lk->lk); + 80003d32: 00850913 addi s2,a0,8 + 80003d36: 854a mv a0,s2 + 80003d38: e61fc0ef jal ra,80000b98 <acquire> + lk->locked = 0; + 80003d3c: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003d40: 0204a423 sw zero,40(s1) + wakeup(lk); + 80003d44: 8526 mv a0,s1 + 80003d46: 922fe0ef jal ra,80001e68 <wakeup> + release(&lk->lk); + 80003d4a: 854a mv a0,s2 + 80003d4c: ee5fc0ef jal ra,80000c30 <release> +} + 80003d50: 60e2 ld ra,24(sp) + 80003d52: 6442 ld s0,16(sp) + 80003d54: 64a2 ld s1,8(sp) + 80003d56: 6902 ld s2,0(sp) + 80003d58: 6105 addi sp,sp,32 + 80003d5a: 8082 ret + +0000000080003d5c <holdingsleep>: + +int +holdingsleep(struct sleeplock *lk) +{ + 80003d5c: 7179 addi sp,sp,-48 + 80003d5e: f406 sd ra,40(sp) + 80003d60: f022 sd s0,32(sp) + 80003d62: ec26 sd s1,24(sp) + 80003d64: e84a sd s2,16(sp) + 80003d66: e44e sd s3,8(sp) + 80003d68: 1800 addi s0,sp,48 + 80003d6a: 84aa mv s1,a0 + int r; + + acquire(&lk->lk); + 80003d6c: 00850913 addi s2,a0,8 + 80003d70: 854a mv a0,s2 + 80003d72: e27fc0ef jal ra,80000b98 <acquire> + r = lk->locked && (lk->pid == myproc()->pid); + 80003d76: 409c lw a5,0(s1) + 80003d78: ef89 bnez a5,80003d92 <holdingsleep+0x36> + 80003d7a: 4481 li s1,0 + release(&lk->lk); + 80003d7c: 854a mv a0,s2 + 80003d7e: eb3fc0ef jal ra,80000c30 <release> + return r; +} + 80003d82: 8526 mv a0,s1 + 80003d84: 70a2 ld ra,40(sp) + 80003d86: 7402 ld s0,32(sp) + 80003d88: 64e2 ld s1,24(sp) + 80003d8a: 6942 ld s2,16(sp) + 80003d8c: 69a2 ld s3,8(sp) + 80003d8e: 6145 addi sp,sp,48 + 80003d90: 8082 ret + r = lk->locked && (lk->pid == myproc()->pid); + 80003d92: 0284a983 lw s3,40(s1) + 80003d96: a95fd0ef jal ra,8000182a <myproc> + 80003d9a: 5904 lw s1,48(a0) + 80003d9c: 413484b3 sub s1,s1,s3 + 80003da0: 0014b493 seqz s1,s1 + 80003da4: bfe1 j 80003d7c <holdingsleep+0x20> + +0000000080003da6 <fileinit>: + struct file file[NFILE]; +} ftable; + +void +fileinit(void) +{ + 80003da6: 1141 addi sp,sp,-16 + 80003da8: e406 sd ra,8(sp) + 80003daa: e022 sd s0,0(sp) + 80003dac: 0800 addi s0,sp,16 + initlock(&ftable.lock, "ftable"); + 80003dae: 00004597 auipc a1,0x4 + 80003db2: aaa58593 addi a1,a1,-1366 # 80007858 <syscall_name+0x240> + 80003db6: 0001e517 auipc a0,0x1e + 80003dba: 94250513 addi a0,a0,-1726 # 800216f8 <ftable> + 80003dbe: d5bfc0ef jal ra,80000b18 <initlock> +} + 80003dc2: 60a2 ld ra,8(sp) + 80003dc4: 6402 ld s0,0(sp) + 80003dc6: 0141 addi sp,sp,16 + 80003dc8: 8082 ret + +0000000080003dca <filealloc>: + +// Allocate a file structure. +struct file* +filealloc(void) +{ + 80003dca: 1101 addi sp,sp,-32 + 80003dcc: ec06 sd ra,24(sp) + 80003dce: e822 sd s0,16(sp) + 80003dd0: e426 sd s1,8(sp) + 80003dd2: 1000 addi s0,sp,32 + struct file *f; + + acquire(&ftable.lock); + 80003dd4: 0001e517 auipc a0,0x1e + 80003dd8: 92450513 addi a0,a0,-1756 # 800216f8 <ftable> + 80003ddc: dbdfc0ef jal ra,80000b98 <acquire> + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 80003de0: 0001e497 auipc s1,0x1e + 80003de4: 93048493 addi s1,s1,-1744 # 80021710 <ftable+0x18> + 80003de8: 0001f717 auipc a4,0x1f + 80003dec: 8c870713 addi a4,a4,-1848 # 800226b0 <disk> + if(f->ref == 0){ + 80003df0: 40dc lw a5,4(s1) + 80003df2: cf89 beqz a5,80003e0c <filealloc+0x42> + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 80003df4: 02848493 addi s1,s1,40 + 80003df8: fee49ce3 bne s1,a4,80003df0 <filealloc+0x26> + f->ref = 1; + release(&ftable.lock); + return f; + } + } + release(&ftable.lock); + 80003dfc: 0001e517 auipc a0,0x1e + 80003e00: 8fc50513 addi a0,a0,-1796 # 800216f8 <ftable> + 80003e04: e2dfc0ef jal ra,80000c30 <release> + return 0; + 80003e08: 4481 li s1,0 + 80003e0a: a809 j 80003e1c <filealloc+0x52> + f->ref = 1; + 80003e0c: 4785 li a5,1 + 80003e0e: c0dc sw a5,4(s1) + release(&ftable.lock); + 80003e10: 0001e517 auipc a0,0x1e + 80003e14: 8e850513 addi a0,a0,-1816 # 800216f8 <ftable> + 80003e18: e19fc0ef jal ra,80000c30 <release> +} + 80003e1c: 8526 mv a0,s1 + 80003e1e: 60e2 ld ra,24(sp) + 80003e20: 6442 ld s0,16(sp) + 80003e22: 64a2 ld s1,8(sp) + 80003e24: 6105 addi sp,sp,32 + 80003e26: 8082 ret + +0000000080003e28 <filedup>: + +// Increment ref count for file f. +struct file* +filedup(struct file *f) +{ + 80003e28: 1101 addi sp,sp,-32 + 80003e2a: ec06 sd ra,24(sp) + 80003e2c: e822 sd s0,16(sp) + 80003e2e: e426 sd s1,8(sp) + 80003e30: 1000 addi s0,sp,32 + 80003e32: 84aa mv s1,a0 + acquire(&ftable.lock); + 80003e34: 0001e517 auipc a0,0x1e + 80003e38: 8c450513 addi a0,a0,-1852 # 800216f8 <ftable> + 80003e3c: d5dfc0ef jal ra,80000b98 <acquire> + if(f->ref < 1) + 80003e40: 40dc lw a5,4(s1) + 80003e42: 02f05063 blez a5,80003e62 <filedup+0x3a> + panic("filedup"); + f->ref++; + 80003e46: 2785 addiw a5,a5,1 + 80003e48: c0dc sw a5,4(s1) + release(&ftable.lock); + 80003e4a: 0001e517 auipc a0,0x1e + 80003e4e: 8ae50513 addi a0,a0,-1874 # 800216f8 <ftable> + 80003e52: ddffc0ef jal ra,80000c30 <release> + return f; +} + 80003e56: 8526 mv a0,s1 + 80003e58: 60e2 ld ra,24(sp) + 80003e5a: 6442 ld s0,16(sp) + 80003e5c: 64a2 ld s1,8(sp) + 80003e5e: 6105 addi sp,sp,32 + 80003e60: 8082 ret + panic("filedup"); + 80003e62: 00004517 auipc a0,0x4 + 80003e66: 9fe50513 addi a0,a0,-1538 # 80007860 <syscall_name+0x248> + 80003e6a: 8edfc0ef jal ra,80000756 <panic> + +0000000080003e6e <fileclose>: + +// Close file f. (Decrement ref count, close when reaches 0.) +void +fileclose(struct file *f) +{ + 80003e6e: 7139 addi sp,sp,-64 + 80003e70: fc06 sd ra,56(sp) + 80003e72: f822 sd s0,48(sp) + 80003e74: f426 sd s1,40(sp) + 80003e76: f04a sd s2,32(sp) + 80003e78: ec4e sd s3,24(sp) + 80003e7a: e852 sd s4,16(sp) + 80003e7c: e456 sd s5,8(sp) + 80003e7e: 0080 addi s0,sp,64 + 80003e80: 84aa mv s1,a0 + struct file ff; + + acquire(&ftable.lock); + 80003e82: 0001e517 auipc a0,0x1e + 80003e86: 87650513 addi a0,a0,-1930 # 800216f8 <ftable> + 80003e8a: d0ffc0ef jal ra,80000b98 <acquire> + if(f->ref < 1) + 80003e8e: 40dc lw a5,4(s1) + 80003e90: 04f05963 blez a5,80003ee2 <fileclose+0x74> + panic("fileclose"); + if(--f->ref > 0){ + 80003e94: 37fd addiw a5,a5,-1 + 80003e96: 0007871b sext.w a4,a5 + 80003e9a: c0dc sw a5,4(s1) + 80003e9c: 04e04963 bgtz a4,80003eee <fileclose+0x80> + release(&ftable.lock); + return; + } + ff = *f; + 80003ea0: 0004a903 lw s2,0(s1) + 80003ea4: 0094ca83 lbu s5,9(s1) + 80003ea8: 0104ba03 ld s4,16(s1) + 80003eac: 0184b983 ld s3,24(s1) + f->ref = 0; + 80003eb0: 0004a223 sw zero,4(s1) + f->type = FD_NONE; + 80003eb4: 0004a023 sw zero,0(s1) + release(&ftable.lock); + 80003eb8: 0001e517 auipc a0,0x1e + 80003ebc: 84050513 addi a0,a0,-1984 # 800216f8 <ftable> + 80003ec0: d71fc0ef jal ra,80000c30 <release> + + if(ff.type == FD_PIPE){ + 80003ec4: 4785 li a5,1 + 80003ec6: 04f90363 beq s2,a5,80003f0c <fileclose+0x9e> + pipeclose(ff.pipe, ff.writable); + } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){ + 80003eca: 3979 addiw s2,s2,-2 + 80003ecc: 4785 li a5,1 + 80003ece: 0327e663 bltu a5,s2,80003efa <fileclose+0x8c> + begin_op(); + 80003ed2: b85ff0ef jal ra,80003a56 <begin_op> + iput(ff.ip); + 80003ed6: 854e mv a0,s3 + 80003ed8: c68ff0ef jal ra,80003340 <iput> + end_op(); + 80003edc: be9ff0ef jal ra,80003ac4 <end_op> + 80003ee0: a829 j 80003efa <fileclose+0x8c> + panic("fileclose"); + 80003ee2: 00004517 auipc a0,0x4 + 80003ee6: 98650513 addi a0,a0,-1658 # 80007868 <syscall_name+0x250> + 80003eea: 86dfc0ef jal ra,80000756 <panic> + release(&ftable.lock); + 80003eee: 0001e517 auipc a0,0x1e + 80003ef2: 80a50513 addi a0,a0,-2038 # 800216f8 <ftable> + 80003ef6: d3bfc0ef jal ra,80000c30 <release> + } +} + 80003efa: 70e2 ld ra,56(sp) + 80003efc: 7442 ld s0,48(sp) + 80003efe: 74a2 ld s1,40(sp) + 80003f00: 7902 ld s2,32(sp) + 80003f02: 69e2 ld s3,24(sp) + 80003f04: 6a42 ld s4,16(sp) + 80003f06: 6aa2 ld s5,8(sp) + 80003f08: 6121 addi sp,sp,64 + 80003f0a: 8082 ret + pipeclose(ff.pipe, ff.writable); + 80003f0c: 85d6 mv a1,s5 + 80003f0e: 8552 mv a0,s4 + 80003f10: 2ec000ef jal ra,800041fc <pipeclose> + 80003f14: b7dd j 80003efa <fileclose+0x8c> + +0000000080003f16 <filestat>: + +// Get metadata about file f. +// addr is a user virtual address, pointing to a struct stat. +int +filestat(struct file *f, uint64 addr) +{ + 80003f16: 715d addi sp,sp,-80 + 80003f18: e486 sd ra,72(sp) + 80003f1a: e0a2 sd s0,64(sp) + 80003f1c: fc26 sd s1,56(sp) + 80003f1e: f84a sd s2,48(sp) + 80003f20: f44e sd s3,40(sp) + 80003f22: 0880 addi s0,sp,80 + 80003f24: 84aa mv s1,a0 + 80003f26: 89ae mv s3,a1 + struct proc *p = myproc(); + 80003f28: 903fd0ef jal ra,8000182a <myproc> + struct stat st; + + if(f->type == FD_INODE || f->type == FD_DEVICE){ + 80003f2c: 409c lw a5,0(s1) + 80003f2e: 37f9 addiw a5,a5,-2 + 80003f30: 4705 li a4,1 + 80003f32: 02f76f63 bltu a4,a5,80003f70 <filestat+0x5a> + 80003f36: 892a mv s2,a0 + ilock(f->ip); + 80003f38: 6c88 ld a0,24(s1) + 80003f3a: a88ff0ef jal ra,800031c2 <ilock> + stati(f->ip, &st); + 80003f3e: fb840593 addi a1,s0,-72 + 80003f42: 6c88 ld a0,24(s1) + 80003f44: ca4ff0ef jal ra,800033e8 <stati> + iunlock(f->ip); + 80003f48: 6c88 ld a0,24(s1) + 80003f4a: b22ff0ef jal ra,8000326c <iunlock> + if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0) + 80003f4e: 46e1 li a3,24 + 80003f50: fb840613 addi a2,s0,-72 + 80003f54: 85ce mv a1,s3 + 80003f56: 05093503 ld a0,80(s2) + 80003f5a: d88fd0ef jal ra,800014e2 <copyout> + 80003f5e: 41f5551b sraiw a0,a0,0x1f + return -1; + return 0; + } + return -1; +} + 80003f62: 60a6 ld ra,72(sp) + 80003f64: 6406 ld s0,64(sp) + 80003f66: 74e2 ld s1,56(sp) + 80003f68: 7942 ld s2,48(sp) + 80003f6a: 79a2 ld s3,40(sp) + 80003f6c: 6161 addi sp,sp,80 + 80003f6e: 8082 ret + return -1; + 80003f70: 557d li a0,-1 + 80003f72: bfc5 j 80003f62 <filestat+0x4c> + +0000000080003f74 <fileread>: + +// Read from file f. +// addr is a user virtual address. +int +fileread(struct file *f, uint64 addr, int n) +{ + 80003f74: 7179 addi sp,sp,-48 + 80003f76: f406 sd ra,40(sp) + 80003f78: f022 sd s0,32(sp) + 80003f7a: ec26 sd s1,24(sp) + 80003f7c: e84a sd s2,16(sp) + 80003f7e: e44e sd s3,8(sp) + 80003f80: 1800 addi s0,sp,48 + int r = 0; + + if(f->readable == 0) + 80003f82: 00854783 lbu a5,8(a0) + 80003f86: cbc1 beqz a5,80004016 <fileread+0xa2> + 80003f88: 84aa mv s1,a0 + 80003f8a: 89ae mv s3,a1 + 80003f8c: 8932 mv s2,a2 + return -1; + + if(f->type == FD_PIPE){ + 80003f8e: 411c lw a5,0(a0) + 80003f90: 4705 li a4,1 + 80003f92: 04e78363 beq a5,a4,80003fd8 <fileread+0x64> + r = piperead(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 80003f96: 470d li a4,3 + 80003f98: 04e78563 beq a5,a4,80003fe2 <fileread+0x6e> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + return -1; + r = devsw[f->major].read(1, addr, n); + } else if(f->type == FD_INODE){ + 80003f9c: 4709 li a4,2 + 80003f9e: 06e79663 bne a5,a4,8000400a <fileread+0x96> + ilock(f->ip); + 80003fa2: 6d08 ld a0,24(a0) + 80003fa4: a1eff0ef jal ra,800031c2 <ilock> + if((r = readi(f->ip, 1, addr, f->off, n)) > 0) + 80003fa8: 874a mv a4,s2 + 80003faa: 5094 lw a3,32(s1) + 80003fac: 864e mv a2,s3 + 80003fae: 4585 li a1,1 + 80003fb0: 6c88 ld a0,24(s1) + 80003fb2: c60ff0ef jal ra,80003412 <readi> + 80003fb6: 892a mv s2,a0 + 80003fb8: 00a05563 blez a0,80003fc2 <fileread+0x4e> + f->off += r; + 80003fbc: 509c lw a5,32(s1) + 80003fbe: 9fa9 addw a5,a5,a0 + 80003fc0: d09c sw a5,32(s1) + iunlock(f->ip); + 80003fc2: 6c88 ld a0,24(s1) + 80003fc4: aa8ff0ef jal ra,8000326c <iunlock> + } else { + panic("fileread"); + } + + return r; +} + 80003fc8: 854a mv a0,s2 + 80003fca: 70a2 ld ra,40(sp) + 80003fcc: 7402 ld s0,32(sp) + 80003fce: 64e2 ld s1,24(sp) + 80003fd0: 6942 ld s2,16(sp) + 80003fd2: 69a2 ld s3,8(sp) + 80003fd4: 6145 addi sp,sp,48 + 80003fd6: 8082 ret + r = piperead(f->pipe, addr, n); + 80003fd8: 6908 ld a0,16(a0) + 80003fda: 34e000ef jal ra,80004328 <piperead> + 80003fde: 892a mv s2,a0 + 80003fe0: b7e5 j 80003fc8 <fileread+0x54> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + 80003fe2: 02451783 lh a5,36(a0) + 80003fe6: 03079693 slli a3,a5,0x30 + 80003fea: 92c1 srli a3,a3,0x30 + 80003fec: 4725 li a4,9 + 80003fee: 02d76663 bltu a4,a3,8000401a <fileread+0xa6> + 80003ff2: 0792 slli a5,a5,0x4 + 80003ff4: 0001d717 auipc a4,0x1d + 80003ff8: 66470713 addi a4,a4,1636 # 80021658 <devsw> + 80003ffc: 97ba add a5,a5,a4 + 80003ffe: 639c ld a5,0(a5) + 80004000: cf99 beqz a5,8000401e <fileread+0xaa> + r = devsw[f->major].read(1, addr, n); + 80004002: 4505 li a0,1 + 80004004: 9782 jalr a5 + 80004006: 892a mv s2,a0 + 80004008: b7c1 j 80003fc8 <fileread+0x54> + panic("fileread"); + 8000400a: 00004517 auipc a0,0x4 + 8000400e: 86e50513 addi a0,a0,-1938 # 80007878 <syscall_name+0x260> + 80004012: f44fc0ef jal ra,80000756 <panic> + return -1; + 80004016: 597d li s2,-1 + 80004018: bf45 j 80003fc8 <fileread+0x54> + return -1; + 8000401a: 597d li s2,-1 + 8000401c: b775 j 80003fc8 <fileread+0x54> + 8000401e: 597d li s2,-1 + 80004020: b765 j 80003fc8 <fileread+0x54> + +0000000080004022 <filewrite>: + +// Write to file f. +// addr is a user virtual address. +int +filewrite(struct file *f, uint64 addr, int n) +{ + 80004022: 715d addi sp,sp,-80 + 80004024: e486 sd ra,72(sp) + 80004026: e0a2 sd s0,64(sp) + 80004028: fc26 sd s1,56(sp) + 8000402a: f84a sd s2,48(sp) + 8000402c: f44e sd s3,40(sp) + 8000402e: f052 sd s4,32(sp) + 80004030: ec56 sd s5,24(sp) + 80004032: e85a sd s6,16(sp) + 80004034: e45e sd s7,8(sp) + 80004036: e062 sd s8,0(sp) + 80004038: 0880 addi s0,sp,80 + int r, ret = 0; + + if(f->writable == 0) + 8000403a: 00954783 lbu a5,9(a0) + 8000403e: 0e078863 beqz a5,8000412e <filewrite+0x10c> + 80004042: 892a mv s2,a0 + 80004044: 8b2e mv s6,a1 + 80004046: 8a32 mv s4,a2 + return -1; + + if(f->type == FD_PIPE){ + 80004048: 411c lw a5,0(a0) + 8000404a: 4705 li a4,1 + 8000404c: 02e78263 beq a5,a4,80004070 <filewrite+0x4e> + ret = pipewrite(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 80004050: 470d li a4,3 + 80004052: 02e78463 beq a5,a4,8000407a <filewrite+0x58> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + return -1; + ret = devsw[f->major].write(1, addr, n); + } else if(f->type == FD_INODE){ + 80004056: 4709 li a4,2 + 80004058: 0ce79563 bne a5,a4,80004122 <filewrite+0x100> + // 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) * BSIZE; + int i = 0; + while(i < n){ + 8000405c: 0ac05163 blez a2,800040fe <filewrite+0xdc> + int i = 0; + 80004060: 4981 li s3,0 + 80004062: 6b85 lui s7,0x1 + 80004064: c00b8b93 addi s7,s7,-1024 # c00 <_entry-0x7ffff400> + 80004068: 6c05 lui s8,0x1 + 8000406a: c00c0c1b addiw s8,s8,-1024 # c00 <_entry-0x7ffff400> + 8000406e: a041 j 800040ee <filewrite+0xcc> + ret = pipewrite(f->pipe, addr, n); + 80004070: 6908 ld a0,16(a0) + 80004072: 1e2000ef jal ra,80004254 <pipewrite> + 80004076: 8a2a mv s4,a0 + 80004078: a071 j 80004104 <filewrite+0xe2> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + 8000407a: 02451783 lh a5,36(a0) + 8000407e: 03079693 slli a3,a5,0x30 + 80004082: 92c1 srli a3,a3,0x30 + 80004084: 4725 li a4,9 + 80004086: 0ad76663 bltu a4,a3,80004132 <filewrite+0x110> + 8000408a: 0792 slli a5,a5,0x4 + 8000408c: 0001d717 auipc a4,0x1d + 80004090: 5cc70713 addi a4,a4,1484 # 80021658 <devsw> + 80004094: 97ba add a5,a5,a4 + 80004096: 679c ld a5,8(a5) + 80004098: cfd9 beqz a5,80004136 <filewrite+0x114> + ret = devsw[f->major].write(1, addr, n); + 8000409a: 4505 li a0,1 + 8000409c: 9782 jalr a5 + 8000409e: 8a2a mv s4,a0 + 800040a0: a095 j 80004104 <filewrite+0xe2> + 800040a2: 00048a9b sext.w s5,s1 + int n1 = n - i; + if(n1 > max) + n1 = max; + + begin_op(); + 800040a6: 9b1ff0ef jal ra,80003a56 <begin_op> + ilock(f->ip); + 800040aa: 01893503 ld a0,24(s2) + 800040ae: 914ff0ef jal ra,800031c2 <ilock> + if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0) + 800040b2: 8756 mv a4,s5 + 800040b4: 02092683 lw a3,32(s2) + 800040b8: 01698633 add a2,s3,s6 + 800040bc: 4585 li a1,1 + 800040be: 01893503 ld a0,24(s2) + 800040c2: c34ff0ef jal ra,800034f6 <writei> + 800040c6: 84aa mv s1,a0 + 800040c8: 00a05763 blez a0,800040d6 <filewrite+0xb4> + f->off += r; + 800040cc: 02092783 lw a5,32(s2) + 800040d0: 9fa9 addw a5,a5,a0 + 800040d2: 02f92023 sw a5,32(s2) + iunlock(f->ip); + 800040d6: 01893503 ld a0,24(s2) + 800040da: 992ff0ef jal ra,8000326c <iunlock> + end_op(); + 800040de: 9e7ff0ef jal ra,80003ac4 <end_op> + + if(r != n1){ + 800040e2: 009a9f63 bne s5,s1,80004100 <filewrite+0xde> + // error from writei + break; + } + i += r; + 800040e6: 013489bb addw s3,s1,s3 + while(i < n){ + 800040ea: 0149db63 bge s3,s4,80004100 <filewrite+0xde> + int n1 = n - i; + 800040ee: 413a04bb subw s1,s4,s3 + 800040f2: 0004879b sext.w a5,s1 + 800040f6: fafbd6e3 bge s7,a5,800040a2 <filewrite+0x80> + 800040fa: 84e2 mv s1,s8 + 800040fc: b75d j 800040a2 <filewrite+0x80> + int i = 0; + 800040fe: 4981 li s3,0 + } + ret = (i == n ? n : -1); + 80004100: 013a1f63 bne s4,s3,8000411e <filewrite+0xfc> + } else { + panic("filewrite"); + } + + return ret; +} + 80004104: 8552 mv a0,s4 + 80004106: 60a6 ld ra,72(sp) + 80004108: 6406 ld s0,64(sp) + 8000410a: 74e2 ld s1,56(sp) + 8000410c: 7942 ld s2,48(sp) + 8000410e: 79a2 ld s3,40(sp) + 80004110: 7a02 ld s4,32(sp) + 80004112: 6ae2 ld s5,24(sp) + 80004114: 6b42 ld s6,16(sp) + 80004116: 6ba2 ld s7,8(sp) + 80004118: 6c02 ld s8,0(sp) + 8000411a: 6161 addi sp,sp,80 + 8000411c: 8082 ret + ret = (i == n ? n : -1); + 8000411e: 5a7d li s4,-1 + 80004120: b7d5 j 80004104 <filewrite+0xe2> + panic("filewrite"); + 80004122: 00003517 auipc a0,0x3 + 80004126: 76650513 addi a0,a0,1894 # 80007888 <syscall_name+0x270> + 8000412a: e2cfc0ef jal ra,80000756 <panic> + return -1; + 8000412e: 5a7d li s4,-1 + 80004130: bfd1 j 80004104 <filewrite+0xe2> + return -1; + 80004132: 5a7d li s4,-1 + 80004134: bfc1 j 80004104 <filewrite+0xe2> + 80004136: 5a7d li s4,-1 + 80004138: b7f1 j 80004104 <filewrite+0xe2> + +000000008000413a <pipealloc>: + int writeopen; // write fd is still open +}; + +int +pipealloc(struct file **f0, struct file **f1) +{ + 8000413a: 7179 addi sp,sp,-48 + 8000413c: f406 sd ra,40(sp) + 8000413e: f022 sd s0,32(sp) + 80004140: ec26 sd s1,24(sp) + 80004142: e84a sd s2,16(sp) + 80004144: e44e sd s3,8(sp) + 80004146: e052 sd s4,0(sp) + 80004148: 1800 addi s0,sp,48 + 8000414a: 84aa mv s1,a0 + 8000414c: 8a2e mv s4,a1 + struct pipe *pi; + + pi = 0; + *f0 = *f1 = 0; + 8000414e: 0005b023 sd zero,0(a1) + 80004152: 00053023 sd zero,0(a0) + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) + 80004156: c75ff0ef jal ra,80003dca <filealloc> + 8000415a: e088 sd a0,0(s1) + 8000415c: cd35 beqz a0,800041d8 <pipealloc+0x9e> + 8000415e: c6dff0ef jal ra,80003dca <filealloc> + 80004162: 00aa3023 sd a0,0(s4) + 80004166: c52d beqz a0,800041d0 <pipealloc+0x96> + goto bad; + if((pi = (struct pipe*)kalloc()) == 0) + 80004168: 961fc0ef jal ra,80000ac8 <kalloc> + 8000416c: 892a mv s2,a0 + 8000416e: cd31 beqz a0,800041ca <pipealloc+0x90> + goto bad; + pi->readopen = 1; + 80004170: 4985 li s3,1 + 80004172: 23352023 sw s3,544(a0) + pi->writeopen = 1; + 80004176: 23352223 sw s3,548(a0) + pi->nwrite = 0; + 8000417a: 20052e23 sw zero,540(a0) + pi->nread = 0; + 8000417e: 20052c23 sw zero,536(a0) + initlock(&pi->lock, "pipe"); + 80004182: 00003597 auipc a1,0x3 + 80004186: 32658593 addi a1,a1,806 # 800074a8 <states.0+0x1a8> + 8000418a: 98ffc0ef jal ra,80000b18 <initlock> + (*f0)->type = FD_PIPE; + 8000418e: 609c ld a5,0(s1) + 80004190: 0137a023 sw s3,0(a5) + (*f0)->readable = 1; + 80004194: 609c ld a5,0(s1) + 80004196: 01378423 sb s3,8(a5) + (*f0)->writable = 0; + 8000419a: 609c ld a5,0(s1) + 8000419c: 000784a3 sb zero,9(a5) + (*f0)->pipe = pi; + 800041a0: 609c ld a5,0(s1) + 800041a2: 0127b823 sd s2,16(a5) + (*f1)->type = FD_PIPE; + 800041a6: 000a3783 ld a5,0(s4) + 800041aa: 0137a023 sw s3,0(a5) + (*f1)->readable = 0; + 800041ae: 000a3783 ld a5,0(s4) + 800041b2: 00078423 sb zero,8(a5) + (*f1)->writable = 1; + 800041b6: 000a3783 ld a5,0(s4) + 800041ba: 013784a3 sb s3,9(a5) + (*f1)->pipe = pi; + 800041be: 000a3783 ld a5,0(s4) + 800041c2: 0127b823 sd s2,16(a5) + return 0; + 800041c6: 4501 li a0,0 + 800041c8: a005 j 800041e8 <pipealloc+0xae> + + bad: + if(pi) + kfree((char*)pi); + if(*f0) + 800041ca: 6088 ld a0,0(s1) + 800041cc: e501 bnez a0,800041d4 <pipealloc+0x9a> + 800041ce: a029 j 800041d8 <pipealloc+0x9e> + 800041d0: 6088 ld a0,0(s1) + 800041d2: c11d beqz a0,800041f8 <pipealloc+0xbe> + fileclose(*f0); + 800041d4: c9bff0ef jal ra,80003e6e <fileclose> + if(*f1) + 800041d8: 000a3783 ld a5,0(s4) + fileclose(*f1); + return -1; + 800041dc: 557d li a0,-1 + if(*f1) + 800041de: c789 beqz a5,800041e8 <pipealloc+0xae> + fileclose(*f1); + 800041e0: 853e mv a0,a5 + 800041e2: c8dff0ef jal ra,80003e6e <fileclose> + return -1; + 800041e6: 557d li a0,-1 +} + 800041e8: 70a2 ld ra,40(sp) + 800041ea: 7402 ld s0,32(sp) + 800041ec: 64e2 ld s1,24(sp) + 800041ee: 6942 ld s2,16(sp) + 800041f0: 69a2 ld s3,8(sp) + 800041f2: 6a02 ld s4,0(sp) + 800041f4: 6145 addi sp,sp,48 + 800041f6: 8082 ret + return -1; + 800041f8: 557d li a0,-1 + 800041fa: b7fd j 800041e8 <pipealloc+0xae> + +00000000800041fc <pipeclose>: + +void +pipeclose(struct pipe *pi, int writable) +{ + 800041fc: 1101 addi sp,sp,-32 + 800041fe: ec06 sd ra,24(sp) + 80004200: e822 sd s0,16(sp) + 80004202: e426 sd s1,8(sp) + 80004204: e04a sd s2,0(sp) + 80004206: 1000 addi s0,sp,32 + 80004208: 84aa mv s1,a0 + 8000420a: 892e mv s2,a1 + acquire(&pi->lock); + 8000420c: 98dfc0ef jal ra,80000b98 <acquire> + if(writable){ + 80004210: 02090763 beqz s2,8000423e <pipeclose+0x42> + pi->writeopen = 0; + 80004214: 2204a223 sw zero,548(s1) + wakeup(&pi->nread); + 80004218: 21848513 addi a0,s1,536 + 8000421c: c4dfd0ef jal ra,80001e68 <wakeup> + } else { + pi->readopen = 0; + wakeup(&pi->nwrite); + } + if(pi->readopen == 0 && pi->writeopen == 0){ + 80004220: 2204b783 ld a5,544(s1) + 80004224: e785 bnez a5,8000424c <pipeclose+0x50> + release(&pi->lock); + 80004226: 8526 mv a0,s1 + 80004228: a09fc0ef jal ra,80000c30 <release> + kfree((char*)pi); + 8000422c: 8526 mv a0,s1 + 8000422e: fb8fc0ef jal ra,800009e6 <kfree> + } else + release(&pi->lock); +} + 80004232: 60e2 ld ra,24(sp) + 80004234: 6442 ld s0,16(sp) + 80004236: 64a2 ld s1,8(sp) + 80004238: 6902 ld s2,0(sp) + 8000423a: 6105 addi sp,sp,32 + 8000423c: 8082 ret + pi->readopen = 0; + 8000423e: 2204a023 sw zero,544(s1) + wakeup(&pi->nwrite); + 80004242: 21c48513 addi a0,s1,540 + 80004246: c23fd0ef jal ra,80001e68 <wakeup> + 8000424a: bfd9 j 80004220 <pipeclose+0x24> + release(&pi->lock); + 8000424c: 8526 mv a0,s1 + 8000424e: 9e3fc0ef jal ra,80000c30 <release> +} + 80004252: b7c5 j 80004232 <pipeclose+0x36> + +0000000080004254 <pipewrite>: + +int +pipewrite(struct pipe *pi, uint64 addr, int n) +{ + 80004254: 711d addi sp,sp,-96 + 80004256: ec86 sd ra,88(sp) + 80004258: e8a2 sd s0,80(sp) + 8000425a: e4a6 sd s1,72(sp) + 8000425c: e0ca sd s2,64(sp) + 8000425e: fc4e sd s3,56(sp) + 80004260: f852 sd s4,48(sp) + 80004262: f456 sd s5,40(sp) + 80004264: f05a sd s6,32(sp) + 80004266: ec5e sd s7,24(sp) + 80004268: e862 sd s8,16(sp) + 8000426a: 1080 addi s0,sp,96 + 8000426c: 84aa mv s1,a0 + 8000426e: 8aae mv s5,a1 + 80004270: 8a32 mv s4,a2 + int i = 0; + struct proc *pr = myproc(); + 80004272: db8fd0ef jal ra,8000182a <myproc> + 80004276: 89aa mv s3,a0 + + acquire(&pi->lock); + 80004278: 8526 mv a0,s1 + 8000427a: 91ffc0ef jal ra,80000b98 <acquire> + while(i < n){ + 8000427e: 09405c63 blez s4,80004316 <pipewrite+0xc2> + int i = 0; + 80004282: 4901 li s2,0 + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + wakeup(&pi->nread); + sleep(&pi->nwrite, &pi->lock); + } else { + char ch; + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 80004284: 5b7d li s6,-1 + wakeup(&pi->nread); + 80004286: 21848c13 addi s8,s1,536 + sleep(&pi->nwrite, &pi->lock); + 8000428a: 21c48b93 addi s7,s1,540 + 8000428e: a81d j 800042c4 <pipewrite+0x70> + release(&pi->lock); + 80004290: 8526 mv a0,s1 + 80004292: 99ffc0ef jal ra,80000c30 <release> + return -1; + 80004296: 597d li s2,-1 + } + wakeup(&pi->nread); + release(&pi->lock); + + return i; +} + 80004298: 854a mv a0,s2 + 8000429a: 60e6 ld ra,88(sp) + 8000429c: 6446 ld s0,80(sp) + 8000429e: 64a6 ld s1,72(sp) + 800042a0: 6906 ld s2,64(sp) + 800042a2: 79e2 ld s3,56(sp) + 800042a4: 7a42 ld s4,48(sp) + 800042a6: 7aa2 ld s5,40(sp) + 800042a8: 7b02 ld s6,32(sp) + 800042aa: 6be2 ld s7,24(sp) + 800042ac: 6c42 ld s8,16(sp) + 800042ae: 6125 addi sp,sp,96 + 800042b0: 8082 ret + wakeup(&pi->nread); + 800042b2: 8562 mv a0,s8 + 800042b4: bb5fd0ef jal ra,80001e68 <wakeup> + sleep(&pi->nwrite, &pi->lock); + 800042b8: 85a6 mv a1,s1 + 800042ba: 855e mv a0,s7 + 800042bc: b61fd0ef jal ra,80001e1c <sleep> + while(i < n){ + 800042c0: 05495c63 bge s2,s4,80004318 <pipewrite+0xc4> + if(pi->readopen == 0 || killed(pr)){ + 800042c4: 2204a783 lw a5,544(s1) + 800042c8: d7e1 beqz a5,80004290 <pipewrite+0x3c> + 800042ca: 854e mv a0,s3 + 800042cc: d89fd0ef jal ra,80002054 <killed> + 800042d0: f161 bnez a0,80004290 <pipewrite+0x3c> + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + 800042d2: 2184a783 lw a5,536(s1) + 800042d6: 21c4a703 lw a4,540(s1) + 800042da: 2007879b addiw a5,a5,512 + 800042de: fcf70ae3 beq a4,a5,800042b2 <pipewrite+0x5e> + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 800042e2: 4685 li a3,1 + 800042e4: 01590633 add a2,s2,s5 + 800042e8: faf40593 addi a1,s0,-81 + 800042ec: 0509b503 ld a0,80(s3) + 800042f0: aaafd0ef jal ra,8000159a <copyin> + 800042f4: 03650263 beq a0,s6,80004318 <pipewrite+0xc4> + pi->data[pi->nwrite++ % PIPESIZE] = ch; + 800042f8: 21c4a783 lw a5,540(s1) + 800042fc: 0017871b addiw a4,a5,1 + 80004300: 20e4ae23 sw a4,540(s1) + 80004304: 1ff7f793 andi a5,a5,511 + 80004308: 97a6 add a5,a5,s1 + 8000430a: faf44703 lbu a4,-81(s0) + 8000430e: 00e78c23 sb a4,24(a5) + i++; + 80004312: 2905 addiw s2,s2,1 + 80004314: b775 j 800042c0 <pipewrite+0x6c> + int i = 0; + 80004316: 4901 li s2,0 + wakeup(&pi->nread); + 80004318: 21848513 addi a0,s1,536 + 8000431c: b4dfd0ef jal ra,80001e68 <wakeup> + release(&pi->lock); + 80004320: 8526 mv a0,s1 + 80004322: 90ffc0ef jal ra,80000c30 <release> + return i; + 80004326: bf8d j 80004298 <pipewrite+0x44> + +0000000080004328 <piperead>: + +int +piperead(struct pipe *pi, uint64 addr, int n) +{ + 80004328: 715d addi sp,sp,-80 + 8000432a: e486 sd ra,72(sp) + 8000432c: e0a2 sd s0,64(sp) + 8000432e: fc26 sd s1,56(sp) + 80004330: f84a sd s2,48(sp) + 80004332: f44e sd s3,40(sp) + 80004334: f052 sd s4,32(sp) + 80004336: ec56 sd s5,24(sp) + 80004338: e85a sd s6,16(sp) + 8000433a: 0880 addi s0,sp,80 + 8000433c: 84aa mv s1,a0 + 8000433e: 892e mv s2,a1 + 80004340: 8ab2 mv s5,a2 + int i; + struct proc *pr = myproc(); + 80004342: ce8fd0ef jal ra,8000182a <myproc> + 80004346: 8a2a mv s4,a0 + char ch; + + acquire(&pi->lock); + 80004348: 8526 mv a0,s1 + 8000434a: 84ffc0ef jal ra,80000b98 <acquire> + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 8000434e: 2184a703 lw a4,536(s1) + 80004352: 21c4a783 lw a5,540(s1) + if(killed(pr)){ + release(&pi->lock); + return -1; + } + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 80004356: 21848993 addi s3,s1,536 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 8000435a: 02f71363 bne a4,a5,80004380 <piperead+0x58> + 8000435e: 2244a783 lw a5,548(s1) + 80004362: cf99 beqz a5,80004380 <piperead+0x58> + if(killed(pr)){ + 80004364: 8552 mv a0,s4 + 80004366: ceffd0ef jal ra,80002054 <killed> + 8000436a: e149 bnez a0,800043ec <piperead+0xc4> + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 8000436c: 85a6 mv a1,s1 + 8000436e: 854e mv a0,s3 + 80004370: aadfd0ef jal ra,80001e1c <sleep> + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 80004374: 2184a703 lw a4,536(s1) + 80004378: 21c4a783 lw a5,540(s1) + 8000437c: fef701e3 beq a4,a5,8000435e <piperead+0x36> + } + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004380: 4981 li s3,0 + if(pi->nread == pi->nwrite) + break; + ch = pi->data[pi->nread++ % PIPESIZE]; + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) + 80004382: 5b7d li s6,-1 + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004384: 05505263 blez s5,800043c8 <piperead+0xa0> + if(pi->nread == pi->nwrite) + 80004388: 2184a783 lw a5,536(s1) + 8000438c: 21c4a703 lw a4,540(s1) + 80004390: 02f70c63 beq a4,a5,800043c8 <piperead+0xa0> + ch = pi->data[pi->nread++ % PIPESIZE]; + 80004394: 0017871b addiw a4,a5,1 + 80004398: 20e4ac23 sw a4,536(s1) + 8000439c: 1ff7f793 andi a5,a5,511 + 800043a0: 97a6 add a5,a5,s1 + 800043a2: 0187c783 lbu a5,24(a5) + 800043a6: faf40fa3 sb a5,-65(s0) + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) + 800043aa: 4685 li a3,1 + 800043ac: fbf40613 addi a2,s0,-65 + 800043b0: 85ca mv a1,s2 + 800043b2: 050a3503 ld a0,80(s4) + 800043b6: 92cfd0ef jal ra,800014e2 <copyout> + 800043ba: 01650763 beq a0,s6,800043c8 <piperead+0xa0> + for(i = 0; i < n; i++){ //DOC: piperead-copy + 800043be: 2985 addiw s3,s3,1 + 800043c0: 0905 addi s2,s2,1 + 800043c2: fd3a93e3 bne s5,s3,80004388 <piperead+0x60> + 800043c6: 89d6 mv s3,s5 + break; + } + wakeup(&pi->nwrite); //DOC: piperead-wakeup + 800043c8: 21c48513 addi a0,s1,540 + 800043cc: a9dfd0ef jal ra,80001e68 <wakeup> + release(&pi->lock); + 800043d0: 8526 mv a0,s1 + 800043d2: 85ffc0ef jal ra,80000c30 <release> + return i; +} + 800043d6: 854e mv a0,s3 + 800043d8: 60a6 ld ra,72(sp) + 800043da: 6406 ld s0,64(sp) + 800043dc: 74e2 ld s1,56(sp) + 800043de: 7942 ld s2,48(sp) + 800043e0: 79a2 ld s3,40(sp) + 800043e2: 7a02 ld s4,32(sp) + 800043e4: 6ae2 ld s5,24(sp) + 800043e6: 6b42 ld s6,16(sp) + 800043e8: 6161 addi sp,sp,80 + 800043ea: 8082 ret + release(&pi->lock); + 800043ec: 8526 mv a0,s1 + 800043ee: 843fc0ef jal ra,80000c30 <release> + return -1; + 800043f2: 59fd li s3,-1 + 800043f4: b7cd j 800043d6 <piperead+0xae> + +00000000800043f6 <flags2perm>: +#include "elf.h" + +static int loadseg(pde_t *, uint64, struct inode *, uint, uint); + +int flags2perm(int flags) +{ + 800043f6: 1141 addi sp,sp,-16 + 800043f8: e422 sd s0,8(sp) + 800043fa: 0800 addi s0,sp,16 + 800043fc: 87aa mv a5,a0 + int perm = 0; + if(flags & 0x1) + 800043fe: 8905 andi a0,a0,1 + 80004400: 050e slli a0,a0,0x3 + perm = PTE_X; + if(flags & 0x2) + 80004402: 8b89 andi a5,a5,2 + 80004404: c399 beqz a5,8000440a <flags2perm+0x14> + perm |= PTE_W; + 80004406: 00456513 ori a0,a0,4 + return perm; +} + 8000440a: 6422 ld s0,8(sp) + 8000440c: 0141 addi sp,sp,16 + 8000440e: 8082 ret + +0000000080004410 <exec>: + +int +exec(char *path, char **argv) +{ + 80004410: de010113 addi sp,sp,-544 + 80004414: 20113c23 sd ra,536(sp) + 80004418: 20813823 sd s0,528(sp) + 8000441c: 20913423 sd s1,520(sp) + 80004420: 21213023 sd s2,512(sp) + 80004424: ffce sd s3,504(sp) + 80004426: fbd2 sd s4,496(sp) + 80004428: f7d6 sd s5,488(sp) + 8000442a: f3da sd s6,480(sp) + 8000442c: efde sd s7,472(sp) + 8000442e: ebe2 sd s8,464(sp) + 80004430: e7e6 sd s9,456(sp) + 80004432: e3ea sd s10,448(sp) + 80004434: ff6e sd s11,440(sp) + 80004436: 1400 addi s0,sp,544 + 80004438: 892a mv s2,a0 + 8000443a: dea43423 sd a0,-536(s0) + 8000443e: deb43823 sd a1,-528(s0) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pagetable_t pagetable = 0, oldpagetable; + struct proc *p = myproc(); + 80004442: be8fd0ef jal ra,8000182a <myproc> + 80004446: 84aa mv s1,a0 + + begin_op(); + 80004448: e0eff0ef jal ra,80003a56 <begin_op> + + if((ip = namei(path)) == 0){ + 8000444c: 854a mv a0,s2 + 8000444e: c2cff0ef jal ra,8000387a <namei> + 80004452: c13d beqz a0,800044b8 <exec+0xa8> + 80004454: 8aaa mv s5,a0 + end_op(); + return -1; + } + ilock(ip); + 80004456: d6dfe0ef jal ra,800031c2 <ilock> + + // Check ELF header + if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf)) + 8000445a: 04000713 li a4,64 + 8000445e: 4681 li a3,0 + 80004460: e5040613 addi a2,s0,-432 + 80004464: 4581 li a1,0 + 80004466: 8556 mv a0,s5 + 80004468: fabfe0ef jal ra,80003412 <readi> + 8000446c: 04000793 li a5,64 + 80004470: 00f51a63 bne a0,a5,80004484 <exec+0x74> + goto bad; + + if(elf.magic != ELF_MAGIC) + 80004474: e5042703 lw a4,-432(s0) + 80004478: 464c47b7 lui a5,0x464c4 + 8000447c: 57f78793 addi a5,a5,1407 # 464c457f <_entry-0x39b3ba81> + 80004480: 04f70063 beq a4,a5,800044c0 <exec+0xb0> + + bad: + if(pagetable) + proc_freepagetable(pagetable, sz); + if(ip){ + iunlockput(ip); + 80004484: 8556 mv a0,s5 + 80004486: f43fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 8000448a: e3aff0ef jal ra,80003ac4 <end_op> + } + return -1; + 8000448e: 557d li a0,-1 +} + 80004490: 21813083 ld ra,536(sp) + 80004494: 21013403 ld s0,528(sp) + 80004498: 20813483 ld s1,520(sp) + 8000449c: 20013903 ld s2,512(sp) + 800044a0: 79fe ld s3,504(sp) + 800044a2: 7a5e ld s4,496(sp) + 800044a4: 7abe ld s5,488(sp) + 800044a6: 7b1e ld s6,480(sp) + 800044a8: 6bfe ld s7,472(sp) + 800044aa: 6c5e ld s8,464(sp) + 800044ac: 6cbe ld s9,456(sp) + 800044ae: 6d1e ld s10,448(sp) + 800044b0: 7dfa ld s11,440(sp) + 800044b2: 22010113 addi sp,sp,544 + 800044b6: 8082 ret + end_op(); + 800044b8: e0cff0ef jal ra,80003ac4 <end_op> + return -1; + 800044bc: 557d li a0,-1 + 800044be: bfc9 j 80004490 <exec+0x80> + if((pagetable = proc_pagetable(p)) == 0) + 800044c0: 8526 mv a0,s1 + 800044c2: c10fd0ef jal ra,800018d2 <proc_pagetable> + 800044c6: 8b2a mv s6,a0 + 800044c8: dd55 beqz a0,80004484 <exec+0x74> + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ + 800044ca: e7042783 lw a5,-400(s0) + 800044ce: e8845703 lhu a4,-376(s0) + 800044d2: c325 beqz a4,80004532 <exec+0x122> + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 800044d4: 4901 li s2,0 + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ + 800044d6: e0043423 sd zero,-504(s0) + if(ph.vaddr % PGSIZE != 0) + 800044da: 6a05 lui s4,0x1 + 800044dc: fffa0713 addi a4,s4,-1 # fff <_entry-0x7ffff001> + 800044e0: dee43023 sd a4,-544(s0) +loadseg(pagetable_t pagetable, uint64 va, struct inode *ip, uint offset, uint sz) +{ + uint i, n; + uint64 pa; + + for(i = 0; i < sz; i += PGSIZE){ + 800044e4: 6d85 lui s11,0x1 + 800044e6: 7d7d lui s10,0xfffff + 800044e8: a409 j 800046ea <exec+0x2da> + pa = walkaddr(pagetable, va + i); + if(pa == 0) + panic("loadseg: address should exist"); + 800044ea: 00003517 auipc a0,0x3 + 800044ee: 3ae50513 addi a0,a0,942 # 80007898 <syscall_name+0x280> + 800044f2: a64fc0ef jal ra,80000756 <panic> + if(sz - i < PGSIZE) + n = sz - i; + else + n = PGSIZE; + if(readi(ip, 0, (uint64)pa, offset+i, n) != n) + 800044f6: 874a mv a4,s2 + 800044f8: 009c86bb addw a3,s9,s1 + 800044fc: 4581 li a1,0 + 800044fe: 8556 mv a0,s5 + 80004500: f13fe0ef jal ra,80003412 <readi> + 80004504: 2501 sext.w a0,a0 + 80004506: 18a91163 bne s2,a0,80004688 <exec+0x278> + for(i = 0; i < sz; i += PGSIZE){ + 8000450a: 009d84bb addw s1,s11,s1 + 8000450e: 013d09bb addw s3,s10,s3 + 80004512: 1b74fc63 bgeu s1,s7,800046ca <exec+0x2ba> + pa = walkaddr(pagetable, va + i); + 80004516: 02049593 slli a1,s1,0x20 + 8000451a: 9181 srli a1,a1,0x20 + 8000451c: 95e2 add a1,a1,s8 + 8000451e: 855a mv a0,s6 + 80004520: a63fc0ef jal ra,80000f82 <walkaddr> + 80004524: 862a mv a2,a0 + if(pa == 0) + 80004526: d171 beqz a0,800044ea <exec+0xda> + n = PGSIZE; + 80004528: 8952 mv s2,s4 + if(sz - i < PGSIZE) + 8000452a: fd49f6e3 bgeu s3,s4,800044f6 <exec+0xe6> + n = sz - i; + 8000452e: 894e mv s2,s3 + 80004530: b7d9 j 800044f6 <exec+0xe6> + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 80004532: 4901 li s2,0 + iunlockput(ip); + 80004534: 8556 mv a0,s5 + 80004536: e93fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 8000453a: d8aff0ef jal ra,80003ac4 <end_op> + p = myproc(); + 8000453e: aecfd0ef jal ra,8000182a <myproc> + 80004542: 8baa mv s7,a0 + uint64 oldsz = p->sz; + 80004544: 04853d03 ld s10,72(a0) + sz = PGROUNDUP(sz); + 80004548: 6785 lui a5,0x1 + 8000454a: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 8000454c: 97ca add a5,a5,s2 + 8000454e: 777d lui a4,0xfffff + 80004550: 8ff9 and a5,a5,a4 + 80004552: def43c23 sd a5,-520(s0) + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) + 80004556: 4691 li a3,4 + 80004558: 6609 lui a2,0x2 + 8000455a: 963e add a2,a2,a5 + 8000455c: 85be mv a1,a5 + 8000455e: 855a mv a0,s6 + 80004560: d7bfc0ef jal ra,800012da <uvmalloc> + 80004564: 8c2a mv s8,a0 + ip = 0; + 80004566: 4a81 li s5,0 + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) + 80004568: 12050063 beqz a0,80004688 <exec+0x278> + uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE); + 8000456c: 75f9 lui a1,0xffffe + 8000456e: 95aa add a1,a1,a0 + 80004570: 855a mv a0,s6 + 80004572: f47fc0ef jal ra,800014b8 <uvmclear> + stackbase = sp - USERSTACK*PGSIZE; + 80004576: 7afd lui s5,0xfffff + 80004578: 9ae2 add s5,s5,s8 + for(argc = 0; argv[argc]; argc++) { + 8000457a: df043783 ld a5,-528(s0) + 8000457e: 6388 ld a0,0(a5) + 80004580: c135 beqz a0,800045e4 <exec+0x1d4> + 80004582: e9040993 addi s3,s0,-368 + 80004586: f9040c93 addi s9,s0,-112 + sp = sz; + 8000458a: 8962 mv s2,s8 + for(argc = 0; argv[argc]; argc++) { + 8000458c: 4481 li s1,0 + sp -= strlen(argv[argc]) + 1; + 8000458e: 857fc0ef jal ra,80000de4 <strlen> + 80004592: 0015079b addiw a5,a0,1 + 80004596: 40f907b3 sub a5,s2,a5 + sp -= sp % 16; // riscv sp must be 16-byte aligned + 8000459a: ff07f913 andi s2,a5,-16 + if(sp < stackbase) + 8000459e: 11596a63 bltu s2,s5,800046b2 <exec+0x2a2> + if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) + 800045a2: df043d83 ld s11,-528(s0) + 800045a6: 000dba03 ld s4,0(s11) # 1000 <_entry-0x7ffff000> + 800045aa: 8552 mv a0,s4 + 800045ac: 839fc0ef jal ra,80000de4 <strlen> + 800045b0: 0015069b addiw a3,a0,1 + 800045b4: 8652 mv a2,s4 + 800045b6: 85ca mv a1,s2 + 800045b8: 855a mv a0,s6 + 800045ba: f29fc0ef jal ra,800014e2 <copyout> + 800045be: 0e054e63 bltz a0,800046ba <exec+0x2aa> + ustack[argc] = sp; + 800045c2: 0129b023 sd s2,0(s3) + for(argc = 0; argv[argc]; argc++) { + 800045c6: 0485 addi s1,s1,1 + 800045c8: 008d8793 addi a5,s11,8 + 800045cc: def43823 sd a5,-528(s0) + 800045d0: 008db503 ld a0,8(s11) + 800045d4: c911 beqz a0,800045e8 <exec+0x1d8> + if(argc >= MAXARG) + 800045d6: 09a1 addi s3,s3,8 + 800045d8: fb3c9be3 bne s9,s3,8000458e <exec+0x17e> + sz = sz1; + 800045dc: df843c23 sd s8,-520(s0) + ip = 0; + 800045e0: 4a81 li s5,0 + 800045e2: a05d j 80004688 <exec+0x278> + sp = sz; + 800045e4: 8962 mv s2,s8 + for(argc = 0; argv[argc]; argc++) { + 800045e6: 4481 li s1,0 + ustack[argc] = 0; + 800045e8: 00349793 slli a5,s1,0x3 + 800045ec: f9078793 addi a5,a5,-112 + 800045f0: 97a2 add a5,a5,s0 + 800045f2: f007b023 sd zero,-256(a5) + sp -= (argc+1) * sizeof(uint64); + 800045f6: 00148693 addi a3,s1,1 + 800045fa: 068e slli a3,a3,0x3 + 800045fc: 40d90933 sub s2,s2,a3 + sp -= sp % 16; + 80004600: ff097913 andi s2,s2,-16 + if(sp < stackbase) + 80004604: 01597663 bgeu s2,s5,80004610 <exec+0x200> + sz = sz1; + 80004608: df843c23 sd s8,-520(s0) + ip = 0; + 8000460c: 4a81 li s5,0 + 8000460e: a8ad j 80004688 <exec+0x278> + if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) + 80004610: e9040613 addi a2,s0,-368 + 80004614: 85ca mv a1,s2 + 80004616: 855a mv a0,s6 + 80004618: ecbfc0ef jal ra,800014e2 <copyout> + 8000461c: 0a054363 bltz a0,800046c2 <exec+0x2b2> + p->trapframe->a1 = sp; + 80004620: 058bb783 ld a5,88(s7) + 80004624: 0727bc23 sd s2,120(a5) + for(last=s=path; *s; s++) + 80004628: de843783 ld a5,-536(s0) + 8000462c: 0007c703 lbu a4,0(a5) + 80004630: cf11 beqz a4,8000464c <exec+0x23c> + 80004632: 0785 addi a5,a5,1 + if(*s == '/') + 80004634: 02f00693 li a3,47 + 80004638: a039 j 80004646 <exec+0x236> + last = s+1; + 8000463a: def43423 sd a5,-536(s0) + for(last=s=path; *s; s++) + 8000463e: 0785 addi a5,a5,1 + 80004640: fff7c703 lbu a4,-1(a5) + 80004644: c701 beqz a4,8000464c <exec+0x23c> + if(*s == '/') + 80004646: fed71ce3 bne a4,a3,8000463e <exec+0x22e> + 8000464a: bfc5 j 8000463a <exec+0x22a> + safestrcpy(p->name, last, sizeof(p->name)); + 8000464c: 4641 li a2,16 + 8000464e: de843583 ld a1,-536(s0) + 80004652: 158b8513 addi a0,s7,344 + 80004656: f5cfc0ef jal ra,80000db2 <safestrcpy> + oldpagetable = p->pagetable; + 8000465a: 050bb503 ld a0,80(s7) + p->pagetable = pagetable; + 8000465e: 056bb823 sd s6,80(s7) + p->sz = sz; + 80004662: 058bb423 sd s8,72(s7) + p->trapframe->epc = elf.entry; // initial program counter = main + 80004666: 058bb783 ld a5,88(s7) + 8000466a: e6843703 ld a4,-408(s0) + 8000466e: ef98 sd a4,24(a5) + p->trapframe->sp = sp; // initial stack pointer + 80004670: 058bb783 ld a5,88(s7) + 80004674: 0327b823 sd s2,48(a5) + proc_freepagetable(oldpagetable, oldsz); + 80004678: 85ea mv a1,s10 + 8000467a: adcfd0ef jal ra,80001956 <proc_freepagetable> + return argc; // this ends up in a0, the first argument to main(argc, argv) + 8000467e: 0004851b sext.w a0,s1 + 80004682: b539 j 80004490 <exec+0x80> + 80004684: df243c23 sd s2,-520(s0) + proc_freepagetable(pagetable, sz); + 80004688: df843583 ld a1,-520(s0) + 8000468c: 855a mv a0,s6 + 8000468e: ac8fd0ef jal ra,80001956 <proc_freepagetable> + if(ip){ + 80004692: de0a99e3 bnez s5,80004484 <exec+0x74> + return -1; + 80004696: 557d li a0,-1 + 80004698: bbe5 j 80004490 <exec+0x80> + 8000469a: df243c23 sd s2,-520(s0) + 8000469e: b7ed j 80004688 <exec+0x278> + 800046a0: df243c23 sd s2,-520(s0) + 800046a4: b7d5 j 80004688 <exec+0x278> + 800046a6: df243c23 sd s2,-520(s0) + 800046aa: bff9 j 80004688 <exec+0x278> + 800046ac: df243c23 sd s2,-520(s0) + 800046b0: bfe1 j 80004688 <exec+0x278> + sz = sz1; + 800046b2: df843c23 sd s8,-520(s0) + ip = 0; + 800046b6: 4a81 li s5,0 + 800046b8: bfc1 j 80004688 <exec+0x278> + sz = sz1; + 800046ba: df843c23 sd s8,-520(s0) + ip = 0; + 800046be: 4a81 li s5,0 + 800046c0: b7e1 j 80004688 <exec+0x278> + sz = sz1; + 800046c2: df843c23 sd s8,-520(s0) + ip = 0; + 800046c6: 4a81 li s5,0 + 800046c8: b7c1 j 80004688 <exec+0x278> + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0) + 800046ca: df843903 ld s2,-520(s0) + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ + 800046ce: e0843783 ld a5,-504(s0) + 800046d2: 0017869b addiw a3,a5,1 + 800046d6: e0d43423 sd a3,-504(s0) + 800046da: e0043783 ld a5,-512(s0) + 800046de: 0387879b addiw a5,a5,56 + 800046e2: e8845703 lhu a4,-376(s0) + 800046e6: e4e6d7e3 bge a3,a4,80004534 <exec+0x124> + if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) + 800046ea: 2781 sext.w a5,a5 + 800046ec: e0f43023 sd a5,-512(s0) + 800046f0: 03800713 li a4,56 + 800046f4: 86be mv a3,a5 + 800046f6: e1840613 addi a2,s0,-488 + 800046fa: 4581 li a1,0 + 800046fc: 8556 mv a0,s5 + 800046fe: d15fe0ef jal ra,80003412 <readi> + 80004702: 03800793 li a5,56 + 80004706: f6f51fe3 bne a0,a5,80004684 <exec+0x274> + if(ph.type != ELF_PROG_LOAD) + 8000470a: e1842783 lw a5,-488(s0) + 8000470e: 4705 li a4,1 + 80004710: fae79fe3 bne a5,a4,800046ce <exec+0x2be> + if(ph.memsz < ph.filesz) + 80004714: e4043483 ld s1,-448(s0) + 80004718: e3843783 ld a5,-456(s0) + 8000471c: f6f4efe3 bltu s1,a5,8000469a <exec+0x28a> + if(ph.vaddr + ph.memsz < ph.vaddr) + 80004720: e2843783 ld a5,-472(s0) + 80004724: 94be add s1,s1,a5 + 80004726: f6f4ede3 bltu s1,a5,800046a0 <exec+0x290> + if(ph.vaddr % PGSIZE != 0) + 8000472a: de043703 ld a4,-544(s0) + 8000472e: 8ff9 and a5,a5,a4 + 80004730: fbbd bnez a5,800046a6 <exec+0x296> + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0) + 80004732: e1c42503 lw a0,-484(s0) + 80004736: cc1ff0ef jal ra,800043f6 <flags2perm> + 8000473a: 86aa mv a3,a0 + 8000473c: 8626 mv a2,s1 + 8000473e: 85ca mv a1,s2 + 80004740: 855a mv a0,s6 + 80004742: b99fc0ef jal ra,800012da <uvmalloc> + 80004746: dea43c23 sd a0,-520(s0) + 8000474a: d12d beqz a0,800046ac <exec+0x29c> + if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) + 8000474c: e2843c03 ld s8,-472(s0) + 80004750: e2042c83 lw s9,-480(s0) + 80004754: e3842b83 lw s7,-456(s0) + for(i = 0; i < sz; i += PGSIZE){ + 80004758: f60b89e3 beqz s7,800046ca <exec+0x2ba> + 8000475c: 89de mv s3,s7 + 8000475e: 4481 li s1,0 + 80004760: bb5d j 80004516 <exec+0x106> + +0000000080004762 <argfd>: + +// Fetch the nth word-sized system call argument as a file descriptor +// and return both the descriptor and the corresponding struct file. +static int +argfd(int n, int *pfd, struct file **pf) +{ + 80004762: 7179 addi sp,sp,-48 + 80004764: f406 sd ra,40(sp) + 80004766: f022 sd s0,32(sp) + 80004768: ec26 sd s1,24(sp) + 8000476a: e84a sd s2,16(sp) + 8000476c: 1800 addi s0,sp,48 + 8000476e: 892e mv s2,a1 + 80004770: 84b2 mv s1,a2 + int fd; + struct file *f; + + argint(n, &fd); + 80004772: fdc40593 addi a1,s0,-36 + 80004776: f89fd0ef jal ra,800026fe <argint> + if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == 0) + 8000477a: fdc42703 lw a4,-36(s0) + 8000477e: 47bd li a5,15 + 80004780: 02e7e963 bltu a5,a4,800047b2 <argfd+0x50> + 80004784: 8a6fd0ef jal ra,8000182a <myproc> + 80004788: fdc42703 lw a4,-36(s0) + 8000478c: 01a70793 addi a5,a4,26 # fffffffffffff01a <end+0xffffffff7ffdc82a> + 80004790: 078e slli a5,a5,0x3 + 80004792: 953e add a0,a0,a5 + 80004794: 611c ld a5,0(a0) + 80004796: c385 beqz a5,800047b6 <argfd+0x54> + return -1; + if(pfd) + 80004798: 00090463 beqz s2,800047a0 <argfd+0x3e> + *pfd = fd; + 8000479c: 00e92023 sw a4,0(s2) + if(pf) + *pf = f; + return 0; + 800047a0: 4501 li a0,0 + if(pf) + 800047a2: c091 beqz s1,800047a6 <argfd+0x44> + *pf = f; + 800047a4: e09c sd a5,0(s1) +} + 800047a6: 70a2 ld ra,40(sp) + 800047a8: 7402 ld s0,32(sp) + 800047aa: 64e2 ld s1,24(sp) + 800047ac: 6942 ld s2,16(sp) + 800047ae: 6145 addi sp,sp,48 + 800047b0: 8082 ret + return -1; + 800047b2: 557d li a0,-1 + 800047b4: bfcd j 800047a6 <argfd+0x44> + 800047b6: 557d li a0,-1 + 800047b8: b7fd j 800047a6 <argfd+0x44> + +00000000800047ba <fdalloc>: + +// Allocate a file descriptor for the given file. +// Takes over file reference from caller on success. +static int +fdalloc(struct file *f) +{ + 800047ba: 1101 addi sp,sp,-32 + 800047bc: ec06 sd ra,24(sp) + 800047be: e822 sd s0,16(sp) + 800047c0: e426 sd s1,8(sp) + 800047c2: 1000 addi s0,sp,32 + 800047c4: 84aa mv s1,a0 + int fd; + struct proc *p = myproc(); + 800047c6: 864fd0ef jal ra,8000182a <myproc> + 800047ca: 862a mv a2,a0 + + for(fd = 0; fd < NOFILE; fd++){ + 800047cc: 0d050793 addi a5,a0,208 + 800047d0: 4501 li a0,0 + 800047d2: 46c1 li a3,16 + if(p->ofile[fd] == 0){ + 800047d4: 6398 ld a4,0(a5) + 800047d6: cb19 beqz a4,800047ec <fdalloc+0x32> + for(fd = 0; fd < NOFILE; fd++){ + 800047d8: 2505 addiw a0,a0,1 + 800047da: 07a1 addi a5,a5,8 + 800047dc: fed51ce3 bne a0,a3,800047d4 <fdalloc+0x1a> + p->ofile[fd] = f; + return fd; + } + } + return -1; + 800047e0: 557d li a0,-1 +} + 800047e2: 60e2 ld ra,24(sp) + 800047e4: 6442 ld s0,16(sp) + 800047e6: 64a2 ld s1,8(sp) + 800047e8: 6105 addi sp,sp,32 + 800047ea: 8082 ret + p->ofile[fd] = f; + 800047ec: 01a50793 addi a5,a0,26 + 800047f0: 078e slli a5,a5,0x3 + 800047f2: 963e add a2,a2,a5 + 800047f4: e204 sd s1,0(a2) + return fd; + 800047f6: b7f5 j 800047e2 <fdalloc+0x28> + +00000000800047f8 <create>: + return -1; +} + +static struct inode* +create(char *path, short type, short major, short minor) +{ + 800047f8: 715d addi sp,sp,-80 + 800047fa: e486 sd ra,72(sp) + 800047fc: e0a2 sd s0,64(sp) + 800047fe: fc26 sd s1,56(sp) + 80004800: f84a sd s2,48(sp) + 80004802: f44e sd s3,40(sp) + 80004804: f052 sd s4,32(sp) + 80004806: ec56 sd s5,24(sp) + 80004808: e85a sd s6,16(sp) + 8000480a: 0880 addi s0,sp,80 + 8000480c: 8b2e mv s6,a1 + 8000480e: 89b2 mv s3,a2 + 80004810: 8936 mv s2,a3 + struct inode *ip, *dp; + char name[DIRSIZ]; + + if((dp = nameiparent(path, name)) == 0) + 80004812: fb040593 addi a1,s0,-80 + 80004816: 87eff0ef jal ra,80003894 <nameiparent> + 8000481a: 84aa mv s1,a0 + 8000481c: 10050b63 beqz a0,80004932 <create+0x13a> + return 0; + + ilock(dp); + 80004820: 9a3fe0ef jal ra,800031c2 <ilock> + + if((ip = dirlookup(dp, name, 0)) != 0){ + 80004824: 4601 li a2,0 + 80004826: fb040593 addi a1,s0,-80 + 8000482a: 8526 mv a0,s1 + 8000482c: de3fe0ef jal ra,8000360e <dirlookup> + 80004830: 8aaa mv s5,a0 + 80004832: c521 beqz a0,8000487a <create+0x82> + iunlockput(dp); + 80004834: 8526 mv a0,s1 + 80004836: b93fe0ef jal ra,800033c8 <iunlockput> + ilock(ip); + 8000483a: 8556 mv a0,s5 + 8000483c: 987fe0ef jal ra,800031c2 <ilock> + if(type == T_FILE && (ip->type == T_FILE || ip->type == T_DEVICE)) + 80004840: 000b059b sext.w a1,s6 + 80004844: 4789 li a5,2 + 80004846: 02f59563 bne a1,a5,80004870 <create+0x78> + 8000484a: 044ad783 lhu a5,68(s5) # fffffffffffff044 <end+0xffffffff7ffdc854> + 8000484e: 37f9 addiw a5,a5,-2 + 80004850: 17c2 slli a5,a5,0x30 + 80004852: 93c1 srli a5,a5,0x30 + 80004854: 4705 li a4,1 + 80004856: 00f76d63 bltu a4,a5,80004870 <create+0x78> + ip->nlink = 0; + iupdate(ip); + iunlockput(ip); + iunlockput(dp); + return 0; +} + 8000485a: 8556 mv a0,s5 + 8000485c: 60a6 ld ra,72(sp) + 8000485e: 6406 ld s0,64(sp) + 80004860: 74e2 ld s1,56(sp) + 80004862: 7942 ld s2,48(sp) + 80004864: 79a2 ld s3,40(sp) + 80004866: 7a02 ld s4,32(sp) + 80004868: 6ae2 ld s5,24(sp) + 8000486a: 6b42 ld s6,16(sp) + 8000486c: 6161 addi sp,sp,80 + 8000486e: 8082 ret + iunlockput(ip); + 80004870: 8556 mv a0,s5 + 80004872: b57fe0ef jal ra,800033c8 <iunlockput> + return 0; + 80004876: 4a81 li s5,0 + 80004878: b7cd j 8000485a <create+0x62> + if((ip = ialloc(dp->dev, type)) == 0){ + 8000487a: 85da mv a1,s6 + 8000487c: 4088 lw a0,0(s1) + 8000487e: fdafe0ef jal ra,80003058 <ialloc> + 80004882: 8a2a mv s4,a0 + 80004884: cd1d beqz a0,800048c2 <create+0xca> + ilock(ip); + 80004886: 93dfe0ef jal ra,800031c2 <ilock> + ip->major = major; + 8000488a: 053a1323 sh s3,70(s4) + ip->minor = minor; + 8000488e: 052a1423 sh s2,72(s4) + ip->nlink = 1; + 80004892: 4905 li s2,1 + 80004894: 052a1523 sh s2,74(s4) + iupdate(ip); + 80004898: 8552 mv a0,s4 + 8000489a: 875fe0ef jal ra,8000310e <iupdate> + if(type == T_DIR){ // Create . and .. entries. + 8000489e: 000b059b sext.w a1,s6 + 800048a2: 03258563 beq a1,s2,800048cc <create+0xd4> + if(dirlink(dp, name, ip->inum) < 0) + 800048a6: 004a2603 lw a2,4(s4) + 800048aa: fb040593 addi a1,s0,-80 + 800048ae: 8526 mv a0,s1 + 800048b0: f31fe0ef jal ra,800037e0 <dirlink> + 800048b4: 06054363 bltz a0,8000491a <create+0x122> + iunlockput(dp); + 800048b8: 8526 mv a0,s1 + 800048ba: b0ffe0ef jal ra,800033c8 <iunlockput> + return ip; + 800048be: 8ad2 mv s5,s4 + 800048c0: bf69 j 8000485a <create+0x62> + iunlockput(dp); + 800048c2: 8526 mv a0,s1 + 800048c4: b05fe0ef jal ra,800033c8 <iunlockput> + return 0; + 800048c8: 8ad2 mv s5,s4 + 800048ca: bf41 j 8000485a <create+0x62> + if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0) + 800048cc: 004a2603 lw a2,4(s4) + 800048d0: 00003597 auipc a1,0x3 + 800048d4: fe858593 addi a1,a1,-24 # 800078b8 <syscall_name+0x2a0> + 800048d8: 8552 mv a0,s4 + 800048da: f07fe0ef jal ra,800037e0 <dirlink> + 800048de: 02054e63 bltz a0,8000491a <create+0x122> + 800048e2: 40d0 lw a2,4(s1) + 800048e4: 00003597 auipc a1,0x3 + 800048e8: fdc58593 addi a1,a1,-36 # 800078c0 <syscall_name+0x2a8> + 800048ec: 8552 mv a0,s4 + 800048ee: ef3fe0ef jal ra,800037e0 <dirlink> + 800048f2: 02054463 bltz a0,8000491a <create+0x122> + if(dirlink(dp, name, ip->inum) < 0) + 800048f6: 004a2603 lw a2,4(s4) + 800048fa: fb040593 addi a1,s0,-80 + 800048fe: 8526 mv a0,s1 + 80004900: ee1fe0ef jal ra,800037e0 <dirlink> + 80004904: 00054b63 bltz a0,8000491a <create+0x122> + dp->nlink++; // for ".." + 80004908: 04a4d783 lhu a5,74(s1) + 8000490c: 2785 addiw a5,a5,1 + 8000490e: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004912: 8526 mv a0,s1 + 80004914: ffafe0ef jal ra,8000310e <iupdate> + 80004918: b745 j 800048b8 <create+0xc0> + ip->nlink = 0; + 8000491a: 040a1523 sh zero,74(s4) + iupdate(ip); + 8000491e: 8552 mv a0,s4 + 80004920: feefe0ef jal ra,8000310e <iupdate> + iunlockput(ip); + 80004924: 8552 mv a0,s4 + 80004926: aa3fe0ef jal ra,800033c8 <iunlockput> + iunlockput(dp); + 8000492a: 8526 mv a0,s1 + 8000492c: a9dfe0ef jal ra,800033c8 <iunlockput> + return 0; + 80004930: b72d j 8000485a <create+0x62> + return 0; + 80004932: 8aaa mv s5,a0 + 80004934: b71d j 8000485a <create+0x62> + +0000000080004936 <sys_dup>: +{ + 80004936: 7179 addi sp,sp,-48 + 80004938: f406 sd ra,40(sp) + 8000493a: f022 sd s0,32(sp) + 8000493c: ec26 sd s1,24(sp) + 8000493e: e84a sd s2,16(sp) + 80004940: 1800 addi s0,sp,48 + if(argfd(0, 0, &f) < 0) + 80004942: fd840613 addi a2,s0,-40 + 80004946: 4581 li a1,0 + 80004948: 4501 li a0,0 + 8000494a: e19ff0ef jal ra,80004762 <argfd> + return -1; + 8000494e: 57fd li a5,-1 + if(argfd(0, 0, &f) < 0) + 80004950: 00054f63 bltz a0,8000496e <sys_dup+0x38> + if((fd=fdalloc(f)) < 0) + 80004954: fd843903 ld s2,-40(s0) + 80004958: 854a mv a0,s2 + 8000495a: e61ff0ef jal ra,800047ba <fdalloc> + 8000495e: 84aa mv s1,a0 + return -1; + 80004960: 57fd li a5,-1 + if((fd=fdalloc(f)) < 0) + 80004962: 00054663 bltz a0,8000496e <sys_dup+0x38> + filedup(f); + 80004966: 854a mv a0,s2 + 80004968: cc0ff0ef jal ra,80003e28 <filedup> + return fd; + 8000496c: 87a6 mv a5,s1 +} + 8000496e: 853e mv a0,a5 + 80004970: 70a2 ld ra,40(sp) + 80004972: 7402 ld s0,32(sp) + 80004974: 64e2 ld s1,24(sp) + 80004976: 6942 ld s2,16(sp) + 80004978: 6145 addi sp,sp,48 + 8000497a: 8082 ret + +000000008000497c <sys_read>: +{ + 8000497c: 7179 addi sp,sp,-48 + 8000497e: f406 sd ra,40(sp) + 80004980: f022 sd s0,32(sp) + 80004982: 1800 addi s0,sp,48 + argaddr(1, &p); + 80004984: fd840593 addi a1,s0,-40 + 80004988: 4505 li a0,1 + 8000498a: d91fd0ef jal ra,8000271a <argaddr> + argint(2, &n); + 8000498e: fe440593 addi a1,s0,-28 + 80004992: 4509 li a0,2 + 80004994: d6bfd0ef jal ra,800026fe <argint> + if(argfd(0, 0, &f) < 0) + 80004998: fe840613 addi a2,s0,-24 + 8000499c: 4581 li a1,0 + 8000499e: 4501 li a0,0 + 800049a0: dc3ff0ef jal ra,80004762 <argfd> + 800049a4: 87aa mv a5,a0 + return -1; + 800049a6: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 800049a8: 0007ca63 bltz a5,800049bc <sys_read+0x40> + return fileread(f, p, n); + 800049ac: fe442603 lw a2,-28(s0) + 800049b0: fd843583 ld a1,-40(s0) + 800049b4: fe843503 ld a0,-24(s0) + 800049b8: dbcff0ef jal ra,80003f74 <fileread> +} + 800049bc: 70a2 ld ra,40(sp) + 800049be: 7402 ld s0,32(sp) + 800049c0: 6145 addi sp,sp,48 + 800049c2: 8082 ret + +00000000800049c4 <sys_write>: +{ + 800049c4: 7179 addi sp,sp,-48 + 800049c6: f406 sd ra,40(sp) + 800049c8: f022 sd s0,32(sp) + 800049ca: 1800 addi s0,sp,48 + argaddr(1, &p); + 800049cc: fd840593 addi a1,s0,-40 + 800049d0: 4505 li a0,1 + 800049d2: d49fd0ef jal ra,8000271a <argaddr> + argint(2, &n); + 800049d6: fe440593 addi a1,s0,-28 + 800049da: 4509 li a0,2 + 800049dc: d23fd0ef jal ra,800026fe <argint> + if(argfd(0, 0, &f) < 0) + 800049e0: fe840613 addi a2,s0,-24 + 800049e4: 4581 li a1,0 + 800049e6: 4501 li a0,0 + 800049e8: d7bff0ef jal ra,80004762 <argfd> + 800049ec: 87aa mv a5,a0 + return -1; + 800049ee: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 800049f0: 0007ca63 bltz a5,80004a04 <sys_write+0x40> + return filewrite(f, p, n); + 800049f4: fe442603 lw a2,-28(s0) + 800049f8: fd843583 ld a1,-40(s0) + 800049fc: fe843503 ld a0,-24(s0) + 80004a00: e22ff0ef jal ra,80004022 <filewrite> +} + 80004a04: 70a2 ld ra,40(sp) + 80004a06: 7402 ld s0,32(sp) + 80004a08: 6145 addi sp,sp,48 + 80004a0a: 8082 ret + +0000000080004a0c <sys_close>: +{ + 80004a0c: 1101 addi sp,sp,-32 + 80004a0e: ec06 sd ra,24(sp) + 80004a10: e822 sd s0,16(sp) + 80004a12: 1000 addi s0,sp,32 + if(argfd(0, &fd, &f) < 0) + 80004a14: fe040613 addi a2,s0,-32 + 80004a18: fec40593 addi a1,s0,-20 + 80004a1c: 4501 li a0,0 + 80004a1e: d45ff0ef jal ra,80004762 <argfd> + return -1; + 80004a22: 57fd li a5,-1 + if(argfd(0, &fd, &f) < 0) + 80004a24: 02054063 bltz a0,80004a44 <sys_close+0x38> + myproc()->ofile[fd] = 0; + 80004a28: e03fc0ef jal ra,8000182a <myproc> + 80004a2c: fec42783 lw a5,-20(s0) + 80004a30: 07e9 addi a5,a5,26 + 80004a32: 078e slli a5,a5,0x3 + 80004a34: 953e add a0,a0,a5 + 80004a36: 00053023 sd zero,0(a0) + fileclose(f); + 80004a3a: fe043503 ld a0,-32(s0) + 80004a3e: c30ff0ef jal ra,80003e6e <fileclose> + return 0; + 80004a42: 4781 li a5,0 +} + 80004a44: 853e mv a0,a5 + 80004a46: 60e2 ld ra,24(sp) + 80004a48: 6442 ld s0,16(sp) + 80004a4a: 6105 addi sp,sp,32 + 80004a4c: 8082 ret + +0000000080004a4e <sys_fstat>: +{ + 80004a4e: 1101 addi sp,sp,-32 + 80004a50: ec06 sd ra,24(sp) + 80004a52: e822 sd s0,16(sp) + 80004a54: 1000 addi s0,sp,32 + argaddr(1, &st); + 80004a56: fe040593 addi a1,s0,-32 + 80004a5a: 4505 li a0,1 + 80004a5c: cbffd0ef jal ra,8000271a <argaddr> + if(argfd(0, 0, &f) < 0) + 80004a60: fe840613 addi a2,s0,-24 + 80004a64: 4581 li a1,0 + 80004a66: 4501 li a0,0 + 80004a68: cfbff0ef jal ra,80004762 <argfd> + 80004a6c: 87aa mv a5,a0 + return -1; + 80004a6e: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004a70: 0007c863 bltz a5,80004a80 <sys_fstat+0x32> + return filestat(f, st); + 80004a74: fe043583 ld a1,-32(s0) + 80004a78: fe843503 ld a0,-24(s0) + 80004a7c: c9aff0ef jal ra,80003f16 <filestat> +} + 80004a80: 60e2 ld ra,24(sp) + 80004a82: 6442 ld s0,16(sp) + 80004a84: 6105 addi sp,sp,32 + 80004a86: 8082 ret + +0000000080004a88 <sys_link>: +{ + 80004a88: 7169 addi sp,sp,-304 + 80004a8a: f606 sd ra,296(sp) + 80004a8c: f222 sd s0,288(sp) + 80004a8e: ee26 sd s1,280(sp) + 80004a90: ea4a sd s2,272(sp) + 80004a92: 1a00 addi s0,sp,304 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004a94: 08000613 li a2,128 + 80004a98: ed040593 addi a1,s0,-304 + 80004a9c: 4501 li a0,0 + 80004a9e: c99fd0ef jal ra,80002736 <argstr> + return -1; + 80004aa2: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004aa4: 0c054663 bltz a0,80004b70 <sys_link+0xe8> + 80004aa8: 08000613 li a2,128 + 80004aac: f5040593 addi a1,s0,-176 + 80004ab0: 4505 li a0,1 + 80004ab2: c85fd0ef jal ra,80002736 <argstr> + return -1; + 80004ab6: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004ab8: 0a054c63 bltz a0,80004b70 <sys_link+0xe8> + begin_op(); + 80004abc: f9bfe0ef jal ra,80003a56 <begin_op> + if((ip = namei(old)) == 0){ + 80004ac0: ed040513 addi a0,s0,-304 + 80004ac4: db7fe0ef jal ra,8000387a <namei> + 80004ac8: 84aa mv s1,a0 + 80004aca: c525 beqz a0,80004b32 <sys_link+0xaa> + ilock(ip); + 80004acc: ef6fe0ef jal ra,800031c2 <ilock> + if(ip->type == T_DIR){ + 80004ad0: 04449703 lh a4,68(s1) + 80004ad4: 4785 li a5,1 + 80004ad6: 06f70263 beq a4,a5,80004b3a <sys_link+0xb2> + ip->nlink++; + 80004ada: 04a4d783 lhu a5,74(s1) + 80004ade: 2785 addiw a5,a5,1 + 80004ae0: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004ae4: 8526 mv a0,s1 + 80004ae6: e28fe0ef jal ra,8000310e <iupdate> + iunlock(ip); + 80004aea: 8526 mv a0,s1 + 80004aec: f80fe0ef jal ra,8000326c <iunlock> + if((dp = nameiparent(new, name)) == 0) + 80004af0: fd040593 addi a1,s0,-48 + 80004af4: f5040513 addi a0,s0,-176 + 80004af8: d9dfe0ef jal ra,80003894 <nameiparent> + 80004afc: 892a mv s2,a0 + 80004afe: c921 beqz a0,80004b4e <sys_link+0xc6> + ilock(dp); + 80004b00: ec2fe0ef jal ra,800031c2 <ilock> + if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0){ + 80004b04: 00092703 lw a4,0(s2) + 80004b08: 409c lw a5,0(s1) + 80004b0a: 02f71f63 bne a4,a5,80004b48 <sys_link+0xc0> + 80004b0e: 40d0 lw a2,4(s1) + 80004b10: fd040593 addi a1,s0,-48 + 80004b14: 854a mv a0,s2 + 80004b16: ccbfe0ef jal ra,800037e0 <dirlink> + 80004b1a: 02054763 bltz a0,80004b48 <sys_link+0xc0> + iunlockput(dp); + 80004b1e: 854a mv a0,s2 + 80004b20: 8a9fe0ef jal ra,800033c8 <iunlockput> + iput(ip); + 80004b24: 8526 mv a0,s1 + 80004b26: 81bfe0ef jal ra,80003340 <iput> + end_op(); + 80004b2a: f9bfe0ef jal ra,80003ac4 <end_op> + return 0; + 80004b2e: 4781 li a5,0 + 80004b30: a081 j 80004b70 <sys_link+0xe8> + end_op(); + 80004b32: f93fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004b36: 57fd li a5,-1 + 80004b38: a825 j 80004b70 <sys_link+0xe8> + iunlockput(ip); + 80004b3a: 8526 mv a0,s1 + 80004b3c: 88dfe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004b40: f85fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004b44: 57fd li a5,-1 + 80004b46: a02d j 80004b70 <sys_link+0xe8> + iunlockput(dp); + 80004b48: 854a mv a0,s2 + 80004b4a: 87ffe0ef jal ra,800033c8 <iunlockput> + ilock(ip); + 80004b4e: 8526 mv a0,s1 + 80004b50: e72fe0ef jal ra,800031c2 <ilock> + ip->nlink--; + 80004b54: 04a4d783 lhu a5,74(s1) + 80004b58: 37fd addiw a5,a5,-1 + 80004b5a: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004b5e: 8526 mv a0,s1 + 80004b60: daefe0ef jal ra,8000310e <iupdate> + iunlockput(ip); + 80004b64: 8526 mv a0,s1 + 80004b66: 863fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004b6a: f5bfe0ef jal ra,80003ac4 <end_op> + return -1; + 80004b6e: 57fd li a5,-1 +} + 80004b70: 853e mv a0,a5 + 80004b72: 70b2 ld ra,296(sp) + 80004b74: 7412 ld s0,288(sp) + 80004b76: 64f2 ld s1,280(sp) + 80004b78: 6952 ld s2,272(sp) + 80004b7a: 6155 addi sp,sp,304 + 80004b7c: 8082 ret + +0000000080004b7e <sys_unlink>: +{ + 80004b7e: 7151 addi sp,sp,-240 + 80004b80: f586 sd ra,232(sp) + 80004b82: f1a2 sd s0,224(sp) + 80004b84: eda6 sd s1,216(sp) + 80004b86: e9ca sd s2,208(sp) + 80004b88: e5ce sd s3,200(sp) + 80004b8a: 1980 addi s0,sp,240 + if(argstr(0, path, MAXPATH) < 0) + 80004b8c: 08000613 li a2,128 + 80004b90: f3040593 addi a1,s0,-208 + 80004b94: 4501 li a0,0 + 80004b96: ba1fd0ef jal ra,80002736 <argstr> + 80004b9a: 12054b63 bltz a0,80004cd0 <sys_unlink+0x152> + begin_op(); + 80004b9e: eb9fe0ef jal ra,80003a56 <begin_op> + if((dp = nameiparent(path, name)) == 0){ + 80004ba2: fb040593 addi a1,s0,-80 + 80004ba6: f3040513 addi a0,s0,-208 + 80004baa: cebfe0ef jal ra,80003894 <nameiparent> + 80004bae: 84aa mv s1,a0 + 80004bb0: c54d beqz a0,80004c5a <sys_unlink+0xdc> + ilock(dp); + 80004bb2: e10fe0ef jal ra,800031c2 <ilock> + if(namecmp(name, ".") == 0 || namecmp(name, "..") == 0) + 80004bb6: 00003597 auipc a1,0x3 + 80004bba: d0258593 addi a1,a1,-766 # 800078b8 <syscall_name+0x2a0> + 80004bbe: fb040513 addi a0,s0,-80 + 80004bc2: a37fe0ef jal ra,800035f8 <namecmp> + 80004bc6: 10050a63 beqz a0,80004cda <sys_unlink+0x15c> + 80004bca: 00003597 auipc a1,0x3 + 80004bce: cf658593 addi a1,a1,-778 # 800078c0 <syscall_name+0x2a8> + 80004bd2: fb040513 addi a0,s0,-80 + 80004bd6: a23fe0ef jal ra,800035f8 <namecmp> + 80004bda: 10050063 beqz a0,80004cda <sys_unlink+0x15c> + if((ip = dirlookup(dp, name, &off)) == 0) + 80004bde: f2c40613 addi a2,s0,-212 + 80004be2: fb040593 addi a1,s0,-80 + 80004be6: 8526 mv a0,s1 + 80004be8: a27fe0ef jal ra,8000360e <dirlookup> + 80004bec: 892a mv s2,a0 + 80004bee: 0e050663 beqz a0,80004cda <sys_unlink+0x15c> + ilock(ip); + 80004bf2: dd0fe0ef jal ra,800031c2 <ilock> + if(ip->nlink < 1) + 80004bf6: 04a91783 lh a5,74(s2) + 80004bfa: 06f05463 blez a5,80004c62 <sys_unlink+0xe4> + if(ip->type == T_DIR && !isdirempty(ip)){ + 80004bfe: 04491703 lh a4,68(s2) + 80004c02: 4785 li a5,1 + 80004c04: 06f70563 beq a4,a5,80004c6e <sys_unlink+0xf0> + memset(&de, 0, sizeof(de)); + 80004c08: 4641 li a2,16 + 80004c0a: 4581 li a1,0 + 80004c0c: fc040513 addi a0,s0,-64 + 80004c10: 85cfc0ef jal ra,80000c6c <memset> + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004c14: 4741 li a4,16 + 80004c16: f2c42683 lw a3,-212(s0) + 80004c1a: fc040613 addi a2,s0,-64 + 80004c1e: 4581 li a1,0 + 80004c20: 8526 mv a0,s1 + 80004c22: 8d5fe0ef jal ra,800034f6 <writei> + 80004c26: 47c1 li a5,16 + 80004c28: 08f51563 bne a0,a5,80004cb2 <sys_unlink+0x134> + if(ip->type == T_DIR){ + 80004c2c: 04491703 lh a4,68(s2) + 80004c30: 4785 li a5,1 + 80004c32: 08f70663 beq a4,a5,80004cbe <sys_unlink+0x140> + iunlockput(dp); + 80004c36: 8526 mv a0,s1 + 80004c38: f90fe0ef jal ra,800033c8 <iunlockput> + ip->nlink--; + 80004c3c: 04a95783 lhu a5,74(s2) + 80004c40: 37fd addiw a5,a5,-1 + 80004c42: 04f91523 sh a5,74(s2) + iupdate(ip); + 80004c46: 854a mv a0,s2 + 80004c48: cc6fe0ef jal ra,8000310e <iupdate> + iunlockput(ip); + 80004c4c: 854a mv a0,s2 + 80004c4e: f7afe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004c52: e73fe0ef jal ra,80003ac4 <end_op> + return 0; + 80004c56: 4501 li a0,0 + 80004c58: a079 j 80004ce6 <sys_unlink+0x168> + end_op(); + 80004c5a: e6bfe0ef jal ra,80003ac4 <end_op> + return -1; + 80004c5e: 557d li a0,-1 + 80004c60: a059 j 80004ce6 <sys_unlink+0x168> + panic("unlink: nlink < 1"); + 80004c62: 00003517 auipc a0,0x3 + 80004c66: c6650513 addi a0,a0,-922 # 800078c8 <syscall_name+0x2b0> + 80004c6a: aedfb0ef jal ra,80000756 <panic> + for(off=2*sizeof(de); off<dp->size; off+=sizeof(de)){ + 80004c6e: 04c92703 lw a4,76(s2) + 80004c72: 02000793 li a5,32 + 80004c76: f8e7f9e3 bgeu a5,a4,80004c08 <sys_unlink+0x8a> + 80004c7a: 02000993 li s3,32 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004c7e: 4741 li a4,16 + 80004c80: 86ce mv a3,s3 + 80004c82: f1840613 addi a2,s0,-232 + 80004c86: 4581 li a1,0 + 80004c88: 854a mv a0,s2 + 80004c8a: f88fe0ef jal ra,80003412 <readi> + 80004c8e: 47c1 li a5,16 + 80004c90: 00f51b63 bne a0,a5,80004ca6 <sys_unlink+0x128> + if(de.inum != 0) + 80004c94: f1845783 lhu a5,-232(s0) + 80004c98: ef95 bnez a5,80004cd4 <sys_unlink+0x156> + for(off=2*sizeof(de); off<dp->size; off+=sizeof(de)){ + 80004c9a: 29c1 addiw s3,s3,16 + 80004c9c: 04c92783 lw a5,76(s2) + 80004ca0: fcf9efe3 bltu s3,a5,80004c7e <sys_unlink+0x100> + 80004ca4: b795 j 80004c08 <sys_unlink+0x8a> + panic("isdirempty: readi"); + 80004ca6: 00003517 auipc a0,0x3 + 80004caa: c3a50513 addi a0,a0,-966 # 800078e0 <syscall_name+0x2c8> + 80004cae: aa9fb0ef jal ra,80000756 <panic> + panic("unlink: writei"); + 80004cb2: 00003517 auipc a0,0x3 + 80004cb6: c4650513 addi a0,a0,-954 # 800078f8 <syscall_name+0x2e0> + 80004cba: a9dfb0ef jal ra,80000756 <panic> + dp->nlink--; + 80004cbe: 04a4d783 lhu a5,74(s1) + 80004cc2: 37fd addiw a5,a5,-1 + 80004cc4: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004cc8: 8526 mv a0,s1 + 80004cca: c44fe0ef jal ra,8000310e <iupdate> + 80004cce: b7a5 j 80004c36 <sys_unlink+0xb8> + return -1; + 80004cd0: 557d li a0,-1 + 80004cd2: a811 j 80004ce6 <sys_unlink+0x168> + iunlockput(ip); + 80004cd4: 854a mv a0,s2 + 80004cd6: ef2fe0ef jal ra,800033c8 <iunlockput> + iunlockput(dp); + 80004cda: 8526 mv a0,s1 + 80004cdc: eecfe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004ce0: de5fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004ce4: 557d li a0,-1 +} + 80004ce6: 70ae ld ra,232(sp) + 80004ce8: 740e ld s0,224(sp) + 80004cea: 64ee ld s1,216(sp) + 80004cec: 694e ld s2,208(sp) + 80004cee: 69ae ld s3,200(sp) + 80004cf0: 616d addi sp,sp,240 + 80004cf2: 8082 ret + +0000000080004cf4 <sys_open>: + +uint64 +sys_open(void) +{ + 80004cf4: 7131 addi sp,sp,-192 + 80004cf6: fd06 sd ra,184(sp) + 80004cf8: f922 sd s0,176(sp) + 80004cfa: f526 sd s1,168(sp) + 80004cfc: f14a sd s2,160(sp) + 80004cfe: ed4e sd s3,152(sp) + 80004d00: 0180 addi s0,sp,192 + int fd, omode; + struct file *f; + struct inode *ip; + int n; + + argint(1, &omode); + 80004d02: f4c40593 addi a1,s0,-180 + 80004d06: 4505 li a0,1 + 80004d08: 9f7fd0ef jal ra,800026fe <argint> + if((n = argstr(0, path, MAXPATH)) < 0) + 80004d0c: 08000613 li a2,128 + 80004d10: f5040593 addi a1,s0,-176 + 80004d14: 4501 li a0,0 + 80004d16: a21fd0ef jal ra,80002736 <argstr> + 80004d1a: 87aa mv a5,a0 + return -1; + 80004d1c: 557d li a0,-1 + if((n = argstr(0, path, MAXPATH)) < 0) + 80004d1e: 0807cd63 bltz a5,80004db8 <sys_open+0xc4> + + begin_op(); + 80004d22: d35fe0ef jal ra,80003a56 <begin_op> + + if(omode & O_CREATE){ + 80004d26: f4c42783 lw a5,-180(s0) + 80004d2a: 2007f793 andi a5,a5,512 + 80004d2e: c3c5 beqz a5,80004dce <sys_open+0xda> + ip = create(path, T_FILE, 0, 0); + 80004d30: 4681 li a3,0 + 80004d32: 4601 li a2,0 + 80004d34: 4589 li a1,2 + 80004d36: f5040513 addi a0,s0,-176 + 80004d3a: abfff0ef jal ra,800047f8 <create> + 80004d3e: 84aa mv s1,a0 + if(ip == 0){ + 80004d40: c159 beqz a0,80004dc6 <sys_open+0xd2> + end_op(); + return -1; + } + } + + if(ip->type == T_DEVICE && (ip->major < 0 || ip->major >= NDEV)){ + 80004d42: 04449703 lh a4,68(s1) + 80004d46: 478d li a5,3 + 80004d48: 00f71763 bne a4,a5,80004d56 <sys_open+0x62> + 80004d4c: 0464d703 lhu a4,70(s1) + 80004d50: 47a5 li a5,9 + 80004d52: 0ae7e963 bltu a5,a4,80004e04 <sys_open+0x110> + iunlockput(ip); + end_op(); + return -1; + } + + if((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0){ + 80004d56: 874ff0ef jal ra,80003dca <filealloc> + 80004d5a: 89aa mv s3,a0 + 80004d5c: 0c050963 beqz a0,80004e2e <sys_open+0x13a> + 80004d60: a5bff0ef jal ra,800047ba <fdalloc> + 80004d64: 892a mv s2,a0 + 80004d66: 0c054163 bltz a0,80004e28 <sys_open+0x134> + iunlockput(ip); + end_op(); + return -1; + } + + if(ip->type == T_DEVICE){ + 80004d6a: 04449703 lh a4,68(s1) + 80004d6e: 478d li a5,3 + 80004d70: 0af70163 beq a4,a5,80004e12 <sys_open+0x11e> + f->type = FD_DEVICE; + f->major = ip->major; + } else { + f->type = FD_INODE; + 80004d74: 4789 li a5,2 + 80004d76: 00f9a023 sw a5,0(s3) + f->off = 0; + 80004d7a: 0209a023 sw zero,32(s3) + } + f->ip = ip; + 80004d7e: 0099bc23 sd s1,24(s3) + f->readable = !(omode & O_WRONLY); + 80004d82: f4c42783 lw a5,-180(s0) + 80004d86: 0017c713 xori a4,a5,1 + 80004d8a: 8b05 andi a4,a4,1 + 80004d8c: 00e98423 sb a4,8(s3) + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); + 80004d90: 0037f713 andi a4,a5,3 + 80004d94: 00e03733 snez a4,a4 + 80004d98: 00e984a3 sb a4,9(s3) + + if((omode & O_TRUNC) && ip->type == T_FILE){ + 80004d9c: 4007f793 andi a5,a5,1024 + 80004da0: c791 beqz a5,80004dac <sys_open+0xb8> + 80004da2: 04449703 lh a4,68(s1) + 80004da6: 4789 li a5,2 + 80004da8: 06f70c63 beq a4,a5,80004e20 <sys_open+0x12c> + itrunc(ip); + } + + iunlock(ip); + 80004dac: 8526 mv a0,s1 + 80004dae: cbefe0ef jal ra,8000326c <iunlock> + end_op(); + 80004db2: d13fe0ef jal ra,80003ac4 <end_op> + + return fd; + 80004db6: 854a mv a0,s2 +} + 80004db8: 70ea ld ra,184(sp) + 80004dba: 744a ld s0,176(sp) + 80004dbc: 74aa ld s1,168(sp) + 80004dbe: 790a ld s2,160(sp) + 80004dc0: 69ea ld s3,152(sp) + 80004dc2: 6129 addi sp,sp,192 + 80004dc4: 8082 ret + end_op(); + 80004dc6: cfffe0ef jal ra,80003ac4 <end_op> + return -1; + 80004dca: 557d li a0,-1 + 80004dcc: b7f5 j 80004db8 <sys_open+0xc4> + if((ip = namei(path)) == 0){ + 80004dce: f5040513 addi a0,s0,-176 + 80004dd2: aa9fe0ef jal ra,8000387a <namei> + 80004dd6: 84aa mv s1,a0 + 80004dd8: c115 beqz a0,80004dfc <sys_open+0x108> + ilock(ip); + 80004dda: be8fe0ef jal ra,800031c2 <ilock> + if(ip->type == T_DIR && omode != O_RDONLY){ + 80004dde: 04449703 lh a4,68(s1) + 80004de2: 4785 li a5,1 + 80004de4: f4f71fe3 bne a4,a5,80004d42 <sys_open+0x4e> + 80004de8: f4c42783 lw a5,-180(s0) + 80004dec: d7ad beqz a5,80004d56 <sys_open+0x62> + iunlockput(ip); + 80004dee: 8526 mv a0,s1 + 80004df0: dd8fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004df4: cd1fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004df8: 557d li a0,-1 + 80004dfa: bf7d j 80004db8 <sys_open+0xc4> + end_op(); + 80004dfc: cc9fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004e00: 557d li a0,-1 + 80004e02: bf5d j 80004db8 <sys_open+0xc4> + iunlockput(ip); + 80004e04: 8526 mv a0,s1 + 80004e06: dc2fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004e0a: cbbfe0ef jal ra,80003ac4 <end_op> + return -1; + 80004e0e: 557d li a0,-1 + 80004e10: b765 j 80004db8 <sys_open+0xc4> + f->type = FD_DEVICE; + 80004e12: 00f9a023 sw a5,0(s3) + f->major = ip->major; + 80004e16: 04649783 lh a5,70(s1) + 80004e1a: 02f99223 sh a5,36(s3) + 80004e1e: b785 j 80004d7e <sys_open+0x8a> + itrunc(ip); + 80004e20: 8526 mv a0,s1 + 80004e22: c8afe0ef jal ra,800032ac <itrunc> + 80004e26: b759 j 80004dac <sys_open+0xb8> + fileclose(f); + 80004e28: 854e mv a0,s3 + 80004e2a: 844ff0ef jal ra,80003e6e <fileclose> + iunlockput(ip); + 80004e2e: 8526 mv a0,s1 + 80004e30: d98fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004e34: c91fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004e38: 557d li a0,-1 + 80004e3a: bfbd j 80004db8 <sys_open+0xc4> + +0000000080004e3c <sys_mkdir>: + +uint64 +sys_mkdir(void) +{ + 80004e3c: 7175 addi sp,sp,-144 + 80004e3e: e506 sd ra,136(sp) + 80004e40: e122 sd s0,128(sp) + 80004e42: 0900 addi s0,sp,144 + char path[MAXPATH]; + struct inode *ip; + + begin_op(); + 80004e44: c13fe0ef jal ra,80003a56 <begin_op> + if(argstr(0, path, MAXPATH) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0){ + 80004e48: 08000613 li a2,128 + 80004e4c: f7040593 addi a1,s0,-144 + 80004e50: 4501 li a0,0 + 80004e52: 8e5fd0ef jal ra,80002736 <argstr> + 80004e56: 02054363 bltz a0,80004e7c <sys_mkdir+0x40> + 80004e5a: 4681 li a3,0 + 80004e5c: 4601 li a2,0 + 80004e5e: 4585 li a1,1 + 80004e60: f7040513 addi a0,s0,-144 + 80004e64: 995ff0ef jal ra,800047f8 <create> + 80004e68: c911 beqz a0,80004e7c <sys_mkdir+0x40> + end_op(); + return -1; + } + iunlockput(ip); + 80004e6a: d5efe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004e6e: c57fe0ef jal ra,80003ac4 <end_op> + return 0; + 80004e72: 4501 li a0,0 +} + 80004e74: 60aa ld ra,136(sp) + 80004e76: 640a ld s0,128(sp) + 80004e78: 6149 addi sp,sp,144 + 80004e7a: 8082 ret + end_op(); + 80004e7c: c49fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004e80: 557d li a0,-1 + 80004e82: bfcd j 80004e74 <sys_mkdir+0x38> + +0000000080004e84 <sys_mknod>: + +uint64 +sys_mknod(void) +{ + 80004e84: 7135 addi sp,sp,-160 + 80004e86: ed06 sd ra,152(sp) + 80004e88: e922 sd s0,144(sp) + 80004e8a: 1100 addi s0,sp,160 + struct inode *ip; + char path[MAXPATH]; + int major, minor; + + begin_op(); + 80004e8c: bcbfe0ef jal ra,80003a56 <begin_op> + argint(1, &major); + 80004e90: f6c40593 addi a1,s0,-148 + 80004e94: 4505 li a0,1 + 80004e96: 869fd0ef jal ra,800026fe <argint> + argint(2, &minor); + 80004e9a: f6840593 addi a1,s0,-152 + 80004e9e: 4509 li a0,2 + 80004ea0: 85ffd0ef jal ra,800026fe <argint> + if((argstr(0, path, MAXPATH)) < 0 || + 80004ea4: 08000613 li a2,128 + 80004ea8: f7040593 addi a1,s0,-144 + 80004eac: 4501 li a0,0 + 80004eae: 889fd0ef jal ra,80002736 <argstr> + 80004eb2: 02054563 bltz a0,80004edc <sys_mknod+0x58> + (ip = create(path, T_DEVICE, major, minor)) == 0){ + 80004eb6: f6841683 lh a3,-152(s0) + 80004eba: f6c41603 lh a2,-148(s0) + 80004ebe: 458d li a1,3 + 80004ec0: f7040513 addi a0,s0,-144 + 80004ec4: 935ff0ef jal ra,800047f8 <create> + if((argstr(0, path, MAXPATH)) < 0 || + 80004ec8: c911 beqz a0,80004edc <sys_mknod+0x58> + end_op(); + return -1; + } + iunlockput(ip); + 80004eca: cfefe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004ece: bf7fe0ef jal ra,80003ac4 <end_op> + return 0; + 80004ed2: 4501 li a0,0 +} + 80004ed4: 60ea ld ra,152(sp) + 80004ed6: 644a ld s0,144(sp) + 80004ed8: 610d addi sp,sp,160 + 80004eda: 8082 ret + end_op(); + 80004edc: be9fe0ef jal ra,80003ac4 <end_op> + return -1; + 80004ee0: 557d li a0,-1 + 80004ee2: bfcd j 80004ed4 <sys_mknod+0x50> + +0000000080004ee4 <sys_chdir>: + +uint64 +sys_chdir(void) +{ + 80004ee4: 7135 addi sp,sp,-160 + 80004ee6: ed06 sd ra,152(sp) + 80004ee8: e922 sd s0,144(sp) + 80004eea: e526 sd s1,136(sp) + 80004eec: e14a sd s2,128(sp) + 80004eee: 1100 addi s0,sp,160 + char path[MAXPATH]; + struct inode *ip; + struct proc *p = myproc(); + 80004ef0: 93bfc0ef jal ra,8000182a <myproc> + 80004ef4: 892a mv s2,a0 + + begin_op(); + 80004ef6: b61fe0ef jal ra,80003a56 <begin_op> + if(argstr(0, path, MAXPATH) < 0 || (ip = namei(path)) == 0){ + 80004efa: 08000613 li a2,128 + 80004efe: f6040593 addi a1,s0,-160 + 80004f02: 4501 li a0,0 + 80004f04: 833fd0ef jal ra,80002736 <argstr> + 80004f08: 04054163 bltz a0,80004f4a <sys_chdir+0x66> + 80004f0c: f6040513 addi a0,s0,-160 + 80004f10: 96bfe0ef jal ra,8000387a <namei> + 80004f14: 84aa mv s1,a0 + 80004f16: c915 beqz a0,80004f4a <sys_chdir+0x66> + end_op(); + return -1; + } + ilock(ip); + 80004f18: aaafe0ef jal ra,800031c2 <ilock> + if(ip->type != T_DIR){ + 80004f1c: 04449703 lh a4,68(s1) + 80004f20: 4785 li a5,1 + 80004f22: 02f71863 bne a4,a5,80004f52 <sys_chdir+0x6e> + iunlockput(ip); + end_op(); + return -1; + } + iunlock(ip); + 80004f26: 8526 mv a0,s1 + 80004f28: b44fe0ef jal ra,8000326c <iunlock> + iput(p->cwd); + 80004f2c: 15093503 ld a0,336(s2) + 80004f30: c10fe0ef jal ra,80003340 <iput> + end_op(); + 80004f34: b91fe0ef jal ra,80003ac4 <end_op> + p->cwd = ip; + 80004f38: 14993823 sd s1,336(s2) + return 0; + 80004f3c: 4501 li a0,0 +} + 80004f3e: 60ea ld ra,152(sp) + 80004f40: 644a ld s0,144(sp) + 80004f42: 64aa ld s1,136(sp) + 80004f44: 690a ld s2,128(sp) + 80004f46: 610d addi sp,sp,160 + 80004f48: 8082 ret + end_op(); + 80004f4a: b7bfe0ef jal ra,80003ac4 <end_op> + return -1; + 80004f4e: 557d li a0,-1 + 80004f50: b7fd j 80004f3e <sys_chdir+0x5a> + iunlockput(ip); + 80004f52: 8526 mv a0,s1 + 80004f54: c74fe0ef jal ra,800033c8 <iunlockput> + end_op(); + 80004f58: b6dfe0ef jal ra,80003ac4 <end_op> + return -1; + 80004f5c: 557d li a0,-1 + 80004f5e: b7c5 j 80004f3e <sys_chdir+0x5a> + +0000000080004f60 <sys_exec>: + +uint64 +sys_exec(void) +{ + 80004f60: 7145 addi sp,sp,-464 + 80004f62: e786 sd ra,456(sp) + 80004f64: e3a2 sd s0,448(sp) + 80004f66: ff26 sd s1,440(sp) + 80004f68: fb4a sd s2,432(sp) + 80004f6a: f74e sd s3,424(sp) + 80004f6c: f352 sd s4,416(sp) + 80004f6e: ef56 sd s5,408(sp) + 80004f70: 0b80 addi s0,sp,464 + char path[MAXPATH], *argv[MAXARG]; + int i; + uint64 uargv, uarg; + + argaddr(1, &uargv); + 80004f72: e3840593 addi a1,s0,-456 + 80004f76: 4505 li a0,1 + 80004f78: fa2fd0ef jal ra,8000271a <argaddr> + if(argstr(0, path, MAXPATH) < 0) { + 80004f7c: 08000613 li a2,128 + 80004f80: f4040593 addi a1,s0,-192 + 80004f84: 4501 li a0,0 + 80004f86: fb0fd0ef jal ra,80002736 <argstr> + 80004f8a: 87aa mv a5,a0 + return -1; + 80004f8c: 557d li a0,-1 + if(argstr(0, path, MAXPATH) < 0) { + 80004f8e: 0a07c563 bltz a5,80005038 <sys_exec+0xd8> + } + memset(argv, 0, sizeof(argv)); + 80004f92: 10000613 li a2,256 + 80004f96: 4581 li a1,0 + 80004f98: e4040513 addi a0,s0,-448 + 80004f9c: cd1fb0ef jal ra,80000c6c <memset> + for(i=0;; i++){ + if(i >= NELEM(argv)){ + 80004fa0: e4040493 addi s1,s0,-448 + memset(argv, 0, sizeof(argv)); + 80004fa4: 89a6 mv s3,s1 + 80004fa6: 4901 li s2,0 + if(i >= NELEM(argv)){ + 80004fa8: 02000a13 li s4,32 + 80004fac: 00090a9b sext.w s5,s2 + goto bad; + } + if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){ + 80004fb0: 00391513 slli a0,s2,0x3 + 80004fb4: e3040593 addi a1,s0,-464 + 80004fb8: e3843783 ld a5,-456(s0) + 80004fbc: 953e add a0,a0,a5 + 80004fbe: eb6fd0ef jal ra,80002674 <fetchaddr> + 80004fc2: 02054663 bltz a0,80004fee <sys_exec+0x8e> + goto bad; + } + if(uarg == 0){ + 80004fc6: e3043783 ld a5,-464(s0) + 80004fca: cf8d beqz a5,80005004 <sys_exec+0xa4> + argv[i] = 0; + break; + } + argv[i] = kalloc(); + 80004fcc: afdfb0ef jal ra,80000ac8 <kalloc> + 80004fd0: 85aa mv a1,a0 + 80004fd2: 00a9b023 sd a0,0(s3) + if(argv[i] == 0) + 80004fd6: cd01 beqz a0,80004fee <sys_exec+0x8e> + goto bad; + if(fetchstr(uarg, argv[i], PGSIZE) < 0) + 80004fd8: 6605 lui a2,0x1 + 80004fda: e3043503 ld a0,-464(s0) + 80004fde: ee0fd0ef jal ra,800026be <fetchstr> + 80004fe2: 00054663 bltz a0,80004fee <sys_exec+0x8e> + if(i >= NELEM(argv)){ + 80004fe6: 0905 addi s2,s2,1 + 80004fe8: 09a1 addi s3,s3,8 + 80004fea: fd4911e3 bne s2,s4,80004fac <sys_exec+0x4c> + kfree(argv[i]); + + return ret; + + bad: + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 80004fee: f4040913 addi s2,s0,-192 + 80004ff2: 6088 ld a0,0(s1) + 80004ff4: c129 beqz a0,80005036 <sys_exec+0xd6> + kfree(argv[i]); + 80004ff6: 9f1fb0ef jal ra,800009e6 <kfree> + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 80004ffa: 04a1 addi s1,s1,8 + 80004ffc: ff249be3 bne s1,s2,80004ff2 <sys_exec+0x92> + return -1; + 80005000: 557d li a0,-1 + 80005002: a81d j 80005038 <sys_exec+0xd8> + argv[i] = 0; + 80005004: 0a8e slli s5,s5,0x3 + 80005006: fc0a8793 addi a5,s5,-64 + 8000500a: 00878ab3 add s5,a5,s0 + 8000500e: e80ab023 sd zero,-384(s5) + int ret = exec(path, argv); + 80005012: e4040593 addi a1,s0,-448 + 80005016: f4040513 addi a0,s0,-192 + 8000501a: bf6ff0ef jal ra,80004410 <exec> + 8000501e: 892a mv s2,a0 + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 80005020: f4040993 addi s3,s0,-192 + 80005024: 6088 ld a0,0(s1) + 80005026: c511 beqz a0,80005032 <sys_exec+0xd2> + kfree(argv[i]); + 80005028: 9bffb0ef jal ra,800009e6 <kfree> + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000502c: 04a1 addi s1,s1,8 + 8000502e: ff349be3 bne s1,s3,80005024 <sys_exec+0xc4> + return ret; + 80005032: 854a mv a0,s2 + 80005034: a011 j 80005038 <sys_exec+0xd8> + return -1; + 80005036: 557d li a0,-1 +} + 80005038: 60be ld ra,456(sp) + 8000503a: 641e ld s0,448(sp) + 8000503c: 74fa ld s1,440(sp) + 8000503e: 795a ld s2,432(sp) + 80005040: 79ba ld s3,424(sp) + 80005042: 7a1a ld s4,416(sp) + 80005044: 6afa ld s5,408(sp) + 80005046: 6179 addi sp,sp,464 + 80005048: 8082 ret + +000000008000504a <sys_pipe>: + +uint64 +sys_pipe(void) +{ + 8000504a: 7139 addi sp,sp,-64 + 8000504c: fc06 sd ra,56(sp) + 8000504e: f822 sd s0,48(sp) + 80005050: f426 sd s1,40(sp) + 80005052: 0080 addi s0,sp,64 + uint64 fdarray; // user pointer to array of two integers + struct file *rf, *wf; + int fd0, fd1; + struct proc *p = myproc(); + 80005054: fd6fc0ef jal ra,8000182a <myproc> + 80005058: 84aa mv s1,a0 + + argaddr(0, &fdarray); + 8000505a: fd840593 addi a1,s0,-40 + 8000505e: 4501 li a0,0 + 80005060: ebafd0ef jal ra,8000271a <argaddr> + if(pipealloc(&rf, &wf) < 0) + 80005064: fc840593 addi a1,s0,-56 + 80005068: fd040513 addi a0,s0,-48 + 8000506c: 8ceff0ef jal ra,8000413a <pipealloc> + return -1; + 80005070: 57fd li a5,-1 + if(pipealloc(&rf, &wf) < 0) + 80005072: 0a054463 bltz a0,8000511a <sys_pipe+0xd0> + fd0 = -1; + 80005076: fcf42223 sw a5,-60(s0) + if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){ + 8000507a: fd043503 ld a0,-48(s0) + 8000507e: f3cff0ef jal ra,800047ba <fdalloc> + 80005082: fca42223 sw a0,-60(s0) + 80005086: 08054163 bltz a0,80005108 <sys_pipe+0xbe> + 8000508a: fc843503 ld a0,-56(s0) + 8000508e: f2cff0ef jal ra,800047ba <fdalloc> + 80005092: fca42023 sw a0,-64(s0) + 80005096: 06054063 bltz a0,800050f6 <sys_pipe+0xac> + p->ofile[fd0] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 8000509a: 4691 li a3,4 + 8000509c: fc440613 addi a2,s0,-60 + 800050a0: fd843583 ld a1,-40(s0) + 800050a4: 68a8 ld a0,80(s1) + 800050a6: c3cfc0ef jal ra,800014e2 <copyout> + 800050aa: 00054e63 bltz a0,800050c6 <sys_pipe+0x7c> + copyout(p->pagetable, fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){ + 800050ae: 4691 li a3,4 + 800050b0: fc040613 addi a2,s0,-64 + 800050b4: fd843583 ld a1,-40(s0) + 800050b8: 0591 addi a1,a1,4 + 800050ba: 68a8 ld a0,80(s1) + 800050bc: c26fc0ef jal ra,800014e2 <copyout> + p->ofile[fd1] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + return 0; + 800050c0: 4781 li a5,0 + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 800050c2: 04055c63 bgez a0,8000511a <sys_pipe+0xd0> + p->ofile[fd0] = 0; + 800050c6: fc442783 lw a5,-60(s0) + 800050ca: 07e9 addi a5,a5,26 + 800050cc: 078e slli a5,a5,0x3 + 800050ce: 97a6 add a5,a5,s1 + 800050d0: 0007b023 sd zero,0(a5) + p->ofile[fd1] = 0; + 800050d4: fc042783 lw a5,-64(s0) + 800050d8: 07e9 addi a5,a5,26 + 800050da: 078e slli a5,a5,0x3 + 800050dc: 94be add s1,s1,a5 + 800050de: 0004b023 sd zero,0(s1) + fileclose(rf); + 800050e2: fd043503 ld a0,-48(s0) + 800050e6: d89fe0ef jal ra,80003e6e <fileclose> + fileclose(wf); + 800050ea: fc843503 ld a0,-56(s0) + 800050ee: d81fe0ef jal ra,80003e6e <fileclose> + return -1; + 800050f2: 57fd li a5,-1 + 800050f4: a01d j 8000511a <sys_pipe+0xd0> + if(fd0 >= 0) + 800050f6: fc442783 lw a5,-60(s0) + 800050fa: 0007c763 bltz a5,80005108 <sys_pipe+0xbe> + p->ofile[fd0] = 0; + 800050fe: 07e9 addi a5,a5,26 + 80005100: 078e slli a5,a5,0x3 + 80005102: 97a6 add a5,a5,s1 + 80005104: 0007b023 sd zero,0(a5) + fileclose(rf); + 80005108: fd043503 ld a0,-48(s0) + 8000510c: d63fe0ef jal ra,80003e6e <fileclose> + fileclose(wf); + 80005110: fc843503 ld a0,-56(s0) + 80005114: d5bfe0ef jal ra,80003e6e <fileclose> + return -1; + 80005118: 57fd li a5,-1 +} + 8000511a: 853e mv a0,a5 + 8000511c: 70e2 ld ra,56(sp) + 8000511e: 7442 ld s0,48(sp) + 80005120: 74a2 ld s1,40(sp) + 80005122: 6121 addi sp,sp,64 + 80005124: 8082 ret + ... + +0000000080005130 <kernelvec>: + 80005130: 7111 addi sp,sp,-256 + 80005132: e006 sd ra,0(sp) + 80005134: e40a sd sp,8(sp) + 80005136: e80e sd gp,16(sp) + 80005138: ec12 sd tp,24(sp) + 8000513a: f016 sd t0,32(sp) + 8000513c: f41a sd t1,40(sp) + 8000513e: f81e sd t2,48(sp) + 80005140: e4aa sd a0,72(sp) + 80005142: e8ae sd a1,80(sp) + 80005144: ecb2 sd a2,88(sp) + 80005146: f0b6 sd a3,96(sp) + 80005148: f4ba sd a4,104(sp) + 8000514a: f8be sd a5,112(sp) + 8000514c: fcc2 sd a6,120(sp) + 8000514e: e146 sd a7,128(sp) + 80005150: edf2 sd t3,216(sp) + 80005152: f1f6 sd t4,224(sp) + 80005154: f5fa sd t5,232(sp) + 80005156: f9fe sd t6,240(sp) + 80005158: c2cfd0ef jal ra,80002584 <kerneltrap> + 8000515c: 6082 ld ra,0(sp) + 8000515e: 6122 ld sp,8(sp) + 80005160: 61c2 ld gp,16(sp) + 80005162: 7282 ld t0,32(sp) + 80005164: 7322 ld t1,40(sp) + 80005166: 73c2 ld t2,48(sp) + 80005168: 6526 ld a0,72(sp) + 8000516a: 65c6 ld a1,80(sp) + 8000516c: 6666 ld a2,88(sp) + 8000516e: 7686 ld a3,96(sp) + 80005170: 7726 ld a4,104(sp) + 80005172: 77c6 ld a5,112(sp) + 80005174: 7866 ld a6,120(sp) + 80005176: 688a ld a7,128(sp) + 80005178: 6e6e ld t3,216(sp) + 8000517a: 7e8e ld t4,224(sp) + 8000517c: 7f2e ld t5,232(sp) + 8000517e: 7fce ld t6,240(sp) + 80005180: 6111 addi sp,sp,256 + 80005182: 10200073 sret + ... + +000000008000518e <plicinit>: +// the riscv Platform Level Interrupt Controller (PLIC). +// + +void +plicinit(void) +{ + 8000518e: 1141 addi sp,sp,-16 + 80005190: e422 sd s0,8(sp) + 80005192: 0800 addi s0,sp,16 + // set desired IRQ priorities non-zero (otherwise disabled). + *(uint32*)(PLIC + UART0_IRQ*4) = 1; + 80005194: 0c0007b7 lui a5,0xc000 + 80005198: 4705 li a4,1 + 8000519a: d798 sw a4,40(a5) + *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1; + 8000519c: c3d8 sw a4,4(a5) +} + 8000519e: 6422 ld s0,8(sp) + 800051a0: 0141 addi sp,sp,16 + 800051a2: 8082 ret + +00000000800051a4 <plicinithart>: + +void +plicinithart(void) +{ + 800051a4: 1141 addi sp,sp,-16 + 800051a6: e406 sd ra,8(sp) + 800051a8: e022 sd s0,0(sp) + 800051aa: 0800 addi s0,sp,16 + int hart = cpuid(); + 800051ac: e52fc0ef jal ra,800017fe <cpuid> + + // set enable bits for this hart's S-mode + // for the uart and virtio disk. + *(uint32*)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ); + 800051b0: 0085171b slliw a4,a0,0x8 + 800051b4: 0c0027b7 lui a5,0xc002 + 800051b8: 97ba add a5,a5,a4 + 800051ba: 40200713 li a4,1026 + 800051be: 08e7a023 sw a4,128(a5) # c002080 <_entry-0x73ffdf80> + + // set this hart's S-mode priority threshold to 0. + *(uint32*)PLIC_SPRIORITY(hart) = 0; + 800051c2: 00d5151b slliw a0,a0,0xd + 800051c6: 0c2017b7 lui a5,0xc201 + 800051ca: 97aa add a5,a5,a0 + 800051cc: 0007a023 sw zero,0(a5) # c201000 <_entry-0x73dff000> +} + 800051d0: 60a2 ld ra,8(sp) + 800051d2: 6402 ld s0,0(sp) + 800051d4: 0141 addi sp,sp,16 + 800051d6: 8082 ret + +00000000800051d8 <plic_claim>: + +// ask the PLIC what interrupt we should serve. +int +plic_claim(void) +{ + 800051d8: 1141 addi sp,sp,-16 + 800051da: e406 sd ra,8(sp) + 800051dc: e022 sd s0,0(sp) + 800051de: 0800 addi s0,sp,16 + int hart = cpuid(); + 800051e0: e1efc0ef jal ra,800017fe <cpuid> + int irq = *(uint32*)PLIC_SCLAIM(hart); + 800051e4: 00d5151b slliw a0,a0,0xd + 800051e8: 0c2017b7 lui a5,0xc201 + 800051ec: 97aa add a5,a5,a0 + return irq; +} + 800051ee: 43c8 lw a0,4(a5) + 800051f0: 60a2 ld ra,8(sp) + 800051f2: 6402 ld s0,0(sp) + 800051f4: 0141 addi sp,sp,16 + 800051f6: 8082 ret + +00000000800051f8 <plic_complete>: + +// tell the PLIC we've served this IRQ. +void +plic_complete(int irq) +{ + 800051f8: 1101 addi sp,sp,-32 + 800051fa: ec06 sd ra,24(sp) + 800051fc: e822 sd s0,16(sp) + 800051fe: e426 sd s1,8(sp) + 80005200: 1000 addi s0,sp,32 + 80005202: 84aa mv s1,a0 + int hart = cpuid(); + 80005204: dfafc0ef jal ra,800017fe <cpuid> + *(uint32*)PLIC_SCLAIM(hart) = irq; + 80005208: 00d5151b slliw a0,a0,0xd + 8000520c: 0c2017b7 lui a5,0xc201 + 80005210: 97aa add a5,a5,a0 + 80005212: c3c4 sw s1,4(a5) +} + 80005214: 60e2 ld ra,24(sp) + 80005216: 6442 ld s0,16(sp) + 80005218: 64a2 ld s1,8(sp) + 8000521a: 6105 addi sp,sp,32 + 8000521c: 8082 ret + +000000008000521e <free_desc>: +} + +// mark a descriptor as free. +static void +free_desc(int i) +{ + 8000521e: 1141 addi sp,sp,-16 + 80005220: e406 sd ra,8(sp) + 80005222: e022 sd s0,0(sp) + 80005224: 0800 addi s0,sp,16 + if(i >= NUM) + 80005226: 479d li a5,7 + 80005228: 04a7ca63 blt a5,a0,8000527c <free_desc+0x5e> + panic("free_desc 1"); + if(disk.free[i]) + 8000522c: 0001d797 auipc a5,0x1d + 80005230: 48478793 addi a5,a5,1156 # 800226b0 <disk> + 80005234: 97aa add a5,a5,a0 + 80005236: 0187c783 lbu a5,24(a5) + 8000523a: e7b9 bnez a5,80005288 <free_desc+0x6a> + panic("free_desc 2"); + disk.desc[i].addr = 0; + 8000523c: 00451693 slli a3,a0,0x4 + 80005240: 0001d797 auipc a5,0x1d + 80005244: 47078793 addi a5,a5,1136 # 800226b0 <disk> + 80005248: 6398 ld a4,0(a5) + 8000524a: 9736 add a4,a4,a3 + 8000524c: 00073023 sd zero,0(a4) + disk.desc[i].len = 0; + 80005250: 6398 ld a4,0(a5) + 80005252: 9736 add a4,a4,a3 + 80005254: 00072423 sw zero,8(a4) + disk.desc[i].flags = 0; + 80005258: 00071623 sh zero,12(a4) + disk.desc[i].next = 0; + 8000525c: 00071723 sh zero,14(a4) + disk.free[i] = 1; + 80005260: 97aa add a5,a5,a0 + 80005262: 4705 li a4,1 + 80005264: 00e78c23 sb a4,24(a5) + wakeup(&disk.free[0]); + 80005268: 0001d517 auipc a0,0x1d + 8000526c: 46050513 addi a0,a0,1120 # 800226c8 <disk+0x18> + 80005270: bf9fc0ef jal ra,80001e68 <wakeup> +} + 80005274: 60a2 ld ra,8(sp) + 80005276: 6402 ld s0,0(sp) + 80005278: 0141 addi sp,sp,16 + 8000527a: 8082 ret + panic("free_desc 1"); + 8000527c: 00002517 auipc a0,0x2 + 80005280: 68c50513 addi a0,a0,1676 # 80007908 <syscall_name+0x2f0> + 80005284: cd2fb0ef jal ra,80000756 <panic> + panic("free_desc 2"); + 80005288: 00002517 auipc a0,0x2 + 8000528c: 69050513 addi a0,a0,1680 # 80007918 <syscall_name+0x300> + 80005290: cc6fb0ef jal ra,80000756 <panic> + +0000000080005294 <virtio_disk_init>: +{ + 80005294: 1101 addi sp,sp,-32 + 80005296: ec06 sd ra,24(sp) + 80005298: e822 sd s0,16(sp) + 8000529a: e426 sd s1,8(sp) + 8000529c: e04a sd s2,0(sp) + 8000529e: 1000 addi s0,sp,32 + initlock(&disk.vdisk_lock, "virtio_disk"); + 800052a0: 00002597 auipc a1,0x2 + 800052a4: 68858593 addi a1,a1,1672 # 80007928 <syscall_name+0x310> + 800052a8: 0001d517 auipc a0,0x1d + 800052ac: 53050513 addi a0,a0,1328 # 800227d8 <disk+0x128> + 800052b0: 869fb0ef jal ra,80000b18 <initlock> + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 800052b4: 100017b7 lui a5,0x10001 + 800052b8: 4398 lw a4,0(a5) + 800052ba: 2701 sext.w a4,a4 + 800052bc: 747277b7 lui a5,0x74727 + 800052c0: 97678793 addi a5,a5,-1674 # 74726976 <_entry-0xb8d968a> + 800052c4: 12f71f63 bne a4,a5,80005402 <virtio_disk_init+0x16e> + *R(VIRTIO_MMIO_VERSION) != 2 || + 800052c8: 100017b7 lui a5,0x10001 + 800052cc: 43dc lw a5,4(a5) + 800052ce: 2781 sext.w a5,a5 + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 800052d0: 4709 li a4,2 + 800052d2: 12e79863 bne a5,a4,80005402 <virtio_disk_init+0x16e> + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 800052d6: 100017b7 lui a5,0x10001 + 800052da: 479c lw a5,8(a5) + 800052dc: 2781 sext.w a5,a5 + *R(VIRTIO_MMIO_VERSION) != 2 || + 800052de: 12e79263 bne a5,a4,80005402 <virtio_disk_init+0x16e> + *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){ + 800052e2: 100017b7 lui a5,0x10001 + 800052e6: 47d8 lw a4,12(a5) + 800052e8: 2701 sext.w a4,a4 + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 800052ea: 554d47b7 lui a5,0x554d4 + 800052ee: 55178793 addi a5,a5,1361 # 554d4551 <_entry-0x2ab2baaf> + 800052f2: 10f71863 bne a4,a5,80005402 <virtio_disk_init+0x16e> + *R(VIRTIO_MMIO_STATUS) = status; + 800052f6: 100017b7 lui a5,0x10001 + 800052fa: 0607a823 sw zero,112(a5) # 10001070 <_entry-0x6fffef90> + *R(VIRTIO_MMIO_STATUS) = status; + 800052fe: 4705 li a4,1 + 80005300: dbb8 sw a4,112(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 80005302: 470d li a4,3 + 80005304: dbb8 sw a4,112(a5) + uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES); + 80005306: 4b98 lw a4,16(a5) + *R(VIRTIO_MMIO_DRIVER_FEATURES) = features; + 80005308: c7ffe6b7 lui a3,0xc7ffe + 8000530c: 75f68693 addi a3,a3,1887 # ffffffffc7ffe75f <end+0xffffffff47fdbf6f> + 80005310: 8f75 and a4,a4,a3 + 80005312: d398 sw a4,32(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 80005314: 472d li a4,11 + 80005316: dbb8 sw a4,112(a5) + status = *R(VIRTIO_MMIO_STATUS); + 80005318: 5bbc lw a5,112(a5) + 8000531a: 0007891b sext.w s2,a5 + if(!(status & VIRTIO_CONFIG_S_FEATURES_OK)) + 8000531e: 8ba1 andi a5,a5,8 + 80005320: 0e078763 beqz a5,8000540e <virtio_disk_init+0x17a> + *R(VIRTIO_MMIO_QUEUE_SEL) = 0; + 80005324: 100017b7 lui a5,0x10001 + 80005328: 0207a823 sw zero,48(a5) # 10001030 <_entry-0x6fffefd0> + if(*R(VIRTIO_MMIO_QUEUE_READY)) + 8000532c: 43fc lw a5,68(a5) + 8000532e: 2781 sext.w a5,a5 + 80005330: 0e079563 bnez a5,8000541a <virtio_disk_init+0x186> + uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX); + 80005334: 100017b7 lui a5,0x10001 + 80005338: 5bdc lw a5,52(a5) + 8000533a: 2781 sext.w a5,a5 + if(max == 0) + 8000533c: 0e078563 beqz a5,80005426 <virtio_disk_init+0x192> + if(max < NUM) + 80005340: 471d li a4,7 + 80005342: 0ef77863 bgeu a4,a5,80005432 <virtio_disk_init+0x19e> + disk.desc = kalloc(); + 80005346: f82fb0ef jal ra,80000ac8 <kalloc> + 8000534a: 0001d497 auipc s1,0x1d + 8000534e: 36648493 addi s1,s1,870 # 800226b0 <disk> + 80005352: e088 sd a0,0(s1) + disk.avail = kalloc(); + 80005354: f74fb0ef jal ra,80000ac8 <kalloc> + 80005358: e488 sd a0,8(s1) + disk.used = kalloc(); + 8000535a: f6efb0ef jal ra,80000ac8 <kalloc> + 8000535e: 87aa mv a5,a0 + 80005360: e888 sd a0,16(s1) + if(!disk.desc || !disk.avail || !disk.used) + 80005362: 6088 ld a0,0(s1) + 80005364: cd69 beqz a0,8000543e <virtio_disk_init+0x1aa> + 80005366: 0001d717 auipc a4,0x1d + 8000536a: 35273703 ld a4,850(a4) # 800226b8 <disk+0x8> + 8000536e: cb61 beqz a4,8000543e <virtio_disk_init+0x1aa> + 80005370: c7f9 beqz a5,8000543e <virtio_disk_init+0x1aa> + memset(disk.desc, 0, PGSIZE); + 80005372: 6605 lui a2,0x1 + 80005374: 4581 li a1,0 + 80005376: 8f7fb0ef jal ra,80000c6c <memset> + memset(disk.avail, 0, PGSIZE); + 8000537a: 0001d497 auipc s1,0x1d + 8000537e: 33648493 addi s1,s1,822 # 800226b0 <disk> + 80005382: 6605 lui a2,0x1 + 80005384: 4581 li a1,0 + 80005386: 6488 ld a0,8(s1) + 80005388: 8e5fb0ef jal ra,80000c6c <memset> + memset(disk.used, 0, PGSIZE); + 8000538c: 6605 lui a2,0x1 + 8000538e: 4581 li a1,0 + 80005390: 6888 ld a0,16(s1) + 80005392: 8dbfb0ef jal ra,80000c6c <memset> + *R(VIRTIO_MMIO_QUEUE_NUM) = NUM; + 80005396: 100017b7 lui a5,0x10001 + 8000539a: 4721 li a4,8 + 8000539c: df98 sw a4,56(a5) + *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; + 8000539e: 4098 lw a4,0(s1) + 800053a0: 08e7a023 sw a4,128(a5) # 10001080 <_entry-0x6fffef80> + *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; + 800053a4: 40d8 lw a4,4(s1) + 800053a6: 08e7a223 sw a4,132(a5) + *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; + 800053aa: 6498 ld a4,8(s1) + 800053ac: 0007069b sext.w a3,a4 + 800053b0: 08d7a823 sw a3,144(a5) + *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; + 800053b4: 9701 srai a4,a4,0x20 + 800053b6: 08e7aa23 sw a4,148(a5) + *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; + 800053ba: 6898 ld a4,16(s1) + 800053bc: 0007069b sext.w a3,a4 + 800053c0: 0ad7a023 sw a3,160(a5) + *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; + 800053c4: 9701 srai a4,a4,0x20 + 800053c6: 0ae7a223 sw a4,164(a5) + *R(VIRTIO_MMIO_QUEUE_READY) = 0x1; + 800053ca: 4705 li a4,1 + 800053cc: c3f8 sw a4,68(a5) + disk.free[i] = 1; + 800053ce: 00e48c23 sb a4,24(s1) + 800053d2: 00e48ca3 sb a4,25(s1) + 800053d6: 00e48d23 sb a4,26(s1) + 800053da: 00e48da3 sb a4,27(s1) + 800053de: 00e48e23 sb a4,28(s1) + 800053e2: 00e48ea3 sb a4,29(s1) + 800053e6: 00e48f23 sb a4,30(s1) + 800053ea: 00e48fa3 sb a4,31(s1) + status |= VIRTIO_CONFIG_S_DRIVER_OK; + 800053ee: 00496913 ori s2,s2,4 + *R(VIRTIO_MMIO_STATUS) = status; + 800053f2: 0727a823 sw s2,112(a5) +} + 800053f6: 60e2 ld ra,24(sp) + 800053f8: 6442 ld s0,16(sp) + 800053fa: 64a2 ld s1,8(sp) + 800053fc: 6902 ld s2,0(sp) + 800053fe: 6105 addi sp,sp,32 + 80005400: 8082 ret + panic("could not find virtio disk"); + 80005402: 00002517 auipc a0,0x2 + 80005406: 53650513 addi a0,a0,1334 # 80007938 <syscall_name+0x320> + 8000540a: b4cfb0ef jal ra,80000756 <panic> + panic("virtio disk FEATURES_OK unset"); + 8000540e: 00002517 auipc a0,0x2 + 80005412: 54a50513 addi a0,a0,1354 # 80007958 <syscall_name+0x340> + 80005416: b40fb0ef jal ra,80000756 <panic> + panic("virtio disk should not be ready"); + 8000541a: 00002517 auipc a0,0x2 + 8000541e: 55e50513 addi a0,a0,1374 # 80007978 <syscall_name+0x360> + 80005422: b34fb0ef jal ra,80000756 <panic> + panic("virtio disk has no queue 0"); + 80005426: 00002517 auipc a0,0x2 + 8000542a: 57250513 addi a0,a0,1394 # 80007998 <syscall_name+0x380> + 8000542e: b28fb0ef jal ra,80000756 <panic> + panic("virtio disk max queue too short"); + 80005432: 00002517 auipc a0,0x2 + 80005436: 58650513 addi a0,a0,1414 # 800079b8 <syscall_name+0x3a0> + 8000543a: b1cfb0ef jal ra,80000756 <panic> + panic("virtio disk kalloc"); + 8000543e: 00002517 auipc a0,0x2 + 80005442: 59a50513 addi a0,a0,1434 # 800079d8 <syscall_name+0x3c0> + 80005446: b10fb0ef jal ra,80000756 <panic> + +000000008000544a <virtio_disk_rw>: + return 0; +} + +void +virtio_disk_rw(struct buf *b, int write) +{ + 8000544a: 7119 addi sp,sp,-128 + 8000544c: fc86 sd ra,120(sp) + 8000544e: f8a2 sd s0,112(sp) + 80005450: f4a6 sd s1,104(sp) + 80005452: f0ca sd s2,96(sp) + 80005454: ecce sd s3,88(sp) + 80005456: e8d2 sd s4,80(sp) + 80005458: e4d6 sd s5,72(sp) + 8000545a: e0da sd s6,64(sp) + 8000545c: fc5e sd s7,56(sp) + 8000545e: f862 sd s8,48(sp) + 80005460: f466 sd s9,40(sp) + 80005462: f06a sd s10,32(sp) + 80005464: ec6e sd s11,24(sp) + 80005466: 0100 addi s0,sp,128 + 80005468: 8aaa mv s5,a0 + 8000546a: 8c2e mv s8,a1 + uint64 sector = b->blockno * (BSIZE / 512); + 8000546c: 00c52d03 lw s10,12(a0) + 80005470: 001d1d1b slliw s10,s10,0x1 + 80005474: 1d02 slli s10,s10,0x20 + 80005476: 020d5d13 srli s10,s10,0x20 + + acquire(&disk.vdisk_lock); + 8000547a: 0001d517 auipc a0,0x1d + 8000547e: 35e50513 addi a0,a0,862 # 800227d8 <disk+0x128> + 80005482: f16fb0ef jal ra,80000b98 <acquire> + for(int i = 0; i < 3; i++){ + 80005486: 4981 li s3,0 + for(int i = 0; i < NUM; i++){ + 80005488: 44a1 li s1,8 + disk.free[i] = 0; + 8000548a: 0001db97 auipc s7,0x1d + 8000548e: 226b8b93 addi s7,s7,550 # 800226b0 <disk> + for(int i = 0; i < 3; i++){ + 80005492: 4b0d li s6,3 + int idx[3]; + while(1){ + if(alloc3_desc(idx) == 0) { + break; + } + sleep(&disk.free[0], &disk.vdisk_lock); + 80005494: 0001dc97 auipc s9,0x1d + 80005498: 344c8c93 addi s9,s9,836 # 800227d8 <disk+0x128> + 8000549c: a8a9 j 800054f6 <virtio_disk_rw+0xac> + disk.free[i] = 0; + 8000549e: 00fb8733 add a4,s7,a5 + 800054a2: 00070c23 sb zero,24(a4) + idx[i] = alloc_desc(); + 800054a6: c19c sw a5,0(a1) + if(idx[i] < 0){ + 800054a8: 0207c563 bltz a5,800054d2 <virtio_disk_rw+0x88> + for(int i = 0; i < 3; i++){ + 800054ac: 2905 addiw s2,s2,1 + 800054ae: 0611 addi a2,a2,4 # 1004 <_entry-0x7fffeffc> + 800054b0: 05690863 beq s2,s6,80005500 <virtio_disk_rw+0xb6> + idx[i] = alloc_desc(); + 800054b4: 85b2 mv a1,a2 + for(int i = 0; i < NUM; i++){ + 800054b6: 0001d717 auipc a4,0x1d + 800054ba: 1fa70713 addi a4,a4,506 # 800226b0 <disk> + 800054be: 87ce mv a5,s3 + if(disk.free[i]){ + 800054c0: 01874683 lbu a3,24(a4) + 800054c4: fee9 bnez a3,8000549e <virtio_disk_rw+0x54> + for(int i = 0; i < NUM; i++){ + 800054c6: 2785 addiw a5,a5,1 + 800054c8: 0705 addi a4,a4,1 + 800054ca: fe979be3 bne a5,s1,800054c0 <virtio_disk_rw+0x76> + idx[i] = alloc_desc(); + 800054ce: 57fd li a5,-1 + 800054d0: c19c sw a5,0(a1) + for(int j = 0; j < i; j++) + 800054d2: 01205b63 blez s2,800054e8 <virtio_disk_rw+0x9e> + 800054d6: 8dce mv s11,s3 + free_desc(idx[j]); + 800054d8: 000a2503 lw a0,0(s4) + 800054dc: d43ff0ef jal ra,8000521e <free_desc> + for(int j = 0; j < i; j++) + 800054e0: 2d85 addiw s11,s11,1 + 800054e2: 0a11 addi s4,s4,4 + 800054e4: ff2d9ae3 bne s11,s2,800054d8 <virtio_disk_rw+0x8e> + sleep(&disk.free[0], &disk.vdisk_lock); + 800054e8: 85e6 mv a1,s9 + 800054ea: 0001d517 auipc a0,0x1d + 800054ee: 1de50513 addi a0,a0,478 # 800226c8 <disk+0x18> + 800054f2: 92bfc0ef jal ra,80001e1c <sleep> + for(int i = 0; i < 3; i++){ + 800054f6: f8040a13 addi s4,s0,-128 +{ + 800054fa: 8652 mv a2,s4 + for(int i = 0; i < 3; i++){ + 800054fc: 894e mv s2,s3 + 800054fe: bf5d j 800054b4 <virtio_disk_rw+0x6a> + } + + // format the three descriptors. + // qemu's virtio-blk.c reads them. + + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 80005500: f8042503 lw a0,-128(s0) + 80005504: 00a50713 addi a4,a0,10 + 80005508: 0712 slli a4,a4,0x4 + + if(write) + 8000550a: 0001d797 auipc a5,0x1d + 8000550e: 1a678793 addi a5,a5,422 # 800226b0 <disk> + 80005512: 00e786b3 add a3,a5,a4 + 80005516: 01803633 snez a2,s8 + 8000551a: c690 sw a2,8(a3) + buf0->type = VIRTIO_BLK_T_OUT; // write the disk + else + buf0->type = VIRTIO_BLK_T_IN; // read the disk + buf0->reserved = 0; + 8000551c: 0006a623 sw zero,12(a3) + buf0->sector = sector; + 80005520: 01a6b823 sd s10,16(a3) + + disk.desc[idx[0]].addr = (uint64) buf0; + 80005524: f6070613 addi a2,a4,-160 + 80005528: 6394 ld a3,0(a5) + 8000552a: 96b2 add a3,a3,a2 + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 8000552c: 00870593 addi a1,a4,8 + 80005530: 95be add a1,a1,a5 + disk.desc[idx[0]].addr = (uint64) buf0; + 80005532: e28c sd a1,0(a3) + disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); + 80005534: 0007b803 ld a6,0(a5) + 80005538: 9642 add a2,a2,a6 + 8000553a: 46c1 li a3,16 + 8000553c: c614 sw a3,8(a2) + disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; + 8000553e: 4585 li a1,1 + 80005540: 00b61623 sh a1,12(a2) + disk.desc[idx[0]].next = idx[1]; + 80005544: f8442683 lw a3,-124(s0) + 80005548: 00d61723 sh a3,14(a2) + + disk.desc[idx[1]].addr = (uint64) b->data; + 8000554c: 0692 slli a3,a3,0x4 + 8000554e: 9836 add a6,a6,a3 + 80005550: 058a8613 addi a2,s5,88 + 80005554: 00c83023 sd a2,0(a6) + disk.desc[idx[1]].len = BSIZE; + 80005558: 0007b803 ld a6,0(a5) + 8000555c: 96c2 add a3,a3,a6 + 8000555e: 40000613 li a2,1024 + 80005562: c690 sw a2,8(a3) + if(write) + 80005564: 001c3613 seqz a2,s8 + 80005568: 0016161b slliw a2,a2,0x1 + disk.desc[idx[1]].flags = 0; // device reads b->data + else + disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data + disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; + 8000556c: 00166613 ori a2,a2,1 + 80005570: 00c69623 sh a2,12(a3) + disk.desc[idx[1]].next = idx[2]; + 80005574: f8842603 lw a2,-120(s0) + 80005578: 00c69723 sh a2,14(a3) + + disk.info[idx[0]].status = 0xff; // device writes 0 on success + 8000557c: 00250693 addi a3,a0,2 + 80005580: 0692 slli a3,a3,0x4 + 80005582: 96be add a3,a3,a5 + 80005584: 58fd li a7,-1 + 80005586: 01168823 sb a7,16(a3) + disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; + 8000558a: 0612 slli a2,a2,0x4 + 8000558c: 9832 add a6,a6,a2 + 8000558e: f9070713 addi a4,a4,-112 + 80005592: 973e add a4,a4,a5 + 80005594: 00e83023 sd a4,0(a6) + disk.desc[idx[2]].len = 1; + 80005598: 6398 ld a4,0(a5) + 8000559a: 9732 add a4,a4,a2 + 8000559c: c70c sw a1,8(a4) + disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status + 8000559e: 4609 li a2,2 + 800055a0: 00c71623 sh a2,12(a4) + disk.desc[idx[2]].next = 0; + 800055a4: 00071723 sh zero,14(a4) + + // record struct buf for virtio_disk_intr(). + b->disk = 1; + 800055a8: 00baa223 sw a1,4(s5) + disk.info[idx[0]].b = b; + 800055ac: 0156b423 sd s5,8(a3) + + // tell the device the first index in our chain of descriptors. + disk.avail->ring[disk.avail->idx % NUM] = idx[0]; + 800055b0: 6794 ld a3,8(a5) + 800055b2: 0026d703 lhu a4,2(a3) + 800055b6: 8b1d andi a4,a4,7 + 800055b8: 0706 slli a4,a4,0x1 + 800055ba: 96ba add a3,a3,a4 + 800055bc: 00a69223 sh a0,4(a3) + + __sync_synchronize(); + 800055c0: 0ff0000f fence + + // tell the device another avail ring entry is available. + disk.avail->idx += 1; // not % NUM ... + 800055c4: 6798 ld a4,8(a5) + 800055c6: 00275783 lhu a5,2(a4) + 800055ca: 2785 addiw a5,a5,1 + 800055cc: 00f71123 sh a5,2(a4) + + __sync_synchronize(); + 800055d0: 0ff0000f fence + + *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number + 800055d4: 100017b7 lui a5,0x10001 + 800055d8: 0407a823 sw zero,80(a5) # 10001050 <_entry-0x6fffefb0> + + // Wait for virtio_disk_intr() to say request has finished. + while(b->disk == 1) { + 800055dc: 004aa783 lw a5,4(s5) + sleep(b, &disk.vdisk_lock); + 800055e0: 0001d917 auipc s2,0x1d + 800055e4: 1f890913 addi s2,s2,504 # 800227d8 <disk+0x128> + while(b->disk == 1) { + 800055e8: 4485 li s1,1 + 800055ea: 00b79a63 bne a5,a1,800055fe <virtio_disk_rw+0x1b4> + sleep(b, &disk.vdisk_lock); + 800055ee: 85ca mv a1,s2 + 800055f0: 8556 mv a0,s5 + 800055f2: 82bfc0ef jal ra,80001e1c <sleep> + while(b->disk == 1) { + 800055f6: 004aa783 lw a5,4(s5) + 800055fa: fe978ae3 beq a5,s1,800055ee <virtio_disk_rw+0x1a4> + } + + disk.info[idx[0]].b = 0; + 800055fe: f8042903 lw s2,-128(s0) + 80005602: 00290713 addi a4,s2,2 + 80005606: 0712 slli a4,a4,0x4 + 80005608: 0001d797 auipc a5,0x1d + 8000560c: 0a878793 addi a5,a5,168 # 800226b0 <disk> + 80005610: 97ba add a5,a5,a4 + 80005612: 0007b423 sd zero,8(a5) + int flag = disk.desc[i].flags; + 80005616: 0001d997 auipc s3,0x1d + 8000561a: 09a98993 addi s3,s3,154 # 800226b0 <disk> + 8000561e: 00491713 slli a4,s2,0x4 + 80005622: 0009b783 ld a5,0(s3) + 80005626: 97ba add a5,a5,a4 + 80005628: 00c7d483 lhu s1,12(a5) + int nxt = disk.desc[i].next; + 8000562c: 854a mv a0,s2 + 8000562e: 00e7d903 lhu s2,14(a5) + free_desc(i); + 80005632: bedff0ef jal ra,8000521e <free_desc> + if(flag & VRING_DESC_F_NEXT) + 80005636: 8885 andi s1,s1,1 + 80005638: f0fd bnez s1,8000561e <virtio_disk_rw+0x1d4> + free_chain(idx[0]); + + release(&disk.vdisk_lock); + 8000563a: 0001d517 auipc a0,0x1d + 8000563e: 19e50513 addi a0,a0,414 # 800227d8 <disk+0x128> + 80005642: deefb0ef jal ra,80000c30 <release> +} + 80005646: 70e6 ld ra,120(sp) + 80005648: 7446 ld s0,112(sp) + 8000564a: 74a6 ld s1,104(sp) + 8000564c: 7906 ld s2,96(sp) + 8000564e: 69e6 ld s3,88(sp) + 80005650: 6a46 ld s4,80(sp) + 80005652: 6aa6 ld s5,72(sp) + 80005654: 6b06 ld s6,64(sp) + 80005656: 7be2 ld s7,56(sp) + 80005658: 7c42 ld s8,48(sp) + 8000565a: 7ca2 ld s9,40(sp) + 8000565c: 7d02 ld s10,32(sp) + 8000565e: 6de2 ld s11,24(sp) + 80005660: 6109 addi sp,sp,128 + 80005662: 8082 ret + +0000000080005664 <virtio_disk_intr>: + +void +virtio_disk_intr() +{ + 80005664: 1101 addi sp,sp,-32 + 80005666: ec06 sd ra,24(sp) + 80005668: e822 sd s0,16(sp) + 8000566a: e426 sd s1,8(sp) + 8000566c: 1000 addi s0,sp,32 + acquire(&disk.vdisk_lock); + 8000566e: 0001d497 auipc s1,0x1d + 80005672: 04248493 addi s1,s1,66 # 800226b0 <disk> + 80005676: 0001d517 auipc a0,0x1d + 8000567a: 16250513 addi a0,a0,354 # 800227d8 <disk+0x128> + 8000567e: d1afb0ef jal ra,80000b98 <acquire> + // we've seen this interrupt, which the following line does. + // this may race with the device writing new entries to + // the "used" ring, in which case we may process the new + // completion entries in this interrupt, and have nothing to do + // in the next interrupt, which is harmless. + *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3; + 80005682: 10001737 lui a4,0x10001 + 80005686: 533c lw a5,96(a4) + 80005688: 8b8d andi a5,a5,3 + 8000568a: d37c sw a5,100(a4) + + __sync_synchronize(); + 8000568c: 0ff0000f fence + + // the device increments disk.used->idx when it + // adds an entry to the used ring. + + while(disk.used_idx != disk.used->idx){ + 80005690: 689c ld a5,16(s1) + 80005692: 0204d703 lhu a4,32(s1) + 80005696: 0027d783 lhu a5,2(a5) + 8000569a: 04f70663 beq a4,a5,800056e6 <virtio_disk_intr+0x82> + __sync_synchronize(); + 8000569e: 0ff0000f fence + int id = disk.used->ring[disk.used_idx % NUM].id; + 800056a2: 6898 ld a4,16(s1) + 800056a4: 0204d783 lhu a5,32(s1) + 800056a8: 8b9d andi a5,a5,7 + 800056aa: 078e slli a5,a5,0x3 + 800056ac: 97ba add a5,a5,a4 + 800056ae: 43dc lw a5,4(a5) + + if(disk.info[id].status != 0) + 800056b0: 00278713 addi a4,a5,2 + 800056b4: 0712 slli a4,a4,0x4 + 800056b6: 9726 add a4,a4,s1 + 800056b8: 01074703 lbu a4,16(a4) # 10001010 <_entry-0x6fffeff0> + 800056bc: e321 bnez a4,800056fc <virtio_disk_intr+0x98> + panic("virtio_disk_intr status"); + + struct buf *b = disk.info[id].b; + 800056be: 0789 addi a5,a5,2 + 800056c0: 0792 slli a5,a5,0x4 + 800056c2: 97a6 add a5,a5,s1 + 800056c4: 6788 ld a0,8(a5) + b->disk = 0; // disk is done with buf + 800056c6: 00052223 sw zero,4(a0) + wakeup(b); + 800056ca: f9efc0ef jal ra,80001e68 <wakeup> + + disk.used_idx += 1; + 800056ce: 0204d783 lhu a5,32(s1) + 800056d2: 2785 addiw a5,a5,1 + 800056d4: 17c2 slli a5,a5,0x30 + 800056d6: 93c1 srli a5,a5,0x30 + 800056d8: 02f49023 sh a5,32(s1) + while(disk.used_idx != disk.used->idx){ + 800056dc: 6898 ld a4,16(s1) + 800056de: 00275703 lhu a4,2(a4) + 800056e2: faf71ee3 bne a4,a5,8000569e <virtio_disk_intr+0x3a> + } + + release(&disk.vdisk_lock); + 800056e6: 0001d517 auipc a0,0x1d + 800056ea: 0f250513 addi a0,a0,242 # 800227d8 <disk+0x128> + 800056ee: d42fb0ef jal ra,80000c30 <release> +} + 800056f2: 60e2 ld ra,24(sp) + 800056f4: 6442 ld s0,16(sp) + 800056f6: 64a2 ld s1,8(sp) + 800056f8: 6105 addi sp,sp,32 + 800056fa: 8082 ret + panic("virtio_disk_intr status"); + 800056fc: 00002517 auipc a0,0x2 + 80005700: 2f450513 addi a0,a0,756 # 800079f0 <syscall_name+0x3d8> + 80005704: 852fb0ef jal ra,80000756 <panic> + ... + +0000000080006000 <_trampoline>: + 80006000: 14051073 csrw sscratch,a0 + 80006004: 02000537 lui a0,0x2000 + 80006008: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 8000600a: 0536 slli a0,a0,0xd + 8000600c: 02153423 sd ra,40(a0) + 80006010: 02253823 sd sp,48(a0) + 80006014: 02353c23 sd gp,56(a0) + 80006018: 04453023 sd tp,64(a0) + 8000601c: 04553423 sd t0,72(a0) + 80006020: 04653823 sd t1,80(a0) + 80006024: 04753c23 sd t2,88(a0) + 80006028: f120 sd s0,96(a0) + 8000602a: f524 sd s1,104(a0) + 8000602c: fd2c sd a1,120(a0) + 8000602e: e150 sd a2,128(a0) + 80006030: e554 sd a3,136(a0) + 80006032: e958 sd a4,144(a0) + 80006034: ed5c sd a5,152(a0) + 80006036: 0b053023 sd a6,160(a0) + 8000603a: 0b153423 sd a7,168(a0) + 8000603e: 0b253823 sd s2,176(a0) + 80006042: 0b353c23 sd s3,184(a0) + 80006046: 0d453023 sd s4,192(a0) + 8000604a: 0d553423 sd s5,200(a0) + 8000604e: 0d653823 sd s6,208(a0) + 80006052: 0d753c23 sd s7,216(a0) + 80006056: 0f853023 sd s8,224(a0) + 8000605a: 0f953423 sd s9,232(a0) + 8000605e: 0fa53823 sd s10,240(a0) + 80006062: 0fb53c23 sd s11,248(a0) + 80006066: 11c53023 sd t3,256(a0) + 8000606a: 11d53423 sd t4,264(a0) + 8000606e: 11e53823 sd t5,272(a0) + 80006072: 11f53c23 sd t6,280(a0) + 80006076: 140022f3 csrr t0,sscratch + 8000607a: 06553823 sd t0,112(a0) + 8000607e: 00853103 ld sp,8(a0) + 80006082: 02053203 ld tp,32(a0) + 80006086: 01053283 ld t0,16(a0) + 8000608a: 00053303 ld t1,0(a0) + 8000608e: 12000073 sfence.vma + 80006092: 18031073 csrw satp,t1 + 80006096: 12000073 sfence.vma + 8000609a: 8282 jr t0 + +000000008000609c <userret>: + 8000609c: 12000073 sfence.vma + 800060a0: 18051073 csrw satp,a0 + 800060a4: 12000073 sfence.vma + 800060a8: 02000537 lui a0,0x2000 + 800060ac: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 800060ae: 0536 slli a0,a0,0xd + 800060b0: 02853083 ld ra,40(a0) + 800060b4: 03053103 ld sp,48(a0) + 800060b8: 03853183 ld gp,56(a0) + 800060bc: 04053203 ld tp,64(a0) + 800060c0: 04853283 ld t0,72(a0) + 800060c4: 05053303 ld t1,80(a0) + 800060c8: 05853383 ld t2,88(a0) + 800060cc: 7120 ld s0,96(a0) + 800060ce: 7524 ld s1,104(a0) + 800060d0: 7d2c ld a1,120(a0) + 800060d2: 6150 ld a2,128(a0) + 800060d4: 6554 ld a3,136(a0) + 800060d6: 6958 ld a4,144(a0) + 800060d8: 6d5c ld a5,152(a0) + 800060da: 0a053803 ld a6,160(a0) + 800060de: 0a853883 ld a7,168(a0) + 800060e2: 0b053903 ld s2,176(a0) + 800060e6: 0b853983 ld s3,184(a0) + 800060ea: 0c053a03 ld s4,192(a0) + 800060ee: 0c853a83 ld s5,200(a0) + 800060f2: 0d053b03 ld s6,208(a0) + 800060f6: 0d853b83 ld s7,216(a0) + 800060fa: 0e053c03 ld s8,224(a0) + 800060fe: 0e853c83 ld s9,232(a0) + 80006102: 0f053d03 ld s10,240(a0) + 80006106: 0f853d83 ld s11,248(a0) + 8000610a: 10053e03 ld t3,256(a0) + 8000610e: 10853e83 ld t4,264(a0) + 80006112: 11053f03 ld t5,272(a0) + 80006116: 11853f83 ld t6,280(a0) + 8000611a: 7928 ld a0,112(a0) + 8000611c: 10200073 sret + ... diff --git a/kernel/kernel.sym b/kernel/kernel.sym new file mode 100644 index 0000000000000000000000000000000000000000..3406fde86c20d8fabb141a6e8ad39d7bb3c4dd5c --- /dev/null +++ b/kernel/kernel.sym @@ -0,0 +1,269 @@ +0000000080000000 .text +0000000080007000 .rodata +0000000080007a08 .data +0000000080007a58 .got +0000000080007a68 .got.plt +0000000080007a80 .bss +0000000000000000 .riscv.attributes +0000000000000000 .comment +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .debug_frame +0000000000000000 entry.o +000000008000001a spin +0000000000000000 start.c +0000000000000000 console.c +0000000000000000 printf.c +0000000080000410 printint +0000000080007038 digits +000000008000fb68 pr +0000000000000000 uart.c +0000000000000000 kalloc.c +0000000000000000 spinlock.c +0000000000000000 string.c +0000000000000000 main.c +0000000080007a98 started +0000000000000000 vm.c +0000000000000000 proc.c +0000000080007a10 first.1 +000000008000199c freeproc +00000000800019ec allocproc +0000000080007300 states.0 +0000000000000000 swtch.o +0000000000000000 trap.c +0000000000000000 syscall.c +0000000080002614 argraw +0000000080007550 syscalls +0000000080007618 syscall_name +0000000000000000 sysproc.c +0000000000000000 bio.c +0000000000000000 fs.c +0000000080002ca0 bfree +0000000080002d0c balloc +0000000080002e1a bmap +0000000080002ee8 iget +00000000800036aa namex +0000000000000000 log.c +00000000800038ac write_head +000000008000391c install_trans +0000000000000000 sleeplock.c +0000000000000000 file.c +0000000000000000 pipe.c +0000000000000000 exec.c +0000000000000000 sysfile.c +0000000080004762 argfd +00000000800047ba fdalloc +00000000800047f8 create +0000000000000000 kernelvec.o +0000000000000000 plic.c +0000000000000000 virtio_disk.c +000000008000521e free_desc +00000000800226b0 disk +0000000080007a58 _GLOBAL_OFFSET_TABLE_ +0000000080000fc0 mappages +0000000080001620 copyinstr +000000008000012c consoleread +0000000080000db2 safestrcpy +0000000080004a0c sys_close +0000000080001df0 yield +00000000800215b0 log +000000008000fbc0 kmem +00000000800007be uartinit +0000000080002178 either_copyout +000000008000001c timerinit +0000000080010010 proc +0000000080003f74 fileread +00000000800004a2 printf +000000008000287c sys_sbrk +0000000080006000 trampoline +0000000080007a80 panicked +00000000800051d8 plic_claim +000000008000fba0 uart_tx_buf +000000008000518e plicinit +00000000800051f8 plic_complete +0000000080001d36 sched +0000000080000cc8 memmove +0000000080002766 syscall +00000000800017fe cpuid +00000000800034f6 writei +0000000080002846 sys_fork +0000000080017428 bcache +0000000080004e3c sys_mkdir +0000000080001166 uvmunmap +00000000800035f8 namecmp +00000000800051a4 plicinithart +00000000800029d8 sys_mycall +0000000080001ed2 reparent +0000000080002736 argstr +0000000080001296 uvmdealloc +00000000800029e8 sys_GSCinfo +0000000080003e28 filedup +000000008000387a namei +0000000080002a20 binit +00000000800014b8 uvmclear +000000008000497c sys_read +0000000080002f94 fsinit +0000000080000d24 memcpy +0000000080001070 kvmmap +000000008000084e uartstart +00000000800009e6 kfree +000000008000180e mycpu +0000000080003340 iput +0000000080001098 kvmmake +000000008000243c devintr +0000000080007a14 nextpid +0000000080003da6 fileinit +000000008000609c userret +0000000080000b18 initlock +00000000800014e2 copyout +0000000080001e1c sleep +0000000080005130 kernelvec +0000000080001238 uvmfirst +00000000800033e8 stati +000000008000fbf8 wait_lock +000000008000294e sys_kill +00000000800041fc pipeclose +0000000080004a4e sys_fstat +00000000800000d0 consolewrite +0000000080003ac4 end_op +0000000080000a4c freerange +0000000080000ec0 kvminithart +00000000800012da uvmalloc +0000000080001406 uvmcopy +0000000080007aa8 initproc +0000000080001956 proc_freepagetable +000000008000326c iunlock +00000000800018d2 proc_pagetable +0000000080007ac0 stack0 +00000000800028b2 sys_sleep +0000000080004a88 sys_link +0000000080003dca filealloc +0000000080001e68 wakeup +0000000080005294 virtio_disk_init +000000008000182a myproc +000000008000318c idup +0000000080007a88 uart_tx_r +0000000080000ee8 walk +0000000080004cf4 sys_open +0000000080007a90 uart_tx_w +0000000080003412 readi +000000008000025a consoleintr +0000000080000228 consputc +0000000080001fca kill +0000000080001894 allocpid +0000000080003058 ialloc +00000000800009aa uartintr +000000008000159a copyin +000000008000231a trapinit +00000000800013d4 uvmfree +00000000800227f0 end +00000000800032ac itrunc +0000000080004022 filewrite +00000000800026fe argint +00000000800029aa sys_trace +0000000080004410 exec +0000000080007000 etext +00000000800049c4 sys_write +0000000080000c30 release +00000000800026be fetchstr +000000008000207e wait +0000000080002356 usertrapret +0000000080001c82 scheduler +0000000080006000 _trampoline +000000008000360e dirlookup +0000000080003a56 begin_op +0000000080003e6e fileclose +00000000800024ac usertrap +0000000080000d38 strncmp +0000000080017410 tickslock +0000000080004254 pipewrite +0000000080000d74 strncpy +00000000800216f8 ftable +0000000080005664 virtio_disk_intr +0000000080004936 sys_dup +0000000080000756 panic +000000008000185a forkret +0000000080000a94 kinit +0000000080000c8e memcmp +00000000800021c2 either_copyin +0000000080001b6a fork +00000000800023e8 clockintr +000000008000fc10 cpus +0000000080003d24 releasesleep +0000000080000000 _entry +0000000080000b2e holding +000000008001fae8 sb +0000000080000b98 acquire +0000000080003894 nameiparent +0000000080007a20 initcode +000000008000233e trapinithart +000000008000310e iupdate +0000000080000c6c memset +0000000080000e0e main +0000000080002030 setkilled +0000000080003bd8 log_write +0000000080003cde acquiresleep +0000000080004b7e sys_unlink +0000000080006000 uservec +000000008000114a kvminit +0000000080002c6c bunpin +000000008000271a argaddr +0000000080002970 sys_uptime +0000000080000986 uartgetc +0000000080000790 printfinit +000000008000fb88 uart_tx_lock +0000000080001212 uvmcreate +0000000080001b1a growproc +0000000080003d5c holdingsleep +0000000080002054 killed +0000000080001aac userinit +0000000080002aa6 bread +0000000080004328 piperead +0000000080007ab0 ticks +00000000800003cc consoleinit +0000000080000f82 walkaddr +000000008000220c procdump +00000000800008e0 uartputc +0000000080002bae brelse +00000000800031c2 ilock +0000000080004f60 sys_exec +00000000800022b0 swtch +00000000800033c8 iunlockput +0000000080000b58 push_off +00000000800043f6 flags2perm +0000000080000bdc pop_off +0000000080002b7c bwrite +000000008000080a uartputc_sync +0000000080001f28 exit +0000000080001374 freewalk +000000008000285a sys_wait +000000008000280c sys_exit +00000000800037e0 dirlink +0000000080003ca8 initsleeplock +0000000080000060 start +0000000080007aa0 kernel_pagetable +000000008000544a virtio_disk_rw +0000000080000de4 strlen +000000008000504a sys_pipe +0000000080003000 iinit +00000000800039c4 initlog +000000008000fac0 cons +0000000080000ac8 kalloc +0000000080002674 fetchaddr +0000000080021658 devsw +0000000080002830 sys_getpid +000000008000413a pipealloc +0000000080004ee4 sys_chdir +00000000800016cc proc_mapstacks +0000000080002584 kerneltrap +0000000080002c38 bpin +0000000080001756 procinit +000000008001fb08 itable +0000000080004e84 sys_mknod +0000000080003f16 filestat +000000008000fbe0 pid_lock diff --git a/kernel/kernelvec.o b/kernel/kernelvec.o new file mode 100644 index 0000000000000000000000000000000000000000..6e4f61c19a1db4661260776f6c046b3ec80dd80e Binary files /dev/null and b/kernel/kernelvec.o differ diff --git a/kernel/log.d b/kernel/log.d new file mode 100644 index 0000000000000000000000000000000000000000..535ea6ace2baf752ed7571594acf58f0d77accae --- /dev/null +++ b/kernel/log.d @@ -0,0 +1,3 @@ +kernel/log.o: kernel/log.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/riscv.h kernel/defs.h kernel/param.h \ + kernel/spinlock.h kernel/sleeplock.h kernel/fs.h kernel/buf.h diff --git a/kernel/log.o b/kernel/log.o new file mode 100644 index 0000000000000000000000000000000000000000..6292d323d4538d247d5c304756ba87c222d1f1f6 Binary files /dev/null and b/kernel/log.o differ diff --git a/kernel/main.d b/kernel/main.d new file mode 100644 index 0000000000000000000000000000000000000000..5cd099f59771f81d708bdd0d7d41e176b0cfa39b --- /dev/null +++ b/kernel/main.d @@ -0,0 +1,3 @@ +kernel/main.o: kernel/main.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/defs.h diff --git a/kernel/main.o b/kernel/main.o new file mode 100644 index 0000000000000000000000000000000000000000..6f9fb2fcea94cfe582484617fcab08bdb6dd7448 Binary files /dev/null and b/kernel/main.o differ diff --git a/kernel/pipe.d b/kernel/pipe.d new file mode 100644 index 0000000000000000000000000000000000000000..66191b5d231e2d2d492e5b76ee83dc2a0d1df57b --- /dev/null +++ b/kernel/pipe.d @@ -0,0 +1,4 @@ +kernel/pipe.o: kernel/pipe.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/riscv.h kernel/defs.h kernel/param.h \ + kernel/spinlock.h kernel/proc.h kernel/fs.h kernel/sleeplock.h \ + kernel/file.h diff --git a/kernel/pipe.o b/kernel/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..dfc23d05d6e03732a27b850a0750702f5fe874cc Binary files /dev/null and b/kernel/pipe.o differ diff --git a/kernel/plic.d b/kernel/plic.d new file mode 100644 index 0000000000000000000000000000000000000000..d25004fe9d96e1f6da1ec772db23eec97de6aecf --- /dev/null +++ b/kernel/plic.d @@ -0,0 +1,3 @@ +kernel/plic.o: kernel/plic.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/defs.h diff --git a/kernel/plic.o b/kernel/plic.o new file mode 100644 index 0000000000000000000000000000000000000000..fa8224cddc6dd58735918df9b775b6f772fb41cf Binary files /dev/null and b/kernel/plic.o differ diff --git a/kernel/printf.d b/kernel/printf.d new file mode 100644 index 0000000000000000000000000000000000000000..142af39a0cd94caef4554924e2a043b62940ec2e --- /dev/null +++ b/kernel/printf.d @@ -0,0 +1,6 @@ +kernel/printf.o: kernel/printf.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h \ + /usr/lib/gcc-cross/riscv64-linux-gnu/11/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/kernel/printf.o b/kernel/printf.o new file mode 100644 index 0000000000000000000000000000000000000000..fbc3627875640551980ac506b04bd26f284ccfbd Binary files /dev/null and b/kernel/printf.o differ diff --git a/kernel/proc.d b/kernel/proc.d new file mode 100644 index 0000000000000000000000000000000000000000..5ca3c285f0c285c1765da503320ec57ab3620008 --- /dev/null +++ b/kernel/proc.d @@ -0,0 +1,3 @@ +kernel/proc.o: kernel/proc.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/spinlock.h kernel/proc.h kernel/defs.h diff --git a/kernel/proc.o b/kernel/proc.o new file mode 100644 index 0000000000000000000000000000000000000000..45ce59aacf1d077641bc5087e7a8ca300174f3bb Binary files /dev/null and b/kernel/proc.o differ diff --git a/kernel/sleeplock.d b/kernel/sleeplock.d new file mode 100644 index 0000000000000000000000000000000000000000..d02ff7fab5fe6f41fbbb2349cbce0f9d1415aa58 --- /dev/null +++ b/kernel/sleeplock.d @@ -0,0 +1,4 @@ +kernel/sleeplock.o: kernel/sleeplock.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/riscv.h kernel/defs.h kernel/param.h kernel/memlayout.h \ + kernel/spinlock.h kernel/proc.h kernel/sleeplock.h diff --git a/kernel/sleeplock.o b/kernel/sleeplock.o new file mode 100644 index 0000000000000000000000000000000000000000..97b3a3517450adfa26d1d28324f306e8fd661d2b Binary files /dev/null and b/kernel/sleeplock.o differ diff --git a/kernel/spinlock.d b/kernel/spinlock.d new file mode 100644 index 0000000000000000000000000000000000000000..e571bfcfc41ecce005a94cbd8f85988a4c5c62bc --- /dev/null +++ b/kernel/spinlock.d @@ -0,0 +1,4 @@ +kernel/spinlock.o: kernel/spinlock.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/param.h kernel/memlayout.h kernel/spinlock.h kernel/riscv.h \ + kernel/proc.h kernel/defs.h diff --git a/kernel/spinlock.o b/kernel/spinlock.o new file mode 100644 index 0000000000000000000000000000000000000000..5e65fbb3946df9b48fce1b1cf79f35e8e95e55d6 Binary files /dev/null and b/kernel/spinlock.o differ diff --git a/kernel/start.d b/kernel/start.d new file mode 100644 index 0000000000000000000000000000000000000000..df9574da89b1c9cf104e67b876c0e80cfae5fefb --- /dev/null +++ b/kernel/start.d @@ -0,0 +1,3 @@ +kernel/start.o: kernel/start.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/param.h kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/kernel/start.o b/kernel/start.o new file mode 100644 index 0000000000000000000000000000000000000000..d0a9b2ad48bf87e49f3335091645a17d3cc2a2b0 Binary files /dev/null and b/kernel/start.o differ diff --git a/kernel/string.d b/kernel/string.d new file mode 100644 index 0000000000000000000000000000000000000000..e04f6d3b38f81c26ca6cb9a026af35b45409b38d --- /dev/null +++ b/kernel/string.d @@ -0,0 +1,2 @@ +kernel/string.o: kernel/string.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h diff --git a/kernel/string.o b/kernel/string.o new file mode 100644 index 0000000000000000000000000000000000000000..8250094b2c98729675d31481cbae73244e3e2c10 Binary files /dev/null and b/kernel/string.o differ diff --git a/kernel/swtch.o b/kernel/swtch.o new file mode 100644 index 0000000000000000000000000000000000000000..647d80a42119e787b782c16678e914004630ce30 Binary files /dev/null and b/kernel/swtch.o differ diff --git a/kernel/syscall.d b/kernel/syscall.d new file mode 100644 index 0000000000000000000000000000000000000000..f4fbd5b63d5a9365fef0d435302e48b5360d9ff1 --- /dev/null +++ b/kernel/syscall.d @@ -0,0 +1,4 @@ +kernel/syscall.o: kernel/syscall.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/param.h kernel/memlayout.h kernel/riscv.h kernel/spinlock.h \ + kernel/proc.h kernel/syscall.h kernel/defs.h diff --git a/kernel/syscall.o b/kernel/syscall.o new file mode 100644 index 0000000000000000000000000000000000000000..91e51e1a5b62558c55131d894cfd7432b880f4fc Binary files /dev/null and b/kernel/syscall.o differ diff --git a/kernel/sysfile.d b/kernel/sysfile.d new file mode 100644 index 0000000000000000000000000000000000000000..af7971b2783e2870a14e8758b52313f8155d8ba4 --- /dev/null +++ b/kernel/sysfile.d @@ -0,0 +1,5 @@ +kernel/sysfile.o: kernel/sysfile.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/riscv.h kernel/defs.h kernel/param.h kernel/stat.h \ + kernel/spinlock.h kernel/proc.h kernel/fs.h kernel/sleeplock.h \ + kernel/file.h kernel/fcntl.h diff --git a/kernel/sysfile.o b/kernel/sysfile.o new file mode 100644 index 0000000000000000000000000000000000000000..35ab309dbb9e3cd21ec8f570b90d07ba7284e926 Binary files /dev/null and b/kernel/sysfile.o differ diff --git a/kernel/sysproc.d b/kernel/sysproc.d new file mode 100644 index 0000000000000000000000000000000000000000..8b95f87ce297279ebda77e45e236bec82b42bcf9 --- /dev/null +++ b/kernel/sysproc.d @@ -0,0 +1,4 @@ +kernel/sysproc.o: kernel/sysproc.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/riscv.h kernel/defs.h kernel/param.h kernel/memlayout.h \ + kernel/spinlock.h kernel/proc.h diff --git a/kernel/sysproc.o b/kernel/sysproc.o new file mode 100644 index 0000000000000000000000000000000000000000..5622a3dc16fa5d0971ab54bcaf3012452c444fba Binary files /dev/null and b/kernel/sysproc.o differ diff --git a/kernel/trampoline.o b/kernel/trampoline.o new file mode 100644 index 0000000000000000000000000000000000000000..71f7a1b7b839163f76d81afaee00acd9330b490d Binary files /dev/null and b/kernel/trampoline.o differ diff --git a/kernel/trap.d b/kernel/trap.d new file mode 100644 index 0000000000000000000000000000000000000000..a256b6d83fbb31a75a6ecf141811a88c8c70d3f0 --- /dev/null +++ b/kernel/trap.d @@ -0,0 +1,3 @@ +kernel/trap.o: kernel/trap.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/spinlock.h kernel/proc.h kernel/defs.h diff --git a/kernel/trap.o b/kernel/trap.o new file mode 100644 index 0000000000000000000000000000000000000000..027f808fc935c6b77caee8ef867484749786203d Binary files /dev/null and b/kernel/trap.o differ diff --git a/kernel/uart.d b/kernel/uart.d new file mode 100644 index 0000000000000000000000000000000000000000..154ae193b4c94af1ee51e6476885d4c6556e5cd4 --- /dev/null +++ b/kernel/uart.d @@ -0,0 +1,3 @@ +kernel/uart.o: kernel/uart.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/param.h kernel/memlayout.h kernel/riscv.h \ + kernel/spinlock.h kernel/proc.h kernel/defs.h diff --git a/kernel/uart.o b/kernel/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..e7e9918f12609b9623f1ad76c290140040e6d230 Binary files /dev/null and b/kernel/uart.o differ diff --git a/kernel/virtio_disk.d b/kernel/virtio_disk.d new file mode 100644 index 0000000000000000000000000000000000000000..29e5c17c0a38d1b95bb27ce121176648983bef26 --- /dev/null +++ b/kernel/virtio_disk.d @@ -0,0 +1,5 @@ +kernel/virtio_disk.o: kernel/virtio_disk.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/riscv.h kernel/defs.h kernel/param.h kernel/memlayout.h \ + kernel/spinlock.h kernel/sleeplock.h kernel/fs.h kernel/buf.h \ + kernel/virtio.h diff --git a/kernel/virtio_disk.o b/kernel/virtio_disk.o new file mode 100644 index 0000000000000000000000000000000000000000..ac601dbf30704910a94ee17eae696a7f240c92a1 Binary files /dev/null and b/kernel/virtio_disk.o differ diff --git a/kernel/vm.d b/kernel/vm.d new file mode 100644 index 0000000000000000000000000000000000000000..55d102f2eff7a2c60d794fc01711859caf35c741 --- /dev/null +++ b/kernel/vm.d @@ -0,0 +1,3 @@ +kernel/vm.o: kernel/vm.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/param.h kernel/types.h kernel/memlayout.h kernel/elf.h \ + kernel/riscv.h kernel/defs.h kernel/fs.h diff --git a/kernel/vm.o b/kernel/vm.o new file mode 100644 index 0000000000000000000000000000000000000000..d2a94224c5b616ada52687bcc1529ae3be920509 Binary files /dev/null and b/kernel/vm.o differ diff --git a/user/_cat b/user/_cat new file mode 100755 index 0000000000000000000000000000000000000000..e793d6a93c1c07cbf5b06aaa2ec25c9d6292c654 Binary files /dev/null and b/user/_cat differ diff --git a/user/_echo b/user/_echo new file mode 100755 index 0000000000000000000000000000000000000000..1ed663f935c3d919bd27b14f63a4dd3ae7d69964 Binary files /dev/null and b/user/_echo differ diff --git a/user/_forktest b/user/_forktest new file mode 100755 index 0000000000000000000000000000000000000000..3c71d4bbe9007277cb551260bf9c25d0f2b2d3a5 Binary files /dev/null and b/user/_forktest differ diff --git a/user/_grep b/user/_grep new file mode 100755 index 0000000000000000000000000000000000000000..c2c22b7ec08b483f9997ff6750fd95589a0fd00c Binary files /dev/null and b/user/_grep differ diff --git a/user/_grind b/user/_grind new file mode 100755 index 0000000000000000000000000000000000000000..87886246c57cc46bc2660de51227705ac31f613a Binary files /dev/null and b/user/_grind differ diff --git a/user/_init b/user/_init new file mode 100755 index 0000000000000000000000000000000000000000..e015f18f965229cf6e6295e9646d9b3eadf05413 Binary files /dev/null and b/user/_init differ diff --git a/user/_kill b/user/_kill new file mode 100755 index 0000000000000000000000000000000000000000..91931e354721689c2ec0a9b8e3710a10e24ea4d0 Binary files /dev/null and b/user/_kill differ diff --git a/user/_ln b/user/_ln new file mode 100755 index 0000000000000000000000000000000000000000..d8173fafa773544a1d2f701a7f33644d2d2c852d Binary files /dev/null and b/user/_ln differ diff --git a/user/_ls b/user/_ls new file mode 100755 index 0000000000000000000000000000000000000000..cc440eacf9a4aa9e36f3eb335d84e402d9dbdbaf Binary files /dev/null and b/user/_ls differ diff --git a/user/_mkdir b/user/_mkdir new file mode 100755 index 0000000000000000000000000000000000000000..5f4a67d37079bb1a36cbf86c1f6191a817f4fa4e Binary files /dev/null and b/user/_mkdir differ diff --git a/user/_rm b/user/_rm new file mode 100755 index 0000000000000000000000000000000000000000..b22c2e2e85217addb5ac1cb386950b555127cd01 Binary files /dev/null and b/user/_rm differ diff --git a/user/_sh b/user/_sh new file mode 100755 index 0000000000000000000000000000000000000000..7703281cbddc2e50c840bfe914aada0c16c19321 Binary files /dev/null and b/user/_sh differ diff --git a/user/_stressfs b/user/_stressfs new file mode 100755 index 0000000000000000000000000000000000000000..f763a67ed5f45eb2819822026cdbf2b45c0f89a6 Binary files /dev/null and b/user/_stressfs differ diff --git a/user/_test_SCinfo b/user/_test_SCinfo new file mode 100755 index 0000000000000000000000000000000000000000..bd6ec6919a83ab3c9ca4b6f53770a58643219811 Binary files /dev/null and b/user/_test_SCinfo differ diff --git a/user/_test_mycall b/user/_test_mycall new file mode 100755 index 0000000000000000000000000000000000000000..25cf6a46c28a93a1b382beab2f03fcfa2bdbff92 Binary files /dev/null and b/user/_test_mycall differ diff --git a/user/_trace b/user/_trace new file mode 100755 index 0000000000000000000000000000000000000000..0fbf0d007749ff55d49e22232458cd15343088d3 Binary files /dev/null and b/user/_trace differ diff --git a/user/_usertests b/user/_usertests new file mode 100755 index 0000000000000000000000000000000000000000..cde6408a2eb0ef0d435f364c5877a949fdb17537 Binary files /dev/null and b/user/_usertests differ diff --git a/user/_wc b/user/_wc new file mode 100755 index 0000000000000000000000000000000000000000..17a6c442c1b3eaa10a4f0c84c39598930d968bfe Binary files /dev/null and b/user/_wc differ diff --git a/user/_zombie b/user/_zombie new file mode 100755 index 0000000000000000000000000000000000000000..c5e2afc05f4e1c6a37d144a4c6c79123c9feac4c Binary files /dev/null and b/user/_zombie differ diff --git a/user/cat.asm b/user/cat.asm new file mode 100644 index 0000000000000000000000000000000000000000..0431aeb7c0769b56294209df50e6b0ecc9f6b73d --- /dev/null +++ b/user/cat.asm @@ -0,0 +1,1556 @@ + +user/_cat: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <cat>: + +char buf[512]; + +void +cat(int fd) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: 1800 addi s0,sp,48 + e: 89aa mv s3,a0 + int n; + + while((n = read(fd, buf, sizeof(buf))) > 0) { + 10: 00001917 auipc s2,0x1 + 14: 00090913 mv s2,s2 + 18: 20000613 li a2,512 + 1c: 85ca mv a1,s2 + 1e: 854e mv a0,s3 + 20: 348000ef jal ra,368 <read> + 24: 84aa mv s1,a0 + 26: 02a05363 blez a0,4c <cat+0x4c> + if (write(1, buf, n) != n) { + 2a: 8626 mv a2,s1 + 2c: 85ca mv a1,s2 + 2e: 4505 li a0,1 + 30: 340000ef jal ra,370 <write> + 34: fe9502e3 beq a0,s1,18 <cat+0x18> + fprintf(2, "cat: write error\n"); + 38: 00001597 auipc a1,0x1 + 3c: 8d858593 addi a1,a1,-1832 # 910 <malloc+0xe8> + 40: 4509 li a0,2 + 42: 708000ef jal ra,74a <fprintf> + exit(1); + 46: 4505 li a0,1 + 48: 308000ef jal ra,350 <exit> + } + } + if(n < 0){ + 4c: 00054963 bltz a0,5e <cat+0x5e> + fprintf(2, "cat: read error\n"); + exit(1); + } +} + 50: 70a2 ld ra,40(sp) + 52: 7402 ld s0,32(sp) + 54: 64e2 ld s1,24(sp) + 56: 6942 ld s2,16(sp) + 58: 69a2 ld s3,8(sp) + 5a: 6145 addi sp,sp,48 + 5c: 8082 ret + fprintf(2, "cat: read error\n"); + 5e: 00001597 auipc a1,0x1 + 62: 8ca58593 addi a1,a1,-1846 # 928 <malloc+0x100> + 66: 4509 li a0,2 + 68: 6e2000ef jal ra,74a <fprintf> + exit(1); + 6c: 4505 li a0,1 + 6e: 2e2000ef jal ra,350 <exit> + +0000000000000072 <main>: + +int +main(int argc, char *argv[]) +{ + 72: 7179 addi sp,sp,-48 + 74: f406 sd ra,40(sp) + 76: f022 sd s0,32(sp) + 78: ec26 sd s1,24(sp) + 7a: e84a sd s2,16(sp) + 7c: e44e sd s3,8(sp) + 7e: e052 sd s4,0(sp) + 80: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + 82: 4785 li a5,1 + 84: 02a7df63 bge a5,a0,c2 <main+0x50> + 88: 00858913 addi s2,a1,8 + 8c: ffe5099b addiw s3,a0,-2 + 90: 02099793 slli a5,s3,0x20 + 94: 01d7d993 srli s3,a5,0x1d + 98: 05c1 addi a1,a1,16 + 9a: 99ae add s3,s3,a1 + cat(0); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 9c: 4581 li a1,0 + 9e: 00093503 ld a0,0(s2) # 1010 <buf> + a2: 2ee000ef jal ra,390 <open> + a6: 84aa mv s1,a0 + a8: 02054363 bltz a0,ce <main+0x5c> + fprintf(2, "cat: cannot open %s\n", argv[i]); + exit(1); + } + cat(fd); + ac: f55ff0ef jal ra,0 <cat> + close(fd); + b0: 8526 mv a0,s1 + b2: 2c6000ef jal ra,378 <close> + for(i = 1; i < argc; i++){ + b6: 0921 addi s2,s2,8 + b8: ff3912e3 bne s2,s3,9c <main+0x2a> + } + exit(0); + bc: 4501 li a0,0 + be: 292000ef jal ra,350 <exit> + cat(0); + c2: 4501 li a0,0 + c4: f3dff0ef jal ra,0 <cat> + exit(0); + c8: 4501 li a0,0 + ca: 286000ef jal ra,350 <exit> + fprintf(2, "cat: cannot open %s\n", argv[i]); + ce: 00093603 ld a2,0(s2) + d2: 00001597 auipc a1,0x1 + d6: 86e58593 addi a1,a1,-1938 # 940 <malloc+0x118> + da: 4509 li a0,2 + dc: 66e000ef jal ra,74a <fprintf> + exit(1); + e0: 4505 li a0,1 + e2: 26e000ef jal ra,350 <exit> + +00000000000000e6 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + e6: 1141 addi sp,sp,-16 + e8: e406 sd ra,8(sp) + ea: e022 sd s0,0(sp) + ec: 0800 addi s0,sp,16 + extern int main(); + main(); + ee: f85ff0ef jal ra,72 <main> + exit(0); + f2: 4501 li a0,0 + f4: 25c000ef jal ra,350 <exit> + +00000000000000f8 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + f8: 1141 addi sp,sp,-16 + fa: e422 sd s0,8(sp) + fc: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + fe: 87aa mv a5,a0 + 100: 0585 addi a1,a1,1 + 102: 0785 addi a5,a5,1 + 104: fff5c703 lbu a4,-1(a1) + 108: fee78fa3 sb a4,-1(a5) + 10c: fb75 bnez a4,100 <strcpy+0x8> + ; + return os; +} + 10e: 6422 ld s0,8(sp) + 110: 0141 addi sp,sp,16 + 112: 8082 ret + +0000000000000114 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 114: 1141 addi sp,sp,-16 + 116: e422 sd s0,8(sp) + 118: 0800 addi s0,sp,16 + while(*p && *p == *q) + 11a: 00054783 lbu a5,0(a0) + 11e: cb91 beqz a5,132 <strcmp+0x1e> + 120: 0005c703 lbu a4,0(a1) + 124: 00f71763 bne a4,a5,132 <strcmp+0x1e> + p++, q++; + 128: 0505 addi a0,a0,1 + 12a: 0585 addi a1,a1,1 + while(*p && *p == *q) + 12c: 00054783 lbu a5,0(a0) + 130: fbe5 bnez a5,120 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 132: 0005c503 lbu a0,0(a1) +} + 136: 40a7853b subw a0,a5,a0 + 13a: 6422 ld s0,8(sp) + 13c: 0141 addi sp,sp,16 + 13e: 8082 ret + +0000000000000140 <strlen>: + +uint +strlen(const char *s) +{ + 140: 1141 addi sp,sp,-16 + 142: e422 sd s0,8(sp) + 144: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 146: 00054783 lbu a5,0(a0) + 14a: cf91 beqz a5,166 <strlen+0x26> + 14c: 0505 addi a0,a0,1 + 14e: 87aa mv a5,a0 + 150: 4685 li a3,1 + 152: 9e89 subw a3,a3,a0 + 154: 00f6853b addw a0,a3,a5 + 158: 0785 addi a5,a5,1 + 15a: fff7c703 lbu a4,-1(a5) + 15e: fb7d bnez a4,154 <strlen+0x14> + ; + return n; +} + 160: 6422 ld s0,8(sp) + 162: 0141 addi sp,sp,16 + 164: 8082 ret + for(n = 0; s[n]; n++) + 166: 4501 li a0,0 + 168: bfe5 j 160 <strlen+0x20> + +000000000000016a <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 16a: 1141 addi sp,sp,-16 + 16c: e422 sd s0,8(sp) + 16e: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 170: ca19 beqz a2,186 <memset+0x1c> + 172: 87aa mv a5,a0 + 174: 1602 slli a2,a2,0x20 + 176: 9201 srli a2,a2,0x20 + 178: 00a60733 add a4,a2,a0 + cdst[i] = c; + 17c: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 180: 0785 addi a5,a5,1 + 182: fee79de3 bne a5,a4,17c <memset+0x12> + } + return dst; +} + 186: 6422 ld s0,8(sp) + 188: 0141 addi sp,sp,16 + 18a: 8082 ret + +000000000000018c <strchr>: + +char* +strchr(const char *s, char c) +{ + 18c: 1141 addi sp,sp,-16 + 18e: e422 sd s0,8(sp) + 190: 0800 addi s0,sp,16 + for(; *s; s++) + 192: 00054783 lbu a5,0(a0) + 196: cb99 beqz a5,1ac <strchr+0x20> + if(*s == c) + 198: 00f58763 beq a1,a5,1a6 <strchr+0x1a> + for(; *s; s++) + 19c: 0505 addi a0,a0,1 + 19e: 00054783 lbu a5,0(a0) + 1a2: fbfd bnez a5,198 <strchr+0xc> + return (char*)s; + return 0; + 1a4: 4501 li a0,0 +} + 1a6: 6422 ld s0,8(sp) + 1a8: 0141 addi sp,sp,16 + 1aa: 8082 ret + return 0; + 1ac: 4501 li a0,0 + 1ae: bfe5 j 1a6 <strchr+0x1a> + +00000000000001b0 <gets>: + +char* +gets(char *buf, int max) +{ + 1b0: 711d addi sp,sp,-96 + 1b2: ec86 sd ra,88(sp) + 1b4: e8a2 sd s0,80(sp) + 1b6: e4a6 sd s1,72(sp) + 1b8: e0ca sd s2,64(sp) + 1ba: fc4e sd s3,56(sp) + 1bc: f852 sd s4,48(sp) + 1be: f456 sd s5,40(sp) + 1c0: f05a sd s6,32(sp) + 1c2: ec5e sd s7,24(sp) + 1c4: 1080 addi s0,sp,96 + 1c6: 8baa mv s7,a0 + 1c8: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1ca: 892a mv s2,a0 + 1cc: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1ce: 4aa9 li s5,10 + 1d0: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1d2: 89a6 mv s3,s1 + 1d4: 2485 addiw s1,s1,1 + 1d6: 0344d663 bge s1,s4,202 <gets+0x52> + cc = read(0, &c, 1); + 1da: 4605 li a2,1 + 1dc: faf40593 addi a1,s0,-81 + 1e0: 4501 li a0,0 + 1e2: 186000ef jal ra,368 <read> + if(cc < 1) + 1e6: 00a05e63 blez a0,202 <gets+0x52> + buf[i++] = c; + 1ea: faf44783 lbu a5,-81(s0) + 1ee: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1f2: 01578763 beq a5,s5,200 <gets+0x50> + 1f6: 0905 addi s2,s2,1 + 1f8: fd679de3 bne a5,s6,1d2 <gets+0x22> + for(i=0; i+1 < max; ){ + 1fc: 89a6 mv s3,s1 + 1fe: a011 j 202 <gets+0x52> + 200: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 202: 99de add s3,s3,s7 + 204: 00098023 sb zero,0(s3) + return buf; +} + 208: 855e mv a0,s7 + 20a: 60e6 ld ra,88(sp) + 20c: 6446 ld s0,80(sp) + 20e: 64a6 ld s1,72(sp) + 210: 6906 ld s2,64(sp) + 212: 79e2 ld s3,56(sp) + 214: 7a42 ld s4,48(sp) + 216: 7aa2 ld s5,40(sp) + 218: 7b02 ld s6,32(sp) + 21a: 6be2 ld s7,24(sp) + 21c: 6125 addi sp,sp,96 + 21e: 8082 ret + +0000000000000220 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 220: 1101 addi sp,sp,-32 + 222: ec06 sd ra,24(sp) + 224: e822 sd s0,16(sp) + 226: e426 sd s1,8(sp) + 228: e04a sd s2,0(sp) + 22a: 1000 addi s0,sp,32 + 22c: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 22e: 4581 li a1,0 + 230: 160000ef jal ra,390 <open> + if(fd < 0) + 234: 02054163 bltz a0,256 <stat+0x36> + 238: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 23a: 85ca mv a1,s2 + 23c: 16c000ef jal ra,3a8 <fstat> + 240: 892a mv s2,a0 + close(fd); + 242: 8526 mv a0,s1 + 244: 134000ef jal ra,378 <close> + return r; +} + 248: 854a mv a0,s2 + 24a: 60e2 ld ra,24(sp) + 24c: 6442 ld s0,16(sp) + 24e: 64a2 ld s1,8(sp) + 250: 6902 ld s2,0(sp) + 252: 6105 addi sp,sp,32 + 254: 8082 ret + return -1; + 256: 597d li s2,-1 + 258: bfc5 j 248 <stat+0x28> + +000000000000025a <atoi>: + +int +atoi(const char *s) +{ + 25a: 1141 addi sp,sp,-16 + 25c: e422 sd s0,8(sp) + 25e: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 260: 00054683 lbu a3,0(a0) + 264: fd06879b addiw a5,a3,-48 + 268: 0ff7f793 zext.b a5,a5 + 26c: 4625 li a2,9 + 26e: 02f66863 bltu a2,a5,29e <atoi+0x44> + 272: 872a mv a4,a0 + n = 0; + 274: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 276: 0705 addi a4,a4,1 + 278: 0025179b slliw a5,a0,0x2 + 27c: 9fa9 addw a5,a5,a0 + 27e: 0017979b slliw a5,a5,0x1 + 282: 9fb5 addw a5,a5,a3 + 284: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 288: 00074683 lbu a3,0(a4) + 28c: fd06879b addiw a5,a3,-48 + 290: 0ff7f793 zext.b a5,a5 + 294: fef671e3 bgeu a2,a5,276 <atoi+0x1c> + return n; +} + 298: 6422 ld s0,8(sp) + 29a: 0141 addi sp,sp,16 + 29c: 8082 ret + n = 0; + 29e: 4501 li a0,0 + 2a0: bfe5 j 298 <atoi+0x3e> + +00000000000002a2 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 2a2: 1141 addi sp,sp,-16 + 2a4: e422 sd s0,8(sp) + 2a6: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2a8: 02b57463 bgeu a0,a1,2d0 <memmove+0x2e> + while(n-- > 0) + 2ac: 00c05f63 blez a2,2ca <memmove+0x28> + 2b0: 1602 slli a2,a2,0x20 + 2b2: 9201 srli a2,a2,0x20 + 2b4: 00c507b3 add a5,a0,a2 + dst = vdst; + 2b8: 872a mv a4,a0 + *dst++ = *src++; + 2ba: 0585 addi a1,a1,1 + 2bc: 0705 addi a4,a4,1 + 2be: fff5c683 lbu a3,-1(a1) + 2c2: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2c6: fee79ae3 bne a5,a4,2ba <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2ca: 6422 ld s0,8(sp) + 2cc: 0141 addi sp,sp,16 + 2ce: 8082 ret + dst += n; + 2d0: 00c50733 add a4,a0,a2 + src += n; + 2d4: 95b2 add a1,a1,a2 + while(n-- > 0) + 2d6: fec05ae3 blez a2,2ca <memmove+0x28> + 2da: fff6079b addiw a5,a2,-1 + 2de: 1782 slli a5,a5,0x20 + 2e0: 9381 srli a5,a5,0x20 + 2e2: fff7c793 not a5,a5 + 2e6: 97ba add a5,a5,a4 + *--dst = *--src; + 2e8: 15fd addi a1,a1,-1 + 2ea: 177d addi a4,a4,-1 + 2ec: 0005c683 lbu a3,0(a1) + 2f0: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2f4: fee79ae3 bne a5,a4,2e8 <memmove+0x46> + 2f8: bfc9 j 2ca <memmove+0x28> + +00000000000002fa <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2fa: 1141 addi sp,sp,-16 + 2fc: e422 sd s0,8(sp) + 2fe: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 300: ca05 beqz a2,330 <memcmp+0x36> + 302: fff6069b addiw a3,a2,-1 + 306: 1682 slli a3,a3,0x20 + 308: 9281 srli a3,a3,0x20 + 30a: 0685 addi a3,a3,1 + 30c: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 30e: 00054783 lbu a5,0(a0) + 312: 0005c703 lbu a4,0(a1) + 316: 00e79863 bne a5,a4,326 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 31a: 0505 addi a0,a0,1 + p2++; + 31c: 0585 addi a1,a1,1 + while (n-- > 0) { + 31e: fed518e3 bne a0,a3,30e <memcmp+0x14> + } + return 0; + 322: 4501 li a0,0 + 324: a019 j 32a <memcmp+0x30> + return *p1 - *p2; + 326: 40e7853b subw a0,a5,a4 +} + 32a: 6422 ld s0,8(sp) + 32c: 0141 addi sp,sp,16 + 32e: 8082 ret + return 0; + 330: 4501 li a0,0 + 332: bfe5 j 32a <memcmp+0x30> + +0000000000000334 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 334: 1141 addi sp,sp,-16 + 336: e406 sd ra,8(sp) + 338: e022 sd s0,0(sp) + 33a: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 33c: f67ff0ef jal ra,2a2 <memmove> +} + 340: 60a2 ld ra,8(sp) + 342: 6402 ld s0,0(sp) + 344: 0141 addi sp,sp,16 + 346: 8082 ret + +0000000000000348 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 348: 4885 li a7,1 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 <exit>: +.global exit +exit: + li a7, SYS_exit + 350: 4889 li a7,2 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 <wait>: +.global wait +wait: + li a7, SYS_wait + 358: 488d li a7,3 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 360: 4891 li a7,4 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 <read>: +.global read +read: + li a7, SYS_read + 368: 4895 li a7,5 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 <write>: +.global write +write: + li a7, SYS_write + 370: 48c1 li a7,16 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 <close>: +.global close +close: + li a7, SYS_close + 378: 48d5 li a7,21 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 <kill>: +.global kill +kill: + li a7, SYS_kill + 380: 4899 li a7,6 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 <exec>: +.global exec +exec: + li a7, SYS_exec + 388: 489d li a7,7 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 <open>: +.global open +open: + li a7, SYS_open + 390: 48bd li a7,15 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 398: 48c5 li a7,17 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 3a0: 48c9 li a7,18 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 3a8: 48a1 li a7,8 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 <link>: +.global link +link: + li a7, SYS_link + 3b0: 48cd li a7,19 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 3b8: 48d1 li a7,20 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 3c0: 48a5 li a7,9 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 <dup>: +.global dup +dup: + li a7, SYS_dup + 3c8: 48a9 li a7,10 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 3d0: 48ad li a7,11 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 3d8: 48b1 li a7,12 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 3e0: 48b5 li a7,13 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 3e8: 48b9 li a7,14 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 <trace>: +.global trace +trace: + li a7, SYS_trace + 3f0: 48d9 li a7,22 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 3f8: 48dd li a7,23 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 400: 48e1 li a7,24 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 408: 1101 addi sp,sp,-32 + 40a: ec06 sd ra,24(sp) + 40c: e822 sd s0,16(sp) + 40e: 1000 addi s0,sp,32 + 410: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 414: 4605 li a2,1 + 416: fef40593 addi a1,s0,-17 + 41a: f57ff0ef jal ra,370 <write> +} + 41e: 60e2 ld ra,24(sp) + 420: 6442 ld s0,16(sp) + 422: 6105 addi sp,sp,32 + 424: 8082 ret + +0000000000000426 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 426: 7139 addi sp,sp,-64 + 428: fc06 sd ra,56(sp) + 42a: f822 sd s0,48(sp) + 42c: f426 sd s1,40(sp) + 42e: f04a sd s2,32(sp) + 430: ec4e sd s3,24(sp) + 432: 0080 addi s0,sp,64 + 434: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 436: c299 beqz a3,43c <printint+0x16> + 438: 0805c763 bltz a1,4c6 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 43c: 2581 sext.w a1,a1 + neg = 0; + 43e: 4881 li a7,0 + 440: fc040693 addi a3,s0,-64 + } + + i = 0; + 444: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 446: 2601 sext.w a2,a2 + 448: 00000517 auipc a0,0x0 + 44c: 51850513 addi a0,a0,1304 # 960 <digits> + 450: 883a mv a6,a4 + 452: 2705 addiw a4,a4,1 + 454: 02c5f7bb remuw a5,a1,a2 + 458: 1782 slli a5,a5,0x20 + 45a: 9381 srli a5,a5,0x20 + 45c: 97aa add a5,a5,a0 + 45e: 0007c783 lbu a5,0(a5) + 462: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 466: 0005879b sext.w a5,a1 + 46a: 02c5d5bb divuw a1,a1,a2 + 46e: 0685 addi a3,a3,1 + 470: fec7f0e3 bgeu a5,a2,450 <printint+0x2a> + if(neg) + 474: 00088c63 beqz a7,48c <printint+0x66> + buf[i++] = '-'; + 478: fd070793 addi a5,a4,-48 + 47c: 00878733 add a4,a5,s0 + 480: 02d00793 li a5,45 + 484: fef70823 sb a5,-16(a4) + 488: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 48c: 02e05663 blez a4,4b8 <printint+0x92> + 490: fc040793 addi a5,s0,-64 + 494: 00e78933 add s2,a5,a4 + 498: fff78993 addi s3,a5,-1 + 49c: 99ba add s3,s3,a4 + 49e: 377d addiw a4,a4,-1 + 4a0: 1702 slli a4,a4,0x20 + 4a2: 9301 srli a4,a4,0x20 + 4a4: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 4a8: fff94583 lbu a1,-1(s2) + 4ac: 8526 mv a0,s1 + 4ae: f5bff0ef jal ra,408 <putc> + while(--i >= 0) + 4b2: 197d addi s2,s2,-1 + 4b4: ff391ae3 bne s2,s3,4a8 <printint+0x82> +} + 4b8: 70e2 ld ra,56(sp) + 4ba: 7442 ld s0,48(sp) + 4bc: 74a2 ld s1,40(sp) + 4be: 7902 ld s2,32(sp) + 4c0: 69e2 ld s3,24(sp) + 4c2: 6121 addi sp,sp,64 + 4c4: 8082 ret + x = -xx; + 4c6: 40b005bb negw a1,a1 + neg = 1; + 4ca: 4885 li a7,1 + x = -xx; + 4cc: bf95 j 440 <printint+0x1a> + +00000000000004ce <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4ce: 7119 addi sp,sp,-128 + 4d0: fc86 sd ra,120(sp) + 4d2: f8a2 sd s0,112(sp) + 4d4: f4a6 sd s1,104(sp) + 4d6: f0ca sd s2,96(sp) + 4d8: ecce sd s3,88(sp) + 4da: e8d2 sd s4,80(sp) + 4dc: e4d6 sd s5,72(sp) + 4de: e0da sd s6,64(sp) + 4e0: fc5e sd s7,56(sp) + 4e2: f862 sd s8,48(sp) + 4e4: f466 sd s9,40(sp) + 4e6: f06a sd s10,32(sp) + 4e8: ec6e sd s11,24(sp) + 4ea: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4ec: 0005c903 lbu s2,0(a1) + 4f0: 22090e63 beqz s2,72c <vprintf+0x25e> + 4f4: 8b2a mv s6,a0 + 4f6: 8a2e mv s4,a1 + 4f8: 8bb2 mv s7,a2 + state = 0; + 4fa: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4fc: 4481 li s1,0 + 4fe: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 500: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 504: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 508: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 50c: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 510: 00000c97 auipc s9,0x0 + 514: 450c8c93 addi s9,s9,1104 # 960 <digits> + 518: a005 j 538 <vprintf+0x6a> + putc(fd, c0); + 51a: 85ca mv a1,s2 + 51c: 855a mv a0,s6 + 51e: eebff0ef jal ra,408 <putc> + 522: a019 j 528 <vprintf+0x5a> + } else if(state == '%'){ + 524: 03598263 beq s3,s5,548 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 528: 2485 addiw s1,s1,1 + 52a: 8726 mv a4,s1 + 52c: 009a07b3 add a5,s4,s1 + 530: 0007c903 lbu s2,0(a5) + 534: 1e090c63 beqz s2,72c <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 538: 0009079b sext.w a5,s2 + if(state == 0){ + 53c: fe0994e3 bnez s3,524 <vprintf+0x56> + if(c0 == '%'){ + 540: fd579de3 bne a5,s5,51a <vprintf+0x4c> + state = '%'; + 544: 89be mv s3,a5 + 546: b7cd j 528 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 548: cfa5 beqz a5,5c0 <vprintf+0xf2> + 54a: 00ea06b3 add a3,s4,a4 + 54e: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 552: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 554: c681 beqz a3,55c <vprintf+0x8e> + 556: 9752 add a4,a4,s4 + 558: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 55c: 03878a63 beq a5,s8,590 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 560: 05a78463 beq a5,s10,5a8 <vprintf+0xda> + } else if(c0 == 'u'){ + 564: 0db78763 beq a5,s11,632 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 568: 07800713 li a4,120 + 56c: 10e78963 beq a5,a4,67e <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 570: 07000713 li a4,112 + 574: 12e78e63 beq a5,a4,6b0 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 578: 07300713 li a4,115 + 57c: 16e78b63 beq a5,a4,6f2 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 580: 05579063 bne a5,s5,5c0 <vprintf+0xf2> + putc(fd, '%'); + 584: 85d6 mv a1,s5 + 586: 855a mv a0,s6 + 588: e81ff0ef jal ra,408 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 58c: 4981 li s3,0 + 58e: bf69 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 590: 008b8913 addi s2,s7,8 + 594: 4685 li a3,1 + 596: 4629 li a2,10 + 598: 000ba583 lw a1,0(s7) + 59c: 855a mv a0,s6 + 59e: e89ff0ef jal ra,426 <printint> + 5a2: 8bca mv s7,s2 + state = 0; + 5a4: 4981 li s3,0 + 5a6: b749 j 528 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 5a8: 03868663 beq a3,s8,5d4 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ac: 05a68163 beq a3,s10,5ee <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 5b0: 09b68d63 beq a3,s11,64a <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5b4: 03a68f63 beq a3,s10,5f2 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 5b8: 07800793 li a5,120 + 5bc: 0cf68d63 beq a3,a5,696 <vprintf+0x1c8> + putc(fd, '%'); + 5c0: 85d6 mv a1,s5 + 5c2: 855a mv a0,s6 + 5c4: e45ff0ef jal ra,408 <putc> + putc(fd, c0); + 5c8: 85ca mv a1,s2 + 5ca: 855a mv a0,s6 + 5cc: e3dff0ef jal ra,408 <putc> + state = 0; + 5d0: 4981 li s3,0 + 5d2: bf99 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5d4: 008b8913 addi s2,s7,8 + 5d8: 4685 li a3,1 + 5da: 4629 li a2,10 + 5dc: 000ba583 lw a1,0(s7) + 5e0: 855a mv a0,s6 + 5e2: e45ff0ef jal ra,426 <printint> + i += 1; + 5e6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5e8: 8bca mv s7,s2 + state = 0; + 5ea: 4981 li s3,0 + i += 1; + 5ec: bf35 j 528 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ee: 03860563 beq a2,s8,618 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5f2: 07b60963 beq a2,s11,664 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5f6: 07800793 li a5,120 + 5fa: fcf613e3 bne a2,a5,5c0 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 5fe: 008b8913 addi s2,s7,8 + 602: 4681 li a3,0 + 604: 4641 li a2,16 + 606: 000ba583 lw a1,0(s7) + 60a: 855a mv a0,s6 + 60c: e1bff0ef jal ra,426 <printint> + i += 2; + 610: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 612: 8bca mv s7,s2 + state = 0; + 614: 4981 li s3,0 + i += 2; + 616: bf09 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 618: 008b8913 addi s2,s7,8 + 61c: 4685 li a3,1 + 61e: 4629 li a2,10 + 620: 000ba583 lw a1,0(s7) + 624: 855a mv a0,s6 + 626: e01ff0ef jal ra,426 <printint> + i += 2; + 62a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 62c: 8bca mv s7,s2 + state = 0; + 62e: 4981 li s3,0 + i += 2; + 630: bde5 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 632: 008b8913 addi s2,s7,8 + 636: 4681 li a3,0 + 638: 4629 li a2,10 + 63a: 000ba583 lw a1,0(s7) + 63e: 855a mv a0,s6 + 640: de7ff0ef jal ra,426 <printint> + 644: 8bca mv s7,s2 + state = 0; + 646: 4981 li s3,0 + 648: b5c5 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 64a: 008b8913 addi s2,s7,8 + 64e: 4681 li a3,0 + 650: 4629 li a2,10 + 652: 000ba583 lw a1,0(s7) + 656: 855a mv a0,s6 + 658: dcfff0ef jal ra,426 <printint> + i += 1; + 65c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 65e: 8bca mv s7,s2 + state = 0; + 660: 4981 li s3,0 + i += 1; + 662: b5d9 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 664: 008b8913 addi s2,s7,8 + 668: 4681 li a3,0 + 66a: 4629 li a2,10 + 66c: 000ba583 lw a1,0(s7) + 670: 855a mv a0,s6 + 672: db5ff0ef jal ra,426 <printint> + i += 2; + 676: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 678: 8bca mv s7,s2 + state = 0; + 67a: 4981 li s3,0 + i += 2; + 67c: b575 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 67e: 008b8913 addi s2,s7,8 + 682: 4681 li a3,0 + 684: 4641 li a2,16 + 686: 000ba583 lw a1,0(s7) + 68a: 855a mv a0,s6 + 68c: d9bff0ef jal ra,426 <printint> + 690: 8bca mv s7,s2 + state = 0; + 692: 4981 li s3,0 + 694: bd51 j 528 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 696: 008b8913 addi s2,s7,8 + 69a: 4681 li a3,0 + 69c: 4641 li a2,16 + 69e: 000ba583 lw a1,0(s7) + 6a2: 855a mv a0,s6 + 6a4: d83ff0ef jal ra,426 <printint> + i += 1; + 6a8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6aa: 8bca mv s7,s2 + state = 0; + 6ac: 4981 li s3,0 + i += 1; + 6ae: bdad j 528 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 6b0: 008b8793 addi a5,s7,8 + 6b4: f8f43423 sd a5,-120(s0) + 6b8: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6bc: 03000593 li a1,48 + 6c0: 855a mv a0,s6 + 6c2: d47ff0ef jal ra,408 <putc> + putc(fd, 'x'); + 6c6: 07800593 li a1,120 + 6ca: 855a mv a0,s6 + 6cc: d3dff0ef jal ra,408 <putc> + 6d0: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6d2: 03c9d793 srli a5,s3,0x3c + 6d6: 97e6 add a5,a5,s9 + 6d8: 0007c583 lbu a1,0(a5) + 6dc: 855a mv a0,s6 + 6de: d2bff0ef jal ra,408 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6e2: 0992 slli s3,s3,0x4 + 6e4: 397d addiw s2,s2,-1 + 6e6: fe0916e3 bnez s2,6d2 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 6ea: f8843b83 ld s7,-120(s0) + state = 0; + 6ee: 4981 li s3,0 + 6f0: bd25 j 528 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 6f2: 008b8993 addi s3,s7,8 + 6f6: 000bb903 ld s2,0(s7) + 6fa: 00090f63 beqz s2,718 <vprintf+0x24a> + for(; *s; s++) + 6fe: 00094583 lbu a1,0(s2) + 702: c195 beqz a1,726 <vprintf+0x258> + putc(fd, *s); + 704: 855a mv a0,s6 + 706: d03ff0ef jal ra,408 <putc> + for(; *s; s++) + 70a: 0905 addi s2,s2,1 + 70c: 00094583 lbu a1,0(s2) + 710: f9f5 bnez a1,704 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 712: 8bce mv s7,s3 + state = 0; + 714: 4981 li s3,0 + 716: bd09 j 528 <vprintf+0x5a> + s = "(null)"; + 718: 00000917 auipc s2,0x0 + 71c: 24090913 addi s2,s2,576 # 958 <malloc+0x130> + for(; *s; s++) + 720: 02800593 li a1,40 + 724: b7c5 j 704 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 726: 8bce mv s7,s3 + state = 0; + 728: 4981 li s3,0 + 72a: bbfd j 528 <vprintf+0x5a> + } + } +} + 72c: 70e6 ld ra,120(sp) + 72e: 7446 ld s0,112(sp) + 730: 74a6 ld s1,104(sp) + 732: 7906 ld s2,96(sp) + 734: 69e6 ld s3,88(sp) + 736: 6a46 ld s4,80(sp) + 738: 6aa6 ld s5,72(sp) + 73a: 6b06 ld s6,64(sp) + 73c: 7be2 ld s7,56(sp) + 73e: 7c42 ld s8,48(sp) + 740: 7ca2 ld s9,40(sp) + 742: 7d02 ld s10,32(sp) + 744: 6de2 ld s11,24(sp) + 746: 6109 addi sp,sp,128 + 748: 8082 ret + +000000000000074a <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 74a: 715d addi sp,sp,-80 + 74c: ec06 sd ra,24(sp) + 74e: e822 sd s0,16(sp) + 750: 1000 addi s0,sp,32 + 752: e010 sd a2,0(s0) + 754: e414 sd a3,8(s0) + 756: e818 sd a4,16(s0) + 758: ec1c sd a5,24(s0) + 75a: 03043023 sd a6,32(s0) + 75e: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 762: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 766: 8622 mv a2,s0 + 768: d67ff0ef jal ra,4ce <vprintf> +} + 76c: 60e2 ld ra,24(sp) + 76e: 6442 ld s0,16(sp) + 770: 6161 addi sp,sp,80 + 772: 8082 ret + +0000000000000774 <printf>: + +void +printf(const char *fmt, ...) +{ + 774: 711d addi sp,sp,-96 + 776: ec06 sd ra,24(sp) + 778: e822 sd s0,16(sp) + 77a: 1000 addi s0,sp,32 + 77c: e40c sd a1,8(s0) + 77e: e810 sd a2,16(s0) + 780: ec14 sd a3,24(s0) + 782: f018 sd a4,32(s0) + 784: f41c sd a5,40(s0) + 786: 03043823 sd a6,48(s0) + 78a: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 78e: 00840613 addi a2,s0,8 + 792: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 796: 85aa mv a1,a0 + 798: 4505 li a0,1 + 79a: d35ff0ef jal ra,4ce <vprintf> +} + 79e: 60e2 ld ra,24(sp) + 7a0: 6442 ld s0,16(sp) + 7a2: 6125 addi sp,sp,96 + 7a4: 8082 ret + +00000000000007a6 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7a6: 1141 addi sp,sp,-16 + 7a8: e422 sd s0,8(sp) + 7aa: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7ac: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7b0: 00001797 auipc a5,0x1 + 7b4: 8507b783 ld a5,-1968(a5) # 1000 <freep> + 7b8: a02d j 7e2 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 7ba: 4618 lw a4,8(a2) + 7bc: 9f2d addw a4,a4,a1 + 7be: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7c2: 6398 ld a4,0(a5) + 7c4: 6310 ld a2,0(a4) + 7c6: a83d j 804 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7c8: ff852703 lw a4,-8(a0) + 7cc: 9f31 addw a4,a4,a2 + 7ce: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7d0: ff053683 ld a3,-16(a0) + 7d4: a091 j 818 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7d6: 6398 ld a4,0(a5) + 7d8: 00e7e463 bltu a5,a4,7e0 <free+0x3a> + 7dc: 00e6ea63 bltu a3,a4,7f0 <free+0x4a> +{ + 7e0: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7e2: fed7fae3 bgeu a5,a3,7d6 <free+0x30> + 7e6: 6398 ld a4,0(a5) + 7e8: 00e6e463 bltu a3,a4,7f0 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7ec: fee7eae3 bltu a5,a4,7e0 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 7f0: ff852583 lw a1,-8(a0) + 7f4: 6390 ld a2,0(a5) + 7f6: 02059813 slli a6,a1,0x20 + 7fa: 01c85713 srli a4,a6,0x1c + 7fe: 9736 add a4,a4,a3 + 800: fae60de3 beq a2,a4,7ba <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 804: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 808: 4790 lw a2,8(a5) + 80a: 02061593 slli a1,a2,0x20 + 80e: 01c5d713 srli a4,a1,0x1c + 812: 973e add a4,a4,a5 + 814: fae68ae3 beq a3,a4,7c8 <free+0x22> + p->s.ptr = bp->s.ptr; + 818: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 81a: 00000717 auipc a4,0x0 + 81e: 7ef73323 sd a5,2022(a4) # 1000 <freep> +} + 822: 6422 ld s0,8(sp) + 824: 0141 addi sp,sp,16 + 826: 8082 ret + +0000000000000828 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 828: 7139 addi sp,sp,-64 + 82a: fc06 sd ra,56(sp) + 82c: f822 sd s0,48(sp) + 82e: f426 sd s1,40(sp) + 830: f04a sd s2,32(sp) + 832: ec4e sd s3,24(sp) + 834: e852 sd s4,16(sp) + 836: e456 sd s5,8(sp) + 838: e05a sd s6,0(sp) + 83a: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 83c: 02051493 slli s1,a0,0x20 + 840: 9081 srli s1,s1,0x20 + 842: 04bd addi s1,s1,15 + 844: 8091 srli s1,s1,0x4 + 846: 0014899b addiw s3,s1,1 + 84a: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 84c: 00000517 auipc a0,0x0 + 850: 7b453503 ld a0,1972(a0) # 1000 <freep> + 854: c515 beqz a0,880 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 856: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 858: 4798 lw a4,8(a5) + 85a: 02977f63 bgeu a4,s1,898 <malloc+0x70> + 85e: 8a4e mv s4,s3 + 860: 0009871b sext.w a4,s3 + 864: 6685 lui a3,0x1 + 866: 00d77363 bgeu a4,a3,86c <malloc+0x44> + 86a: 6a05 lui s4,0x1 + 86c: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 870: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 874: 00000917 auipc s2,0x0 + 878: 78c90913 addi s2,s2,1932 # 1000 <freep> + if(p == (char*)-1) + 87c: 5afd li s5,-1 + 87e: a885 j 8ee <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 880: 00001797 auipc a5,0x1 + 884: 99078793 addi a5,a5,-1648 # 1210 <base> + 888: 00000717 auipc a4,0x0 + 88c: 76f73c23 sd a5,1912(a4) # 1000 <freep> + 890: e39c sd a5,0(a5) + base.s.size = 0; + 892: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 896: b7e1 j 85e <malloc+0x36> + if(p->s.size == nunits) + 898: 02e48c63 beq s1,a4,8d0 <malloc+0xa8> + p->s.size -= nunits; + 89c: 4137073b subw a4,a4,s3 + 8a0: c798 sw a4,8(a5) + p += p->s.size; + 8a2: 02071693 slli a3,a4,0x20 + 8a6: 01c6d713 srli a4,a3,0x1c + 8aa: 97ba add a5,a5,a4 + p->s.size = nunits; + 8ac: 0137a423 sw s3,8(a5) + freep = prevp; + 8b0: 00000717 auipc a4,0x0 + 8b4: 74a73823 sd a0,1872(a4) # 1000 <freep> + return (void*)(p + 1); + 8b8: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 8bc: 70e2 ld ra,56(sp) + 8be: 7442 ld s0,48(sp) + 8c0: 74a2 ld s1,40(sp) + 8c2: 7902 ld s2,32(sp) + 8c4: 69e2 ld s3,24(sp) + 8c6: 6a42 ld s4,16(sp) + 8c8: 6aa2 ld s5,8(sp) + 8ca: 6b02 ld s6,0(sp) + 8cc: 6121 addi sp,sp,64 + 8ce: 8082 ret + prevp->s.ptr = p->s.ptr; + 8d0: 6398 ld a4,0(a5) + 8d2: e118 sd a4,0(a0) + 8d4: bff1 j 8b0 <malloc+0x88> + hp->s.size = nu; + 8d6: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8da: 0541 addi a0,a0,16 + 8dc: ecbff0ef jal ra,7a6 <free> + return freep; + 8e0: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8e4: dd61 beqz a0,8bc <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8e6: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8e8: 4798 lw a4,8(a5) + 8ea: fa9777e3 bgeu a4,s1,898 <malloc+0x70> + if(p == freep) + 8ee: 00093703 ld a4,0(s2) + 8f2: 853e mv a0,a5 + 8f4: fef719e3 bne a4,a5,8e6 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 8f8: 8552 mv a0,s4 + 8fa: adfff0ef jal ra,3d8 <sbrk> + if(p == (char*)-1) + 8fe: fd551ce3 bne a0,s5,8d6 <malloc+0xae> + return 0; + 902: 4501 li a0,0 + 904: bf65 j 8bc <malloc+0x94> diff --git a/user/cat.d b/user/cat.d new file mode 100644 index 0000000000000000000000000000000000000000..7125d60ca82e13e54458469b5de5157a791d36f5 --- /dev/null +++ b/user/cat.d @@ -0,0 +1,2 @@ +user/cat.o: user/cat.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/fcntl.h user/user.h diff --git a/user/cat.o b/user/cat.o new file mode 100644 index 0000000000000000000000000000000000000000..9429b5d6f802d25a56f22c22c408dade2b65acd3 Binary files /dev/null and b/user/cat.o differ diff --git a/user/cat.sym b/user/cat.sym new file mode 100644 index 0000000000000000000000000000000000000000..e4b0abeff8cc7b301701f2408c73030a5ddad285 --- /dev/null +++ b/user/cat.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +0000000000000908 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 cat.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000408 putc +0000000000000426 printint +0000000000000960 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001210 base +00000000000000f8 strcpy +0000000000000774 printf +00000000000002a2 memmove +0000000000000398 mknod +00000000000003f0 trace +00000000000001b0 gets +00000000000003d0 getpid +0000000000000334 memcpy +0000000000000000 cat +0000000000000828 malloc +00000000000003e0 sleep +00000000000003f8 mycall +0000000000000360 pipe +0000000000000370 write +00000000000003a8 fstat +000000000000074a fprintf +0000000000000380 kill +00000000000004ce vprintf +00000000000003c0 chdir +0000000000000388 exec +0000000000000358 wait +0000000000000368 read +00000000000003a0 unlink +00000000000002fa memcmp +0000000000000348 fork +00000000000003d8 sbrk +00000000000003e8 uptime +000000000000016a memset +0000000000000072 main +0000000000000400 GSCinfo +0000000000000114 strcmp +00000000000003c8 dup +0000000000001010 buf +0000000000000220 stat +00000000000003b0 link +0000000000000350 exit +00000000000000e6 start +000000000000025a atoi +0000000000000140 strlen +0000000000000390 open +000000000000018c strchr +00000000000003b8 mkdir +0000000000000378 close +00000000000007a6 free diff --git a/user/echo.asm b/user/echo.asm new file mode 100644 index 0000000000000000000000000000000000000000..0ab2391dbd466b1cfd90cbc742159e9e74a80296 --- /dev/null +++ b/user/echo.asm @@ -0,0 +1,1488 @@ + +user/_echo: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: e052 sd s4,0(sp) + e: 1800 addi s0,sp,48 + int i; + + for(i = 1; i < argc; i++){ + 10: 4785 li a5,1 + 12: 04a7dc63 bge a5,a0,6a <main+0x6a> + 16: 00858493 addi s1,a1,8 + 1a: ffe5099b addiw s3,a0,-2 + 1e: 02099793 slli a5,s3,0x20 + 22: 01d7d993 srli s3,a5,0x1d + 26: 05c1 addi a1,a1,16 + 28: 99ae add s3,s3,a1 + write(1, argv[i], strlen(argv[i])); + if(i + 1 < argc){ + write(1, " ", 1); + 2a: 00001a17 auipc s4,0x1 + 2e: 866a0a13 addi s4,s4,-1946 # 890 <malloc+0xde> + write(1, argv[i], strlen(argv[i])); + 32: 0004b903 ld s2,0(s1) + 36: 854a mv a0,s2 + 38: 092000ef jal ra,ca <strlen> + 3c: 0005061b sext.w a2,a0 + 40: 85ca mv a1,s2 + 42: 4505 li a0,1 + 44: 2b6000ef jal ra,2fa <write> + if(i + 1 < argc){ + 48: 04a1 addi s1,s1,8 + 4a: 01348863 beq s1,s3,5a <main+0x5a> + write(1, " ", 1); + 4e: 4605 li a2,1 + 50: 85d2 mv a1,s4 + 52: 4505 li a0,1 + 54: 2a6000ef jal ra,2fa <write> + for(i = 1; i < argc; i++){ + 58: bfe9 j 32 <main+0x32> + } else { + write(1, "\n", 1); + 5a: 4605 li a2,1 + 5c: 00001597 auipc a1,0x1 + 60: 83c58593 addi a1,a1,-1988 # 898 <malloc+0xe6> + 64: 4505 li a0,1 + 66: 294000ef jal ra,2fa <write> + } + } + exit(0); + 6a: 4501 li a0,0 + 6c: 26e000ef jal ra,2da <exit> + +0000000000000070 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 70: 1141 addi sp,sp,-16 + 72: e406 sd ra,8(sp) + 74: e022 sd s0,0(sp) + 76: 0800 addi s0,sp,16 + extern int main(); + main(); + 78: f89ff0ef jal ra,0 <main> + exit(0); + 7c: 4501 li a0,0 + 7e: 25c000ef jal ra,2da <exit> + +0000000000000082 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 82: 1141 addi sp,sp,-16 + 84: e422 sd s0,8(sp) + 86: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 88: 87aa mv a5,a0 + 8a: 0585 addi a1,a1,1 + 8c: 0785 addi a5,a5,1 + 8e: fff5c703 lbu a4,-1(a1) + 92: fee78fa3 sb a4,-1(a5) + 96: fb75 bnez a4,8a <strcpy+0x8> + ; + return os; +} + 98: 6422 ld s0,8(sp) + 9a: 0141 addi sp,sp,16 + 9c: 8082 ret + +000000000000009e <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 9e: 1141 addi sp,sp,-16 + a0: e422 sd s0,8(sp) + a2: 0800 addi s0,sp,16 + while(*p && *p == *q) + a4: 00054783 lbu a5,0(a0) + a8: cb91 beqz a5,bc <strcmp+0x1e> + aa: 0005c703 lbu a4,0(a1) + ae: 00f71763 bne a4,a5,bc <strcmp+0x1e> + p++, q++; + b2: 0505 addi a0,a0,1 + b4: 0585 addi a1,a1,1 + while(*p && *p == *q) + b6: 00054783 lbu a5,0(a0) + ba: fbe5 bnez a5,aa <strcmp+0xc> + return (uchar)*p - (uchar)*q; + bc: 0005c503 lbu a0,0(a1) +} + c0: 40a7853b subw a0,a5,a0 + c4: 6422 ld s0,8(sp) + c6: 0141 addi sp,sp,16 + c8: 8082 ret + +00000000000000ca <strlen>: + +uint +strlen(const char *s) +{ + ca: 1141 addi sp,sp,-16 + cc: e422 sd s0,8(sp) + ce: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + d0: 00054783 lbu a5,0(a0) + d4: cf91 beqz a5,f0 <strlen+0x26> + d6: 0505 addi a0,a0,1 + d8: 87aa mv a5,a0 + da: 4685 li a3,1 + dc: 9e89 subw a3,a3,a0 + de: 00f6853b addw a0,a3,a5 + e2: 0785 addi a5,a5,1 + e4: fff7c703 lbu a4,-1(a5) + e8: fb7d bnez a4,de <strlen+0x14> + ; + return n; +} + ea: 6422 ld s0,8(sp) + ec: 0141 addi sp,sp,16 + ee: 8082 ret + for(n = 0; s[n]; n++) + f0: 4501 li a0,0 + f2: bfe5 j ea <strlen+0x20> + +00000000000000f4 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + f4: 1141 addi sp,sp,-16 + f6: e422 sd s0,8(sp) + f8: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + fa: ca19 beqz a2,110 <memset+0x1c> + fc: 87aa mv a5,a0 + fe: 1602 slli a2,a2,0x20 + 100: 9201 srli a2,a2,0x20 + 102: 00a60733 add a4,a2,a0 + cdst[i] = c; + 106: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 10a: 0785 addi a5,a5,1 + 10c: fee79de3 bne a5,a4,106 <memset+0x12> + } + return dst; +} + 110: 6422 ld s0,8(sp) + 112: 0141 addi sp,sp,16 + 114: 8082 ret + +0000000000000116 <strchr>: + +char* +strchr(const char *s, char c) +{ + 116: 1141 addi sp,sp,-16 + 118: e422 sd s0,8(sp) + 11a: 0800 addi s0,sp,16 + for(; *s; s++) + 11c: 00054783 lbu a5,0(a0) + 120: cb99 beqz a5,136 <strchr+0x20> + if(*s == c) + 122: 00f58763 beq a1,a5,130 <strchr+0x1a> + for(; *s; s++) + 126: 0505 addi a0,a0,1 + 128: 00054783 lbu a5,0(a0) + 12c: fbfd bnez a5,122 <strchr+0xc> + return (char*)s; + return 0; + 12e: 4501 li a0,0 +} + 130: 6422 ld s0,8(sp) + 132: 0141 addi sp,sp,16 + 134: 8082 ret + return 0; + 136: 4501 li a0,0 + 138: bfe5 j 130 <strchr+0x1a> + +000000000000013a <gets>: + +char* +gets(char *buf, int max) +{ + 13a: 711d addi sp,sp,-96 + 13c: ec86 sd ra,88(sp) + 13e: e8a2 sd s0,80(sp) + 140: e4a6 sd s1,72(sp) + 142: e0ca sd s2,64(sp) + 144: fc4e sd s3,56(sp) + 146: f852 sd s4,48(sp) + 148: f456 sd s5,40(sp) + 14a: f05a sd s6,32(sp) + 14c: ec5e sd s7,24(sp) + 14e: 1080 addi s0,sp,96 + 150: 8baa mv s7,a0 + 152: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 154: 892a mv s2,a0 + 156: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 158: 4aa9 li s5,10 + 15a: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 15c: 89a6 mv s3,s1 + 15e: 2485 addiw s1,s1,1 + 160: 0344d663 bge s1,s4,18c <gets+0x52> + cc = read(0, &c, 1); + 164: 4605 li a2,1 + 166: faf40593 addi a1,s0,-81 + 16a: 4501 li a0,0 + 16c: 186000ef jal ra,2f2 <read> + if(cc < 1) + 170: 00a05e63 blez a0,18c <gets+0x52> + buf[i++] = c; + 174: faf44783 lbu a5,-81(s0) + 178: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 17c: 01578763 beq a5,s5,18a <gets+0x50> + 180: 0905 addi s2,s2,1 + 182: fd679de3 bne a5,s6,15c <gets+0x22> + for(i=0; i+1 < max; ){ + 186: 89a6 mv s3,s1 + 188: a011 j 18c <gets+0x52> + 18a: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 18c: 99de add s3,s3,s7 + 18e: 00098023 sb zero,0(s3) + return buf; +} + 192: 855e mv a0,s7 + 194: 60e6 ld ra,88(sp) + 196: 6446 ld s0,80(sp) + 198: 64a6 ld s1,72(sp) + 19a: 6906 ld s2,64(sp) + 19c: 79e2 ld s3,56(sp) + 19e: 7a42 ld s4,48(sp) + 1a0: 7aa2 ld s5,40(sp) + 1a2: 7b02 ld s6,32(sp) + 1a4: 6be2 ld s7,24(sp) + 1a6: 6125 addi sp,sp,96 + 1a8: 8082 ret + +00000000000001aa <stat>: + +int +stat(const char *n, struct stat *st) +{ + 1aa: 1101 addi sp,sp,-32 + 1ac: ec06 sd ra,24(sp) + 1ae: e822 sd s0,16(sp) + 1b0: e426 sd s1,8(sp) + 1b2: e04a sd s2,0(sp) + 1b4: 1000 addi s0,sp,32 + 1b6: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1b8: 4581 li a1,0 + 1ba: 160000ef jal ra,31a <open> + if(fd < 0) + 1be: 02054163 bltz a0,1e0 <stat+0x36> + 1c2: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1c4: 85ca mv a1,s2 + 1c6: 16c000ef jal ra,332 <fstat> + 1ca: 892a mv s2,a0 + close(fd); + 1cc: 8526 mv a0,s1 + 1ce: 134000ef jal ra,302 <close> + return r; +} + 1d2: 854a mv a0,s2 + 1d4: 60e2 ld ra,24(sp) + 1d6: 6442 ld s0,16(sp) + 1d8: 64a2 ld s1,8(sp) + 1da: 6902 ld s2,0(sp) + 1dc: 6105 addi sp,sp,32 + 1de: 8082 ret + return -1; + 1e0: 597d li s2,-1 + 1e2: bfc5 j 1d2 <stat+0x28> + +00000000000001e4 <atoi>: + +int +atoi(const char *s) +{ + 1e4: 1141 addi sp,sp,-16 + 1e6: e422 sd s0,8(sp) + 1e8: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1ea: 00054683 lbu a3,0(a0) + 1ee: fd06879b addiw a5,a3,-48 + 1f2: 0ff7f793 zext.b a5,a5 + 1f6: 4625 li a2,9 + 1f8: 02f66863 bltu a2,a5,228 <atoi+0x44> + 1fc: 872a mv a4,a0 + n = 0; + 1fe: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 200: 0705 addi a4,a4,1 + 202: 0025179b slliw a5,a0,0x2 + 206: 9fa9 addw a5,a5,a0 + 208: 0017979b slliw a5,a5,0x1 + 20c: 9fb5 addw a5,a5,a3 + 20e: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 212: 00074683 lbu a3,0(a4) + 216: fd06879b addiw a5,a3,-48 + 21a: 0ff7f793 zext.b a5,a5 + 21e: fef671e3 bgeu a2,a5,200 <atoi+0x1c> + return n; +} + 222: 6422 ld s0,8(sp) + 224: 0141 addi sp,sp,16 + 226: 8082 ret + n = 0; + 228: 4501 li a0,0 + 22a: bfe5 j 222 <atoi+0x3e> + +000000000000022c <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 22c: 1141 addi sp,sp,-16 + 22e: e422 sd s0,8(sp) + 230: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 232: 02b57463 bgeu a0,a1,25a <memmove+0x2e> + while(n-- > 0) + 236: 00c05f63 blez a2,254 <memmove+0x28> + 23a: 1602 slli a2,a2,0x20 + 23c: 9201 srli a2,a2,0x20 + 23e: 00c507b3 add a5,a0,a2 + dst = vdst; + 242: 872a mv a4,a0 + *dst++ = *src++; + 244: 0585 addi a1,a1,1 + 246: 0705 addi a4,a4,1 + 248: fff5c683 lbu a3,-1(a1) + 24c: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 250: fee79ae3 bne a5,a4,244 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 254: 6422 ld s0,8(sp) + 256: 0141 addi sp,sp,16 + 258: 8082 ret + dst += n; + 25a: 00c50733 add a4,a0,a2 + src += n; + 25e: 95b2 add a1,a1,a2 + while(n-- > 0) + 260: fec05ae3 blez a2,254 <memmove+0x28> + 264: fff6079b addiw a5,a2,-1 + 268: 1782 slli a5,a5,0x20 + 26a: 9381 srli a5,a5,0x20 + 26c: fff7c793 not a5,a5 + 270: 97ba add a5,a5,a4 + *--dst = *--src; + 272: 15fd addi a1,a1,-1 + 274: 177d addi a4,a4,-1 + 276: 0005c683 lbu a3,0(a1) + 27a: 00d70023 sb a3,0(a4) + while(n-- > 0) + 27e: fee79ae3 bne a5,a4,272 <memmove+0x46> + 282: bfc9 j 254 <memmove+0x28> + +0000000000000284 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 284: 1141 addi sp,sp,-16 + 286: e422 sd s0,8(sp) + 288: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 28a: ca05 beqz a2,2ba <memcmp+0x36> + 28c: fff6069b addiw a3,a2,-1 + 290: 1682 slli a3,a3,0x20 + 292: 9281 srli a3,a3,0x20 + 294: 0685 addi a3,a3,1 + 296: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 298: 00054783 lbu a5,0(a0) + 29c: 0005c703 lbu a4,0(a1) + 2a0: 00e79863 bne a5,a4,2b0 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 2a4: 0505 addi a0,a0,1 + p2++; + 2a6: 0585 addi a1,a1,1 + while (n-- > 0) { + 2a8: fed518e3 bne a0,a3,298 <memcmp+0x14> + } + return 0; + 2ac: 4501 li a0,0 + 2ae: a019 j 2b4 <memcmp+0x30> + return *p1 - *p2; + 2b0: 40e7853b subw a0,a5,a4 +} + 2b4: 6422 ld s0,8(sp) + 2b6: 0141 addi sp,sp,16 + 2b8: 8082 ret + return 0; + 2ba: 4501 li a0,0 + 2bc: bfe5 j 2b4 <memcmp+0x30> + +00000000000002be <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2be: 1141 addi sp,sp,-16 + 2c0: e406 sd ra,8(sp) + 2c2: e022 sd s0,0(sp) + 2c4: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2c6: f67ff0ef jal ra,22c <memmove> +} + 2ca: 60a2 ld ra,8(sp) + 2cc: 6402 ld s0,0(sp) + 2ce: 0141 addi sp,sp,16 + 2d0: 8082 ret + +00000000000002d2 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2d2: 4885 li a7,1 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da <exit>: +.global exit +exit: + li a7, SYS_exit + 2da: 4889 li a7,2 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 <wait>: +.global wait +wait: + li a7, SYS_wait + 2e2: 488d li a7,3 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2ea: 4891 li a7,4 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 <read>: +.global read +read: + li a7, SYS_read + 2f2: 4895 li a7,5 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa <write>: +.global write +write: + li a7, SYS_write + 2fa: 48c1 li a7,16 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 <close>: +.global close +close: + li a7, SYS_close + 302: 48d5 li a7,21 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a <kill>: +.global kill +kill: + li a7, SYS_kill + 30a: 4899 li a7,6 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 <exec>: +.global exec +exec: + li a7, SYS_exec + 312: 489d li a7,7 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a <open>: +.global open +open: + li a7, SYS_open + 31a: 48bd li a7,15 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 322: 48c5 li a7,17 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 32a: 48c9 li a7,18 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 332: 48a1 li a7,8 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a <link>: +.global link +link: + li a7, SYS_link + 33a: 48cd li a7,19 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 342: 48d1 li a7,20 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 34a: 48a5 li a7,9 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 <dup>: +.global dup +dup: + li a7, SYS_dup + 352: 48a9 li a7,10 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 35a: 48ad li a7,11 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 362: 48b1 li a7,12 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 36a: 48b5 li a7,13 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 372: 48b9 li a7,14 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a <trace>: +.global trace +trace: + li a7, SYS_trace + 37a: 48d9 li a7,22 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 382: 48dd li a7,23 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 38a: 48e1 li a7,24 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 392: 1101 addi sp,sp,-32 + 394: ec06 sd ra,24(sp) + 396: e822 sd s0,16(sp) + 398: 1000 addi s0,sp,32 + 39a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 39e: 4605 li a2,1 + 3a0: fef40593 addi a1,s0,-17 + 3a4: f57ff0ef jal ra,2fa <write> +} + 3a8: 60e2 ld ra,24(sp) + 3aa: 6442 ld s0,16(sp) + 3ac: 6105 addi sp,sp,32 + 3ae: 8082 ret + +00000000000003b0 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3b0: 7139 addi sp,sp,-64 + 3b2: fc06 sd ra,56(sp) + 3b4: f822 sd s0,48(sp) + 3b6: f426 sd s1,40(sp) + 3b8: f04a sd s2,32(sp) + 3ba: ec4e sd s3,24(sp) + 3bc: 0080 addi s0,sp,64 + 3be: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3c0: c299 beqz a3,3c6 <printint+0x16> + 3c2: 0805c763 bltz a1,450 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3c6: 2581 sext.w a1,a1 + neg = 0; + 3c8: 4881 li a7,0 + 3ca: fc040693 addi a3,s0,-64 + } + + i = 0; + 3ce: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3d0: 2601 sext.w a2,a2 + 3d2: 00000517 auipc a0,0x0 + 3d6: 4d650513 addi a0,a0,1238 # 8a8 <digits> + 3da: 883a mv a6,a4 + 3dc: 2705 addiw a4,a4,1 + 3de: 02c5f7bb remuw a5,a1,a2 + 3e2: 1782 slli a5,a5,0x20 + 3e4: 9381 srli a5,a5,0x20 + 3e6: 97aa add a5,a5,a0 + 3e8: 0007c783 lbu a5,0(a5) + 3ec: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3f0: 0005879b sext.w a5,a1 + 3f4: 02c5d5bb divuw a1,a1,a2 + 3f8: 0685 addi a3,a3,1 + 3fa: fec7f0e3 bgeu a5,a2,3da <printint+0x2a> + if(neg) + 3fe: 00088c63 beqz a7,416 <printint+0x66> + buf[i++] = '-'; + 402: fd070793 addi a5,a4,-48 + 406: 00878733 add a4,a5,s0 + 40a: 02d00793 li a5,45 + 40e: fef70823 sb a5,-16(a4) + 412: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 416: 02e05663 blez a4,442 <printint+0x92> + 41a: fc040793 addi a5,s0,-64 + 41e: 00e78933 add s2,a5,a4 + 422: fff78993 addi s3,a5,-1 + 426: 99ba add s3,s3,a4 + 428: 377d addiw a4,a4,-1 + 42a: 1702 slli a4,a4,0x20 + 42c: 9301 srli a4,a4,0x20 + 42e: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 432: fff94583 lbu a1,-1(s2) + 436: 8526 mv a0,s1 + 438: f5bff0ef jal ra,392 <putc> + while(--i >= 0) + 43c: 197d addi s2,s2,-1 + 43e: ff391ae3 bne s2,s3,432 <printint+0x82> +} + 442: 70e2 ld ra,56(sp) + 444: 7442 ld s0,48(sp) + 446: 74a2 ld s1,40(sp) + 448: 7902 ld s2,32(sp) + 44a: 69e2 ld s3,24(sp) + 44c: 6121 addi sp,sp,64 + 44e: 8082 ret + x = -xx; + 450: 40b005bb negw a1,a1 + neg = 1; + 454: 4885 li a7,1 + x = -xx; + 456: bf95 j 3ca <printint+0x1a> + +0000000000000458 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 458: 7119 addi sp,sp,-128 + 45a: fc86 sd ra,120(sp) + 45c: f8a2 sd s0,112(sp) + 45e: f4a6 sd s1,104(sp) + 460: f0ca sd s2,96(sp) + 462: ecce sd s3,88(sp) + 464: e8d2 sd s4,80(sp) + 466: e4d6 sd s5,72(sp) + 468: e0da sd s6,64(sp) + 46a: fc5e sd s7,56(sp) + 46c: f862 sd s8,48(sp) + 46e: f466 sd s9,40(sp) + 470: f06a sd s10,32(sp) + 472: ec6e sd s11,24(sp) + 474: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 476: 0005c903 lbu s2,0(a1) + 47a: 22090e63 beqz s2,6b6 <vprintf+0x25e> + 47e: 8b2a mv s6,a0 + 480: 8a2e mv s4,a1 + 482: 8bb2 mv s7,a2 + state = 0; + 484: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 486: 4481 li s1,0 + 488: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 48a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 48e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 492: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 496: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 49a: 00000c97 auipc s9,0x0 + 49e: 40ec8c93 addi s9,s9,1038 # 8a8 <digits> + 4a2: a005 j 4c2 <vprintf+0x6a> + putc(fd, c0); + 4a4: 85ca mv a1,s2 + 4a6: 855a mv a0,s6 + 4a8: eebff0ef jal ra,392 <putc> + 4ac: a019 j 4b2 <vprintf+0x5a> + } else if(state == '%'){ + 4ae: 03598263 beq s3,s5,4d2 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4b2: 2485 addiw s1,s1,1 + 4b4: 8726 mv a4,s1 + 4b6: 009a07b3 add a5,s4,s1 + 4ba: 0007c903 lbu s2,0(a5) + 4be: 1e090c63 beqz s2,6b6 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4c2: 0009079b sext.w a5,s2 + if(state == 0){ + 4c6: fe0994e3 bnez s3,4ae <vprintf+0x56> + if(c0 == '%'){ + 4ca: fd579de3 bne a5,s5,4a4 <vprintf+0x4c> + state = '%'; + 4ce: 89be mv s3,a5 + 4d0: b7cd j 4b2 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4d2: cfa5 beqz a5,54a <vprintf+0xf2> + 4d4: 00ea06b3 add a3,s4,a4 + 4d8: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4dc: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4de: c681 beqz a3,4e6 <vprintf+0x8e> + 4e0: 9752 add a4,a4,s4 + 4e2: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4e6: 03878a63 beq a5,s8,51a <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4ea: 05a78463 beq a5,s10,532 <vprintf+0xda> + } else if(c0 == 'u'){ + 4ee: 0db78763 beq a5,s11,5bc <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f2: 07800713 li a4,120 + 4f6: 10e78963 beq a5,a4,608 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4fa: 07000713 li a4,112 + 4fe: 12e78e63 beq a5,a4,63a <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 502: 07300713 li a4,115 + 506: 16e78b63 beq a5,a4,67c <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 50a: 05579063 bne a5,s5,54a <vprintf+0xf2> + putc(fd, '%'); + 50e: 85d6 mv a1,s5 + 510: 855a mv a0,s6 + 512: e81ff0ef jal ra,392 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 516: 4981 li s3,0 + 518: bf69 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 51a: 008b8913 addi s2,s7,8 + 51e: 4685 li a3,1 + 520: 4629 li a2,10 + 522: 000ba583 lw a1,0(s7) + 526: 855a mv a0,s6 + 528: e89ff0ef jal ra,3b0 <printint> + 52c: 8bca mv s7,s2 + state = 0; + 52e: 4981 li s3,0 + 530: b749 j 4b2 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 532: 03868663 beq a3,s8,55e <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 536: 05a68163 beq a3,s10,578 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 53a: 09b68d63 beq a3,s11,5d4 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 53e: 03a68f63 beq a3,s10,57c <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 542: 07800793 li a5,120 + 546: 0cf68d63 beq a3,a5,620 <vprintf+0x1c8> + putc(fd, '%'); + 54a: 85d6 mv a1,s5 + 54c: 855a mv a0,s6 + 54e: e45ff0ef jal ra,392 <putc> + putc(fd, c0); + 552: 85ca mv a1,s2 + 554: 855a mv a0,s6 + 556: e3dff0ef jal ra,392 <putc> + state = 0; + 55a: 4981 li s3,0 + 55c: bf99 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 55e: 008b8913 addi s2,s7,8 + 562: 4685 li a3,1 + 564: 4629 li a2,10 + 566: 000ba583 lw a1,0(s7) + 56a: 855a mv a0,s6 + 56c: e45ff0ef jal ra,3b0 <printint> + i += 1; + 570: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 572: 8bca mv s7,s2 + state = 0; + 574: 4981 li s3,0 + i += 1; + 576: bf35 j 4b2 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 578: 03860563 beq a2,s8,5a2 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 57c: 07b60963 beq a2,s11,5ee <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 580: 07800793 li a5,120 + 584: fcf613e3 bne a2,a5,54a <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 588: 008b8913 addi s2,s7,8 + 58c: 4681 li a3,0 + 58e: 4641 li a2,16 + 590: 000ba583 lw a1,0(s7) + 594: 855a mv a0,s6 + 596: e1bff0ef jal ra,3b0 <printint> + i += 2; + 59a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 59c: 8bca mv s7,s2 + state = 0; + 59e: 4981 li s3,0 + i += 2; + 5a0: bf09 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5a2: 008b8913 addi s2,s7,8 + 5a6: 4685 li a3,1 + 5a8: 4629 li a2,10 + 5aa: 000ba583 lw a1,0(s7) + 5ae: 855a mv a0,s6 + 5b0: e01ff0ef jal ra,3b0 <printint> + i += 2; + 5b4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5b6: 8bca mv s7,s2 + state = 0; + 5b8: 4981 li s3,0 + i += 2; + 5ba: bde5 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 5bc: 008b8913 addi s2,s7,8 + 5c0: 4681 li a3,0 + 5c2: 4629 li a2,10 + 5c4: 000ba583 lw a1,0(s7) + 5c8: 855a mv a0,s6 + 5ca: de7ff0ef jal ra,3b0 <printint> + 5ce: 8bca mv s7,s2 + state = 0; + 5d0: 4981 li s3,0 + 5d2: b5c5 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5d4: 008b8913 addi s2,s7,8 + 5d8: 4681 li a3,0 + 5da: 4629 li a2,10 + 5dc: 000ba583 lw a1,0(s7) + 5e0: 855a mv a0,s6 + 5e2: dcfff0ef jal ra,3b0 <printint> + i += 1; + 5e6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e8: 8bca mv s7,s2 + state = 0; + 5ea: 4981 li s3,0 + i += 1; + 5ec: b5d9 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5ee: 008b8913 addi s2,s7,8 + 5f2: 4681 li a3,0 + 5f4: 4629 li a2,10 + 5f6: 000ba583 lw a1,0(s7) + 5fa: 855a mv a0,s6 + 5fc: db5ff0ef jal ra,3b0 <printint> + i += 2; + 600: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 602: 8bca mv s7,s2 + state = 0; + 604: 4981 li s3,0 + i += 2; + 606: b575 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 608: 008b8913 addi s2,s7,8 + 60c: 4681 li a3,0 + 60e: 4641 li a2,16 + 610: 000ba583 lw a1,0(s7) + 614: 855a mv a0,s6 + 616: d9bff0ef jal ra,3b0 <printint> + 61a: 8bca mv s7,s2 + state = 0; + 61c: 4981 li s3,0 + 61e: bd51 j 4b2 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4641 li a2,16 + 628: 000ba583 lw a1,0(s7) + 62c: 855a mv a0,s6 + 62e: d83ff0ef jal ra,3b0 <printint> + i += 1; + 632: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 634: 8bca mv s7,s2 + state = 0; + 636: 4981 li s3,0 + i += 1; + 638: bdad j 4b2 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 63a: 008b8793 addi a5,s7,8 + 63e: f8f43423 sd a5,-120(s0) + 642: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 646: 03000593 li a1,48 + 64a: 855a mv a0,s6 + 64c: d47ff0ef jal ra,392 <putc> + putc(fd, 'x'); + 650: 07800593 li a1,120 + 654: 855a mv a0,s6 + 656: d3dff0ef jal ra,392 <putc> + 65a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 65c: 03c9d793 srli a5,s3,0x3c + 660: 97e6 add a5,a5,s9 + 662: 0007c583 lbu a1,0(a5) + 666: 855a mv a0,s6 + 668: d2bff0ef jal ra,392 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 66c: 0992 slli s3,s3,0x4 + 66e: 397d addiw s2,s2,-1 + 670: fe0916e3 bnez s2,65c <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 674: f8843b83 ld s7,-120(s0) + state = 0; + 678: 4981 li s3,0 + 67a: bd25 j 4b2 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 67c: 008b8993 addi s3,s7,8 + 680: 000bb903 ld s2,0(s7) + 684: 00090f63 beqz s2,6a2 <vprintf+0x24a> + for(; *s; s++) + 688: 00094583 lbu a1,0(s2) + 68c: c195 beqz a1,6b0 <vprintf+0x258> + putc(fd, *s); + 68e: 855a mv a0,s6 + 690: d03ff0ef jal ra,392 <putc> + for(; *s; s++) + 694: 0905 addi s2,s2,1 + 696: 00094583 lbu a1,0(s2) + 69a: f9f5 bnez a1,68e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 69c: 8bce mv s7,s3 + state = 0; + 69e: 4981 li s3,0 + 6a0: bd09 j 4b2 <vprintf+0x5a> + s = "(null)"; + 6a2: 00000917 auipc s2,0x0 + 6a6: 1fe90913 addi s2,s2,510 # 8a0 <malloc+0xee> + for(; *s; s++) + 6aa: 02800593 li a1,40 + 6ae: b7c5 j 68e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6b0: 8bce mv s7,s3 + state = 0; + 6b2: 4981 li s3,0 + 6b4: bbfd j 4b2 <vprintf+0x5a> + } + } +} + 6b6: 70e6 ld ra,120(sp) + 6b8: 7446 ld s0,112(sp) + 6ba: 74a6 ld s1,104(sp) + 6bc: 7906 ld s2,96(sp) + 6be: 69e6 ld s3,88(sp) + 6c0: 6a46 ld s4,80(sp) + 6c2: 6aa6 ld s5,72(sp) + 6c4: 6b06 ld s6,64(sp) + 6c6: 7be2 ld s7,56(sp) + 6c8: 7c42 ld s8,48(sp) + 6ca: 7ca2 ld s9,40(sp) + 6cc: 7d02 ld s10,32(sp) + 6ce: 6de2 ld s11,24(sp) + 6d0: 6109 addi sp,sp,128 + 6d2: 8082 ret + +00000000000006d4 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6d4: 715d addi sp,sp,-80 + 6d6: ec06 sd ra,24(sp) + 6d8: e822 sd s0,16(sp) + 6da: 1000 addi s0,sp,32 + 6dc: e010 sd a2,0(s0) + 6de: e414 sd a3,8(s0) + 6e0: e818 sd a4,16(s0) + 6e2: ec1c sd a5,24(s0) + 6e4: 03043023 sd a6,32(s0) + 6e8: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6ec: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6f0: 8622 mv a2,s0 + 6f2: d67ff0ef jal ra,458 <vprintf> +} + 6f6: 60e2 ld ra,24(sp) + 6f8: 6442 ld s0,16(sp) + 6fa: 6161 addi sp,sp,80 + 6fc: 8082 ret + +00000000000006fe <printf>: + +void +printf(const char *fmt, ...) +{ + 6fe: 711d addi sp,sp,-96 + 700: ec06 sd ra,24(sp) + 702: e822 sd s0,16(sp) + 704: 1000 addi s0,sp,32 + 706: e40c sd a1,8(s0) + 708: e810 sd a2,16(s0) + 70a: ec14 sd a3,24(s0) + 70c: f018 sd a4,32(s0) + 70e: f41c sd a5,40(s0) + 710: 03043823 sd a6,48(s0) + 714: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 718: 00840613 addi a2,s0,8 + 71c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 720: 85aa mv a1,a0 + 722: 4505 li a0,1 + 724: d35ff0ef jal ra,458 <vprintf> +} + 728: 60e2 ld ra,24(sp) + 72a: 6442 ld s0,16(sp) + 72c: 6125 addi sp,sp,96 + 72e: 8082 ret + +0000000000000730 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 730: 1141 addi sp,sp,-16 + 732: e422 sd s0,8(sp) + 734: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 736: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 73a: 00001797 auipc a5,0x1 + 73e: 8c67b783 ld a5,-1850(a5) # 1000 <freep> + 742: a02d j 76c <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 744: 4618 lw a4,8(a2) + 746: 9f2d addw a4,a4,a1 + 748: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 74c: 6398 ld a4,0(a5) + 74e: 6310 ld a2,0(a4) + 750: a83d j 78e <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 752: ff852703 lw a4,-8(a0) + 756: 9f31 addw a4,a4,a2 + 758: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 75a: ff053683 ld a3,-16(a0) + 75e: a091 j 7a2 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 760: 6398 ld a4,0(a5) + 762: 00e7e463 bltu a5,a4,76a <free+0x3a> + 766: 00e6ea63 bltu a3,a4,77a <free+0x4a> +{ + 76a: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 76c: fed7fae3 bgeu a5,a3,760 <free+0x30> + 770: 6398 ld a4,0(a5) + 772: 00e6e463 bltu a3,a4,77a <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 776: fee7eae3 bltu a5,a4,76a <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 77a: ff852583 lw a1,-8(a0) + 77e: 6390 ld a2,0(a5) + 780: 02059813 slli a6,a1,0x20 + 784: 01c85713 srli a4,a6,0x1c + 788: 9736 add a4,a4,a3 + 78a: fae60de3 beq a2,a4,744 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 78e: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 792: 4790 lw a2,8(a5) + 794: 02061593 slli a1,a2,0x20 + 798: 01c5d713 srli a4,a1,0x1c + 79c: 973e add a4,a4,a5 + 79e: fae68ae3 beq a3,a4,752 <free+0x22> + p->s.ptr = bp->s.ptr; + 7a2: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7a4: 00001717 auipc a4,0x1 + 7a8: 84f73e23 sd a5,-1956(a4) # 1000 <freep> +} + 7ac: 6422 ld s0,8(sp) + 7ae: 0141 addi sp,sp,16 + 7b0: 8082 ret + +00000000000007b2 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7b2: 7139 addi sp,sp,-64 + 7b4: fc06 sd ra,56(sp) + 7b6: f822 sd s0,48(sp) + 7b8: f426 sd s1,40(sp) + 7ba: f04a sd s2,32(sp) + 7bc: ec4e sd s3,24(sp) + 7be: e852 sd s4,16(sp) + 7c0: e456 sd s5,8(sp) + 7c2: e05a sd s6,0(sp) + 7c4: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7c6: 02051493 slli s1,a0,0x20 + 7ca: 9081 srli s1,s1,0x20 + 7cc: 04bd addi s1,s1,15 + 7ce: 8091 srli s1,s1,0x4 + 7d0: 0014899b addiw s3,s1,1 + 7d4: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7d6: 00001517 auipc a0,0x1 + 7da: 82a53503 ld a0,-2006(a0) # 1000 <freep> + 7de: c515 beqz a0,80a <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7e0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7e2: 4798 lw a4,8(a5) + 7e4: 02977f63 bgeu a4,s1,822 <malloc+0x70> + 7e8: 8a4e mv s4,s3 + 7ea: 0009871b sext.w a4,s3 + 7ee: 6685 lui a3,0x1 + 7f0: 00d77363 bgeu a4,a3,7f6 <malloc+0x44> + 7f4: 6a05 lui s4,0x1 + 7f6: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7fa: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7fe: 00001917 auipc s2,0x1 + 802: 80290913 addi s2,s2,-2046 # 1000 <freep> + if(p == (char*)-1) + 806: 5afd li s5,-1 + 808: a885 j 878 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 80a: 00001797 auipc a5,0x1 + 80e: 80678793 addi a5,a5,-2042 # 1010 <base> + 812: 00000717 auipc a4,0x0 + 816: 7ef73723 sd a5,2030(a4) # 1000 <freep> + 81a: e39c sd a5,0(a5) + base.s.size = 0; + 81c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 820: b7e1 j 7e8 <malloc+0x36> + if(p->s.size == nunits) + 822: 02e48c63 beq s1,a4,85a <malloc+0xa8> + p->s.size -= nunits; + 826: 4137073b subw a4,a4,s3 + 82a: c798 sw a4,8(a5) + p += p->s.size; + 82c: 02071693 slli a3,a4,0x20 + 830: 01c6d713 srli a4,a3,0x1c + 834: 97ba add a5,a5,a4 + p->s.size = nunits; + 836: 0137a423 sw s3,8(a5) + freep = prevp; + 83a: 00000717 auipc a4,0x0 + 83e: 7ca73323 sd a0,1990(a4) # 1000 <freep> + return (void*)(p + 1); + 842: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 846: 70e2 ld ra,56(sp) + 848: 7442 ld s0,48(sp) + 84a: 74a2 ld s1,40(sp) + 84c: 7902 ld s2,32(sp) + 84e: 69e2 ld s3,24(sp) + 850: 6a42 ld s4,16(sp) + 852: 6aa2 ld s5,8(sp) + 854: 6b02 ld s6,0(sp) + 856: 6121 addi sp,sp,64 + 858: 8082 ret + prevp->s.ptr = p->s.ptr; + 85a: 6398 ld a4,0(a5) + 85c: e118 sd a4,0(a0) + 85e: bff1 j 83a <malloc+0x88> + hp->s.size = nu; + 860: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 864: 0541 addi a0,a0,16 + 866: ecbff0ef jal ra,730 <free> + return freep; + 86a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 86e: dd61 beqz a0,846 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 870: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 872: 4798 lw a4,8(a5) + 874: fa9777e3 bgeu a4,s1,822 <malloc+0x70> + if(p == freep) + 878: 00093703 ld a4,0(s2) + 87c: 853e mv a0,a5 + 87e: fef719e3 bne a4,a5,870 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 882: 8552 mv a0,s4 + 884: adfff0ef jal ra,362 <sbrk> + if(p == (char*)-1) + 888: fd551ce3 bne a0,s5,860 <malloc+0xae> + return 0; + 88c: 4501 li a0,0 + 88e: bf65 j 846 <malloc+0x94> diff --git a/user/echo.d b/user/echo.d new file mode 100644 index 0000000000000000000000000000000000000000..7383bdb0c63700edd5196f35e1bcaf7fa3b4f617 --- /dev/null +++ b/user/echo.d @@ -0,0 +1,2 @@ +user/echo.o: user/echo.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/echo.o b/user/echo.o new file mode 100644 index 0000000000000000000000000000000000000000..11561d0caf2e809b5b78abba2e4be0b41099d55f Binary files /dev/null and b/user/echo.o differ diff --git a/user/echo.sym b/user/echo.sym new file mode 100644 index 0000000000000000000000000000000000000000..5a390958cb8e51f4803e95247d3c14fb55936dc9 --- /dev/null +++ b/user/echo.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000890 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 echo.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000392 putc +00000000000003b0 printint +00000000000008a8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000082 strcpy +00000000000006fe printf +000000000000022c memmove +0000000000000322 mknod +000000000000037a trace +000000000000013a gets +000000000000035a getpid +00000000000002be memcpy +00000000000007b2 malloc +000000000000036a sleep +0000000000000382 mycall +00000000000002ea pipe +00000000000002fa write +0000000000000332 fstat +00000000000006d4 fprintf +000000000000030a kill +0000000000000458 vprintf +000000000000034a chdir +0000000000000312 exec +00000000000002e2 wait +00000000000002f2 read +000000000000032a unlink +0000000000000284 memcmp +00000000000002d2 fork +0000000000000362 sbrk +0000000000000372 uptime +00000000000000f4 memset +0000000000000000 main +000000000000038a GSCinfo +000000000000009e strcmp +0000000000000352 dup +00000000000001aa stat +000000000000033a link +00000000000002da exit +0000000000000070 start +00000000000001e4 atoi +00000000000000ca strlen +000000000000031a open +0000000000000116 strchr +0000000000000342 mkdir +0000000000000302 close +0000000000000730 free diff --git a/user/forktest.asm b/user/forktest.asm new file mode 100644 index 0000000000000000000000000000000000000000..4c6221e00dc13595b0c85c5f8e1c98dff6a712d8 --- /dev/null +++ b/user/forktest.asm @@ -0,0 +1,817 @@ + +user/_forktest: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <print>: + +#define N 1000 + +void +print(const char *s) +{ + 0: 1101 addi sp,sp,-32 + 2: ec06 sd ra,24(sp) + 4: e822 sd s0,16(sp) + 6: e426 sd s1,8(sp) + 8: 1000 addi s0,sp,32 + a: 84aa mv s1,a0 + write(1, s, strlen(s)); + c: 12c000ef jal ra,138 <strlen> + 10: 0005061b sext.w a2,a0 + 14: 85a6 mv a1,s1 + 16: 4505 li a0,1 + 18: 350000ef jal ra,368 <write> +} + 1c: 60e2 ld ra,24(sp) + 1e: 6442 ld s0,16(sp) + 20: 64a2 ld s1,8(sp) + 22: 6105 addi sp,sp,32 + 24: 8082 ret + +0000000000000026 <forktest>: + +void +forktest(void) +{ + 26: 1101 addi sp,sp,-32 + 28: ec06 sd ra,24(sp) + 2a: e822 sd s0,16(sp) + 2c: e426 sd s1,8(sp) + 2e: e04a sd s2,0(sp) + 30: 1000 addi s0,sp,32 + int n, pid; + + print("fork test\n"); + 32: 00000517 auipc a0,0x0 + 36: 3ce50513 addi a0,a0,974 # 400 <GSCinfo+0x8> + 3a: fc7ff0ef jal ra,0 <print> + + for(n=0; n<N; n++){ + 3e: 4481 li s1,0 + 40: 3e800913 li s2,1000 + pid = fork(); + 44: 2fc000ef jal ra,340 <fork> + if(pid < 0) + 48: 02054163 bltz a0,6a <forktest+0x44> + break; + if(pid == 0) + 4c: cd09 beqz a0,66 <forktest+0x40> + for(n=0; n<N; n++){ + 4e: 2485 addiw s1,s1,1 + 50: ff249ae3 bne s1,s2,44 <forktest+0x1e> + exit(0); + } + + if(n == N){ + print("fork claimed to work N times!\n"); + 54: 00000517 auipc a0,0x0 + 58: 3bc50513 addi a0,a0,956 # 410 <GSCinfo+0x18> + 5c: fa5ff0ef jal ra,0 <print> + exit(1); + 60: 4505 li a0,1 + 62: 2e6000ef jal ra,348 <exit> + exit(0); + 66: 2e2000ef jal ra,348 <exit> + if(n == N){ + 6a: 3e800793 li a5,1000 + 6e: fef483e3 beq s1,a5,54 <forktest+0x2e> + } + + for(; n > 0; n--){ + 72: 00905963 blez s1,84 <forktest+0x5e> + if(wait(0) < 0){ + 76: 4501 li a0,0 + 78: 2d8000ef jal ra,350 <wait> + 7c: 02054663 bltz a0,a8 <forktest+0x82> + for(; n > 0; n--){ + 80: 34fd addiw s1,s1,-1 + 82: f8f5 bnez s1,76 <forktest+0x50> + print("wait stopped early\n"); + exit(1); + } + } + + if(wait(0) != -1){ + 84: 4501 li a0,0 + 86: 2ca000ef jal ra,350 <wait> + 8a: 57fd li a5,-1 + 8c: 02f51763 bne a0,a5,ba <forktest+0x94> + print("wait got too many\n"); + exit(1); + } + + print("fork test OK\n"); + 90: 00000517 auipc a0,0x0 + 94: 3d050513 addi a0,a0,976 # 460 <GSCinfo+0x68> + 98: f69ff0ef jal ra,0 <print> +} + 9c: 60e2 ld ra,24(sp) + 9e: 6442 ld s0,16(sp) + a0: 64a2 ld s1,8(sp) + a2: 6902 ld s2,0(sp) + a4: 6105 addi sp,sp,32 + a6: 8082 ret + print("wait stopped early\n"); + a8: 00000517 auipc a0,0x0 + ac: 38850513 addi a0,a0,904 # 430 <GSCinfo+0x38> + b0: f51ff0ef jal ra,0 <print> + exit(1); + b4: 4505 li a0,1 + b6: 292000ef jal ra,348 <exit> + print("wait got too many\n"); + ba: 00000517 auipc a0,0x0 + be: 38e50513 addi a0,a0,910 # 448 <GSCinfo+0x50> + c2: f3fff0ef jal ra,0 <print> + exit(1); + c6: 4505 li a0,1 + c8: 280000ef jal ra,348 <exit> + +00000000000000cc <main>: + +int +main(void) +{ + cc: 1141 addi sp,sp,-16 + ce: e406 sd ra,8(sp) + d0: e022 sd s0,0(sp) + d2: 0800 addi s0,sp,16 + forktest(); + d4: f53ff0ef jal ra,26 <forktest> + exit(0); + d8: 4501 li a0,0 + da: 26e000ef jal ra,348 <exit> + +00000000000000de <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + de: 1141 addi sp,sp,-16 + e0: e406 sd ra,8(sp) + e2: e022 sd s0,0(sp) + e4: 0800 addi s0,sp,16 + extern int main(); + main(); + e6: fe7ff0ef jal ra,cc <main> + exit(0); + ea: 4501 li a0,0 + ec: 25c000ef jal ra,348 <exit> + +00000000000000f0 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + f0: 1141 addi sp,sp,-16 + f2: e422 sd s0,8(sp) + f4: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + f6: 87aa mv a5,a0 + f8: 0585 addi a1,a1,1 + fa: 0785 addi a5,a5,1 + fc: fff5c703 lbu a4,-1(a1) + 100: fee78fa3 sb a4,-1(a5) + 104: fb75 bnez a4,f8 <strcpy+0x8> + ; + return os; +} + 106: 6422 ld s0,8(sp) + 108: 0141 addi sp,sp,16 + 10a: 8082 ret + +000000000000010c <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 10c: 1141 addi sp,sp,-16 + 10e: e422 sd s0,8(sp) + 110: 0800 addi s0,sp,16 + while(*p && *p == *q) + 112: 00054783 lbu a5,0(a0) + 116: cb91 beqz a5,12a <strcmp+0x1e> + 118: 0005c703 lbu a4,0(a1) + 11c: 00f71763 bne a4,a5,12a <strcmp+0x1e> + p++, q++; + 120: 0505 addi a0,a0,1 + 122: 0585 addi a1,a1,1 + while(*p && *p == *q) + 124: 00054783 lbu a5,0(a0) + 128: fbe5 bnez a5,118 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 12a: 0005c503 lbu a0,0(a1) +} + 12e: 40a7853b subw a0,a5,a0 + 132: 6422 ld s0,8(sp) + 134: 0141 addi sp,sp,16 + 136: 8082 ret + +0000000000000138 <strlen>: + +uint +strlen(const char *s) +{ + 138: 1141 addi sp,sp,-16 + 13a: e422 sd s0,8(sp) + 13c: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 13e: 00054783 lbu a5,0(a0) + 142: cf91 beqz a5,15e <strlen+0x26> + 144: 0505 addi a0,a0,1 + 146: 87aa mv a5,a0 + 148: 4685 li a3,1 + 14a: 9e89 subw a3,a3,a0 + 14c: 00f6853b addw a0,a3,a5 + 150: 0785 addi a5,a5,1 + 152: fff7c703 lbu a4,-1(a5) + 156: fb7d bnez a4,14c <strlen+0x14> + ; + return n; +} + 158: 6422 ld s0,8(sp) + 15a: 0141 addi sp,sp,16 + 15c: 8082 ret + for(n = 0; s[n]; n++) + 15e: 4501 li a0,0 + 160: bfe5 j 158 <strlen+0x20> + +0000000000000162 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 162: 1141 addi sp,sp,-16 + 164: e422 sd s0,8(sp) + 166: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 168: ca19 beqz a2,17e <memset+0x1c> + 16a: 87aa mv a5,a0 + 16c: 1602 slli a2,a2,0x20 + 16e: 9201 srli a2,a2,0x20 + 170: 00a60733 add a4,a2,a0 + cdst[i] = c; + 174: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 178: 0785 addi a5,a5,1 + 17a: fee79de3 bne a5,a4,174 <memset+0x12> + } + return dst; +} + 17e: 6422 ld s0,8(sp) + 180: 0141 addi sp,sp,16 + 182: 8082 ret + +0000000000000184 <strchr>: + +char* +strchr(const char *s, char c) +{ + 184: 1141 addi sp,sp,-16 + 186: e422 sd s0,8(sp) + 188: 0800 addi s0,sp,16 + for(; *s; s++) + 18a: 00054783 lbu a5,0(a0) + 18e: cb99 beqz a5,1a4 <strchr+0x20> + if(*s == c) + 190: 00f58763 beq a1,a5,19e <strchr+0x1a> + for(; *s; s++) + 194: 0505 addi a0,a0,1 + 196: 00054783 lbu a5,0(a0) + 19a: fbfd bnez a5,190 <strchr+0xc> + return (char*)s; + return 0; + 19c: 4501 li a0,0 +} + 19e: 6422 ld s0,8(sp) + 1a0: 0141 addi sp,sp,16 + 1a2: 8082 ret + return 0; + 1a4: 4501 li a0,0 + 1a6: bfe5 j 19e <strchr+0x1a> + +00000000000001a8 <gets>: + +char* +gets(char *buf, int max) +{ + 1a8: 711d addi sp,sp,-96 + 1aa: ec86 sd ra,88(sp) + 1ac: e8a2 sd s0,80(sp) + 1ae: e4a6 sd s1,72(sp) + 1b0: e0ca sd s2,64(sp) + 1b2: fc4e sd s3,56(sp) + 1b4: f852 sd s4,48(sp) + 1b6: f456 sd s5,40(sp) + 1b8: f05a sd s6,32(sp) + 1ba: ec5e sd s7,24(sp) + 1bc: 1080 addi s0,sp,96 + 1be: 8baa mv s7,a0 + 1c0: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1c2: 892a mv s2,a0 + 1c4: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1c6: 4aa9 li s5,10 + 1c8: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1ca: 89a6 mv s3,s1 + 1cc: 2485 addiw s1,s1,1 + 1ce: 0344d663 bge s1,s4,1fa <gets+0x52> + cc = read(0, &c, 1); + 1d2: 4605 li a2,1 + 1d4: faf40593 addi a1,s0,-81 + 1d8: 4501 li a0,0 + 1da: 186000ef jal ra,360 <read> + if(cc < 1) + 1de: 00a05e63 blez a0,1fa <gets+0x52> + buf[i++] = c; + 1e2: faf44783 lbu a5,-81(s0) + 1e6: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1ea: 01578763 beq a5,s5,1f8 <gets+0x50> + 1ee: 0905 addi s2,s2,1 + 1f0: fd679de3 bne a5,s6,1ca <gets+0x22> + for(i=0; i+1 < max; ){ + 1f4: 89a6 mv s3,s1 + 1f6: a011 j 1fa <gets+0x52> + 1f8: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1fa: 99de add s3,s3,s7 + 1fc: 00098023 sb zero,0(s3) + return buf; +} + 200: 855e mv a0,s7 + 202: 60e6 ld ra,88(sp) + 204: 6446 ld s0,80(sp) + 206: 64a6 ld s1,72(sp) + 208: 6906 ld s2,64(sp) + 20a: 79e2 ld s3,56(sp) + 20c: 7a42 ld s4,48(sp) + 20e: 7aa2 ld s5,40(sp) + 210: 7b02 ld s6,32(sp) + 212: 6be2 ld s7,24(sp) + 214: 6125 addi sp,sp,96 + 216: 8082 ret + +0000000000000218 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 218: 1101 addi sp,sp,-32 + 21a: ec06 sd ra,24(sp) + 21c: e822 sd s0,16(sp) + 21e: e426 sd s1,8(sp) + 220: e04a sd s2,0(sp) + 222: 1000 addi s0,sp,32 + 224: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 226: 4581 li a1,0 + 228: 160000ef jal ra,388 <open> + if(fd < 0) + 22c: 02054163 bltz a0,24e <stat+0x36> + 230: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 232: 85ca mv a1,s2 + 234: 16c000ef jal ra,3a0 <fstat> + 238: 892a mv s2,a0 + close(fd); + 23a: 8526 mv a0,s1 + 23c: 134000ef jal ra,370 <close> + return r; +} + 240: 854a mv a0,s2 + 242: 60e2 ld ra,24(sp) + 244: 6442 ld s0,16(sp) + 246: 64a2 ld s1,8(sp) + 248: 6902 ld s2,0(sp) + 24a: 6105 addi sp,sp,32 + 24c: 8082 ret + return -1; + 24e: 597d li s2,-1 + 250: bfc5 j 240 <stat+0x28> + +0000000000000252 <atoi>: + +int +atoi(const char *s) +{ + 252: 1141 addi sp,sp,-16 + 254: e422 sd s0,8(sp) + 256: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 258: 00054683 lbu a3,0(a0) + 25c: fd06879b addiw a5,a3,-48 + 260: 0ff7f793 zext.b a5,a5 + 264: 4625 li a2,9 + 266: 02f66863 bltu a2,a5,296 <atoi+0x44> + 26a: 872a mv a4,a0 + n = 0; + 26c: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 26e: 0705 addi a4,a4,1 + 270: 0025179b slliw a5,a0,0x2 + 274: 9fa9 addw a5,a5,a0 + 276: 0017979b slliw a5,a5,0x1 + 27a: 9fb5 addw a5,a5,a3 + 27c: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 280: 00074683 lbu a3,0(a4) + 284: fd06879b addiw a5,a3,-48 + 288: 0ff7f793 zext.b a5,a5 + 28c: fef671e3 bgeu a2,a5,26e <atoi+0x1c> + return n; +} + 290: 6422 ld s0,8(sp) + 292: 0141 addi sp,sp,16 + 294: 8082 ret + n = 0; + 296: 4501 li a0,0 + 298: bfe5 j 290 <atoi+0x3e> + +000000000000029a <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 29a: 1141 addi sp,sp,-16 + 29c: e422 sd s0,8(sp) + 29e: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2a0: 02b57463 bgeu a0,a1,2c8 <memmove+0x2e> + while(n-- > 0) + 2a4: 00c05f63 blez a2,2c2 <memmove+0x28> + 2a8: 1602 slli a2,a2,0x20 + 2aa: 9201 srli a2,a2,0x20 + 2ac: 00c507b3 add a5,a0,a2 + dst = vdst; + 2b0: 872a mv a4,a0 + *dst++ = *src++; + 2b2: 0585 addi a1,a1,1 + 2b4: 0705 addi a4,a4,1 + 2b6: fff5c683 lbu a3,-1(a1) + 2ba: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2be: fee79ae3 bne a5,a4,2b2 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2c2: 6422 ld s0,8(sp) + 2c4: 0141 addi sp,sp,16 + 2c6: 8082 ret + dst += n; + 2c8: 00c50733 add a4,a0,a2 + src += n; + 2cc: 95b2 add a1,a1,a2 + while(n-- > 0) + 2ce: fec05ae3 blez a2,2c2 <memmove+0x28> + 2d2: fff6079b addiw a5,a2,-1 + 2d6: 1782 slli a5,a5,0x20 + 2d8: 9381 srli a5,a5,0x20 + 2da: fff7c793 not a5,a5 + 2de: 97ba add a5,a5,a4 + *--dst = *--src; + 2e0: 15fd addi a1,a1,-1 + 2e2: 177d addi a4,a4,-1 + 2e4: 0005c683 lbu a3,0(a1) + 2e8: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2ec: fee79ae3 bne a5,a4,2e0 <memmove+0x46> + 2f0: bfc9 j 2c2 <memmove+0x28> + +00000000000002f2 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2f2: 1141 addi sp,sp,-16 + 2f4: e422 sd s0,8(sp) + 2f6: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2f8: ca05 beqz a2,328 <memcmp+0x36> + 2fa: fff6069b addiw a3,a2,-1 + 2fe: 1682 slli a3,a3,0x20 + 300: 9281 srli a3,a3,0x20 + 302: 0685 addi a3,a3,1 + 304: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 306: 00054783 lbu a5,0(a0) + 30a: 0005c703 lbu a4,0(a1) + 30e: 00e79863 bne a5,a4,31e <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 312: 0505 addi a0,a0,1 + p2++; + 314: 0585 addi a1,a1,1 + while (n-- > 0) { + 316: fed518e3 bne a0,a3,306 <memcmp+0x14> + } + return 0; + 31a: 4501 li a0,0 + 31c: a019 j 322 <memcmp+0x30> + return *p1 - *p2; + 31e: 40e7853b subw a0,a5,a4 +} + 322: 6422 ld s0,8(sp) + 324: 0141 addi sp,sp,16 + 326: 8082 ret + return 0; + 328: 4501 li a0,0 + 32a: bfe5 j 322 <memcmp+0x30> + +000000000000032c <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 32c: 1141 addi sp,sp,-16 + 32e: e406 sd ra,8(sp) + 330: e022 sd s0,0(sp) + 332: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 334: f67ff0ef jal ra,29a <memmove> +} + 338: 60a2 ld ra,8(sp) + 33a: 6402 ld s0,0(sp) + 33c: 0141 addi sp,sp,16 + 33e: 8082 ret + +0000000000000340 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 340: 4885 li a7,1 + ecall + 342: 00000073 ecall + ret + 346: 8082 ret + +0000000000000348 <exit>: +.global exit +exit: + li a7, SYS_exit + 348: 4889 li a7,2 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 <wait>: +.global wait +wait: + li a7, SYS_wait + 350: 488d li a7,3 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 358: 4891 li a7,4 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 <read>: +.global read +read: + li a7, SYS_read + 360: 4895 li a7,5 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 <write>: +.global write +write: + li a7, SYS_write + 368: 48c1 li a7,16 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 <close>: +.global close +close: + li a7, SYS_close + 370: 48d5 li a7,21 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 <kill>: +.global kill +kill: + li a7, SYS_kill + 378: 4899 li a7,6 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 <exec>: +.global exec +exec: + li a7, SYS_exec + 380: 489d li a7,7 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 <open>: +.global open +open: + li a7, SYS_open + 388: 48bd li a7,15 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 390: 48c5 li a7,17 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 398: 48c9 li a7,18 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 3a0: 48a1 li a7,8 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 <link>: +.global link +link: + li a7, SYS_link + 3a8: 48cd li a7,19 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 3b0: 48d1 li a7,20 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 3b8: 48a5 li a7,9 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 <dup>: +.global dup +dup: + li a7, SYS_dup + 3c0: 48a9 li a7,10 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 3c8: 48ad li a7,11 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 3d0: 48b1 li a7,12 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 3d8: 48b5 li a7,13 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 3e0: 48b9 li a7,14 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 <trace>: +.global trace +trace: + li a7, SYS_trace + 3e8: 48d9 li a7,22 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 3f0: 48dd li a7,23 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 3f8: 48e1 li a7,24 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret diff --git a/user/forktest.d b/user/forktest.d new file mode 100644 index 0000000000000000000000000000000000000000..b796849d29e714a5f0a9628d0d675a25ae8c3674 --- /dev/null +++ b/user/forktest.d @@ -0,0 +1,3 @@ +user/forktest.o: user/forktest.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/stat.h user/user.h diff --git a/user/forktest.o b/user/forktest.o new file mode 100644 index 0000000000000000000000000000000000000000..04f1a8695c6141c84e3124cf77ab0aaf6e723876 Binary files /dev/null and b/user/forktest.o differ diff --git a/user/grep.asm b/user/grep.asm new file mode 100644 index 0000000000000000000000000000000000000000..2f92279ed77b0cd4707d1c9690e550da44b0f49d --- /dev/null +++ b/user/grep.asm @@ -0,0 +1,1729 @@ + +user/_grep: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <matchstar>: + return 0; +} + +// matchstar: search for c*re at beginning of text +int matchstar(int c, char *re, char *text) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: e052 sd s4,0(sp) + e: 1800 addi s0,sp,48 + 10: 892a mv s2,a0 + 12: 89ae mv s3,a1 + 14: 84b2 mv s1,a2 + do{ // a * matches zero or more instances + if(matchhere(re, text)) + return 1; + }while(*text!='\0' && (*text++==c || c=='.')); + 16: 02e00a13 li s4,46 + if(matchhere(re, text)) + 1a: 85a6 mv a1,s1 + 1c: 854e mv a0,s3 + 1e: 02c000ef jal ra,4a <matchhere> + 22: e919 bnez a0,38 <matchstar+0x38> + }while(*text!='\0' && (*text++==c || c=='.')); + 24: 0004c783 lbu a5,0(s1) + 28: cb89 beqz a5,3a <matchstar+0x3a> + 2a: 0485 addi s1,s1,1 + 2c: 2781 sext.w a5,a5 + 2e: ff2786e3 beq a5,s2,1a <matchstar+0x1a> + 32: ff4904e3 beq s2,s4,1a <matchstar+0x1a> + 36: a011 j 3a <matchstar+0x3a> + return 1; + 38: 4505 li a0,1 + return 0; +} + 3a: 70a2 ld ra,40(sp) + 3c: 7402 ld s0,32(sp) + 3e: 64e2 ld s1,24(sp) + 40: 6942 ld s2,16(sp) + 42: 69a2 ld s3,8(sp) + 44: 6a02 ld s4,0(sp) + 46: 6145 addi sp,sp,48 + 48: 8082 ret + +000000000000004a <matchhere>: + if(re[0] == '\0') + 4a: 00054703 lbu a4,0(a0) + 4e: c73d beqz a4,bc <matchhere+0x72> +{ + 50: 1141 addi sp,sp,-16 + 52: e406 sd ra,8(sp) + 54: e022 sd s0,0(sp) + 56: 0800 addi s0,sp,16 + 58: 87aa mv a5,a0 + if(re[1] == '*') + 5a: 00154683 lbu a3,1(a0) + 5e: 02a00613 li a2,42 + 62: 02c68563 beq a3,a2,8c <matchhere+0x42> + if(re[0] == '$' && re[1] == '\0') + 66: 02400613 li a2,36 + 6a: 02c70863 beq a4,a2,9a <matchhere+0x50> + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 6e: 0005c683 lbu a3,0(a1) + return 0; + 72: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 74: ca81 beqz a3,84 <matchhere+0x3a> + 76: 02e00613 li a2,46 + 7a: 02c70b63 beq a4,a2,b0 <matchhere+0x66> + return 0; + 7e: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 80: 02d70863 beq a4,a3,b0 <matchhere+0x66> +} + 84: 60a2 ld ra,8(sp) + 86: 6402 ld s0,0(sp) + 88: 0141 addi sp,sp,16 + 8a: 8082 ret + return matchstar(re[0], re+2, text); + 8c: 862e mv a2,a1 + 8e: 00250593 addi a1,a0,2 + 92: 853a mv a0,a4 + 94: f6dff0ef jal ra,0 <matchstar> + 98: b7f5 j 84 <matchhere+0x3a> + if(re[0] == '$' && re[1] == '\0') + 9a: c691 beqz a3,a6 <matchhere+0x5c> + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 9c: 0005c683 lbu a3,0(a1) + a0: fef9 bnez a3,7e <matchhere+0x34> + return 0; + a2: 4501 li a0,0 + a4: b7c5 j 84 <matchhere+0x3a> + return *text == '\0'; + a6: 0005c503 lbu a0,0(a1) + aa: 00153513 seqz a0,a0 + ae: bfd9 j 84 <matchhere+0x3a> + return matchhere(re+1, text+1); + b0: 0585 addi a1,a1,1 + b2: 00178513 addi a0,a5,1 + b6: f95ff0ef jal ra,4a <matchhere> + ba: b7e9 j 84 <matchhere+0x3a> + return 1; + bc: 4505 li a0,1 +} + be: 8082 ret + +00000000000000c0 <match>: +{ + c0: 1101 addi sp,sp,-32 + c2: ec06 sd ra,24(sp) + c4: e822 sd s0,16(sp) + c6: e426 sd s1,8(sp) + c8: e04a sd s2,0(sp) + ca: 1000 addi s0,sp,32 + cc: 892a mv s2,a0 + ce: 84ae mv s1,a1 + if(re[0] == '^') + d0: 00054703 lbu a4,0(a0) + d4: 05e00793 li a5,94 + d8: 00f70c63 beq a4,a5,f0 <match+0x30> + if(matchhere(re, text)) + dc: 85a6 mv a1,s1 + de: 854a mv a0,s2 + e0: f6bff0ef jal ra,4a <matchhere> + e4: e911 bnez a0,f8 <match+0x38> + }while(*text++ != '\0'); + e6: 0485 addi s1,s1,1 + e8: fff4c783 lbu a5,-1(s1) + ec: fbe5 bnez a5,dc <match+0x1c> + ee: a031 j fa <match+0x3a> + return matchhere(re+1, text); + f0: 0505 addi a0,a0,1 + f2: f59ff0ef jal ra,4a <matchhere> + f6: a011 j fa <match+0x3a> + return 1; + f8: 4505 li a0,1 +} + fa: 60e2 ld ra,24(sp) + fc: 6442 ld s0,16(sp) + fe: 64a2 ld s1,8(sp) + 100: 6902 ld s2,0(sp) + 102: 6105 addi sp,sp,32 + 104: 8082 ret + +0000000000000106 <grep>: +{ + 106: 715d addi sp,sp,-80 + 108: e486 sd ra,72(sp) + 10a: e0a2 sd s0,64(sp) + 10c: fc26 sd s1,56(sp) + 10e: f84a sd s2,48(sp) + 110: f44e sd s3,40(sp) + 112: f052 sd s4,32(sp) + 114: ec56 sd s5,24(sp) + 116: e85a sd s6,16(sp) + 118: e45e sd s7,8(sp) + 11a: 0880 addi s0,sp,80 + 11c: 89aa mv s3,a0 + 11e: 8b2e mv s6,a1 + m = 0; + 120: 4a01 li s4,0 + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 122: 3ff00b93 li s7,1023 + 126: 00001a97 auipc s5,0x1 + 12a: eeaa8a93 addi s5,s5,-278 # 1010 <buf> + 12e: a835 j 16a <grep+0x64> + p = q+1; + 130: 00148913 addi s2,s1,1 + while((q = strchr(p, '\n')) != 0){ + 134: 45a9 li a1,10 + 136: 854a mv a0,s2 + 138: 1bc000ef jal ra,2f4 <strchr> + 13c: 84aa mv s1,a0 + 13e: c505 beqz a0,166 <grep+0x60> + *q = 0; + 140: 00048023 sb zero,0(s1) + if(match(pattern, p)){ + 144: 85ca mv a1,s2 + 146: 854e mv a0,s3 + 148: f79ff0ef jal ra,c0 <match> + 14c: d175 beqz a0,130 <grep+0x2a> + *q = '\n'; + 14e: 47a9 li a5,10 + 150: 00f48023 sb a5,0(s1) + write(1, p, q+1 - p); + 154: 00148613 addi a2,s1,1 + 158: 4126063b subw a2,a2,s2 + 15c: 85ca mv a1,s2 + 15e: 4505 li a0,1 + 160: 378000ef jal ra,4d8 <write> + 164: b7f1 j 130 <grep+0x2a> + if(m > 0){ + 166: 03404363 bgtz s4,18c <grep+0x86> + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 16a: 414b863b subw a2,s7,s4 + 16e: 014a85b3 add a1,s5,s4 + 172: 855a mv a0,s6 + 174: 35c000ef jal ra,4d0 <read> + 178: 02a05463 blez a0,1a0 <grep+0x9a> + m += n; + 17c: 00aa0a3b addw s4,s4,a0 + buf[m] = '\0'; + 180: 014a87b3 add a5,s5,s4 + 184: 00078023 sb zero,0(a5) + p = buf; + 188: 8956 mv s2,s5 + while((q = strchr(p, '\n')) != 0){ + 18a: b76d j 134 <grep+0x2e> + m -= p - buf; + 18c: 415907b3 sub a5,s2,s5 + 190: 40fa0a3b subw s4,s4,a5 + memmove(buf, p, m); + 194: 8652 mv a2,s4 + 196: 85ca mv a1,s2 + 198: 8556 mv a0,s5 + 19a: 270000ef jal ra,40a <memmove> + 19e: b7f1 j 16a <grep+0x64> +} + 1a0: 60a6 ld ra,72(sp) + 1a2: 6406 ld s0,64(sp) + 1a4: 74e2 ld s1,56(sp) + 1a6: 7942 ld s2,48(sp) + 1a8: 79a2 ld s3,40(sp) + 1aa: 7a02 ld s4,32(sp) + 1ac: 6ae2 ld s5,24(sp) + 1ae: 6b42 ld s6,16(sp) + 1b0: 6ba2 ld s7,8(sp) + 1b2: 6161 addi sp,sp,80 + 1b4: 8082 ret + +00000000000001b6 <main>: +{ + 1b6: 7139 addi sp,sp,-64 + 1b8: fc06 sd ra,56(sp) + 1ba: f822 sd s0,48(sp) + 1bc: f426 sd s1,40(sp) + 1be: f04a sd s2,32(sp) + 1c0: ec4e sd s3,24(sp) + 1c2: e852 sd s4,16(sp) + 1c4: e456 sd s5,8(sp) + 1c6: 0080 addi s0,sp,64 + if(argc <= 1){ + 1c8: 4785 li a5,1 + 1ca: 04a7d663 bge a5,a0,216 <main+0x60> + pattern = argv[1]; + 1ce: 0085ba03 ld s4,8(a1) + if(argc <= 2){ + 1d2: 4789 li a5,2 + 1d4: 04a7db63 bge a5,a0,22a <main+0x74> + 1d8: 01058913 addi s2,a1,16 + 1dc: ffd5099b addiw s3,a0,-3 + 1e0: 02099793 slli a5,s3,0x20 + 1e4: 01d7d993 srli s3,a5,0x1d + 1e8: 05e1 addi a1,a1,24 + 1ea: 99ae add s3,s3,a1 + if((fd = open(argv[i], O_RDONLY)) < 0){ + 1ec: 4581 li a1,0 + 1ee: 00093503 ld a0,0(s2) + 1f2: 306000ef jal ra,4f8 <open> + 1f6: 84aa mv s1,a0 + 1f8: 04054063 bltz a0,238 <main+0x82> + grep(pattern, fd); + 1fc: 85aa mv a1,a0 + 1fe: 8552 mv a0,s4 + 200: f07ff0ef jal ra,106 <grep> + close(fd); + 204: 8526 mv a0,s1 + 206: 2da000ef jal ra,4e0 <close> + for(i = 2; i < argc; i++){ + 20a: 0921 addi s2,s2,8 + 20c: ff3910e3 bne s2,s3,1ec <main+0x36> + exit(0); + 210: 4501 li a0,0 + 212: 2a6000ef jal ra,4b8 <exit> + fprintf(2, "usage: grep pattern [file ...]\n"); + 216: 00001597 auipc a1,0x1 + 21a: 85a58593 addi a1,a1,-1958 # a70 <malloc+0xe0> + 21e: 4509 li a0,2 + 220: 692000ef jal ra,8b2 <fprintf> + exit(1); + 224: 4505 li a0,1 + 226: 292000ef jal ra,4b8 <exit> + grep(pattern, 0); + 22a: 4581 li a1,0 + 22c: 8552 mv a0,s4 + 22e: ed9ff0ef jal ra,106 <grep> + exit(0); + 232: 4501 li a0,0 + 234: 284000ef jal ra,4b8 <exit> + printf("grep: cannot open %s\n", argv[i]); + 238: 00093583 ld a1,0(s2) + 23c: 00001517 auipc a0,0x1 + 240: 85450513 addi a0,a0,-1964 # a90 <malloc+0x100> + 244: 698000ef jal ra,8dc <printf> + exit(1); + 248: 4505 li a0,1 + 24a: 26e000ef jal ra,4b8 <exit> + +000000000000024e <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 24e: 1141 addi sp,sp,-16 + 250: e406 sd ra,8(sp) + 252: e022 sd s0,0(sp) + 254: 0800 addi s0,sp,16 + extern int main(); + main(); + 256: f61ff0ef jal ra,1b6 <main> + exit(0); + 25a: 4501 li a0,0 + 25c: 25c000ef jal ra,4b8 <exit> + +0000000000000260 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 260: 1141 addi sp,sp,-16 + 262: e422 sd s0,8(sp) + 264: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 266: 87aa mv a5,a0 + 268: 0585 addi a1,a1,1 + 26a: 0785 addi a5,a5,1 + 26c: fff5c703 lbu a4,-1(a1) + 270: fee78fa3 sb a4,-1(a5) + 274: fb75 bnez a4,268 <strcpy+0x8> + ; + return os; +} + 276: 6422 ld s0,8(sp) + 278: 0141 addi sp,sp,16 + 27a: 8082 ret + +000000000000027c <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 27c: 1141 addi sp,sp,-16 + 27e: e422 sd s0,8(sp) + 280: 0800 addi s0,sp,16 + while(*p && *p == *q) + 282: 00054783 lbu a5,0(a0) + 286: cb91 beqz a5,29a <strcmp+0x1e> + 288: 0005c703 lbu a4,0(a1) + 28c: 00f71763 bne a4,a5,29a <strcmp+0x1e> + p++, q++; + 290: 0505 addi a0,a0,1 + 292: 0585 addi a1,a1,1 + while(*p && *p == *q) + 294: 00054783 lbu a5,0(a0) + 298: fbe5 bnez a5,288 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 29a: 0005c503 lbu a0,0(a1) +} + 29e: 40a7853b subw a0,a5,a0 + 2a2: 6422 ld s0,8(sp) + 2a4: 0141 addi sp,sp,16 + 2a6: 8082 ret + +00000000000002a8 <strlen>: + +uint +strlen(const char *s) +{ + 2a8: 1141 addi sp,sp,-16 + 2aa: e422 sd s0,8(sp) + 2ac: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2ae: 00054783 lbu a5,0(a0) + 2b2: cf91 beqz a5,2ce <strlen+0x26> + 2b4: 0505 addi a0,a0,1 + 2b6: 87aa mv a5,a0 + 2b8: 4685 li a3,1 + 2ba: 9e89 subw a3,a3,a0 + 2bc: 00f6853b addw a0,a3,a5 + 2c0: 0785 addi a5,a5,1 + 2c2: fff7c703 lbu a4,-1(a5) + 2c6: fb7d bnez a4,2bc <strlen+0x14> + ; + return n; +} + 2c8: 6422 ld s0,8(sp) + 2ca: 0141 addi sp,sp,16 + 2cc: 8082 ret + for(n = 0; s[n]; n++) + 2ce: 4501 li a0,0 + 2d0: bfe5 j 2c8 <strlen+0x20> + +00000000000002d2 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 2d2: 1141 addi sp,sp,-16 + 2d4: e422 sd s0,8(sp) + 2d6: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2d8: ca19 beqz a2,2ee <memset+0x1c> + 2da: 87aa mv a5,a0 + 2dc: 1602 slli a2,a2,0x20 + 2de: 9201 srli a2,a2,0x20 + 2e0: 00a60733 add a4,a2,a0 + cdst[i] = c; + 2e4: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 2e8: 0785 addi a5,a5,1 + 2ea: fee79de3 bne a5,a4,2e4 <memset+0x12> + } + return dst; +} + 2ee: 6422 ld s0,8(sp) + 2f0: 0141 addi sp,sp,16 + 2f2: 8082 ret + +00000000000002f4 <strchr>: + +char* +strchr(const char *s, char c) +{ + 2f4: 1141 addi sp,sp,-16 + 2f6: e422 sd s0,8(sp) + 2f8: 0800 addi s0,sp,16 + for(; *s; s++) + 2fa: 00054783 lbu a5,0(a0) + 2fe: cb99 beqz a5,314 <strchr+0x20> + if(*s == c) + 300: 00f58763 beq a1,a5,30e <strchr+0x1a> + for(; *s; s++) + 304: 0505 addi a0,a0,1 + 306: 00054783 lbu a5,0(a0) + 30a: fbfd bnez a5,300 <strchr+0xc> + return (char*)s; + return 0; + 30c: 4501 li a0,0 +} + 30e: 6422 ld s0,8(sp) + 310: 0141 addi sp,sp,16 + 312: 8082 ret + return 0; + 314: 4501 li a0,0 + 316: bfe5 j 30e <strchr+0x1a> + +0000000000000318 <gets>: + +char* +gets(char *buf, int max) +{ + 318: 711d addi sp,sp,-96 + 31a: ec86 sd ra,88(sp) + 31c: e8a2 sd s0,80(sp) + 31e: e4a6 sd s1,72(sp) + 320: e0ca sd s2,64(sp) + 322: fc4e sd s3,56(sp) + 324: f852 sd s4,48(sp) + 326: f456 sd s5,40(sp) + 328: f05a sd s6,32(sp) + 32a: ec5e sd s7,24(sp) + 32c: 1080 addi s0,sp,96 + 32e: 8baa mv s7,a0 + 330: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 332: 892a mv s2,a0 + 334: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 336: 4aa9 li s5,10 + 338: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 33a: 89a6 mv s3,s1 + 33c: 2485 addiw s1,s1,1 + 33e: 0344d663 bge s1,s4,36a <gets+0x52> + cc = read(0, &c, 1); + 342: 4605 li a2,1 + 344: faf40593 addi a1,s0,-81 + 348: 4501 li a0,0 + 34a: 186000ef jal ra,4d0 <read> + if(cc < 1) + 34e: 00a05e63 blez a0,36a <gets+0x52> + buf[i++] = c; + 352: faf44783 lbu a5,-81(s0) + 356: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 35a: 01578763 beq a5,s5,368 <gets+0x50> + 35e: 0905 addi s2,s2,1 + 360: fd679de3 bne a5,s6,33a <gets+0x22> + for(i=0; i+1 < max; ){ + 364: 89a6 mv s3,s1 + 366: a011 j 36a <gets+0x52> + 368: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 36a: 99de add s3,s3,s7 + 36c: 00098023 sb zero,0(s3) + return buf; +} + 370: 855e mv a0,s7 + 372: 60e6 ld ra,88(sp) + 374: 6446 ld s0,80(sp) + 376: 64a6 ld s1,72(sp) + 378: 6906 ld s2,64(sp) + 37a: 79e2 ld s3,56(sp) + 37c: 7a42 ld s4,48(sp) + 37e: 7aa2 ld s5,40(sp) + 380: 7b02 ld s6,32(sp) + 382: 6be2 ld s7,24(sp) + 384: 6125 addi sp,sp,96 + 386: 8082 ret + +0000000000000388 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 388: 1101 addi sp,sp,-32 + 38a: ec06 sd ra,24(sp) + 38c: e822 sd s0,16(sp) + 38e: e426 sd s1,8(sp) + 390: e04a sd s2,0(sp) + 392: 1000 addi s0,sp,32 + 394: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 396: 4581 li a1,0 + 398: 160000ef jal ra,4f8 <open> + if(fd < 0) + 39c: 02054163 bltz a0,3be <stat+0x36> + 3a0: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3a2: 85ca mv a1,s2 + 3a4: 16c000ef jal ra,510 <fstat> + 3a8: 892a mv s2,a0 + close(fd); + 3aa: 8526 mv a0,s1 + 3ac: 134000ef jal ra,4e0 <close> + return r; +} + 3b0: 854a mv a0,s2 + 3b2: 60e2 ld ra,24(sp) + 3b4: 6442 ld s0,16(sp) + 3b6: 64a2 ld s1,8(sp) + 3b8: 6902 ld s2,0(sp) + 3ba: 6105 addi sp,sp,32 + 3bc: 8082 ret + return -1; + 3be: 597d li s2,-1 + 3c0: bfc5 j 3b0 <stat+0x28> + +00000000000003c2 <atoi>: + +int +atoi(const char *s) +{ + 3c2: 1141 addi sp,sp,-16 + 3c4: e422 sd s0,8(sp) + 3c6: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3c8: 00054683 lbu a3,0(a0) + 3cc: fd06879b addiw a5,a3,-48 + 3d0: 0ff7f793 zext.b a5,a5 + 3d4: 4625 li a2,9 + 3d6: 02f66863 bltu a2,a5,406 <atoi+0x44> + 3da: 872a mv a4,a0 + n = 0; + 3dc: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3de: 0705 addi a4,a4,1 + 3e0: 0025179b slliw a5,a0,0x2 + 3e4: 9fa9 addw a5,a5,a0 + 3e6: 0017979b slliw a5,a5,0x1 + 3ea: 9fb5 addw a5,a5,a3 + 3ec: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 3f0: 00074683 lbu a3,0(a4) + 3f4: fd06879b addiw a5,a3,-48 + 3f8: 0ff7f793 zext.b a5,a5 + 3fc: fef671e3 bgeu a2,a5,3de <atoi+0x1c> + return n; +} + 400: 6422 ld s0,8(sp) + 402: 0141 addi sp,sp,16 + 404: 8082 ret + n = 0; + 406: 4501 li a0,0 + 408: bfe5 j 400 <atoi+0x3e> + +000000000000040a <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 40a: 1141 addi sp,sp,-16 + 40c: e422 sd s0,8(sp) + 40e: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 410: 02b57463 bgeu a0,a1,438 <memmove+0x2e> + while(n-- > 0) + 414: 00c05f63 blez a2,432 <memmove+0x28> + 418: 1602 slli a2,a2,0x20 + 41a: 9201 srli a2,a2,0x20 + 41c: 00c507b3 add a5,a0,a2 + dst = vdst; + 420: 872a mv a4,a0 + *dst++ = *src++; + 422: 0585 addi a1,a1,1 + 424: 0705 addi a4,a4,1 + 426: fff5c683 lbu a3,-1(a1) + 42a: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 42e: fee79ae3 bne a5,a4,422 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 432: 6422 ld s0,8(sp) + 434: 0141 addi sp,sp,16 + 436: 8082 ret + dst += n; + 438: 00c50733 add a4,a0,a2 + src += n; + 43c: 95b2 add a1,a1,a2 + while(n-- > 0) + 43e: fec05ae3 blez a2,432 <memmove+0x28> + 442: fff6079b addiw a5,a2,-1 + 446: 1782 slli a5,a5,0x20 + 448: 9381 srli a5,a5,0x20 + 44a: fff7c793 not a5,a5 + 44e: 97ba add a5,a5,a4 + *--dst = *--src; + 450: 15fd addi a1,a1,-1 + 452: 177d addi a4,a4,-1 + 454: 0005c683 lbu a3,0(a1) + 458: 00d70023 sb a3,0(a4) + while(n-- > 0) + 45c: fee79ae3 bne a5,a4,450 <memmove+0x46> + 460: bfc9 j 432 <memmove+0x28> + +0000000000000462 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 462: 1141 addi sp,sp,-16 + 464: e422 sd s0,8(sp) + 466: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 468: ca05 beqz a2,498 <memcmp+0x36> + 46a: fff6069b addiw a3,a2,-1 + 46e: 1682 slli a3,a3,0x20 + 470: 9281 srli a3,a3,0x20 + 472: 0685 addi a3,a3,1 + 474: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 476: 00054783 lbu a5,0(a0) + 47a: 0005c703 lbu a4,0(a1) + 47e: 00e79863 bne a5,a4,48e <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 482: 0505 addi a0,a0,1 + p2++; + 484: 0585 addi a1,a1,1 + while (n-- > 0) { + 486: fed518e3 bne a0,a3,476 <memcmp+0x14> + } + return 0; + 48a: 4501 li a0,0 + 48c: a019 j 492 <memcmp+0x30> + return *p1 - *p2; + 48e: 40e7853b subw a0,a5,a4 +} + 492: 6422 ld s0,8(sp) + 494: 0141 addi sp,sp,16 + 496: 8082 ret + return 0; + 498: 4501 li a0,0 + 49a: bfe5 j 492 <memcmp+0x30> + +000000000000049c <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 49c: 1141 addi sp,sp,-16 + 49e: e406 sd ra,8(sp) + 4a0: e022 sd s0,0(sp) + 4a2: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4a4: f67ff0ef jal ra,40a <memmove> +} + 4a8: 60a2 ld ra,8(sp) + 4aa: 6402 ld s0,0(sp) + 4ac: 0141 addi sp,sp,16 + 4ae: 8082 ret + +00000000000004b0 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4b0: 4885 li a7,1 + ecall + 4b2: 00000073 ecall + ret + 4b6: 8082 ret + +00000000000004b8 <exit>: +.global exit +exit: + li a7, SYS_exit + 4b8: 4889 li a7,2 + ecall + 4ba: 00000073 ecall + ret + 4be: 8082 ret + +00000000000004c0 <wait>: +.global wait +wait: + li a7, SYS_wait + 4c0: 488d li a7,3 + ecall + 4c2: 00000073 ecall + ret + 4c6: 8082 ret + +00000000000004c8 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 4c8: 4891 li a7,4 + ecall + 4ca: 00000073 ecall + ret + 4ce: 8082 ret + +00000000000004d0 <read>: +.global read +read: + li a7, SYS_read + 4d0: 4895 li a7,5 + ecall + 4d2: 00000073 ecall + ret + 4d6: 8082 ret + +00000000000004d8 <write>: +.global write +write: + li a7, SYS_write + 4d8: 48c1 li a7,16 + ecall + 4da: 00000073 ecall + ret + 4de: 8082 ret + +00000000000004e0 <close>: +.global close +close: + li a7, SYS_close + 4e0: 48d5 li a7,21 + ecall + 4e2: 00000073 ecall + ret + 4e6: 8082 ret + +00000000000004e8 <kill>: +.global kill +kill: + li a7, SYS_kill + 4e8: 4899 li a7,6 + ecall + 4ea: 00000073 ecall + ret + 4ee: 8082 ret + +00000000000004f0 <exec>: +.global exec +exec: + li a7, SYS_exec + 4f0: 489d li a7,7 + ecall + 4f2: 00000073 ecall + ret + 4f6: 8082 ret + +00000000000004f8 <open>: +.global open +open: + li a7, SYS_open + 4f8: 48bd li a7,15 + ecall + 4fa: 00000073 ecall + ret + 4fe: 8082 ret + +0000000000000500 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 500: 48c5 li a7,17 + ecall + 502: 00000073 ecall + ret + 506: 8082 ret + +0000000000000508 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 508: 48c9 li a7,18 + ecall + 50a: 00000073 ecall + ret + 50e: 8082 ret + +0000000000000510 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 510: 48a1 li a7,8 + ecall + 512: 00000073 ecall + ret + 516: 8082 ret + +0000000000000518 <link>: +.global link +link: + li a7, SYS_link + 518: 48cd li a7,19 + ecall + 51a: 00000073 ecall + ret + 51e: 8082 ret + +0000000000000520 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 520: 48d1 li a7,20 + ecall + 522: 00000073 ecall + ret + 526: 8082 ret + +0000000000000528 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 528: 48a5 li a7,9 + ecall + 52a: 00000073 ecall + ret + 52e: 8082 ret + +0000000000000530 <dup>: +.global dup +dup: + li a7, SYS_dup + 530: 48a9 li a7,10 + ecall + 532: 00000073 ecall + ret + 536: 8082 ret + +0000000000000538 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 538: 48ad li a7,11 + ecall + 53a: 00000073 ecall + ret + 53e: 8082 ret + +0000000000000540 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 540: 48b1 li a7,12 + ecall + 542: 00000073 ecall + ret + 546: 8082 ret + +0000000000000548 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 548: 48b5 li a7,13 + ecall + 54a: 00000073 ecall + ret + 54e: 8082 ret + +0000000000000550 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 550: 48b9 li a7,14 + ecall + 552: 00000073 ecall + ret + 556: 8082 ret + +0000000000000558 <trace>: +.global trace +trace: + li a7, SYS_trace + 558: 48d9 li a7,22 + ecall + 55a: 00000073 ecall + ret + 55e: 8082 ret + +0000000000000560 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 560: 48dd li a7,23 + ecall + 562: 00000073 ecall + ret + 566: 8082 ret + +0000000000000568 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 568: 48e1 li a7,24 + ecall + 56a: 00000073 ecall + ret + 56e: 8082 ret + +0000000000000570 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 570: 1101 addi sp,sp,-32 + 572: ec06 sd ra,24(sp) + 574: e822 sd s0,16(sp) + 576: 1000 addi s0,sp,32 + 578: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 57c: 4605 li a2,1 + 57e: fef40593 addi a1,s0,-17 + 582: f57ff0ef jal ra,4d8 <write> +} + 586: 60e2 ld ra,24(sp) + 588: 6442 ld s0,16(sp) + 58a: 6105 addi sp,sp,32 + 58c: 8082 ret + +000000000000058e <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 58e: 7139 addi sp,sp,-64 + 590: fc06 sd ra,56(sp) + 592: f822 sd s0,48(sp) + 594: f426 sd s1,40(sp) + 596: f04a sd s2,32(sp) + 598: ec4e sd s3,24(sp) + 59a: 0080 addi s0,sp,64 + 59c: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 59e: c299 beqz a3,5a4 <printint+0x16> + 5a0: 0805c763 bltz a1,62e <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 5a4: 2581 sext.w a1,a1 + neg = 0; + 5a6: 4881 li a7,0 + 5a8: fc040693 addi a3,s0,-64 + } + + i = 0; + 5ac: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 5ae: 2601 sext.w a2,a2 + 5b0: 00000517 auipc a0,0x0 + 5b4: 50050513 addi a0,a0,1280 # ab0 <digits> + 5b8: 883a mv a6,a4 + 5ba: 2705 addiw a4,a4,1 + 5bc: 02c5f7bb remuw a5,a1,a2 + 5c0: 1782 slli a5,a5,0x20 + 5c2: 9381 srli a5,a5,0x20 + 5c4: 97aa add a5,a5,a0 + 5c6: 0007c783 lbu a5,0(a5) + 5ca: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 5ce: 0005879b sext.w a5,a1 + 5d2: 02c5d5bb divuw a1,a1,a2 + 5d6: 0685 addi a3,a3,1 + 5d8: fec7f0e3 bgeu a5,a2,5b8 <printint+0x2a> + if(neg) + 5dc: 00088c63 beqz a7,5f4 <printint+0x66> + buf[i++] = '-'; + 5e0: fd070793 addi a5,a4,-48 + 5e4: 00878733 add a4,a5,s0 + 5e8: 02d00793 li a5,45 + 5ec: fef70823 sb a5,-16(a4) + 5f0: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 5f4: 02e05663 blez a4,620 <printint+0x92> + 5f8: fc040793 addi a5,s0,-64 + 5fc: 00e78933 add s2,a5,a4 + 600: fff78993 addi s3,a5,-1 + 604: 99ba add s3,s3,a4 + 606: 377d addiw a4,a4,-1 + 608: 1702 slli a4,a4,0x20 + 60a: 9301 srli a4,a4,0x20 + 60c: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 610: fff94583 lbu a1,-1(s2) + 614: 8526 mv a0,s1 + 616: f5bff0ef jal ra,570 <putc> + while(--i >= 0) + 61a: 197d addi s2,s2,-1 + 61c: ff391ae3 bne s2,s3,610 <printint+0x82> +} + 620: 70e2 ld ra,56(sp) + 622: 7442 ld s0,48(sp) + 624: 74a2 ld s1,40(sp) + 626: 7902 ld s2,32(sp) + 628: 69e2 ld s3,24(sp) + 62a: 6121 addi sp,sp,64 + 62c: 8082 ret + x = -xx; + 62e: 40b005bb negw a1,a1 + neg = 1; + 632: 4885 li a7,1 + x = -xx; + 634: bf95 j 5a8 <printint+0x1a> + +0000000000000636 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 636: 7119 addi sp,sp,-128 + 638: fc86 sd ra,120(sp) + 63a: f8a2 sd s0,112(sp) + 63c: f4a6 sd s1,104(sp) + 63e: f0ca sd s2,96(sp) + 640: ecce sd s3,88(sp) + 642: e8d2 sd s4,80(sp) + 644: e4d6 sd s5,72(sp) + 646: e0da sd s6,64(sp) + 648: fc5e sd s7,56(sp) + 64a: f862 sd s8,48(sp) + 64c: f466 sd s9,40(sp) + 64e: f06a sd s10,32(sp) + 650: ec6e sd s11,24(sp) + 652: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 654: 0005c903 lbu s2,0(a1) + 658: 22090e63 beqz s2,894 <vprintf+0x25e> + 65c: 8b2a mv s6,a0 + 65e: 8a2e mv s4,a1 + 660: 8bb2 mv s7,a2 + state = 0; + 662: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 664: 4481 li s1,0 + 666: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 668: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 66c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 670: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 674: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 678: 00000c97 auipc s9,0x0 + 67c: 438c8c93 addi s9,s9,1080 # ab0 <digits> + 680: a005 j 6a0 <vprintf+0x6a> + putc(fd, c0); + 682: 85ca mv a1,s2 + 684: 855a mv a0,s6 + 686: eebff0ef jal ra,570 <putc> + 68a: a019 j 690 <vprintf+0x5a> + } else if(state == '%'){ + 68c: 03598263 beq s3,s5,6b0 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 690: 2485 addiw s1,s1,1 + 692: 8726 mv a4,s1 + 694: 009a07b3 add a5,s4,s1 + 698: 0007c903 lbu s2,0(a5) + 69c: 1e090c63 beqz s2,894 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 6a0: 0009079b sext.w a5,s2 + if(state == 0){ + 6a4: fe0994e3 bnez s3,68c <vprintf+0x56> + if(c0 == '%'){ + 6a8: fd579de3 bne a5,s5,682 <vprintf+0x4c> + state = '%'; + 6ac: 89be mv s3,a5 + 6ae: b7cd j 690 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 6b0: cfa5 beqz a5,728 <vprintf+0xf2> + 6b2: 00ea06b3 add a3,s4,a4 + 6b6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6ba: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6bc: c681 beqz a3,6c4 <vprintf+0x8e> + 6be: 9752 add a4,a4,s4 + 6c0: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6c4: 03878a63 beq a5,s8,6f8 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 6c8: 05a78463 beq a5,s10,710 <vprintf+0xda> + } else if(c0 == 'u'){ + 6cc: 0db78763 beq a5,s11,79a <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6d0: 07800713 li a4,120 + 6d4: 10e78963 beq a5,a4,7e6 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 6d8: 07000713 li a4,112 + 6dc: 12e78e63 beq a5,a4,818 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 6e0: 07300713 li a4,115 + 6e4: 16e78b63 beq a5,a4,85a <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 6e8: 05579063 bne a5,s5,728 <vprintf+0xf2> + putc(fd, '%'); + 6ec: 85d6 mv a1,s5 + 6ee: 855a mv a0,s6 + 6f0: e81ff0ef jal ra,570 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 6f4: 4981 li s3,0 + 6f6: bf69 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 6f8: 008b8913 addi s2,s7,8 + 6fc: 4685 li a3,1 + 6fe: 4629 li a2,10 + 700: 000ba583 lw a1,0(s7) + 704: 855a mv a0,s6 + 706: e89ff0ef jal ra,58e <printint> + 70a: 8bca mv s7,s2 + state = 0; + 70c: 4981 li s3,0 + 70e: b749 j 690 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 710: 03868663 beq a3,s8,73c <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 714: 05a68163 beq a3,s10,756 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 718: 09b68d63 beq a3,s11,7b2 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 71c: 03a68f63 beq a3,s10,75a <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 720: 07800793 li a5,120 + 724: 0cf68d63 beq a3,a5,7fe <vprintf+0x1c8> + putc(fd, '%'); + 728: 85d6 mv a1,s5 + 72a: 855a mv a0,s6 + 72c: e45ff0ef jal ra,570 <putc> + putc(fd, c0); + 730: 85ca mv a1,s2 + 732: 855a mv a0,s6 + 734: e3dff0ef jal ra,570 <putc> + state = 0; + 738: 4981 li s3,0 + 73a: bf99 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 73c: 008b8913 addi s2,s7,8 + 740: 4685 li a3,1 + 742: 4629 li a2,10 + 744: 000ba583 lw a1,0(s7) + 748: 855a mv a0,s6 + 74a: e45ff0ef jal ra,58e <printint> + i += 1; + 74e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 750: 8bca mv s7,s2 + state = 0; + 752: 4981 li s3,0 + i += 1; + 754: bf35 j 690 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 756: 03860563 beq a2,s8,780 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 75a: 07b60963 beq a2,s11,7cc <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 75e: 07800793 li a5,120 + 762: fcf613e3 bne a2,a5,728 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 766: 008b8913 addi s2,s7,8 + 76a: 4681 li a3,0 + 76c: 4641 li a2,16 + 76e: 000ba583 lw a1,0(s7) + 772: 855a mv a0,s6 + 774: e1bff0ef jal ra,58e <printint> + i += 2; + 778: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 77a: 8bca mv s7,s2 + state = 0; + 77c: 4981 li s3,0 + i += 2; + 77e: bf09 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 780: 008b8913 addi s2,s7,8 + 784: 4685 li a3,1 + 786: 4629 li a2,10 + 788: 000ba583 lw a1,0(s7) + 78c: 855a mv a0,s6 + 78e: e01ff0ef jal ra,58e <printint> + i += 2; + 792: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 794: 8bca mv s7,s2 + state = 0; + 796: 4981 li s3,0 + i += 2; + 798: bde5 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 79a: 008b8913 addi s2,s7,8 + 79e: 4681 li a3,0 + 7a0: 4629 li a2,10 + 7a2: 000ba583 lw a1,0(s7) + 7a6: 855a mv a0,s6 + 7a8: de7ff0ef jal ra,58e <printint> + 7ac: 8bca mv s7,s2 + state = 0; + 7ae: 4981 li s3,0 + 7b0: b5c5 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 7b2: 008b8913 addi s2,s7,8 + 7b6: 4681 li a3,0 + 7b8: 4629 li a2,10 + 7ba: 000ba583 lw a1,0(s7) + 7be: 855a mv a0,s6 + 7c0: dcfff0ef jal ra,58e <printint> + i += 1; + 7c4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 7c6: 8bca mv s7,s2 + state = 0; + 7c8: 4981 li s3,0 + i += 1; + 7ca: b5d9 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 7cc: 008b8913 addi s2,s7,8 + 7d0: 4681 li a3,0 + 7d2: 4629 li a2,10 + 7d4: 000ba583 lw a1,0(s7) + 7d8: 855a mv a0,s6 + 7da: db5ff0ef jal ra,58e <printint> + i += 2; + 7de: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 7e0: 8bca mv s7,s2 + state = 0; + 7e2: 4981 li s3,0 + i += 2; + 7e4: b575 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 7e6: 008b8913 addi s2,s7,8 + 7ea: 4681 li a3,0 + 7ec: 4641 li a2,16 + 7ee: 000ba583 lw a1,0(s7) + 7f2: 855a mv a0,s6 + 7f4: d9bff0ef jal ra,58e <printint> + 7f8: 8bca mv s7,s2 + state = 0; + 7fa: 4981 li s3,0 + 7fc: bd51 j 690 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 7fe: 008b8913 addi s2,s7,8 + 802: 4681 li a3,0 + 804: 4641 li a2,16 + 806: 000ba583 lw a1,0(s7) + 80a: 855a mv a0,s6 + 80c: d83ff0ef jal ra,58e <printint> + i += 1; + 810: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 812: 8bca mv s7,s2 + state = 0; + 814: 4981 li s3,0 + i += 1; + 816: bdad j 690 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 818: 008b8793 addi a5,s7,8 + 81c: f8f43423 sd a5,-120(s0) + 820: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 824: 03000593 li a1,48 + 828: 855a mv a0,s6 + 82a: d47ff0ef jal ra,570 <putc> + putc(fd, 'x'); + 82e: 07800593 li a1,120 + 832: 855a mv a0,s6 + 834: d3dff0ef jal ra,570 <putc> + 838: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 83a: 03c9d793 srli a5,s3,0x3c + 83e: 97e6 add a5,a5,s9 + 840: 0007c583 lbu a1,0(a5) + 844: 855a mv a0,s6 + 846: d2bff0ef jal ra,570 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 84a: 0992 slli s3,s3,0x4 + 84c: 397d addiw s2,s2,-1 + 84e: fe0916e3 bnez s2,83a <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 852: f8843b83 ld s7,-120(s0) + state = 0; + 856: 4981 li s3,0 + 858: bd25 j 690 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 85a: 008b8993 addi s3,s7,8 + 85e: 000bb903 ld s2,0(s7) + 862: 00090f63 beqz s2,880 <vprintf+0x24a> + for(; *s; s++) + 866: 00094583 lbu a1,0(s2) + 86a: c195 beqz a1,88e <vprintf+0x258> + putc(fd, *s); + 86c: 855a mv a0,s6 + 86e: d03ff0ef jal ra,570 <putc> + for(; *s; s++) + 872: 0905 addi s2,s2,1 + 874: 00094583 lbu a1,0(s2) + 878: f9f5 bnez a1,86c <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 87a: 8bce mv s7,s3 + state = 0; + 87c: 4981 li s3,0 + 87e: bd09 j 690 <vprintf+0x5a> + s = "(null)"; + 880: 00000917 auipc s2,0x0 + 884: 22890913 addi s2,s2,552 # aa8 <malloc+0x118> + for(; *s; s++) + 888: 02800593 li a1,40 + 88c: b7c5 j 86c <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 88e: 8bce mv s7,s3 + state = 0; + 890: 4981 li s3,0 + 892: bbfd j 690 <vprintf+0x5a> + } + } +} + 894: 70e6 ld ra,120(sp) + 896: 7446 ld s0,112(sp) + 898: 74a6 ld s1,104(sp) + 89a: 7906 ld s2,96(sp) + 89c: 69e6 ld s3,88(sp) + 89e: 6a46 ld s4,80(sp) + 8a0: 6aa6 ld s5,72(sp) + 8a2: 6b06 ld s6,64(sp) + 8a4: 7be2 ld s7,56(sp) + 8a6: 7c42 ld s8,48(sp) + 8a8: 7ca2 ld s9,40(sp) + 8aa: 7d02 ld s10,32(sp) + 8ac: 6de2 ld s11,24(sp) + 8ae: 6109 addi sp,sp,128 + 8b0: 8082 ret + +00000000000008b2 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 8b2: 715d addi sp,sp,-80 + 8b4: ec06 sd ra,24(sp) + 8b6: e822 sd s0,16(sp) + 8b8: 1000 addi s0,sp,32 + 8ba: e010 sd a2,0(s0) + 8bc: e414 sd a3,8(s0) + 8be: e818 sd a4,16(s0) + 8c0: ec1c sd a5,24(s0) + 8c2: 03043023 sd a6,32(s0) + 8c6: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 8ca: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 8ce: 8622 mv a2,s0 + 8d0: d67ff0ef jal ra,636 <vprintf> +} + 8d4: 60e2 ld ra,24(sp) + 8d6: 6442 ld s0,16(sp) + 8d8: 6161 addi sp,sp,80 + 8da: 8082 ret + +00000000000008dc <printf>: + +void +printf(const char *fmt, ...) +{ + 8dc: 711d addi sp,sp,-96 + 8de: ec06 sd ra,24(sp) + 8e0: e822 sd s0,16(sp) + 8e2: 1000 addi s0,sp,32 + 8e4: e40c sd a1,8(s0) + 8e6: e810 sd a2,16(s0) + 8e8: ec14 sd a3,24(s0) + 8ea: f018 sd a4,32(s0) + 8ec: f41c sd a5,40(s0) + 8ee: 03043823 sd a6,48(s0) + 8f2: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 8f6: 00840613 addi a2,s0,8 + 8fa: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 8fe: 85aa mv a1,a0 + 900: 4505 li a0,1 + 902: d35ff0ef jal ra,636 <vprintf> +} + 906: 60e2 ld ra,24(sp) + 908: 6442 ld s0,16(sp) + 90a: 6125 addi sp,sp,96 + 90c: 8082 ret + +000000000000090e <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 90e: 1141 addi sp,sp,-16 + 910: e422 sd s0,8(sp) + 912: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 914: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 918: 00000797 auipc a5,0x0 + 91c: 6e87b783 ld a5,1768(a5) # 1000 <freep> + 920: a02d j 94a <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 922: 4618 lw a4,8(a2) + 924: 9f2d addw a4,a4,a1 + 926: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 92a: 6398 ld a4,0(a5) + 92c: 6310 ld a2,0(a4) + 92e: a83d j 96c <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 930: ff852703 lw a4,-8(a0) + 934: 9f31 addw a4,a4,a2 + 936: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 938: ff053683 ld a3,-16(a0) + 93c: a091 j 980 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 93e: 6398 ld a4,0(a5) + 940: 00e7e463 bltu a5,a4,948 <free+0x3a> + 944: 00e6ea63 bltu a3,a4,958 <free+0x4a> +{ + 948: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 94a: fed7fae3 bgeu a5,a3,93e <free+0x30> + 94e: 6398 ld a4,0(a5) + 950: 00e6e463 bltu a3,a4,958 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 954: fee7eae3 bltu a5,a4,948 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 958: ff852583 lw a1,-8(a0) + 95c: 6390 ld a2,0(a5) + 95e: 02059813 slli a6,a1,0x20 + 962: 01c85713 srli a4,a6,0x1c + 966: 9736 add a4,a4,a3 + 968: fae60de3 beq a2,a4,922 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 96c: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 970: 4790 lw a2,8(a5) + 972: 02061593 slli a1,a2,0x20 + 976: 01c5d713 srli a4,a1,0x1c + 97a: 973e add a4,a4,a5 + 97c: fae68ae3 beq a3,a4,930 <free+0x22> + p->s.ptr = bp->s.ptr; + 980: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 982: 00000717 auipc a4,0x0 + 986: 66f73f23 sd a5,1662(a4) # 1000 <freep> +} + 98a: 6422 ld s0,8(sp) + 98c: 0141 addi sp,sp,16 + 98e: 8082 ret + +0000000000000990 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 990: 7139 addi sp,sp,-64 + 992: fc06 sd ra,56(sp) + 994: f822 sd s0,48(sp) + 996: f426 sd s1,40(sp) + 998: f04a sd s2,32(sp) + 99a: ec4e sd s3,24(sp) + 99c: e852 sd s4,16(sp) + 99e: e456 sd s5,8(sp) + 9a0: e05a sd s6,0(sp) + 9a2: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 9a4: 02051493 slli s1,a0,0x20 + 9a8: 9081 srli s1,s1,0x20 + 9aa: 04bd addi s1,s1,15 + 9ac: 8091 srli s1,s1,0x4 + 9ae: 0014899b addiw s3,s1,1 + 9b2: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 9b4: 00000517 auipc a0,0x0 + 9b8: 64c53503 ld a0,1612(a0) # 1000 <freep> + 9bc: c515 beqz a0,9e8 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 9be: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 9c0: 4798 lw a4,8(a5) + 9c2: 02977f63 bgeu a4,s1,a00 <malloc+0x70> + 9c6: 8a4e mv s4,s3 + 9c8: 0009871b sext.w a4,s3 + 9cc: 6685 lui a3,0x1 + 9ce: 00d77363 bgeu a4,a3,9d4 <malloc+0x44> + 9d2: 6a05 lui s4,0x1 + 9d4: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 9d8: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 9dc: 00000917 auipc s2,0x0 + 9e0: 62490913 addi s2,s2,1572 # 1000 <freep> + if(p == (char*)-1) + 9e4: 5afd li s5,-1 + 9e6: a885 j a56 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 9e8: 00001797 auipc a5,0x1 + 9ec: a2878793 addi a5,a5,-1496 # 1410 <base> + 9f0: 00000717 auipc a4,0x0 + 9f4: 60f73823 sd a5,1552(a4) # 1000 <freep> + 9f8: e39c sd a5,0(a5) + base.s.size = 0; + 9fa: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 9fe: b7e1 j 9c6 <malloc+0x36> + if(p->s.size == nunits) + a00: 02e48c63 beq s1,a4,a38 <malloc+0xa8> + p->s.size -= nunits; + a04: 4137073b subw a4,a4,s3 + a08: c798 sw a4,8(a5) + p += p->s.size; + a0a: 02071693 slli a3,a4,0x20 + a0e: 01c6d713 srli a4,a3,0x1c + a12: 97ba add a5,a5,a4 + p->s.size = nunits; + a14: 0137a423 sw s3,8(a5) + freep = prevp; + a18: 00000717 auipc a4,0x0 + a1c: 5ea73423 sd a0,1512(a4) # 1000 <freep> + return (void*)(p + 1); + a20: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + a24: 70e2 ld ra,56(sp) + a26: 7442 ld s0,48(sp) + a28: 74a2 ld s1,40(sp) + a2a: 7902 ld s2,32(sp) + a2c: 69e2 ld s3,24(sp) + a2e: 6a42 ld s4,16(sp) + a30: 6aa2 ld s5,8(sp) + a32: 6b02 ld s6,0(sp) + a34: 6121 addi sp,sp,64 + a36: 8082 ret + prevp->s.ptr = p->s.ptr; + a38: 6398 ld a4,0(a5) + a3a: e118 sd a4,0(a0) + a3c: bff1 j a18 <malloc+0x88> + hp->s.size = nu; + a3e: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a42: 0541 addi a0,a0,16 + a44: ecbff0ef jal ra,90e <free> + return freep; + a48: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a4c: dd61 beqz a0,a24 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a4e: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a50: 4798 lw a4,8(a5) + a52: fa9777e3 bgeu a4,s1,a00 <malloc+0x70> + if(p == freep) + a56: 00093703 ld a4,0(s2) + a5a: 853e mv a0,a5 + a5c: fef719e3 bne a4,a5,a4e <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + a60: 8552 mv a0,s4 + a62: adfff0ef jal ra,540 <sbrk> + if(p == (char*)-1) + a66: fd551ce3 bne a0,s5,a3e <malloc+0xae> + return 0; + a6a: 4501 li a0,0 + a6c: bf65 j a24 <malloc+0x94> diff --git a/user/grep.d b/user/grep.d new file mode 100644 index 0000000000000000000000000000000000000000..5ee0fe81d4766bae12113f44c43c8266f69c8422 --- /dev/null +++ b/user/grep.d @@ -0,0 +1,2 @@ +user/grep.o: user/grep.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h kernel/fcntl.h user/user.h diff --git a/user/grep.o b/user/grep.o new file mode 100644 index 0000000000000000000000000000000000000000..39cb5a68b1e87cd0d6307f3063743019c6b04071 Binary files /dev/null and b/user/grep.o differ diff --git a/user/grep.sym b/user/grep.sym new file mode 100644 index 0000000000000000000000000000000000000000..e67502dab86060e8648955428a8563bfbe903796 --- /dev/null +++ b/user/grep.sym @@ -0,0 +1,71 @@ +0000000000000000 .text +0000000000000a70 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 grep.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000570 putc +000000000000058e printint +0000000000000ab0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001410 base +0000000000000260 strcpy +00000000000008dc printf +000000000000040a memmove +000000000000004a matchhere +0000000000000500 mknod +0000000000000558 trace +0000000000000318 gets +0000000000000538 getpid +000000000000049c memcpy +0000000000000106 grep +0000000000000990 malloc +0000000000000548 sleep +0000000000000560 mycall +00000000000004c8 pipe +00000000000004d8 write +0000000000000510 fstat +00000000000008b2 fprintf +00000000000004e8 kill +0000000000000636 vprintf +0000000000000528 chdir +00000000000004f0 exec +00000000000004c0 wait +00000000000004d0 read +0000000000000508 unlink +0000000000000462 memcmp +00000000000004b0 fork +0000000000000540 sbrk +0000000000000550 uptime +00000000000002d2 memset +00000000000001b6 main +0000000000000000 matchstar +0000000000000568 GSCinfo +000000000000027c strcmp +0000000000000530 dup +0000000000001010 buf +0000000000000388 stat +00000000000000c0 match +0000000000000518 link +00000000000004b8 exit +000000000000024e start +00000000000003c2 atoi +00000000000002a8 strlen +00000000000004f8 open +00000000000002f4 strchr +0000000000000520 mkdir +00000000000004e0 close +000000000000090e free diff --git a/user/grind.asm b/user/grind.asm new file mode 100644 index 0000000000000000000000000000000000000000..a630d280ba46278ef3cc8a781bb227488d9fb258 --- /dev/null +++ b/user/grind.asm @@ -0,0 +1,2512 @@ + +user/_grind: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <do_rand>: +#include "kernel/riscv.h" + +// from FreeBSD. +int +do_rand(unsigned long *ctx) +{ + 0: 1141 addi sp,sp,-16 + 2: e422 sd s0,8(sp) + 4: 0800 addi s0,sp,16 + * October 1988, p. 1195. + */ + long hi, lo, x; + + /* Transform to [1, 0x7ffffffe] range. */ + x = (*ctx % 0x7ffffffe) + 1; + 6: 611c ld a5,0(a0) + 8: 80000737 lui a4,0x80000 + c: ffe74713 xori a4,a4,-2 + 10: 02e7f7b3 remu a5,a5,a4 + 14: 0785 addi a5,a5,1 + hi = x / 127773; + lo = x % 127773; + 16: 66fd lui a3,0x1f + 18: 31d68693 addi a3,a3,797 # 1f31d <base+0x1cf15> + 1c: 02d7e733 rem a4,a5,a3 + x = 16807 * lo - 2836 * hi; + 20: 6611 lui a2,0x4 + 22: 1a760613 addi a2,a2,423 # 41a7 <base+0x1d9f> + 26: 02c70733 mul a4,a4,a2 + hi = x / 127773; + 2a: 02d7c7b3 div a5,a5,a3 + x = 16807 * lo - 2836 * hi; + 2e: 76fd lui a3,0xfffff + 30: 4ec68693 addi a3,a3,1260 # fffffffffffff4ec <base+0xffffffffffffd0e4> + 34: 02d787b3 mul a5,a5,a3 + 38: 97ba add a5,a5,a4 + if (x < 0) + 3a: 0007c963 bltz a5,4c <do_rand+0x4c> + x += 0x7fffffff; + /* Transform to [0, 0x7ffffffd] range. */ + x--; + 3e: 17fd addi a5,a5,-1 + *ctx = x; + 40: e11c sd a5,0(a0) + return (x); +} + 42: 0007851b sext.w a0,a5 + 46: 6422 ld s0,8(sp) + 48: 0141 addi sp,sp,16 + 4a: 8082 ret + x += 0x7fffffff; + 4c: 80000737 lui a4,0x80000 + 50: fff74713 not a4,a4 + 54: 97ba add a5,a5,a4 + 56: b7e5 j 3e <do_rand+0x3e> + +0000000000000058 <rand>: + +unsigned long rand_next = 1; + +int +rand(void) +{ + 58: 1141 addi sp,sp,-16 + 5a: e406 sd ra,8(sp) + 5c: e022 sd s0,0(sp) + 5e: 0800 addi s0,sp,16 + return (do_rand(&rand_next)); + 60: 00002517 auipc a0,0x2 + 64: fa050513 addi a0,a0,-96 # 2000 <rand_next> + 68: f99ff0ef jal ra,0 <do_rand> +} + 6c: 60a2 ld ra,8(sp) + 6e: 6402 ld s0,0(sp) + 70: 0141 addi sp,sp,16 + 72: 8082 ret + +0000000000000074 <go>: + +void +go(int which_child) +{ + 74: 7119 addi sp,sp,-128 + 76: fc86 sd ra,120(sp) + 78: f8a2 sd s0,112(sp) + 7a: f4a6 sd s1,104(sp) + 7c: f0ca sd s2,96(sp) + 7e: ecce sd s3,88(sp) + 80: e8d2 sd s4,80(sp) + 82: e4d6 sd s5,72(sp) + 84: e0da sd s6,64(sp) + 86: fc5e sd s7,56(sp) + 88: 0100 addi s0,sp,128 + 8a: 84aa mv s1,a0 + int fd = -1; + static char buf[999]; + char *break0 = sbrk(0); + 8c: 4501 li a0,0 + 8e: 335000ef jal ra,bc2 <sbrk> + 92: 8aaa mv s5,a0 + uint64 iters = 0; + + mkdir("grindir"); + 94: 00001517 auipc a0,0x1 + 98: 05c50513 addi a0,a0,92 # 10f0 <malloc+0xde> + 9c: 307000ef jal ra,ba2 <mkdir> + if(chdir("grindir") != 0){ + a0: 00001517 auipc a0,0x1 + a4: 05050513 addi a0,a0,80 # 10f0 <malloc+0xde> + a8: 303000ef jal ra,baa <chdir> + ac: c911 beqz a0,c0 <go+0x4c> + printf("grind: chdir grindir failed\n"); + ae: 00001517 auipc a0,0x1 + b2: 04a50513 addi a0,a0,74 # 10f8 <malloc+0xe6> + b6: 6a9000ef jal ra,f5e <printf> + exit(1); + ba: 4505 li a0,1 + bc: 27f000ef jal ra,b3a <exit> + } + chdir("/"); + c0: 00001517 auipc a0,0x1 + c4: 05850513 addi a0,a0,88 # 1118 <malloc+0x106> + c8: 2e3000ef jal ra,baa <chdir> + + while(1){ + iters++; + if((iters % 500) == 0) + cc: 00001997 auipc s3,0x1 + d0: 05c98993 addi s3,s3,92 # 1128 <malloc+0x116> + d4: c489 beqz s1,de <go+0x6a> + d6: 00001997 auipc s3,0x1 + da: 04a98993 addi s3,s3,74 # 1120 <malloc+0x10e> + iters++; + de: 4485 li s1,1 + int fd = -1; + e0: 5a7d li s4,-1 + e2: 00001917 auipc s2,0x1 + e6: 2f690913 addi s2,s2,758 # 13d8 <malloc+0x3c6> + ea: a035 j 116 <go+0xa2> + write(1, which_child?"B":"A", 1); + int what = rand() % 23; + if(what == 1){ + close(open("grindir/../a", O_CREATE|O_RDWR)); + ec: 20200593 li a1,514 + f0: 00001517 auipc a0,0x1 + f4: 04050513 addi a0,a0,64 # 1130 <malloc+0x11e> + f8: 283000ef jal ra,b7a <open> + fc: 267000ef jal ra,b62 <close> + iters++; + 100: 0485 addi s1,s1,1 + if((iters % 500) == 0) + 102: 1f400793 li a5,500 + 106: 02f4f7b3 remu a5,s1,a5 + 10a: e791 bnez a5,116 <go+0xa2> + write(1, which_child?"B":"A", 1); + 10c: 4605 li a2,1 + 10e: 85ce mv a1,s3 + 110: 4505 li a0,1 + 112: 249000ef jal ra,b5a <write> + int what = rand() % 23; + 116: f43ff0ef jal ra,58 <rand> + 11a: 47dd li a5,23 + 11c: 02f5653b remw a0,a0,a5 + if(what == 1){ + 120: 4785 li a5,1 + 122: fcf505e3 beq a0,a5,ec <go+0x78> + } else if(what == 2){ + 126: 47d9 li a5,22 + 128: fca7ece3 bltu a5,a0,100 <go+0x8c> + 12c: 050a slli a0,a0,0x2 + 12e: 954a add a0,a0,s2 + 130: 411c lw a5,0(a0) + 132: 97ca add a5,a5,s2 + 134: 8782 jr a5 + close(open("grindir/../grindir/../b", O_CREATE|O_RDWR)); + 136: 20200593 li a1,514 + 13a: 00001517 auipc a0,0x1 + 13e: 00650513 addi a0,a0,6 # 1140 <malloc+0x12e> + 142: 239000ef jal ra,b7a <open> + 146: 21d000ef jal ra,b62 <close> + 14a: bf5d j 100 <go+0x8c> + } else if(what == 3){ + unlink("grindir/../a"); + 14c: 00001517 auipc a0,0x1 + 150: fe450513 addi a0,a0,-28 # 1130 <malloc+0x11e> + 154: 237000ef jal ra,b8a <unlink> + 158: b765 j 100 <go+0x8c> + } else if(what == 4){ + if(chdir("grindir") != 0){ + 15a: 00001517 auipc a0,0x1 + 15e: f9650513 addi a0,a0,-106 # 10f0 <malloc+0xde> + 162: 249000ef jal ra,baa <chdir> + 166: ed11 bnez a0,182 <go+0x10e> + printf("grind: chdir grindir failed\n"); + exit(1); + } + unlink("../b"); + 168: 00001517 auipc a0,0x1 + 16c: ff050513 addi a0,a0,-16 # 1158 <malloc+0x146> + 170: 21b000ef jal ra,b8a <unlink> + chdir("/"); + 174: 00001517 auipc a0,0x1 + 178: fa450513 addi a0,a0,-92 # 1118 <malloc+0x106> + 17c: 22f000ef jal ra,baa <chdir> + 180: b741 j 100 <go+0x8c> + printf("grind: chdir grindir failed\n"); + 182: 00001517 auipc a0,0x1 + 186: f7650513 addi a0,a0,-138 # 10f8 <malloc+0xe6> + 18a: 5d5000ef jal ra,f5e <printf> + exit(1); + 18e: 4505 li a0,1 + 190: 1ab000ef jal ra,b3a <exit> + } else if(what == 5){ + close(fd); + 194: 8552 mv a0,s4 + 196: 1cd000ef jal ra,b62 <close> + fd = open("/grindir/../a", O_CREATE|O_RDWR); + 19a: 20200593 li a1,514 + 19e: 00001517 auipc a0,0x1 + 1a2: fc250513 addi a0,a0,-62 # 1160 <malloc+0x14e> + 1a6: 1d5000ef jal ra,b7a <open> + 1aa: 8a2a mv s4,a0 + 1ac: bf91 j 100 <go+0x8c> + } else if(what == 6){ + close(fd); + 1ae: 8552 mv a0,s4 + 1b0: 1b3000ef jal ra,b62 <close> + fd = open("/./grindir/./../b", O_CREATE|O_RDWR); + 1b4: 20200593 li a1,514 + 1b8: 00001517 auipc a0,0x1 + 1bc: fb850513 addi a0,a0,-72 # 1170 <malloc+0x15e> + 1c0: 1bb000ef jal ra,b7a <open> + 1c4: 8a2a mv s4,a0 + 1c6: bf2d j 100 <go+0x8c> + } else if(what == 7){ + write(fd, buf, sizeof(buf)); + 1c8: 3e700613 li a2,999 + 1cc: 00002597 auipc a1,0x2 + 1d0: e5458593 addi a1,a1,-428 # 2020 <buf.0> + 1d4: 8552 mv a0,s4 + 1d6: 185000ef jal ra,b5a <write> + 1da: b71d j 100 <go+0x8c> + } else if(what == 8){ + read(fd, buf, sizeof(buf)); + 1dc: 3e700613 li a2,999 + 1e0: 00002597 auipc a1,0x2 + 1e4: e4058593 addi a1,a1,-448 # 2020 <buf.0> + 1e8: 8552 mv a0,s4 + 1ea: 169000ef jal ra,b52 <read> + 1ee: bf09 j 100 <go+0x8c> + } else if(what == 9){ + mkdir("grindir/../a"); + 1f0: 00001517 auipc a0,0x1 + 1f4: f4050513 addi a0,a0,-192 # 1130 <malloc+0x11e> + 1f8: 1ab000ef jal ra,ba2 <mkdir> + close(open("a/../a/./a", O_CREATE|O_RDWR)); + 1fc: 20200593 li a1,514 + 200: 00001517 auipc a0,0x1 + 204: f8850513 addi a0,a0,-120 # 1188 <malloc+0x176> + 208: 173000ef jal ra,b7a <open> + 20c: 157000ef jal ra,b62 <close> + unlink("a/a"); + 210: 00001517 auipc a0,0x1 + 214: f8850513 addi a0,a0,-120 # 1198 <malloc+0x186> + 218: 173000ef jal ra,b8a <unlink> + 21c: b5d5 j 100 <go+0x8c> + } else if(what == 10){ + mkdir("/../b"); + 21e: 00001517 auipc a0,0x1 + 222: f8250513 addi a0,a0,-126 # 11a0 <malloc+0x18e> + 226: 17d000ef jal ra,ba2 <mkdir> + close(open("grindir/../b/b", O_CREATE|O_RDWR)); + 22a: 20200593 li a1,514 + 22e: 00001517 auipc a0,0x1 + 232: f7a50513 addi a0,a0,-134 # 11a8 <malloc+0x196> + 236: 145000ef jal ra,b7a <open> + 23a: 129000ef jal ra,b62 <close> + unlink("b/b"); + 23e: 00001517 auipc a0,0x1 + 242: f7a50513 addi a0,a0,-134 # 11b8 <malloc+0x1a6> + 246: 145000ef jal ra,b8a <unlink> + 24a: bd5d j 100 <go+0x8c> + } else if(what == 11){ + unlink("b"); + 24c: 00001517 auipc a0,0x1 + 250: f3450513 addi a0,a0,-204 # 1180 <malloc+0x16e> + 254: 137000ef jal ra,b8a <unlink> + link("../grindir/./../a", "../b"); + 258: 00001597 auipc a1,0x1 + 25c: f0058593 addi a1,a1,-256 # 1158 <malloc+0x146> + 260: 00001517 auipc a0,0x1 + 264: f6050513 addi a0,a0,-160 # 11c0 <malloc+0x1ae> + 268: 133000ef jal ra,b9a <link> + 26c: bd51 j 100 <go+0x8c> + } else if(what == 12){ + unlink("../grindir/../a"); + 26e: 00001517 auipc a0,0x1 + 272: f6a50513 addi a0,a0,-150 # 11d8 <malloc+0x1c6> + 276: 115000ef jal ra,b8a <unlink> + link(".././b", "/grindir/../a"); + 27a: 00001597 auipc a1,0x1 + 27e: ee658593 addi a1,a1,-282 # 1160 <malloc+0x14e> + 282: 00001517 auipc a0,0x1 + 286: f6650513 addi a0,a0,-154 # 11e8 <malloc+0x1d6> + 28a: 111000ef jal ra,b9a <link> + 28e: bd8d j 100 <go+0x8c> + } else if(what == 13){ + int pid = fork(); + 290: 0a3000ef jal ra,b32 <fork> + if(pid == 0){ + 294: c519 beqz a0,2a2 <go+0x22e> + exit(0); + } else if(pid < 0){ + 296: 00054863 bltz a0,2a6 <go+0x232> + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 29a: 4501 li a0,0 + 29c: 0a7000ef jal ra,b42 <wait> + 2a0: b585 j 100 <go+0x8c> + exit(0); + 2a2: 099000ef jal ra,b3a <exit> + printf("grind: fork failed\n"); + 2a6: 00001517 auipc a0,0x1 + 2aa: f4a50513 addi a0,a0,-182 # 11f0 <malloc+0x1de> + 2ae: 4b1000ef jal ra,f5e <printf> + exit(1); + 2b2: 4505 li a0,1 + 2b4: 087000ef jal ra,b3a <exit> + } else if(what == 14){ + int pid = fork(); + 2b8: 07b000ef jal ra,b32 <fork> + if(pid == 0){ + 2bc: c519 beqz a0,2ca <go+0x256> + fork(); + fork(); + exit(0); + } else if(pid < 0){ + 2be: 00054d63 bltz a0,2d8 <go+0x264> + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 2c2: 4501 li a0,0 + 2c4: 07f000ef jal ra,b42 <wait> + 2c8: bd25 j 100 <go+0x8c> + fork(); + 2ca: 069000ef jal ra,b32 <fork> + fork(); + 2ce: 065000ef jal ra,b32 <fork> + exit(0); + 2d2: 4501 li a0,0 + 2d4: 067000ef jal ra,b3a <exit> + printf("grind: fork failed\n"); + 2d8: 00001517 auipc a0,0x1 + 2dc: f1850513 addi a0,a0,-232 # 11f0 <malloc+0x1de> + 2e0: 47f000ef jal ra,f5e <printf> + exit(1); + 2e4: 4505 li a0,1 + 2e6: 055000ef jal ra,b3a <exit> + } else if(what == 15){ + sbrk(6011); + 2ea: 6505 lui a0,0x1 + 2ec: 77b50513 addi a0,a0,1915 # 177b <digits+0x33b> + 2f0: 0d3000ef jal ra,bc2 <sbrk> + 2f4: b531 j 100 <go+0x8c> + } else if(what == 16){ + if(sbrk(0) > break0) + 2f6: 4501 li a0,0 + 2f8: 0cb000ef jal ra,bc2 <sbrk> + 2fc: e0aaf2e3 bgeu s5,a0,100 <go+0x8c> + sbrk(-(sbrk(0) - break0)); + 300: 4501 li a0,0 + 302: 0c1000ef jal ra,bc2 <sbrk> + 306: 40aa853b subw a0,s5,a0 + 30a: 0b9000ef jal ra,bc2 <sbrk> + 30e: bbcd j 100 <go+0x8c> + } else if(what == 17){ + int pid = fork(); + 310: 023000ef jal ra,b32 <fork> + 314: 8b2a mv s6,a0 + if(pid == 0){ + 316: c10d beqz a0,338 <go+0x2c4> + close(open("a", O_CREATE|O_RDWR)); + exit(0); + } else if(pid < 0){ + 318: 02054d63 bltz a0,352 <go+0x2de> + printf("grind: fork failed\n"); + exit(1); + } + if(chdir("../grindir/..") != 0){ + 31c: 00001517 auipc a0,0x1 + 320: eec50513 addi a0,a0,-276 # 1208 <malloc+0x1f6> + 324: 087000ef jal ra,baa <chdir> + 328: ed15 bnez a0,364 <go+0x2f0> + printf("grind: chdir failed\n"); + exit(1); + } + kill(pid); + 32a: 855a mv a0,s6 + 32c: 03f000ef jal ra,b6a <kill> + wait(0); + 330: 4501 li a0,0 + 332: 011000ef jal ra,b42 <wait> + 336: b3e9 j 100 <go+0x8c> + close(open("a", O_CREATE|O_RDWR)); + 338: 20200593 li a1,514 + 33c: 00001517 auipc a0,0x1 + 340: e9450513 addi a0,a0,-364 # 11d0 <malloc+0x1be> + 344: 037000ef jal ra,b7a <open> + 348: 01b000ef jal ra,b62 <close> + exit(0); + 34c: 4501 li a0,0 + 34e: 7ec000ef jal ra,b3a <exit> + printf("grind: fork failed\n"); + 352: 00001517 auipc a0,0x1 + 356: e9e50513 addi a0,a0,-354 # 11f0 <malloc+0x1de> + 35a: 405000ef jal ra,f5e <printf> + exit(1); + 35e: 4505 li a0,1 + 360: 7da000ef jal ra,b3a <exit> + printf("grind: chdir failed\n"); + 364: 00001517 auipc a0,0x1 + 368: eb450513 addi a0,a0,-332 # 1218 <malloc+0x206> + 36c: 3f3000ef jal ra,f5e <printf> + exit(1); + 370: 4505 li a0,1 + 372: 7c8000ef jal ra,b3a <exit> + } else if(what == 18){ + int pid = fork(); + 376: 7bc000ef jal ra,b32 <fork> + if(pid == 0){ + 37a: c519 beqz a0,388 <go+0x314> + kill(getpid()); + exit(0); + } else if(pid < 0){ + 37c: 00054d63 bltz a0,396 <go+0x322> + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 380: 4501 li a0,0 + 382: 7c0000ef jal ra,b42 <wait> + 386: bbad j 100 <go+0x8c> + kill(getpid()); + 388: 033000ef jal ra,bba <getpid> + 38c: 7de000ef jal ra,b6a <kill> + exit(0); + 390: 4501 li a0,0 + 392: 7a8000ef jal ra,b3a <exit> + printf("grind: fork failed\n"); + 396: 00001517 auipc a0,0x1 + 39a: e5a50513 addi a0,a0,-422 # 11f0 <malloc+0x1de> + 39e: 3c1000ef jal ra,f5e <printf> + exit(1); + 3a2: 4505 li a0,1 + 3a4: 796000ef jal ra,b3a <exit> + } else if(what == 19){ + int fds[2]; + if(pipe(fds) < 0){ + 3a8: f9840513 addi a0,s0,-104 + 3ac: 79e000ef jal ra,b4a <pipe> + 3b0: 02054363 bltz a0,3d6 <go+0x362> + printf("grind: pipe failed\n"); + exit(1); + } + int pid = fork(); + 3b4: 77e000ef jal ra,b32 <fork> + if(pid == 0){ + 3b8: c905 beqz a0,3e8 <go+0x374> + printf("grind: pipe write failed\n"); + char c; + if(read(fds[0], &c, 1) != 1) + printf("grind: pipe read failed\n"); + exit(0); + } else if(pid < 0){ + 3ba: 08054263 bltz a0,43e <go+0x3ca> + printf("grind: fork failed\n"); + exit(1); + } + close(fds[0]); + 3be: f9842503 lw a0,-104(s0) + 3c2: 7a0000ef jal ra,b62 <close> + close(fds[1]); + 3c6: f9c42503 lw a0,-100(s0) + 3ca: 798000ef jal ra,b62 <close> + wait(0); + 3ce: 4501 li a0,0 + 3d0: 772000ef jal ra,b42 <wait> + 3d4: b335 j 100 <go+0x8c> + printf("grind: pipe failed\n"); + 3d6: 00001517 auipc a0,0x1 + 3da: e5a50513 addi a0,a0,-422 # 1230 <malloc+0x21e> + 3de: 381000ef jal ra,f5e <printf> + exit(1); + 3e2: 4505 li a0,1 + 3e4: 756000ef jal ra,b3a <exit> + fork(); + 3e8: 74a000ef jal ra,b32 <fork> + fork(); + 3ec: 746000ef jal ra,b32 <fork> + if(write(fds[1], "x", 1) != 1) + 3f0: 4605 li a2,1 + 3f2: 00001597 auipc a1,0x1 + 3f6: e5658593 addi a1,a1,-426 # 1248 <malloc+0x236> + 3fa: f9c42503 lw a0,-100(s0) + 3fe: 75c000ef jal ra,b5a <write> + 402: 4785 li a5,1 + 404: 00f51f63 bne a0,a5,422 <go+0x3ae> + if(read(fds[0], &c, 1) != 1) + 408: 4605 li a2,1 + 40a: f9040593 addi a1,s0,-112 + 40e: f9842503 lw a0,-104(s0) + 412: 740000ef jal ra,b52 <read> + 416: 4785 li a5,1 + 418: 00f51c63 bne a0,a5,430 <go+0x3bc> + exit(0); + 41c: 4501 li a0,0 + 41e: 71c000ef jal ra,b3a <exit> + printf("grind: pipe write failed\n"); + 422: 00001517 auipc a0,0x1 + 426: e2e50513 addi a0,a0,-466 # 1250 <malloc+0x23e> + 42a: 335000ef jal ra,f5e <printf> + 42e: bfe9 j 408 <go+0x394> + printf("grind: pipe read failed\n"); + 430: 00001517 auipc a0,0x1 + 434: e4050513 addi a0,a0,-448 # 1270 <malloc+0x25e> + 438: 327000ef jal ra,f5e <printf> + 43c: b7c5 j 41c <go+0x3a8> + printf("grind: fork failed\n"); + 43e: 00001517 auipc a0,0x1 + 442: db250513 addi a0,a0,-590 # 11f0 <malloc+0x1de> + 446: 319000ef jal ra,f5e <printf> + exit(1); + 44a: 4505 li a0,1 + 44c: 6ee000ef jal ra,b3a <exit> + } else if(what == 20){ + int pid = fork(); + 450: 6e2000ef jal ra,b32 <fork> + if(pid == 0){ + 454: c519 beqz a0,462 <go+0x3ee> + chdir("a"); + unlink("../a"); + fd = open("x", O_CREATE|O_RDWR); + unlink("x"); + exit(0); + } else if(pid < 0){ + 456: 04054f63 bltz a0,4b4 <go+0x440> + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 45a: 4501 li a0,0 + 45c: 6e6000ef jal ra,b42 <wait> + 460: b145 j 100 <go+0x8c> + unlink("a"); + 462: 00001517 auipc a0,0x1 + 466: d6e50513 addi a0,a0,-658 # 11d0 <malloc+0x1be> + 46a: 720000ef jal ra,b8a <unlink> + mkdir("a"); + 46e: 00001517 auipc a0,0x1 + 472: d6250513 addi a0,a0,-670 # 11d0 <malloc+0x1be> + 476: 72c000ef jal ra,ba2 <mkdir> + chdir("a"); + 47a: 00001517 auipc a0,0x1 + 47e: d5650513 addi a0,a0,-682 # 11d0 <malloc+0x1be> + 482: 728000ef jal ra,baa <chdir> + unlink("../a"); + 486: 00001517 auipc a0,0x1 + 48a: cb250513 addi a0,a0,-846 # 1138 <malloc+0x126> + 48e: 6fc000ef jal ra,b8a <unlink> + fd = open("x", O_CREATE|O_RDWR); + 492: 20200593 li a1,514 + 496: 00001517 auipc a0,0x1 + 49a: db250513 addi a0,a0,-590 # 1248 <malloc+0x236> + 49e: 6dc000ef jal ra,b7a <open> + unlink("x"); + 4a2: 00001517 auipc a0,0x1 + 4a6: da650513 addi a0,a0,-602 # 1248 <malloc+0x236> + 4aa: 6e0000ef jal ra,b8a <unlink> + exit(0); + 4ae: 4501 li a0,0 + 4b0: 68a000ef jal ra,b3a <exit> + printf("grind: fork failed\n"); + 4b4: 00001517 auipc a0,0x1 + 4b8: d3c50513 addi a0,a0,-708 # 11f0 <malloc+0x1de> + 4bc: 2a3000ef jal ra,f5e <printf> + exit(1); + 4c0: 4505 li a0,1 + 4c2: 678000ef jal ra,b3a <exit> + } else if(what == 21){ + unlink("c"); + 4c6: 00001517 auipc a0,0x1 + 4ca: dca50513 addi a0,a0,-566 # 1290 <malloc+0x27e> + 4ce: 6bc000ef jal ra,b8a <unlink> + // should always succeed. check that there are free i-nodes, + // file descriptors, blocks. + int fd1 = open("c", O_CREATE|O_RDWR); + 4d2: 20200593 li a1,514 + 4d6: 00001517 auipc a0,0x1 + 4da: dba50513 addi a0,a0,-582 # 1290 <malloc+0x27e> + 4de: 69c000ef jal ra,b7a <open> + 4e2: 8b2a mv s6,a0 + if(fd1 < 0){ + 4e4: 04054763 bltz a0,532 <go+0x4be> + printf("grind: create c failed\n"); + exit(1); + } + if(write(fd1, "x", 1) != 1){ + 4e8: 4605 li a2,1 + 4ea: 00001597 auipc a1,0x1 + 4ee: d5e58593 addi a1,a1,-674 # 1248 <malloc+0x236> + 4f2: 668000ef jal ra,b5a <write> + 4f6: 4785 li a5,1 + 4f8: 04f51663 bne a0,a5,544 <go+0x4d0> + printf("grind: write c failed\n"); + exit(1); + } + struct stat st; + if(fstat(fd1, &st) != 0){ + 4fc: f9840593 addi a1,s0,-104 + 500: 855a mv a0,s6 + 502: 690000ef jal ra,b92 <fstat> + 506: e921 bnez a0,556 <go+0x4e2> + printf("grind: fstat failed\n"); + exit(1); + } + if(st.size != 1){ + 508: fa843583 ld a1,-88(s0) + 50c: 4785 li a5,1 + 50e: 04f59d63 bne a1,a5,568 <go+0x4f4> + printf("grind: fstat reports wrong size %d\n", (int)st.size); + exit(1); + } + if(st.ino > 200){ + 512: f9c42583 lw a1,-100(s0) + 516: 0c800793 li a5,200 + 51a: 06b7e163 bltu a5,a1,57c <go+0x508> + printf("grind: fstat reports crazy i-number %d\n", st.ino); + exit(1); + } + close(fd1); + 51e: 855a mv a0,s6 + 520: 642000ef jal ra,b62 <close> + unlink("c"); + 524: 00001517 auipc a0,0x1 + 528: d6c50513 addi a0,a0,-660 # 1290 <malloc+0x27e> + 52c: 65e000ef jal ra,b8a <unlink> + 530: bec1 j 100 <go+0x8c> + printf("grind: create c failed\n"); + 532: 00001517 auipc a0,0x1 + 536: d6650513 addi a0,a0,-666 # 1298 <malloc+0x286> + 53a: 225000ef jal ra,f5e <printf> + exit(1); + 53e: 4505 li a0,1 + 540: 5fa000ef jal ra,b3a <exit> + printf("grind: write c failed\n"); + 544: 00001517 auipc a0,0x1 + 548: d6c50513 addi a0,a0,-660 # 12b0 <malloc+0x29e> + 54c: 213000ef jal ra,f5e <printf> + exit(1); + 550: 4505 li a0,1 + 552: 5e8000ef jal ra,b3a <exit> + printf("grind: fstat failed\n"); + 556: 00001517 auipc a0,0x1 + 55a: d7250513 addi a0,a0,-654 # 12c8 <malloc+0x2b6> + 55e: 201000ef jal ra,f5e <printf> + exit(1); + 562: 4505 li a0,1 + 564: 5d6000ef jal ra,b3a <exit> + printf("grind: fstat reports wrong size %d\n", (int)st.size); + 568: 2581 sext.w a1,a1 + 56a: 00001517 auipc a0,0x1 + 56e: d7650513 addi a0,a0,-650 # 12e0 <malloc+0x2ce> + 572: 1ed000ef jal ra,f5e <printf> + exit(1); + 576: 4505 li a0,1 + 578: 5c2000ef jal ra,b3a <exit> + printf("grind: fstat reports crazy i-number %d\n", st.ino); + 57c: 00001517 auipc a0,0x1 + 580: d8c50513 addi a0,a0,-628 # 1308 <malloc+0x2f6> + 584: 1db000ef jal ra,f5e <printf> + exit(1); + 588: 4505 li a0,1 + 58a: 5b0000ef jal ra,b3a <exit> + } else if(what == 22){ + // echo hi | cat + int aa[2], bb[2]; + if(pipe(aa) < 0){ + 58e: f8840513 addi a0,s0,-120 + 592: 5b8000ef jal ra,b4a <pipe> + 596: 0a054563 bltz a0,640 <go+0x5cc> + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + if(pipe(bb) < 0){ + 59a: f9040513 addi a0,s0,-112 + 59e: 5ac000ef jal ra,b4a <pipe> + 5a2: 0a054963 bltz a0,654 <go+0x5e0> + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + int pid1 = fork(); + 5a6: 58c000ef jal ra,b32 <fork> + if(pid1 == 0){ + 5aa: cd5d beqz a0,668 <go+0x5f4> + close(aa[1]); + char *args[3] = { "echo", "hi", 0 }; + exec("grindir/../echo", args); + fprintf(2, "grind: echo: not found\n"); + exit(2); + } else if(pid1 < 0){ + 5ac: 14054263 bltz a0,6f0 <go+0x67c> + fprintf(2, "grind: fork failed\n"); + exit(3); + } + int pid2 = fork(); + 5b0: 582000ef jal ra,b32 <fork> + if(pid2 == 0){ + 5b4: 14050863 beqz a0,704 <go+0x690> + close(bb[1]); + char *args[2] = { "cat", 0 }; + exec("/cat", args); + fprintf(2, "grind: cat: not found\n"); + exit(6); + } else if(pid2 < 0){ + 5b8: 1e054663 bltz a0,7a4 <go+0x730> + fprintf(2, "grind: fork failed\n"); + exit(7); + } + close(aa[0]); + 5bc: f8842503 lw a0,-120(s0) + 5c0: 5a2000ef jal ra,b62 <close> + close(aa[1]); + 5c4: f8c42503 lw a0,-116(s0) + 5c8: 59a000ef jal ra,b62 <close> + close(bb[1]); + 5cc: f9442503 lw a0,-108(s0) + 5d0: 592000ef jal ra,b62 <close> + char buf[4] = { 0, 0, 0, 0 }; + 5d4: f8042023 sw zero,-128(s0) + read(bb[0], buf+0, 1); + 5d8: 4605 li a2,1 + 5da: f8040593 addi a1,s0,-128 + 5de: f9042503 lw a0,-112(s0) + 5e2: 570000ef jal ra,b52 <read> + read(bb[0], buf+1, 1); + 5e6: 4605 li a2,1 + 5e8: f8140593 addi a1,s0,-127 + 5ec: f9042503 lw a0,-112(s0) + 5f0: 562000ef jal ra,b52 <read> + read(bb[0], buf+2, 1); + 5f4: 4605 li a2,1 + 5f6: f8240593 addi a1,s0,-126 + 5fa: f9042503 lw a0,-112(s0) + 5fe: 554000ef jal ra,b52 <read> + close(bb[0]); + 602: f9042503 lw a0,-112(s0) + 606: 55c000ef jal ra,b62 <close> + int st1, st2; + wait(&st1); + 60a: f8440513 addi a0,s0,-124 + 60e: 534000ef jal ra,b42 <wait> + wait(&st2); + 612: f9840513 addi a0,s0,-104 + 616: 52c000ef jal ra,b42 <wait> + if(st1 != 0 || st2 != 0 || strcmp(buf, "hi\n") != 0){ + 61a: f8442783 lw a5,-124(s0) + 61e: f9842b83 lw s7,-104(s0) + 622: 0177eb33 or s6,a5,s7 + 626: 180b1963 bnez s6,7b8 <go+0x744> + 62a: 00001597 auipc a1,0x1 + 62e: d7e58593 addi a1,a1,-642 # 13a8 <malloc+0x396> + 632: f8040513 addi a0,s0,-128 + 636: 2c8000ef jal ra,8fe <strcmp> + 63a: ac0503e3 beqz a0,100 <go+0x8c> + 63e: aab5 j 7ba <go+0x746> + fprintf(2, "grind: pipe failed\n"); + 640: 00001597 auipc a1,0x1 + 644: bf058593 addi a1,a1,-1040 # 1230 <malloc+0x21e> + 648: 4509 li a0,2 + 64a: 0eb000ef jal ra,f34 <fprintf> + exit(1); + 64e: 4505 li a0,1 + 650: 4ea000ef jal ra,b3a <exit> + fprintf(2, "grind: pipe failed\n"); + 654: 00001597 auipc a1,0x1 + 658: bdc58593 addi a1,a1,-1060 # 1230 <malloc+0x21e> + 65c: 4509 li a0,2 + 65e: 0d7000ef jal ra,f34 <fprintf> + exit(1); + 662: 4505 li a0,1 + 664: 4d6000ef jal ra,b3a <exit> + close(bb[0]); + 668: f9042503 lw a0,-112(s0) + 66c: 4f6000ef jal ra,b62 <close> + close(bb[1]); + 670: f9442503 lw a0,-108(s0) + 674: 4ee000ef jal ra,b62 <close> + close(aa[0]); + 678: f8842503 lw a0,-120(s0) + 67c: 4e6000ef jal ra,b62 <close> + close(1); + 680: 4505 li a0,1 + 682: 4e0000ef jal ra,b62 <close> + if(dup(aa[1]) != 1){ + 686: f8c42503 lw a0,-116(s0) + 68a: 528000ef jal ra,bb2 <dup> + 68e: 4785 li a5,1 + 690: 00f50c63 beq a0,a5,6a8 <go+0x634> + fprintf(2, "grind: dup failed\n"); + 694: 00001597 auipc a1,0x1 + 698: c9c58593 addi a1,a1,-868 # 1330 <malloc+0x31e> + 69c: 4509 li a0,2 + 69e: 097000ef jal ra,f34 <fprintf> + exit(1); + 6a2: 4505 li a0,1 + 6a4: 496000ef jal ra,b3a <exit> + close(aa[1]); + 6a8: f8c42503 lw a0,-116(s0) + 6ac: 4b6000ef jal ra,b62 <close> + char *args[3] = { "echo", "hi", 0 }; + 6b0: 00001797 auipc a5,0x1 + 6b4: c9878793 addi a5,a5,-872 # 1348 <malloc+0x336> + 6b8: f8f43c23 sd a5,-104(s0) + 6bc: 00001797 auipc a5,0x1 + 6c0: c9478793 addi a5,a5,-876 # 1350 <malloc+0x33e> + 6c4: faf43023 sd a5,-96(s0) + 6c8: fa043423 sd zero,-88(s0) + exec("grindir/../echo", args); + 6cc: f9840593 addi a1,s0,-104 + 6d0: 00001517 auipc a0,0x1 + 6d4: c8850513 addi a0,a0,-888 # 1358 <malloc+0x346> + 6d8: 49a000ef jal ra,b72 <exec> + fprintf(2, "grind: echo: not found\n"); + 6dc: 00001597 auipc a1,0x1 + 6e0: c8c58593 addi a1,a1,-884 # 1368 <malloc+0x356> + 6e4: 4509 li a0,2 + 6e6: 04f000ef jal ra,f34 <fprintf> + exit(2); + 6ea: 4509 li a0,2 + 6ec: 44e000ef jal ra,b3a <exit> + fprintf(2, "grind: fork failed\n"); + 6f0: 00001597 auipc a1,0x1 + 6f4: b0058593 addi a1,a1,-1280 # 11f0 <malloc+0x1de> + 6f8: 4509 li a0,2 + 6fa: 03b000ef jal ra,f34 <fprintf> + exit(3); + 6fe: 450d li a0,3 + 700: 43a000ef jal ra,b3a <exit> + close(aa[1]); + 704: f8c42503 lw a0,-116(s0) + 708: 45a000ef jal ra,b62 <close> + close(bb[0]); + 70c: f9042503 lw a0,-112(s0) + 710: 452000ef jal ra,b62 <close> + close(0); + 714: 4501 li a0,0 + 716: 44c000ef jal ra,b62 <close> + if(dup(aa[0]) != 0){ + 71a: f8842503 lw a0,-120(s0) + 71e: 494000ef jal ra,bb2 <dup> + 722: c919 beqz a0,738 <go+0x6c4> + fprintf(2, "grind: dup failed\n"); + 724: 00001597 auipc a1,0x1 + 728: c0c58593 addi a1,a1,-1012 # 1330 <malloc+0x31e> + 72c: 4509 li a0,2 + 72e: 007000ef jal ra,f34 <fprintf> + exit(4); + 732: 4511 li a0,4 + 734: 406000ef jal ra,b3a <exit> + close(aa[0]); + 738: f8842503 lw a0,-120(s0) + 73c: 426000ef jal ra,b62 <close> + close(1); + 740: 4505 li a0,1 + 742: 420000ef jal ra,b62 <close> + if(dup(bb[1]) != 1){ + 746: f9442503 lw a0,-108(s0) + 74a: 468000ef jal ra,bb2 <dup> + 74e: 4785 li a5,1 + 750: 00f50c63 beq a0,a5,768 <go+0x6f4> + fprintf(2, "grind: dup failed\n"); + 754: 00001597 auipc a1,0x1 + 758: bdc58593 addi a1,a1,-1060 # 1330 <malloc+0x31e> + 75c: 4509 li a0,2 + 75e: 7d6000ef jal ra,f34 <fprintf> + exit(5); + 762: 4515 li a0,5 + 764: 3d6000ef jal ra,b3a <exit> + close(bb[1]); + 768: f9442503 lw a0,-108(s0) + 76c: 3f6000ef jal ra,b62 <close> + char *args[2] = { "cat", 0 }; + 770: 00001797 auipc a5,0x1 + 774: c1078793 addi a5,a5,-1008 # 1380 <malloc+0x36e> + 778: f8f43c23 sd a5,-104(s0) + 77c: fa043023 sd zero,-96(s0) + exec("/cat", args); + 780: f9840593 addi a1,s0,-104 + 784: 00001517 auipc a0,0x1 + 788: c0450513 addi a0,a0,-1020 # 1388 <malloc+0x376> + 78c: 3e6000ef jal ra,b72 <exec> + fprintf(2, "grind: cat: not found\n"); + 790: 00001597 auipc a1,0x1 + 794: c0058593 addi a1,a1,-1024 # 1390 <malloc+0x37e> + 798: 4509 li a0,2 + 79a: 79a000ef jal ra,f34 <fprintf> + exit(6); + 79e: 4519 li a0,6 + 7a0: 39a000ef jal ra,b3a <exit> + fprintf(2, "grind: fork failed\n"); + 7a4: 00001597 auipc a1,0x1 + 7a8: a4c58593 addi a1,a1,-1460 # 11f0 <malloc+0x1de> + 7ac: 4509 li a0,2 + 7ae: 786000ef jal ra,f34 <fprintf> + exit(7); + 7b2: 451d li a0,7 + 7b4: 386000ef jal ra,b3a <exit> + if(st1 != 0 || st2 != 0 || strcmp(buf, "hi\n") != 0){ + 7b8: 8b3e mv s6,a5 + printf("grind: exec pipeline failed %d %d \"%s\"\n", st1, st2, buf); + 7ba: f8040693 addi a3,s0,-128 + 7be: 865e mv a2,s7 + 7c0: 85da mv a1,s6 + 7c2: 00001517 auipc a0,0x1 + 7c6: bee50513 addi a0,a0,-1042 # 13b0 <malloc+0x39e> + 7ca: 794000ef jal ra,f5e <printf> + exit(1); + 7ce: 4505 li a0,1 + 7d0: 36a000ef jal ra,b3a <exit> + +00000000000007d4 <iter>: + } +} + +void +iter() +{ + 7d4: 7179 addi sp,sp,-48 + 7d6: f406 sd ra,40(sp) + 7d8: f022 sd s0,32(sp) + 7da: ec26 sd s1,24(sp) + 7dc: e84a sd s2,16(sp) + 7de: 1800 addi s0,sp,48 + unlink("a"); + 7e0: 00001517 auipc a0,0x1 + 7e4: 9f050513 addi a0,a0,-1552 # 11d0 <malloc+0x1be> + 7e8: 3a2000ef jal ra,b8a <unlink> + unlink("b"); + 7ec: 00001517 auipc a0,0x1 + 7f0: 99450513 addi a0,a0,-1644 # 1180 <malloc+0x16e> + 7f4: 396000ef jal ra,b8a <unlink> + + int pid1 = fork(); + 7f8: 33a000ef jal ra,b32 <fork> + if(pid1 < 0){ + 7fc: 00054f63 bltz a0,81a <iter+0x46> + 800: 84aa mv s1,a0 + printf("grind: fork failed\n"); + exit(1); + } + if(pid1 == 0){ + 802: e50d bnez a0,82c <iter+0x58> + rand_next ^= 31; + 804: 00001717 auipc a4,0x1 + 808: 7fc70713 addi a4,a4,2044 # 2000 <rand_next> + 80c: 631c ld a5,0(a4) + 80e: 01f7c793 xori a5,a5,31 + 812: e31c sd a5,0(a4) + go(0); + 814: 4501 li a0,0 + 816: 85fff0ef jal ra,74 <go> + printf("grind: fork failed\n"); + 81a: 00001517 auipc a0,0x1 + 81e: 9d650513 addi a0,a0,-1578 # 11f0 <malloc+0x1de> + 822: 73c000ef jal ra,f5e <printf> + exit(1); + 826: 4505 li a0,1 + 828: 312000ef jal ra,b3a <exit> + exit(0); + } + + int pid2 = fork(); + 82c: 306000ef jal ra,b32 <fork> + 830: 892a mv s2,a0 + if(pid2 < 0){ + 832: 02054063 bltz a0,852 <iter+0x7e> + printf("grind: fork failed\n"); + exit(1); + } + if(pid2 == 0){ + 836: e51d bnez a0,864 <iter+0x90> + rand_next ^= 7177; + 838: 00001697 auipc a3,0x1 + 83c: 7c868693 addi a3,a3,1992 # 2000 <rand_next> + 840: 629c ld a5,0(a3) + 842: 6709 lui a4,0x2 + 844: c0970713 addi a4,a4,-1015 # 1c09 <digits+0x7c9> + 848: 8fb9 xor a5,a5,a4 + 84a: e29c sd a5,0(a3) + go(1); + 84c: 4505 li a0,1 + 84e: 827ff0ef jal ra,74 <go> + printf("grind: fork failed\n"); + 852: 00001517 auipc a0,0x1 + 856: 99e50513 addi a0,a0,-1634 # 11f0 <malloc+0x1de> + 85a: 704000ef jal ra,f5e <printf> + exit(1); + 85e: 4505 li a0,1 + 860: 2da000ef jal ra,b3a <exit> + exit(0); + } + + int st1 = -1; + 864: 57fd li a5,-1 + 866: fcf42e23 sw a5,-36(s0) + wait(&st1); + 86a: fdc40513 addi a0,s0,-36 + 86e: 2d4000ef jal ra,b42 <wait> + if(st1 != 0){ + 872: fdc42783 lw a5,-36(s0) + 876: eb99 bnez a5,88c <iter+0xb8> + kill(pid1); + kill(pid2); + } + int st2 = -1; + 878: 57fd li a5,-1 + 87a: fcf42c23 sw a5,-40(s0) + wait(&st2); + 87e: fd840513 addi a0,s0,-40 + 882: 2c0000ef jal ra,b42 <wait> + + exit(0); + 886: 4501 li a0,0 + 888: 2b2000ef jal ra,b3a <exit> + kill(pid1); + 88c: 8526 mv a0,s1 + 88e: 2dc000ef jal ra,b6a <kill> + kill(pid2); + 892: 854a mv a0,s2 + 894: 2d6000ef jal ra,b6a <kill> + 898: b7c5 j 878 <iter+0xa4> + +000000000000089a <main>: +} + +int +main() +{ + 89a: 1101 addi sp,sp,-32 + 89c: ec06 sd ra,24(sp) + 89e: e822 sd s0,16(sp) + 8a0: e426 sd s1,8(sp) + 8a2: 1000 addi s0,sp,32 + } + if(pid > 0){ + wait(0); + } + sleep(20); + rand_next += 1; + 8a4: 00001497 auipc s1,0x1 + 8a8: 75c48493 addi s1,s1,1884 # 2000 <rand_next> + 8ac: a809 j 8be <main+0x24> + iter(); + 8ae: f27ff0ef jal ra,7d4 <iter> + sleep(20); + 8b2: 4551 li a0,20 + 8b4: 316000ef jal ra,bca <sleep> + rand_next += 1; + 8b8: 609c ld a5,0(s1) + 8ba: 0785 addi a5,a5,1 + 8bc: e09c sd a5,0(s1) + int pid = fork(); + 8be: 274000ef jal ra,b32 <fork> + if(pid == 0){ + 8c2: d575 beqz a0,8ae <main+0x14> + if(pid > 0){ + 8c4: fea057e3 blez a0,8b2 <main+0x18> + wait(0); + 8c8: 4501 li a0,0 + 8ca: 278000ef jal ra,b42 <wait> + 8ce: b7d5 j 8b2 <main+0x18> + +00000000000008d0 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 8d0: 1141 addi sp,sp,-16 + 8d2: e406 sd ra,8(sp) + 8d4: e022 sd s0,0(sp) + 8d6: 0800 addi s0,sp,16 + extern int main(); + main(); + 8d8: fc3ff0ef jal ra,89a <main> + exit(0); + 8dc: 4501 li a0,0 + 8de: 25c000ef jal ra,b3a <exit> + +00000000000008e2 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 8e2: 1141 addi sp,sp,-16 + 8e4: e422 sd s0,8(sp) + 8e6: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 8e8: 87aa mv a5,a0 + 8ea: 0585 addi a1,a1,1 + 8ec: 0785 addi a5,a5,1 + 8ee: fff5c703 lbu a4,-1(a1) + 8f2: fee78fa3 sb a4,-1(a5) + 8f6: fb75 bnez a4,8ea <strcpy+0x8> + ; + return os; +} + 8f8: 6422 ld s0,8(sp) + 8fa: 0141 addi sp,sp,16 + 8fc: 8082 ret + +00000000000008fe <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 8fe: 1141 addi sp,sp,-16 + 900: e422 sd s0,8(sp) + 902: 0800 addi s0,sp,16 + while(*p && *p == *q) + 904: 00054783 lbu a5,0(a0) + 908: cb91 beqz a5,91c <strcmp+0x1e> + 90a: 0005c703 lbu a4,0(a1) + 90e: 00f71763 bne a4,a5,91c <strcmp+0x1e> + p++, q++; + 912: 0505 addi a0,a0,1 + 914: 0585 addi a1,a1,1 + while(*p && *p == *q) + 916: 00054783 lbu a5,0(a0) + 91a: fbe5 bnez a5,90a <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 91c: 0005c503 lbu a0,0(a1) +} + 920: 40a7853b subw a0,a5,a0 + 924: 6422 ld s0,8(sp) + 926: 0141 addi sp,sp,16 + 928: 8082 ret + +000000000000092a <strlen>: + +uint +strlen(const char *s) +{ + 92a: 1141 addi sp,sp,-16 + 92c: e422 sd s0,8(sp) + 92e: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 930: 00054783 lbu a5,0(a0) + 934: cf91 beqz a5,950 <strlen+0x26> + 936: 0505 addi a0,a0,1 + 938: 87aa mv a5,a0 + 93a: 4685 li a3,1 + 93c: 9e89 subw a3,a3,a0 + 93e: 00f6853b addw a0,a3,a5 + 942: 0785 addi a5,a5,1 + 944: fff7c703 lbu a4,-1(a5) + 948: fb7d bnez a4,93e <strlen+0x14> + ; + return n; +} + 94a: 6422 ld s0,8(sp) + 94c: 0141 addi sp,sp,16 + 94e: 8082 ret + for(n = 0; s[n]; n++) + 950: 4501 li a0,0 + 952: bfe5 j 94a <strlen+0x20> + +0000000000000954 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 954: 1141 addi sp,sp,-16 + 956: e422 sd s0,8(sp) + 958: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 95a: ca19 beqz a2,970 <memset+0x1c> + 95c: 87aa mv a5,a0 + 95e: 1602 slli a2,a2,0x20 + 960: 9201 srli a2,a2,0x20 + 962: 00a60733 add a4,a2,a0 + cdst[i] = c; + 966: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 96a: 0785 addi a5,a5,1 + 96c: fee79de3 bne a5,a4,966 <memset+0x12> + } + return dst; +} + 970: 6422 ld s0,8(sp) + 972: 0141 addi sp,sp,16 + 974: 8082 ret + +0000000000000976 <strchr>: + +char* +strchr(const char *s, char c) +{ + 976: 1141 addi sp,sp,-16 + 978: e422 sd s0,8(sp) + 97a: 0800 addi s0,sp,16 + for(; *s; s++) + 97c: 00054783 lbu a5,0(a0) + 980: cb99 beqz a5,996 <strchr+0x20> + if(*s == c) + 982: 00f58763 beq a1,a5,990 <strchr+0x1a> + for(; *s; s++) + 986: 0505 addi a0,a0,1 + 988: 00054783 lbu a5,0(a0) + 98c: fbfd bnez a5,982 <strchr+0xc> + return (char*)s; + return 0; + 98e: 4501 li a0,0 +} + 990: 6422 ld s0,8(sp) + 992: 0141 addi sp,sp,16 + 994: 8082 ret + return 0; + 996: 4501 li a0,0 + 998: bfe5 j 990 <strchr+0x1a> + +000000000000099a <gets>: + +char* +gets(char *buf, int max) +{ + 99a: 711d addi sp,sp,-96 + 99c: ec86 sd ra,88(sp) + 99e: e8a2 sd s0,80(sp) + 9a0: e4a6 sd s1,72(sp) + 9a2: e0ca sd s2,64(sp) + 9a4: fc4e sd s3,56(sp) + 9a6: f852 sd s4,48(sp) + 9a8: f456 sd s5,40(sp) + 9aa: f05a sd s6,32(sp) + 9ac: ec5e sd s7,24(sp) + 9ae: 1080 addi s0,sp,96 + 9b0: 8baa mv s7,a0 + 9b2: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 9b4: 892a mv s2,a0 + 9b6: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 9b8: 4aa9 li s5,10 + 9ba: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 9bc: 89a6 mv s3,s1 + 9be: 2485 addiw s1,s1,1 + 9c0: 0344d663 bge s1,s4,9ec <gets+0x52> + cc = read(0, &c, 1); + 9c4: 4605 li a2,1 + 9c6: faf40593 addi a1,s0,-81 + 9ca: 4501 li a0,0 + 9cc: 186000ef jal ra,b52 <read> + if(cc < 1) + 9d0: 00a05e63 blez a0,9ec <gets+0x52> + buf[i++] = c; + 9d4: faf44783 lbu a5,-81(s0) + 9d8: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 9dc: 01578763 beq a5,s5,9ea <gets+0x50> + 9e0: 0905 addi s2,s2,1 + 9e2: fd679de3 bne a5,s6,9bc <gets+0x22> + for(i=0; i+1 < max; ){ + 9e6: 89a6 mv s3,s1 + 9e8: a011 j 9ec <gets+0x52> + 9ea: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 9ec: 99de add s3,s3,s7 + 9ee: 00098023 sb zero,0(s3) + return buf; +} + 9f2: 855e mv a0,s7 + 9f4: 60e6 ld ra,88(sp) + 9f6: 6446 ld s0,80(sp) + 9f8: 64a6 ld s1,72(sp) + 9fa: 6906 ld s2,64(sp) + 9fc: 79e2 ld s3,56(sp) + 9fe: 7a42 ld s4,48(sp) + a00: 7aa2 ld s5,40(sp) + a02: 7b02 ld s6,32(sp) + a04: 6be2 ld s7,24(sp) + a06: 6125 addi sp,sp,96 + a08: 8082 ret + +0000000000000a0a <stat>: + +int +stat(const char *n, struct stat *st) +{ + a0a: 1101 addi sp,sp,-32 + a0c: ec06 sd ra,24(sp) + a0e: e822 sd s0,16(sp) + a10: e426 sd s1,8(sp) + a12: e04a sd s2,0(sp) + a14: 1000 addi s0,sp,32 + a16: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + a18: 4581 li a1,0 + a1a: 160000ef jal ra,b7a <open> + if(fd < 0) + a1e: 02054163 bltz a0,a40 <stat+0x36> + a22: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + a24: 85ca mv a1,s2 + a26: 16c000ef jal ra,b92 <fstat> + a2a: 892a mv s2,a0 + close(fd); + a2c: 8526 mv a0,s1 + a2e: 134000ef jal ra,b62 <close> + return r; +} + a32: 854a mv a0,s2 + a34: 60e2 ld ra,24(sp) + a36: 6442 ld s0,16(sp) + a38: 64a2 ld s1,8(sp) + a3a: 6902 ld s2,0(sp) + a3c: 6105 addi sp,sp,32 + a3e: 8082 ret + return -1; + a40: 597d li s2,-1 + a42: bfc5 j a32 <stat+0x28> + +0000000000000a44 <atoi>: + +int +atoi(const char *s) +{ + a44: 1141 addi sp,sp,-16 + a46: e422 sd s0,8(sp) + a48: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + a4a: 00054683 lbu a3,0(a0) + a4e: fd06879b addiw a5,a3,-48 + a52: 0ff7f793 zext.b a5,a5 + a56: 4625 li a2,9 + a58: 02f66863 bltu a2,a5,a88 <atoi+0x44> + a5c: 872a mv a4,a0 + n = 0; + a5e: 4501 li a0,0 + n = n*10 + *s++ - '0'; + a60: 0705 addi a4,a4,1 + a62: 0025179b slliw a5,a0,0x2 + a66: 9fa9 addw a5,a5,a0 + a68: 0017979b slliw a5,a5,0x1 + a6c: 9fb5 addw a5,a5,a3 + a6e: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + a72: 00074683 lbu a3,0(a4) + a76: fd06879b addiw a5,a3,-48 + a7a: 0ff7f793 zext.b a5,a5 + a7e: fef671e3 bgeu a2,a5,a60 <atoi+0x1c> + return n; +} + a82: 6422 ld s0,8(sp) + a84: 0141 addi sp,sp,16 + a86: 8082 ret + n = 0; + a88: 4501 li a0,0 + a8a: bfe5 j a82 <atoi+0x3e> + +0000000000000a8c <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + a8c: 1141 addi sp,sp,-16 + a8e: e422 sd s0,8(sp) + a90: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + a92: 02b57463 bgeu a0,a1,aba <memmove+0x2e> + while(n-- > 0) + a96: 00c05f63 blez a2,ab4 <memmove+0x28> + a9a: 1602 slli a2,a2,0x20 + a9c: 9201 srli a2,a2,0x20 + a9e: 00c507b3 add a5,a0,a2 + dst = vdst; + aa2: 872a mv a4,a0 + *dst++ = *src++; + aa4: 0585 addi a1,a1,1 + aa6: 0705 addi a4,a4,1 + aa8: fff5c683 lbu a3,-1(a1) + aac: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + ab0: fee79ae3 bne a5,a4,aa4 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + ab4: 6422 ld s0,8(sp) + ab6: 0141 addi sp,sp,16 + ab8: 8082 ret + dst += n; + aba: 00c50733 add a4,a0,a2 + src += n; + abe: 95b2 add a1,a1,a2 + while(n-- > 0) + ac0: fec05ae3 blez a2,ab4 <memmove+0x28> + ac4: fff6079b addiw a5,a2,-1 + ac8: 1782 slli a5,a5,0x20 + aca: 9381 srli a5,a5,0x20 + acc: fff7c793 not a5,a5 + ad0: 97ba add a5,a5,a4 + *--dst = *--src; + ad2: 15fd addi a1,a1,-1 + ad4: 177d addi a4,a4,-1 + ad6: 0005c683 lbu a3,0(a1) + ada: 00d70023 sb a3,0(a4) + while(n-- > 0) + ade: fee79ae3 bne a5,a4,ad2 <memmove+0x46> + ae2: bfc9 j ab4 <memmove+0x28> + +0000000000000ae4 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + ae4: 1141 addi sp,sp,-16 + ae6: e422 sd s0,8(sp) + ae8: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + aea: ca05 beqz a2,b1a <memcmp+0x36> + aec: fff6069b addiw a3,a2,-1 + af0: 1682 slli a3,a3,0x20 + af2: 9281 srli a3,a3,0x20 + af4: 0685 addi a3,a3,1 + af6: 96aa add a3,a3,a0 + if (*p1 != *p2) { + af8: 00054783 lbu a5,0(a0) + afc: 0005c703 lbu a4,0(a1) + b00: 00e79863 bne a5,a4,b10 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + b04: 0505 addi a0,a0,1 + p2++; + b06: 0585 addi a1,a1,1 + while (n-- > 0) { + b08: fed518e3 bne a0,a3,af8 <memcmp+0x14> + } + return 0; + b0c: 4501 li a0,0 + b0e: a019 j b14 <memcmp+0x30> + return *p1 - *p2; + b10: 40e7853b subw a0,a5,a4 +} + b14: 6422 ld s0,8(sp) + b16: 0141 addi sp,sp,16 + b18: 8082 ret + return 0; + b1a: 4501 li a0,0 + b1c: bfe5 j b14 <memcmp+0x30> + +0000000000000b1e <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + b1e: 1141 addi sp,sp,-16 + b20: e406 sd ra,8(sp) + b22: e022 sd s0,0(sp) + b24: 0800 addi s0,sp,16 + return memmove(dst, src, n); + b26: f67ff0ef jal ra,a8c <memmove> +} + b2a: 60a2 ld ra,8(sp) + b2c: 6402 ld s0,0(sp) + b2e: 0141 addi sp,sp,16 + b30: 8082 ret + +0000000000000b32 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + b32: 4885 li a7,1 + ecall + b34: 00000073 ecall + ret + b38: 8082 ret + +0000000000000b3a <exit>: +.global exit +exit: + li a7, SYS_exit + b3a: 4889 li a7,2 + ecall + b3c: 00000073 ecall + ret + b40: 8082 ret + +0000000000000b42 <wait>: +.global wait +wait: + li a7, SYS_wait + b42: 488d li a7,3 + ecall + b44: 00000073 ecall + ret + b48: 8082 ret + +0000000000000b4a <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + b4a: 4891 li a7,4 + ecall + b4c: 00000073 ecall + ret + b50: 8082 ret + +0000000000000b52 <read>: +.global read +read: + li a7, SYS_read + b52: 4895 li a7,5 + ecall + b54: 00000073 ecall + ret + b58: 8082 ret + +0000000000000b5a <write>: +.global write +write: + li a7, SYS_write + b5a: 48c1 li a7,16 + ecall + b5c: 00000073 ecall + ret + b60: 8082 ret + +0000000000000b62 <close>: +.global close +close: + li a7, SYS_close + b62: 48d5 li a7,21 + ecall + b64: 00000073 ecall + ret + b68: 8082 ret + +0000000000000b6a <kill>: +.global kill +kill: + li a7, SYS_kill + b6a: 4899 li a7,6 + ecall + b6c: 00000073 ecall + ret + b70: 8082 ret + +0000000000000b72 <exec>: +.global exec +exec: + li a7, SYS_exec + b72: 489d li a7,7 + ecall + b74: 00000073 ecall + ret + b78: 8082 ret + +0000000000000b7a <open>: +.global open +open: + li a7, SYS_open + b7a: 48bd li a7,15 + ecall + b7c: 00000073 ecall + ret + b80: 8082 ret + +0000000000000b82 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + b82: 48c5 li a7,17 + ecall + b84: 00000073 ecall + ret + b88: 8082 ret + +0000000000000b8a <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + b8a: 48c9 li a7,18 + ecall + b8c: 00000073 ecall + ret + b90: 8082 ret + +0000000000000b92 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + b92: 48a1 li a7,8 + ecall + b94: 00000073 ecall + ret + b98: 8082 ret + +0000000000000b9a <link>: +.global link +link: + li a7, SYS_link + b9a: 48cd li a7,19 + ecall + b9c: 00000073 ecall + ret + ba0: 8082 ret + +0000000000000ba2 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + ba2: 48d1 li a7,20 + ecall + ba4: 00000073 ecall + ret + ba8: 8082 ret + +0000000000000baa <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + baa: 48a5 li a7,9 + ecall + bac: 00000073 ecall + ret + bb0: 8082 ret + +0000000000000bb2 <dup>: +.global dup +dup: + li a7, SYS_dup + bb2: 48a9 li a7,10 + ecall + bb4: 00000073 ecall + ret + bb8: 8082 ret + +0000000000000bba <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + bba: 48ad li a7,11 + ecall + bbc: 00000073 ecall + ret + bc0: 8082 ret + +0000000000000bc2 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + bc2: 48b1 li a7,12 + ecall + bc4: 00000073 ecall + ret + bc8: 8082 ret + +0000000000000bca <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + bca: 48b5 li a7,13 + ecall + bcc: 00000073 ecall + ret + bd0: 8082 ret + +0000000000000bd2 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + bd2: 48b9 li a7,14 + ecall + bd4: 00000073 ecall + ret + bd8: 8082 ret + +0000000000000bda <trace>: +.global trace +trace: + li a7, SYS_trace + bda: 48d9 li a7,22 + ecall + bdc: 00000073 ecall + ret + be0: 8082 ret + +0000000000000be2 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + be2: 48dd li a7,23 + ecall + be4: 00000073 ecall + ret + be8: 8082 ret + +0000000000000bea <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + bea: 48e1 li a7,24 + ecall + bec: 00000073 ecall + ret + bf0: 8082 ret + +0000000000000bf2 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + bf2: 1101 addi sp,sp,-32 + bf4: ec06 sd ra,24(sp) + bf6: e822 sd s0,16(sp) + bf8: 1000 addi s0,sp,32 + bfa: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + bfe: 4605 li a2,1 + c00: fef40593 addi a1,s0,-17 + c04: f57ff0ef jal ra,b5a <write> +} + c08: 60e2 ld ra,24(sp) + c0a: 6442 ld s0,16(sp) + c0c: 6105 addi sp,sp,32 + c0e: 8082 ret + +0000000000000c10 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + c10: 7139 addi sp,sp,-64 + c12: fc06 sd ra,56(sp) + c14: f822 sd s0,48(sp) + c16: f426 sd s1,40(sp) + c18: f04a sd s2,32(sp) + c1a: ec4e sd s3,24(sp) + c1c: 0080 addi s0,sp,64 + c1e: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + c20: c299 beqz a3,c26 <printint+0x16> + c22: 0805c763 bltz a1,cb0 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + c26: 2581 sext.w a1,a1 + neg = 0; + c28: 4881 li a7,0 + c2a: fc040693 addi a3,s0,-64 + } + + i = 0; + c2e: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + c30: 2601 sext.w a2,a2 + c32: 00001517 auipc a0,0x1 + c36: 80e50513 addi a0,a0,-2034 # 1440 <digits> + c3a: 883a mv a6,a4 + c3c: 2705 addiw a4,a4,1 + c3e: 02c5f7bb remuw a5,a1,a2 + c42: 1782 slli a5,a5,0x20 + c44: 9381 srli a5,a5,0x20 + c46: 97aa add a5,a5,a0 + c48: 0007c783 lbu a5,0(a5) + c4c: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + c50: 0005879b sext.w a5,a1 + c54: 02c5d5bb divuw a1,a1,a2 + c58: 0685 addi a3,a3,1 + c5a: fec7f0e3 bgeu a5,a2,c3a <printint+0x2a> + if(neg) + c5e: 00088c63 beqz a7,c76 <printint+0x66> + buf[i++] = '-'; + c62: fd070793 addi a5,a4,-48 + c66: 00878733 add a4,a5,s0 + c6a: 02d00793 li a5,45 + c6e: fef70823 sb a5,-16(a4) + c72: 0028071b addiw a4,a6,2 + + while(--i >= 0) + c76: 02e05663 blez a4,ca2 <printint+0x92> + c7a: fc040793 addi a5,s0,-64 + c7e: 00e78933 add s2,a5,a4 + c82: fff78993 addi s3,a5,-1 + c86: 99ba add s3,s3,a4 + c88: 377d addiw a4,a4,-1 + c8a: 1702 slli a4,a4,0x20 + c8c: 9301 srli a4,a4,0x20 + c8e: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + c92: fff94583 lbu a1,-1(s2) + c96: 8526 mv a0,s1 + c98: f5bff0ef jal ra,bf2 <putc> + while(--i >= 0) + c9c: 197d addi s2,s2,-1 + c9e: ff391ae3 bne s2,s3,c92 <printint+0x82> +} + ca2: 70e2 ld ra,56(sp) + ca4: 7442 ld s0,48(sp) + ca6: 74a2 ld s1,40(sp) + ca8: 7902 ld s2,32(sp) + caa: 69e2 ld s3,24(sp) + cac: 6121 addi sp,sp,64 + cae: 8082 ret + x = -xx; + cb0: 40b005bb negw a1,a1 + neg = 1; + cb4: 4885 li a7,1 + x = -xx; + cb6: bf95 j c2a <printint+0x1a> + +0000000000000cb8 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + cb8: 7119 addi sp,sp,-128 + cba: fc86 sd ra,120(sp) + cbc: f8a2 sd s0,112(sp) + cbe: f4a6 sd s1,104(sp) + cc0: f0ca sd s2,96(sp) + cc2: ecce sd s3,88(sp) + cc4: e8d2 sd s4,80(sp) + cc6: e4d6 sd s5,72(sp) + cc8: e0da sd s6,64(sp) + cca: fc5e sd s7,56(sp) + ccc: f862 sd s8,48(sp) + cce: f466 sd s9,40(sp) + cd0: f06a sd s10,32(sp) + cd2: ec6e sd s11,24(sp) + cd4: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + cd6: 0005c903 lbu s2,0(a1) + cda: 22090e63 beqz s2,f16 <vprintf+0x25e> + cde: 8b2a mv s6,a0 + ce0: 8a2e mv s4,a1 + ce2: 8bb2 mv s7,a2 + state = 0; + ce4: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + ce6: 4481 li s1,0 + ce8: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + cea: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + cee: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + cf2: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + cf6: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + cfa: 00000c97 auipc s9,0x0 + cfe: 746c8c93 addi s9,s9,1862 # 1440 <digits> + d02: a005 j d22 <vprintf+0x6a> + putc(fd, c0); + d04: 85ca mv a1,s2 + d06: 855a mv a0,s6 + d08: eebff0ef jal ra,bf2 <putc> + d0c: a019 j d12 <vprintf+0x5a> + } else if(state == '%'){ + d0e: 03598263 beq s3,s5,d32 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + d12: 2485 addiw s1,s1,1 + d14: 8726 mv a4,s1 + d16: 009a07b3 add a5,s4,s1 + d1a: 0007c903 lbu s2,0(a5) + d1e: 1e090c63 beqz s2,f16 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + d22: 0009079b sext.w a5,s2 + if(state == 0){ + d26: fe0994e3 bnez s3,d0e <vprintf+0x56> + if(c0 == '%'){ + d2a: fd579de3 bne a5,s5,d04 <vprintf+0x4c> + state = '%'; + d2e: 89be mv s3,a5 + d30: b7cd j d12 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + d32: cfa5 beqz a5,daa <vprintf+0xf2> + d34: 00ea06b3 add a3,s4,a4 + d38: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + d3c: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + d3e: c681 beqz a3,d46 <vprintf+0x8e> + d40: 9752 add a4,a4,s4 + d42: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + d46: 03878a63 beq a5,s8,d7a <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + d4a: 05a78463 beq a5,s10,d92 <vprintf+0xda> + } else if(c0 == 'u'){ + d4e: 0db78763 beq a5,s11,e1c <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + d52: 07800713 li a4,120 + d56: 10e78963 beq a5,a4,e68 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + d5a: 07000713 li a4,112 + d5e: 12e78e63 beq a5,a4,e9a <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + d62: 07300713 li a4,115 + d66: 16e78b63 beq a5,a4,edc <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + d6a: 05579063 bne a5,s5,daa <vprintf+0xf2> + putc(fd, '%'); + d6e: 85d6 mv a1,s5 + d70: 855a mv a0,s6 + d72: e81ff0ef jal ra,bf2 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + d76: 4981 li s3,0 + d78: bf69 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + d7a: 008b8913 addi s2,s7,8 + d7e: 4685 li a3,1 + d80: 4629 li a2,10 + d82: 000ba583 lw a1,0(s7) + d86: 855a mv a0,s6 + d88: e89ff0ef jal ra,c10 <printint> + d8c: 8bca mv s7,s2 + state = 0; + d8e: 4981 li s3,0 + d90: b749 j d12 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + d92: 03868663 beq a3,s8,dbe <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + d96: 05a68163 beq a3,s10,dd8 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + d9a: 09b68d63 beq a3,s11,e34 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + d9e: 03a68f63 beq a3,s10,ddc <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + da2: 07800793 li a5,120 + da6: 0cf68d63 beq a3,a5,e80 <vprintf+0x1c8> + putc(fd, '%'); + daa: 85d6 mv a1,s5 + dac: 855a mv a0,s6 + dae: e45ff0ef jal ra,bf2 <putc> + putc(fd, c0); + db2: 85ca mv a1,s2 + db4: 855a mv a0,s6 + db6: e3dff0ef jal ra,bf2 <putc> + state = 0; + dba: 4981 li s3,0 + dbc: bf99 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + dbe: 008b8913 addi s2,s7,8 + dc2: 4685 li a3,1 + dc4: 4629 li a2,10 + dc6: 000ba583 lw a1,0(s7) + dca: 855a mv a0,s6 + dcc: e45ff0ef jal ra,c10 <printint> + i += 1; + dd0: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + dd2: 8bca mv s7,s2 + state = 0; + dd4: 4981 li s3,0 + i += 1; + dd6: bf35 j d12 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + dd8: 03860563 beq a2,s8,e02 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + ddc: 07b60963 beq a2,s11,e4e <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + de0: 07800793 li a5,120 + de4: fcf613e3 bne a2,a5,daa <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + de8: 008b8913 addi s2,s7,8 + dec: 4681 li a3,0 + dee: 4641 li a2,16 + df0: 000ba583 lw a1,0(s7) + df4: 855a mv a0,s6 + df6: e1bff0ef jal ra,c10 <printint> + i += 2; + dfa: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + dfc: 8bca mv s7,s2 + state = 0; + dfe: 4981 li s3,0 + i += 2; + e00: bf09 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + e02: 008b8913 addi s2,s7,8 + e06: 4685 li a3,1 + e08: 4629 li a2,10 + e0a: 000ba583 lw a1,0(s7) + e0e: 855a mv a0,s6 + e10: e01ff0ef jal ra,c10 <printint> + i += 2; + e14: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + e16: 8bca mv s7,s2 + state = 0; + e18: 4981 li s3,0 + i += 2; + e1a: bde5 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + e1c: 008b8913 addi s2,s7,8 + e20: 4681 li a3,0 + e22: 4629 li a2,10 + e24: 000ba583 lw a1,0(s7) + e28: 855a mv a0,s6 + e2a: de7ff0ef jal ra,c10 <printint> + e2e: 8bca mv s7,s2 + state = 0; + e30: 4981 li s3,0 + e32: b5c5 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + e34: 008b8913 addi s2,s7,8 + e38: 4681 li a3,0 + e3a: 4629 li a2,10 + e3c: 000ba583 lw a1,0(s7) + e40: 855a mv a0,s6 + e42: dcfff0ef jal ra,c10 <printint> + i += 1; + e46: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + e48: 8bca mv s7,s2 + state = 0; + e4a: 4981 li s3,0 + i += 1; + e4c: b5d9 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + e4e: 008b8913 addi s2,s7,8 + e52: 4681 li a3,0 + e54: 4629 li a2,10 + e56: 000ba583 lw a1,0(s7) + e5a: 855a mv a0,s6 + e5c: db5ff0ef jal ra,c10 <printint> + i += 2; + e60: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + e62: 8bca mv s7,s2 + state = 0; + e64: 4981 li s3,0 + i += 2; + e66: b575 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + e68: 008b8913 addi s2,s7,8 + e6c: 4681 li a3,0 + e6e: 4641 li a2,16 + e70: 000ba583 lw a1,0(s7) + e74: 855a mv a0,s6 + e76: d9bff0ef jal ra,c10 <printint> + e7a: 8bca mv s7,s2 + state = 0; + e7c: 4981 li s3,0 + e7e: bd51 j d12 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + e80: 008b8913 addi s2,s7,8 + e84: 4681 li a3,0 + e86: 4641 li a2,16 + e88: 000ba583 lw a1,0(s7) + e8c: 855a mv a0,s6 + e8e: d83ff0ef jal ra,c10 <printint> + i += 1; + e92: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + e94: 8bca mv s7,s2 + state = 0; + e96: 4981 li s3,0 + i += 1; + e98: bdad j d12 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + e9a: 008b8793 addi a5,s7,8 + e9e: f8f43423 sd a5,-120(s0) + ea2: 000bb983 ld s3,0(s7) + putc(fd, '0'); + ea6: 03000593 li a1,48 + eaa: 855a mv a0,s6 + eac: d47ff0ef jal ra,bf2 <putc> + putc(fd, 'x'); + eb0: 07800593 li a1,120 + eb4: 855a mv a0,s6 + eb6: d3dff0ef jal ra,bf2 <putc> + eba: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + ebc: 03c9d793 srli a5,s3,0x3c + ec0: 97e6 add a5,a5,s9 + ec2: 0007c583 lbu a1,0(a5) + ec6: 855a mv a0,s6 + ec8: d2bff0ef jal ra,bf2 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + ecc: 0992 slli s3,s3,0x4 + ece: 397d addiw s2,s2,-1 + ed0: fe0916e3 bnez s2,ebc <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + ed4: f8843b83 ld s7,-120(s0) + state = 0; + ed8: 4981 li s3,0 + eda: bd25 j d12 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + edc: 008b8993 addi s3,s7,8 + ee0: 000bb903 ld s2,0(s7) + ee4: 00090f63 beqz s2,f02 <vprintf+0x24a> + for(; *s; s++) + ee8: 00094583 lbu a1,0(s2) + eec: c195 beqz a1,f10 <vprintf+0x258> + putc(fd, *s); + eee: 855a mv a0,s6 + ef0: d03ff0ef jal ra,bf2 <putc> + for(; *s; s++) + ef4: 0905 addi s2,s2,1 + ef6: 00094583 lbu a1,0(s2) + efa: f9f5 bnez a1,eee <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + efc: 8bce mv s7,s3 + state = 0; + efe: 4981 li s3,0 + f00: bd09 j d12 <vprintf+0x5a> + s = "(null)"; + f02: 00000917 auipc s2,0x0 + f06: 53690913 addi s2,s2,1334 # 1438 <malloc+0x426> + for(; *s; s++) + f0a: 02800593 li a1,40 + f0e: b7c5 j eee <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + f10: 8bce mv s7,s3 + state = 0; + f12: 4981 li s3,0 + f14: bbfd j d12 <vprintf+0x5a> + } + } +} + f16: 70e6 ld ra,120(sp) + f18: 7446 ld s0,112(sp) + f1a: 74a6 ld s1,104(sp) + f1c: 7906 ld s2,96(sp) + f1e: 69e6 ld s3,88(sp) + f20: 6a46 ld s4,80(sp) + f22: 6aa6 ld s5,72(sp) + f24: 6b06 ld s6,64(sp) + f26: 7be2 ld s7,56(sp) + f28: 7c42 ld s8,48(sp) + f2a: 7ca2 ld s9,40(sp) + f2c: 7d02 ld s10,32(sp) + f2e: 6de2 ld s11,24(sp) + f30: 6109 addi sp,sp,128 + f32: 8082 ret + +0000000000000f34 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + f34: 715d addi sp,sp,-80 + f36: ec06 sd ra,24(sp) + f38: e822 sd s0,16(sp) + f3a: 1000 addi s0,sp,32 + f3c: e010 sd a2,0(s0) + f3e: e414 sd a3,8(s0) + f40: e818 sd a4,16(s0) + f42: ec1c sd a5,24(s0) + f44: 03043023 sd a6,32(s0) + f48: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + f4c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + f50: 8622 mv a2,s0 + f52: d67ff0ef jal ra,cb8 <vprintf> +} + f56: 60e2 ld ra,24(sp) + f58: 6442 ld s0,16(sp) + f5a: 6161 addi sp,sp,80 + f5c: 8082 ret + +0000000000000f5e <printf>: + +void +printf(const char *fmt, ...) +{ + f5e: 711d addi sp,sp,-96 + f60: ec06 sd ra,24(sp) + f62: e822 sd s0,16(sp) + f64: 1000 addi s0,sp,32 + f66: e40c sd a1,8(s0) + f68: e810 sd a2,16(s0) + f6a: ec14 sd a3,24(s0) + f6c: f018 sd a4,32(s0) + f6e: f41c sd a5,40(s0) + f70: 03043823 sd a6,48(s0) + f74: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + f78: 00840613 addi a2,s0,8 + f7c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + f80: 85aa mv a1,a0 + f82: 4505 li a0,1 + f84: d35ff0ef jal ra,cb8 <vprintf> +} + f88: 60e2 ld ra,24(sp) + f8a: 6442 ld s0,16(sp) + f8c: 6125 addi sp,sp,96 + f8e: 8082 ret + +0000000000000f90 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + f90: 1141 addi sp,sp,-16 + f92: e422 sd s0,8(sp) + f94: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + f96: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + f9a: 00001797 auipc a5,0x1 + f9e: 0767b783 ld a5,118(a5) # 2010 <freep> + fa2: a02d j fcc <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + fa4: 4618 lw a4,8(a2) + fa6: 9f2d addw a4,a4,a1 + fa8: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + fac: 6398 ld a4,0(a5) + fae: 6310 ld a2,0(a4) + fb0: a83d j fee <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + fb2: ff852703 lw a4,-8(a0) + fb6: 9f31 addw a4,a4,a2 + fb8: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + fba: ff053683 ld a3,-16(a0) + fbe: a091 j 1002 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + fc0: 6398 ld a4,0(a5) + fc2: 00e7e463 bltu a5,a4,fca <free+0x3a> + fc6: 00e6ea63 bltu a3,a4,fda <free+0x4a> +{ + fca: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + fcc: fed7fae3 bgeu a5,a3,fc0 <free+0x30> + fd0: 6398 ld a4,0(a5) + fd2: 00e6e463 bltu a3,a4,fda <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + fd6: fee7eae3 bltu a5,a4,fca <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + fda: ff852583 lw a1,-8(a0) + fde: 6390 ld a2,0(a5) + fe0: 02059813 slli a6,a1,0x20 + fe4: 01c85713 srli a4,a6,0x1c + fe8: 9736 add a4,a4,a3 + fea: fae60de3 beq a2,a4,fa4 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + fee: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + ff2: 4790 lw a2,8(a5) + ff4: 02061593 slli a1,a2,0x20 + ff8: 01c5d713 srli a4,a1,0x1c + ffc: 973e add a4,a4,a5 + ffe: fae68ae3 beq a3,a4,fb2 <free+0x22> + p->s.ptr = bp->s.ptr; + 1002: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 1004: 00001717 auipc a4,0x1 + 1008: 00f73623 sd a5,12(a4) # 2010 <freep> +} + 100c: 6422 ld s0,8(sp) + 100e: 0141 addi sp,sp,16 + 1010: 8082 ret + +0000000000001012 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 1012: 7139 addi sp,sp,-64 + 1014: fc06 sd ra,56(sp) + 1016: f822 sd s0,48(sp) + 1018: f426 sd s1,40(sp) + 101a: f04a sd s2,32(sp) + 101c: ec4e sd s3,24(sp) + 101e: e852 sd s4,16(sp) + 1020: e456 sd s5,8(sp) + 1022: e05a sd s6,0(sp) + 1024: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 1026: 02051493 slli s1,a0,0x20 + 102a: 9081 srli s1,s1,0x20 + 102c: 04bd addi s1,s1,15 + 102e: 8091 srli s1,s1,0x4 + 1030: 0014899b addiw s3,s1,1 + 1034: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 1036: 00001517 auipc a0,0x1 + 103a: fda53503 ld a0,-38(a0) # 2010 <freep> + 103e: c515 beqz a0,106a <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1040: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 1042: 4798 lw a4,8(a5) + 1044: 02977f63 bgeu a4,s1,1082 <malloc+0x70> + 1048: 8a4e mv s4,s3 + 104a: 0009871b sext.w a4,s3 + 104e: 6685 lui a3,0x1 + 1050: 00d77363 bgeu a4,a3,1056 <malloc+0x44> + 1054: 6a05 lui s4,0x1 + 1056: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 105a: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 105e: 00001917 auipc s2,0x1 + 1062: fb290913 addi s2,s2,-78 # 2010 <freep> + if(p == (char*)-1) + 1066: 5afd li s5,-1 + 1068: a885 j 10d8 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 106a: 00001797 auipc a5,0x1 + 106e: 39e78793 addi a5,a5,926 # 2408 <base> + 1072: 00001717 auipc a4,0x1 + 1076: f8f73f23 sd a5,-98(a4) # 2010 <freep> + 107a: e39c sd a5,0(a5) + base.s.size = 0; + 107c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 1080: b7e1 j 1048 <malloc+0x36> + if(p->s.size == nunits) + 1082: 02e48c63 beq s1,a4,10ba <malloc+0xa8> + p->s.size -= nunits; + 1086: 4137073b subw a4,a4,s3 + 108a: c798 sw a4,8(a5) + p += p->s.size; + 108c: 02071693 slli a3,a4,0x20 + 1090: 01c6d713 srli a4,a3,0x1c + 1094: 97ba add a5,a5,a4 + p->s.size = nunits; + 1096: 0137a423 sw s3,8(a5) + freep = prevp; + 109a: 00001717 auipc a4,0x1 + 109e: f6a73b23 sd a0,-138(a4) # 2010 <freep> + return (void*)(p + 1); + 10a2: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 10a6: 70e2 ld ra,56(sp) + 10a8: 7442 ld s0,48(sp) + 10aa: 74a2 ld s1,40(sp) + 10ac: 7902 ld s2,32(sp) + 10ae: 69e2 ld s3,24(sp) + 10b0: 6a42 ld s4,16(sp) + 10b2: 6aa2 ld s5,8(sp) + 10b4: 6b02 ld s6,0(sp) + 10b6: 6121 addi sp,sp,64 + 10b8: 8082 ret + prevp->s.ptr = p->s.ptr; + 10ba: 6398 ld a4,0(a5) + 10bc: e118 sd a4,0(a0) + 10be: bff1 j 109a <malloc+0x88> + hp->s.size = nu; + 10c0: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 10c4: 0541 addi a0,a0,16 + 10c6: ecbff0ef jal ra,f90 <free> + return freep; + 10ca: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 10ce: dd61 beqz a0,10a6 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 10d0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 10d2: 4798 lw a4,8(a5) + 10d4: fa9777e3 bgeu a4,s1,1082 <malloc+0x70> + if(p == freep) + 10d8: 00093703 ld a4,0(s2) + 10dc: 853e mv a0,a5 + 10de: fef719e3 bne a4,a5,10d0 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 10e2: 8552 mv a0,s4 + 10e4: adfff0ef jal ra,bc2 <sbrk> + if(p == (char*)-1) + 10e8: fd551ce3 bne a0,s5,10c0 <malloc+0xae> + return 0; + 10ec: 4501 li a0,0 + 10ee: bf65 j 10a6 <malloc+0x94> diff --git a/user/grind.d b/user/grind.d new file mode 100644 index 0000000000000000000000000000000000000000..0f4fec82018cf26a80ae49b56d78d396004d77a7 --- /dev/null +++ b/user/grind.d @@ -0,0 +1,3 @@ +user/grind.o: user/grind.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/param.h kernel/types.h kernel/stat.h user/user.h kernel/fs.h \ + kernel/fcntl.h kernel/syscall.h kernel/memlayout.h kernel/riscv.h diff --git a/user/grind.o b/user/grind.o new file mode 100644 index 0000000000000000000000000000000000000000..10a9a0498dcf6d7984a3ed048a43b8bd31bea6d9 Binary files /dev/null and b/user/grind.o differ diff --git a/user/grind.sym b/user/grind.sym new file mode 100644 index 0000000000000000000000000000000000000000..b268a36745b55cb4aa3b06fe3a996cefbcf98651 --- /dev/null +++ b/user/grind.sym @@ -0,0 +1,72 @@ +0000000000000000 .text +00000000000010f0 .rodata +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 grind.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000bf2 putc +0000000000000c10 printint +0000000000001440 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002408 base +00000000000008e2 strcpy +0000000000000f5e printf +0000000000000000 do_rand +0000000000000a8c memmove +0000000000000b82 mknod +0000000000000bda trace +000000000000099a gets +0000000000000bba getpid +0000000000000b1e memcpy +0000000000001012 malloc +0000000000000bca sleep +0000000000000be2 mycall +0000000000000b4a pipe +0000000000000074 go +00000000000007d4 iter +0000000000000b5a write +0000000000000b92 fstat +0000000000000f34 fprintf +0000000000000b6a kill +0000000000000cb8 vprintf +0000000000000baa chdir +0000000000000b72 exec +0000000000000b42 wait +0000000000000058 rand +0000000000000b52 read +0000000000000b8a unlink +0000000000000ae4 memcmp +0000000000000b32 fork +0000000000002000 rand_next +0000000000000bc2 sbrk +0000000000000bd2 uptime +0000000000000954 memset +000000000000089a main +0000000000000bea GSCinfo +00000000000008fe strcmp +0000000000000bb2 dup +0000000000000a0a stat +0000000000000b9a link +0000000000000b3a exit +00000000000008d0 start +0000000000000a44 atoi +000000000000092a strlen +0000000000000b7a open +0000000000000976 strchr +0000000000000ba2 mkdir +0000000000000b62 close +0000000000000f90 free diff --git a/user/init.asm b/user/init.asm new file mode 100644 index 0000000000000000000000000000000000000000..03817273ebf47871aecdd2371b8619fb750f2256 --- /dev/null +++ b/user/init.asm @@ -0,0 +1,1527 @@ + +user/_init: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: + +char *argv[] = { "sh", 0 }; + +int +main(void) +{ + 0: 1101 addi sp,sp,-32 + 2: ec06 sd ra,24(sp) + 4: e822 sd s0,16(sp) + 6: e426 sd s1,8(sp) + 8: e04a sd s2,0(sp) + a: 1000 addi s0,sp,32 + int pid, wpid; + + if(open("console", O_RDWR) < 0){ + c: 4589 li a1,2 + e: 00001517 auipc a0,0x1 + 12: 8d250513 addi a0,a0,-1838 # 8e0 <malloc+0xe2> + 16: 350000ef jal ra,366 <open> + 1a: 04054563 bltz a0,64 <main+0x64> + mknod("console", CONSOLE, 0); + open("console", O_RDWR); + } + dup(0); // stdout + 1e: 4501 li a0,0 + 20: 37e000ef jal ra,39e <dup> + dup(0); // stderr + 24: 4501 li a0,0 + 26: 378000ef jal ra,39e <dup> + + for(;;){ + printf("init: starting sh\n"); + 2a: 00001917 auipc s2,0x1 + 2e: 8be90913 addi s2,s2,-1858 # 8e8 <malloc+0xea> + 32: 854a mv a0,s2 + 34: 716000ef jal ra,74a <printf> + pid = fork(); + 38: 2e6000ef jal ra,31e <fork> + 3c: 84aa mv s1,a0 + if(pid < 0){ + 3e: 04054363 bltz a0,84 <main+0x84> + printf("init: fork failed\n"); + exit(1); + } + if(pid == 0){ + 42: c931 beqz a0,96 <main+0x96> + } + + for(;;){ + // this call to wait() returns if the shell exits, + // or if a parentless process exits. + wpid = wait((int *) 0); + 44: 4501 li a0,0 + 46: 2e8000ef jal ra,32e <wait> + if(wpid == pid){ + 4a: fea484e3 beq s1,a0,32 <main+0x32> + // the shell exited; restart it. + break; + } else if(wpid < 0){ + 4e: fe055be3 bgez a0,44 <main+0x44> + printf("init: wait returned an error\n"); + 52: 00001517 auipc a0,0x1 + 56: 8e650513 addi a0,a0,-1818 # 938 <malloc+0x13a> + 5a: 6f0000ef jal ra,74a <printf> + exit(1); + 5e: 4505 li a0,1 + 60: 2c6000ef jal ra,326 <exit> + mknod("console", CONSOLE, 0); + 64: 4601 li a2,0 + 66: 4585 li a1,1 + 68: 00001517 auipc a0,0x1 + 6c: 87850513 addi a0,a0,-1928 # 8e0 <malloc+0xe2> + 70: 2fe000ef jal ra,36e <mknod> + open("console", O_RDWR); + 74: 4589 li a1,2 + 76: 00001517 auipc a0,0x1 + 7a: 86a50513 addi a0,a0,-1942 # 8e0 <malloc+0xe2> + 7e: 2e8000ef jal ra,366 <open> + 82: bf71 j 1e <main+0x1e> + printf("init: fork failed\n"); + 84: 00001517 auipc a0,0x1 + 88: 87c50513 addi a0,a0,-1924 # 900 <malloc+0x102> + 8c: 6be000ef jal ra,74a <printf> + exit(1); + 90: 4505 li a0,1 + 92: 294000ef jal ra,326 <exit> + exec("sh", argv); + 96: 00001597 auipc a1,0x1 + 9a: f6a58593 addi a1,a1,-150 # 1000 <argv> + 9e: 00001517 auipc a0,0x1 + a2: 87a50513 addi a0,a0,-1926 # 918 <malloc+0x11a> + a6: 2b8000ef jal ra,35e <exec> + printf("init: exec sh failed\n"); + aa: 00001517 auipc a0,0x1 + ae: 87650513 addi a0,a0,-1930 # 920 <malloc+0x122> + b2: 698000ef jal ra,74a <printf> + exit(1); + b6: 4505 li a0,1 + b8: 26e000ef jal ra,326 <exit> + +00000000000000bc <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + bc: 1141 addi sp,sp,-16 + be: e406 sd ra,8(sp) + c0: e022 sd s0,0(sp) + c2: 0800 addi s0,sp,16 + extern int main(); + main(); + c4: f3dff0ef jal ra,0 <main> + exit(0); + c8: 4501 li a0,0 + ca: 25c000ef jal ra,326 <exit> + +00000000000000ce <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + ce: 1141 addi sp,sp,-16 + d0: e422 sd s0,8(sp) + d2: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + d4: 87aa mv a5,a0 + d6: 0585 addi a1,a1,1 + d8: 0785 addi a5,a5,1 + da: fff5c703 lbu a4,-1(a1) + de: fee78fa3 sb a4,-1(a5) + e2: fb75 bnez a4,d6 <strcpy+0x8> + ; + return os; +} + e4: 6422 ld s0,8(sp) + e6: 0141 addi sp,sp,16 + e8: 8082 ret + +00000000000000ea <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + ea: 1141 addi sp,sp,-16 + ec: e422 sd s0,8(sp) + ee: 0800 addi s0,sp,16 + while(*p && *p == *q) + f0: 00054783 lbu a5,0(a0) + f4: cb91 beqz a5,108 <strcmp+0x1e> + f6: 0005c703 lbu a4,0(a1) + fa: 00f71763 bne a4,a5,108 <strcmp+0x1e> + p++, q++; + fe: 0505 addi a0,a0,1 + 100: 0585 addi a1,a1,1 + while(*p && *p == *q) + 102: 00054783 lbu a5,0(a0) + 106: fbe5 bnez a5,f6 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 108: 0005c503 lbu a0,0(a1) +} + 10c: 40a7853b subw a0,a5,a0 + 110: 6422 ld s0,8(sp) + 112: 0141 addi sp,sp,16 + 114: 8082 ret + +0000000000000116 <strlen>: + +uint +strlen(const char *s) +{ + 116: 1141 addi sp,sp,-16 + 118: e422 sd s0,8(sp) + 11a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 11c: 00054783 lbu a5,0(a0) + 120: cf91 beqz a5,13c <strlen+0x26> + 122: 0505 addi a0,a0,1 + 124: 87aa mv a5,a0 + 126: 4685 li a3,1 + 128: 9e89 subw a3,a3,a0 + 12a: 00f6853b addw a0,a3,a5 + 12e: 0785 addi a5,a5,1 + 130: fff7c703 lbu a4,-1(a5) + 134: fb7d bnez a4,12a <strlen+0x14> + ; + return n; +} + 136: 6422 ld s0,8(sp) + 138: 0141 addi sp,sp,16 + 13a: 8082 ret + for(n = 0; s[n]; n++) + 13c: 4501 li a0,0 + 13e: bfe5 j 136 <strlen+0x20> + +0000000000000140 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 140: 1141 addi sp,sp,-16 + 142: e422 sd s0,8(sp) + 144: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 146: ca19 beqz a2,15c <memset+0x1c> + 148: 87aa mv a5,a0 + 14a: 1602 slli a2,a2,0x20 + 14c: 9201 srli a2,a2,0x20 + 14e: 00a60733 add a4,a2,a0 + cdst[i] = c; + 152: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 156: 0785 addi a5,a5,1 + 158: fee79de3 bne a5,a4,152 <memset+0x12> + } + return dst; +} + 15c: 6422 ld s0,8(sp) + 15e: 0141 addi sp,sp,16 + 160: 8082 ret + +0000000000000162 <strchr>: + +char* +strchr(const char *s, char c) +{ + 162: 1141 addi sp,sp,-16 + 164: e422 sd s0,8(sp) + 166: 0800 addi s0,sp,16 + for(; *s; s++) + 168: 00054783 lbu a5,0(a0) + 16c: cb99 beqz a5,182 <strchr+0x20> + if(*s == c) + 16e: 00f58763 beq a1,a5,17c <strchr+0x1a> + for(; *s; s++) + 172: 0505 addi a0,a0,1 + 174: 00054783 lbu a5,0(a0) + 178: fbfd bnez a5,16e <strchr+0xc> + return (char*)s; + return 0; + 17a: 4501 li a0,0 +} + 17c: 6422 ld s0,8(sp) + 17e: 0141 addi sp,sp,16 + 180: 8082 ret + return 0; + 182: 4501 li a0,0 + 184: bfe5 j 17c <strchr+0x1a> + +0000000000000186 <gets>: + +char* +gets(char *buf, int max) +{ + 186: 711d addi sp,sp,-96 + 188: ec86 sd ra,88(sp) + 18a: e8a2 sd s0,80(sp) + 18c: e4a6 sd s1,72(sp) + 18e: e0ca sd s2,64(sp) + 190: fc4e sd s3,56(sp) + 192: f852 sd s4,48(sp) + 194: f456 sd s5,40(sp) + 196: f05a sd s6,32(sp) + 198: ec5e sd s7,24(sp) + 19a: 1080 addi s0,sp,96 + 19c: 8baa mv s7,a0 + 19e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1a0: 892a mv s2,a0 + 1a2: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1a4: 4aa9 li s5,10 + 1a6: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1a8: 89a6 mv s3,s1 + 1aa: 2485 addiw s1,s1,1 + 1ac: 0344d663 bge s1,s4,1d8 <gets+0x52> + cc = read(0, &c, 1); + 1b0: 4605 li a2,1 + 1b2: faf40593 addi a1,s0,-81 + 1b6: 4501 li a0,0 + 1b8: 186000ef jal ra,33e <read> + if(cc < 1) + 1bc: 00a05e63 blez a0,1d8 <gets+0x52> + buf[i++] = c; + 1c0: faf44783 lbu a5,-81(s0) + 1c4: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1c8: 01578763 beq a5,s5,1d6 <gets+0x50> + 1cc: 0905 addi s2,s2,1 + 1ce: fd679de3 bne a5,s6,1a8 <gets+0x22> + for(i=0; i+1 < max; ){ + 1d2: 89a6 mv s3,s1 + 1d4: a011 j 1d8 <gets+0x52> + 1d6: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1d8: 99de add s3,s3,s7 + 1da: 00098023 sb zero,0(s3) + return buf; +} + 1de: 855e mv a0,s7 + 1e0: 60e6 ld ra,88(sp) + 1e2: 6446 ld s0,80(sp) + 1e4: 64a6 ld s1,72(sp) + 1e6: 6906 ld s2,64(sp) + 1e8: 79e2 ld s3,56(sp) + 1ea: 7a42 ld s4,48(sp) + 1ec: 7aa2 ld s5,40(sp) + 1ee: 7b02 ld s6,32(sp) + 1f0: 6be2 ld s7,24(sp) + 1f2: 6125 addi sp,sp,96 + 1f4: 8082 ret + +00000000000001f6 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 1f6: 1101 addi sp,sp,-32 + 1f8: ec06 sd ra,24(sp) + 1fa: e822 sd s0,16(sp) + 1fc: e426 sd s1,8(sp) + 1fe: e04a sd s2,0(sp) + 200: 1000 addi s0,sp,32 + 202: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 204: 4581 li a1,0 + 206: 160000ef jal ra,366 <open> + if(fd < 0) + 20a: 02054163 bltz a0,22c <stat+0x36> + 20e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 210: 85ca mv a1,s2 + 212: 16c000ef jal ra,37e <fstat> + 216: 892a mv s2,a0 + close(fd); + 218: 8526 mv a0,s1 + 21a: 134000ef jal ra,34e <close> + return r; +} + 21e: 854a mv a0,s2 + 220: 60e2 ld ra,24(sp) + 222: 6442 ld s0,16(sp) + 224: 64a2 ld s1,8(sp) + 226: 6902 ld s2,0(sp) + 228: 6105 addi sp,sp,32 + 22a: 8082 ret + return -1; + 22c: 597d li s2,-1 + 22e: bfc5 j 21e <stat+0x28> + +0000000000000230 <atoi>: + +int +atoi(const char *s) +{ + 230: 1141 addi sp,sp,-16 + 232: e422 sd s0,8(sp) + 234: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 236: 00054683 lbu a3,0(a0) + 23a: fd06879b addiw a5,a3,-48 + 23e: 0ff7f793 zext.b a5,a5 + 242: 4625 li a2,9 + 244: 02f66863 bltu a2,a5,274 <atoi+0x44> + 248: 872a mv a4,a0 + n = 0; + 24a: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 24c: 0705 addi a4,a4,1 + 24e: 0025179b slliw a5,a0,0x2 + 252: 9fa9 addw a5,a5,a0 + 254: 0017979b slliw a5,a5,0x1 + 258: 9fb5 addw a5,a5,a3 + 25a: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 25e: 00074683 lbu a3,0(a4) + 262: fd06879b addiw a5,a3,-48 + 266: 0ff7f793 zext.b a5,a5 + 26a: fef671e3 bgeu a2,a5,24c <atoi+0x1c> + return n; +} + 26e: 6422 ld s0,8(sp) + 270: 0141 addi sp,sp,16 + 272: 8082 ret + n = 0; + 274: 4501 li a0,0 + 276: bfe5 j 26e <atoi+0x3e> + +0000000000000278 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 27e: 02b57463 bgeu a0,a1,2a6 <memmove+0x2e> + while(n-- > 0) + 282: 00c05f63 blez a2,2a0 <memmove+0x28> + 286: 1602 slli a2,a2,0x20 + 288: 9201 srli a2,a2,0x20 + 28a: 00c507b3 add a5,a0,a2 + dst = vdst; + 28e: 872a mv a4,a0 + *dst++ = *src++; + 290: 0585 addi a1,a1,1 + 292: 0705 addi a4,a4,1 + 294: fff5c683 lbu a3,-1(a1) + 298: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 29c: fee79ae3 bne a5,a4,290 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2a0: 6422 ld s0,8(sp) + 2a2: 0141 addi sp,sp,16 + 2a4: 8082 ret + dst += n; + 2a6: 00c50733 add a4,a0,a2 + src += n; + 2aa: 95b2 add a1,a1,a2 + while(n-- > 0) + 2ac: fec05ae3 blez a2,2a0 <memmove+0x28> + 2b0: fff6079b addiw a5,a2,-1 + 2b4: 1782 slli a5,a5,0x20 + 2b6: 9381 srli a5,a5,0x20 + 2b8: fff7c793 not a5,a5 + 2bc: 97ba add a5,a5,a4 + *--dst = *--src; + 2be: 15fd addi a1,a1,-1 + 2c0: 177d addi a4,a4,-1 + 2c2: 0005c683 lbu a3,0(a1) + 2c6: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2ca: fee79ae3 bne a5,a4,2be <memmove+0x46> + 2ce: bfc9 j 2a0 <memmove+0x28> + +00000000000002d0 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2d0: 1141 addi sp,sp,-16 + 2d2: e422 sd s0,8(sp) + 2d4: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2d6: ca05 beqz a2,306 <memcmp+0x36> + 2d8: fff6069b addiw a3,a2,-1 + 2dc: 1682 slli a3,a3,0x20 + 2de: 9281 srli a3,a3,0x20 + 2e0: 0685 addi a3,a3,1 + 2e2: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2e4: 00054783 lbu a5,0(a0) + 2e8: 0005c703 lbu a4,0(a1) + 2ec: 00e79863 bne a5,a4,2fc <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 2f0: 0505 addi a0,a0,1 + p2++; + 2f2: 0585 addi a1,a1,1 + while (n-- > 0) { + 2f4: fed518e3 bne a0,a3,2e4 <memcmp+0x14> + } + return 0; + 2f8: 4501 li a0,0 + 2fa: a019 j 300 <memcmp+0x30> + return *p1 - *p2; + 2fc: 40e7853b subw a0,a5,a4 +} + 300: 6422 ld s0,8(sp) + 302: 0141 addi sp,sp,16 + 304: 8082 ret + return 0; + 306: 4501 li a0,0 + 308: bfe5 j 300 <memcmp+0x30> + +000000000000030a <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 30a: 1141 addi sp,sp,-16 + 30c: e406 sd ra,8(sp) + 30e: e022 sd s0,0(sp) + 310: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 312: f67ff0ef jal ra,278 <memmove> +} + 316: 60a2 ld ra,8(sp) + 318: 6402 ld s0,0(sp) + 31a: 0141 addi sp,sp,16 + 31c: 8082 ret + +000000000000031e <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 31e: 4885 li a7,1 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 <exit>: +.global exit +exit: + li a7, SYS_exit + 326: 4889 li a7,2 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e <wait>: +.global wait +wait: + li a7, SYS_wait + 32e: 488d li a7,3 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 336: 4891 li a7,4 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e <read>: +.global read +read: + li a7, SYS_read + 33e: 4895 li a7,5 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 <write>: +.global write +write: + li a7, SYS_write + 346: 48c1 li a7,16 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e <close>: +.global close +close: + li a7, SYS_close + 34e: 48d5 li a7,21 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 <kill>: +.global kill +kill: + li a7, SYS_kill + 356: 4899 li a7,6 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e <exec>: +.global exec +exec: + li a7, SYS_exec + 35e: 489d li a7,7 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 <open>: +.global open +open: + li a7, SYS_open + 366: 48bd li a7,15 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 36e: 48c5 li a7,17 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 376: 48c9 li a7,18 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 37e: 48a1 li a7,8 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 <link>: +.global link +link: + li a7, SYS_link + 386: 48cd li a7,19 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 38e: 48d1 li a7,20 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 396: 48a5 li a7,9 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e <dup>: +.global dup +dup: + li a7, SYS_dup + 39e: 48a9 li a7,10 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 3a6: 48ad li a7,11 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 3ae: 48b1 li a7,12 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 3b6: 48b5 li a7,13 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 3be: 48b9 li a7,14 + ecall + 3c0: 00000073 ecall + ret + 3c4: 8082 ret + +00000000000003c6 <trace>: +.global trace +trace: + li a7, SYS_trace + 3c6: 48d9 li a7,22 + ecall + 3c8: 00000073 ecall + ret + 3cc: 8082 ret + +00000000000003ce <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 3ce: 48dd li a7,23 + ecall + 3d0: 00000073 ecall + ret + 3d4: 8082 ret + +00000000000003d6 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 3d6: 48e1 li a7,24 + ecall + 3d8: 00000073 ecall + ret + 3dc: 8082 ret + +00000000000003de <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3de: 1101 addi sp,sp,-32 + 3e0: ec06 sd ra,24(sp) + 3e2: e822 sd s0,16(sp) + 3e4: 1000 addi s0,sp,32 + 3e6: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3ea: 4605 li a2,1 + 3ec: fef40593 addi a1,s0,-17 + 3f0: f57ff0ef jal ra,346 <write> +} + 3f4: 60e2 ld ra,24(sp) + 3f6: 6442 ld s0,16(sp) + 3f8: 6105 addi sp,sp,32 + 3fa: 8082 ret + +00000000000003fc <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3fc: 7139 addi sp,sp,-64 + 3fe: fc06 sd ra,56(sp) + 400: f822 sd s0,48(sp) + 402: f426 sd s1,40(sp) + 404: f04a sd s2,32(sp) + 406: ec4e sd s3,24(sp) + 408: 0080 addi s0,sp,64 + 40a: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 40c: c299 beqz a3,412 <printint+0x16> + 40e: 0805c763 bltz a1,49c <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 412: 2581 sext.w a1,a1 + neg = 0; + 414: 4881 li a7,0 + 416: fc040693 addi a3,s0,-64 + } + + i = 0; + 41a: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 41c: 2601 sext.w a2,a2 + 41e: 00000517 auipc a0,0x0 + 422: 54250513 addi a0,a0,1346 # 960 <digits> + 426: 883a mv a6,a4 + 428: 2705 addiw a4,a4,1 + 42a: 02c5f7bb remuw a5,a1,a2 + 42e: 1782 slli a5,a5,0x20 + 430: 9381 srli a5,a5,0x20 + 432: 97aa add a5,a5,a0 + 434: 0007c783 lbu a5,0(a5) + 438: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 43c: 0005879b sext.w a5,a1 + 440: 02c5d5bb divuw a1,a1,a2 + 444: 0685 addi a3,a3,1 + 446: fec7f0e3 bgeu a5,a2,426 <printint+0x2a> + if(neg) + 44a: 00088c63 beqz a7,462 <printint+0x66> + buf[i++] = '-'; + 44e: fd070793 addi a5,a4,-48 + 452: 00878733 add a4,a5,s0 + 456: 02d00793 li a5,45 + 45a: fef70823 sb a5,-16(a4) + 45e: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 462: 02e05663 blez a4,48e <printint+0x92> + 466: fc040793 addi a5,s0,-64 + 46a: 00e78933 add s2,a5,a4 + 46e: fff78993 addi s3,a5,-1 + 472: 99ba add s3,s3,a4 + 474: 377d addiw a4,a4,-1 + 476: 1702 slli a4,a4,0x20 + 478: 9301 srli a4,a4,0x20 + 47a: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 47e: fff94583 lbu a1,-1(s2) + 482: 8526 mv a0,s1 + 484: f5bff0ef jal ra,3de <putc> + while(--i >= 0) + 488: 197d addi s2,s2,-1 + 48a: ff391ae3 bne s2,s3,47e <printint+0x82> +} + 48e: 70e2 ld ra,56(sp) + 490: 7442 ld s0,48(sp) + 492: 74a2 ld s1,40(sp) + 494: 7902 ld s2,32(sp) + 496: 69e2 ld s3,24(sp) + 498: 6121 addi sp,sp,64 + 49a: 8082 ret + x = -xx; + 49c: 40b005bb negw a1,a1 + neg = 1; + 4a0: 4885 li a7,1 + x = -xx; + 4a2: bf95 j 416 <printint+0x1a> + +00000000000004a4 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4a4: 7119 addi sp,sp,-128 + 4a6: fc86 sd ra,120(sp) + 4a8: f8a2 sd s0,112(sp) + 4aa: f4a6 sd s1,104(sp) + 4ac: f0ca sd s2,96(sp) + 4ae: ecce sd s3,88(sp) + 4b0: e8d2 sd s4,80(sp) + 4b2: e4d6 sd s5,72(sp) + 4b4: e0da sd s6,64(sp) + 4b6: fc5e sd s7,56(sp) + 4b8: f862 sd s8,48(sp) + 4ba: f466 sd s9,40(sp) + 4bc: f06a sd s10,32(sp) + 4be: ec6e sd s11,24(sp) + 4c0: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4c2: 0005c903 lbu s2,0(a1) + 4c6: 22090e63 beqz s2,702 <vprintf+0x25e> + 4ca: 8b2a mv s6,a0 + 4cc: 8a2e mv s4,a1 + 4ce: 8bb2 mv s7,a2 + state = 0; + 4d0: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4d2: 4481 li s1,0 + 4d4: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4d6: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4da: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4de: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4e2: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 4e6: 00000c97 auipc s9,0x0 + 4ea: 47ac8c93 addi s9,s9,1146 # 960 <digits> + 4ee: a005 j 50e <vprintf+0x6a> + putc(fd, c0); + 4f0: 85ca mv a1,s2 + 4f2: 855a mv a0,s6 + 4f4: eebff0ef jal ra,3de <putc> + 4f8: a019 j 4fe <vprintf+0x5a> + } else if(state == '%'){ + 4fa: 03598263 beq s3,s5,51e <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4fe: 2485 addiw s1,s1,1 + 500: 8726 mv a4,s1 + 502: 009a07b3 add a5,s4,s1 + 506: 0007c903 lbu s2,0(a5) + 50a: 1e090c63 beqz s2,702 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 50e: 0009079b sext.w a5,s2 + if(state == 0){ + 512: fe0994e3 bnez s3,4fa <vprintf+0x56> + if(c0 == '%'){ + 516: fd579de3 bne a5,s5,4f0 <vprintf+0x4c> + state = '%'; + 51a: 89be mv s3,a5 + 51c: b7cd j 4fe <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 51e: cfa5 beqz a5,596 <vprintf+0xf2> + 520: 00ea06b3 add a3,s4,a4 + 524: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 528: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 52a: c681 beqz a3,532 <vprintf+0x8e> + 52c: 9752 add a4,a4,s4 + 52e: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 532: 03878a63 beq a5,s8,566 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 536: 05a78463 beq a5,s10,57e <vprintf+0xda> + } else if(c0 == 'u'){ + 53a: 0db78763 beq a5,s11,608 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 53e: 07800713 li a4,120 + 542: 10e78963 beq a5,a4,654 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 546: 07000713 li a4,112 + 54a: 12e78e63 beq a5,a4,686 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 54e: 07300713 li a4,115 + 552: 16e78b63 beq a5,a4,6c8 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 556: 05579063 bne a5,s5,596 <vprintf+0xf2> + putc(fd, '%'); + 55a: 85d6 mv a1,s5 + 55c: 855a mv a0,s6 + 55e: e81ff0ef jal ra,3de <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 562: 4981 li s3,0 + 564: bf69 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 566: 008b8913 addi s2,s7,8 + 56a: 4685 li a3,1 + 56c: 4629 li a2,10 + 56e: 000ba583 lw a1,0(s7) + 572: 855a mv a0,s6 + 574: e89ff0ef jal ra,3fc <printint> + 578: 8bca mv s7,s2 + state = 0; + 57a: 4981 li s3,0 + 57c: b749 j 4fe <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 57e: 03868663 beq a3,s8,5aa <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 582: 05a68163 beq a3,s10,5c4 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 586: 09b68d63 beq a3,s11,620 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 58a: 03a68f63 beq a3,s10,5c8 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 58e: 07800793 li a5,120 + 592: 0cf68d63 beq a3,a5,66c <vprintf+0x1c8> + putc(fd, '%'); + 596: 85d6 mv a1,s5 + 598: 855a mv a0,s6 + 59a: e45ff0ef jal ra,3de <putc> + putc(fd, c0); + 59e: 85ca mv a1,s2 + 5a0: 855a mv a0,s6 + 5a2: e3dff0ef jal ra,3de <putc> + state = 0; + 5a6: 4981 li s3,0 + 5a8: bf99 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5aa: 008b8913 addi s2,s7,8 + 5ae: 4685 li a3,1 + 5b0: 4629 li a2,10 + 5b2: 000ba583 lw a1,0(s7) + 5b6: 855a mv a0,s6 + 5b8: e45ff0ef jal ra,3fc <printint> + i += 1; + 5bc: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5be: 8bca mv s7,s2 + state = 0; + 5c0: 4981 li s3,0 + i += 1; + 5c2: bf35 j 4fe <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5c4: 03860563 beq a2,s8,5ee <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5c8: 07b60963 beq a2,s11,63a <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5cc: 07800793 li a5,120 + 5d0: fcf613e3 bne a2,a5,596 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 5d4: 008b8913 addi s2,s7,8 + 5d8: 4681 li a3,0 + 5da: 4641 li a2,16 + 5dc: 000ba583 lw a1,0(s7) + 5e0: 855a mv a0,s6 + 5e2: e1bff0ef jal ra,3fc <printint> + i += 2; + 5e6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5e8: 8bca mv s7,s2 + state = 0; + 5ea: 4981 li s3,0 + i += 2; + 5ec: bf09 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5ee: 008b8913 addi s2,s7,8 + 5f2: 4685 li a3,1 + 5f4: 4629 li a2,10 + 5f6: 000ba583 lw a1,0(s7) + 5fa: 855a mv a0,s6 + 5fc: e01ff0ef jal ra,3fc <printint> + i += 2; + 600: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 602: 8bca mv s7,s2 + state = 0; + 604: 4981 li s3,0 + i += 2; + 606: bde5 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 608: 008b8913 addi s2,s7,8 + 60c: 4681 li a3,0 + 60e: 4629 li a2,10 + 610: 000ba583 lw a1,0(s7) + 614: 855a mv a0,s6 + 616: de7ff0ef jal ra,3fc <printint> + 61a: 8bca mv s7,s2 + state = 0; + 61c: 4981 li s3,0 + 61e: b5c5 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4629 li a2,10 + 628: 000ba583 lw a1,0(s7) + 62c: 855a mv a0,s6 + 62e: dcfff0ef jal ra,3fc <printint> + i += 1; + 632: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 634: 8bca mv s7,s2 + state = 0; + 636: 4981 li s3,0 + i += 1; + 638: b5d9 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 63a: 008b8913 addi s2,s7,8 + 63e: 4681 li a3,0 + 640: 4629 li a2,10 + 642: 000ba583 lw a1,0(s7) + 646: 855a mv a0,s6 + 648: db5ff0ef jal ra,3fc <printint> + i += 2; + 64c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 64e: 8bca mv s7,s2 + state = 0; + 650: 4981 li s3,0 + i += 2; + 652: b575 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 654: 008b8913 addi s2,s7,8 + 658: 4681 li a3,0 + 65a: 4641 li a2,16 + 65c: 000ba583 lw a1,0(s7) + 660: 855a mv a0,s6 + 662: d9bff0ef jal ra,3fc <printint> + 666: 8bca mv s7,s2 + state = 0; + 668: 4981 li s3,0 + 66a: bd51 j 4fe <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 66c: 008b8913 addi s2,s7,8 + 670: 4681 li a3,0 + 672: 4641 li a2,16 + 674: 000ba583 lw a1,0(s7) + 678: 855a mv a0,s6 + 67a: d83ff0ef jal ra,3fc <printint> + i += 1; + 67e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 680: 8bca mv s7,s2 + state = 0; + 682: 4981 li s3,0 + i += 1; + 684: bdad j 4fe <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 686: 008b8793 addi a5,s7,8 + 68a: f8f43423 sd a5,-120(s0) + 68e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 692: 03000593 li a1,48 + 696: 855a mv a0,s6 + 698: d47ff0ef jal ra,3de <putc> + putc(fd, 'x'); + 69c: 07800593 li a1,120 + 6a0: 855a mv a0,s6 + 6a2: d3dff0ef jal ra,3de <putc> + 6a6: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6a8: 03c9d793 srli a5,s3,0x3c + 6ac: 97e6 add a5,a5,s9 + 6ae: 0007c583 lbu a1,0(a5) + 6b2: 855a mv a0,s6 + 6b4: d2bff0ef jal ra,3de <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6b8: 0992 slli s3,s3,0x4 + 6ba: 397d addiw s2,s2,-1 + 6bc: fe0916e3 bnez s2,6a8 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 6c0: f8843b83 ld s7,-120(s0) + state = 0; + 6c4: 4981 li s3,0 + 6c6: bd25 j 4fe <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 6c8: 008b8993 addi s3,s7,8 + 6cc: 000bb903 ld s2,0(s7) + 6d0: 00090f63 beqz s2,6ee <vprintf+0x24a> + for(; *s; s++) + 6d4: 00094583 lbu a1,0(s2) + 6d8: c195 beqz a1,6fc <vprintf+0x258> + putc(fd, *s); + 6da: 855a mv a0,s6 + 6dc: d03ff0ef jal ra,3de <putc> + for(; *s; s++) + 6e0: 0905 addi s2,s2,1 + 6e2: 00094583 lbu a1,0(s2) + 6e6: f9f5 bnez a1,6da <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6e8: 8bce mv s7,s3 + state = 0; + 6ea: 4981 li s3,0 + 6ec: bd09 j 4fe <vprintf+0x5a> + s = "(null)"; + 6ee: 00000917 auipc s2,0x0 + 6f2: 26a90913 addi s2,s2,618 # 958 <malloc+0x15a> + for(; *s; s++) + 6f6: 02800593 li a1,40 + 6fa: b7c5 j 6da <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6fc: 8bce mv s7,s3 + state = 0; + 6fe: 4981 li s3,0 + 700: bbfd j 4fe <vprintf+0x5a> + } + } +} + 702: 70e6 ld ra,120(sp) + 704: 7446 ld s0,112(sp) + 706: 74a6 ld s1,104(sp) + 708: 7906 ld s2,96(sp) + 70a: 69e6 ld s3,88(sp) + 70c: 6a46 ld s4,80(sp) + 70e: 6aa6 ld s5,72(sp) + 710: 6b06 ld s6,64(sp) + 712: 7be2 ld s7,56(sp) + 714: 7c42 ld s8,48(sp) + 716: 7ca2 ld s9,40(sp) + 718: 7d02 ld s10,32(sp) + 71a: 6de2 ld s11,24(sp) + 71c: 6109 addi sp,sp,128 + 71e: 8082 ret + +0000000000000720 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 720: 715d addi sp,sp,-80 + 722: ec06 sd ra,24(sp) + 724: e822 sd s0,16(sp) + 726: 1000 addi s0,sp,32 + 728: e010 sd a2,0(s0) + 72a: e414 sd a3,8(s0) + 72c: e818 sd a4,16(s0) + 72e: ec1c sd a5,24(s0) + 730: 03043023 sd a6,32(s0) + 734: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 738: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 73c: 8622 mv a2,s0 + 73e: d67ff0ef jal ra,4a4 <vprintf> +} + 742: 60e2 ld ra,24(sp) + 744: 6442 ld s0,16(sp) + 746: 6161 addi sp,sp,80 + 748: 8082 ret + +000000000000074a <printf>: + +void +printf(const char *fmt, ...) +{ + 74a: 711d addi sp,sp,-96 + 74c: ec06 sd ra,24(sp) + 74e: e822 sd s0,16(sp) + 750: 1000 addi s0,sp,32 + 752: e40c sd a1,8(s0) + 754: e810 sd a2,16(s0) + 756: ec14 sd a3,24(s0) + 758: f018 sd a4,32(s0) + 75a: f41c sd a5,40(s0) + 75c: 03043823 sd a6,48(s0) + 760: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 764: 00840613 addi a2,s0,8 + 768: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 76c: 85aa mv a1,a0 + 76e: 4505 li a0,1 + 770: d35ff0ef jal ra,4a4 <vprintf> +} + 774: 60e2 ld ra,24(sp) + 776: 6442 ld s0,16(sp) + 778: 6125 addi sp,sp,96 + 77a: 8082 ret + +000000000000077c <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 77c: 1141 addi sp,sp,-16 + 77e: e422 sd s0,8(sp) + 780: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 782: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 786: 00001797 auipc a5,0x1 + 78a: 88a7b783 ld a5,-1910(a5) # 1010 <freep> + 78e: a02d j 7b8 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 790: 4618 lw a4,8(a2) + 792: 9f2d addw a4,a4,a1 + 794: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 798: 6398 ld a4,0(a5) + 79a: 6310 ld a2,0(a4) + 79c: a83d j 7da <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 79e: ff852703 lw a4,-8(a0) + 7a2: 9f31 addw a4,a4,a2 + 7a4: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7a6: ff053683 ld a3,-16(a0) + 7aa: a091 j 7ee <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7ac: 6398 ld a4,0(a5) + 7ae: 00e7e463 bltu a5,a4,7b6 <free+0x3a> + 7b2: 00e6ea63 bltu a3,a4,7c6 <free+0x4a> +{ + 7b6: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7b8: fed7fae3 bgeu a5,a3,7ac <free+0x30> + 7bc: 6398 ld a4,0(a5) + 7be: 00e6e463 bltu a3,a4,7c6 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7c2: fee7eae3 bltu a5,a4,7b6 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 7c6: ff852583 lw a1,-8(a0) + 7ca: 6390 ld a2,0(a5) + 7cc: 02059813 slli a6,a1,0x20 + 7d0: 01c85713 srli a4,a6,0x1c + 7d4: 9736 add a4,a4,a3 + 7d6: fae60de3 beq a2,a4,790 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 7da: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7de: 4790 lw a2,8(a5) + 7e0: 02061593 slli a1,a2,0x20 + 7e4: 01c5d713 srli a4,a1,0x1c + 7e8: 973e add a4,a4,a5 + 7ea: fae68ae3 beq a3,a4,79e <free+0x22> + p->s.ptr = bp->s.ptr; + 7ee: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7f0: 00001717 auipc a4,0x1 + 7f4: 82f73023 sd a5,-2016(a4) # 1010 <freep> +} + 7f8: 6422 ld s0,8(sp) + 7fa: 0141 addi sp,sp,16 + 7fc: 8082 ret + +00000000000007fe <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7fe: 7139 addi sp,sp,-64 + 800: fc06 sd ra,56(sp) + 802: f822 sd s0,48(sp) + 804: f426 sd s1,40(sp) + 806: f04a sd s2,32(sp) + 808: ec4e sd s3,24(sp) + 80a: e852 sd s4,16(sp) + 80c: e456 sd s5,8(sp) + 80e: e05a sd s6,0(sp) + 810: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 812: 02051493 slli s1,a0,0x20 + 816: 9081 srli s1,s1,0x20 + 818: 04bd addi s1,s1,15 + 81a: 8091 srli s1,s1,0x4 + 81c: 0014899b addiw s3,s1,1 + 820: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 822: 00000517 auipc a0,0x0 + 826: 7ee53503 ld a0,2030(a0) # 1010 <freep> + 82a: c515 beqz a0,856 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 82c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 82e: 4798 lw a4,8(a5) + 830: 02977f63 bgeu a4,s1,86e <malloc+0x70> + 834: 8a4e mv s4,s3 + 836: 0009871b sext.w a4,s3 + 83a: 6685 lui a3,0x1 + 83c: 00d77363 bgeu a4,a3,842 <malloc+0x44> + 840: 6a05 lui s4,0x1 + 842: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 846: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 84a: 00000917 auipc s2,0x0 + 84e: 7c690913 addi s2,s2,1990 # 1010 <freep> + if(p == (char*)-1) + 852: 5afd li s5,-1 + 854: a885 j 8c4 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 856: 00000797 auipc a5,0x0 + 85a: 7ca78793 addi a5,a5,1994 # 1020 <base> + 85e: 00000717 auipc a4,0x0 + 862: 7af73923 sd a5,1970(a4) # 1010 <freep> + 866: e39c sd a5,0(a5) + base.s.size = 0; + 868: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 86c: b7e1 j 834 <malloc+0x36> + if(p->s.size == nunits) + 86e: 02e48c63 beq s1,a4,8a6 <malloc+0xa8> + p->s.size -= nunits; + 872: 4137073b subw a4,a4,s3 + 876: c798 sw a4,8(a5) + p += p->s.size; + 878: 02071693 slli a3,a4,0x20 + 87c: 01c6d713 srli a4,a3,0x1c + 880: 97ba add a5,a5,a4 + p->s.size = nunits; + 882: 0137a423 sw s3,8(a5) + freep = prevp; + 886: 00000717 auipc a4,0x0 + 88a: 78a73523 sd a0,1930(a4) # 1010 <freep> + return (void*)(p + 1); + 88e: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 892: 70e2 ld ra,56(sp) + 894: 7442 ld s0,48(sp) + 896: 74a2 ld s1,40(sp) + 898: 7902 ld s2,32(sp) + 89a: 69e2 ld s3,24(sp) + 89c: 6a42 ld s4,16(sp) + 89e: 6aa2 ld s5,8(sp) + 8a0: 6b02 ld s6,0(sp) + 8a2: 6121 addi sp,sp,64 + 8a4: 8082 ret + prevp->s.ptr = p->s.ptr; + 8a6: 6398 ld a4,0(a5) + 8a8: e118 sd a4,0(a0) + 8aa: bff1 j 886 <malloc+0x88> + hp->s.size = nu; + 8ac: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8b0: 0541 addi a0,a0,16 + 8b2: ecbff0ef jal ra,77c <free> + return freep; + 8b6: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8ba: dd61 beqz a0,892 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8bc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8be: 4798 lw a4,8(a5) + 8c0: fa9777e3 bgeu a4,s1,86e <malloc+0x70> + if(p == freep) + 8c4: 00093703 ld a4,0(s2) + 8c8: 853e mv a0,a5 + 8ca: fef719e3 bne a4,a5,8bc <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 8ce: 8552 mv a0,s4 + 8d0: adfff0ef jal ra,3ae <sbrk> + if(p == (char*)-1) + 8d4: fd551ce3 bne a0,s5,8ac <malloc+0xae> + return 0; + 8d8: 4501 li a0,0 + 8da: bf65 j 892 <malloc+0x94> diff --git a/user/init.d b/user/init.d new file mode 100644 index 0000000000000000000000000000000000000000..731e484385cf6d7946a04c11711ce215ab98d73f --- /dev/null +++ b/user/init.d @@ -0,0 +1,3 @@ +user/init.o: user/init.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h kernel/spinlock.h kernel/sleeplock.h \ + kernel/fs.h kernel/file.h user/user.h kernel/fcntl.h diff --git a/user/init.o b/user/init.o new file mode 100644 index 0000000000000000000000000000000000000000..edacde8ccf967da3075cae4a3a3ad5f70a48425a Binary files /dev/null and b/user/init.o differ diff --git a/user/init.sym b/user/init.sym new file mode 100644 index 0000000000000000000000000000000000000000..852ef38b7d7a0760d32575acb320e6399e5667c8 --- /dev/null +++ b/user/init.sym @@ -0,0 +1,67 @@ +0000000000000000 .text +00000000000008e0 .rodata +0000000000001000 .data +0000000000001010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 init.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003de putc +00000000000003fc printint +0000000000000960 digits +0000000000000000 umalloc.c +0000000000001010 freep +0000000000001020 base +00000000000000ce strcpy +000000000000074a printf +0000000000001000 argv +0000000000000278 memmove +000000000000036e mknod +00000000000003c6 trace +0000000000000186 gets +00000000000003a6 getpid +000000000000030a memcpy +00000000000007fe malloc +00000000000003b6 sleep +00000000000003ce mycall +0000000000000336 pipe +0000000000000346 write +000000000000037e fstat +0000000000000720 fprintf +0000000000000356 kill +00000000000004a4 vprintf +0000000000000396 chdir +000000000000035e exec +000000000000032e wait +000000000000033e read +0000000000000376 unlink +00000000000002d0 memcmp +000000000000031e fork +00000000000003ae sbrk +00000000000003be uptime +0000000000000140 memset +0000000000000000 main +00000000000003d6 GSCinfo +00000000000000ea strcmp +000000000000039e dup +00000000000001f6 stat +0000000000000386 link +0000000000000326 exit +00000000000000bc start +0000000000000230 atoi +0000000000000116 strlen +0000000000000366 open +0000000000000162 strchr +000000000000038e mkdir +000000000000034e close +000000000000077c free diff --git a/user/initcode b/user/initcode new file mode 100755 index 0000000000000000000000000000000000000000..ce82e86324a4bcf4edb10c9581e2a20508436ec3 Binary files /dev/null and b/user/initcode differ diff --git a/user/initcode.asm b/user/initcode.asm new file mode 100644 index 0000000000000000000000000000000000000000..c31d6a4e5ac0bed87431d22dcf757b8fdc03eb70 --- /dev/null +++ b/user/initcode.asm @@ -0,0 +1,41 @@ + +user/initcode.o: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <start>: +#include "syscall.h" + +# exec(init, argv) +.globl start +start: + la a0, init + 0: 00000517 auipc a0,0x0 + 4: 00050513 mv a0,a0 + la a1, argv + 8: 00000597 auipc a1,0x0 + c: 00058593 mv a1,a1 + li a7, SYS_exec + 10: 00700893 li a7,7 + ecall + 14: 00000073 ecall + +0000000000000018 <exit>: + +# for(;;) exit(); +exit: + li a7, SYS_exit + 18: 00200893 li a7,2 + ecall + 1c: 00000073 ecall + jal exit + 20: ff9ff0ef jal ra,18 <exit> + +0000000000000024 <init>: + 24: 696e692f .word 0x696e692f + 28: åœ°å€ 0x0000000000000028 越界。 + + +000000000000002b <argv>: + ... diff --git a/user/initcode.d b/user/initcode.d new file mode 100644 index 0000000000000000000000000000000000000000..1cc7dff27f77eb015493f36c23cdf8cf6bfc291d --- /dev/null +++ b/user/initcode.d @@ -0,0 +1 @@ +user/initcode.o: user/initcode.S kernel/syscall.h diff --git a/user/initcode.o b/user/initcode.o new file mode 100644 index 0000000000000000000000000000000000000000..c40b0b07ccb4f35a033f0543a78dc98d96bac0d7 Binary files /dev/null and b/user/initcode.o differ diff --git a/user/initcode.out b/user/initcode.out new file mode 100755 index 0000000000000000000000000000000000000000..d6f3a76b39eb521e0a9aedbbdbbc2e9c839b7abf Binary files /dev/null and b/user/initcode.out differ diff --git a/user/kill.asm b/user/kill.asm new file mode 100644 index 0000000000000000000000000000000000000000..493182a1e9fe8e7b1fc1e3ba0fef6ddec3368e93 --- /dev/null +++ b/user/kill.asm @@ -0,0 +1,1473 @@ + +user/_kill: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char **argv) +{ + 0: 1101 addi sp,sp,-32 + 2: ec06 sd ra,24(sp) + 4: e822 sd s0,16(sp) + 6: e426 sd s1,8(sp) + 8: e04a sd s2,0(sp) + a: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + c: 4785 li a5,1 + e: 02a7d763 bge a5,a0,3c <main+0x3c> + 12: 00858493 addi s1,a1,8 + 16: ffe5091b addiw s2,a0,-2 + 1a: 02091793 slli a5,s2,0x20 + 1e: 01d7d913 srli s2,a5,0x1d + 22: 05c1 addi a1,a1,16 + 24: 992e add s2,s2,a1 + fprintf(2, "usage: kill pid...\n"); + exit(1); + } + for(i=1; i<argc; i++) + kill(atoi(argv[i])); + 26: 6088 ld a0,0(s1) + 28: 19c000ef jal ra,1c4 <atoi> + 2c: 2be000ef jal ra,2ea <kill> + for(i=1; i<argc; i++) + 30: 04a1 addi s1,s1,8 + 32: ff249ae3 bne s1,s2,26 <main+0x26> + exit(0); + 36: 4501 li a0,0 + 38: 282000ef jal ra,2ba <exit> + fprintf(2, "usage: kill pid...\n"); + 3c: 00001597 auipc a1,0x1 + 40: 83458593 addi a1,a1,-1996 # 870 <malloc+0xde> + 44: 4509 li a0,2 + 46: 66e000ef jal ra,6b4 <fprintf> + exit(1); + 4a: 4505 li a0,1 + 4c: 26e000ef jal ra,2ba <exit> + +0000000000000050 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 50: 1141 addi sp,sp,-16 + 52: e406 sd ra,8(sp) + 54: e022 sd s0,0(sp) + 56: 0800 addi s0,sp,16 + extern int main(); + main(); + 58: fa9ff0ef jal ra,0 <main> + exit(0); + 5c: 4501 li a0,0 + 5e: 25c000ef jal ra,2ba <exit> + +0000000000000062 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 62: 1141 addi sp,sp,-16 + 64: e422 sd s0,8(sp) + 66: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 68: 87aa mv a5,a0 + 6a: 0585 addi a1,a1,1 + 6c: 0785 addi a5,a5,1 + 6e: fff5c703 lbu a4,-1(a1) + 72: fee78fa3 sb a4,-1(a5) + 76: fb75 bnez a4,6a <strcpy+0x8> + ; + return os; +} + 78: 6422 ld s0,8(sp) + 7a: 0141 addi sp,sp,16 + 7c: 8082 ret + +000000000000007e <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 7e: 1141 addi sp,sp,-16 + 80: e422 sd s0,8(sp) + 82: 0800 addi s0,sp,16 + while(*p && *p == *q) + 84: 00054783 lbu a5,0(a0) + 88: cb91 beqz a5,9c <strcmp+0x1e> + 8a: 0005c703 lbu a4,0(a1) + 8e: 00f71763 bne a4,a5,9c <strcmp+0x1e> + p++, q++; + 92: 0505 addi a0,a0,1 + 94: 0585 addi a1,a1,1 + while(*p && *p == *q) + 96: 00054783 lbu a5,0(a0) + 9a: fbe5 bnez a5,8a <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 9c: 0005c503 lbu a0,0(a1) +} + a0: 40a7853b subw a0,a5,a0 + a4: 6422 ld s0,8(sp) + a6: 0141 addi sp,sp,16 + a8: 8082 ret + +00000000000000aa <strlen>: + +uint +strlen(const char *s) +{ + aa: 1141 addi sp,sp,-16 + ac: e422 sd s0,8(sp) + ae: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + b0: 00054783 lbu a5,0(a0) + b4: cf91 beqz a5,d0 <strlen+0x26> + b6: 0505 addi a0,a0,1 + b8: 87aa mv a5,a0 + ba: 4685 li a3,1 + bc: 9e89 subw a3,a3,a0 + be: 00f6853b addw a0,a3,a5 + c2: 0785 addi a5,a5,1 + c4: fff7c703 lbu a4,-1(a5) + c8: fb7d bnez a4,be <strlen+0x14> + ; + return n; +} + ca: 6422 ld s0,8(sp) + cc: 0141 addi sp,sp,16 + ce: 8082 ret + for(n = 0; s[n]; n++) + d0: 4501 li a0,0 + d2: bfe5 j ca <strlen+0x20> + +00000000000000d4 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + d4: 1141 addi sp,sp,-16 + d6: e422 sd s0,8(sp) + d8: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + da: ca19 beqz a2,f0 <memset+0x1c> + dc: 87aa mv a5,a0 + de: 1602 slli a2,a2,0x20 + e0: 9201 srli a2,a2,0x20 + e2: 00a60733 add a4,a2,a0 + cdst[i] = c; + e6: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + ea: 0785 addi a5,a5,1 + ec: fee79de3 bne a5,a4,e6 <memset+0x12> + } + return dst; +} + f0: 6422 ld s0,8(sp) + f2: 0141 addi sp,sp,16 + f4: 8082 ret + +00000000000000f6 <strchr>: + +char* +strchr(const char *s, char c) +{ + f6: 1141 addi sp,sp,-16 + f8: e422 sd s0,8(sp) + fa: 0800 addi s0,sp,16 + for(; *s; s++) + fc: 00054783 lbu a5,0(a0) + 100: cb99 beqz a5,116 <strchr+0x20> + if(*s == c) + 102: 00f58763 beq a1,a5,110 <strchr+0x1a> + for(; *s; s++) + 106: 0505 addi a0,a0,1 + 108: 00054783 lbu a5,0(a0) + 10c: fbfd bnez a5,102 <strchr+0xc> + return (char*)s; + return 0; + 10e: 4501 li a0,0 +} + 110: 6422 ld s0,8(sp) + 112: 0141 addi sp,sp,16 + 114: 8082 ret + return 0; + 116: 4501 li a0,0 + 118: bfe5 j 110 <strchr+0x1a> + +000000000000011a <gets>: + +char* +gets(char *buf, int max) +{ + 11a: 711d addi sp,sp,-96 + 11c: ec86 sd ra,88(sp) + 11e: e8a2 sd s0,80(sp) + 120: e4a6 sd s1,72(sp) + 122: e0ca sd s2,64(sp) + 124: fc4e sd s3,56(sp) + 126: f852 sd s4,48(sp) + 128: f456 sd s5,40(sp) + 12a: f05a sd s6,32(sp) + 12c: ec5e sd s7,24(sp) + 12e: 1080 addi s0,sp,96 + 130: 8baa mv s7,a0 + 132: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 134: 892a mv s2,a0 + 136: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 138: 4aa9 li s5,10 + 13a: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 13c: 89a6 mv s3,s1 + 13e: 2485 addiw s1,s1,1 + 140: 0344d663 bge s1,s4,16c <gets+0x52> + cc = read(0, &c, 1); + 144: 4605 li a2,1 + 146: faf40593 addi a1,s0,-81 + 14a: 4501 li a0,0 + 14c: 186000ef jal ra,2d2 <read> + if(cc < 1) + 150: 00a05e63 blez a0,16c <gets+0x52> + buf[i++] = c; + 154: faf44783 lbu a5,-81(s0) + 158: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 15c: 01578763 beq a5,s5,16a <gets+0x50> + 160: 0905 addi s2,s2,1 + 162: fd679de3 bne a5,s6,13c <gets+0x22> + for(i=0; i+1 < max; ){ + 166: 89a6 mv s3,s1 + 168: a011 j 16c <gets+0x52> + 16a: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 16c: 99de add s3,s3,s7 + 16e: 00098023 sb zero,0(s3) + return buf; +} + 172: 855e mv a0,s7 + 174: 60e6 ld ra,88(sp) + 176: 6446 ld s0,80(sp) + 178: 64a6 ld s1,72(sp) + 17a: 6906 ld s2,64(sp) + 17c: 79e2 ld s3,56(sp) + 17e: 7a42 ld s4,48(sp) + 180: 7aa2 ld s5,40(sp) + 182: 7b02 ld s6,32(sp) + 184: 6be2 ld s7,24(sp) + 186: 6125 addi sp,sp,96 + 188: 8082 ret + +000000000000018a <stat>: + +int +stat(const char *n, struct stat *st) +{ + 18a: 1101 addi sp,sp,-32 + 18c: ec06 sd ra,24(sp) + 18e: e822 sd s0,16(sp) + 190: e426 sd s1,8(sp) + 192: e04a sd s2,0(sp) + 194: 1000 addi s0,sp,32 + 196: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 198: 4581 li a1,0 + 19a: 160000ef jal ra,2fa <open> + if(fd < 0) + 19e: 02054163 bltz a0,1c0 <stat+0x36> + 1a2: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a4: 85ca mv a1,s2 + 1a6: 16c000ef jal ra,312 <fstat> + 1aa: 892a mv s2,a0 + close(fd); + 1ac: 8526 mv a0,s1 + 1ae: 134000ef jal ra,2e2 <close> + return r; +} + 1b2: 854a mv a0,s2 + 1b4: 60e2 ld ra,24(sp) + 1b6: 6442 ld s0,16(sp) + 1b8: 64a2 ld s1,8(sp) + 1ba: 6902 ld s2,0(sp) + 1bc: 6105 addi sp,sp,32 + 1be: 8082 ret + return -1; + 1c0: 597d li s2,-1 + 1c2: bfc5 j 1b2 <stat+0x28> + +00000000000001c4 <atoi>: + +int +atoi(const char *s) +{ + 1c4: 1141 addi sp,sp,-16 + 1c6: e422 sd s0,8(sp) + 1c8: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1ca: 00054683 lbu a3,0(a0) + 1ce: fd06879b addiw a5,a3,-48 + 1d2: 0ff7f793 zext.b a5,a5 + 1d6: 4625 li a2,9 + 1d8: 02f66863 bltu a2,a5,208 <atoi+0x44> + 1dc: 872a mv a4,a0 + n = 0; + 1de: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1e0: 0705 addi a4,a4,1 + 1e2: 0025179b slliw a5,a0,0x2 + 1e6: 9fa9 addw a5,a5,a0 + 1e8: 0017979b slliw a5,a5,0x1 + 1ec: 9fb5 addw a5,a5,a3 + 1ee: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1f2: 00074683 lbu a3,0(a4) + 1f6: fd06879b addiw a5,a3,-48 + 1fa: 0ff7f793 zext.b a5,a5 + 1fe: fef671e3 bgeu a2,a5,1e0 <atoi+0x1c> + return n; +} + 202: 6422 ld s0,8(sp) + 204: 0141 addi sp,sp,16 + 206: 8082 ret + n = 0; + 208: 4501 li a0,0 + 20a: bfe5 j 202 <atoi+0x3e> + +000000000000020c <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 20c: 1141 addi sp,sp,-16 + 20e: e422 sd s0,8(sp) + 210: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 212: 02b57463 bgeu a0,a1,23a <memmove+0x2e> + while(n-- > 0) + 216: 00c05f63 blez a2,234 <memmove+0x28> + 21a: 1602 slli a2,a2,0x20 + 21c: 9201 srli a2,a2,0x20 + 21e: 00c507b3 add a5,a0,a2 + dst = vdst; + 222: 872a mv a4,a0 + *dst++ = *src++; + 224: 0585 addi a1,a1,1 + 226: 0705 addi a4,a4,1 + 228: fff5c683 lbu a3,-1(a1) + 22c: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 230: fee79ae3 bne a5,a4,224 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 234: 6422 ld s0,8(sp) + 236: 0141 addi sp,sp,16 + 238: 8082 ret + dst += n; + 23a: 00c50733 add a4,a0,a2 + src += n; + 23e: 95b2 add a1,a1,a2 + while(n-- > 0) + 240: fec05ae3 blez a2,234 <memmove+0x28> + 244: fff6079b addiw a5,a2,-1 + 248: 1782 slli a5,a5,0x20 + 24a: 9381 srli a5,a5,0x20 + 24c: fff7c793 not a5,a5 + 250: 97ba add a5,a5,a4 + *--dst = *--src; + 252: 15fd addi a1,a1,-1 + 254: 177d addi a4,a4,-1 + 256: 0005c683 lbu a3,0(a1) + 25a: 00d70023 sb a3,0(a4) + while(n-- > 0) + 25e: fee79ae3 bne a5,a4,252 <memmove+0x46> + 262: bfc9 j 234 <memmove+0x28> + +0000000000000264 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 264: 1141 addi sp,sp,-16 + 266: e422 sd s0,8(sp) + 268: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 26a: ca05 beqz a2,29a <memcmp+0x36> + 26c: fff6069b addiw a3,a2,-1 + 270: 1682 slli a3,a3,0x20 + 272: 9281 srli a3,a3,0x20 + 274: 0685 addi a3,a3,1 + 276: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 278: 00054783 lbu a5,0(a0) + 27c: 0005c703 lbu a4,0(a1) + 280: 00e79863 bne a5,a4,290 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 284: 0505 addi a0,a0,1 + p2++; + 286: 0585 addi a1,a1,1 + while (n-- > 0) { + 288: fed518e3 bne a0,a3,278 <memcmp+0x14> + } + return 0; + 28c: 4501 li a0,0 + 28e: a019 j 294 <memcmp+0x30> + return *p1 - *p2; + 290: 40e7853b subw a0,a5,a4 +} + 294: 6422 ld s0,8(sp) + 296: 0141 addi sp,sp,16 + 298: 8082 ret + return 0; + 29a: 4501 li a0,0 + 29c: bfe5 j 294 <memcmp+0x30> + +000000000000029e <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 29e: 1141 addi sp,sp,-16 + 2a0: e406 sd ra,8(sp) + 2a2: e022 sd s0,0(sp) + 2a4: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a6: f67ff0ef jal ra,20c <memmove> +} + 2aa: 60a2 ld ra,8(sp) + 2ac: 6402 ld s0,0(sp) + 2ae: 0141 addi sp,sp,16 + 2b0: 8082 ret + +00000000000002b2 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2b2: 4885 li a7,1 + ecall + 2b4: 00000073 ecall + ret + 2b8: 8082 ret + +00000000000002ba <exit>: +.global exit +exit: + li a7, SYS_exit + 2ba: 4889 li a7,2 + ecall + 2bc: 00000073 ecall + ret + 2c0: 8082 ret + +00000000000002c2 <wait>: +.global wait +wait: + li a7, SYS_wait + 2c2: 488d li a7,3 + ecall + 2c4: 00000073 ecall + ret + 2c8: 8082 ret + +00000000000002ca <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2ca: 4891 li a7,4 + ecall + 2cc: 00000073 ecall + ret + 2d0: 8082 ret + +00000000000002d2 <read>: +.global read +read: + li a7, SYS_read + 2d2: 4895 li a7,5 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da <write>: +.global write +write: + li a7, SYS_write + 2da: 48c1 li a7,16 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 <close>: +.global close +close: + li a7, SYS_close + 2e2: 48d5 li a7,21 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea <kill>: +.global kill +kill: + li a7, SYS_kill + 2ea: 4899 li a7,6 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 <exec>: +.global exec +exec: + li a7, SYS_exec + 2f2: 489d li a7,7 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa <open>: +.global open +open: + li a7, SYS_open + 2fa: 48bd li a7,15 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 302: 48c5 li a7,17 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 30a: 48c9 li a7,18 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 312: 48a1 li a7,8 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a <link>: +.global link +link: + li a7, SYS_link + 31a: 48cd li a7,19 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 322: 48d1 li a7,20 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 32a: 48a5 li a7,9 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 <dup>: +.global dup +dup: + li a7, SYS_dup + 332: 48a9 li a7,10 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 33a: 48ad li a7,11 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 342: 48b1 li a7,12 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 34a: 48b5 li a7,13 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 352: 48b9 li a7,14 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a <trace>: +.global trace +trace: + li a7, SYS_trace + 35a: 48d9 li a7,22 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 362: 48dd li a7,23 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 36a: 48e1 li a7,24 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 372: 1101 addi sp,sp,-32 + 374: ec06 sd ra,24(sp) + 376: e822 sd s0,16(sp) + 378: 1000 addi s0,sp,32 + 37a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 37e: 4605 li a2,1 + 380: fef40593 addi a1,s0,-17 + 384: f57ff0ef jal ra,2da <write> +} + 388: 60e2 ld ra,24(sp) + 38a: 6442 ld s0,16(sp) + 38c: 6105 addi sp,sp,32 + 38e: 8082 ret + +0000000000000390 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 390: 7139 addi sp,sp,-64 + 392: fc06 sd ra,56(sp) + 394: f822 sd s0,48(sp) + 396: f426 sd s1,40(sp) + 398: f04a sd s2,32(sp) + 39a: ec4e sd s3,24(sp) + 39c: 0080 addi s0,sp,64 + 39e: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3a0: c299 beqz a3,3a6 <printint+0x16> + 3a2: 0805c763 bltz a1,430 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3a6: 2581 sext.w a1,a1 + neg = 0; + 3a8: 4881 li a7,0 + 3aa: fc040693 addi a3,s0,-64 + } + + i = 0; + 3ae: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3b0: 2601 sext.w a2,a2 + 3b2: 00000517 auipc a0,0x0 + 3b6: 4de50513 addi a0,a0,1246 # 890 <digits> + 3ba: 883a mv a6,a4 + 3bc: 2705 addiw a4,a4,1 + 3be: 02c5f7bb remuw a5,a1,a2 + 3c2: 1782 slli a5,a5,0x20 + 3c4: 9381 srli a5,a5,0x20 + 3c6: 97aa add a5,a5,a0 + 3c8: 0007c783 lbu a5,0(a5) + 3cc: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3d0: 0005879b sext.w a5,a1 + 3d4: 02c5d5bb divuw a1,a1,a2 + 3d8: 0685 addi a3,a3,1 + 3da: fec7f0e3 bgeu a5,a2,3ba <printint+0x2a> + if(neg) + 3de: 00088c63 beqz a7,3f6 <printint+0x66> + buf[i++] = '-'; + 3e2: fd070793 addi a5,a4,-48 + 3e6: 00878733 add a4,a5,s0 + 3ea: 02d00793 li a5,45 + 3ee: fef70823 sb a5,-16(a4) + 3f2: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 3f6: 02e05663 blez a4,422 <printint+0x92> + 3fa: fc040793 addi a5,s0,-64 + 3fe: 00e78933 add s2,a5,a4 + 402: fff78993 addi s3,a5,-1 + 406: 99ba add s3,s3,a4 + 408: 377d addiw a4,a4,-1 + 40a: 1702 slli a4,a4,0x20 + 40c: 9301 srli a4,a4,0x20 + 40e: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 412: fff94583 lbu a1,-1(s2) + 416: 8526 mv a0,s1 + 418: f5bff0ef jal ra,372 <putc> + while(--i >= 0) + 41c: 197d addi s2,s2,-1 + 41e: ff391ae3 bne s2,s3,412 <printint+0x82> +} + 422: 70e2 ld ra,56(sp) + 424: 7442 ld s0,48(sp) + 426: 74a2 ld s1,40(sp) + 428: 7902 ld s2,32(sp) + 42a: 69e2 ld s3,24(sp) + 42c: 6121 addi sp,sp,64 + 42e: 8082 ret + x = -xx; + 430: 40b005bb negw a1,a1 + neg = 1; + 434: 4885 li a7,1 + x = -xx; + 436: bf95 j 3aa <printint+0x1a> + +0000000000000438 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 438: 7119 addi sp,sp,-128 + 43a: fc86 sd ra,120(sp) + 43c: f8a2 sd s0,112(sp) + 43e: f4a6 sd s1,104(sp) + 440: f0ca sd s2,96(sp) + 442: ecce sd s3,88(sp) + 444: e8d2 sd s4,80(sp) + 446: e4d6 sd s5,72(sp) + 448: e0da sd s6,64(sp) + 44a: fc5e sd s7,56(sp) + 44c: f862 sd s8,48(sp) + 44e: f466 sd s9,40(sp) + 450: f06a sd s10,32(sp) + 452: ec6e sd s11,24(sp) + 454: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 456: 0005c903 lbu s2,0(a1) + 45a: 22090e63 beqz s2,696 <vprintf+0x25e> + 45e: 8b2a mv s6,a0 + 460: 8a2e mv s4,a1 + 462: 8bb2 mv s7,a2 + state = 0; + 464: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 466: 4481 li s1,0 + 468: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 46a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 46e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 472: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 476: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 47a: 00000c97 auipc s9,0x0 + 47e: 416c8c93 addi s9,s9,1046 # 890 <digits> + 482: a005 j 4a2 <vprintf+0x6a> + putc(fd, c0); + 484: 85ca mv a1,s2 + 486: 855a mv a0,s6 + 488: eebff0ef jal ra,372 <putc> + 48c: a019 j 492 <vprintf+0x5a> + } else if(state == '%'){ + 48e: 03598263 beq s3,s5,4b2 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 492: 2485 addiw s1,s1,1 + 494: 8726 mv a4,s1 + 496: 009a07b3 add a5,s4,s1 + 49a: 0007c903 lbu s2,0(a5) + 49e: 1e090c63 beqz s2,696 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4a2: 0009079b sext.w a5,s2 + if(state == 0){ + 4a6: fe0994e3 bnez s3,48e <vprintf+0x56> + if(c0 == '%'){ + 4aa: fd579de3 bne a5,s5,484 <vprintf+0x4c> + state = '%'; + 4ae: 89be mv s3,a5 + 4b0: b7cd j 492 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4b2: cfa5 beqz a5,52a <vprintf+0xf2> + 4b4: 00ea06b3 add a3,s4,a4 + 4b8: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4bc: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4be: c681 beqz a3,4c6 <vprintf+0x8e> + 4c0: 9752 add a4,a4,s4 + 4c2: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4c6: 03878a63 beq a5,s8,4fa <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4ca: 05a78463 beq a5,s10,512 <vprintf+0xda> + } else if(c0 == 'u'){ + 4ce: 0db78763 beq a5,s11,59c <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4d2: 07800713 li a4,120 + 4d6: 10e78963 beq a5,a4,5e8 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4da: 07000713 li a4,112 + 4de: 12e78e63 beq a5,a4,61a <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4e2: 07300713 li a4,115 + 4e6: 16e78b63 beq a5,a4,65c <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4ea: 05579063 bne a5,s5,52a <vprintf+0xf2> + putc(fd, '%'); + 4ee: 85d6 mv a1,s5 + 4f0: 855a mv a0,s6 + 4f2: e81ff0ef jal ra,372 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 4f6: 4981 li s3,0 + 4f8: bf69 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 4fa: 008b8913 addi s2,s7,8 + 4fe: 4685 li a3,1 + 500: 4629 li a2,10 + 502: 000ba583 lw a1,0(s7) + 506: 855a mv a0,s6 + 508: e89ff0ef jal ra,390 <printint> + 50c: 8bca mv s7,s2 + state = 0; + 50e: 4981 li s3,0 + 510: b749 j 492 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 512: 03868663 beq a3,s8,53e <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 516: 05a68163 beq a3,s10,558 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 51a: 09b68d63 beq a3,s11,5b4 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 51e: 03a68f63 beq a3,s10,55c <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 522: 07800793 li a5,120 + 526: 0cf68d63 beq a3,a5,600 <vprintf+0x1c8> + putc(fd, '%'); + 52a: 85d6 mv a1,s5 + 52c: 855a mv a0,s6 + 52e: e45ff0ef jal ra,372 <putc> + putc(fd, c0); + 532: 85ca mv a1,s2 + 534: 855a mv a0,s6 + 536: e3dff0ef jal ra,372 <putc> + state = 0; + 53a: 4981 li s3,0 + 53c: bf99 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 53e: 008b8913 addi s2,s7,8 + 542: 4685 li a3,1 + 544: 4629 li a2,10 + 546: 000ba583 lw a1,0(s7) + 54a: 855a mv a0,s6 + 54c: e45ff0ef jal ra,390 <printint> + i += 1; + 550: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 552: 8bca mv s7,s2 + state = 0; + 554: 4981 li s3,0 + i += 1; + 556: bf35 j 492 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 558: 03860563 beq a2,s8,582 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 55c: 07b60963 beq a2,s11,5ce <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 560: 07800793 li a5,120 + 564: fcf613e3 bne a2,a5,52a <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 568: 008b8913 addi s2,s7,8 + 56c: 4681 li a3,0 + 56e: 4641 li a2,16 + 570: 000ba583 lw a1,0(s7) + 574: 855a mv a0,s6 + 576: e1bff0ef jal ra,390 <printint> + i += 2; + 57a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 57c: 8bca mv s7,s2 + state = 0; + 57e: 4981 li s3,0 + i += 2; + 580: bf09 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 582: 008b8913 addi s2,s7,8 + 586: 4685 li a3,1 + 588: 4629 li a2,10 + 58a: 000ba583 lw a1,0(s7) + 58e: 855a mv a0,s6 + 590: e01ff0ef jal ra,390 <printint> + i += 2; + 594: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 596: 8bca mv s7,s2 + state = 0; + 598: 4981 li s3,0 + i += 2; + 59a: bde5 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 59c: 008b8913 addi s2,s7,8 + 5a0: 4681 li a3,0 + 5a2: 4629 li a2,10 + 5a4: 000ba583 lw a1,0(s7) + 5a8: 855a mv a0,s6 + 5aa: de7ff0ef jal ra,390 <printint> + 5ae: 8bca mv s7,s2 + state = 0; + 5b0: 4981 li s3,0 + 5b2: b5c5 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5b4: 008b8913 addi s2,s7,8 + 5b8: 4681 li a3,0 + 5ba: 4629 li a2,10 + 5bc: 000ba583 lw a1,0(s7) + 5c0: 855a mv a0,s6 + 5c2: dcfff0ef jal ra,390 <printint> + i += 1; + 5c6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c8: 8bca mv s7,s2 + state = 0; + 5ca: 4981 li s3,0 + i += 1; + 5cc: b5d9 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5ce: 008b8913 addi s2,s7,8 + 5d2: 4681 li a3,0 + 5d4: 4629 li a2,10 + 5d6: 000ba583 lw a1,0(s7) + 5da: 855a mv a0,s6 + 5dc: db5ff0ef jal ra,390 <printint> + i += 2; + 5e0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 8bca mv s7,s2 + state = 0; + 5e4: 4981 li s3,0 + i += 2; + 5e6: b575 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5e8: 008b8913 addi s2,s7,8 + 5ec: 4681 li a3,0 + 5ee: 4641 li a2,16 + 5f0: 000ba583 lw a1,0(s7) + 5f4: 855a mv a0,s6 + 5f6: d9bff0ef jal ra,390 <printint> + 5fa: 8bca mv s7,s2 + state = 0; + 5fc: 4981 li s3,0 + 5fe: bd51 j 492 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 600: 008b8913 addi s2,s7,8 + 604: 4681 li a3,0 + 606: 4641 li a2,16 + 608: 000ba583 lw a1,0(s7) + 60c: 855a mv a0,s6 + 60e: d83ff0ef jal ra,390 <printint> + i += 1; + 612: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 614: 8bca mv s7,s2 + state = 0; + 616: 4981 li s3,0 + i += 1; + 618: bdad j 492 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 61a: 008b8793 addi a5,s7,8 + 61e: f8f43423 sd a5,-120(s0) + 622: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 626: 03000593 li a1,48 + 62a: 855a mv a0,s6 + 62c: d47ff0ef jal ra,372 <putc> + putc(fd, 'x'); + 630: 07800593 li a1,120 + 634: 855a mv a0,s6 + 636: d3dff0ef jal ra,372 <putc> + 63a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 63c: 03c9d793 srli a5,s3,0x3c + 640: 97e6 add a5,a5,s9 + 642: 0007c583 lbu a1,0(a5) + 646: 855a mv a0,s6 + 648: d2bff0ef jal ra,372 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 64c: 0992 slli s3,s3,0x4 + 64e: 397d addiw s2,s2,-1 + 650: fe0916e3 bnez s2,63c <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 654: f8843b83 ld s7,-120(s0) + state = 0; + 658: 4981 li s3,0 + 65a: bd25 j 492 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 65c: 008b8993 addi s3,s7,8 + 660: 000bb903 ld s2,0(s7) + 664: 00090f63 beqz s2,682 <vprintf+0x24a> + for(; *s; s++) + 668: 00094583 lbu a1,0(s2) + 66c: c195 beqz a1,690 <vprintf+0x258> + putc(fd, *s); + 66e: 855a mv a0,s6 + 670: d03ff0ef jal ra,372 <putc> + for(; *s; s++) + 674: 0905 addi s2,s2,1 + 676: 00094583 lbu a1,0(s2) + 67a: f9f5 bnez a1,66e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 67c: 8bce mv s7,s3 + state = 0; + 67e: 4981 li s3,0 + 680: bd09 j 492 <vprintf+0x5a> + s = "(null)"; + 682: 00000917 auipc s2,0x0 + 686: 20690913 addi s2,s2,518 # 888 <malloc+0xf6> + for(; *s; s++) + 68a: 02800593 li a1,40 + 68e: b7c5 j 66e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 690: 8bce mv s7,s3 + state = 0; + 692: 4981 li s3,0 + 694: bbfd j 492 <vprintf+0x5a> + } + } +} + 696: 70e6 ld ra,120(sp) + 698: 7446 ld s0,112(sp) + 69a: 74a6 ld s1,104(sp) + 69c: 7906 ld s2,96(sp) + 69e: 69e6 ld s3,88(sp) + 6a0: 6a46 ld s4,80(sp) + 6a2: 6aa6 ld s5,72(sp) + 6a4: 6b06 ld s6,64(sp) + 6a6: 7be2 ld s7,56(sp) + 6a8: 7c42 ld s8,48(sp) + 6aa: 7ca2 ld s9,40(sp) + 6ac: 7d02 ld s10,32(sp) + 6ae: 6de2 ld s11,24(sp) + 6b0: 6109 addi sp,sp,128 + 6b2: 8082 ret + +00000000000006b4 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6b4: 715d addi sp,sp,-80 + 6b6: ec06 sd ra,24(sp) + 6b8: e822 sd s0,16(sp) + 6ba: 1000 addi s0,sp,32 + 6bc: e010 sd a2,0(s0) + 6be: e414 sd a3,8(s0) + 6c0: e818 sd a4,16(s0) + 6c2: ec1c sd a5,24(s0) + 6c4: 03043023 sd a6,32(s0) + 6c8: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6cc: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6d0: 8622 mv a2,s0 + 6d2: d67ff0ef jal ra,438 <vprintf> +} + 6d6: 60e2 ld ra,24(sp) + 6d8: 6442 ld s0,16(sp) + 6da: 6161 addi sp,sp,80 + 6dc: 8082 ret + +00000000000006de <printf>: + +void +printf(const char *fmt, ...) +{ + 6de: 711d addi sp,sp,-96 + 6e0: ec06 sd ra,24(sp) + 6e2: e822 sd s0,16(sp) + 6e4: 1000 addi s0,sp,32 + 6e6: e40c sd a1,8(s0) + 6e8: e810 sd a2,16(s0) + 6ea: ec14 sd a3,24(s0) + 6ec: f018 sd a4,32(s0) + 6ee: f41c sd a5,40(s0) + 6f0: 03043823 sd a6,48(s0) + 6f4: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 6f8: 00840613 addi a2,s0,8 + 6fc: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 700: 85aa mv a1,a0 + 702: 4505 li a0,1 + 704: d35ff0ef jal ra,438 <vprintf> +} + 708: 60e2 ld ra,24(sp) + 70a: 6442 ld s0,16(sp) + 70c: 6125 addi sp,sp,96 + 70e: 8082 ret + +0000000000000710 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 710: 1141 addi sp,sp,-16 + 712: e422 sd s0,8(sp) + 714: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 716: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 71a: 00001797 auipc a5,0x1 + 71e: 8e67b783 ld a5,-1818(a5) # 1000 <freep> + 722: a02d j 74c <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 724: 4618 lw a4,8(a2) + 726: 9f2d addw a4,a4,a1 + 728: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 72c: 6398 ld a4,0(a5) + 72e: 6310 ld a2,0(a4) + 730: a83d j 76e <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 732: ff852703 lw a4,-8(a0) + 736: 9f31 addw a4,a4,a2 + 738: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 73a: ff053683 ld a3,-16(a0) + 73e: a091 j 782 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 740: 6398 ld a4,0(a5) + 742: 00e7e463 bltu a5,a4,74a <free+0x3a> + 746: 00e6ea63 bltu a3,a4,75a <free+0x4a> +{ + 74a: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 74c: fed7fae3 bgeu a5,a3,740 <free+0x30> + 750: 6398 ld a4,0(a5) + 752: 00e6e463 bltu a3,a4,75a <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 756: fee7eae3 bltu a5,a4,74a <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 75a: ff852583 lw a1,-8(a0) + 75e: 6390 ld a2,0(a5) + 760: 02059813 slli a6,a1,0x20 + 764: 01c85713 srli a4,a6,0x1c + 768: 9736 add a4,a4,a3 + 76a: fae60de3 beq a2,a4,724 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 76e: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 772: 4790 lw a2,8(a5) + 774: 02061593 slli a1,a2,0x20 + 778: 01c5d713 srli a4,a1,0x1c + 77c: 973e add a4,a4,a5 + 77e: fae68ae3 beq a3,a4,732 <free+0x22> + p->s.ptr = bp->s.ptr; + 782: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 784: 00001717 auipc a4,0x1 + 788: 86f73e23 sd a5,-1924(a4) # 1000 <freep> +} + 78c: 6422 ld s0,8(sp) + 78e: 0141 addi sp,sp,16 + 790: 8082 ret + +0000000000000792 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 792: 7139 addi sp,sp,-64 + 794: fc06 sd ra,56(sp) + 796: f822 sd s0,48(sp) + 798: f426 sd s1,40(sp) + 79a: f04a sd s2,32(sp) + 79c: ec4e sd s3,24(sp) + 79e: e852 sd s4,16(sp) + 7a0: e456 sd s5,8(sp) + 7a2: e05a sd s6,0(sp) + 7a4: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7a6: 02051493 slli s1,a0,0x20 + 7aa: 9081 srli s1,s1,0x20 + 7ac: 04bd addi s1,s1,15 + 7ae: 8091 srli s1,s1,0x4 + 7b0: 0014899b addiw s3,s1,1 + 7b4: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7b6: 00001517 auipc a0,0x1 + 7ba: 84a53503 ld a0,-1974(a0) # 1000 <freep> + 7be: c515 beqz a0,7ea <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7c0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7c2: 4798 lw a4,8(a5) + 7c4: 02977f63 bgeu a4,s1,802 <malloc+0x70> + 7c8: 8a4e mv s4,s3 + 7ca: 0009871b sext.w a4,s3 + 7ce: 6685 lui a3,0x1 + 7d0: 00d77363 bgeu a4,a3,7d6 <malloc+0x44> + 7d4: 6a05 lui s4,0x1 + 7d6: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7da: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7de: 00001917 auipc s2,0x1 + 7e2: 82290913 addi s2,s2,-2014 # 1000 <freep> + if(p == (char*)-1) + 7e6: 5afd li s5,-1 + 7e8: a885 j 858 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7ea: 00001797 auipc a5,0x1 + 7ee: 82678793 addi a5,a5,-2010 # 1010 <base> + 7f2: 00001717 auipc a4,0x1 + 7f6: 80f73723 sd a5,-2034(a4) # 1000 <freep> + 7fa: e39c sd a5,0(a5) + base.s.size = 0; + 7fc: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 800: b7e1 j 7c8 <malloc+0x36> + if(p->s.size == nunits) + 802: 02e48c63 beq s1,a4,83a <malloc+0xa8> + p->s.size -= nunits; + 806: 4137073b subw a4,a4,s3 + 80a: c798 sw a4,8(a5) + p += p->s.size; + 80c: 02071693 slli a3,a4,0x20 + 810: 01c6d713 srli a4,a3,0x1c + 814: 97ba add a5,a5,a4 + p->s.size = nunits; + 816: 0137a423 sw s3,8(a5) + freep = prevp; + 81a: 00000717 auipc a4,0x0 + 81e: 7ea73323 sd a0,2022(a4) # 1000 <freep> + return (void*)(p + 1); + 822: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 826: 70e2 ld ra,56(sp) + 828: 7442 ld s0,48(sp) + 82a: 74a2 ld s1,40(sp) + 82c: 7902 ld s2,32(sp) + 82e: 69e2 ld s3,24(sp) + 830: 6a42 ld s4,16(sp) + 832: 6aa2 ld s5,8(sp) + 834: 6b02 ld s6,0(sp) + 836: 6121 addi sp,sp,64 + 838: 8082 ret + prevp->s.ptr = p->s.ptr; + 83a: 6398 ld a4,0(a5) + 83c: e118 sd a4,0(a0) + 83e: bff1 j 81a <malloc+0x88> + hp->s.size = nu; + 840: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 844: 0541 addi a0,a0,16 + 846: ecbff0ef jal ra,710 <free> + return freep; + 84a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 84e: dd61 beqz a0,826 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 850: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 852: 4798 lw a4,8(a5) + 854: fa9777e3 bgeu a4,s1,802 <malloc+0x70> + if(p == freep) + 858: 00093703 ld a4,0(s2) + 85c: 853e mv a0,a5 + 85e: fef719e3 bne a4,a5,850 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 862: 8552 mv a0,s4 + 864: adfff0ef jal ra,342 <sbrk> + if(p == (char*)-1) + 868: fd551ce3 bne a0,s5,840 <malloc+0xae> + return 0; + 86c: 4501 li a0,0 + 86e: bf65 j 826 <malloc+0x94> diff --git a/user/kill.d b/user/kill.d new file mode 100644 index 0000000000000000000000000000000000000000..a912807ae80eb35d086be2715fc6c2dde685b448 --- /dev/null +++ b/user/kill.d @@ -0,0 +1,2 @@ +user/kill.o: user/kill.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/kill.o b/user/kill.o new file mode 100644 index 0000000000000000000000000000000000000000..958bc3beb0ef6b29d9cdbb1f6727ba54e36b911f Binary files /dev/null and b/user/kill.o differ diff --git a/user/kill.sym b/user/kill.sym new file mode 100644 index 0000000000000000000000000000000000000000..75b3316e84c2079455abec26dd71c119e4ab2431 --- /dev/null +++ b/user/kill.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000870 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 kill.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000372 putc +0000000000000390 printint +0000000000000890 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000062 strcpy +00000000000006de printf +000000000000020c memmove +0000000000000302 mknod +000000000000035a trace +000000000000011a gets +000000000000033a getpid +000000000000029e memcpy +0000000000000792 malloc +000000000000034a sleep +0000000000000362 mycall +00000000000002ca pipe +00000000000002da write +0000000000000312 fstat +00000000000006b4 fprintf +00000000000002ea kill +0000000000000438 vprintf +000000000000032a chdir +00000000000002f2 exec +00000000000002c2 wait +00000000000002d2 read +000000000000030a unlink +0000000000000264 memcmp +00000000000002b2 fork +0000000000000342 sbrk +0000000000000352 uptime +00000000000000d4 memset +0000000000000000 main +000000000000036a GSCinfo +000000000000007e strcmp +0000000000000332 dup +000000000000018a stat +000000000000031a link +00000000000002ba exit +0000000000000050 start +00000000000001c4 atoi +00000000000000aa strlen +00000000000002fa open +00000000000000f6 strchr +0000000000000322 mkdir +00000000000002e2 close +0000000000000710 free diff --git a/user/ln.asm b/user/ln.asm new file mode 100644 index 0000000000000000000000000000000000000000..a2585ef7639234ee23cf8591176ea6e7e4e1d058 --- /dev/null +++ b/user/ln.asm @@ -0,0 +1,1469 @@ + +user/_ln: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 0: 1101 addi sp,sp,-32 + 2: ec06 sd ra,24(sp) + 4: e822 sd s0,16(sp) + 6: e426 sd s1,8(sp) + 8: 1000 addi s0,sp,32 + if(argc != 3){ + a: 478d li a5,3 + c: 00f50c63 beq a0,a5,24 <main+0x24> + fprintf(2, "Usage: ln old new\n"); + 10: 00001597 auipc a1,0x1 + 14: 86058593 addi a1,a1,-1952 # 870 <malloc+0xe2> + 18: 4509 li a0,2 + 1a: 696000ef jal ra,6b0 <fprintf> + exit(1); + 1e: 4505 li a0,1 + 20: 296000ef jal ra,2b6 <exit> + 24: 84ae mv s1,a1 + } + if(link(argv[1], argv[2]) < 0) + 26: 698c ld a1,16(a1) + 28: 6488 ld a0,8(s1) + 2a: 2ec000ef jal ra,316 <link> + 2e: 00054563 bltz a0,38 <main+0x38> + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + exit(0); + 32: 4501 li a0,0 + 34: 282000ef jal ra,2b6 <exit> + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + 38: 6894 ld a3,16(s1) + 3a: 6490 ld a2,8(s1) + 3c: 00001597 auipc a1,0x1 + 40: 84c58593 addi a1,a1,-1972 # 888 <malloc+0xfa> + 44: 4509 li a0,2 + 46: 66a000ef jal ra,6b0 <fprintf> + 4a: b7e5 j 32 <main+0x32> + +000000000000004c <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 4c: 1141 addi sp,sp,-16 + 4e: e406 sd ra,8(sp) + 50: e022 sd s0,0(sp) + 52: 0800 addi s0,sp,16 + extern int main(); + main(); + 54: fadff0ef jal ra,0 <main> + exit(0); + 58: 4501 li a0,0 + 5a: 25c000ef jal ra,2b6 <exit> + +000000000000005e <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 5e: 1141 addi sp,sp,-16 + 60: e422 sd s0,8(sp) + 62: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 64: 87aa mv a5,a0 + 66: 0585 addi a1,a1,1 + 68: 0785 addi a5,a5,1 + 6a: fff5c703 lbu a4,-1(a1) + 6e: fee78fa3 sb a4,-1(a5) + 72: fb75 bnez a4,66 <strcpy+0x8> + ; + return os; +} + 74: 6422 ld s0,8(sp) + 76: 0141 addi sp,sp,16 + 78: 8082 ret + +000000000000007a <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e422 sd s0,8(sp) + 7e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 80: 00054783 lbu a5,0(a0) + 84: cb91 beqz a5,98 <strcmp+0x1e> + 86: 0005c703 lbu a4,0(a1) + 8a: 00f71763 bne a4,a5,98 <strcmp+0x1e> + p++, q++; + 8e: 0505 addi a0,a0,1 + 90: 0585 addi a1,a1,1 + while(*p && *p == *q) + 92: 00054783 lbu a5,0(a0) + 96: fbe5 bnez a5,86 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 98: 0005c503 lbu a0,0(a1) +} + 9c: 40a7853b subw a0,a5,a0 + a0: 6422 ld s0,8(sp) + a2: 0141 addi sp,sp,16 + a4: 8082 ret + +00000000000000a6 <strlen>: + +uint +strlen(const char *s) +{ + a6: 1141 addi sp,sp,-16 + a8: e422 sd s0,8(sp) + aa: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + ac: 00054783 lbu a5,0(a0) + b0: cf91 beqz a5,cc <strlen+0x26> + b2: 0505 addi a0,a0,1 + b4: 87aa mv a5,a0 + b6: 4685 li a3,1 + b8: 9e89 subw a3,a3,a0 + ba: 00f6853b addw a0,a3,a5 + be: 0785 addi a5,a5,1 + c0: fff7c703 lbu a4,-1(a5) + c4: fb7d bnez a4,ba <strlen+0x14> + ; + return n; +} + c6: 6422 ld s0,8(sp) + c8: 0141 addi sp,sp,16 + ca: 8082 ret + for(n = 0; s[n]; n++) + cc: 4501 li a0,0 + ce: bfe5 j c6 <strlen+0x20> + +00000000000000d0 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + d0: 1141 addi sp,sp,-16 + d2: e422 sd s0,8(sp) + d4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + d6: ca19 beqz a2,ec <memset+0x1c> + d8: 87aa mv a5,a0 + da: 1602 slli a2,a2,0x20 + dc: 9201 srli a2,a2,0x20 + de: 00a60733 add a4,a2,a0 + cdst[i] = c; + e2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + e6: 0785 addi a5,a5,1 + e8: fee79de3 bne a5,a4,e2 <memset+0x12> + } + return dst; +} + ec: 6422 ld s0,8(sp) + ee: 0141 addi sp,sp,16 + f0: 8082 ret + +00000000000000f2 <strchr>: + +char* +strchr(const char *s, char c) +{ + f2: 1141 addi sp,sp,-16 + f4: e422 sd s0,8(sp) + f6: 0800 addi s0,sp,16 + for(; *s; s++) + f8: 00054783 lbu a5,0(a0) + fc: cb99 beqz a5,112 <strchr+0x20> + if(*s == c) + fe: 00f58763 beq a1,a5,10c <strchr+0x1a> + for(; *s; s++) + 102: 0505 addi a0,a0,1 + 104: 00054783 lbu a5,0(a0) + 108: fbfd bnez a5,fe <strchr+0xc> + return (char*)s; + return 0; + 10a: 4501 li a0,0 +} + 10c: 6422 ld s0,8(sp) + 10e: 0141 addi sp,sp,16 + 110: 8082 ret + return 0; + 112: 4501 li a0,0 + 114: bfe5 j 10c <strchr+0x1a> + +0000000000000116 <gets>: + +char* +gets(char *buf, int max) +{ + 116: 711d addi sp,sp,-96 + 118: ec86 sd ra,88(sp) + 11a: e8a2 sd s0,80(sp) + 11c: e4a6 sd s1,72(sp) + 11e: e0ca sd s2,64(sp) + 120: fc4e sd s3,56(sp) + 122: f852 sd s4,48(sp) + 124: f456 sd s5,40(sp) + 126: f05a sd s6,32(sp) + 128: ec5e sd s7,24(sp) + 12a: 1080 addi s0,sp,96 + 12c: 8baa mv s7,a0 + 12e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 130: 892a mv s2,a0 + 132: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 134: 4aa9 li s5,10 + 136: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 138: 89a6 mv s3,s1 + 13a: 2485 addiw s1,s1,1 + 13c: 0344d663 bge s1,s4,168 <gets+0x52> + cc = read(0, &c, 1); + 140: 4605 li a2,1 + 142: faf40593 addi a1,s0,-81 + 146: 4501 li a0,0 + 148: 186000ef jal ra,2ce <read> + if(cc < 1) + 14c: 00a05e63 blez a0,168 <gets+0x52> + buf[i++] = c; + 150: faf44783 lbu a5,-81(s0) + 154: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 158: 01578763 beq a5,s5,166 <gets+0x50> + 15c: 0905 addi s2,s2,1 + 15e: fd679de3 bne a5,s6,138 <gets+0x22> + for(i=0; i+1 < max; ){ + 162: 89a6 mv s3,s1 + 164: a011 j 168 <gets+0x52> + 166: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 168: 99de add s3,s3,s7 + 16a: 00098023 sb zero,0(s3) + return buf; +} + 16e: 855e mv a0,s7 + 170: 60e6 ld ra,88(sp) + 172: 6446 ld s0,80(sp) + 174: 64a6 ld s1,72(sp) + 176: 6906 ld s2,64(sp) + 178: 79e2 ld s3,56(sp) + 17a: 7a42 ld s4,48(sp) + 17c: 7aa2 ld s5,40(sp) + 17e: 7b02 ld s6,32(sp) + 180: 6be2 ld s7,24(sp) + 182: 6125 addi sp,sp,96 + 184: 8082 ret + +0000000000000186 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 186: 1101 addi sp,sp,-32 + 188: ec06 sd ra,24(sp) + 18a: e822 sd s0,16(sp) + 18c: e426 sd s1,8(sp) + 18e: e04a sd s2,0(sp) + 190: 1000 addi s0,sp,32 + 192: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 194: 4581 li a1,0 + 196: 160000ef jal ra,2f6 <open> + if(fd < 0) + 19a: 02054163 bltz a0,1bc <stat+0x36> + 19e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a0: 85ca mv a1,s2 + 1a2: 16c000ef jal ra,30e <fstat> + 1a6: 892a mv s2,a0 + close(fd); + 1a8: 8526 mv a0,s1 + 1aa: 134000ef jal ra,2de <close> + return r; +} + 1ae: 854a mv a0,s2 + 1b0: 60e2 ld ra,24(sp) + 1b2: 6442 ld s0,16(sp) + 1b4: 64a2 ld s1,8(sp) + 1b6: 6902 ld s2,0(sp) + 1b8: 6105 addi sp,sp,32 + 1ba: 8082 ret + return -1; + 1bc: 597d li s2,-1 + 1be: bfc5 j 1ae <stat+0x28> + +00000000000001c0 <atoi>: + +int +atoi(const char *s) +{ + 1c0: 1141 addi sp,sp,-16 + 1c2: e422 sd s0,8(sp) + 1c4: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1c6: 00054683 lbu a3,0(a0) + 1ca: fd06879b addiw a5,a3,-48 + 1ce: 0ff7f793 zext.b a5,a5 + 1d2: 4625 li a2,9 + 1d4: 02f66863 bltu a2,a5,204 <atoi+0x44> + 1d8: 872a mv a4,a0 + n = 0; + 1da: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1dc: 0705 addi a4,a4,1 + 1de: 0025179b slliw a5,a0,0x2 + 1e2: 9fa9 addw a5,a5,a0 + 1e4: 0017979b slliw a5,a5,0x1 + 1e8: 9fb5 addw a5,a5,a3 + 1ea: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1ee: 00074683 lbu a3,0(a4) + 1f2: fd06879b addiw a5,a3,-48 + 1f6: 0ff7f793 zext.b a5,a5 + 1fa: fef671e3 bgeu a2,a5,1dc <atoi+0x1c> + return n; +} + 1fe: 6422 ld s0,8(sp) + 200: 0141 addi sp,sp,16 + 202: 8082 ret + n = 0; + 204: 4501 li a0,0 + 206: bfe5 j 1fe <atoi+0x3e> + +0000000000000208 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 208: 1141 addi sp,sp,-16 + 20a: e422 sd s0,8(sp) + 20c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 20e: 02b57463 bgeu a0,a1,236 <memmove+0x2e> + while(n-- > 0) + 212: 00c05f63 blez a2,230 <memmove+0x28> + 216: 1602 slli a2,a2,0x20 + 218: 9201 srli a2,a2,0x20 + 21a: 00c507b3 add a5,a0,a2 + dst = vdst; + 21e: 872a mv a4,a0 + *dst++ = *src++; + 220: 0585 addi a1,a1,1 + 222: 0705 addi a4,a4,1 + 224: fff5c683 lbu a3,-1(a1) + 228: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 22c: fee79ae3 bne a5,a4,220 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 230: 6422 ld s0,8(sp) + 232: 0141 addi sp,sp,16 + 234: 8082 ret + dst += n; + 236: 00c50733 add a4,a0,a2 + src += n; + 23a: 95b2 add a1,a1,a2 + while(n-- > 0) + 23c: fec05ae3 blez a2,230 <memmove+0x28> + 240: fff6079b addiw a5,a2,-1 + 244: 1782 slli a5,a5,0x20 + 246: 9381 srli a5,a5,0x20 + 248: fff7c793 not a5,a5 + 24c: 97ba add a5,a5,a4 + *--dst = *--src; + 24e: 15fd addi a1,a1,-1 + 250: 177d addi a4,a4,-1 + 252: 0005c683 lbu a3,0(a1) + 256: 00d70023 sb a3,0(a4) + while(n-- > 0) + 25a: fee79ae3 bne a5,a4,24e <memmove+0x46> + 25e: bfc9 j 230 <memmove+0x28> + +0000000000000260 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 260: 1141 addi sp,sp,-16 + 262: e422 sd s0,8(sp) + 264: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 266: ca05 beqz a2,296 <memcmp+0x36> + 268: fff6069b addiw a3,a2,-1 + 26c: 1682 slli a3,a3,0x20 + 26e: 9281 srli a3,a3,0x20 + 270: 0685 addi a3,a3,1 + 272: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 274: 00054783 lbu a5,0(a0) + 278: 0005c703 lbu a4,0(a1) + 27c: 00e79863 bne a5,a4,28c <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 280: 0505 addi a0,a0,1 + p2++; + 282: 0585 addi a1,a1,1 + while (n-- > 0) { + 284: fed518e3 bne a0,a3,274 <memcmp+0x14> + } + return 0; + 288: 4501 li a0,0 + 28a: a019 j 290 <memcmp+0x30> + return *p1 - *p2; + 28c: 40e7853b subw a0,a5,a4 +} + 290: 6422 ld s0,8(sp) + 292: 0141 addi sp,sp,16 + 294: 8082 ret + return 0; + 296: 4501 li a0,0 + 298: bfe5 j 290 <memcmp+0x30> + +000000000000029a <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 29a: 1141 addi sp,sp,-16 + 29c: e406 sd ra,8(sp) + 29e: e022 sd s0,0(sp) + 2a0: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a2: f67ff0ef jal ra,208 <memmove> +} + 2a6: 60a2 ld ra,8(sp) + 2a8: 6402 ld s0,0(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + +00000000000002ae <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2ae: 4885 li a7,1 + ecall + 2b0: 00000073 ecall + ret + 2b4: 8082 ret + +00000000000002b6 <exit>: +.global exit +exit: + li a7, SYS_exit + 2b6: 4889 li a7,2 + ecall + 2b8: 00000073 ecall + ret + 2bc: 8082 ret + +00000000000002be <wait>: +.global wait +wait: + li a7, SYS_wait + 2be: 488d li a7,3 + ecall + 2c0: 00000073 ecall + ret + 2c4: 8082 ret + +00000000000002c6 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2c6: 4891 li a7,4 + ecall + 2c8: 00000073 ecall + ret + 2cc: 8082 ret + +00000000000002ce <read>: +.global read +read: + li a7, SYS_read + 2ce: 4895 li a7,5 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 <write>: +.global write +write: + li a7, SYS_write + 2d6: 48c1 li a7,16 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de <close>: +.global close +close: + li a7, SYS_close + 2de: 48d5 li a7,21 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 <kill>: +.global kill +kill: + li a7, SYS_kill + 2e6: 4899 li a7,6 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee <exec>: +.global exec +exec: + li a7, SYS_exec + 2ee: 489d li a7,7 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 <open>: +.global open +open: + li a7, SYS_open + 2f6: 48bd li a7,15 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 2fe: 48c5 li a7,17 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 306: 48c9 li a7,18 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 30e: 48a1 li a7,8 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 <link>: +.global link +link: + li a7, SYS_link + 316: 48cd li a7,19 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 31e: 48d1 li a7,20 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 326: 48a5 li a7,9 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e <dup>: +.global dup +dup: + li a7, SYS_dup + 32e: 48a9 li a7,10 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 336: 48ad li a7,11 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 33e: 48b1 li a7,12 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 346: 48b5 li a7,13 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 34e: 48b9 li a7,14 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 <trace>: +.global trace +trace: + li a7, SYS_trace + 356: 48d9 li a7,22 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 35e: 48dd li a7,23 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 366: 48e1 li a7,24 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 36e: 1101 addi sp,sp,-32 + 370: ec06 sd ra,24(sp) + 372: e822 sd s0,16(sp) + 374: 1000 addi s0,sp,32 + 376: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 37a: 4605 li a2,1 + 37c: fef40593 addi a1,s0,-17 + 380: f57ff0ef jal ra,2d6 <write> +} + 384: 60e2 ld ra,24(sp) + 386: 6442 ld s0,16(sp) + 388: 6105 addi sp,sp,32 + 38a: 8082 ret + +000000000000038c <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 38c: 7139 addi sp,sp,-64 + 38e: fc06 sd ra,56(sp) + 390: f822 sd s0,48(sp) + 392: f426 sd s1,40(sp) + 394: f04a sd s2,32(sp) + 396: ec4e sd s3,24(sp) + 398: 0080 addi s0,sp,64 + 39a: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 39c: c299 beqz a3,3a2 <printint+0x16> + 39e: 0805c763 bltz a1,42c <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3a2: 2581 sext.w a1,a1 + neg = 0; + 3a4: 4881 li a7,0 + 3a6: fc040693 addi a3,s0,-64 + } + + i = 0; + 3aa: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3ac: 2601 sext.w a2,a2 + 3ae: 00000517 auipc a0,0x0 + 3b2: 4fa50513 addi a0,a0,1274 # 8a8 <digits> + 3b6: 883a mv a6,a4 + 3b8: 2705 addiw a4,a4,1 + 3ba: 02c5f7bb remuw a5,a1,a2 + 3be: 1782 slli a5,a5,0x20 + 3c0: 9381 srli a5,a5,0x20 + 3c2: 97aa add a5,a5,a0 + 3c4: 0007c783 lbu a5,0(a5) + 3c8: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3cc: 0005879b sext.w a5,a1 + 3d0: 02c5d5bb divuw a1,a1,a2 + 3d4: 0685 addi a3,a3,1 + 3d6: fec7f0e3 bgeu a5,a2,3b6 <printint+0x2a> + if(neg) + 3da: 00088c63 beqz a7,3f2 <printint+0x66> + buf[i++] = '-'; + 3de: fd070793 addi a5,a4,-48 + 3e2: 00878733 add a4,a5,s0 + 3e6: 02d00793 li a5,45 + 3ea: fef70823 sb a5,-16(a4) + 3ee: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 3f2: 02e05663 blez a4,41e <printint+0x92> + 3f6: fc040793 addi a5,s0,-64 + 3fa: 00e78933 add s2,a5,a4 + 3fe: fff78993 addi s3,a5,-1 + 402: 99ba add s3,s3,a4 + 404: 377d addiw a4,a4,-1 + 406: 1702 slli a4,a4,0x20 + 408: 9301 srli a4,a4,0x20 + 40a: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 40e: fff94583 lbu a1,-1(s2) + 412: 8526 mv a0,s1 + 414: f5bff0ef jal ra,36e <putc> + while(--i >= 0) + 418: 197d addi s2,s2,-1 + 41a: ff391ae3 bne s2,s3,40e <printint+0x82> +} + 41e: 70e2 ld ra,56(sp) + 420: 7442 ld s0,48(sp) + 422: 74a2 ld s1,40(sp) + 424: 7902 ld s2,32(sp) + 426: 69e2 ld s3,24(sp) + 428: 6121 addi sp,sp,64 + 42a: 8082 ret + x = -xx; + 42c: 40b005bb negw a1,a1 + neg = 1; + 430: 4885 li a7,1 + x = -xx; + 432: bf95 j 3a6 <printint+0x1a> + +0000000000000434 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 434: 7119 addi sp,sp,-128 + 436: fc86 sd ra,120(sp) + 438: f8a2 sd s0,112(sp) + 43a: f4a6 sd s1,104(sp) + 43c: f0ca sd s2,96(sp) + 43e: ecce sd s3,88(sp) + 440: e8d2 sd s4,80(sp) + 442: e4d6 sd s5,72(sp) + 444: e0da sd s6,64(sp) + 446: fc5e sd s7,56(sp) + 448: f862 sd s8,48(sp) + 44a: f466 sd s9,40(sp) + 44c: f06a sd s10,32(sp) + 44e: ec6e sd s11,24(sp) + 450: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 452: 0005c903 lbu s2,0(a1) + 456: 22090e63 beqz s2,692 <vprintf+0x25e> + 45a: 8b2a mv s6,a0 + 45c: 8a2e mv s4,a1 + 45e: 8bb2 mv s7,a2 + state = 0; + 460: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 462: 4481 li s1,0 + 464: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 466: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 46a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 46e: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 472: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 476: 00000c97 auipc s9,0x0 + 47a: 432c8c93 addi s9,s9,1074 # 8a8 <digits> + 47e: a005 j 49e <vprintf+0x6a> + putc(fd, c0); + 480: 85ca mv a1,s2 + 482: 855a mv a0,s6 + 484: eebff0ef jal ra,36e <putc> + 488: a019 j 48e <vprintf+0x5a> + } else if(state == '%'){ + 48a: 03598263 beq s3,s5,4ae <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 48e: 2485 addiw s1,s1,1 + 490: 8726 mv a4,s1 + 492: 009a07b3 add a5,s4,s1 + 496: 0007c903 lbu s2,0(a5) + 49a: 1e090c63 beqz s2,692 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 49e: 0009079b sext.w a5,s2 + if(state == 0){ + 4a2: fe0994e3 bnez s3,48a <vprintf+0x56> + if(c0 == '%'){ + 4a6: fd579de3 bne a5,s5,480 <vprintf+0x4c> + state = '%'; + 4aa: 89be mv s3,a5 + 4ac: b7cd j 48e <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4ae: cfa5 beqz a5,526 <vprintf+0xf2> + 4b0: 00ea06b3 add a3,s4,a4 + 4b4: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4b8: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4ba: c681 beqz a3,4c2 <vprintf+0x8e> + 4bc: 9752 add a4,a4,s4 + 4be: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4c2: 03878a63 beq a5,s8,4f6 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4c6: 05a78463 beq a5,s10,50e <vprintf+0xda> + } else if(c0 == 'u'){ + 4ca: 0db78763 beq a5,s11,598 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4ce: 07800713 li a4,120 + 4d2: 10e78963 beq a5,a4,5e4 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4d6: 07000713 li a4,112 + 4da: 12e78e63 beq a5,a4,616 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4de: 07300713 li a4,115 + 4e2: 16e78b63 beq a5,a4,658 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4e6: 05579063 bne a5,s5,526 <vprintf+0xf2> + putc(fd, '%'); + 4ea: 85d6 mv a1,s5 + 4ec: 855a mv a0,s6 + 4ee: e81ff0ef jal ra,36e <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 4f2: 4981 li s3,0 + 4f4: bf69 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 4f6: 008b8913 addi s2,s7,8 + 4fa: 4685 li a3,1 + 4fc: 4629 li a2,10 + 4fe: 000ba583 lw a1,0(s7) + 502: 855a mv a0,s6 + 504: e89ff0ef jal ra,38c <printint> + 508: 8bca mv s7,s2 + state = 0; + 50a: 4981 li s3,0 + 50c: b749 j 48e <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 50e: 03868663 beq a3,s8,53a <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 512: 05a68163 beq a3,s10,554 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 516: 09b68d63 beq a3,s11,5b0 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 51a: 03a68f63 beq a3,s10,558 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 51e: 07800793 li a5,120 + 522: 0cf68d63 beq a3,a5,5fc <vprintf+0x1c8> + putc(fd, '%'); + 526: 85d6 mv a1,s5 + 528: 855a mv a0,s6 + 52a: e45ff0ef jal ra,36e <putc> + putc(fd, c0); + 52e: 85ca mv a1,s2 + 530: 855a mv a0,s6 + 532: e3dff0ef jal ra,36e <putc> + state = 0; + 536: 4981 li s3,0 + 538: bf99 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 53a: 008b8913 addi s2,s7,8 + 53e: 4685 li a3,1 + 540: 4629 li a2,10 + 542: 000ba583 lw a1,0(s7) + 546: 855a mv a0,s6 + 548: e45ff0ef jal ra,38c <printint> + i += 1; + 54c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 54e: 8bca mv s7,s2 + state = 0; + 550: 4981 li s3,0 + i += 1; + 552: bf35 j 48e <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 554: 03860563 beq a2,s8,57e <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 558: 07b60963 beq a2,s11,5ca <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 55c: 07800793 li a5,120 + 560: fcf613e3 bne a2,a5,526 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 564: 008b8913 addi s2,s7,8 + 568: 4681 li a3,0 + 56a: 4641 li a2,16 + 56c: 000ba583 lw a1,0(s7) + 570: 855a mv a0,s6 + 572: e1bff0ef jal ra,38c <printint> + i += 2; + 576: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 578: 8bca mv s7,s2 + state = 0; + 57a: 4981 li s3,0 + i += 2; + 57c: bf09 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 57e: 008b8913 addi s2,s7,8 + 582: 4685 li a3,1 + 584: 4629 li a2,10 + 586: 000ba583 lw a1,0(s7) + 58a: 855a mv a0,s6 + 58c: e01ff0ef jal ra,38c <printint> + i += 2; + 590: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 592: 8bca mv s7,s2 + state = 0; + 594: 4981 li s3,0 + i += 2; + 596: bde5 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 598: 008b8913 addi s2,s7,8 + 59c: 4681 li a3,0 + 59e: 4629 li a2,10 + 5a0: 000ba583 lw a1,0(s7) + 5a4: 855a mv a0,s6 + 5a6: de7ff0ef jal ra,38c <printint> + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + 5ae: b5c5 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4681 li a3,0 + 5b6: 4629 li a2,10 + 5b8: 000ba583 lw a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: dcfff0ef jal ra,38c <printint> + i += 1; + 5c2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + i += 1; + 5c8: b5d9 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5ca: 008b8913 addi s2,s7,8 + 5ce: 4681 li a3,0 + 5d0: 4629 li a2,10 + 5d2: 000ba583 lw a1,0(s7) + 5d6: 855a mv a0,s6 + 5d8: db5ff0ef jal ra,38c <printint> + i += 2; + 5dc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5de: 8bca mv s7,s2 + state = 0; + 5e0: 4981 li s3,0 + i += 2; + 5e2: b575 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5e4: 008b8913 addi s2,s7,8 + 5e8: 4681 li a3,0 + 5ea: 4641 li a2,16 + 5ec: 000ba583 lw a1,0(s7) + 5f0: 855a mv a0,s6 + 5f2: d9bff0ef jal ra,38c <printint> + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + 5fa: bd51 j 48e <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4641 li a2,16 + 604: 000ba583 lw a1,0(s7) + 608: 855a mv a0,s6 + 60a: d83ff0ef jal ra,38c <printint> + i += 1; + 60e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 610: 8bca mv s7,s2 + state = 0; + 612: 4981 li s3,0 + i += 1; + 614: bdad j 48e <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 616: 008b8793 addi a5,s7,8 + 61a: f8f43423 sd a5,-120(s0) + 61e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 622: 03000593 li a1,48 + 626: 855a mv a0,s6 + 628: d47ff0ef jal ra,36e <putc> + putc(fd, 'x'); + 62c: 07800593 li a1,120 + 630: 855a mv a0,s6 + 632: d3dff0ef jal ra,36e <putc> + 636: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 638: 03c9d793 srli a5,s3,0x3c + 63c: 97e6 add a5,a5,s9 + 63e: 0007c583 lbu a1,0(a5) + 642: 855a mv a0,s6 + 644: d2bff0ef jal ra,36e <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 648: 0992 slli s3,s3,0x4 + 64a: 397d addiw s2,s2,-1 + 64c: fe0916e3 bnez s2,638 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 650: f8843b83 ld s7,-120(s0) + state = 0; + 654: 4981 li s3,0 + 656: bd25 j 48e <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 658: 008b8993 addi s3,s7,8 + 65c: 000bb903 ld s2,0(s7) + 660: 00090f63 beqz s2,67e <vprintf+0x24a> + for(; *s; s++) + 664: 00094583 lbu a1,0(s2) + 668: c195 beqz a1,68c <vprintf+0x258> + putc(fd, *s); + 66a: 855a mv a0,s6 + 66c: d03ff0ef jal ra,36e <putc> + for(; *s; s++) + 670: 0905 addi s2,s2,1 + 672: 00094583 lbu a1,0(s2) + 676: f9f5 bnez a1,66a <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 678: 8bce mv s7,s3 + state = 0; + 67a: 4981 li s3,0 + 67c: bd09 j 48e <vprintf+0x5a> + s = "(null)"; + 67e: 00000917 auipc s2,0x0 + 682: 22290913 addi s2,s2,546 # 8a0 <malloc+0x112> + for(; *s; s++) + 686: 02800593 li a1,40 + 68a: b7c5 j 66a <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 68c: 8bce mv s7,s3 + state = 0; + 68e: 4981 li s3,0 + 690: bbfd j 48e <vprintf+0x5a> + } + } +} + 692: 70e6 ld ra,120(sp) + 694: 7446 ld s0,112(sp) + 696: 74a6 ld s1,104(sp) + 698: 7906 ld s2,96(sp) + 69a: 69e6 ld s3,88(sp) + 69c: 6a46 ld s4,80(sp) + 69e: 6aa6 ld s5,72(sp) + 6a0: 6b06 ld s6,64(sp) + 6a2: 7be2 ld s7,56(sp) + 6a4: 7c42 ld s8,48(sp) + 6a6: 7ca2 ld s9,40(sp) + 6a8: 7d02 ld s10,32(sp) + 6aa: 6de2 ld s11,24(sp) + 6ac: 6109 addi sp,sp,128 + 6ae: 8082 ret + +00000000000006b0 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6b0: 715d addi sp,sp,-80 + 6b2: ec06 sd ra,24(sp) + 6b4: e822 sd s0,16(sp) + 6b6: 1000 addi s0,sp,32 + 6b8: e010 sd a2,0(s0) + 6ba: e414 sd a3,8(s0) + 6bc: e818 sd a4,16(s0) + 6be: ec1c sd a5,24(s0) + 6c0: 03043023 sd a6,32(s0) + 6c4: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6c8: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6cc: 8622 mv a2,s0 + 6ce: d67ff0ef jal ra,434 <vprintf> +} + 6d2: 60e2 ld ra,24(sp) + 6d4: 6442 ld s0,16(sp) + 6d6: 6161 addi sp,sp,80 + 6d8: 8082 ret + +00000000000006da <printf>: + +void +printf(const char *fmt, ...) +{ + 6da: 711d addi sp,sp,-96 + 6dc: ec06 sd ra,24(sp) + 6de: e822 sd s0,16(sp) + 6e0: 1000 addi s0,sp,32 + 6e2: e40c sd a1,8(s0) + 6e4: e810 sd a2,16(s0) + 6e6: ec14 sd a3,24(s0) + 6e8: f018 sd a4,32(s0) + 6ea: f41c sd a5,40(s0) + 6ec: 03043823 sd a6,48(s0) + 6f0: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 6f4: 00840613 addi a2,s0,8 + 6f8: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 6fc: 85aa mv a1,a0 + 6fe: 4505 li a0,1 + 700: d35ff0ef jal ra,434 <vprintf> +} + 704: 60e2 ld ra,24(sp) + 706: 6442 ld s0,16(sp) + 708: 6125 addi sp,sp,96 + 70a: 8082 ret + +000000000000070c <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 70c: 1141 addi sp,sp,-16 + 70e: e422 sd s0,8(sp) + 710: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 712: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 716: 00001797 auipc a5,0x1 + 71a: 8ea7b783 ld a5,-1814(a5) # 1000 <freep> + 71e: a02d j 748 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 720: 4618 lw a4,8(a2) + 722: 9f2d addw a4,a4,a1 + 724: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 728: 6398 ld a4,0(a5) + 72a: 6310 ld a2,0(a4) + 72c: a83d j 76a <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 72e: ff852703 lw a4,-8(a0) + 732: 9f31 addw a4,a4,a2 + 734: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 736: ff053683 ld a3,-16(a0) + 73a: a091 j 77e <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 73c: 6398 ld a4,0(a5) + 73e: 00e7e463 bltu a5,a4,746 <free+0x3a> + 742: 00e6ea63 bltu a3,a4,756 <free+0x4a> +{ + 746: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 748: fed7fae3 bgeu a5,a3,73c <free+0x30> + 74c: 6398 ld a4,0(a5) + 74e: 00e6e463 bltu a3,a4,756 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 752: fee7eae3 bltu a5,a4,746 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 756: ff852583 lw a1,-8(a0) + 75a: 6390 ld a2,0(a5) + 75c: 02059813 slli a6,a1,0x20 + 760: 01c85713 srli a4,a6,0x1c + 764: 9736 add a4,a4,a3 + 766: fae60de3 beq a2,a4,720 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 76a: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 76e: 4790 lw a2,8(a5) + 770: 02061593 slli a1,a2,0x20 + 774: 01c5d713 srli a4,a1,0x1c + 778: 973e add a4,a4,a5 + 77a: fae68ae3 beq a3,a4,72e <free+0x22> + p->s.ptr = bp->s.ptr; + 77e: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 780: 00001717 auipc a4,0x1 + 784: 88f73023 sd a5,-1920(a4) # 1000 <freep> +} + 788: 6422 ld s0,8(sp) + 78a: 0141 addi sp,sp,16 + 78c: 8082 ret + +000000000000078e <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 78e: 7139 addi sp,sp,-64 + 790: fc06 sd ra,56(sp) + 792: f822 sd s0,48(sp) + 794: f426 sd s1,40(sp) + 796: f04a sd s2,32(sp) + 798: ec4e sd s3,24(sp) + 79a: e852 sd s4,16(sp) + 79c: e456 sd s5,8(sp) + 79e: e05a sd s6,0(sp) + 7a0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7a2: 02051493 slli s1,a0,0x20 + 7a6: 9081 srli s1,s1,0x20 + 7a8: 04bd addi s1,s1,15 + 7aa: 8091 srli s1,s1,0x4 + 7ac: 0014899b addiw s3,s1,1 + 7b0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7b2: 00001517 auipc a0,0x1 + 7b6: 84e53503 ld a0,-1970(a0) # 1000 <freep> + 7ba: c515 beqz a0,7e6 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7bc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7be: 4798 lw a4,8(a5) + 7c0: 02977f63 bgeu a4,s1,7fe <malloc+0x70> + 7c4: 8a4e mv s4,s3 + 7c6: 0009871b sext.w a4,s3 + 7ca: 6685 lui a3,0x1 + 7cc: 00d77363 bgeu a4,a3,7d2 <malloc+0x44> + 7d0: 6a05 lui s4,0x1 + 7d2: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7d6: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7da: 00001917 auipc s2,0x1 + 7de: 82690913 addi s2,s2,-2010 # 1000 <freep> + if(p == (char*)-1) + 7e2: 5afd li s5,-1 + 7e4: a885 j 854 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7e6: 00001797 auipc a5,0x1 + 7ea: 82a78793 addi a5,a5,-2006 # 1010 <base> + 7ee: 00001717 auipc a4,0x1 + 7f2: 80f73923 sd a5,-2030(a4) # 1000 <freep> + 7f6: e39c sd a5,0(a5) + base.s.size = 0; + 7f8: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 7fc: b7e1 j 7c4 <malloc+0x36> + if(p->s.size == nunits) + 7fe: 02e48c63 beq s1,a4,836 <malloc+0xa8> + p->s.size -= nunits; + 802: 4137073b subw a4,a4,s3 + 806: c798 sw a4,8(a5) + p += p->s.size; + 808: 02071693 slli a3,a4,0x20 + 80c: 01c6d713 srli a4,a3,0x1c + 810: 97ba add a5,a5,a4 + p->s.size = nunits; + 812: 0137a423 sw s3,8(a5) + freep = prevp; + 816: 00000717 auipc a4,0x0 + 81a: 7ea73523 sd a0,2026(a4) # 1000 <freep> + return (void*)(p + 1); + 81e: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 822: 70e2 ld ra,56(sp) + 824: 7442 ld s0,48(sp) + 826: 74a2 ld s1,40(sp) + 828: 7902 ld s2,32(sp) + 82a: 69e2 ld s3,24(sp) + 82c: 6a42 ld s4,16(sp) + 82e: 6aa2 ld s5,8(sp) + 830: 6b02 ld s6,0(sp) + 832: 6121 addi sp,sp,64 + 834: 8082 ret + prevp->s.ptr = p->s.ptr; + 836: 6398 ld a4,0(a5) + 838: e118 sd a4,0(a0) + 83a: bff1 j 816 <malloc+0x88> + hp->s.size = nu; + 83c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 840: 0541 addi a0,a0,16 + 842: ecbff0ef jal ra,70c <free> + return freep; + 846: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 84a: dd61 beqz a0,822 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 84c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 84e: 4798 lw a4,8(a5) + 850: fa9777e3 bgeu a4,s1,7fe <malloc+0x70> + if(p == freep) + 854: 00093703 ld a4,0(s2) + 858: 853e mv a0,a5 + 85a: fef719e3 bne a4,a5,84c <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 85e: 8552 mv a0,s4 + 860: adfff0ef jal ra,33e <sbrk> + if(p == (char*)-1) + 864: fd551ce3 bne a0,s5,83c <malloc+0xae> + return 0; + 868: 4501 li a0,0 + 86a: bf65 j 822 <malloc+0x94> diff --git a/user/ln.d b/user/ln.d new file mode 100644 index 0000000000000000000000000000000000000000..c8ccc84f1c67fde3dcd17ea6851b76da9fdbb56e --- /dev/null +++ b/user/ln.d @@ -0,0 +1,2 @@ +user/ln.o: user/ln.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/ln.o b/user/ln.o new file mode 100644 index 0000000000000000000000000000000000000000..6f606036a50f6c2382c50d34e8b197ba44b54cdb Binary files /dev/null and b/user/ln.o differ diff --git a/user/ln.sym b/user/ln.sym new file mode 100644 index 0000000000000000000000000000000000000000..a17729ee5d48302f309f08d10d72cc7304b35d2f --- /dev/null +++ b/user/ln.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000870 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 ln.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000036e putc +000000000000038c printint +00000000000008a8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000005e strcpy +00000000000006da printf +0000000000000208 memmove +00000000000002fe mknod +0000000000000356 trace +0000000000000116 gets +0000000000000336 getpid +000000000000029a memcpy +000000000000078e malloc +0000000000000346 sleep +000000000000035e mycall +00000000000002c6 pipe +00000000000002d6 write +000000000000030e fstat +00000000000006b0 fprintf +00000000000002e6 kill +0000000000000434 vprintf +0000000000000326 chdir +00000000000002ee exec +00000000000002be wait +00000000000002ce read +0000000000000306 unlink +0000000000000260 memcmp +00000000000002ae fork +000000000000033e sbrk +000000000000034e uptime +00000000000000d0 memset +0000000000000000 main +0000000000000366 GSCinfo +000000000000007a strcmp +000000000000032e dup +0000000000000186 stat +0000000000000316 link +00000000000002b6 exit +000000000000004c start +00000000000001c0 atoi +00000000000000a6 strlen +00000000000002f6 open +00000000000000f2 strchr +000000000000031e mkdir +00000000000002de close +000000000000070c free diff --git a/user/ls.asm b/user/ls.asm new file mode 100644 index 0000000000000000000000000000000000000000..63ac1cc435206a3f3dd9644551e9bf5d16ff2bd9 --- /dev/null +++ b/user/ls.asm @@ -0,0 +1,1717 @@ + +user/_ls: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <fmtname>: +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +char* +fmtname(char *path) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: 1800 addi s0,sp,48 + e: 84aa mv s1,a0 + static char buf[DIRSIZ+1]; + char *p; + + // Find first character after last slash. + for(p=path+strlen(path); p >= path && *p != '/'; p--) + 10: 2ac000ef jal ra,2bc <strlen> + 14: 02051793 slli a5,a0,0x20 + 18: 9381 srli a5,a5,0x20 + 1a: 97a6 add a5,a5,s1 + 1c: 02f00693 li a3,47 + 20: 0097e963 bltu a5,s1,32 <fmtname+0x32> + 24: 0007c703 lbu a4,0(a5) + 28: 00d70563 beq a4,a3,32 <fmtname+0x32> + 2c: 17fd addi a5,a5,-1 + 2e: fe97fbe3 bgeu a5,s1,24 <fmtname+0x24> + ; + p++; + 32: 00178493 addi s1,a5,1 + + // Return blank-padded name. + if(strlen(p) >= DIRSIZ) + 36: 8526 mv a0,s1 + 38: 284000ef jal ra,2bc <strlen> + 3c: 2501 sext.w a0,a0 + 3e: 47b5 li a5,13 + 40: 00a7fa63 bgeu a5,a0,54 <fmtname+0x54> + return p; + memmove(buf, p, strlen(p)); + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + return buf; +} + 44: 8526 mv a0,s1 + 46: 70a2 ld ra,40(sp) + 48: 7402 ld s0,32(sp) + 4a: 64e2 ld s1,24(sp) + 4c: 6942 ld s2,16(sp) + 4e: 69a2 ld s3,8(sp) + 50: 6145 addi sp,sp,48 + 52: 8082 ret + memmove(buf, p, strlen(p)); + 54: 8526 mv a0,s1 + 56: 266000ef jal ra,2bc <strlen> + 5a: 00001997 auipc s3,0x1 + 5e: fb698993 addi s3,s3,-74 # 1010 <buf.0> + 62: 0005061b sext.w a2,a0 + 66: 85a6 mv a1,s1 + 68: 854e mv a0,s3 + 6a: 3b4000ef jal ra,41e <memmove> + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + 6e: 8526 mv a0,s1 + 70: 24c000ef jal ra,2bc <strlen> + 74: 0005091b sext.w s2,a0 + 78: 8526 mv a0,s1 + 7a: 242000ef jal ra,2bc <strlen> + 7e: 1902 slli s2,s2,0x20 + 80: 02095913 srli s2,s2,0x20 + 84: 4639 li a2,14 + 86: 9e09 subw a2,a2,a0 + 88: 02000593 li a1,32 + 8c: 01298533 add a0,s3,s2 + 90: 256000ef jal ra,2e6 <memset> + return buf; + 94: 84ce mv s1,s3 + 96: b77d j 44 <fmtname+0x44> + +0000000000000098 <ls>: + +void +ls(char *path) +{ + 98: d9010113 addi sp,sp,-624 + 9c: 26113423 sd ra,616(sp) + a0: 26813023 sd s0,608(sp) + a4: 24913c23 sd s1,600(sp) + a8: 25213823 sd s2,592(sp) + ac: 25313423 sd s3,584(sp) + b0: 25413023 sd s4,576(sp) + b4: 23513c23 sd s5,568(sp) + b8: 1c80 addi s0,sp,624 + ba: 892a mv s2,a0 + char buf[512], *p; + int fd; + struct dirent de; + struct stat st; + + if((fd = open(path, O_RDONLY)) < 0){ + bc: 4581 li a1,0 + be: 44e000ef jal ra,50c <open> + c2: 06054963 bltz a0,134 <ls+0x9c> + c6: 84aa mv s1,a0 + fprintf(2, "ls: cannot open %s\n", path); + return; + } + + if(fstat(fd, &st) < 0){ + c8: d9840593 addi a1,s0,-616 + cc: 458000ef jal ra,524 <fstat> + d0: 06054b63 bltz a0,146 <ls+0xae> + fprintf(2, "ls: cannot stat %s\n", path); + close(fd); + return; + } + + switch(st.type){ + d4: da041783 lh a5,-608(s0) + d8: 0007869b sext.w a3,a5 + dc: 4705 li a4,1 + de: 08e68063 beq a3,a4,15e <ls+0xc6> + e2: 37f9 addiw a5,a5,-2 + e4: 17c2 slli a5,a5,0x30 + e6: 93c1 srli a5,a5,0x30 + e8: 02f76263 bltu a4,a5,10c <ls+0x74> + case T_DEVICE: + case T_FILE: + printf("%s %d %d %d\n", fmtname(path), st.type, st.ino, (int) st.size); + ec: 854a mv a0,s2 + ee: f13ff0ef jal ra,0 <fmtname> + f2: 85aa mv a1,a0 + f4: da842703 lw a4,-600(s0) + f8: d9c42683 lw a3,-612(s0) + fc: da041603 lh a2,-608(s0) + 100: 00001517 auipc a0,0x1 + 104: 9c050513 addi a0,a0,-1600 # ac0 <malloc+0x11c> + 108: 7e8000ef jal ra,8f0 <printf> + } + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + } + break; + } + close(fd); + 10c: 8526 mv a0,s1 + 10e: 3e6000ef jal ra,4f4 <close> +} + 112: 26813083 ld ra,616(sp) + 116: 26013403 ld s0,608(sp) + 11a: 25813483 ld s1,600(sp) + 11e: 25013903 ld s2,592(sp) + 122: 24813983 ld s3,584(sp) + 126: 24013a03 ld s4,576(sp) + 12a: 23813a83 ld s5,568(sp) + 12e: 27010113 addi sp,sp,624 + 132: 8082 ret + fprintf(2, "ls: cannot open %s\n", path); + 134: 864a mv a2,s2 + 136: 00001597 auipc a1,0x1 + 13a: 95a58593 addi a1,a1,-1702 # a90 <malloc+0xec> + 13e: 4509 li a0,2 + 140: 786000ef jal ra,8c6 <fprintf> + return; + 144: b7f9 j 112 <ls+0x7a> + fprintf(2, "ls: cannot stat %s\n", path); + 146: 864a mv a2,s2 + 148: 00001597 auipc a1,0x1 + 14c: 96058593 addi a1,a1,-1696 # aa8 <malloc+0x104> + 150: 4509 li a0,2 + 152: 774000ef jal ra,8c6 <fprintf> + close(fd); + 156: 8526 mv a0,s1 + 158: 39c000ef jal ra,4f4 <close> + return; + 15c: bf5d j 112 <ls+0x7a> + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + 15e: 854a mv a0,s2 + 160: 15c000ef jal ra,2bc <strlen> + 164: 2541 addiw a0,a0,16 + 166: 20000793 li a5,512 + 16a: 00a7f963 bgeu a5,a0,17c <ls+0xe4> + printf("ls: path too long\n"); + 16e: 00001517 auipc a0,0x1 + 172: 96250513 addi a0,a0,-1694 # ad0 <malloc+0x12c> + 176: 77a000ef jal ra,8f0 <printf> + break; + 17a: bf49 j 10c <ls+0x74> + strcpy(buf, path); + 17c: 85ca mv a1,s2 + 17e: dc040513 addi a0,s0,-576 + 182: 0f2000ef jal ra,274 <strcpy> + p = buf+strlen(buf); + 186: dc040513 addi a0,s0,-576 + 18a: 132000ef jal ra,2bc <strlen> + 18e: 1502 slli a0,a0,0x20 + 190: 9101 srli a0,a0,0x20 + 192: dc040793 addi a5,s0,-576 + 196: 00a78933 add s2,a5,a0 + *p++ = '/'; + 19a: 00190993 addi s3,s2,1 + 19e: 02f00793 li a5,47 + 1a2: 00f90023 sb a5,0(s2) + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 1a6: 00001a17 auipc s4,0x1 + 1aa: 91aa0a13 addi s4,s4,-1766 # ac0 <malloc+0x11c> + printf("ls: cannot stat %s\n", buf); + 1ae: 00001a97 auipc s5,0x1 + 1b2: 8faa8a93 addi s5,s5,-1798 # aa8 <malloc+0x104> + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1b6: a031 j 1c2 <ls+0x12a> + printf("ls: cannot stat %s\n", buf); + 1b8: dc040593 addi a1,s0,-576 + 1bc: 8556 mv a0,s5 + 1be: 732000ef jal ra,8f0 <printf> + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1c2: 4641 li a2,16 + 1c4: db040593 addi a1,s0,-592 + 1c8: 8526 mv a0,s1 + 1ca: 31a000ef jal ra,4e4 <read> + 1ce: 47c1 li a5,16 + 1d0: f2f51ee3 bne a0,a5,10c <ls+0x74> + if(de.inum == 0) + 1d4: db045783 lhu a5,-592(s0) + 1d8: d7ed beqz a5,1c2 <ls+0x12a> + memmove(p, de.name, DIRSIZ); + 1da: 4639 li a2,14 + 1dc: db240593 addi a1,s0,-590 + 1e0: 854e mv a0,s3 + 1e2: 23c000ef jal ra,41e <memmove> + p[DIRSIZ] = 0; + 1e6: 000907a3 sb zero,15(s2) + if(stat(buf, &st) < 0){ + 1ea: d9840593 addi a1,s0,-616 + 1ee: dc040513 addi a0,s0,-576 + 1f2: 1aa000ef jal ra,39c <stat> + 1f6: fc0541e3 bltz a0,1b8 <ls+0x120> + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 1fa: dc040513 addi a0,s0,-576 + 1fe: e03ff0ef jal ra,0 <fmtname> + 202: 85aa mv a1,a0 + 204: da842703 lw a4,-600(s0) + 208: d9c42683 lw a3,-612(s0) + 20c: da041603 lh a2,-608(s0) + 210: 8552 mv a0,s4 + 212: 6de000ef jal ra,8f0 <printf> + 216: b775 j 1c2 <ls+0x12a> + +0000000000000218 <main>: + +int +main(int argc, char *argv[]) +{ + 218: 1101 addi sp,sp,-32 + 21a: ec06 sd ra,24(sp) + 21c: e822 sd s0,16(sp) + 21e: e426 sd s1,8(sp) + 220: e04a sd s2,0(sp) + 222: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 224: 4785 li a5,1 + 226: 02a7d563 bge a5,a0,250 <main+0x38> + 22a: 00858493 addi s1,a1,8 + 22e: ffe5091b addiw s2,a0,-2 + 232: 02091793 slli a5,s2,0x20 + 236: 01d7d913 srli s2,a5,0x1d + 23a: 05c1 addi a1,a1,16 + 23c: 992e add s2,s2,a1 + ls("."); + exit(0); + } + for(i=1; i<argc; i++) + ls(argv[i]); + 23e: 6088 ld a0,0(s1) + 240: e59ff0ef jal ra,98 <ls> + for(i=1; i<argc; i++) + 244: 04a1 addi s1,s1,8 + 246: ff249ce3 bne s1,s2,23e <main+0x26> + exit(0); + 24a: 4501 li a0,0 + 24c: 280000ef jal ra,4cc <exit> + ls("."); + 250: 00001517 auipc a0,0x1 + 254: 89850513 addi a0,a0,-1896 # ae8 <malloc+0x144> + 258: e41ff0ef jal ra,98 <ls> + exit(0); + 25c: 4501 li a0,0 + 25e: 26e000ef jal ra,4cc <exit> + +0000000000000262 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 262: 1141 addi sp,sp,-16 + 264: e406 sd ra,8(sp) + 266: e022 sd s0,0(sp) + 268: 0800 addi s0,sp,16 + extern int main(); + main(); + 26a: fafff0ef jal ra,218 <main> + exit(0); + 26e: 4501 li a0,0 + 270: 25c000ef jal ra,4cc <exit> + +0000000000000274 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 274: 1141 addi sp,sp,-16 + 276: e422 sd s0,8(sp) + 278: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 27a: 87aa mv a5,a0 + 27c: 0585 addi a1,a1,1 + 27e: 0785 addi a5,a5,1 + 280: fff5c703 lbu a4,-1(a1) + 284: fee78fa3 sb a4,-1(a5) + 288: fb75 bnez a4,27c <strcpy+0x8> + ; + return os; +} + 28a: 6422 ld s0,8(sp) + 28c: 0141 addi sp,sp,16 + 28e: 8082 ret + +0000000000000290 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 290: 1141 addi sp,sp,-16 + 292: e422 sd s0,8(sp) + 294: 0800 addi s0,sp,16 + while(*p && *p == *q) + 296: 00054783 lbu a5,0(a0) + 29a: cb91 beqz a5,2ae <strcmp+0x1e> + 29c: 0005c703 lbu a4,0(a1) + 2a0: 00f71763 bne a4,a5,2ae <strcmp+0x1e> + p++, q++; + 2a4: 0505 addi a0,a0,1 + 2a6: 0585 addi a1,a1,1 + while(*p && *p == *q) + 2a8: 00054783 lbu a5,0(a0) + 2ac: fbe5 bnez a5,29c <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 2ae: 0005c503 lbu a0,0(a1) +} + 2b2: 40a7853b subw a0,a5,a0 + 2b6: 6422 ld s0,8(sp) + 2b8: 0141 addi sp,sp,16 + 2ba: 8082 ret + +00000000000002bc <strlen>: + +uint +strlen(const char *s) +{ + 2bc: 1141 addi sp,sp,-16 + 2be: e422 sd s0,8(sp) + 2c0: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2c2: 00054783 lbu a5,0(a0) + 2c6: cf91 beqz a5,2e2 <strlen+0x26> + 2c8: 0505 addi a0,a0,1 + 2ca: 87aa mv a5,a0 + 2cc: 4685 li a3,1 + 2ce: 9e89 subw a3,a3,a0 + 2d0: 00f6853b addw a0,a3,a5 + 2d4: 0785 addi a5,a5,1 + 2d6: fff7c703 lbu a4,-1(a5) + 2da: fb7d bnez a4,2d0 <strlen+0x14> + ; + return n; +} + 2dc: 6422 ld s0,8(sp) + 2de: 0141 addi sp,sp,16 + 2e0: 8082 ret + for(n = 0; s[n]; n++) + 2e2: 4501 li a0,0 + 2e4: bfe5 j 2dc <strlen+0x20> + +00000000000002e6 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 2e6: 1141 addi sp,sp,-16 + 2e8: e422 sd s0,8(sp) + 2ea: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2ec: ca19 beqz a2,302 <memset+0x1c> + 2ee: 87aa mv a5,a0 + 2f0: 1602 slli a2,a2,0x20 + 2f2: 9201 srli a2,a2,0x20 + 2f4: 00a60733 add a4,a2,a0 + cdst[i] = c; + 2f8: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 2fc: 0785 addi a5,a5,1 + 2fe: fee79de3 bne a5,a4,2f8 <memset+0x12> + } + return dst; +} + 302: 6422 ld s0,8(sp) + 304: 0141 addi sp,sp,16 + 306: 8082 ret + +0000000000000308 <strchr>: + +char* +strchr(const char *s, char c) +{ + 308: 1141 addi sp,sp,-16 + 30a: e422 sd s0,8(sp) + 30c: 0800 addi s0,sp,16 + for(; *s; s++) + 30e: 00054783 lbu a5,0(a0) + 312: cb99 beqz a5,328 <strchr+0x20> + if(*s == c) + 314: 00f58763 beq a1,a5,322 <strchr+0x1a> + for(; *s; s++) + 318: 0505 addi a0,a0,1 + 31a: 00054783 lbu a5,0(a0) + 31e: fbfd bnez a5,314 <strchr+0xc> + return (char*)s; + return 0; + 320: 4501 li a0,0 +} + 322: 6422 ld s0,8(sp) + 324: 0141 addi sp,sp,16 + 326: 8082 ret + return 0; + 328: 4501 li a0,0 + 32a: bfe5 j 322 <strchr+0x1a> + +000000000000032c <gets>: + +char* +gets(char *buf, int max) +{ + 32c: 711d addi sp,sp,-96 + 32e: ec86 sd ra,88(sp) + 330: e8a2 sd s0,80(sp) + 332: e4a6 sd s1,72(sp) + 334: e0ca sd s2,64(sp) + 336: fc4e sd s3,56(sp) + 338: f852 sd s4,48(sp) + 33a: f456 sd s5,40(sp) + 33c: f05a sd s6,32(sp) + 33e: ec5e sd s7,24(sp) + 340: 1080 addi s0,sp,96 + 342: 8baa mv s7,a0 + 344: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 346: 892a mv s2,a0 + 348: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 34a: 4aa9 li s5,10 + 34c: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 34e: 89a6 mv s3,s1 + 350: 2485 addiw s1,s1,1 + 352: 0344d663 bge s1,s4,37e <gets+0x52> + cc = read(0, &c, 1); + 356: 4605 li a2,1 + 358: faf40593 addi a1,s0,-81 + 35c: 4501 li a0,0 + 35e: 186000ef jal ra,4e4 <read> + if(cc < 1) + 362: 00a05e63 blez a0,37e <gets+0x52> + buf[i++] = c; + 366: faf44783 lbu a5,-81(s0) + 36a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 36e: 01578763 beq a5,s5,37c <gets+0x50> + 372: 0905 addi s2,s2,1 + 374: fd679de3 bne a5,s6,34e <gets+0x22> + for(i=0; i+1 < max; ){ + 378: 89a6 mv s3,s1 + 37a: a011 j 37e <gets+0x52> + 37c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 37e: 99de add s3,s3,s7 + 380: 00098023 sb zero,0(s3) + return buf; +} + 384: 855e mv a0,s7 + 386: 60e6 ld ra,88(sp) + 388: 6446 ld s0,80(sp) + 38a: 64a6 ld s1,72(sp) + 38c: 6906 ld s2,64(sp) + 38e: 79e2 ld s3,56(sp) + 390: 7a42 ld s4,48(sp) + 392: 7aa2 ld s5,40(sp) + 394: 7b02 ld s6,32(sp) + 396: 6be2 ld s7,24(sp) + 398: 6125 addi sp,sp,96 + 39a: 8082 ret + +000000000000039c <stat>: + +int +stat(const char *n, struct stat *st) +{ + 39c: 1101 addi sp,sp,-32 + 39e: ec06 sd ra,24(sp) + 3a0: e822 sd s0,16(sp) + 3a2: e426 sd s1,8(sp) + 3a4: e04a sd s2,0(sp) + 3a6: 1000 addi s0,sp,32 + 3a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 3aa: 4581 li a1,0 + 3ac: 160000ef jal ra,50c <open> + if(fd < 0) + 3b0: 02054163 bltz a0,3d2 <stat+0x36> + 3b4: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3b6: 85ca mv a1,s2 + 3b8: 16c000ef jal ra,524 <fstat> + 3bc: 892a mv s2,a0 + close(fd); + 3be: 8526 mv a0,s1 + 3c0: 134000ef jal ra,4f4 <close> + return r; +} + 3c4: 854a mv a0,s2 + 3c6: 60e2 ld ra,24(sp) + 3c8: 6442 ld s0,16(sp) + 3ca: 64a2 ld s1,8(sp) + 3cc: 6902 ld s2,0(sp) + 3ce: 6105 addi sp,sp,32 + 3d0: 8082 ret + return -1; + 3d2: 597d li s2,-1 + 3d4: bfc5 j 3c4 <stat+0x28> + +00000000000003d6 <atoi>: + +int +atoi(const char *s) +{ + 3d6: 1141 addi sp,sp,-16 + 3d8: e422 sd s0,8(sp) + 3da: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3dc: 00054683 lbu a3,0(a0) + 3e0: fd06879b addiw a5,a3,-48 + 3e4: 0ff7f793 zext.b a5,a5 + 3e8: 4625 li a2,9 + 3ea: 02f66863 bltu a2,a5,41a <atoi+0x44> + 3ee: 872a mv a4,a0 + n = 0; + 3f0: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3f2: 0705 addi a4,a4,1 + 3f4: 0025179b slliw a5,a0,0x2 + 3f8: 9fa9 addw a5,a5,a0 + 3fa: 0017979b slliw a5,a5,0x1 + 3fe: 9fb5 addw a5,a5,a3 + 400: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 404: 00074683 lbu a3,0(a4) + 408: fd06879b addiw a5,a3,-48 + 40c: 0ff7f793 zext.b a5,a5 + 410: fef671e3 bgeu a2,a5,3f2 <atoi+0x1c> + return n; +} + 414: 6422 ld s0,8(sp) + 416: 0141 addi sp,sp,16 + 418: 8082 ret + n = 0; + 41a: 4501 li a0,0 + 41c: bfe5 j 414 <atoi+0x3e> + +000000000000041e <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 41e: 1141 addi sp,sp,-16 + 420: e422 sd s0,8(sp) + 422: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 424: 02b57463 bgeu a0,a1,44c <memmove+0x2e> + while(n-- > 0) + 428: 00c05f63 blez a2,446 <memmove+0x28> + 42c: 1602 slli a2,a2,0x20 + 42e: 9201 srli a2,a2,0x20 + 430: 00c507b3 add a5,a0,a2 + dst = vdst; + 434: 872a mv a4,a0 + *dst++ = *src++; + 436: 0585 addi a1,a1,1 + 438: 0705 addi a4,a4,1 + 43a: fff5c683 lbu a3,-1(a1) + 43e: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 442: fee79ae3 bne a5,a4,436 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 446: 6422 ld s0,8(sp) + 448: 0141 addi sp,sp,16 + 44a: 8082 ret + dst += n; + 44c: 00c50733 add a4,a0,a2 + src += n; + 450: 95b2 add a1,a1,a2 + while(n-- > 0) + 452: fec05ae3 blez a2,446 <memmove+0x28> + 456: fff6079b addiw a5,a2,-1 + 45a: 1782 slli a5,a5,0x20 + 45c: 9381 srli a5,a5,0x20 + 45e: fff7c793 not a5,a5 + 462: 97ba add a5,a5,a4 + *--dst = *--src; + 464: 15fd addi a1,a1,-1 + 466: 177d addi a4,a4,-1 + 468: 0005c683 lbu a3,0(a1) + 46c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 470: fee79ae3 bne a5,a4,464 <memmove+0x46> + 474: bfc9 j 446 <memmove+0x28> + +0000000000000476 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 476: 1141 addi sp,sp,-16 + 478: e422 sd s0,8(sp) + 47a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 47c: ca05 beqz a2,4ac <memcmp+0x36> + 47e: fff6069b addiw a3,a2,-1 + 482: 1682 slli a3,a3,0x20 + 484: 9281 srli a3,a3,0x20 + 486: 0685 addi a3,a3,1 + 488: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 48a: 00054783 lbu a5,0(a0) + 48e: 0005c703 lbu a4,0(a1) + 492: 00e79863 bne a5,a4,4a2 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 496: 0505 addi a0,a0,1 + p2++; + 498: 0585 addi a1,a1,1 + while (n-- > 0) { + 49a: fed518e3 bne a0,a3,48a <memcmp+0x14> + } + return 0; + 49e: 4501 li a0,0 + 4a0: a019 j 4a6 <memcmp+0x30> + return *p1 - *p2; + 4a2: 40e7853b subw a0,a5,a4 +} + 4a6: 6422 ld s0,8(sp) + 4a8: 0141 addi sp,sp,16 + 4aa: 8082 ret + return 0; + 4ac: 4501 li a0,0 + 4ae: bfe5 j 4a6 <memcmp+0x30> + +00000000000004b0 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4b0: 1141 addi sp,sp,-16 + 4b2: e406 sd ra,8(sp) + 4b4: e022 sd s0,0(sp) + 4b6: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4b8: f67ff0ef jal ra,41e <memmove> +} + 4bc: 60a2 ld ra,8(sp) + 4be: 6402 ld s0,0(sp) + 4c0: 0141 addi sp,sp,16 + 4c2: 8082 ret + +00000000000004c4 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4c4: 4885 li a7,1 + ecall + 4c6: 00000073 ecall + ret + 4ca: 8082 ret + +00000000000004cc <exit>: +.global exit +exit: + li a7, SYS_exit + 4cc: 4889 li a7,2 + ecall + 4ce: 00000073 ecall + ret + 4d2: 8082 ret + +00000000000004d4 <wait>: +.global wait +wait: + li a7, SYS_wait + 4d4: 488d li a7,3 + ecall + 4d6: 00000073 ecall + ret + 4da: 8082 ret + +00000000000004dc <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 4dc: 4891 li a7,4 + ecall + 4de: 00000073 ecall + ret + 4e2: 8082 ret + +00000000000004e4 <read>: +.global read +read: + li a7, SYS_read + 4e4: 4895 li a7,5 + ecall + 4e6: 00000073 ecall + ret + 4ea: 8082 ret + +00000000000004ec <write>: +.global write +write: + li a7, SYS_write + 4ec: 48c1 li a7,16 + ecall + 4ee: 00000073 ecall + ret + 4f2: 8082 ret + +00000000000004f4 <close>: +.global close +close: + li a7, SYS_close + 4f4: 48d5 li a7,21 + ecall + 4f6: 00000073 ecall + ret + 4fa: 8082 ret + +00000000000004fc <kill>: +.global kill +kill: + li a7, SYS_kill + 4fc: 4899 li a7,6 + ecall + 4fe: 00000073 ecall + ret + 502: 8082 ret + +0000000000000504 <exec>: +.global exec +exec: + li a7, SYS_exec + 504: 489d li a7,7 + ecall + 506: 00000073 ecall + ret + 50a: 8082 ret + +000000000000050c <open>: +.global open +open: + li a7, SYS_open + 50c: 48bd li a7,15 + ecall + 50e: 00000073 ecall + ret + 512: 8082 ret + +0000000000000514 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 514: 48c5 li a7,17 + ecall + 516: 00000073 ecall + ret + 51a: 8082 ret + +000000000000051c <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 51c: 48c9 li a7,18 + ecall + 51e: 00000073 ecall + ret + 522: 8082 ret + +0000000000000524 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 524: 48a1 li a7,8 + ecall + 526: 00000073 ecall + ret + 52a: 8082 ret + +000000000000052c <link>: +.global link +link: + li a7, SYS_link + 52c: 48cd li a7,19 + ecall + 52e: 00000073 ecall + ret + 532: 8082 ret + +0000000000000534 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 534: 48d1 li a7,20 + ecall + 536: 00000073 ecall + ret + 53a: 8082 ret + +000000000000053c <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 53c: 48a5 li a7,9 + ecall + 53e: 00000073 ecall + ret + 542: 8082 ret + +0000000000000544 <dup>: +.global dup +dup: + li a7, SYS_dup + 544: 48a9 li a7,10 + ecall + 546: 00000073 ecall + ret + 54a: 8082 ret + +000000000000054c <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 54c: 48ad li a7,11 + ecall + 54e: 00000073 ecall + ret + 552: 8082 ret + +0000000000000554 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 554: 48b1 li a7,12 + ecall + 556: 00000073 ecall + ret + 55a: 8082 ret + +000000000000055c <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 55c: 48b5 li a7,13 + ecall + 55e: 00000073 ecall + ret + 562: 8082 ret + +0000000000000564 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 564: 48b9 li a7,14 + ecall + 566: 00000073 ecall + ret + 56a: 8082 ret + +000000000000056c <trace>: +.global trace +trace: + li a7, SYS_trace + 56c: 48d9 li a7,22 + ecall + 56e: 00000073 ecall + ret + 572: 8082 ret + +0000000000000574 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 574: 48dd li a7,23 + ecall + 576: 00000073 ecall + ret + 57a: 8082 ret + +000000000000057c <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 57c: 48e1 li a7,24 + ecall + 57e: 00000073 ecall + ret + 582: 8082 ret + +0000000000000584 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 584: 1101 addi sp,sp,-32 + 586: ec06 sd ra,24(sp) + 588: e822 sd s0,16(sp) + 58a: 1000 addi s0,sp,32 + 58c: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 590: 4605 li a2,1 + 592: fef40593 addi a1,s0,-17 + 596: f57ff0ef jal ra,4ec <write> +} + 59a: 60e2 ld ra,24(sp) + 59c: 6442 ld s0,16(sp) + 59e: 6105 addi sp,sp,32 + 5a0: 8082 ret + +00000000000005a2 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 5a2: 7139 addi sp,sp,-64 + 5a4: fc06 sd ra,56(sp) + 5a6: f822 sd s0,48(sp) + 5a8: f426 sd s1,40(sp) + 5aa: f04a sd s2,32(sp) + 5ac: ec4e sd s3,24(sp) + 5ae: 0080 addi s0,sp,64 + 5b0: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 5b2: c299 beqz a3,5b8 <printint+0x16> + 5b4: 0805c763 bltz a1,642 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 5b8: 2581 sext.w a1,a1 + neg = 0; + 5ba: 4881 li a7,0 + 5bc: fc040693 addi a3,s0,-64 + } + + i = 0; + 5c0: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 5c2: 2601 sext.w a2,a2 + 5c4: 00000517 auipc a0,0x0 + 5c8: 53450513 addi a0,a0,1332 # af8 <digits> + 5cc: 883a mv a6,a4 + 5ce: 2705 addiw a4,a4,1 + 5d0: 02c5f7bb remuw a5,a1,a2 + 5d4: 1782 slli a5,a5,0x20 + 5d6: 9381 srli a5,a5,0x20 + 5d8: 97aa add a5,a5,a0 + 5da: 0007c783 lbu a5,0(a5) + 5de: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 5e2: 0005879b sext.w a5,a1 + 5e6: 02c5d5bb divuw a1,a1,a2 + 5ea: 0685 addi a3,a3,1 + 5ec: fec7f0e3 bgeu a5,a2,5cc <printint+0x2a> + if(neg) + 5f0: 00088c63 beqz a7,608 <printint+0x66> + buf[i++] = '-'; + 5f4: fd070793 addi a5,a4,-48 + 5f8: 00878733 add a4,a5,s0 + 5fc: 02d00793 li a5,45 + 600: fef70823 sb a5,-16(a4) + 604: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 608: 02e05663 blez a4,634 <printint+0x92> + 60c: fc040793 addi a5,s0,-64 + 610: 00e78933 add s2,a5,a4 + 614: fff78993 addi s3,a5,-1 + 618: 99ba add s3,s3,a4 + 61a: 377d addiw a4,a4,-1 + 61c: 1702 slli a4,a4,0x20 + 61e: 9301 srli a4,a4,0x20 + 620: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 624: fff94583 lbu a1,-1(s2) + 628: 8526 mv a0,s1 + 62a: f5bff0ef jal ra,584 <putc> + while(--i >= 0) + 62e: 197d addi s2,s2,-1 + 630: ff391ae3 bne s2,s3,624 <printint+0x82> +} + 634: 70e2 ld ra,56(sp) + 636: 7442 ld s0,48(sp) + 638: 74a2 ld s1,40(sp) + 63a: 7902 ld s2,32(sp) + 63c: 69e2 ld s3,24(sp) + 63e: 6121 addi sp,sp,64 + 640: 8082 ret + x = -xx; + 642: 40b005bb negw a1,a1 + neg = 1; + 646: 4885 li a7,1 + x = -xx; + 648: bf95 j 5bc <printint+0x1a> + +000000000000064a <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 64a: 7119 addi sp,sp,-128 + 64c: fc86 sd ra,120(sp) + 64e: f8a2 sd s0,112(sp) + 650: f4a6 sd s1,104(sp) + 652: f0ca sd s2,96(sp) + 654: ecce sd s3,88(sp) + 656: e8d2 sd s4,80(sp) + 658: e4d6 sd s5,72(sp) + 65a: e0da sd s6,64(sp) + 65c: fc5e sd s7,56(sp) + 65e: f862 sd s8,48(sp) + 660: f466 sd s9,40(sp) + 662: f06a sd s10,32(sp) + 664: ec6e sd s11,24(sp) + 666: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 668: 0005c903 lbu s2,0(a1) + 66c: 22090e63 beqz s2,8a8 <vprintf+0x25e> + 670: 8b2a mv s6,a0 + 672: 8a2e mv s4,a1 + 674: 8bb2 mv s7,a2 + state = 0; + 676: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 678: 4481 li s1,0 + 67a: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 67c: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 680: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 684: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 688: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 68c: 00000c97 auipc s9,0x0 + 690: 46cc8c93 addi s9,s9,1132 # af8 <digits> + 694: a005 j 6b4 <vprintf+0x6a> + putc(fd, c0); + 696: 85ca mv a1,s2 + 698: 855a mv a0,s6 + 69a: eebff0ef jal ra,584 <putc> + 69e: a019 j 6a4 <vprintf+0x5a> + } else if(state == '%'){ + 6a0: 03598263 beq s3,s5,6c4 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 6a4: 2485 addiw s1,s1,1 + 6a6: 8726 mv a4,s1 + 6a8: 009a07b3 add a5,s4,s1 + 6ac: 0007c903 lbu s2,0(a5) + 6b0: 1e090c63 beqz s2,8a8 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 6b4: 0009079b sext.w a5,s2 + if(state == 0){ + 6b8: fe0994e3 bnez s3,6a0 <vprintf+0x56> + if(c0 == '%'){ + 6bc: fd579de3 bne a5,s5,696 <vprintf+0x4c> + state = '%'; + 6c0: 89be mv s3,a5 + 6c2: b7cd j 6a4 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 6c4: cfa5 beqz a5,73c <vprintf+0xf2> + 6c6: 00ea06b3 add a3,s4,a4 + 6ca: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6ce: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6d0: c681 beqz a3,6d8 <vprintf+0x8e> + 6d2: 9752 add a4,a4,s4 + 6d4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6d8: 03878a63 beq a5,s8,70c <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 6dc: 05a78463 beq a5,s10,724 <vprintf+0xda> + } else if(c0 == 'u'){ + 6e0: 0db78763 beq a5,s11,7ae <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6e4: 07800713 li a4,120 + 6e8: 10e78963 beq a5,a4,7fa <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 6ec: 07000713 li a4,112 + 6f0: 12e78e63 beq a5,a4,82c <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 6f4: 07300713 li a4,115 + 6f8: 16e78b63 beq a5,a4,86e <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 6fc: 05579063 bne a5,s5,73c <vprintf+0xf2> + putc(fd, '%'); + 700: 85d6 mv a1,s5 + 702: 855a mv a0,s6 + 704: e81ff0ef jal ra,584 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 708: 4981 li s3,0 + 70a: bf69 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 70c: 008b8913 addi s2,s7,8 + 710: 4685 li a3,1 + 712: 4629 li a2,10 + 714: 000ba583 lw a1,0(s7) + 718: 855a mv a0,s6 + 71a: e89ff0ef jal ra,5a2 <printint> + 71e: 8bca mv s7,s2 + state = 0; + 720: 4981 li s3,0 + 722: b749 j 6a4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 724: 03868663 beq a3,s8,750 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 728: 05a68163 beq a3,s10,76a <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 72c: 09b68d63 beq a3,s11,7c6 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 730: 03a68f63 beq a3,s10,76e <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 734: 07800793 li a5,120 + 738: 0cf68d63 beq a3,a5,812 <vprintf+0x1c8> + putc(fd, '%'); + 73c: 85d6 mv a1,s5 + 73e: 855a mv a0,s6 + 740: e45ff0ef jal ra,584 <putc> + putc(fd, c0); + 744: 85ca mv a1,s2 + 746: 855a mv a0,s6 + 748: e3dff0ef jal ra,584 <putc> + state = 0; + 74c: 4981 li s3,0 + 74e: bf99 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 750: 008b8913 addi s2,s7,8 + 754: 4685 li a3,1 + 756: 4629 li a2,10 + 758: 000ba583 lw a1,0(s7) + 75c: 855a mv a0,s6 + 75e: e45ff0ef jal ra,5a2 <printint> + i += 1; + 762: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 764: 8bca mv s7,s2 + state = 0; + 766: 4981 li s3,0 + i += 1; + 768: bf35 j 6a4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 76a: 03860563 beq a2,s8,794 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 76e: 07b60963 beq a2,s11,7e0 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 772: 07800793 li a5,120 + 776: fcf613e3 bne a2,a5,73c <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 77a: 008b8913 addi s2,s7,8 + 77e: 4681 li a3,0 + 780: 4641 li a2,16 + 782: 000ba583 lw a1,0(s7) + 786: 855a mv a0,s6 + 788: e1bff0ef jal ra,5a2 <printint> + i += 2; + 78c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 78e: 8bca mv s7,s2 + state = 0; + 790: 4981 li s3,0 + i += 2; + 792: bf09 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 794: 008b8913 addi s2,s7,8 + 798: 4685 li a3,1 + 79a: 4629 li a2,10 + 79c: 000ba583 lw a1,0(s7) + 7a0: 855a mv a0,s6 + 7a2: e01ff0ef jal ra,5a2 <printint> + i += 2; + 7a6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 7a8: 8bca mv s7,s2 + state = 0; + 7aa: 4981 li s3,0 + i += 2; + 7ac: bde5 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 7ae: 008b8913 addi s2,s7,8 + 7b2: 4681 li a3,0 + 7b4: 4629 li a2,10 + 7b6: 000ba583 lw a1,0(s7) + 7ba: 855a mv a0,s6 + 7bc: de7ff0ef jal ra,5a2 <printint> + 7c0: 8bca mv s7,s2 + state = 0; + 7c2: 4981 li s3,0 + 7c4: b5c5 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 7c6: 008b8913 addi s2,s7,8 + 7ca: 4681 li a3,0 + 7cc: 4629 li a2,10 + 7ce: 000ba583 lw a1,0(s7) + 7d2: 855a mv a0,s6 + 7d4: dcfff0ef jal ra,5a2 <printint> + i += 1; + 7d8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 7da: 8bca mv s7,s2 + state = 0; + 7dc: 4981 li s3,0 + i += 1; + 7de: b5d9 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 7e0: 008b8913 addi s2,s7,8 + 7e4: 4681 li a3,0 + 7e6: 4629 li a2,10 + 7e8: 000ba583 lw a1,0(s7) + 7ec: 855a mv a0,s6 + 7ee: db5ff0ef jal ra,5a2 <printint> + i += 2; + 7f2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 7f4: 8bca mv s7,s2 + state = 0; + 7f6: 4981 li s3,0 + i += 2; + 7f8: b575 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 7fa: 008b8913 addi s2,s7,8 + 7fe: 4681 li a3,0 + 800: 4641 li a2,16 + 802: 000ba583 lw a1,0(s7) + 806: 855a mv a0,s6 + 808: d9bff0ef jal ra,5a2 <printint> + 80c: 8bca mv s7,s2 + state = 0; + 80e: 4981 li s3,0 + 810: bd51 j 6a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 812: 008b8913 addi s2,s7,8 + 816: 4681 li a3,0 + 818: 4641 li a2,16 + 81a: 000ba583 lw a1,0(s7) + 81e: 855a mv a0,s6 + 820: d83ff0ef jal ra,5a2 <printint> + i += 1; + 824: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 826: 8bca mv s7,s2 + state = 0; + 828: 4981 li s3,0 + i += 1; + 82a: bdad j 6a4 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 82c: 008b8793 addi a5,s7,8 + 830: f8f43423 sd a5,-120(s0) + 834: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 838: 03000593 li a1,48 + 83c: 855a mv a0,s6 + 83e: d47ff0ef jal ra,584 <putc> + putc(fd, 'x'); + 842: 07800593 li a1,120 + 846: 855a mv a0,s6 + 848: d3dff0ef jal ra,584 <putc> + 84c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 84e: 03c9d793 srli a5,s3,0x3c + 852: 97e6 add a5,a5,s9 + 854: 0007c583 lbu a1,0(a5) + 858: 855a mv a0,s6 + 85a: d2bff0ef jal ra,584 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 85e: 0992 slli s3,s3,0x4 + 860: 397d addiw s2,s2,-1 + 862: fe0916e3 bnez s2,84e <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 866: f8843b83 ld s7,-120(s0) + state = 0; + 86a: 4981 li s3,0 + 86c: bd25 j 6a4 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 86e: 008b8993 addi s3,s7,8 + 872: 000bb903 ld s2,0(s7) + 876: 00090f63 beqz s2,894 <vprintf+0x24a> + for(; *s; s++) + 87a: 00094583 lbu a1,0(s2) + 87e: c195 beqz a1,8a2 <vprintf+0x258> + putc(fd, *s); + 880: 855a mv a0,s6 + 882: d03ff0ef jal ra,584 <putc> + for(; *s; s++) + 886: 0905 addi s2,s2,1 + 888: 00094583 lbu a1,0(s2) + 88c: f9f5 bnez a1,880 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 88e: 8bce mv s7,s3 + state = 0; + 890: 4981 li s3,0 + 892: bd09 j 6a4 <vprintf+0x5a> + s = "(null)"; + 894: 00000917 auipc s2,0x0 + 898: 25c90913 addi s2,s2,604 # af0 <malloc+0x14c> + for(; *s; s++) + 89c: 02800593 li a1,40 + 8a0: b7c5 j 880 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 8a2: 8bce mv s7,s3 + state = 0; + 8a4: 4981 li s3,0 + 8a6: bbfd j 6a4 <vprintf+0x5a> + } + } +} + 8a8: 70e6 ld ra,120(sp) + 8aa: 7446 ld s0,112(sp) + 8ac: 74a6 ld s1,104(sp) + 8ae: 7906 ld s2,96(sp) + 8b0: 69e6 ld s3,88(sp) + 8b2: 6a46 ld s4,80(sp) + 8b4: 6aa6 ld s5,72(sp) + 8b6: 6b06 ld s6,64(sp) + 8b8: 7be2 ld s7,56(sp) + 8ba: 7c42 ld s8,48(sp) + 8bc: 7ca2 ld s9,40(sp) + 8be: 7d02 ld s10,32(sp) + 8c0: 6de2 ld s11,24(sp) + 8c2: 6109 addi sp,sp,128 + 8c4: 8082 ret + +00000000000008c6 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 8c6: 715d addi sp,sp,-80 + 8c8: ec06 sd ra,24(sp) + 8ca: e822 sd s0,16(sp) + 8cc: 1000 addi s0,sp,32 + 8ce: e010 sd a2,0(s0) + 8d0: e414 sd a3,8(s0) + 8d2: e818 sd a4,16(s0) + 8d4: ec1c sd a5,24(s0) + 8d6: 03043023 sd a6,32(s0) + 8da: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 8de: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 8e2: 8622 mv a2,s0 + 8e4: d67ff0ef jal ra,64a <vprintf> +} + 8e8: 60e2 ld ra,24(sp) + 8ea: 6442 ld s0,16(sp) + 8ec: 6161 addi sp,sp,80 + 8ee: 8082 ret + +00000000000008f0 <printf>: + +void +printf(const char *fmt, ...) +{ + 8f0: 711d addi sp,sp,-96 + 8f2: ec06 sd ra,24(sp) + 8f4: e822 sd s0,16(sp) + 8f6: 1000 addi s0,sp,32 + 8f8: e40c sd a1,8(s0) + 8fa: e810 sd a2,16(s0) + 8fc: ec14 sd a3,24(s0) + 8fe: f018 sd a4,32(s0) + 900: f41c sd a5,40(s0) + 902: 03043823 sd a6,48(s0) + 906: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 90a: 00840613 addi a2,s0,8 + 90e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 912: 85aa mv a1,a0 + 914: 4505 li a0,1 + 916: d35ff0ef jal ra,64a <vprintf> +} + 91a: 60e2 ld ra,24(sp) + 91c: 6442 ld s0,16(sp) + 91e: 6125 addi sp,sp,96 + 920: 8082 ret + +0000000000000922 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 922: 1141 addi sp,sp,-16 + 924: e422 sd s0,8(sp) + 926: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 928: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 92c: 00000797 auipc a5,0x0 + 930: 6d47b783 ld a5,1748(a5) # 1000 <freep> + 934: a02d j 95e <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 936: 4618 lw a4,8(a2) + 938: 9f2d addw a4,a4,a1 + 93a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 93e: 6398 ld a4,0(a5) + 940: 6310 ld a2,0(a4) + 942: a83d j 980 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 944: ff852703 lw a4,-8(a0) + 948: 9f31 addw a4,a4,a2 + 94a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 94c: ff053683 ld a3,-16(a0) + 950: a091 j 994 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 952: 6398 ld a4,0(a5) + 954: 00e7e463 bltu a5,a4,95c <free+0x3a> + 958: 00e6ea63 bltu a3,a4,96c <free+0x4a> +{ + 95c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 95e: fed7fae3 bgeu a5,a3,952 <free+0x30> + 962: 6398 ld a4,0(a5) + 964: 00e6e463 bltu a3,a4,96c <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 968: fee7eae3 bltu a5,a4,95c <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 96c: ff852583 lw a1,-8(a0) + 970: 6390 ld a2,0(a5) + 972: 02059813 slli a6,a1,0x20 + 976: 01c85713 srli a4,a6,0x1c + 97a: 9736 add a4,a4,a3 + 97c: fae60de3 beq a2,a4,936 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 980: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 984: 4790 lw a2,8(a5) + 986: 02061593 slli a1,a2,0x20 + 98a: 01c5d713 srli a4,a1,0x1c + 98e: 973e add a4,a4,a5 + 990: fae68ae3 beq a3,a4,944 <free+0x22> + p->s.ptr = bp->s.ptr; + 994: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 996: 00000717 auipc a4,0x0 + 99a: 66f73523 sd a5,1642(a4) # 1000 <freep> +} + 99e: 6422 ld s0,8(sp) + 9a0: 0141 addi sp,sp,16 + 9a2: 8082 ret + +00000000000009a4 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 9a4: 7139 addi sp,sp,-64 + 9a6: fc06 sd ra,56(sp) + 9a8: f822 sd s0,48(sp) + 9aa: f426 sd s1,40(sp) + 9ac: f04a sd s2,32(sp) + 9ae: ec4e sd s3,24(sp) + 9b0: e852 sd s4,16(sp) + 9b2: e456 sd s5,8(sp) + 9b4: e05a sd s6,0(sp) + 9b6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 9b8: 02051493 slli s1,a0,0x20 + 9bc: 9081 srli s1,s1,0x20 + 9be: 04bd addi s1,s1,15 + 9c0: 8091 srli s1,s1,0x4 + 9c2: 0014899b addiw s3,s1,1 + 9c6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 9c8: 00000517 auipc a0,0x0 + 9cc: 63853503 ld a0,1592(a0) # 1000 <freep> + 9d0: c515 beqz a0,9fc <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 9d2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 9d4: 4798 lw a4,8(a5) + 9d6: 02977f63 bgeu a4,s1,a14 <malloc+0x70> + 9da: 8a4e mv s4,s3 + 9dc: 0009871b sext.w a4,s3 + 9e0: 6685 lui a3,0x1 + 9e2: 00d77363 bgeu a4,a3,9e8 <malloc+0x44> + 9e6: 6a05 lui s4,0x1 + 9e8: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 9ec: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 9f0: 00000917 auipc s2,0x0 + 9f4: 61090913 addi s2,s2,1552 # 1000 <freep> + if(p == (char*)-1) + 9f8: 5afd li s5,-1 + 9fa: a885 j a6a <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 9fc: 00000797 auipc a5,0x0 + a00: 62478793 addi a5,a5,1572 # 1020 <base> + a04: 00000717 auipc a4,0x0 + a08: 5ef73e23 sd a5,1532(a4) # 1000 <freep> + a0c: e39c sd a5,0(a5) + base.s.size = 0; + a0e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + a12: b7e1 j 9da <malloc+0x36> + if(p->s.size == nunits) + a14: 02e48c63 beq s1,a4,a4c <malloc+0xa8> + p->s.size -= nunits; + a18: 4137073b subw a4,a4,s3 + a1c: c798 sw a4,8(a5) + p += p->s.size; + a1e: 02071693 slli a3,a4,0x20 + a22: 01c6d713 srli a4,a3,0x1c + a26: 97ba add a5,a5,a4 + p->s.size = nunits; + a28: 0137a423 sw s3,8(a5) + freep = prevp; + a2c: 00000717 auipc a4,0x0 + a30: 5ca73a23 sd a0,1492(a4) # 1000 <freep> + return (void*)(p + 1); + a34: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + a38: 70e2 ld ra,56(sp) + a3a: 7442 ld s0,48(sp) + a3c: 74a2 ld s1,40(sp) + a3e: 7902 ld s2,32(sp) + a40: 69e2 ld s3,24(sp) + a42: 6a42 ld s4,16(sp) + a44: 6aa2 ld s5,8(sp) + a46: 6b02 ld s6,0(sp) + a48: 6121 addi sp,sp,64 + a4a: 8082 ret + prevp->s.ptr = p->s.ptr; + a4c: 6398 ld a4,0(a5) + a4e: e118 sd a4,0(a0) + a50: bff1 j a2c <malloc+0x88> + hp->s.size = nu; + a52: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a56: 0541 addi a0,a0,16 + a58: ecbff0ef jal ra,922 <free> + return freep; + a5c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a60: dd61 beqz a0,a38 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a62: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a64: 4798 lw a4,8(a5) + a66: fa9777e3 bgeu a4,s1,a14 <malloc+0x70> + if(p == freep) + a6a: 00093703 ld a4,0(s2) + a6e: 853e mv a0,a5 + a70: fef719e3 bne a4,a5,a62 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + a74: 8552 mv a0,s4 + a76: adfff0ef jal ra,554 <sbrk> + if(p == (char*)-1) + a7a: fd551ce3 bne a0,s5,a52 <malloc+0xae> + return 0; + a7e: 4501 li a0,0 + a80: bf65 j a38 <malloc+0x94> diff --git a/user/ls.d b/user/ls.d new file mode 100644 index 0000000000000000000000000000000000000000..b4d3215abbd9f3a2a6ab5d3753efb8a306f66610 --- /dev/null +++ b/user/ls.d @@ -0,0 +1,2 @@ +user/ls.o: user/ls.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h kernel/fs.h kernel/fcntl.h diff --git a/user/ls.o b/user/ls.o new file mode 100644 index 0000000000000000000000000000000000000000..b2864e7bac8ab81580e6373b331d1aac3113e20d Binary files /dev/null and b/user/ls.o differ diff --git a/user/ls.sym b/user/ls.sym new file mode 100644 index 0000000000000000000000000000000000000000..74a06cc0335522127428a2c3321b6a5b824d5ce6 --- /dev/null +++ b/user/ls.sym @@ -0,0 +1,69 @@ +0000000000000000 .text +0000000000000a88 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 ls.c +0000000000001010 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000584 putc +00000000000005a2 printint +0000000000000af8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001020 base +0000000000000274 strcpy +0000000000000000 fmtname +00000000000008f0 printf +000000000000041e memmove +0000000000000514 mknod +000000000000056c trace +000000000000032c gets +000000000000054c getpid +00000000000004b0 memcpy +00000000000009a4 malloc +000000000000055c sleep +0000000000000574 mycall +00000000000004dc pipe +00000000000004ec write +0000000000000524 fstat +00000000000008c6 fprintf +00000000000004fc kill +000000000000064a vprintf +000000000000053c chdir +0000000000000504 exec +00000000000004d4 wait +00000000000004e4 read +000000000000051c unlink +0000000000000476 memcmp +00000000000004c4 fork +0000000000000554 sbrk +0000000000000564 uptime +00000000000002e6 memset +0000000000000218 main +000000000000057c GSCinfo +0000000000000290 strcmp +0000000000000544 dup +000000000000039c stat +000000000000052c link +0000000000000098 ls +00000000000004cc exit +0000000000000262 start +00000000000003d6 atoi +00000000000002bc strlen +000000000000050c open +0000000000000308 strchr +0000000000000534 mkdir +00000000000004f4 close +0000000000000922 free diff --git a/user/mkdir.asm b/user/mkdir.asm new file mode 100644 index 0000000000000000000000000000000000000000..3a79b6198180fef02431a0ae2afd4c65212a0805 --- /dev/null +++ b/user/mkdir.asm @@ -0,0 +1,1486 @@ + +user/_mkdir: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: 1800 addi s0,sp,48 + int i; + + if(argc < 2){ + e: 4785 li a5,1 + 10: 02a7d563 bge a5,a0,3a <main+0x3a> + 14: 00858493 addi s1,a1,8 + 18: ffe5091b addiw s2,a0,-2 + 1c: 02091793 slli a5,s2,0x20 + 20: 01d7d913 srli s2,a5,0x1d + 24: 05c1 addi a1,a1,16 + 26: 992e add s2,s2,a1 + fprintf(2, "Usage: mkdir files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(mkdir(argv[i]) < 0){ + 28: 6088 ld a0,0(s1) + 2a: 30c000ef jal ra,336 <mkdir> + 2e: 02054063 bltz a0,4e <main+0x4e> + for(i = 1; i < argc; i++){ + 32: 04a1 addi s1,s1,8 + 34: ff249ae3 bne s1,s2,28 <main+0x28> + 38: a01d j 5e <main+0x5e> + fprintf(2, "Usage: mkdir files...\n"); + 3a: 00001597 auipc a1,0x1 + 3e: 85658593 addi a1,a1,-1962 # 890 <malloc+0xea> + 42: 4509 li a0,2 + 44: 684000ef jal ra,6c8 <fprintf> + exit(1); + 48: 4505 li a0,1 + 4a: 284000ef jal ra,2ce <exit> + fprintf(2, "mkdir: %s failed to create\n", argv[i]); + 4e: 6090 ld a2,0(s1) + 50: 00001597 auipc a1,0x1 + 54: 85858593 addi a1,a1,-1960 # 8a8 <malloc+0x102> + 58: 4509 li a0,2 + 5a: 66e000ef jal ra,6c8 <fprintf> + break; + } + } + + exit(0); + 5e: 4501 li a0,0 + 60: 26e000ef jal ra,2ce <exit> + +0000000000000064 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 64: 1141 addi sp,sp,-16 + 66: e406 sd ra,8(sp) + 68: e022 sd s0,0(sp) + 6a: 0800 addi s0,sp,16 + extern int main(); + main(); + 6c: f95ff0ef jal ra,0 <main> + exit(0); + 70: 4501 li a0,0 + 72: 25c000ef jal ra,2ce <exit> + +0000000000000076 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e <strcpy+0x8> + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 <strcmp+0x1e> + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 <strcmp+0x1e> + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e <strcmp+0xc> + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be <strlen>: + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 <strlen+0x26> + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 4685 li a3,1 + d0: 9e89 subw a3,a3,a0 + d2: 00f6853b addw a0,a3,a5 + d6: 0785 addi a5,a5,1 + d8: fff7c703 lbu a4,-1(a5) + dc: fb7d bnez a4,d2 <strlen+0x14> + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de <strlen+0x20> + +00000000000000e8 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 <memset+0x1c> + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa <memset+0x12> + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a <strchr>: + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a <strchr+0x20> + if(*s == c) + 116: 00f58763 beq a1,a5,124 <strchr+0x1a> + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 <strchr+0xc> + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 <strchr+0x1a> + +000000000000012e <gets>: + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 <gets+0x52> + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 186000ef jal ra,2e6 <read> + if(cc < 1) + 164: 00a05e63 blez a0,180 <gets+0x52> + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e <gets+0x50> + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 <gets+0x22> + for(i=0; i+1 < max; ){ + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 <gets+0x52> + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e <stat>: + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e426 sd s1,8(sp) + 1a6: e04a sd s2,0(sp) + 1a8: 1000 addi s0,sp,32 + 1aa: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1ac: 4581 li a1,0 + 1ae: 160000ef jal ra,30e <open> + if(fd < 0) + 1b2: 02054163 bltz a0,1d4 <stat+0x36> + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 16c000ef jal ra,326 <fstat> + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 134000ef jal ra,2f6 <close> + return r; +} + 1c6: 854a mv a0,s2 + 1c8: 60e2 ld ra,24(sp) + 1ca: 6442 ld s0,16(sp) + 1cc: 64a2 ld s1,8(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfc5 j 1c6 <stat+0x28> + +00000000000001d8 <atoi>: + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c <atoi+0x44> + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 <atoi+0x1c> + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 <atoi+0x3e> + +0000000000000220 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e <memmove+0x2e> + while(n-- > 0) + 22a: 00c05f63 blez a2,248 <memmove+0x28> + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fee79ae3 bne a5,a4,238 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 <memmove+0x28> + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 <memmove+0x46> + 276: bfc9 j 248 <memmove+0x28> + +0000000000000278 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae <memcmp+0x36> + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c <memcmp+0x14> + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 <memcmp+0x30> + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 <memcmp+0x30> + +00000000000002b2 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal ra,220 <memmove> +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2c6: 4885 li a7,1 + ecall + 2c8: 00000073 ecall + ret + 2cc: 8082 ret + +00000000000002ce <exit>: +.global exit +exit: + li a7, SYS_exit + 2ce: 4889 li a7,2 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 <wait>: +.global wait +wait: + li a7, SYS_wait + 2d6: 488d li a7,3 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2de: 4891 li a7,4 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 <read>: +.global read +read: + li a7, SYS_read + 2e6: 4895 li a7,5 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee <write>: +.global write +write: + li a7, SYS_write + 2ee: 48c1 li a7,16 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 <close>: +.global close +close: + li a7, SYS_close + 2f6: 48d5 li a7,21 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe <kill>: +.global kill +kill: + li a7, SYS_kill + 2fe: 4899 li a7,6 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 <exec>: +.global exec +exec: + li a7, SYS_exec + 306: 489d li a7,7 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e <open>: +.global open +open: + li a7, SYS_open + 30e: 48bd li a7,15 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 316: 48c5 li a7,17 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 31e: 48c9 li a7,18 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 326: 48a1 li a7,8 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e <link>: +.global link +link: + li a7, SYS_link + 32e: 48cd li a7,19 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 336: 48d1 li a7,20 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 33e: 48a5 li a7,9 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 <dup>: +.global dup +dup: + li a7, SYS_dup + 346: 48a9 li a7,10 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 34e: 48ad li a7,11 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 356: 48b1 li a7,12 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 35e: 48b5 li a7,13 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 366: 48b9 li a7,14 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e <trace>: +.global trace +trace: + li a7, SYS_trace + 36e: 48d9 li a7,22 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 376: 48dd li a7,23 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 37e: 48e1 li a7,24 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 386: 1101 addi sp,sp,-32 + 388: ec06 sd ra,24(sp) + 38a: e822 sd s0,16(sp) + 38c: 1000 addi s0,sp,32 + 38e: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 392: 4605 li a2,1 + 394: fef40593 addi a1,s0,-17 + 398: f57ff0ef jal ra,2ee <write> +} + 39c: 60e2 ld ra,24(sp) + 39e: 6442 ld s0,16(sp) + 3a0: 6105 addi sp,sp,32 + 3a2: 8082 ret + +00000000000003a4 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3a4: 7139 addi sp,sp,-64 + 3a6: fc06 sd ra,56(sp) + 3a8: f822 sd s0,48(sp) + 3aa: f426 sd s1,40(sp) + 3ac: f04a sd s2,32(sp) + 3ae: ec4e sd s3,24(sp) + 3b0: 0080 addi s0,sp,64 + 3b2: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3b4: c299 beqz a3,3ba <printint+0x16> + 3b6: 0805c763 bltz a1,444 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3ba: 2581 sext.w a1,a1 + neg = 0; + 3bc: 4881 li a7,0 + 3be: fc040693 addi a3,s0,-64 + } + + i = 0; + 3c2: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3c4: 2601 sext.w a2,a2 + 3c6: 00000517 auipc a0,0x0 + 3ca: 50a50513 addi a0,a0,1290 # 8d0 <digits> + 3ce: 883a mv a6,a4 + 3d0: 2705 addiw a4,a4,1 + 3d2: 02c5f7bb remuw a5,a1,a2 + 3d6: 1782 slli a5,a5,0x20 + 3d8: 9381 srli a5,a5,0x20 + 3da: 97aa add a5,a5,a0 + 3dc: 0007c783 lbu a5,0(a5) + 3e0: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3e4: 0005879b sext.w a5,a1 + 3e8: 02c5d5bb divuw a1,a1,a2 + 3ec: 0685 addi a3,a3,1 + 3ee: fec7f0e3 bgeu a5,a2,3ce <printint+0x2a> + if(neg) + 3f2: 00088c63 beqz a7,40a <printint+0x66> + buf[i++] = '-'; + 3f6: fd070793 addi a5,a4,-48 + 3fa: 00878733 add a4,a5,s0 + 3fe: 02d00793 li a5,45 + 402: fef70823 sb a5,-16(a4) + 406: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 40a: 02e05663 blez a4,436 <printint+0x92> + 40e: fc040793 addi a5,s0,-64 + 412: 00e78933 add s2,a5,a4 + 416: fff78993 addi s3,a5,-1 + 41a: 99ba add s3,s3,a4 + 41c: 377d addiw a4,a4,-1 + 41e: 1702 slli a4,a4,0x20 + 420: 9301 srli a4,a4,0x20 + 422: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 426: fff94583 lbu a1,-1(s2) + 42a: 8526 mv a0,s1 + 42c: f5bff0ef jal ra,386 <putc> + while(--i >= 0) + 430: 197d addi s2,s2,-1 + 432: ff391ae3 bne s2,s3,426 <printint+0x82> +} + 436: 70e2 ld ra,56(sp) + 438: 7442 ld s0,48(sp) + 43a: 74a2 ld s1,40(sp) + 43c: 7902 ld s2,32(sp) + 43e: 69e2 ld s3,24(sp) + 440: 6121 addi sp,sp,64 + 442: 8082 ret + x = -xx; + 444: 40b005bb negw a1,a1 + neg = 1; + 448: 4885 li a7,1 + x = -xx; + 44a: bf95 j 3be <printint+0x1a> + +000000000000044c <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 44c: 7119 addi sp,sp,-128 + 44e: fc86 sd ra,120(sp) + 450: f8a2 sd s0,112(sp) + 452: f4a6 sd s1,104(sp) + 454: f0ca sd s2,96(sp) + 456: ecce sd s3,88(sp) + 458: e8d2 sd s4,80(sp) + 45a: e4d6 sd s5,72(sp) + 45c: e0da sd s6,64(sp) + 45e: fc5e sd s7,56(sp) + 460: f862 sd s8,48(sp) + 462: f466 sd s9,40(sp) + 464: f06a sd s10,32(sp) + 466: ec6e sd s11,24(sp) + 468: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 46a: 0005c903 lbu s2,0(a1) + 46e: 22090e63 beqz s2,6aa <vprintf+0x25e> + 472: 8b2a mv s6,a0 + 474: 8a2e mv s4,a1 + 476: 8bb2 mv s7,a2 + state = 0; + 478: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 47a: 4481 li s1,0 + 47c: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 47e: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 482: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 486: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 48a: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 48e: 00000c97 auipc s9,0x0 + 492: 442c8c93 addi s9,s9,1090 # 8d0 <digits> + 496: a005 j 4b6 <vprintf+0x6a> + putc(fd, c0); + 498: 85ca mv a1,s2 + 49a: 855a mv a0,s6 + 49c: eebff0ef jal ra,386 <putc> + 4a0: a019 j 4a6 <vprintf+0x5a> + } else if(state == '%'){ + 4a2: 03598263 beq s3,s5,4c6 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4a6: 2485 addiw s1,s1,1 + 4a8: 8726 mv a4,s1 + 4aa: 009a07b3 add a5,s4,s1 + 4ae: 0007c903 lbu s2,0(a5) + 4b2: 1e090c63 beqz s2,6aa <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4b6: 0009079b sext.w a5,s2 + if(state == 0){ + 4ba: fe0994e3 bnez s3,4a2 <vprintf+0x56> + if(c0 == '%'){ + 4be: fd579de3 bne a5,s5,498 <vprintf+0x4c> + state = '%'; + 4c2: 89be mv s3,a5 + 4c4: b7cd j 4a6 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4c6: cfa5 beqz a5,53e <vprintf+0xf2> + 4c8: 00ea06b3 add a3,s4,a4 + 4cc: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4d0: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4d2: c681 beqz a3,4da <vprintf+0x8e> + 4d4: 9752 add a4,a4,s4 + 4d6: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4da: 03878a63 beq a5,s8,50e <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4de: 05a78463 beq a5,s10,526 <vprintf+0xda> + } else if(c0 == 'u'){ + 4e2: 0db78763 beq a5,s11,5b0 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e6: 07800713 li a4,120 + 4ea: 10e78963 beq a5,a4,5fc <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4ee: 07000713 li a4,112 + 4f2: 12e78e63 beq a5,a4,62e <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4f6: 07300713 li a4,115 + 4fa: 16e78b63 beq a5,a4,670 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4fe: 05579063 bne a5,s5,53e <vprintf+0xf2> + putc(fd, '%'); + 502: 85d6 mv a1,s5 + 504: 855a mv a0,s6 + 506: e81ff0ef jal ra,386 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 50a: 4981 li s3,0 + 50c: bf69 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 50e: 008b8913 addi s2,s7,8 + 512: 4685 li a3,1 + 514: 4629 li a2,10 + 516: 000ba583 lw a1,0(s7) + 51a: 855a mv a0,s6 + 51c: e89ff0ef jal ra,3a4 <printint> + 520: 8bca mv s7,s2 + state = 0; + 522: 4981 li s3,0 + 524: b749 j 4a6 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 526: 03868663 beq a3,s8,552 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 52a: 05a68163 beq a3,s10,56c <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 52e: 09b68d63 beq a3,s11,5c8 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 532: 03a68f63 beq a3,s10,570 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 536: 07800793 li a5,120 + 53a: 0cf68d63 beq a3,a5,614 <vprintf+0x1c8> + putc(fd, '%'); + 53e: 85d6 mv a1,s5 + 540: 855a mv a0,s6 + 542: e45ff0ef jal ra,386 <putc> + putc(fd, c0); + 546: 85ca mv a1,s2 + 548: 855a mv a0,s6 + 54a: e3dff0ef jal ra,386 <putc> + state = 0; + 54e: 4981 li s3,0 + 550: bf99 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 552: 008b8913 addi s2,s7,8 + 556: 4685 li a3,1 + 558: 4629 li a2,10 + 55a: 000ba583 lw a1,0(s7) + 55e: 855a mv a0,s6 + 560: e45ff0ef jal ra,3a4 <printint> + i += 1; + 564: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 566: 8bca mv s7,s2 + state = 0; + 568: 4981 li s3,0 + i += 1; + 56a: bf35 j 4a6 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 56c: 03860563 beq a2,s8,596 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 570: 07b60963 beq a2,s11,5e2 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 574: 07800793 li a5,120 + 578: fcf613e3 bne a2,a5,53e <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 57c: 008b8913 addi s2,s7,8 + 580: 4681 li a3,0 + 582: 4641 li a2,16 + 584: 000ba583 lw a1,0(s7) + 588: 855a mv a0,s6 + 58a: e1bff0ef jal ra,3a4 <printint> + i += 2; + 58e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 590: 8bca mv s7,s2 + state = 0; + 592: 4981 li s3,0 + i += 2; + 594: bf09 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 596: 008b8913 addi s2,s7,8 + 59a: 4685 li a3,1 + 59c: 4629 li a2,10 + 59e: 000ba583 lw a1,0(s7) + 5a2: 855a mv a0,s6 + 5a4: e01ff0ef jal ra,3a4 <printint> + i += 2; + 5a8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + i += 2; + 5ae: bde5 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4681 li a3,0 + 5b6: 4629 li a2,10 + 5b8: 000ba583 lw a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: de7ff0ef jal ra,3a4 <printint> + 5c2: 8bca mv s7,s2 + state = 0; + 5c4: 4981 li s3,0 + 5c6: b5c5 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5c8: 008b8913 addi s2,s7,8 + 5cc: 4681 li a3,0 + 5ce: 4629 li a2,10 + 5d0: 000ba583 lw a1,0(s7) + 5d4: 855a mv a0,s6 + 5d6: dcfff0ef jal ra,3a4 <printint> + i += 1; + 5da: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + i += 1; + 5e0: b5d9 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000ba583 lw a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: db5ff0ef jal ra,3a4 <printint> + i += 2; + 5f4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + i += 2; + 5fa: b575 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4641 li a2,16 + 604: 000ba583 lw a1,0(s7) + 608: 855a mv a0,s6 + 60a: d9bff0ef jal ra,3a4 <printint> + 60e: 8bca mv s7,s2 + state = 0; + 610: 4981 li s3,0 + 612: bd51 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 614: 008b8913 addi s2,s7,8 + 618: 4681 li a3,0 + 61a: 4641 li a2,16 + 61c: 000ba583 lw a1,0(s7) + 620: 855a mv a0,s6 + 622: d83ff0ef jal ra,3a4 <printint> + i += 1; + 626: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + i += 1; + 62c: bdad j 4a6 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 62e: 008b8793 addi a5,s7,8 + 632: f8f43423 sd a5,-120(s0) + 636: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 63a: 03000593 li a1,48 + 63e: 855a mv a0,s6 + 640: d47ff0ef jal ra,386 <putc> + putc(fd, 'x'); + 644: 07800593 li a1,120 + 648: 855a mv a0,s6 + 64a: d3dff0ef jal ra,386 <putc> + 64e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 650: 03c9d793 srli a5,s3,0x3c + 654: 97e6 add a5,a5,s9 + 656: 0007c583 lbu a1,0(a5) + 65a: 855a mv a0,s6 + 65c: d2bff0ef jal ra,386 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 660: 0992 slli s3,s3,0x4 + 662: 397d addiw s2,s2,-1 + 664: fe0916e3 bnez s2,650 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 668: f8843b83 ld s7,-120(s0) + state = 0; + 66c: 4981 li s3,0 + 66e: bd25 j 4a6 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 670: 008b8993 addi s3,s7,8 + 674: 000bb903 ld s2,0(s7) + 678: 00090f63 beqz s2,696 <vprintf+0x24a> + for(; *s; s++) + 67c: 00094583 lbu a1,0(s2) + 680: c195 beqz a1,6a4 <vprintf+0x258> + putc(fd, *s); + 682: 855a mv a0,s6 + 684: d03ff0ef jal ra,386 <putc> + for(; *s; s++) + 688: 0905 addi s2,s2,1 + 68a: 00094583 lbu a1,0(s2) + 68e: f9f5 bnez a1,682 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 690: 8bce mv s7,s3 + state = 0; + 692: 4981 li s3,0 + 694: bd09 j 4a6 <vprintf+0x5a> + s = "(null)"; + 696: 00000917 auipc s2,0x0 + 69a: 23290913 addi s2,s2,562 # 8c8 <malloc+0x122> + for(; *s; s++) + 69e: 02800593 li a1,40 + 6a2: b7c5 j 682 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6a4: 8bce mv s7,s3 + state = 0; + 6a6: 4981 li s3,0 + 6a8: bbfd j 4a6 <vprintf+0x5a> + } + } +} + 6aa: 70e6 ld ra,120(sp) + 6ac: 7446 ld s0,112(sp) + 6ae: 74a6 ld s1,104(sp) + 6b0: 7906 ld s2,96(sp) + 6b2: 69e6 ld s3,88(sp) + 6b4: 6a46 ld s4,80(sp) + 6b6: 6aa6 ld s5,72(sp) + 6b8: 6b06 ld s6,64(sp) + 6ba: 7be2 ld s7,56(sp) + 6bc: 7c42 ld s8,48(sp) + 6be: 7ca2 ld s9,40(sp) + 6c0: 7d02 ld s10,32(sp) + 6c2: 6de2 ld s11,24(sp) + 6c4: 6109 addi sp,sp,128 + 6c6: 8082 ret + +00000000000006c8 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6c8: 715d addi sp,sp,-80 + 6ca: ec06 sd ra,24(sp) + 6cc: e822 sd s0,16(sp) + 6ce: 1000 addi s0,sp,32 + 6d0: e010 sd a2,0(s0) + 6d2: e414 sd a3,8(s0) + 6d4: e818 sd a4,16(s0) + 6d6: ec1c sd a5,24(s0) + 6d8: 03043023 sd a6,32(s0) + 6dc: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6e0: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6e4: 8622 mv a2,s0 + 6e6: d67ff0ef jal ra,44c <vprintf> +} + 6ea: 60e2 ld ra,24(sp) + 6ec: 6442 ld s0,16(sp) + 6ee: 6161 addi sp,sp,80 + 6f0: 8082 ret + +00000000000006f2 <printf>: + +void +printf(const char *fmt, ...) +{ + 6f2: 711d addi sp,sp,-96 + 6f4: ec06 sd ra,24(sp) + 6f6: e822 sd s0,16(sp) + 6f8: 1000 addi s0,sp,32 + 6fa: e40c sd a1,8(s0) + 6fc: e810 sd a2,16(s0) + 6fe: ec14 sd a3,24(s0) + 700: f018 sd a4,32(s0) + 702: f41c sd a5,40(s0) + 704: 03043823 sd a6,48(s0) + 708: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 70c: 00840613 addi a2,s0,8 + 710: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 714: 85aa mv a1,a0 + 716: 4505 li a0,1 + 718: d35ff0ef jal ra,44c <vprintf> +} + 71c: 60e2 ld ra,24(sp) + 71e: 6442 ld s0,16(sp) + 720: 6125 addi sp,sp,96 + 722: 8082 ret + +0000000000000724 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 724: 1141 addi sp,sp,-16 + 726: e422 sd s0,8(sp) + 728: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 72a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 72e: 00001797 auipc a5,0x1 + 732: 8d27b783 ld a5,-1838(a5) # 1000 <freep> + 736: a02d j 760 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 738: 4618 lw a4,8(a2) + 73a: 9f2d addw a4,a4,a1 + 73c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 740: 6398 ld a4,0(a5) + 742: 6310 ld a2,0(a4) + 744: a83d j 782 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 746: ff852703 lw a4,-8(a0) + 74a: 9f31 addw a4,a4,a2 + 74c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 74e: ff053683 ld a3,-16(a0) + 752: a091 j 796 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 754: 6398 ld a4,0(a5) + 756: 00e7e463 bltu a5,a4,75e <free+0x3a> + 75a: 00e6ea63 bltu a3,a4,76e <free+0x4a> +{ + 75e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 760: fed7fae3 bgeu a5,a3,754 <free+0x30> + 764: 6398 ld a4,0(a5) + 766: 00e6e463 bltu a3,a4,76e <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 76a: fee7eae3 bltu a5,a4,75e <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 76e: ff852583 lw a1,-8(a0) + 772: 6390 ld a2,0(a5) + 774: 02059813 slli a6,a1,0x20 + 778: 01c85713 srli a4,a6,0x1c + 77c: 9736 add a4,a4,a3 + 77e: fae60de3 beq a2,a4,738 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 782: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 786: 4790 lw a2,8(a5) + 788: 02061593 slli a1,a2,0x20 + 78c: 01c5d713 srli a4,a1,0x1c + 790: 973e add a4,a4,a5 + 792: fae68ae3 beq a3,a4,746 <free+0x22> + p->s.ptr = bp->s.ptr; + 796: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 798: 00001717 auipc a4,0x1 + 79c: 86f73423 sd a5,-1944(a4) # 1000 <freep> +} + 7a0: 6422 ld s0,8(sp) + 7a2: 0141 addi sp,sp,16 + 7a4: 8082 ret + +00000000000007a6 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7a6: 7139 addi sp,sp,-64 + 7a8: fc06 sd ra,56(sp) + 7aa: f822 sd s0,48(sp) + 7ac: f426 sd s1,40(sp) + 7ae: f04a sd s2,32(sp) + 7b0: ec4e sd s3,24(sp) + 7b2: e852 sd s4,16(sp) + 7b4: e456 sd s5,8(sp) + 7b6: e05a sd s6,0(sp) + 7b8: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7ba: 02051493 slli s1,a0,0x20 + 7be: 9081 srli s1,s1,0x20 + 7c0: 04bd addi s1,s1,15 + 7c2: 8091 srli s1,s1,0x4 + 7c4: 0014899b addiw s3,s1,1 + 7c8: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7ca: 00001517 auipc a0,0x1 + 7ce: 83653503 ld a0,-1994(a0) # 1000 <freep> + 7d2: c515 beqz a0,7fe <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7d4: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7d6: 4798 lw a4,8(a5) + 7d8: 02977f63 bgeu a4,s1,816 <malloc+0x70> + 7dc: 8a4e mv s4,s3 + 7de: 0009871b sext.w a4,s3 + 7e2: 6685 lui a3,0x1 + 7e4: 00d77363 bgeu a4,a3,7ea <malloc+0x44> + 7e8: 6a05 lui s4,0x1 + 7ea: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7ee: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7f2: 00001917 auipc s2,0x1 + 7f6: 80e90913 addi s2,s2,-2034 # 1000 <freep> + if(p == (char*)-1) + 7fa: 5afd li s5,-1 + 7fc: a885 j 86c <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7fe: 00001797 auipc a5,0x1 + 802: 81278793 addi a5,a5,-2030 # 1010 <base> + 806: 00000717 auipc a4,0x0 + 80a: 7ef73d23 sd a5,2042(a4) # 1000 <freep> + 80e: e39c sd a5,0(a5) + base.s.size = 0; + 810: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 814: b7e1 j 7dc <malloc+0x36> + if(p->s.size == nunits) + 816: 02e48c63 beq s1,a4,84e <malloc+0xa8> + p->s.size -= nunits; + 81a: 4137073b subw a4,a4,s3 + 81e: c798 sw a4,8(a5) + p += p->s.size; + 820: 02071693 slli a3,a4,0x20 + 824: 01c6d713 srli a4,a3,0x1c + 828: 97ba add a5,a5,a4 + p->s.size = nunits; + 82a: 0137a423 sw s3,8(a5) + freep = prevp; + 82e: 00000717 auipc a4,0x0 + 832: 7ca73923 sd a0,2002(a4) # 1000 <freep> + return (void*)(p + 1); + 836: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 83a: 70e2 ld ra,56(sp) + 83c: 7442 ld s0,48(sp) + 83e: 74a2 ld s1,40(sp) + 840: 7902 ld s2,32(sp) + 842: 69e2 ld s3,24(sp) + 844: 6a42 ld s4,16(sp) + 846: 6aa2 ld s5,8(sp) + 848: 6b02 ld s6,0(sp) + 84a: 6121 addi sp,sp,64 + 84c: 8082 ret + prevp->s.ptr = p->s.ptr; + 84e: 6398 ld a4,0(a5) + 850: e118 sd a4,0(a0) + 852: bff1 j 82e <malloc+0x88> + hp->s.size = nu; + 854: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 858: 0541 addi a0,a0,16 + 85a: ecbff0ef jal ra,724 <free> + return freep; + 85e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 862: dd61 beqz a0,83a <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 864: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 866: 4798 lw a4,8(a5) + 868: fa9777e3 bgeu a4,s1,816 <malloc+0x70> + if(p == freep) + 86c: 00093703 ld a4,0(s2) + 870: 853e mv a0,a5 + 872: fef719e3 bne a4,a5,864 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 876: 8552 mv a0,s4 + 878: adfff0ef jal ra,356 <sbrk> + if(p == (char*)-1) + 87c: fd551ce3 bne a0,s5,854 <malloc+0xae> + return 0; + 880: 4501 li a0,0 + 882: bf65 j 83a <malloc+0x94> diff --git a/user/mkdir.d b/user/mkdir.d new file mode 100644 index 0000000000000000000000000000000000000000..6adcdb1c3c02e63fd73864c8b09a78504fbf2a7d --- /dev/null +++ b/user/mkdir.d @@ -0,0 +1,2 @@ +user/mkdir.o: user/mkdir.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/mkdir.o b/user/mkdir.o new file mode 100644 index 0000000000000000000000000000000000000000..4938f1bc1c470b73e10dccc73fa8c92148e94e4c Binary files /dev/null and b/user/mkdir.o differ diff --git a/user/mkdir.sym b/user/mkdir.sym new file mode 100644 index 0000000000000000000000000000000000000000..6e0c24b13aff68d46822d46de3bb60bf6d41ea72 --- /dev/null +++ b/user/mkdir.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000888 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 mkdir.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000386 putc +00000000000003a4 printint +00000000000008d0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +00000000000006f2 printf +0000000000000220 memmove +0000000000000316 mknod +000000000000036e trace +000000000000012e gets +000000000000034e getpid +00000000000002b2 memcpy +00000000000007a6 malloc +000000000000035e sleep +0000000000000376 mycall +00000000000002de pipe +00000000000002ee write +0000000000000326 fstat +00000000000006c8 fprintf +00000000000002fe kill +000000000000044c vprintf +000000000000033e chdir +0000000000000306 exec +00000000000002d6 wait +00000000000002e6 read +000000000000031e unlink +0000000000000278 memcmp +00000000000002c6 fork +0000000000000356 sbrk +0000000000000366 uptime +00000000000000e8 memset +0000000000000000 main +000000000000037e GSCinfo +0000000000000092 strcmp +0000000000000346 dup +000000000000019e stat +000000000000032e link +00000000000002ce exit +0000000000000064 start +00000000000001d8 atoi +00000000000000be strlen +000000000000030e open +000000000000010a strchr +0000000000000336 mkdir +00000000000002f6 close +0000000000000724 free diff --git a/user/printf.d b/user/printf.d new file mode 100644 index 0000000000000000000000000000000000000000..d093b35b366895c6080936e29f46a57756390f58 --- /dev/null +++ b/user/printf.d @@ -0,0 +1,3 @@ +user/printf.o: user/printf.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h \ + /usr/lib/gcc-cross/riscv64-linux-gnu/11/include/stdarg.h diff --git a/user/printf.o b/user/printf.o new file mode 100644 index 0000000000000000000000000000000000000000..1804c8be781a9f6067e88f6614a35fdee60ed276 Binary files /dev/null and b/user/printf.o differ diff --git a/user/rm.asm b/user/rm.asm new file mode 100644 index 0000000000000000000000000000000000000000..1b7d6f946af22a7c47b122340ac5370937b23636 --- /dev/null +++ b/user/rm.asm @@ -0,0 +1,1486 @@ + +user/_rm: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 0: 7179 addi sp,sp,-48 + 2: f406 sd ra,40(sp) + 4: f022 sd s0,32(sp) + 6: ec26 sd s1,24(sp) + 8: e84a sd s2,16(sp) + a: e44e sd s3,8(sp) + c: 1800 addi s0,sp,48 + int i; + + if(argc < 2){ + e: 4785 li a5,1 + 10: 02a7d563 bge a5,a0,3a <main+0x3a> + 14: 00858493 addi s1,a1,8 + 18: ffe5091b addiw s2,a0,-2 + 1c: 02091793 slli a5,s2,0x20 + 20: 01d7d913 srli s2,a5,0x1d + 24: 05c1 addi a1,a1,16 + 26: 992e add s2,s2,a1 + fprintf(2, "Usage: rm files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(unlink(argv[i]) < 0){ + 28: 6088 ld a0,0(s1) + 2a: 2f4000ef jal ra,31e <unlink> + 2e: 02054063 bltz a0,4e <main+0x4e> + for(i = 1; i < argc; i++){ + 32: 04a1 addi s1,s1,8 + 34: ff249ae3 bne s1,s2,28 <main+0x28> + 38: a01d j 5e <main+0x5e> + fprintf(2, "Usage: rm files...\n"); + 3a: 00001597 auipc a1,0x1 + 3e: 85658593 addi a1,a1,-1962 # 890 <malloc+0xea> + 42: 4509 li a0,2 + 44: 684000ef jal ra,6c8 <fprintf> + exit(1); + 48: 4505 li a0,1 + 4a: 284000ef jal ra,2ce <exit> + fprintf(2, "rm: %s failed to delete\n", argv[i]); + 4e: 6090 ld a2,0(s1) + 50: 00001597 auipc a1,0x1 + 54: 85858593 addi a1,a1,-1960 # 8a8 <malloc+0x102> + 58: 4509 li a0,2 + 5a: 66e000ef jal ra,6c8 <fprintf> + break; + } + } + + exit(0); + 5e: 4501 li a0,0 + 60: 26e000ef jal ra,2ce <exit> + +0000000000000064 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 64: 1141 addi sp,sp,-16 + 66: e406 sd ra,8(sp) + 68: e022 sd s0,0(sp) + 6a: 0800 addi s0,sp,16 + extern int main(); + main(); + 6c: f95ff0ef jal ra,0 <main> + exit(0); + 70: 4501 li a0,0 + 72: 25c000ef jal ra,2ce <exit> + +0000000000000076 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e <strcpy+0x8> + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 <strcmp+0x1e> + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 <strcmp+0x1e> + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e <strcmp+0xc> + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be <strlen>: + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 <strlen+0x26> + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 4685 li a3,1 + d0: 9e89 subw a3,a3,a0 + d2: 00f6853b addw a0,a3,a5 + d6: 0785 addi a5,a5,1 + d8: fff7c703 lbu a4,-1(a5) + dc: fb7d bnez a4,d2 <strlen+0x14> + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de <strlen+0x20> + +00000000000000e8 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 <memset+0x1c> + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa <memset+0x12> + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a <strchr>: + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a <strchr+0x20> + if(*s == c) + 116: 00f58763 beq a1,a5,124 <strchr+0x1a> + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 <strchr+0xc> + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 <strchr+0x1a> + +000000000000012e <gets>: + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 <gets+0x52> + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 186000ef jal ra,2e6 <read> + if(cc < 1) + 164: 00a05e63 blez a0,180 <gets+0x52> + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e <gets+0x50> + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 <gets+0x22> + for(i=0; i+1 < max; ){ + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 <gets+0x52> + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e <stat>: + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e426 sd s1,8(sp) + 1a6: e04a sd s2,0(sp) + 1a8: 1000 addi s0,sp,32 + 1aa: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1ac: 4581 li a1,0 + 1ae: 160000ef jal ra,30e <open> + if(fd < 0) + 1b2: 02054163 bltz a0,1d4 <stat+0x36> + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 16c000ef jal ra,326 <fstat> + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 134000ef jal ra,2f6 <close> + return r; +} + 1c6: 854a mv a0,s2 + 1c8: 60e2 ld ra,24(sp) + 1ca: 6442 ld s0,16(sp) + 1cc: 64a2 ld s1,8(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfc5 j 1c6 <stat+0x28> + +00000000000001d8 <atoi>: + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c <atoi+0x44> + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 <atoi+0x1c> + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 <atoi+0x3e> + +0000000000000220 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e <memmove+0x2e> + while(n-- > 0) + 22a: 00c05f63 blez a2,248 <memmove+0x28> + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fee79ae3 bne a5,a4,238 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 <memmove+0x28> + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 <memmove+0x46> + 276: bfc9 j 248 <memmove+0x28> + +0000000000000278 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae <memcmp+0x36> + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c <memcmp+0x14> + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 <memcmp+0x30> + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 <memcmp+0x30> + +00000000000002b2 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal ra,220 <memmove> +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2c6: 4885 li a7,1 + ecall + 2c8: 00000073 ecall + ret + 2cc: 8082 ret + +00000000000002ce <exit>: +.global exit +exit: + li a7, SYS_exit + 2ce: 4889 li a7,2 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 <wait>: +.global wait +wait: + li a7, SYS_wait + 2d6: 488d li a7,3 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2de: 4891 li a7,4 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 <read>: +.global read +read: + li a7, SYS_read + 2e6: 4895 li a7,5 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee <write>: +.global write +write: + li a7, SYS_write + 2ee: 48c1 li a7,16 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 <close>: +.global close +close: + li a7, SYS_close + 2f6: 48d5 li a7,21 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe <kill>: +.global kill +kill: + li a7, SYS_kill + 2fe: 4899 li a7,6 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 <exec>: +.global exec +exec: + li a7, SYS_exec + 306: 489d li a7,7 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e <open>: +.global open +open: + li a7, SYS_open + 30e: 48bd li a7,15 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 316: 48c5 li a7,17 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 31e: 48c9 li a7,18 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 326: 48a1 li a7,8 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e <link>: +.global link +link: + li a7, SYS_link + 32e: 48cd li a7,19 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 336: 48d1 li a7,20 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 33e: 48a5 li a7,9 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 <dup>: +.global dup +dup: + li a7, SYS_dup + 346: 48a9 li a7,10 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 34e: 48ad li a7,11 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 356: 48b1 li a7,12 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 35e: 48b5 li a7,13 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 366: 48b9 li a7,14 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e <trace>: +.global trace +trace: + li a7, SYS_trace + 36e: 48d9 li a7,22 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 376: 48dd li a7,23 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 37e: 48e1 li a7,24 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 386: 1101 addi sp,sp,-32 + 388: ec06 sd ra,24(sp) + 38a: e822 sd s0,16(sp) + 38c: 1000 addi s0,sp,32 + 38e: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 392: 4605 li a2,1 + 394: fef40593 addi a1,s0,-17 + 398: f57ff0ef jal ra,2ee <write> +} + 39c: 60e2 ld ra,24(sp) + 39e: 6442 ld s0,16(sp) + 3a0: 6105 addi sp,sp,32 + 3a2: 8082 ret + +00000000000003a4 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3a4: 7139 addi sp,sp,-64 + 3a6: fc06 sd ra,56(sp) + 3a8: f822 sd s0,48(sp) + 3aa: f426 sd s1,40(sp) + 3ac: f04a sd s2,32(sp) + 3ae: ec4e sd s3,24(sp) + 3b0: 0080 addi s0,sp,64 + 3b2: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3b4: c299 beqz a3,3ba <printint+0x16> + 3b6: 0805c763 bltz a1,444 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3ba: 2581 sext.w a1,a1 + neg = 0; + 3bc: 4881 li a7,0 + 3be: fc040693 addi a3,s0,-64 + } + + i = 0; + 3c2: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3c4: 2601 sext.w a2,a2 + 3c6: 00000517 auipc a0,0x0 + 3ca: 50a50513 addi a0,a0,1290 # 8d0 <digits> + 3ce: 883a mv a6,a4 + 3d0: 2705 addiw a4,a4,1 + 3d2: 02c5f7bb remuw a5,a1,a2 + 3d6: 1782 slli a5,a5,0x20 + 3d8: 9381 srli a5,a5,0x20 + 3da: 97aa add a5,a5,a0 + 3dc: 0007c783 lbu a5,0(a5) + 3e0: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3e4: 0005879b sext.w a5,a1 + 3e8: 02c5d5bb divuw a1,a1,a2 + 3ec: 0685 addi a3,a3,1 + 3ee: fec7f0e3 bgeu a5,a2,3ce <printint+0x2a> + if(neg) + 3f2: 00088c63 beqz a7,40a <printint+0x66> + buf[i++] = '-'; + 3f6: fd070793 addi a5,a4,-48 + 3fa: 00878733 add a4,a5,s0 + 3fe: 02d00793 li a5,45 + 402: fef70823 sb a5,-16(a4) + 406: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 40a: 02e05663 blez a4,436 <printint+0x92> + 40e: fc040793 addi a5,s0,-64 + 412: 00e78933 add s2,a5,a4 + 416: fff78993 addi s3,a5,-1 + 41a: 99ba add s3,s3,a4 + 41c: 377d addiw a4,a4,-1 + 41e: 1702 slli a4,a4,0x20 + 420: 9301 srli a4,a4,0x20 + 422: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 426: fff94583 lbu a1,-1(s2) + 42a: 8526 mv a0,s1 + 42c: f5bff0ef jal ra,386 <putc> + while(--i >= 0) + 430: 197d addi s2,s2,-1 + 432: ff391ae3 bne s2,s3,426 <printint+0x82> +} + 436: 70e2 ld ra,56(sp) + 438: 7442 ld s0,48(sp) + 43a: 74a2 ld s1,40(sp) + 43c: 7902 ld s2,32(sp) + 43e: 69e2 ld s3,24(sp) + 440: 6121 addi sp,sp,64 + 442: 8082 ret + x = -xx; + 444: 40b005bb negw a1,a1 + neg = 1; + 448: 4885 li a7,1 + x = -xx; + 44a: bf95 j 3be <printint+0x1a> + +000000000000044c <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 44c: 7119 addi sp,sp,-128 + 44e: fc86 sd ra,120(sp) + 450: f8a2 sd s0,112(sp) + 452: f4a6 sd s1,104(sp) + 454: f0ca sd s2,96(sp) + 456: ecce sd s3,88(sp) + 458: e8d2 sd s4,80(sp) + 45a: e4d6 sd s5,72(sp) + 45c: e0da sd s6,64(sp) + 45e: fc5e sd s7,56(sp) + 460: f862 sd s8,48(sp) + 462: f466 sd s9,40(sp) + 464: f06a sd s10,32(sp) + 466: ec6e sd s11,24(sp) + 468: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 46a: 0005c903 lbu s2,0(a1) + 46e: 22090e63 beqz s2,6aa <vprintf+0x25e> + 472: 8b2a mv s6,a0 + 474: 8a2e mv s4,a1 + 476: 8bb2 mv s7,a2 + state = 0; + 478: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 47a: 4481 li s1,0 + 47c: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 47e: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 482: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 486: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 48a: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 48e: 00000c97 auipc s9,0x0 + 492: 442c8c93 addi s9,s9,1090 # 8d0 <digits> + 496: a005 j 4b6 <vprintf+0x6a> + putc(fd, c0); + 498: 85ca mv a1,s2 + 49a: 855a mv a0,s6 + 49c: eebff0ef jal ra,386 <putc> + 4a0: a019 j 4a6 <vprintf+0x5a> + } else if(state == '%'){ + 4a2: 03598263 beq s3,s5,4c6 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4a6: 2485 addiw s1,s1,1 + 4a8: 8726 mv a4,s1 + 4aa: 009a07b3 add a5,s4,s1 + 4ae: 0007c903 lbu s2,0(a5) + 4b2: 1e090c63 beqz s2,6aa <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4b6: 0009079b sext.w a5,s2 + if(state == 0){ + 4ba: fe0994e3 bnez s3,4a2 <vprintf+0x56> + if(c0 == '%'){ + 4be: fd579de3 bne a5,s5,498 <vprintf+0x4c> + state = '%'; + 4c2: 89be mv s3,a5 + 4c4: b7cd j 4a6 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4c6: cfa5 beqz a5,53e <vprintf+0xf2> + 4c8: 00ea06b3 add a3,s4,a4 + 4cc: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4d0: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4d2: c681 beqz a3,4da <vprintf+0x8e> + 4d4: 9752 add a4,a4,s4 + 4d6: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4da: 03878a63 beq a5,s8,50e <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4de: 05a78463 beq a5,s10,526 <vprintf+0xda> + } else if(c0 == 'u'){ + 4e2: 0db78763 beq a5,s11,5b0 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e6: 07800713 li a4,120 + 4ea: 10e78963 beq a5,a4,5fc <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4ee: 07000713 li a4,112 + 4f2: 12e78e63 beq a5,a4,62e <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4f6: 07300713 li a4,115 + 4fa: 16e78b63 beq a5,a4,670 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4fe: 05579063 bne a5,s5,53e <vprintf+0xf2> + putc(fd, '%'); + 502: 85d6 mv a1,s5 + 504: 855a mv a0,s6 + 506: e81ff0ef jal ra,386 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 50a: 4981 li s3,0 + 50c: bf69 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 50e: 008b8913 addi s2,s7,8 + 512: 4685 li a3,1 + 514: 4629 li a2,10 + 516: 000ba583 lw a1,0(s7) + 51a: 855a mv a0,s6 + 51c: e89ff0ef jal ra,3a4 <printint> + 520: 8bca mv s7,s2 + state = 0; + 522: 4981 li s3,0 + 524: b749 j 4a6 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 526: 03868663 beq a3,s8,552 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 52a: 05a68163 beq a3,s10,56c <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 52e: 09b68d63 beq a3,s11,5c8 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 532: 03a68f63 beq a3,s10,570 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 536: 07800793 li a5,120 + 53a: 0cf68d63 beq a3,a5,614 <vprintf+0x1c8> + putc(fd, '%'); + 53e: 85d6 mv a1,s5 + 540: 855a mv a0,s6 + 542: e45ff0ef jal ra,386 <putc> + putc(fd, c0); + 546: 85ca mv a1,s2 + 548: 855a mv a0,s6 + 54a: e3dff0ef jal ra,386 <putc> + state = 0; + 54e: 4981 li s3,0 + 550: bf99 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 552: 008b8913 addi s2,s7,8 + 556: 4685 li a3,1 + 558: 4629 li a2,10 + 55a: 000ba583 lw a1,0(s7) + 55e: 855a mv a0,s6 + 560: e45ff0ef jal ra,3a4 <printint> + i += 1; + 564: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 566: 8bca mv s7,s2 + state = 0; + 568: 4981 li s3,0 + i += 1; + 56a: bf35 j 4a6 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 56c: 03860563 beq a2,s8,596 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 570: 07b60963 beq a2,s11,5e2 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 574: 07800793 li a5,120 + 578: fcf613e3 bne a2,a5,53e <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 57c: 008b8913 addi s2,s7,8 + 580: 4681 li a3,0 + 582: 4641 li a2,16 + 584: 000ba583 lw a1,0(s7) + 588: 855a mv a0,s6 + 58a: e1bff0ef jal ra,3a4 <printint> + i += 2; + 58e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 590: 8bca mv s7,s2 + state = 0; + 592: 4981 li s3,0 + i += 2; + 594: bf09 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 596: 008b8913 addi s2,s7,8 + 59a: 4685 li a3,1 + 59c: 4629 li a2,10 + 59e: 000ba583 lw a1,0(s7) + 5a2: 855a mv a0,s6 + 5a4: e01ff0ef jal ra,3a4 <printint> + i += 2; + 5a8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + i += 2; + 5ae: bde5 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4681 li a3,0 + 5b6: 4629 li a2,10 + 5b8: 000ba583 lw a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: de7ff0ef jal ra,3a4 <printint> + 5c2: 8bca mv s7,s2 + state = 0; + 5c4: 4981 li s3,0 + 5c6: b5c5 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5c8: 008b8913 addi s2,s7,8 + 5cc: 4681 li a3,0 + 5ce: 4629 li a2,10 + 5d0: 000ba583 lw a1,0(s7) + 5d4: 855a mv a0,s6 + 5d6: dcfff0ef jal ra,3a4 <printint> + i += 1; + 5da: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + i += 1; + 5e0: b5d9 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000ba583 lw a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: db5ff0ef jal ra,3a4 <printint> + i += 2; + 5f4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + i += 2; + 5fa: b575 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4641 li a2,16 + 604: 000ba583 lw a1,0(s7) + 608: 855a mv a0,s6 + 60a: d9bff0ef jal ra,3a4 <printint> + 60e: 8bca mv s7,s2 + state = 0; + 610: 4981 li s3,0 + 612: bd51 j 4a6 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 614: 008b8913 addi s2,s7,8 + 618: 4681 li a3,0 + 61a: 4641 li a2,16 + 61c: 000ba583 lw a1,0(s7) + 620: 855a mv a0,s6 + 622: d83ff0ef jal ra,3a4 <printint> + i += 1; + 626: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + i += 1; + 62c: bdad j 4a6 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 62e: 008b8793 addi a5,s7,8 + 632: f8f43423 sd a5,-120(s0) + 636: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 63a: 03000593 li a1,48 + 63e: 855a mv a0,s6 + 640: d47ff0ef jal ra,386 <putc> + putc(fd, 'x'); + 644: 07800593 li a1,120 + 648: 855a mv a0,s6 + 64a: d3dff0ef jal ra,386 <putc> + 64e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 650: 03c9d793 srli a5,s3,0x3c + 654: 97e6 add a5,a5,s9 + 656: 0007c583 lbu a1,0(a5) + 65a: 855a mv a0,s6 + 65c: d2bff0ef jal ra,386 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 660: 0992 slli s3,s3,0x4 + 662: 397d addiw s2,s2,-1 + 664: fe0916e3 bnez s2,650 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 668: f8843b83 ld s7,-120(s0) + state = 0; + 66c: 4981 li s3,0 + 66e: bd25 j 4a6 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 670: 008b8993 addi s3,s7,8 + 674: 000bb903 ld s2,0(s7) + 678: 00090f63 beqz s2,696 <vprintf+0x24a> + for(; *s; s++) + 67c: 00094583 lbu a1,0(s2) + 680: c195 beqz a1,6a4 <vprintf+0x258> + putc(fd, *s); + 682: 855a mv a0,s6 + 684: d03ff0ef jal ra,386 <putc> + for(; *s; s++) + 688: 0905 addi s2,s2,1 + 68a: 00094583 lbu a1,0(s2) + 68e: f9f5 bnez a1,682 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 690: 8bce mv s7,s3 + state = 0; + 692: 4981 li s3,0 + 694: bd09 j 4a6 <vprintf+0x5a> + s = "(null)"; + 696: 00000917 auipc s2,0x0 + 69a: 23290913 addi s2,s2,562 # 8c8 <malloc+0x122> + for(; *s; s++) + 69e: 02800593 li a1,40 + 6a2: b7c5 j 682 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6a4: 8bce mv s7,s3 + state = 0; + 6a6: 4981 li s3,0 + 6a8: bbfd j 4a6 <vprintf+0x5a> + } + } +} + 6aa: 70e6 ld ra,120(sp) + 6ac: 7446 ld s0,112(sp) + 6ae: 74a6 ld s1,104(sp) + 6b0: 7906 ld s2,96(sp) + 6b2: 69e6 ld s3,88(sp) + 6b4: 6a46 ld s4,80(sp) + 6b6: 6aa6 ld s5,72(sp) + 6b8: 6b06 ld s6,64(sp) + 6ba: 7be2 ld s7,56(sp) + 6bc: 7c42 ld s8,48(sp) + 6be: 7ca2 ld s9,40(sp) + 6c0: 7d02 ld s10,32(sp) + 6c2: 6de2 ld s11,24(sp) + 6c4: 6109 addi sp,sp,128 + 6c6: 8082 ret + +00000000000006c8 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6c8: 715d addi sp,sp,-80 + 6ca: ec06 sd ra,24(sp) + 6cc: e822 sd s0,16(sp) + 6ce: 1000 addi s0,sp,32 + 6d0: e010 sd a2,0(s0) + 6d2: e414 sd a3,8(s0) + 6d4: e818 sd a4,16(s0) + 6d6: ec1c sd a5,24(s0) + 6d8: 03043023 sd a6,32(s0) + 6dc: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6e0: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6e4: 8622 mv a2,s0 + 6e6: d67ff0ef jal ra,44c <vprintf> +} + 6ea: 60e2 ld ra,24(sp) + 6ec: 6442 ld s0,16(sp) + 6ee: 6161 addi sp,sp,80 + 6f0: 8082 ret + +00000000000006f2 <printf>: + +void +printf(const char *fmt, ...) +{ + 6f2: 711d addi sp,sp,-96 + 6f4: ec06 sd ra,24(sp) + 6f6: e822 sd s0,16(sp) + 6f8: 1000 addi s0,sp,32 + 6fa: e40c sd a1,8(s0) + 6fc: e810 sd a2,16(s0) + 6fe: ec14 sd a3,24(s0) + 700: f018 sd a4,32(s0) + 702: f41c sd a5,40(s0) + 704: 03043823 sd a6,48(s0) + 708: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 70c: 00840613 addi a2,s0,8 + 710: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 714: 85aa mv a1,a0 + 716: 4505 li a0,1 + 718: d35ff0ef jal ra,44c <vprintf> +} + 71c: 60e2 ld ra,24(sp) + 71e: 6442 ld s0,16(sp) + 720: 6125 addi sp,sp,96 + 722: 8082 ret + +0000000000000724 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 724: 1141 addi sp,sp,-16 + 726: e422 sd s0,8(sp) + 728: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 72a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 72e: 00001797 auipc a5,0x1 + 732: 8d27b783 ld a5,-1838(a5) # 1000 <freep> + 736: a02d j 760 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 738: 4618 lw a4,8(a2) + 73a: 9f2d addw a4,a4,a1 + 73c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 740: 6398 ld a4,0(a5) + 742: 6310 ld a2,0(a4) + 744: a83d j 782 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 746: ff852703 lw a4,-8(a0) + 74a: 9f31 addw a4,a4,a2 + 74c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 74e: ff053683 ld a3,-16(a0) + 752: a091 j 796 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 754: 6398 ld a4,0(a5) + 756: 00e7e463 bltu a5,a4,75e <free+0x3a> + 75a: 00e6ea63 bltu a3,a4,76e <free+0x4a> +{ + 75e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 760: fed7fae3 bgeu a5,a3,754 <free+0x30> + 764: 6398 ld a4,0(a5) + 766: 00e6e463 bltu a3,a4,76e <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 76a: fee7eae3 bltu a5,a4,75e <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 76e: ff852583 lw a1,-8(a0) + 772: 6390 ld a2,0(a5) + 774: 02059813 slli a6,a1,0x20 + 778: 01c85713 srli a4,a6,0x1c + 77c: 9736 add a4,a4,a3 + 77e: fae60de3 beq a2,a4,738 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 782: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 786: 4790 lw a2,8(a5) + 788: 02061593 slli a1,a2,0x20 + 78c: 01c5d713 srli a4,a1,0x1c + 790: 973e add a4,a4,a5 + 792: fae68ae3 beq a3,a4,746 <free+0x22> + p->s.ptr = bp->s.ptr; + 796: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 798: 00001717 auipc a4,0x1 + 79c: 86f73423 sd a5,-1944(a4) # 1000 <freep> +} + 7a0: 6422 ld s0,8(sp) + 7a2: 0141 addi sp,sp,16 + 7a4: 8082 ret + +00000000000007a6 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7a6: 7139 addi sp,sp,-64 + 7a8: fc06 sd ra,56(sp) + 7aa: f822 sd s0,48(sp) + 7ac: f426 sd s1,40(sp) + 7ae: f04a sd s2,32(sp) + 7b0: ec4e sd s3,24(sp) + 7b2: e852 sd s4,16(sp) + 7b4: e456 sd s5,8(sp) + 7b6: e05a sd s6,0(sp) + 7b8: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7ba: 02051493 slli s1,a0,0x20 + 7be: 9081 srli s1,s1,0x20 + 7c0: 04bd addi s1,s1,15 + 7c2: 8091 srli s1,s1,0x4 + 7c4: 0014899b addiw s3,s1,1 + 7c8: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7ca: 00001517 auipc a0,0x1 + 7ce: 83653503 ld a0,-1994(a0) # 1000 <freep> + 7d2: c515 beqz a0,7fe <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7d4: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7d6: 4798 lw a4,8(a5) + 7d8: 02977f63 bgeu a4,s1,816 <malloc+0x70> + 7dc: 8a4e mv s4,s3 + 7de: 0009871b sext.w a4,s3 + 7e2: 6685 lui a3,0x1 + 7e4: 00d77363 bgeu a4,a3,7ea <malloc+0x44> + 7e8: 6a05 lui s4,0x1 + 7ea: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7ee: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7f2: 00001917 auipc s2,0x1 + 7f6: 80e90913 addi s2,s2,-2034 # 1000 <freep> + if(p == (char*)-1) + 7fa: 5afd li s5,-1 + 7fc: a885 j 86c <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7fe: 00001797 auipc a5,0x1 + 802: 81278793 addi a5,a5,-2030 # 1010 <base> + 806: 00000717 auipc a4,0x0 + 80a: 7ef73d23 sd a5,2042(a4) # 1000 <freep> + 80e: e39c sd a5,0(a5) + base.s.size = 0; + 810: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 814: b7e1 j 7dc <malloc+0x36> + if(p->s.size == nunits) + 816: 02e48c63 beq s1,a4,84e <malloc+0xa8> + p->s.size -= nunits; + 81a: 4137073b subw a4,a4,s3 + 81e: c798 sw a4,8(a5) + p += p->s.size; + 820: 02071693 slli a3,a4,0x20 + 824: 01c6d713 srli a4,a3,0x1c + 828: 97ba add a5,a5,a4 + p->s.size = nunits; + 82a: 0137a423 sw s3,8(a5) + freep = prevp; + 82e: 00000717 auipc a4,0x0 + 832: 7ca73923 sd a0,2002(a4) # 1000 <freep> + return (void*)(p + 1); + 836: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 83a: 70e2 ld ra,56(sp) + 83c: 7442 ld s0,48(sp) + 83e: 74a2 ld s1,40(sp) + 840: 7902 ld s2,32(sp) + 842: 69e2 ld s3,24(sp) + 844: 6a42 ld s4,16(sp) + 846: 6aa2 ld s5,8(sp) + 848: 6b02 ld s6,0(sp) + 84a: 6121 addi sp,sp,64 + 84c: 8082 ret + prevp->s.ptr = p->s.ptr; + 84e: 6398 ld a4,0(a5) + 850: e118 sd a4,0(a0) + 852: bff1 j 82e <malloc+0x88> + hp->s.size = nu; + 854: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 858: 0541 addi a0,a0,16 + 85a: ecbff0ef jal ra,724 <free> + return freep; + 85e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 862: dd61 beqz a0,83a <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 864: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 866: 4798 lw a4,8(a5) + 868: fa9777e3 bgeu a4,s1,816 <malloc+0x70> + if(p == freep) + 86c: 00093703 ld a4,0(s2) + 870: 853e mv a0,a5 + 872: fef719e3 bne a4,a5,864 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 876: 8552 mv a0,s4 + 878: adfff0ef jal ra,356 <sbrk> + if(p == (char*)-1) + 87c: fd551ce3 bne a0,s5,854 <malloc+0xae> + return 0; + 880: 4501 li a0,0 + 882: bf65 j 83a <malloc+0x94> diff --git a/user/rm.d b/user/rm.d new file mode 100644 index 0000000000000000000000000000000000000000..4ccbaeaa6d69f8e5f4d304b144cc771b517674cc --- /dev/null +++ b/user/rm.d @@ -0,0 +1,2 @@ +user/rm.o: user/rm.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/rm.o b/user/rm.o new file mode 100644 index 0000000000000000000000000000000000000000..1c382468e8537c1ac907f94f532248c874138930 Binary files /dev/null and b/user/rm.o differ diff --git a/user/rm.sym b/user/rm.sym new file mode 100644 index 0000000000000000000000000000000000000000..67675224fd348652f99386f94909b07d755ecba7 --- /dev/null +++ b/user/rm.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000888 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 rm.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000386 putc +00000000000003a4 printint +00000000000008d0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +00000000000006f2 printf +0000000000000220 memmove +0000000000000316 mknod +000000000000036e trace +000000000000012e gets +000000000000034e getpid +00000000000002b2 memcpy +00000000000007a6 malloc +000000000000035e sleep +0000000000000376 mycall +00000000000002de pipe +00000000000002ee write +0000000000000326 fstat +00000000000006c8 fprintf +00000000000002fe kill +000000000000044c vprintf +000000000000033e chdir +0000000000000306 exec +00000000000002d6 wait +00000000000002e6 read +000000000000031e unlink +0000000000000278 memcmp +00000000000002c6 fork +0000000000000356 sbrk +0000000000000366 uptime +00000000000000e8 memset +0000000000000000 main +000000000000037e GSCinfo +0000000000000092 strcmp +0000000000000346 dup +000000000000019e stat +000000000000032e link +00000000000002ce exit +0000000000000064 start +00000000000001d8 atoi +00000000000000be strlen +000000000000030e open +000000000000010a strchr +0000000000000336 mkdir +00000000000002f6 close +0000000000000724 free diff --git a/user/sh.asm b/user/sh.asm new file mode 100644 index 0000000000000000000000000000000000000000..8faa6df292a1a0c958692cdca9c240b3078372cf --- /dev/null +++ b/user/sh.asm @@ -0,0 +1,2747 @@ + +user/_sh: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <getcmd>: + exit(0); +} + +int +getcmd(char *buf, int nbuf) +{ + 0: 1101 addi sp,sp,-32 + 2: ec06 sd ra,24(sp) + 4: e822 sd s0,16(sp) + 6: e426 sd s1,8(sp) + 8: e04a sd s2,0(sp) + a: 1000 addi s0,sp,32 + c: 84aa mv s1,a0 + e: 892e mv s2,a1 + write(2, "$ ", 2); + 10: 4609 li a2,2 + 12: 00001597 auipc a1,0x1 + 16: 19e58593 addi a1,a1,414 # 11b0 <malloc+0xe8> + 1a: 4509 li a0,2 + 1c: 3f5000ef jal ra,c10 <write> + memset(buf, 0, nbuf); + 20: 864a mv a2,s2 + 22: 4581 li a1,0 + 24: 8526 mv a0,s1 + 26: 1e5000ef jal ra,a0a <memset> + gets(buf, nbuf); + 2a: 85ca mv a1,s2 + 2c: 8526 mv a0,s1 + 2e: 223000ef jal ra,a50 <gets> + if(buf[0] == 0) // EOF + 32: 0004c503 lbu a0,0(s1) + 36: 00153513 seqz a0,a0 + return -1; + return 0; +} + 3a: 40a00533 neg a0,a0 + 3e: 60e2 ld ra,24(sp) + 40: 6442 ld s0,16(sp) + 42: 64a2 ld s1,8(sp) + 44: 6902 ld s2,0(sp) + 46: 6105 addi sp,sp,32 + 48: 8082 ret + +000000000000004a <panic>: + exit(0); +} + +void +panic(char *s) +{ + 4a: 1141 addi sp,sp,-16 + 4c: e406 sd ra,8(sp) + 4e: e022 sd s0,0(sp) + 50: 0800 addi s0,sp,16 + 52: 862a mv a2,a0 + fprintf(2, "%s\n", s); + 54: 00001597 auipc a1,0x1 + 58: 16458593 addi a1,a1,356 # 11b8 <malloc+0xf0> + 5c: 4509 li a0,2 + 5e: 78d000ef jal ra,fea <fprintf> + exit(1); + 62: 4505 li a0,1 + 64: 38d000ef jal ra,bf0 <exit> + +0000000000000068 <fork1>: +} + +int +fork1(void) +{ + 68: 1141 addi sp,sp,-16 + 6a: e406 sd ra,8(sp) + 6c: e022 sd s0,0(sp) + 6e: 0800 addi s0,sp,16 + int pid; + + pid = fork(); + 70: 379000ef jal ra,be8 <fork> + if(pid == -1) + 74: 57fd li a5,-1 + 76: 00f50663 beq a0,a5,82 <fork1+0x1a> + panic("fork"); + return pid; +} + 7a: 60a2 ld ra,8(sp) + 7c: 6402 ld s0,0(sp) + 7e: 0141 addi sp,sp,16 + 80: 8082 ret + panic("fork"); + 82: 00001517 auipc a0,0x1 + 86: 13e50513 addi a0,a0,318 # 11c0 <malloc+0xf8> + 8a: fc1ff0ef jal ra,4a <panic> + +000000000000008e <runcmd>: +{ + 8e: 7179 addi sp,sp,-48 + 90: f406 sd ra,40(sp) + 92: f022 sd s0,32(sp) + 94: ec26 sd s1,24(sp) + 96: 1800 addi s0,sp,48 + if(cmd == 0) + 98: c10d beqz a0,ba <runcmd+0x2c> + 9a: 84aa mv s1,a0 + switch(cmd->type){ + 9c: 4118 lw a4,0(a0) + 9e: 4795 li a5,5 + a0: 02e7e063 bltu a5,a4,c0 <runcmd+0x32> + a4: 00056783 lwu a5,0(a0) + a8: 078a slli a5,a5,0x2 + aa: 00001717 auipc a4,0x1 + ae: 21670713 addi a4,a4,534 # 12c0 <malloc+0x1f8> + b2: 97ba add a5,a5,a4 + b4: 439c lw a5,0(a5) + b6: 97ba add a5,a5,a4 + b8: 8782 jr a5 + exit(1); + ba: 4505 li a0,1 + bc: 335000ef jal ra,bf0 <exit> + panic("runcmd"); + c0: 00001517 auipc a0,0x1 + c4: 10850513 addi a0,a0,264 # 11c8 <malloc+0x100> + c8: f83ff0ef jal ra,4a <panic> + if(ecmd->argv[0] == 0) + cc: 6508 ld a0,8(a0) + ce: c105 beqz a0,ee <runcmd+0x60> + exec(ecmd->argv[0], ecmd->argv); + d0: 00848593 addi a1,s1,8 + d4: 355000ef jal ra,c28 <exec> + fprintf(2, "exec %s failed\n", ecmd->argv[0]); + d8: 6490 ld a2,8(s1) + da: 00001597 auipc a1,0x1 + de: 0f658593 addi a1,a1,246 # 11d0 <malloc+0x108> + e2: 4509 li a0,2 + e4: 707000ef jal ra,fea <fprintf> + exit(0); + e8: 4501 li a0,0 + ea: 307000ef jal ra,bf0 <exit> + exit(1); + ee: 4505 li a0,1 + f0: 301000ef jal ra,bf0 <exit> + close(rcmd->fd); + f4: 5148 lw a0,36(a0) + f6: 323000ef jal ra,c18 <close> + if(open(rcmd->file, rcmd->mode) < 0){ + fa: 508c lw a1,32(s1) + fc: 6888 ld a0,16(s1) + fe: 333000ef jal ra,c30 <open> + 102: 00054563 bltz a0,10c <runcmd+0x7e> + runcmd(rcmd->cmd); + 106: 6488 ld a0,8(s1) + 108: f87ff0ef jal ra,8e <runcmd> + fprintf(2, "open %s failed\n", rcmd->file); + 10c: 6890 ld a2,16(s1) + 10e: 00001597 auipc a1,0x1 + 112: 0d258593 addi a1,a1,210 # 11e0 <malloc+0x118> + 116: 4509 li a0,2 + 118: 6d3000ef jal ra,fea <fprintf> + exit(1); + 11c: 4505 li a0,1 + 11e: 2d3000ef jal ra,bf0 <exit> + if(fork1() == 0) + 122: f47ff0ef jal ra,68 <fork1> + 126: e501 bnez a0,12e <runcmd+0xa0> + runcmd(lcmd->left); + 128: 6488 ld a0,8(s1) + 12a: f65ff0ef jal ra,8e <runcmd> + wait(0); + 12e: 4501 li a0,0 + 130: 2c9000ef jal ra,bf8 <wait> + runcmd(lcmd->right); + 134: 6888 ld a0,16(s1) + 136: f59ff0ef jal ra,8e <runcmd> + if(pipe(p) < 0) + 13a: fd840513 addi a0,s0,-40 + 13e: 2c3000ef jal ra,c00 <pipe> + 142: 02054763 bltz a0,170 <runcmd+0xe2> + if(fork1() == 0){ + 146: f23ff0ef jal ra,68 <fork1> + 14a: e90d bnez a0,17c <runcmd+0xee> + close(1); + 14c: 4505 li a0,1 + 14e: 2cb000ef jal ra,c18 <close> + dup(p[1]); + 152: fdc42503 lw a0,-36(s0) + 156: 313000ef jal ra,c68 <dup> + close(p[0]); + 15a: fd842503 lw a0,-40(s0) + 15e: 2bb000ef jal ra,c18 <close> + close(p[1]); + 162: fdc42503 lw a0,-36(s0) + 166: 2b3000ef jal ra,c18 <close> + runcmd(pcmd->left); + 16a: 6488 ld a0,8(s1) + 16c: f23ff0ef jal ra,8e <runcmd> + panic("pipe"); + 170: 00001517 auipc a0,0x1 + 174: 08050513 addi a0,a0,128 # 11f0 <malloc+0x128> + 178: ed3ff0ef jal ra,4a <panic> + if(fork1() == 0){ + 17c: eedff0ef jal ra,68 <fork1> + 180: e115 bnez a0,1a4 <runcmd+0x116> + close(0); + 182: 297000ef jal ra,c18 <close> + dup(p[0]); + 186: fd842503 lw a0,-40(s0) + 18a: 2df000ef jal ra,c68 <dup> + close(p[0]); + 18e: fd842503 lw a0,-40(s0) + 192: 287000ef jal ra,c18 <close> + close(p[1]); + 196: fdc42503 lw a0,-36(s0) + 19a: 27f000ef jal ra,c18 <close> + runcmd(pcmd->right); + 19e: 6888 ld a0,16(s1) + 1a0: eefff0ef jal ra,8e <runcmd> + close(p[0]); + 1a4: fd842503 lw a0,-40(s0) + 1a8: 271000ef jal ra,c18 <close> + close(p[1]); + 1ac: fdc42503 lw a0,-36(s0) + 1b0: 269000ef jal ra,c18 <close> + wait(0); + 1b4: 4501 li a0,0 + 1b6: 243000ef jal ra,bf8 <wait> + wait(0); + 1ba: 4501 li a0,0 + 1bc: 23d000ef jal ra,bf8 <wait> + break; + 1c0: b725 j e8 <runcmd+0x5a> + if(fork1() == 0) + 1c2: ea7ff0ef jal ra,68 <fork1> + 1c6: f20511e3 bnez a0,e8 <runcmd+0x5a> + runcmd(bcmd->cmd); + 1ca: 6488 ld a0,8(s1) + 1cc: ec3ff0ef jal ra,8e <runcmd> + +00000000000001d0 <execcmd>: +//PAGEBREAK! +// Constructors + +struct cmd* +execcmd(void) +{ + 1d0: 1101 addi sp,sp,-32 + 1d2: ec06 sd ra,24(sp) + 1d4: e822 sd s0,16(sp) + 1d6: e426 sd s1,8(sp) + 1d8: 1000 addi s0,sp,32 + struct execcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 1da: 0a800513 li a0,168 + 1de: 6eb000ef jal ra,10c8 <malloc> + 1e2: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 1e4: 0a800613 li a2,168 + 1e8: 4581 li a1,0 + 1ea: 021000ef jal ra,a0a <memset> + cmd->type = EXEC; + 1ee: 4785 li a5,1 + 1f0: c09c sw a5,0(s1) + return (struct cmd*)cmd; +} + 1f2: 8526 mv a0,s1 + 1f4: 60e2 ld ra,24(sp) + 1f6: 6442 ld s0,16(sp) + 1f8: 64a2 ld s1,8(sp) + 1fa: 6105 addi sp,sp,32 + 1fc: 8082 ret + +00000000000001fe <redircmd>: + +struct cmd* +redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd) +{ + 1fe: 7139 addi sp,sp,-64 + 200: fc06 sd ra,56(sp) + 202: f822 sd s0,48(sp) + 204: f426 sd s1,40(sp) + 206: f04a sd s2,32(sp) + 208: ec4e sd s3,24(sp) + 20a: e852 sd s4,16(sp) + 20c: e456 sd s5,8(sp) + 20e: e05a sd s6,0(sp) + 210: 0080 addi s0,sp,64 + 212: 8b2a mv s6,a0 + 214: 8aae mv s5,a1 + 216: 8a32 mv s4,a2 + 218: 89b6 mv s3,a3 + 21a: 893a mv s2,a4 + struct redircmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 21c: 02800513 li a0,40 + 220: 6a9000ef jal ra,10c8 <malloc> + 224: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 226: 02800613 li a2,40 + 22a: 4581 li a1,0 + 22c: 7de000ef jal ra,a0a <memset> + cmd->type = REDIR; + 230: 4789 li a5,2 + 232: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 234: 0164b423 sd s6,8(s1) + cmd->file = file; + 238: 0154b823 sd s5,16(s1) + cmd->efile = efile; + 23c: 0144bc23 sd s4,24(s1) + cmd->mode = mode; + 240: 0334a023 sw s3,32(s1) + cmd->fd = fd; + 244: 0324a223 sw s2,36(s1) + return (struct cmd*)cmd; +} + 248: 8526 mv a0,s1 + 24a: 70e2 ld ra,56(sp) + 24c: 7442 ld s0,48(sp) + 24e: 74a2 ld s1,40(sp) + 250: 7902 ld s2,32(sp) + 252: 69e2 ld s3,24(sp) + 254: 6a42 ld s4,16(sp) + 256: 6aa2 ld s5,8(sp) + 258: 6b02 ld s6,0(sp) + 25a: 6121 addi sp,sp,64 + 25c: 8082 ret + +000000000000025e <pipecmd>: + +struct cmd* +pipecmd(struct cmd *left, struct cmd *right) +{ + 25e: 7179 addi sp,sp,-48 + 260: f406 sd ra,40(sp) + 262: f022 sd s0,32(sp) + 264: ec26 sd s1,24(sp) + 266: e84a sd s2,16(sp) + 268: e44e sd s3,8(sp) + 26a: 1800 addi s0,sp,48 + 26c: 89aa mv s3,a0 + 26e: 892e mv s2,a1 + struct pipecmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 270: 4561 li a0,24 + 272: 657000ef jal ra,10c8 <malloc> + 276: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 278: 4661 li a2,24 + 27a: 4581 li a1,0 + 27c: 78e000ef jal ra,a0a <memset> + cmd->type = PIPE; + 280: 478d li a5,3 + 282: c09c sw a5,0(s1) + cmd->left = left; + 284: 0134b423 sd s3,8(s1) + cmd->right = right; + 288: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 28c: 8526 mv a0,s1 + 28e: 70a2 ld ra,40(sp) + 290: 7402 ld s0,32(sp) + 292: 64e2 ld s1,24(sp) + 294: 6942 ld s2,16(sp) + 296: 69a2 ld s3,8(sp) + 298: 6145 addi sp,sp,48 + 29a: 8082 ret + +000000000000029c <listcmd>: + +struct cmd* +listcmd(struct cmd *left, struct cmd *right) +{ + 29c: 7179 addi sp,sp,-48 + 29e: f406 sd ra,40(sp) + 2a0: f022 sd s0,32(sp) + 2a2: ec26 sd s1,24(sp) + 2a4: e84a sd s2,16(sp) + 2a6: e44e sd s3,8(sp) + 2a8: 1800 addi s0,sp,48 + 2aa: 89aa mv s3,a0 + 2ac: 892e mv s2,a1 + struct listcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2ae: 4561 li a0,24 + 2b0: 619000ef jal ra,10c8 <malloc> + 2b4: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2b6: 4661 li a2,24 + 2b8: 4581 li a1,0 + 2ba: 750000ef jal ra,a0a <memset> + cmd->type = LIST; + 2be: 4791 li a5,4 + 2c0: c09c sw a5,0(s1) + cmd->left = left; + 2c2: 0134b423 sd s3,8(s1) + cmd->right = right; + 2c6: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 2ca: 8526 mv a0,s1 + 2cc: 70a2 ld ra,40(sp) + 2ce: 7402 ld s0,32(sp) + 2d0: 64e2 ld s1,24(sp) + 2d2: 6942 ld s2,16(sp) + 2d4: 69a2 ld s3,8(sp) + 2d6: 6145 addi sp,sp,48 + 2d8: 8082 ret + +00000000000002da <backcmd>: + +struct cmd* +backcmd(struct cmd *subcmd) +{ + 2da: 1101 addi sp,sp,-32 + 2dc: ec06 sd ra,24(sp) + 2de: e822 sd s0,16(sp) + 2e0: e426 sd s1,8(sp) + 2e2: e04a sd s2,0(sp) + 2e4: 1000 addi s0,sp,32 + 2e6: 892a mv s2,a0 + struct backcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2e8: 4541 li a0,16 + 2ea: 5df000ef jal ra,10c8 <malloc> + 2ee: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2f0: 4641 li a2,16 + 2f2: 4581 li a1,0 + 2f4: 716000ef jal ra,a0a <memset> + cmd->type = BACK; + 2f8: 4795 li a5,5 + 2fa: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 2fc: 0124b423 sd s2,8(s1) + return (struct cmd*)cmd; +} + 300: 8526 mv a0,s1 + 302: 60e2 ld ra,24(sp) + 304: 6442 ld s0,16(sp) + 306: 64a2 ld s1,8(sp) + 308: 6902 ld s2,0(sp) + 30a: 6105 addi sp,sp,32 + 30c: 8082 ret + +000000000000030e <gettoken>: +char whitespace[] = " \t\r\n\v"; +char symbols[] = "<|>&;()"; + +int +gettoken(char **ps, char *es, char **q, char **eq) +{ + 30e: 7139 addi sp,sp,-64 + 310: fc06 sd ra,56(sp) + 312: f822 sd s0,48(sp) + 314: f426 sd s1,40(sp) + 316: f04a sd s2,32(sp) + 318: ec4e sd s3,24(sp) + 31a: e852 sd s4,16(sp) + 31c: e456 sd s5,8(sp) + 31e: e05a sd s6,0(sp) + 320: 0080 addi s0,sp,64 + 322: 8a2a mv s4,a0 + 324: 892e mv s2,a1 + 326: 8ab2 mv s5,a2 + 328: 8b36 mv s6,a3 + char *s; + int ret; + + s = *ps; + 32a: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 32c: 00002997 auipc s3,0x2 + 330: cdc98993 addi s3,s3,-804 # 2008 <whitespace> + 334: 00b4fc63 bgeu s1,a1,34c <gettoken+0x3e> + 338: 0004c583 lbu a1,0(s1) + 33c: 854e mv a0,s3 + 33e: 6ee000ef jal ra,a2c <strchr> + 342: c509 beqz a0,34c <gettoken+0x3e> + s++; + 344: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 346: fe9919e3 bne s2,s1,338 <gettoken+0x2a> + s++; + 34a: 84ca mv s1,s2 + if(q) + 34c: 000a8463 beqz s5,354 <gettoken+0x46> + *q = s; + 350: 009ab023 sd s1,0(s5) + ret = *s; + 354: 0004c783 lbu a5,0(s1) + 358: 00078a9b sext.w s5,a5 + switch(*s){ + 35c: 03c00713 li a4,60 + 360: 06f76463 bltu a4,a5,3c8 <gettoken+0xba> + 364: 03a00713 li a4,58 + 368: 00f76e63 bltu a4,a5,384 <gettoken+0x76> + 36c: cf89 beqz a5,386 <gettoken+0x78> + 36e: 02600713 li a4,38 + 372: 00e78963 beq a5,a4,384 <gettoken+0x76> + 376: fd87879b addiw a5,a5,-40 + 37a: 0ff7f793 zext.b a5,a5 + 37e: 4705 li a4,1 + 380: 06f76b63 bltu a4,a5,3f6 <gettoken+0xe8> + case '(': + case ')': + case ';': + case '&': + case '<': + s++; + 384: 0485 addi s1,s1,1 + ret = 'a'; + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + s++; + break; + } + if(eq) + 386: 000b0463 beqz s6,38e <gettoken+0x80> + *eq = s; + 38a: 009b3023 sd s1,0(s6) + + while(s < es && strchr(whitespace, *s)) + 38e: 00002997 auipc s3,0x2 + 392: c7a98993 addi s3,s3,-902 # 2008 <whitespace> + 396: 0124fc63 bgeu s1,s2,3ae <gettoken+0xa0> + 39a: 0004c583 lbu a1,0(s1) + 39e: 854e mv a0,s3 + 3a0: 68c000ef jal ra,a2c <strchr> + 3a4: c509 beqz a0,3ae <gettoken+0xa0> + s++; + 3a6: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 3a8: fe9919e3 bne s2,s1,39a <gettoken+0x8c> + s++; + 3ac: 84ca mv s1,s2 + *ps = s; + 3ae: 009a3023 sd s1,0(s4) + return ret; +} + 3b2: 8556 mv a0,s5 + 3b4: 70e2 ld ra,56(sp) + 3b6: 7442 ld s0,48(sp) + 3b8: 74a2 ld s1,40(sp) + 3ba: 7902 ld s2,32(sp) + 3bc: 69e2 ld s3,24(sp) + 3be: 6a42 ld s4,16(sp) + 3c0: 6aa2 ld s5,8(sp) + 3c2: 6b02 ld s6,0(sp) + 3c4: 6121 addi sp,sp,64 + 3c6: 8082 ret + switch(*s){ + 3c8: 03e00713 li a4,62 + 3cc: 02e79163 bne a5,a4,3ee <gettoken+0xe0> + s++; + 3d0: 00148693 addi a3,s1,1 + if(*s == '>'){ + 3d4: 0014c703 lbu a4,1(s1) + 3d8: 03e00793 li a5,62 + s++; + 3dc: 0489 addi s1,s1,2 + ret = '+'; + 3de: 02b00a93 li s5,43 + if(*s == '>'){ + 3e2: faf702e3 beq a4,a5,386 <gettoken+0x78> + s++; + 3e6: 84b6 mv s1,a3 + ret = *s; + 3e8: 03e00a93 li s5,62 + 3ec: bf69 j 386 <gettoken+0x78> + switch(*s){ + 3ee: 07c00713 li a4,124 + 3f2: f8e789e3 beq a5,a4,384 <gettoken+0x76> + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 3f6: 00002997 auipc s3,0x2 + 3fa: c1298993 addi s3,s3,-1006 # 2008 <whitespace> + 3fe: 00002a97 auipc s5,0x2 + 402: c02a8a93 addi s5,s5,-1022 # 2000 <symbols> + 406: 0324f263 bgeu s1,s2,42a <gettoken+0x11c> + 40a: 0004c583 lbu a1,0(s1) + 40e: 854e mv a0,s3 + 410: 61c000ef jal ra,a2c <strchr> + 414: e11d bnez a0,43a <gettoken+0x12c> + 416: 0004c583 lbu a1,0(s1) + 41a: 8556 mv a0,s5 + 41c: 610000ef jal ra,a2c <strchr> + 420: e911 bnez a0,434 <gettoken+0x126> + s++; + 422: 0485 addi s1,s1,1 + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 424: fe9913e3 bne s2,s1,40a <gettoken+0xfc> + s++; + 428: 84ca mv s1,s2 + if(eq) + 42a: 06100a93 li s5,97 + 42e: f40b1ee3 bnez s6,38a <gettoken+0x7c> + 432: bfb5 j 3ae <gettoken+0xa0> + ret = 'a'; + 434: 06100a93 li s5,97 + 438: b7b9 j 386 <gettoken+0x78> + 43a: 06100a93 li s5,97 + 43e: b7a1 j 386 <gettoken+0x78> + +0000000000000440 <peek>: + +int +peek(char **ps, char *es, char *toks) +{ + 440: 7139 addi sp,sp,-64 + 442: fc06 sd ra,56(sp) + 444: f822 sd s0,48(sp) + 446: f426 sd s1,40(sp) + 448: f04a sd s2,32(sp) + 44a: ec4e sd s3,24(sp) + 44c: e852 sd s4,16(sp) + 44e: e456 sd s5,8(sp) + 450: 0080 addi s0,sp,64 + 452: 8a2a mv s4,a0 + 454: 892e mv s2,a1 + 456: 8ab2 mv s5,a2 + char *s; + + s = *ps; + 458: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 45a: 00002997 auipc s3,0x2 + 45e: bae98993 addi s3,s3,-1106 # 2008 <whitespace> + 462: 00b4fc63 bgeu s1,a1,47a <peek+0x3a> + 466: 0004c583 lbu a1,0(s1) + 46a: 854e mv a0,s3 + 46c: 5c0000ef jal ra,a2c <strchr> + 470: c509 beqz a0,47a <peek+0x3a> + s++; + 472: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 474: fe9919e3 bne s2,s1,466 <peek+0x26> + s++; + 478: 84ca mv s1,s2 + *ps = s; + 47a: 009a3023 sd s1,0(s4) + return *s && strchr(toks, *s); + 47e: 0004c583 lbu a1,0(s1) + 482: 4501 li a0,0 + 484: e991 bnez a1,498 <peek+0x58> +} + 486: 70e2 ld ra,56(sp) + 488: 7442 ld s0,48(sp) + 48a: 74a2 ld s1,40(sp) + 48c: 7902 ld s2,32(sp) + 48e: 69e2 ld s3,24(sp) + 490: 6a42 ld s4,16(sp) + 492: 6aa2 ld s5,8(sp) + 494: 6121 addi sp,sp,64 + 496: 8082 ret + return *s && strchr(toks, *s); + 498: 8556 mv a0,s5 + 49a: 592000ef jal ra,a2c <strchr> + 49e: 00a03533 snez a0,a0 + 4a2: b7d5 j 486 <peek+0x46> + +00000000000004a4 <parseredirs>: + return cmd; +} + +struct cmd* +parseredirs(struct cmd *cmd, char **ps, char *es) +{ + 4a4: 7159 addi sp,sp,-112 + 4a6: f486 sd ra,104(sp) + 4a8: f0a2 sd s0,96(sp) + 4aa: eca6 sd s1,88(sp) + 4ac: e8ca sd s2,80(sp) + 4ae: e4ce sd s3,72(sp) + 4b0: e0d2 sd s4,64(sp) + 4b2: fc56 sd s5,56(sp) + 4b4: f85a sd s6,48(sp) + 4b6: f45e sd s7,40(sp) + 4b8: f062 sd s8,32(sp) + 4ba: ec66 sd s9,24(sp) + 4bc: 1880 addi s0,sp,112 + 4be: 8a2a mv s4,a0 + 4c0: 89ae mv s3,a1 + 4c2: 8932 mv s2,a2 + int tok; + char *q, *eq; + + while(peek(ps, es, "<>")){ + 4c4: 00001b97 auipc s7,0x1 + 4c8: d54b8b93 addi s7,s7,-684 # 1218 <malloc+0x150> + tok = gettoken(ps, es, 0, 0); + if(gettoken(ps, es, &q, &eq) != 'a') + 4cc: 06100c13 li s8,97 + panic("missing file for redirection"); + switch(tok){ + 4d0: 03c00c93 li s9,60 + while(peek(ps, es, "<>")){ + 4d4: a00d j 4f6 <parseredirs+0x52> + panic("missing file for redirection"); + 4d6: 00001517 auipc a0,0x1 + 4da: d2250513 addi a0,a0,-734 # 11f8 <malloc+0x130> + 4de: b6dff0ef jal ra,4a <panic> + case '<': + cmd = redircmd(cmd, q, eq, O_RDONLY, 0); + 4e2: 4701 li a4,0 + 4e4: 4681 li a3,0 + 4e6: f9043603 ld a2,-112(s0) + 4ea: f9843583 ld a1,-104(s0) + 4ee: 8552 mv a0,s4 + 4f0: d0fff0ef jal ra,1fe <redircmd> + 4f4: 8a2a mv s4,a0 + switch(tok){ + 4f6: 03e00b13 li s6,62 + 4fa: 02b00a93 li s5,43 + while(peek(ps, es, "<>")){ + 4fe: 865e mv a2,s7 + 500: 85ca mv a1,s2 + 502: 854e mv a0,s3 + 504: f3dff0ef jal ra,440 <peek> + 508: c125 beqz a0,568 <parseredirs+0xc4> + tok = gettoken(ps, es, 0, 0); + 50a: 4681 li a3,0 + 50c: 4601 li a2,0 + 50e: 85ca mv a1,s2 + 510: 854e mv a0,s3 + 512: dfdff0ef jal ra,30e <gettoken> + 516: 84aa mv s1,a0 + if(gettoken(ps, es, &q, &eq) != 'a') + 518: f9040693 addi a3,s0,-112 + 51c: f9840613 addi a2,s0,-104 + 520: 85ca mv a1,s2 + 522: 854e mv a0,s3 + 524: debff0ef jal ra,30e <gettoken> + 528: fb8517e3 bne a0,s8,4d6 <parseredirs+0x32> + switch(tok){ + 52c: fb948be3 beq s1,s9,4e2 <parseredirs+0x3e> + 530: 03648063 beq s1,s6,550 <parseredirs+0xac> + 534: fd5495e3 bne s1,s5,4fe <parseredirs+0x5a> + break; + case '>': + cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1); + break; + case '+': // >> + cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE, 1); + 538: 4705 li a4,1 + 53a: 20100693 li a3,513 + 53e: f9043603 ld a2,-112(s0) + 542: f9843583 ld a1,-104(s0) + 546: 8552 mv a0,s4 + 548: cb7ff0ef jal ra,1fe <redircmd> + 54c: 8a2a mv s4,a0 + break; + 54e: b765 j 4f6 <parseredirs+0x52> + cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1); + 550: 4705 li a4,1 + 552: 60100693 li a3,1537 + 556: f9043603 ld a2,-112(s0) + 55a: f9843583 ld a1,-104(s0) + 55e: 8552 mv a0,s4 + 560: c9fff0ef jal ra,1fe <redircmd> + 564: 8a2a mv s4,a0 + break; + 566: bf41 j 4f6 <parseredirs+0x52> + } + } + return cmd; +} + 568: 8552 mv a0,s4 + 56a: 70a6 ld ra,104(sp) + 56c: 7406 ld s0,96(sp) + 56e: 64e6 ld s1,88(sp) + 570: 6946 ld s2,80(sp) + 572: 69a6 ld s3,72(sp) + 574: 6a06 ld s4,64(sp) + 576: 7ae2 ld s5,56(sp) + 578: 7b42 ld s6,48(sp) + 57a: 7ba2 ld s7,40(sp) + 57c: 7c02 ld s8,32(sp) + 57e: 6ce2 ld s9,24(sp) + 580: 6165 addi sp,sp,112 + 582: 8082 ret + +0000000000000584 <parseexec>: + return cmd; +} + +struct cmd* +parseexec(char **ps, char *es) +{ + 584: 7159 addi sp,sp,-112 + 586: f486 sd ra,104(sp) + 588: f0a2 sd s0,96(sp) + 58a: eca6 sd s1,88(sp) + 58c: e8ca sd s2,80(sp) + 58e: e4ce sd s3,72(sp) + 590: e0d2 sd s4,64(sp) + 592: fc56 sd s5,56(sp) + 594: f85a sd s6,48(sp) + 596: f45e sd s7,40(sp) + 598: f062 sd s8,32(sp) + 59a: ec66 sd s9,24(sp) + 59c: 1880 addi s0,sp,112 + 59e: 8a2a mv s4,a0 + 5a0: 8aae mv s5,a1 + char *q, *eq; + int tok, argc; + struct execcmd *cmd; + struct cmd *ret; + + if(peek(ps, es, "(")) + 5a2: 00001617 auipc a2,0x1 + 5a6: c7e60613 addi a2,a2,-898 # 1220 <malloc+0x158> + 5aa: e97ff0ef jal ra,440 <peek> + 5ae: e505 bnez a0,5d6 <parseexec+0x52> + 5b0: 89aa mv s3,a0 + return parseblock(ps, es); + + ret = execcmd(); + 5b2: c1fff0ef jal ra,1d0 <execcmd> + 5b6: 8c2a mv s8,a0 + cmd = (struct execcmd*)ret; + + argc = 0; + ret = parseredirs(ret, ps, es); + 5b8: 8656 mv a2,s5 + 5ba: 85d2 mv a1,s4 + 5bc: ee9ff0ef jal ra,4a4 <parseredirs> + 5c0: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 5c2: 008c0913 addi s2,s8,8 + 5c6: 00001b17 auipc s6,0x1 + 5ca: c7ab0b13 addi s6,s6,-902 # 1240 <malloc+0x178> + if((tok=gettoken(ps, es, &q, &eq)) == 0) + break; + if(tok != 'a') + 5ce: 06100c93 li s9,97 + panic("syntax"); + cmd->argv[argc] = q; + cmd->eargv[argc] = eq; + argc++; + if(argc >= MAXARGS) + 5d2: 4ba9 li s7,10 + while(!peek(ps, es, "|)&;")){ + 5d4: a081 j 614 <parseexec+0x90> + return parseblock(ps, es); + 5d6: 85d6 mv a1,s5 + 5d8: 8552 mv a0,s4 + 5da: 170000ef jal ra,74a <parseblock> + 5de: 84aa mv s1,a0 + ret = parseredirs(ret, ps, es); + } + cmd->argv[argc] = 0; + cmd->eargv[argc] = 0; + return ret; +} + 5e0: 8526 mv a0,s1 + 5e2: 70a6 ld ra,104(sp) + 5e4: 7406 ld s0,96(sp) + 5e6: 64e6 ld s1,88(sp) + 5e8: 6946 ld s2,80(sp) + 5ea: 69a6 ld s3,72(sp) + 5ec: 6a06 ld s4,64(sp) + 5ee: 7ae2 ld s5,56(sp) + 5f0: 7b42 ld s6,48(sp) + 5f2: 7ba2 ld s7,40(sp) + 5f4: 7c02 ld s8,32(sp) + 5f6: 6ce2 ld s9,24(sp) + 5f8: 6165 addi sp,sp,112 + 5fa: 8082 ret + panic("syntax"); + 5fc: 00001517 auipc a0,0x1 + 600: c2c50513 addi a0,a0,-980 # 1228 <malloc+0x160> + 604: a47ff0ef jal ra,4a <panic> + ret = parseredirs(ret, ps, es); + 608: 8656 mv a2,s5 + 60a: 85d2 mv a1,s4 + 60c: 8526 mv a0,s1 + 60e: e97ff0ef jal ra,4a4 <parseredirs> + 612: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 614: 865a mv a2,s6 + 616: 85d6 mv a1,s5 + 618: 8552 mv a0,s4 + 61a: e27ff0ef jal ra,440 <peek> + 61e: ed15 bnez a0,65a <parseexec+0xd6> + if((tok=gettoken(ps, es, &q, &eq)) == 0) + 620: f9040693 addi a3,s0,-112 + 624: f9840613 addi a2,s0,-104 + 628: 85d6 mv a1,s5 + 62a: 8552 mv a0,s4 + 62c: ce3ff0ef jal ra,30e <gettoken> + 630: c50d beqz a0,65a <parseexec+0xd6> + if(tok != 'a') + 632: fd9515e3 bne a0,s9,5fc <parseexec+0x78> + cmd->argv[argc] = q; + 636: f9843783 ld a5,-104(s0) + 63a: 00f93023 sd a5,0(s2) + cmd->eargv[argc] = eq; + 63e: f9043783 ld a5,-112(s0) + 642: 04f93823 sd a5,80(s2) + argc++; + 646: 2985 addiw s3,s3,1 + if(argc >= MAXARGS) + 648: 0921 addi s2,s2,8 + 64a: fb799fe3 bne s3,s7,608 <parseexec+0x84> + panic("too many args"); + 64e: 00001517 auipc a0,0x1 + 652: be250513 addi a0,a0,-1054 # 1230 <malloc+0x168> + 656: 9f5ff0ef jal ra,4a <panic> + cmd->argv[argc] = 0; + 65a: 098e slli s3,s3,0x3 + 65c: 9c4e add s8,s8,s3 + 65e: 000c3423 sd zero,8(s8) + cmd->eargv[argc] = 0; + 662: 040c3c23 sd zero,88(s8) + return ret; + 666: bfad j 5e0 <parseexec+0x5c> + +0000000000000668 <parsepipe>: +{ + 668: 7179 addi sp,sp,-48 + 66a: f406 sd ra,40(sp) + 66c: f022 sd s0,32(sp) + 66e: ec26 sd s1,24(sp) + 670: e84a sd s2,16(sp) + 672: e44e sd s3,8(sp) + 674: 1800 addi s0,sp,48 + 676: 892a mv s2,a0 + 678: 89ae mv s3,a1 + cmd = parseexec(ps, es); + 67a: f0bff0ef jal ra,584 <parseexec> + 67e: 84aa mv s1,a0 + if(peek(ps, es, "|")){ + 680: 00001617 auipc a2,0x1 + 684: bc860613 addi a2,a2,-1080 # 1248 <malloc+0x180> + 688: 85ce mv a1,s3 + 68a: 854a mv a0,s2 + 68c: db5ff0ef jal ra,440 <peek> + 690: e909 bnez a0,6a2 <parsepipe+0x3a> +} + 692: 8526 mv a0,s1 + 694: 70a2 ld ra,40(sp) + 696: 7402 ld s0,32(sp) + 698: 64e2 ld s1,24(sp) + 69a: 6942 ld s2,16(sp) + 69c: 69a2 ld s3,8(sp) + 69e: 6145 addi sp,sp,48 + 6a0: 8082 ret + gettoken(ps, es, 0, 0); + 6a2: 4681 li a3,0 + 6a4: 4601 li a2,0 + 6a6: 85ce mv a1,s3 + 6a8: 854a mv a0,s2 + 6aa: c65ff0ef jal ra,30e <gettoken> + cmd = pipecmd(cmd, parsepipe(ps, es)); + 6ae: 85ce mv a1,s3 + 6b0: 854a mv a0,s2 + 6b2: fb7ff0ef jal ra,668 <parsepipe> + 6b6: 85aa mv a1,a0 + 6b8: 8526 mv a0,s1 + 6ba: ba5ff0ef jal ra,25e <pipecmd> + 6be: 84aa mv s1,a0 + return cmd; + 6c0: bfc9 j 692 <parsepipe+0x2a> + +00000000000006c2 <parseline>: +{ + 6c2: 7179 addi sp,sp,-48 + 6c4: f406 sd ra,40(sp) + 6c6: f022 sd s0,32(sp) + 6c8: ec26 sd s1,24(sp) + 6ca: e84a sd s2,16(sp) + 6cc: e44e sd s3,8(sp) + 6ce: e052 sd s4,0(sp) + 6d0: 1800 addi s0,sp,48 + 6d2: 892a mv s2,a0 + 6d4: 89ae mv s3,a1 + cmd = parsepipe(ps, es); + 6d6: f93ff0ef jal ra,668 <parsepipe> + 6da: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6dc: 00001a17 auipc s4,0x1 + 6e0: b74a0a13 addi s4,s4,-1164 # 1250 <malloc+0x188> + 6e4: a819 j 6fa <parseline+0x38> + gettoken(ps, es, 0, 0); + 6e6: 4681 li a3,0 + 6e8: 4601 li a2,0 + 6ea: 85ce mv a1,s3 + 6ec: 854a mv a0,s2 + 6ee: c21ff0ef jal ra,30e <gettoken> + cmd = backcmd(cmd); + 6f2: 8526 mv a0,s1 + 6f4: be7ff0ef jal ra,2da <backcmd> + 6f8: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6fa: 8652 mv a2,s4 + 6fc: 85ce mv a1,s3 + 6fe: 854a mv a0,s2 + 700: d41ff0ef jal ra,440 <peek> + 704: f16d bnez a0,6e6 <parseline+0x24> + if(peek(ps, es, ";")){ + 706: 00001617 auipc a2,0x1 + 70a: b5260613 addi a2,a2,-1198 # 1258 <malloc+0x190> + 70e: 85ce mv a1,s3 + 710: 854a mv a0,s2 + 712: d2fff0ef jal ra,440 <peek> + 716: e911 bnez a0,72a <parseline+0x68> +} + 718: 8526 mv a0,s1 + 71a: 70a2 ld ra,40(sp) + 71c: 7402 ld s0,32(sp) + 71e: 64e2 ld s1,24(sp) + 720: 6942 ld s2,16(sp) + 722: 69a2 ld s3,8(sp) + 724: 6a02 ld s4,0(sp) + 726: 6145 addi sp,sp,48 + 728: 8082 ret + gettoken(ps, es, 0, 0); + 72a: 4681 li a3,0 + 72c: 4601 li a2,0 + 72e: 85ce mv a1,s3 + 730: 854a mv a0,s2 + 732: bddff0ef jal ra,30e <gettoken> + cmd = listcmd(cmd, parseline(ps, es)); + 736: 85ce mv a1,s3 + 738: 854a mv a0,s2 + 73a: f89ff0ef jal ra,6c2 <parseline> + 73e: 85aa mv a1,a0 + 740: 8526 mv a0,s1 + 742: b5bff0ef jal ra,29c <listcmd> + 746: 84aa mv s1,a0 + return cmd; + 748: bfc1 j 718 <parseline+0x56> + +000000000000074a <parseblock>: +{ + 74a: 7179 addi sp,sp,-48 + 74c: f406 sd ra,40(sp) + 74e: f022 sd s0,32(sp) + 750: ec26 sd s1,24(sp) + 752: e84a sd s2,16(sp) + 754: e44e sd s3,8(sp) + 756: 1800 addi s0,sp,48 + 758: 84aa mv s1,a0 + 75a: 892e mv s2,a1 + if(!peek(ps, es, "(")) + 75c: 00001617 auipc a2,0x1 + 760: ac460613 addi a2,a2,-1340 # 1220 <malloc+0x158> + 764: cddff0ef jal ra,440 <peek> + 768: c539 beqz a0,7b6 <parseblock+0x6c> + gettoken(ps, es, 0, 0); + 76a: 4681 li a3,0 + 76c: 4601 li a2,0 + 76e: 85ca mv a1,s2 + 770: 8526 mv a0,s1 + 772: b9dff0ef jal ra,30e <gettoken> + cmd = parseline(ps, es); + 776: 85ca mv a1,s2 + 778: 8526 mv a0,s1 + 77a: f49ff0ef jal ra,6c2 <parseline> + 77e: 89aa mv s3,a0 + if(!peek(ps, es, ")")) + 780: 00001617 auipc a2,0x1 + 784: af060613 addi a2,a2,-1296 # 1270 <malloc+0x1a8> + 788: 85ca mv a1,s2 + 78a: 8526 mv a0,s1 + 78c: cb5ff0ef jal ra,440 <peek> + 790: c90d beqz a0,7c2 <parseblock+0x78> + gettoken(ps, es, 0, 0); + 792: 4681 li a3,0 + 794: 4601 li a2,0 + 796: 85ca mv a1,s2 + 798: 8526 mv a0,s1 + 79a: b75ff0ef jal ra,30e <gettoken> + cmd = parseredirs(cmd, ps, es); + 79e: 864a mv a2,s2 + 7a0: 85a6 mv a1,s1 + 7a2: 854e mv a0,s3 + 7a4: d01ff0ef jal ra,4a4 <parseredirs> +} + 7a8: 70a2 ld ra,40(sp) + 7aa: 7402 ld s0,32(sp) + 7ac: 64e2 ld s1,24(sp) + 7ae: 6942 ld s2,16(sp) + 7b0: 69a2 ld s3,8(sp) + 7b2: 6145 addi sp,sp,48 + 7b4: 8082 ret + panic("parseblock"); + 7b6: 00001517 auipc a0,0x1 + 7ba: aaa50513 addi a0,a0,-1366 # 1260 <malloc+0x198> + 7be: 88dff0ef jal ra,4a <panic> + panic("syntax - missing )"); + 7c2: 00001517 auipc a0,0x1 + 7c6: ab650513 addi a0,a0,-1354 # 1278 <malloc+0x1b0> + 7ca: 881ff0ef jal ra,4a <panic> + +00000000000007ce <nulterminate>: + +// NUL-terminate all the counted strings. +struct cmd* +nulterminate(struct cmd *cmd) +{ + 7ce: 1101 addi sp,sp,-32 + 7d0: ec06 sd ra,24(sp) + 7d2: e822 sd s0,16(sp) + 7d4: e426 sd s1,8(sp) + 7d6: 1000 addi s0,sp,32 + 7d8: 84aa mv s1,a0 + struct execcmd *ecmd; + struct listcmd *lcmd; + struct pipecmd *pcmd; + struct redircmd *rcmd; + + if(cmd == 0) + 7da: c131 beqz a0,81e <nulterminate+0x50> + return 0; + + switch(cmd->type){ + 7dc: 4118 lw a4,0(a0) + 7de: 4795 li a5,5 + 7e0: 02e7ef63 bltu a5,a4,81e <nulterminate+0x50> + 7e4: 00056783 lwu a5,0(a0) + 7e8: 078a slli a5,a5,0x2 + 7ea: 00001717 auipc a4,0x1 + 7ee: aee70713 addi a4,a4,-1298 # 12d8 <malloc+0x210> + 7f2: 97ba add a5,a5,a4 + 7f4: 439c lw a5,0(a5) + 7f6: 97ba add a5,a5,a4 + 7f8: 8782 jr a5 + case EXEC: + ecmd = (struct execcmd*)cmd; + for(i=0; ecmd->argv[i]; i++) + 7fa: 651c ld a5,8(a0) + 7fc: c38d beqz a5,81e <nulterminate+0x50> + 7fe: 01050793 addi a5,a0,16 + *ecmd->eargv[i] = 0; + 802: 67b8 ld a4,72(a5) + 804: 00070023 sb zero,0(a4) + for(i=0; ecmd->argv[i]; i++) + 808: 07a1 addi a5,a5,8 + 80a: ff87b703 ld a4,-8(a5) + 80e: fb75 bnez a4,802 <nulterminate+0x34> + 810: a039 j 81e <nulterminate+0x50> + break; + + case REDIR: + rcmd = (struct redircmd*)cmd; + nulterminate(rcmd->cmd); + 812: 6508 ld a0,8(a0) + 814: fbbff0ef jal ra,7ce <nulterminate> + *rcmd->efile = 0; + 818: 6c9c ld a5,24(s1) + 81a: 00078023 sb zero,0(a5) + bcmd = (struct backcmd*)cmd; + nulterminate(bcmd->cmd); + break; + } + return cmd; +} + 81e: 8526 mv a0,s1 + 820: 60e2 ld ra,24(sp) + 822: 6442 ld s0,16(sp) + 824: 64a2 ld s1,8(sp) + 826: 6105 addi sp,sp,32 + 828: 8082 ret + nulterminate(pcmd->left); + 82a: 6508 ld a0,8(a0) + 82c: fa3ff0ef jal ra,7ce <nulterminate> + nulterminate(pcmd->right); + 830: 6888 ld a0,16(s1) + 832: f9dff0ef jal ra,7ce <nulterminate> + break; + 836: b7e5 j 81e <nulterminate+0x50> + nulterminate(lcmd->left); + 838: 6508 ld a0,8(a0) + 83a: f95ff0ef jal ra,7ce <nulterminate> + nulterminate(lcmd->right); + 83e: 6888 ld a0,16(s1) + 840: f8fff0ef jal ra,7ce <nulterminate> + break; + 844: bfe9 j 81e <nulterminate+0x50> + nulterminate(bcmd->cmd); + 846: 6508 ld a0,8(a0) + 848: f87ff0ef jal ra,7ce <nulterminate> + break; + 84c: bfc9 j 81e <nulterminate+0x50> + +000000000000084e <parsecmd>: +{ + 84e: 7179 addi sp,sp,-48 + 850: f406 sd ra,40(sp) + 852: f022 sd s0,32(sp) + 854: ec26 sd s1,24(sp) + 856: e84a sd s2,16(sp) + 858: 1800 addi s0,sp,48 + 85a: fca43c23 sd a0,-40(s0) + es = s + strlen(s); + 85e: 84aa mv s1,a0 + 860: 180000ef jal ra,9e0 <strlen> + 864: 1502 slli a0,a0,0x20 + 866: 9101 srli a0,a0,0x20 + 868: 94aa add s1,s1,a0 + cmd = parseline(&s, es); + 86a: 85a6 mv a1,s1 + 86c: fd840513 addi a0,s0,-40 + 870: e53ff0ef jal ra,6c2 <parseline> + 874: 892a mv s2,a0 + peek(&s, es, ""); + 876: 00001617 auipc a2,0x1 + 87a: a1a60613 addi a2,a2,-1510 # 1290 <malloc+0x1c8> + 87e: 85a6 mv a1,s1 + 880: fd840513 addi a0,s0,-40 + 884: bbdff0ef jal ra,440 <peek> + if(s != es){ + 888: fd843603 ld a2,-40(s0) + 88c: 00961c63 bne a2,s1,8a4 <parsecmd+0x56> + nulterminate(cmd); + 890: 854a mv a0,s2 + 892: f3dff0ef jal ra,7ce <nulterminate> +} + 896: 854a mv a0,s2 + 898: 70a2 ld ra,40(sp) + 89a: 7402 ld s0,32(sp) + 89c: 64e2 ld s1,24(sp) + 89e: 6942 ld s2,16(sp) + 8a0: 6145 addi sp,sp,48 + 8a2: 8082 ret + fprintf(2, "leftovers: %s\n", s); + 8a4: 00001597 auipc a1,0x1 + 8a8: 9f458593 addi a1,a1,-1548 # 1298 <malloc+0x1d0> + 8ac: 4509 li a0,2 + 8ae: 73c000ef jal ra,fea <fprintf> + panic("syntax"); + 8b2: 00001517 auipc a0,0x1 + 8b6: 97650513 addi a0,a0,-1674 # 1228 <malloc+0x160> + 8ba: f90ff0ef jal ra,4a <panic> + +00000000000008be <main>: +{ + 8be: 7139 addi sp,sp,-64 + 8c0: fc06 sd ra,56(sp) + 8c2: f822 sd s0,48(sp) + 8c4: f426 sd s1,40(sp) + 8c6: f04a sd s2,32(sp) + 8c8: ec4e sd s3,24(sp) + 8ca: e852 sd s4,16(sp) + 8cc: e456 sd s5,8(sp) + 8ce: 0080 addi s0,sp,64 + while((fd = open("console", O_RDWR)) >= 0){ + 8d0: 00001497 auipc s1,0x1 + 8d4: 9d848493 addi s1,s1,-1576 # 12a8 <malloc+0x1e0> + 8d8: 4589 li a1,2 + 8da: 8526 mv a0,s1 + 8dc: 354000ef jal ra,c30 <open> + 8e0: 00054763 bltz a0,8ee <main+0x30> + if(fd >= 3){ + 8e4: 4789 li a5,2 + 8e6: fea7d9e3 bge a5,a0,8d8 <main+0x1a> + close(fd); + 8ea: 32e000ef jal ra,c18 <close> + while(getcmd(buf, sizeof(buf)) >= 0){ + 8ee: 00001497 auipc s1,0x1 + 8f2: 73248493 addi s1,s1,1842 # 2020 <buf.0> + if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ + 8f6: 06300913 li s2,99 + 8fa: 02000993 li s3,32 + if(chdir(buf+3) < 0) + 8fe: 00001a17 auipc s4,0x1 + 902: 725a0a13 addi s4,s4,1829 # 2023 <buf.0+0x3> + fprintf(2, "cannot cd %s\n", buf+3); + 906: 00001a97 auipc s5,0x1 + 90a: 9aaa8a93 addi s5,s5,-1622 # 12b0 <malloc+0x1e8> + 90e: a039 j 91c <main+0x5e> + if(fork1() == 0) + 910: f58ff0ef jal ra,68 <fork1> + 914: cd31 beqz a0,970 <main+0xb2> + wait(0); + 916: 4501 li a0,0 + 918: 2e0000ef jal ra,bf8 <wait> + while(getcmd(buf, sizeof(buf)) >= 0){ + 91c: 06400593 li a1,100 + 920: 8526 mv a0,s1 + 922: edeff0ef jal ra,0 <getcmd> + 926: 04054d63 bltz a0,980 <main+0xc2> + if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ + 92a: 0004c783 lbu a5,0(s1) + 92e: ff2791e3 bne a5,s2,910 <main+0x52> + 932: 0014c703 lbu a4,1(s1) + 936: 06400793 li a5,100 + 93a: fcf71be3 bne a4,a5,910 <main+0x52> + 93e: 0024c783 lbu a5,2(s1) + 942: fd3797e3 bne a5,s3,910 <main+0x52> + buf[strlen(buf)-1] = 0; // chop \n + 946: 8526 mv a0,s1 + 948: 098000ef jal ra,9e0 <strlen> + 94c: fff5079b addiw a5,a0,-1 + 950: 1782 slli a5,a5,0x20 + 952: 9381 srli a5,a5,0x20 + 954: 97a6 add a5,a5,s1 + 956: 00078023 sb zero,0(a5) + if(chdir(buf+3) < 0) + 95a: 8552 mv a0,s4 + 95c: 304000ef jal ra,c60 <chdir> + 960: fa055ee3 bgez a0,91c <main+0x5e> + fprintf(2, "cannot cd %s\n", buf+3); + 964: 8652 mv a2,s4 + 966: 85d6 mv a1,s5 + 968: 4509 li a0,2 + 96a: 680000ef jal ra,fea <fprintf> + 96e: b77d j 91c <main+0x5e> + runcmd(parsecmd(buf)); + 970: 00001517 auipc a0,0x1 + 974: 6b050513 addi a0,a0,1712 # 2020 <buf.0> + 978: ed7ff0ef jal ra,84e <parsecmd> + 97c: f12ff0ef jal ra,8e <runcmd> + exit(0); + 980: 4501 li a0,0 + 982: 26e000ef jal ra,bf0 <exit> + +0000000000000986 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 986: 1141 addi sp,sp,-16 + 988: e406 sd ra,8(sp) + 98a: e022 sd s0,0(sp) + 98c: 0800 addi s0,sp,16 + extern int main(); + main(); + 98e: f31ff0ef jal ra,8be <main> + exit(0); + 992: 4501 li a0,0 + 994: 25c000ef jal ra,bf0 <exit> + +0000000000000998 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 998: 1141 addi sp,sp,-16 + 99a: e422 sd s0,8(sp) + 99c: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 99e: 87aa mv a5,a0 + 9a0: 0585 addi a1,a1,1 + 9a2: 0785 addi a5,a5,1 + 9a4: fff5c703 lbu a4,-1(a1) + 9a8: fee78fa3 sb a4,-1(a5) + 9ac: fb75 bnez a4,9a0 <strcpy+0x8> + ; + return os; +} + 9ae: 6422 ld s0,8(sp) + 9b0: 0141 addi sp,sp,16 + 9b2: 8082 ret + +00000000000009b4 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 9b4: 1141 addi sp,sp,-16 + 9b6: e422 sd s0,8(sp) + 9b8: 0800 addi s0,sp,16 + while(*p && *p == *q) + 9ba: 00054783 lbu a5,0(a0) + 9be: cb91 beqz a5,9d2 <strcmp+0x1e> + 9c0: 0005c703 lbu a4,0(a1) + 9c4: 00f71763 bne a4,a5,9d2 <strcmp+0x1e> + p++, q++; + 9c8: 0505 addi a0,a0,1 + 9ca: 0585 addi a1,a1,1 + while(*p && *p == *q) + 9cc: 00054783 lbu a5,0(a0) + 9d0: fbe5 bnez a5,9c0 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 9d2: 0005c503 lbu a0,0(a1) +} + 9d6: 40a7853b subw a0,a5,a0 + 9da: 6422 ld s0,8(sp) + 9dc: 0141 addi sp,sp,16 + 9de: 8082 ret + +00000000000009e0 <strlen>: + +uint +strlen(const char *s) +{ + 9e0: 1141 addi sp,sp,-16 + 9e2: e422 sd s0,8(sp) + 9e4: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 9e6: 00054783 lbu a5,0(a0) + 9ea: cf91 beqz a5,a06 <strlen+0x26> + 9ec: 0505 addi a0,a0,1 + 9ee: 87aa mv a5,a0 + 9f0: 4685 li a3,1 + 9f2: 9e89 subw a3,a3,a0 + 9f4: 00f6853b addw a0,a3,a5 + 9f8: 0785 addi a5,a5,1 + 9fa: fff7c703 lbu a4,-1(a5) + 9fe: fb7d bnez a4,9f4 <strlen+0x14> + ; + return n; +} + a00: 6422 ld s0,8(sp) + a02: 0141 addi sp,sp,16 + a04: 8082 ret + for(n = 0; s[n]; n++) + a06: 4501 li a0,0 + a08: bfe5 j a00 <strlen+0x20> + +0000000000000a0a <memset>: + +void* +memset(void *dst, int c, uint n) +{ + a0a: 1141 addi sp,sp,-16 + a0c: e422 sd s0,8(sp) + a0e: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a10: ca19 beqz a2,a26 <memset+0x1c> + a12: 87aa mv a5,a0 + a14: 1602 slli a2,a2,0x20 + a16: 9201 srli a2,a2,0x20 + a18: 00a60733 add a4,a2,a0 + cdst[i] = c; + a1c: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + a20: 0785 addi a5,a5,1 + a22: fee79de3 bne a5,a4,a1c <memset+0x12> + } + return dst; +} + a26: 6422 ld s0,8(sp) + a28: 0141 addi sp,sp,16 + a2a: 8082 ret + +0000000000000a2c <strchr>: + +char* +strchr(const char *s, char c) +{ + a2c: 1141 addi sp,sp,-16 + a2e: e422 sd s0,8(sp) + a30: 0800 addi s0,sp,16 + for(; *s; s++) + a32: 00054783 lbu a5,0(a0) + a36: cb99 beqz a5,a4c <strchr+0x20> + if(*s == c) + a38: 00f58763 beq a1,a5,a46 <strchr+0x1a> + for(; *s; s++) + a3c: 0505 addi a0,a0,1 + a3e: 00054783 lbu a5,0(a0) + a42: fbfd bnez a5,a38 <strchr+0xc> + return (char*)s; + return 0; + a44: 4501 li a0,0 +} + a46: 6422 ld s0,8(sp) + a48: 0141 addi sp,sp,16 + a4a: 8082 ret + return 0; + a4c: 4501 li a0,0 + a4e: bfe5 j a46 <strchr+0x1a> + +0000000000000a50 <gets>: + +char* +gets(char *buf, int max) +{ + a50: 711d addi sp,sp,-96 + a52: ec86 sd ra,88(sp) + a54: e8a2 sd s0,80(sp) + a56: e4a6 sd s1,72(sp) + a58: e0ca sd s2,64(sp) + a5a: fc4e sd s3,56(sp) + a5c: f852 sd s4,48(sp) + a5e: f456 sd s5,40(sp) + a60: f05a sd s6,32(sp) + a62: ec5e sd s7,24(sp) + a64: 1080 addi s0,sp,96 + a66: 8baa mv s7,a0 + a68: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + a6a: 892a mv s2,a0 + a6c: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + a6e: 4aa9 li s5,10 + a70: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + a72: 89a6 mv s3,s1 + a74: 2485 addiw s1,s1,1 + a76: 0344d663 bge s1,s4,aa2 <gets+0x52> + cc = read(0, &c, 1); + a7a: 4605 li a2,1 + a7c: faf40593 addi a1,s0,-81 + a80: 4501 li a0,0 + a82: 186000ef jal ra,c08 <read> + if(cc < 1) + a86: 00a05e63 blez a0,aa2 <gets+0x52> + buf[i++] = c; + a8a: faf44783 lbu a5,-81(s0) + a8e: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + a92: 01578763 beq a5,s5,aa0 <gets+0x50> + a96: 0905 addi s2,s2,1 + a98: fd679de3 bne a5,s6,a72 <gets+0x22> + for(i=0; i+1 < max; ){ + a9c: 89a6 mv s3,s1 + a9e: a011 j aa2 <gets+0x52> + aa0: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + aa2: 99de add s3,s3,s7 + aa4: 00098023 sb zero,0(s3) + return buf; +} + aa8: 855e mv a0,s7 + aaa: 60e6 ld ra,88(sp) + aac: 6446 ld s0,80(sp) + aae: 64a6 ld s1,72(sp) + ab0: 6906 ld s2,64(sp) + ab2: 79e2 ld s3,56(sp) + ab4: 7a42 ld s4,48(sp) + ab6: 7aa2 ld s5,40(sp) + ab8: 7b02 ld s6,32(sp) + aba: 6be2 ld s7,24(sp) + abc: 6125 addi sp,sp,96 + abe: 8082 ret + +0000000000000ac0 <stat>: + +int +stat(const char *n, struct stat *st) +{ + ac0: 1101 addi sp,sp,-32 + ac2: ec06 sd ra,24(sp) + ac4: e822 sd s0,16(sp) + ac6: e426 sd s1,8(sp) + ac8: e04a sd s2,0(sp) + aca: 1000 addi s0,sp,32 + acc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + ace: 4581 li a1,0 + ad0: 160000ef jal ra,c30 <open> + if(fd < 0) + ad4: 02054163 bltz a0,af6 <stat+0x36> + ad8: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + ada: 85ca mv a1,s2 + adc: 16c000ef jal ra,c48 <fstat> + ae0: 892a mv s2,a0 + close(fd); + ae2: 8526 mv a0,s1 + ae4: 134000ef jal ra,c18 <close> + return r; +} + ae8: 854a mv a0,s2 + aea: 60e2 ld ra,24(sp) + aec: 6442 ld s0,16(sp) + aee: 64a2 ld s1,8(sp) + af0: 6902 ld s2,0(sp) + af2: 6105 addi sp,sp,32 + af4: 8082 ret + return -1; + af6: 597d li s2,-1 + af8: bfc5 j ae8 <stat+0x28> + +0000000000000afa <atoi>: + +int +atoi(const char *s) +{ + afa: 1141 addi sp,sp,-16 + afc: e422 sd s0,8(sp) + afe: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + b00: 00054683 lbu a3,0(a0) + b04: fd06879b addiw a5,a3,-48 + b08: 0ff7f793 zext.b a5,a5 + b0c: 4625 li a2,9 + b0e: 02f66863 bltu a2,a5,b3e <atoi+0x44> + b12: 872a mv a4,a0 + n = 0; + b14: 4501 li a0,0 + n = n*10 + *s++ - '0'; + b16: 0705 addi a4,a4,1 + b18: 0025179b slliw a5,a0,0x2 + b1c: 9fa9 addw a5,a5,a0 + b1e: 0017979b slliw a5,a5,0x1 + b22: 9fb5 addw a5,a5,a3 + b24: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + b28: 00074683 lbu a3,0(a4) + b2c: fd06879b addiw a5,a3,-48 + b30: 0ff7f793 zext.b a5,a5 + b34: fef671e3 bgeu a2,a5,b16 <atoi+0x1c> + return n; +} + b38: 6422 ld s0,8(sp) + b3a: 0141 addi sp,sp,16 + b3c: 8082 ret + n = 0; + b3e: 4501 li a0,0 + b40: bfe5 j b38 <atoi+0x3e> + +0000000000000b42 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + b42: 1141 addi sp,sp,-16 + b44: e422 sd s0,8(sp) + b46: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + b48: 02b57463 bgeu a0,a1,b70 <memmove+0x2e> + while(n-- > 0) + b4c: 00c05f63 blez a2,b6a <memmove+0x28> + b50: 1602 slli a2,a2,0x20 + b52: 9201 srli a2,a2,0x20 + b54: 00c507b3 add a5,a0,a2 + dst = vdst; + b58: 872a mv a4,a0 + *dst++ = *src++; + b5a: 0585 addi a1,a1,1 + b5c: 0705 addi a4,a4,1 + b5e: fff5c683 lbu a3,-1(a1) + b62: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + b66: fee79ae3 bne a5,a4,b5a <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + b6a: 6422 ld s0,8(sp) + b6c: 0141 addi sp,sp,16 + b6e: 8082 ret + dst += n; + b70: 00c50733 add a4,a0,a2 + src += n; + b74: 95b2 add a1,a1,a2 + while(n-- > 0) + b76: fec05ae3 blez a2,b6a <memmove+0x28> + b7a: fff6079b addiw a5,a2,-1 + b7e: 1782 slli a5,a5,0x20 + b80: 9381 srli a5,a5,0x20 + b82: fff7c793 not a5,a5 + b86: 97ba add a5,a5,a4 + *--dst = *--src; + b88: 15fd addi a1,a1,-1 + b8a: 177d addi a4,a4,-1 + b8c: 0005c683 lbu a3,0(a1) + b90: 00d70023 sb a3,0(a4) + while(n-- > 0) + b94: fee79ae3 bne a5,a4,b88 <memmove+0x46> + b98: bfc9 j b6a <memmove+0x28> + +0000000000000b9a <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + b9a: 1141 addi sp,sp,-16 + b9c: e422 sd s0,8(sp) + b9e: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + ba0: ca05 beqz a2,bd0 <memcmp+0x36> + ba2: fff6069b addiw a3,a2,-1 + ba6: 1682 slli a3,a3,0x20 + ba8: 9281 srli a3,a3,0x20 + baa: 0685 addi a3,a3,1 + bac: 96aa add a3,a3,a0 + if (*p1 != *p2) { + bae: 00054783 lbu a5,0(a0) + bb2: 0005c703 lbu a4,0(a1) + bb6: 00e79863 bne a5,a4,bc6 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + bba: 0505 addi a0,a0,1 + p2++; + bbc: 0585 addi a1,a1,1 + while (n-- > 0) { + bbe: fed518e3 bne a0,a3,bae <memcmp+0x14> + } + return 0; + bc2: 4501 li a0,0 + bc4: a019 j bca <memcmp+0x30> + return *p1 - *p2; + bc6: 40e7853b subw a0,a5,a4 +} + bca: 6422 ld s0,8(sp) + bcc: 0141 addi sp,sp,16 + bce: 8082 ret + return 0; + bd0: 4501 li a0,0 + bd2: bfe5 j bca <memcmp+0x30> + +0000000000000bd4 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + bd4: 1141 addi sp,sp,-16 + bd6: e406 sd ra,8(sp) + bd8: e022 sd s0,0(sp) + bda: 0800 addi s0,sp,16 + return memmove(dst, src, n); + bdc: f67ff0ef jal ra,b42 <memmove> +} + be0: 60a2 ld ra,8(sp) + be2: 6402 ld s0,0(sp) + be4: 0141 addi sp,sp,16 + be6: 8082 ret + +0000000000000be8 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + be8: 4885 li a7,1 + ecall + bea: 00000073 ecall + ret + bee: 8082 ret + +0000000000000bf0 <exit>: +.global exit +exit: + li a7, SYS_exit + bf0: 4889 li a7,2 + ecall + bf2: 00000073 ecall + ret + bf6: 8082 ret + +0000000000000bf8 <wait>: +.global wait +wait: + li a7, SYS_wait + bf8: 488d li a7,3 + ecall + bfa: 00000073 ecall + ret + bfe: 8082 ret + +0000000000000c00 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + c00: 4891 li a7,4 + ecall + c02: 00000073 ecall + ret + c06: 8082 ret + +0000000000000c08 <read>: +.global read +read: + li a7, SYS_read + c08: 4895 li a7,5 + ecall + c0a: 00000073 ecall + ret + c0e: 8082 ret + +0000000000000c10 <write>: +.global write +write: + li a7, SYS_write + c10: 48c1 li a7,16 + ecall + c12: 00000073 ecall + ret + c16: 8082 ret + +0000000000000c18 <close>: +.global close +close: + li a7, SYS_close + c18: 48d5 li a7,21 + ecall + c1a: 00000073 ecall + ret + c1e: 8082 ret + +0000000000000c20 <kill>: +.global kill +kill: + li a7, SYS_kill + c20: 4899 li a7,6 + ecall + c22: 00000073 ecall + ret + c26: 8082 ret + +0000000000000c28 <exec>: +.global exec +exec: + li a7, SYS_exec + c28: 489d li a7,7 + ecall + c2a: 00000073 ecall + ret + c2e: 8082 ret + +0000000000000c30 <open>: +.global open +open: + li a7, SYS_open + c30: 48bd li a7,15 + ecall + c32: 00000073 ecall + ret + c36: 8082 ret + +0000000000000c38 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + c38: 48c5 li a7,17 + ecall + c3a: 00000073 ecall + ret + c3e: 8082 ret + +0000000000000c40 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + c40: 48c9 li a7,18 + ecall + c42: 00000073 ecall + ret + c46: 8082 ret + +0000000000000c48 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + c48: 48a1 li a7,8 + ecall + c4a: 00000073 ecall + ret + c4e: 8082 ret + +0000000000000c50 <link>: +.global link +link: + li a7, SYS_link + c50: 48cd li a7,19 + ecall + c52: 00000073 ecall + ret + c56: 8082 ret + +0000000000000c58 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + c58: 48d1 li a7,20 + ecall + c5a: 00000073 ecall + ret + c5e: 8082 ret + +0000000000000c60 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + c60: 48a5 li a7,9 + ecall + c62: 00000073 ecall + ret + c66: 8082 ret + +0000000000000c68 <dup>: +.global dup +dup: + li a7, SYS_dup + c68: 48a9 li a7,10 + ecall + c6a: 00000073 ecall + ret + c6e: 8082 ret + +0000000000000c70 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + c70: 48ad li a7,11 + ecall + c72: 00000073 ecall + ret + c76: 8082 ret + +0000000000000c78 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + c78: 48b1 li a7,12 + ecall + c7a: 00000073 ecall + ret + c7e: 8082 ret + +0000000000000c80 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + c80: 48b5 li a7,13 + ecall + c82: 00000073 ecall + ret + c86: 8082 ret + +0000000000000c88 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + c88: 48b9 li a7,14 + ecall + c8a: 00000073 ecall + ret + c8e: 8082 ret + +0000000000000c90 <trace>: +.global trace +trace: + li a7, SYS_trace + c90: 48d9 li a7,22 + ecall + c92: 00000073 ecall + ret + c96: 8082 ret + +0000000000000c98 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + c98: 48dd li a7,23 + ecall + c9a: 00000073 ecall + ret + c9e: 8082 ret + +0000000000000ca0 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + ca0: 48e1 li a7,24 + ecall + ca2: 00000073 ecall + ret + ca6: 8082 ret + +0000000000000ca8 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + ca8: 1101 addi sp,sp,-32 + caa: ec06 sd ra,24(sp) + cac: e822 sd s0,16(sp) + cae: 1000 addi s0,sp,32 + cb0: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + cb4: 4605 li a2,1 + cb6: fef40593 addi a1,s0,-17 + cba: f57ff0ef jal ra,c10 <write> +} + cbe: 60e2 ld ra,24(sp) + cc0: 6442 ld s0,16(sp) + cc2: 6105 addi sp,sp,32 + cc4: 8082 ret + +0000000000000cc6 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + cc6: 7139 addi sp,sp,-64 + cc8: fc06 sd ra,56(sp) + cca: f822 sd s0,48(sp) + ccc: f426 sd s1,40(sp) + cce: f04a sd s2,32(sp) + cd0: ec4e sd s3,24(sp) + cd2: 0080 addi s0,sp,64 + cd4: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + cd6: c299 beqz a3,cdc <printint+0x16> + cd8: 0805c763 bltz a1,d66 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + cdc: 2581 sext.w a1,a1 + neg = 0; + cde: 4881 li a7,0 + ce0: fc040693 addi a3,s0,-64 + } + + i = 0; + ce4: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + ce6: 2601 sext.w a2,a2 + ce8: 00000517 auipc a0,0x0 + cec: 61050513 addi a0,a0,1552 # 12f8 <digits> + cf0: 883a mv a6,a4 + cf2: 2705 addiw a4,a4,1 + cf4: 02c5f7bb remuw a5,a1,a2 + cf8: 1782 slli a5,a5,0x20 + cfa: 9381 srli a5,a5,0x20 + cfc: 97aa add a5,a5,a0 + cfe: 0007c783 lbu a5,0(a5) + d02: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + d06: 0005879b sext.w a5,a1 + d0a: 02c5d5bb divuw a1,a1,a2 + d0e: 0685 addi a3,a3,1 + d10: fec7f0e3 bgeu a5,a2,cf0 <printint+0x2a> + if(neg) + d14: 00088c63 beqz a7,d2c <printint+0x66> + buf[i++] = '-'; + d18: fd070793 addi a5,a4,-48 + d1c: 00878733 add a4,a5,s0 + d20: 02d00793 li a5,45 + d24: fef70823 sb a5,-16(a4) + d28: 0028071b addiw a4,a6,2 + + while(--i >= 0) + d2c: 02e05663 blez a4,d58 <printint+0x92> + d30: fc040793 addi a5,s0,-64 + d34: 00e78933 add s2,a5,a4 + d38: fff78993 addi s3,a5,-1 + d3c: 99ba add s3,s3,a4 + d3e: 377d addiw a4,a4,-1 + d40: 1702 slli a4,a4,0x20 + d42: 9301 srli a4,a4,0x20 + d44: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + d48: fff94583 lbu a1,-1(s2) + d4c: 8526 mv a0,s1 + d4e: f5bff0ef jal ra,ca8 <putc> + while(--i >= 0) + d52: 197d addi s2,s2,-1 + d54: ff391ae3 bne s2,s3,d48 <printint+0x82> +} + d58: 70e2 ld ra,56(sp) + d5a: 7442 ld s0,48(sp) + d5c: 74a2 ld s1,40(sp) + d5e: 7902 ld s2,32(sp) + d60: 69e2 ld s3,24(sp) + d62: 6121 addi sp,sp,64 + d64: 8082 ret + x = -xx; + d66: 40b005bb negw a1,a1 + neg = 1; + d6a: 4885 li a7,1 + x = -xx; + d6c: bf95 j ce0 <printint+0x1a> + +0000000000000d6e <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + d6e: 7119 addi sp,sp,-128 + d70: fc86 sd ra,120(sp) + d72: f8a2 sd s0,112(sp) + d74: f4a6 sd s1,104(sp) + d76: f0ca sd s2,96(sp) + d78: ecce sd s3,88(sp) + d7a: e8d2 sd s4,80(sp) + d7c: e4d6 sd s5,72(sp) + d7e: e0da sd s6,64(sp) + d80: fc5e sd s7,56(sp) + d82: f862 sd s8,48(sp) + d84: f466 sd s9,40(sp) + d86: f06a sd s10,32(sp) + d88: ec6e sd s11,24(sp) + d8a: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + d8c: 0005c903 lbu s2,0(a1) + d90: 22090e63 beqz s2,fcc <vprintf+0x25e> + d94: 8b2a mv s6,a0 + d96: 8a2e mv s4,a1 + d98: 8bb2 mv s7,a2 + state = 0; + d9a: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + d9c: 4481 li s1,0 + d9e: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + da0: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + da4: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + da8: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + dac: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + db0: 00000c97 auipc s9,0x0 + db4: 548c8c93 addi s9,s9,1352 # 12f8 <digits> + db8: a005 j dd8 <vprintf+0x6a> + putc(fd, c0); + dba: 85ca mv a1,s2 + dbc: 855a mv a0,s6 + dbe: eebff0ef jal ra,ca8 <putc> + dc2: a019 j dc8 <vprintf+0x5a> + } else if(state == '%'){ + dc4: 03598263 beq s3,s5,de8 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + dc8: 2485 addiw s1,s1,1 + dca: 8726 mv a4,s1 + dcc: 009a07b3 add a5,s4,s1 + dd0: 0007c903 lbu s2,0(a5) + dd4: 1e090c63 beqz s2,fcc <vprintf+0x25e> + c0 = fmt[i] & 0xff; + dd8: 0009079b sext.w a5,s2 + if(state == 0){ + ddc: fe0994e3 bnez s3,dc4 <vprintf+0x56> + if(c0 == '%'){ + de0: fd579de3 bne a5,s5,dba <vprintf+0x4c> + state = '%'; + de4: 89be mv s3,a5 + de6: b7cd j dc8 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + de8: cfa5 beqz a5,e60 <vprintf+0xf2> + dea: 00ea06b3 add a3,s4,a4 + dee: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + df2: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + df4: c681 beqz a3,dfc <vprintf+0x8e> + df6: 9752 add a4,a4,s4 + df8: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + dfc: 03878a63 beq a5,s8,e30 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + e00: 05a78463 beq a5,s10,e48 <vprintf+0xda> + } else if(c0 == 'u'){ + e04: 0db78763 beq a5,s11,ed2 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + e08: 07800713 li a4,120 + e0c: 10e78963 beq a5,a4,f1e <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + e10: 07000713 li a4,112 + e14: 12e78e63 beq a5,a4,f50 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + e18: 07300713 li a4,115 + e1c: 16e78b63 beq a5,a4,f92 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + e20: 05579063 bne a5,s5,e60 <vprintf+0xf2> + putc(fd, '%'); + e24: 85d6 mv a1,s5 + e26: 855a mv a0,s6 + e28: e81ff0ef jal ra,ca8 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + e2c: 4981 li s3,0 + e2e: bf69 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + e30: 008b8913 addi s2,s7,8 + e34: 4685 li a3,1 + e36: 4629 li a2,10 + e38: 000ba583 lw a1,0(s7) + e3c: 855a mv a0,s6 + e3e: e89ff0ef jal ra,cc6 <printint> + e42: 8bca mv s7,s2 + state = 0; + e44: 4981 li s3,0 + e46: b749 j dc8 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + e48: 03868663 beq a3,s8,e74 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + e4c: 05a68163 beq a3,s10,e8e <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + e50: 09b68d63 beq a3,s11,eea <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + e54: 03a68f63 beq a3,s10,e92 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + e58: 07800793 li a5,120 + e5c: 0cf68d63 beq a3,a5,f36 <vprintf+0x1c8> + putc(fd, '%'); + e60: 85d6 mv a1,s5 + e62: 855a mv a0,s6 + e64: e45ff0ef jal ra,ca8 <putc> + putc(fd, c0); + e68: 85ca mv a1,s2 + e6a: 855a mv a0,s6 + e6c: e3dff0ef jal ra,ca8 <putc> + state = 0; + e70: 4981 li s3,0 + e72: bf99 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + e74: 008b8913 addi s2,s7,8 + e78: 4685 li a3,1 + e7a: 4629 li a2,10 + e7c: 000ba583 lw a1,0(s7) + e80: 855a mv a0,s6 + e82: e45ff0ef jal ra,cc6 <printint> + i += 1; + e86: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + e88: 8bca mv s7,s2 + state = 0; + e8a: 4981 li s3,0 + i += 1; + e8c: bf35 j dc8 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + e8e: 03860563 beq a2,s8,eb8 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + e92: 07b60963 beq a2,s11,f04 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + e96: 07800793 li a5,120 + e9a: fcf613e3 bne a2,a5,e60 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + e9e: 008b8913 addi s2,s7,8 + ea2: 4681 li a3,0 + ea4: 4641 li a2,16 + ea6: 000ba583 lw a1,0(s7) + eaa: 855a mv a0,s6 + eac: e1bff0ef jal ra,cc6 <printint> + i += 2; + eb0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + eb2: 8bca mv s7,s2 + state = 0; + eb4: 4981 li s3,0 + i += 2; + eb6: bf09 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + eb8: 008b8913 addi s2,s7,8 + ebc: 4685 li a3,1 + ebe: 4629 li a2,10 + ec0: 000ba583 lw a1,0(s7) + ec4: 855a mv a0,s6 + ec6: e01ff0ef jal ra,cc6 <printint> + i += 2; + eca: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + ecc: 8bca mv s7,s2 + state = 0; + ece: 4981 li s3,0 + i += 2; + ed0: bde5 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + ed2: 008b8913 addi s2,s7,8 + ed6: 4681 li a3,0 + ed8: 4629 li a2,10 + eda: 000ba583 lw a1,0(s7) + ede: 855a mv a0,s6 + ee0: de7ff0ef jal ra,cc6 <printint> + ee4: 8bca mv s7,s2 + state = 0; + ee6: 4981 li s3,0 + ee8: b5c5 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + eea: 008b8913 addi s2,s7,8 + eee: 4681 li a3,0 + ef0: 4629 li a2,10 + ef2: 000ba583 lw a1,0(s7) + ef6: 855a mv a0,s6 + ef8: dcfff0ef jal ra,cc6 <printint> + i += 1; + efc: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + efe: 8bca mv s7,s2 + state = 0; + f00: 4981 li s3,0 + i += 1; + f02: b5d9 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + f04: 008b8913 addi s2,s7,8 + f08: 4681 li a3,0 + f0a: 4629 li a2,10 + f0c: 000ba583 lw a1,0(s7) + f10: 855a mv a0,s6 + f12: db5ff0ef jal ra,cc6 <printint> + i += 2; + f16: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + f18: 8bca mv s7,s2 + state = 0; + f1a: 4981 li s3,0 + i += 2; + f1c: b575 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + f1e: 008b8913 addi s2,s7,8 + f22: 4681 li a3,0 + f24: 4641 li a2,16 + f26: 000ba583 lw a1,0(s7) + f2a: 855a mv a0,s6 + f2c: d9bff0ef jal ra,cc6 <printint> + f30: 8bca mv s7,s2 + state = 0; + f32: 4981 li s3,0 + f34: bd51 j dc8 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + f36: 008b8913 addi s2,s7,8 + f3a: 4681 li a3,0 + f3c: 4641 li a2,16 + f3e: 000ba583 lw a1,0(s7) + f42: 855a mv a0,s6 + f44: d83ff0ef jal ra,cc6 <printint> + i += 1; + f48: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + f4a: 8bca mv s7,s2 + state = 0; + f4c: 4981 li s3,0 + i += 1; + f4e: bdad j dc8 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + f50: 008b8793 addi a5,s7,8 + f54: f8f43423 sd a5,-120(s0) + f58: 000bb983 ld s3,0(s7) + putc(fd, '0'); + f5c: 03000593 li a1,48 + f60: 855a mv a0,s6 + f62: d47ff0ef jal ra,ca8 <putc> + putc(fd, 'x'); + f66: 07800593 li a1,120 + f6a: 855a mv a0,s6 + f6c: d3dff0ef jal ra,ca8 <putc> + f70: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + f72: 03c9d793 srli a5,s3,0x3c + f76: 97e6 add a5,a5,s9 + f78: 0007c583 lbu a1,0(a5) + f7c: 855a mv a0,s6 + f7e: d2bff0ef jal ra,ca8 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + f82: 0992 slli s3,s3,0x4 + f84: 397d addiw s2,s2,-1 + f86: fe0916e3 bnez s2,f72 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + f8a: f8843b83 ld s7,-120(s0) + state = 0; + f8e: 4981 li s3,0 + f90: bd25 j dc8 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + f92: 008b8993 addi s3,s7,8 + f96: 000bb903 ld s2,0(s7) + f9a: 00090f63 beqz s2,fb8 <vprintf+0x24a> + for(; *s; s++) + f9e: 00094583 lbu a1,0(s2) + fa2: c195 beqz a1,fc6 <vprintf+0x258> + putc(fd, *s); + fa4: 855a mv a0,s6 + fa6: d03ff0ef jal ra,ca8 <putc> + for(; *s; s++) + faa: 0905 addi s2,s2,1 + fac: 00094583 lbu a1,0(s2) + fb0: f9f5 bnez a1,fa4 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + fb2: 8bce mv s7,s3 + state = 0; + fb4: 4981 li s3,0 + fb6: bd09 j dc8 <vprintf+0x5a> + s = "(null)"; + fb8: 00000917 auipc s2,0x0 + fbc: 33890913 addi s2,s2,824 # 12f0 <malloc+0x228> + for(; *s; s++) + fc0: 02800593 li a1,40 + fc4: b7c5 j fa4 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + fc6: 8bce mv s7,s3 + state = 0; + fc8: 4981 li s3,0 + fca: bbfd j dc8 <vprintf+0x5a> + } + } +} + fcc: 70e6 ld ra,120(sp) + fce: 7446 ld s0,112(sp) + fd0: 74a6 ld s1,104(sp) + fd2: 7906 ld s2,96(sp) + fd4: 69e6 ld s3,88(sp) + fd6: 6a46 ld s4,80(sp) + fd8: 6aa6 ld s5,72(sp) + fda: 6b06 ld s6,64(sp) + fdc: 7be2 ld s7,56(sp) + fde: 7c42 ld s8,48(sp) + fe0: 7ca2 ld s9,40(sp) + fe2: 7d02 ld s10,32(sp) + fe4: 6de2 ld s11,24(sp) + fe6: 6109 addi sp,sp,128 + fe8: 8082 ret + +0000000000000fea <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + fea: 715d addi sp,sp,-80 + fec: ec06 sd ra,24(sp) + fee: e822 sd s0,16(sp) + ff0: 1000 addi s0,sp,32 + ff2: e010 sd a2,0(s0) + ff4: e414 sd a3,8(s0) + ff6: e818 sd a4,16(s0) + ff8: ec1c sd a5,24(s0) + ffa: 03043023 sd a6,32(s0) + ffe: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 1002: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 1006: 8622 mv a2,s0 + 1008: d67ff0ef jal ra,d6e <vprintf> +} + 100c: 60e2 ld ra,24(sp) + 100e: 6442 ld s0,16(sp) + 1010: 6161 addi sp,sp,80 + 1012: 8082 ret + +0000000000001014 <printf>: + +void +printf(const char *fmt, ...) +{ + 1014: 711d addi sp,sp,-96 + 1016: ec06 sd ra,24(sp) + 1018: e822 sd s0,16(sp) + 101a: 1000 addi s0,sp,32 + 101c: e40c sd a1,8(s0) + 101e: e810 sd a2,16(s0) + 1020: ec14 sd a3,24(s0) + 1022: f018 sd a4,32(s0) + 1024: f41c sd a5,40(s0) + 1026: 03043823 sd a6,48(s0) + 102a: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 102e: 00840613 addi a2,s0,8 + 1032: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 1036: 85aa mv a1,a0 + 1038: 4505 li a0,1 + 103a: d35ff0ef jal ra,d6e <vprintf> +} + 103e: 60e2 ld ra,24(sp) + 1040: 6442 ld s0,16(sp) + 1042: 6125 addi sp,sp,96 + 1044: 8082 ret + +0000000000001046 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 1046: 1141 addi sp,sp,-16 + 1048: e422 sd s0,8(sp) + 104a: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 104c: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 1050: 00001797 auipc a5,0x1 + 1054: fc07b783 ld a5,-64(a5) # 2010 <freep> + 1058: a02d j 1082 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 105a: 4618 lw a4,8(a2) + 105c: 9f2d addw a4,a4,a1 + 105e: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 1062: 6398 ld a4,0(a5) + 1064: 6310 ld a2,0(a4) + 1066: a83d j 10a4 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 1068: ff852703 lw a4,-8(a0) + 106c: 9f31 addw a4,a4,a2 + 106e: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 1070: ff053683 ld a3,-16(a0) + 1074: a091 j 10b8 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 1076: 6398 ld a4,0(a5) + 1078: 00e7e463 bltu a5,a4,1080 <free+0x3a> + 107c: 00e6ea63 bltu a3,a4,1090 <free+0x4a> +{ + 1080: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 1082: fed7fae3 bgeu a5,a3,1076 <free+0x30> + 1086: 6398 ld a4,0(a5) + 1088: 00e6e463 bltu a3,a4,1090 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 108c: fee7eae3 bltu a5,a4,1080 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 1090: ff852583 lw a1,-8(a0) + 1094: 6390 ld a2,0(a5) + 1096: 02059813 slli a6,a1,0x20 + 109a: 01c85713 srli a4,a6,0x1c + 109e: 9736 add a4,a4,a3 + 10a0: fae60de3 beq a2,a4,105a <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 10a4: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 10a8: 4790 lw a2,8(a5) + 10aa: 02061593 slli a1,a2,0x20 + 10ae: 01c5d713 srli a4,a1,0x1c + 10b2: 973e add a4,a4,a5 + 10b4: fae68ae3 beq a3,a4,1068 <free+0x22> + p->s.ptr = bp->s.ptr; + 10b8: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 10ba: 00001717 auipc a4,0x1 + 10be: f4f73b23 sd a5,-170(a4) # 2010 <freep> +} + 10c2: 6422 ld s0,8(sp) + 10c4: 0141 addi sp,sp,16 + 10c6: 8082 ret + +00000000000010c8 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 10c8: 7139 addi sp,sp,-64 + 10ca: fc06 sd ra,56(sp) + 10cc: f822 sd s0,48(sp) + 10ce: f426 sd s1,40(sp) + 10d0: f04a sd s2,32(sp) + 10d2: ec4e sd s3,24(sp) + 10d4: e852 sd s4,16(sp) + 10d6: e456 sd s5,8(sp) + 10d8: e05a sd s6,0(sp) + 10da: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 10dc: 02051493 slli s1,a0,0x20 + 10e0: 9081 srli s1,s1,0x20 + 10e2: 04bd addi s1,s1,15 + 10e4: 8091 srli s1,s1,0x4 + 10e6: 0014899b addiw s3,s1,1 + 10ea: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 10ec: 00001517 auipc a0,0x1 + 10f0: f2453503 ld a0,-220(a0) # 2010 <freep> + 10f4: c515 beqz a0,1120 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 10f6: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 10f8: 4798 lw a4,8(a5) + 10fa: 02977f63 bgeu a4,s1,1138 <malloc+0x70> + 10fe: 8a4e mv s4,s3 + 1100: 0009871b sext.w a4,s3 + 1104: 6685 lui a3,0x1 + 1106: 00d77363 bgeu a4,a3,110c <malloc+0x44> + 110a: 6a05 lui s4,0x1 + 110c: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 1110: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 1114: 00001917 auipc s2,0x1 + 1118: efc90913 addi s2,s2,-260 # 2010 <freep> + if(p == (char*)-1) + 111c: 5afd li s5,-1 + 111e: a885 j 118e <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 1120: 00001797 auipc a5,0x1 + 1124: f6878793 addi a5,a5,-152 # 2088 <base> + 1128: 00001717 auipc a4,0x1 + 112c: eef73423 sd a5,-280(a4) # 2010 <freep> + 1130: e39c sd a5,0(a5) + base.s.size = 0; + 1132: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 1136: b7e1 j 10fe <malloc+0x36> + if(p->s.size == nunits) + 1138: 02e48c63 beq s1,a4,1170 <malloc+0xa8> + p->s.size -= nunits; + 113c: 4137073b subw a4,a4,s3 + 1140: c798 sw a4,8(a5) + p += p->s.size; + 1142: 02071693 slli a3,a4,0x20 + 1146: 01c6d713 srli a4,a3,0x1c + 114a: 97ba add a5,a5,a4 + p->s.size = nunits; + 114c: 0137a423 sw s3,8(a5) + freep = prevp; + 1150: 00001717 auipc a4,0x1 + 1154: eca73023 sd a0,-320(a4) # 2010 <freep> + return (void*)(p + 1); + 1158: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 115c: 70e2 ld ra,56(sp) + 115e: 7442 ld s0,48(sp) + 1160: 74a2 ld s1,40(sp) + 1162: 7902 ld s2,32(sp) + 1164: 69e2 ld s3,24(sp) + 1166: 6a42 ld s4,16(sp) + 1168: 6aa2 ld s5,8(sp) + 116a: 6b02 ld s6,0(sp) + 116c: 6121 addi sp,sp,64 + 116e: 8082 ret + prevp->s.ptr = p->s.ptr; + 1170: 6398 ld a4,0(a5) + 1172: e118 sd a4,0(a0) + 1174: bff1 j 1150 <malloc+0x88> + hp->s.size = nu; + 1176: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 117a: 0541 addi a0,a0,16 + 117c: ecbff0ef jal ra,1046 <free> + return freep; + 1180: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 1184: dd61 beqz a0,115c <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1186: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 1188: 4798 lw a4,8(a5) + 118a: fa9777e3 bgeu a4,s1,1138 <malloc+0x70> + if(p == freep) + 118e: 00093703 ld a4,0(s2) + 1192: 853e mv a0,a5 + 1194: fef719e3 bne a4,a5,1186 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 1198: 8552 mv a0,s4 + 119a: adfff0ef jal ra,c78 <sbrk> + if(p == (char*)-1) + 119e: fd551ce3 bne a0,s5,1176 <malloc+0xae> + return 0; + 11a2: 4501 li a0,0 + 11a4: bf65 j 115c <malloc+0x94> diff --git a/user/sh.d b/user/sh.d new file mode 100644 index 0000000000000000000000000000000000000000..c3b3894003b1d29ccd57b09236e27adc5959a6a9 --- /dev/null +++ b/user/sh.d @@ -0,0 +1,2 @@ +user/sh.o: user/sh.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h user/user.h kernel/fcntl.h diff --git a/user/sh.o b/user/sh.o new file mode 100644 index 0000000000000000000000000000000000000000..bec67e04e092e495d4ea5529a659a01e84042299 Binary files /dev/null and b/user/sh.o differ diff --git a/user/sh.sym b/user/sh.sym new file mode 100644 index 0000000000000000000000000000000000000000..4e4026a79e053adaaaa99e0cd4d720812bb09ef3 --- /dev/null +++ b/user/sh.sym @@ -0,0 +1,87 @@ +0000000000000000 .text +00000000000011a8 .rodata +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 sh.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000ca8 putc +0000000000000cc6 printint +00000000000012f8 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002088 base +0000000000000998 strcpy +0000000000001014 printf +0000000000000b42 memmove +0000000000000c38 mknod +00000000000001d0 execcmd +0000000000000c90 trace +0000000000000a50 gets +0000000000000c70 getpid +0000000000000668 parsepipe +000000000000084e parsecmd +0000000000000bd4 memcpy +00000000000002da backcmd +0000000000000440 peek +00000000000004a4 parseredirs +000000000000030e gettoken +00000000000010c8 malloc +0000000000000c80 sleep +0000000000002008 whitespace +0000000000000c98 mycall +0000000000000068 fork1 +00000000000007ce nulterminate +0000000000000c00 pipe +0000000000000000 getcmd +0000000000000c10 write +0000000000000c48 fstat +0000000000000fea fprintf +0000000000000c20 kill +0000000000000d6e vprintf +0000000000000c60 chdir +00000000000006c2 parseline +000000000000008e runcmd +000000000000074a parseblock +0000000000000c28 exec +0000000000000bf8 wait +0000000000002000 symbols +0000000000000c08 read +0000000000000584 parseexec +0000000000000c40 unlink +000000000000004a panic +0000000000000b9a memcmp +0000000000000be8 fork +0000000000000c78 sbrk +0000000000000c88 uptime +0000000000000a0a memset +00000000000008be main +0000000000000ca0 GSCinfo +00000000000009b4 strcmp +0000000000000c68 dup +000000000000025e pipecmd +00000000000001fe redircmd +0000000000000ac0 stat +0000000000000c50 link +0000000000000bf0 exit +0000000000000986 start +0000000000000afa atoi +00000000000009e0 strlen +0000000000000c30 open +0000000000000a2c strchr +0000000000000c58 mkdir +0000000000000c18 close +000000000000029c listcmd +0000000000001046 free diff --git a/user/stressfs.asm b/user/stressfs.asm new file mode 100644 index 0000000000000000000000000000000000000000..ff589dadb0a00149bd65acae5fe678189c2d2f21 --- /dev/null +++ b/user/stressfs.asm @@ -0,0 +1,1532 @@ + +user/_stressfs: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +int +main(int argc, char *argv[]) +{ + 0: dd010113 addi sp,sp,-560 + 4: 22113423 sd ra,552(sp) + 8: 22813023 sd s0,544(sp) + c: 20913c23 sd s1,536(sp) + 10: 21213823 sd s2,528(sp) + 14: 1c00 addi s0,sp,560 + int fd, i; + char path[] = "stressfs0"; + 16: 00001797 auipc a5,0x1 + 1a: 91a78793 addi a5,a5,-1766 # 930 <malloc+0x116> + 1e: 6398 ld a4,0(a5) + 20: fce43823 sd a4,-48(s0) + 24: 0087d783 lhu a5,8(a5) + 28: fcf41c23 sh a5,-40(s0) + char data[512]; + + printf("stressfs starting\n"); + 2c: 00001517 auipc a0,0x1 + 30: 8d450513 addi a0,a0,-1836 # 900 <malloc+0xe6> + 34: 732000ef jal ra,766 <printf> + memset(data, 'a', sizeof(data)); + 38: 20000613 li a2,512 + 3c: 06100593 li a1,97 + 40: dd040513 addi a0,s0,-560 + 44: 118000ef jal ra,15c <memset> + + for(i = 0; i < 4; i++) + 48: 4481 li s1,0 + 4a: 4911 li s2,4 + if(fork() > 0) + 4c: 2ee000ef jal ra,33a <fork> + 50: 00a04563 bgtz a0,5a <main+0x5a> + for(i = 0; i < 4; i++) + 54: 2485 addiw s1,s1,1 + 56: ff249be3 bne s1,s2,4c <main+0x4c> + break; + + printf("write %d\n", i); + 5a: 85a6 mv a1,s1 + 5c: 00001517 auipc a0,0x1 + 60: 8bc50513 addi a0,a0,-1860 # 918 <malloc+0xfe> + 64: 702000ef jal ra,766 <printf> + + path[8] += i; + 68: fd844783 lbu a5,-40(s0) + 6c: 9fa5 addw a5,a5,s1 + 6e: fcf40c23 sb a5,-40(s0) + fd = open(path, O_CREATE | O_RDWR); + 72: 20200593 li a1,514 + 76: fd040513 addi a0,s0,-48 + 7a: 308000ef jal ra,382 <open> + 7e: 892a mv s2,a0 + 80: 44d1 li s1,20 + for(i = 0; i < 20; i++) +// printf(fd, "%d\n", i); + write(fd, data, sizeof(data)); + 82: 20000613 li a2,512 + 86: dd040593 addi a1,s0,-560 + 8a: 854a mv a0,s2 + 8c: 2d6000ef jal ra,362 <write> + for(i = 0; i < 20; i++) + 90: 34fd addiw s1,s1,-1 + 92: f8e5 bnez s1,82 <main+0x82> + close(fd); + 94: 854a mv a0,s2 + 96: 2d4000ef jal ra,36a <close> + + printf("read\n"); + 9a: 00001517 auipc a0,0x1 + 9e: 88e50513 addi a0,a0,-1906 # 928 <malloc+0x10e> + a2: 6c4000ef jal ra,766 <printf> + + fd = open(path, O_RDONLY); + a6: 4581 li a1,0 + a8: fd040513 addi a0,s0,-48 + ac: 2d6000ef jal ra,382 <open> + b0: 892a mv s2,a0 + b2: 44d1 li s1,20 + for (i = 0; i < 20; i++) + read(fd, data, sizeof(data)); + b4: 20000613 li a2,512 + b8: dd040593 addi a1,s0,-560 + bc: 854a mv a0,s2 + be: 29c000ef jal ra,35a <read> + for (i = 0; i < 20; i++) + c2: 34fd addiw s1,s1,-1 + c4: f8e5 bnez s1,b4 <main+0xb4> + close(fd); + c6: 854a mv a0,s2 + c8: 2a2000ef jal ra,36a <close> + + wait(0); + cc: 4501 li a0,0 + ce: 27c000ef jal ra,34a <wait> + + exit(0); + d2: 4501 li a0,0 + d4: 26e000ef jal ra,342 <exit> + +00000000000000d8 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + d8: 1141 addi sp,sp,-16 + da: e406 sd ra,8(sp) + dc: e022 sd s0,0(sp) + de: 0800 addi s0,sp,16 + extern int main(); + main(); + e0: f21ff0ef jal ra,0 <main> + exit(0); + e4: 4501 li a0,0 + e6: 25c000ef jal ra,342 <exit> + +00000000000000ea <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + ea: 1141 addi sp,sp,-16 + ec: e422 sd s0,8(sp) + ee: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + f0: 87aa mv a5,a0 + f2: 0585 addi a1,a1,1 + f4: 0785 addi a5,a5,1 + f6: fff5c703 lbu a4,-1(a1) + fa: fee78fa3 sb a4,-1(a5) + fe: fb75 bnez a4,f2 <strcpy+0x8> + ; + return os; +} + 100: 6422 ld s0,8(sp) + 102: 0141 addi sp,sp,16 + 104: 8082 ret + +0000000000000106 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 106: 1141 addi sp,sp,-16 + 108: e422 sd s0,8(sp) + 10a: 0800 addi s0,sp,16 + while(*p && *p == *q) + 10c: 00054783 lbu a5,0(a0) + 110: cb91 beqz a5,124 <strcmp+0x1e> + 112: 0005c703 lbu a4,0(a1) + 116: 00f71763 bne a4,a5,124 <strcmp+0x1e> + p++, q++; + 11a: 0505 addi a0,a0,1 + 11c: 0585 addi a1,a1,1 + while(*p && *p == *q) + 11e: 00054783 lbu a5,0(a0) + 122: fbe5 bnez a5,112 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 124: 0005c503 lbu a0,0(a1) +} + 128: 40a7853b subw a0,a5,a0 + 12c: 6422 ld s0,8(sp) + 12e: 0141 addi sp,sp,16 + 130: 8082 ret + +0000000000000132 <strlen>: + +uint +strlen(const char *s) +{ + 132: 1141 addi sp,sp,-16 + 134: e422 sd s0,8(sp) + 136: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 138: 00054783 lbu a5,0(a0) + 13c: cf91 beqz a5,158 <strlen+0x26> + 13e: 0505 addi a0,a0,1 + 140: 87aa mv a5,a0 + 142: 4685 li a3,1 + 144: 9e89 subw a3,a3,a0 + 146: 00f6853b addw a0,a3,a5 + 14a: 0785 addi a5,a5,1 + 14c: fff7c703 lbu a4,-1(a5) + 150: fb7d bnez a4,146 <strlen+0x14> + ; + return n; +} + 152: 6422 ld s0,8(sp) + 154: 0141 addi sp,sp,16 + 156: 8082 ret + for(n = 0; s[n]; n++) + 158: 4501 li a0,0 + 15a: bfe5 j 152 <strlen+0x20> + +000000000000015c <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 15c: 1141 addi sp,sp,-16 + 15e: e422 sd s0,8(sp) + 160: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 162: ca19 beqz a2,178 <memset+0x1c> + 164: 87aa mv a5,a0 + 166: 1602 slli a2,a2,0x20 + 168: 9201 srli a2,a2,0x20 + 16a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 16e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 172: 0785 addi a5,a5,1 + 174: fee79de3 bne a5,a4,16e <memset+0x12> + } + return dst; +} + 178: 6422 ld s0,8(sp) + 17a: 0141 addi sp,sp,16 + 17c: 8082 ret + +000000000000017e <strchr>: + +char* +strchr(const char *s, char c) +{ + 17e: 1141 addi sp,sp,-16 + 180: e422 sd s0,8(sp) + 182: 0800 addi s0,sp,16 + for(; *s; s++) + 184: 00054783 lbu a5,0(a0) + 188: cb99 beqz a5,19e <strchr+0x20> + if(*s == c) + 18a: 00f58763 beq a1,a5,198 <strchr+0x1a> + for(; *s; s++) + 18e: 0505 addi a0,a0,1 + 190: 00054783 lbu a5,0(a0) + 194: fbfd bnez a5,18a <strchr+0xc> + return (char*)s; + return 0; + 196: 4501 li a0,0 +} + 198: 6422 ld s0,8(sp) + 19a: 0141 addi sp,sp,16 + 19c: 8082 ret + return 0; + 19e: 4501 li a0,0 + 1a0: bfe5 j 198 <strchr+0x1a> + +00000000000001a2 <gets>: + +char* +gets(char *buf, int max) +{ + 1a2: 711d addi sp,sp,-96 + 1a4: ec86 sd ra,88(sp) + 1a6: e8a2 sd s0,80(sp) + 1a8: e4a6 sd s1,72(sp) + 1aa: e0ca sd s2,64(sp) + 1ac: fc4e sd s3,56(sp) + 1ae: f852 sd s4,48(sp) + 1b0: f456 sd s5,40(sp) + 1b2: f05a sd s6,32(sp) + 1b4: ec5e sd s7,24(sp) + 1b6: 1080 addi s0,sp,96 + 1b8: 8baa mv s7,a0 + 1ba: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1bc: 892a mv s2,a0 + 1be: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1c0: 4aa9 li s5,10 + 1c2: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1c4: 89a6 mv s3,s1 + 1c6: 2485 addiw s1,s1,1 + 1c8: 0344d663 bge s1,s4,1f4 <gets+0x52> + cc = read(0, &c, 1); + 1cc: 4605 li a2,1 + 1ce: faf40593 addi a1,s0,-81 + 1d2: 4501 li a0,0 + 1d4: 186000ef jal ra,35a <read> + if(cc < 1) + 1d8: 00a05e63 blez a0,1f4 <gets+0x52> + buf[i++] = c; + 1dc: faf44783 lbu a5,-81(s0) + 1e0: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1e4: 01578763 beq a5,s5,1f2 <gets+0x50> + 1e8: 0905 addi s2,s2,1 + 1ea: fd679de3 bne a5,s6,1c4 <gets+0x22> + for(i=0; i+1 < max; ){ + 1ee: 89a6 mv s3,s1 + 1f0: a011 j 1f4 <gets+0x52> + 1f2: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1f4: 99de add s3,s3,s7 + 1f6: 00098023 sb zero,0(s3) + return buf; +} + 1fa: 855e mv a0,s7 + 1fc: 60e6 ld ra,88(sp) + 1fe: 6446 ld s0,80(sp) + 200: 64a6 ld s1,72(sp) + 202: 6906 ld s2,64(sp) + 204: 79e2 ld s3,56(sp) + 206: 7a42 ld s4,48(sp) + 208: 7aa2 ld s5,40(sp) + 20a: 7b02 ld s6,32(sp) + 20c: 6be2 ld s7,24(sp) + 20e: 6125 addi sp,sp,96 + 210: 8082 ret + +0000000000000212 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 212: 1101 addi sp,sp,-32 + 214: ec06 sd ra,24(sp) + 216: e822 sd s0,16(sp) + 218: e426 sd s1,8(sp) + 21a: e04a sd s2,0(sp) + 21c: 1000 addi s0,sp,32 + 21e: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 220: 4581 li a1,0 + 222: 160000ef jal ra,382 <open> + if(fd < 0) + 226: 02054163 bltz a0,248 <stat+0x36> + 22a: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 22c: 85ca mv a1,s2 + 22e: 16c000ef jal ra,39a <fstat> + 232: 892a mv s2,a0 + close(fd); + 234: 8526 mv a0,s1 + 236: 134000ef jal ra,36a <close> + return r; +} + 23a: 854a mv a0,s2 + 23c: 60e2 ld ra,24(sp) + 23e: 6442 ld s0,16(sp) + 240: 64a2 ld s1,8(sp) + 242: 6902 ld s2,0(sp) + 244: 6105 addi sp,sp,32 + 246: 8082 ret + return -1; + 248: 597d li s2,-1 + 24a: bfc5 j 23a <stat+0x28> + +000000000000024c <atoi>: + +int +atoi(const char *s) +{ + 24c: 1141 addi sp,sp,-16 + 24e: e422 sd s0,8(sp) + 250: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 252: 00054683 lbu a3,0(a0) + 256: fd06879b addiw a5,a3,-48 + 25a: 0ff7f793 zext.b a5,a5 + 25e: 4625 li a2,9 + 260: 02f66863 bltu a2,a5,290 <atoi+0x44> + 264: 872a mv a4,a0 + n = 0; + 266: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 268: 0705 addi a4,a4,1 + 26a: 0025179b slliw a5,a0,0x2 + 26e: 9fa9 addw a5,a5,a0 + 270: 0017979b slliw a5,a5,0x1 + 274: 9fb5 addw a5,a5,a3 + 276: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 27a: 00074683 lbu a3,0(a4) + 27e: fd06879b addiw a5,a3,-48 + 282: 0ff7f793 zext.b a5,a5 + 286: fef671e3 bgeu a2,a5,268 <atoi+0x1c> + return n; +} + 28a: 6422 ld s0,8(sp) + 28c: 0141 addi sp,sp,16 + 28e: 8082 ret + n = 0; + 290: 4501 li a0,0 + 292: bfe5 j 28a <atoi+0x3e> + +0000000000000294 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 294: 1141 addi sp,sp,-16 + 296: e422 sd s0,8(sp) + 298: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 29a: 02b57463 bgeu a0,a1,2c2 <memmove+0x2e> + while(n-- > 0) + 29e: 00c05f63 blez a2,2bc <memmove+0x28> + 2a2: 1602 slli a2,a2,0x20 + 2a4: 9201 srli a2,a2,0x20 + 2a6: 00c507b3 add a5,a0,a2 + dst = vdst; + 2aa: 872a mv a4,a0 + *dst++ = *src++; + 2ac: 0585 addi a1,a1,1 + 2ae: 0705 addi a4,a4,1 + 2b0: fff5c683 lbu a3,-1(a1) + 2b4: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2b8: fee79ae3 bne a5,a4,2ac <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2bc: 6422 ld s0,8(sp) + 2be: 0141 addi sp,sp,16 + 2c0: 8082 ret + dst += n; + 2c2: 00c50733 add a4,a0,a2 + src += n; + 2c6: 95b2 add a1,a1,a2 + while(n-- > 0) + 2c8: fec05ae3 blez a2,2bc <memmove+0x28> + 2cc: fff6079b addiw a5,a2,-1 + 2d0: 1782 slli a5,a5,0x20 + 2d2: 9381 srli a5,a5,0x20 + 2d4: fff7c793 not a5,a5 + 2d8: 97ba add a5,a5,a4 + *--dst = *--src; + 2da: 15fd addi a1,a1,-1 + 2dc: 177d addi a4,a4,-1 + 2de: 0005c683 lbu a3,0(a1) + 2e2: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2e6: fee79ae3 bne a5,a4,2da <memmove+0x46> + 2ea: bfc9 j 2bc <memmove+0x28> + +00000000000002ec <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2ec: 1141 addi sp,sp,-16 + 2ee: e422 sd s0,8(sp) + 2f0: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2f2: ca05 beqz a2,322 <memcmp+0x36> + 2f4: fff6069b addiw a3,a2,-1 + 2f8: 1682 slli a3,a3,0x20 + 2fa: 9281 srli a3,a3,0x20 + 2fc: 0685 addi a3,a3,1 + 2fe: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 300: 00054783 lbu a5,0(a0) + 304: 0005c703 lbu a4,0(a1) + 308: 00e79863 bne a5,a4,318 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 30c: 0505 addi a0,a0,1 + p2++; + 30e: 0585 addi a1,a1,1 + while (n-- > 0) { + 310: fed518e3 bne a0,a3,300 <memcmp+0x14> + } + return 0; + 314: 4501 li a0,0 + 316: a019 j 31c <memcmp+0x30> + return *p1 - *p2; + 318: 40e7853b subw a0,a5,a4 +} + 31c: 6422 ld s0,8(sp) + 31e: 0141 addi sp,sp,16 + 320: 8082 ret + return 0; + 322: 4501 li a0,0 + 324: bfe5 j 31c <memcmp+0x30> + +0000000000000326 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 326: 1141 addi sp,sp,-16 + 328: e406 sd ra,8(sp) + 32a: e022 sd s0,0(sp) + 32c: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 32e: f67ff0ef jal ra,294 <memmove> +} + 332: 60a2 ld ra,8(sp) + 334: 6402 ld s0,0(sp) + 336: 0141 addi sp,sp,16 + 338: 8082 ret + +000000000000033a <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 33a: 4885 li a7,1 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 <exit>: +.global exit +exit: + li a7, SYS_exit + 342: 4889 li a7,2 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a <wait>: +.global wait +wait: + li a7, SYS_wait + 34a: 488d li a7,3 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 352: 4891 li a7,4 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a <read>: +.global read +read: + li a7, SYS_read + 35a: 4895 li a7,5 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 <write>: +.global write +write: + li a7, SYS_write + 362: 48c1 li a7,16 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a <close>: +.global close +close: + li a7, SYS_close + 36a: 48d5 li a7,21 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 <kill>: +.global kill +kill: + li a7, SYS_kill + 372: 4899 li a7,6 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a <exec>: +.global exec +exec: + li a7, SYS_exec + 37a: 489d li a7,7 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 <open>: +.global open +open: + li a7, SYS_open + 382: 48bd li a7,15 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 38a: 48c5 li a7,17 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 392: 48c9 li a7,18 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 39a: 48a1 li a7,8 + ecall + 39c: 00000073 ecall + ret + 3a0: 8082 ret + +00000000000003a2 <link>: +.global link +link: + li a7, SYS_link + 3a2: 48cd li a7,19 + ecall + 3a4: 00000073 ecall + ret + 3a8: 8082 ret + +00000000000003aa <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 3aa: 48d1 li a7,20 + ecall + 3ac: 00000073 ecall + ret + 3b0: 8082 ret + +00000000000003b2 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 3b2: 48a5 li a7,9 + ecall + 3b4: 00000073 ecall + ret + 3b8: 8082 ret + +00000000000003ba <dup>: +.global dup +dup: + li a7, SYS_dup + 3ba: 48a9 li a7,10 + ecall + 3bc: 00000073 ecall + ret + 3c0: 8082 ret + +00000000000003c2 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 3c2: 48ad li a7,11 + ecall + 3c4: 00000073 ecall + ret + 3c8: 8082 ret + +00000000000003ca <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 3ca: 48b1 li a7,12 + ecall + 3cc: 00000073 ecall + ret + 3d0: 8082 ret + +00000000000003d2 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 3d2: 48b5 li a7,13 + ecall + 3d4: 00000073 ecall + ret + 3d8: 8082 ret + +00000000000003da <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 3da: 48b9 li a7,14 + ecall + 3dc: 00000073 ecall + ret + 3e0: 8082 ret + +00000000000003e2 <trace>: +.global trace +trace: + li a7, SYS_trace + 3e2: 48d9 li a7,22 + ecall + 3e4: 00000073 ecall + ret + 3e8: 8082 ret + +00000000000003ea <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 3ea: 48dd li a7,23 + ecall + 3ec: 00000073 ecall + ret + 3f0: 8082 ret + +00000000000003f2 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 3f2: 48e1 li a7,24 + ecall + 3f4: 00000073 ecall + ret + 3f8: 8082 ret + +00000000000003fa <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3fa: 1101 addi sp,sp,-32 + 3fc: ec06 sd ra,24(sp) + 3fe: e822 sd s0,16(sp) + 400: 1000 addi s0,sp,32 + 402: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 406: 4605 li a2,1 + 408: fef40593 addi a1,s0,-17 + 40c: f57ff0ef jal ra,362 <write> +} + 410: 60e2 ld ra,24(sp) + 412: 6442 ld s0,16(sp) + 414: 6105 addi sp,sp,32 + 416: 8082 ret + +0000000000000418 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 418: 7139 addi sp,sp,-64 + 41a: fc06 sd ra,56(sp) + 41c: f822 sd s0,48(sp) + 41e: f426 sd s1,40(sp) + 420: f04a sd s2,32(sp) + 422: ec4e sd s3,24(sp) + 424: 0080 addi s0,sp,64 + 426: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 428: c299 beqz a3,42e <printint+0x16> + 42a: 0805c763 bltz a1,4b8 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 42e: 2581 sext.w a1,a1 + neg = 0; + 430: 4881 li a7,0 + 432: fc040693 addi a3,s0,-64 + } + + i = 0; + 436: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 438: 2601 sext.w a2,a2 + 43a: 00000517 auipc a0,0x0 + 43e: 50e50513 addi a0,a0,1294 # 948 <digits> + 442: 883a mv a6,a4 + 444: 2705 addiw a4,a4,1 + 446: 02c5f7bb remuw a5,a1,a2 + 44a: 1782 slli a5,a5,0x20 + 44c: 9381 srli a5,a5,0x20 + 44e: 97aa add a5,a5,a0 + 450: 0007c783 lbu a5,0(a5) + 454: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 458: 0005879b sext.w a5,a1 + 45c: 02c5d5bb divuw a1,a1,a2 + 460: 0685 addi a3,a3,1 + 462: fec7f0e3 bgeu a5,a2,442 <printint+0x2a> + if(neg) + 466: 00088c63 beqz a7,47e <printint+0x66> + buf[i++] = '-'; + 46a: fd070793 addi a5,a4,-48 + 46e: 00878733 add a4,a5,s0 + 472: 02d00793 li a5,45 + 476: fef70823 sb a5,-16(a4) + 47a: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 47e: 02e05663 blez a4,4aa <printint+0x92> + 482: fc040793 addi a5,s0,-64 + 486: 00e78933 add s2,a5,a4 + 48a: fff78993 addi s3,a5,-1 + 48e: 99ba add s3,s3,a4 + 490: 377d addiw a4,a4,-1 + 492: 1702 slli a4,a4,0x20 + 494: 9301 srli a4,a4,0x20 + 496: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 49a: fff94583 lbu a1,-1(s2) + 49e: 8526 mv a0,s1 + 4a0: f5bff0ef jal ra,3fa <putc> + while(--i >= 0) + 4a4: 197d addi s2,s2,-1 + 4a6: ff391ae3 bne s2,s3,49a <printint+0x82> +} + 4aa: 70e2 ld ra,56(sp) + 4ac: 7442 ld s0,48(sp) + 4ae: 74a2 ld s1,40(sp) + 4b0: 7902 ld s2,32(sp) + 4b2: 69e2 ld s3,24(sp) + 4b4: 6121 addi sp,sp,64 + 4b6: 8082 ret + x = -xx; + 4b8: 40b005bb negw a1,a1 + neg = 1; + 4bc: 4885 li a7,1 + x = -xx; + 4be: bf95 j 432 <printint+0x1a> + +00000000000004c0 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4c0: 7119 addi sp,sp,-128 + 4c2: fc86 sd ra,120(sp) + 4c4: f8a2 sd s0,112(sp) + 4c6: f4a6 sd s1,104(sp) + 4c8: f0ca sd s2,96(sp) + 4ca: ecce sd s3,88(sp) + 4cc: e8d2 sd s4,80(sp) + 4ce: e4d6 sd s5,72(sp) + 4d0: e0da sd s6,64(sp) + 4d2: fc5e sd s7,56(sp) + 4d4: f862 sd s8,48(sp) + 4d6: f466 sd s9,40(sp) + 4d8: f06a sd s10,32(sp) + 4da: ec6e sd s11,24(sp) + 4dc: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4de: 0005c903 lbu s2,0(a1) + 4e2: 22090e63 beqz s2,71e <vprintf+0x25e> + 4e6: 8b2a mv s6,a0 + 4e8: 8a2e mv s4,a1 + 4ea: 8bb2 mv s7,a2 + state = 0; + 4ec: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4ee: 4481 li s1,0 + 4f0: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4f2: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4f6: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4fa: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4fe: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 502: 00000c97 auipc s9,0x0 + 506: 446c8c93 addi s9,s9,1094 # 948 <digits> + 50a: a005 j 52a <vprintf+0x6a> + putc(fd, c0); + 50c: 85ca mv a1,s2 + 50e: 855a mv a0,s6 + 510: eebff0ef jal ra,3fa <putc> + 514: a019 j 51a <vprintf+0x5a> + } else if(state == '%'){ + 516: 03598263 beq s3,s5,53a <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 51a: 2485 addiw s1,s1,1 + 51c: 8726 mv a4,s1 + 51e: 009a07b3 add a5,s4,s1 + 522: 0007c903 lbu s2,0(a5) + 526: 1e090c63 beqz s2,71e <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 52a: 0009079b sext.w a5,s2 + if(state == 0){ + 52e: fe0994e3 bnez s3,516 <vprintf+0x56> + if(c0 == '%'){ + 532: fd579de3 bne a5,s5,50c <vprintf+0x4c> + state = '%'; + 536: 89be mv s3,a5 + 538: b7cd j 51a <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 53a: cfa5 beqz a5,5b2 <vprintf+0xf2> + 53c: 00ea06b3 add a3,s4,a4 + 540: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 544: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 546: c681 beqz a3,54e <vprintf+0x8e> + 548: 9752 add a4,a4,s4 + 54a: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 54e: 03878a63 beq a5,s8,582 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 552: 05a78463 beq a5,s10,59a <vprintf+0xda> + } else if(c0 == 'u'){ + 556: 0db78763 beq a5,s11,624 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 55a: 07800713 li a4,120 + 55e: 10e78963 beq a5,a4,670 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 562: 07000713 li a4,112 + 566: 12e78e63 beq a5,a4,6a2 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 56a: 07300713 li a4,115 + 56e: 16e78b63 beq a5,a4,6e4 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 572: 05579063 bne a5,s5,5b2 <vprintf+0xf2> + putc(fd, '%'); + 576: 85d6 mv a1,s5 + 578: 855a mv a0,s6 + 57a: e81ff0ef jal ra,3fa <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 57e: 4981 li s3,0 + 580: bf69 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 582: 008b8913 addi s2,s7,8 + 586: 4685 li a3,1 + 588: 4629 li a2,10 + 58a: 000ba583 lw a1,0(s7) + 58e: 855a mv a0,s6 + 590: e89ff0ef jal ra,418 <printint> + 594: 8bca mv s7,s2 + state = 0; + 596: 4981 li s3,0 + 598: b749 j 51a <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 59a: 03868663 beq a3,s8,5c6 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 59e: 05a68163 beq a3,s10,5e0 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 5a2: 09b68d63 beq a3,s11,63c <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5a6: 03a68f63 beq a3,s10,5e4 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 5aa: 07800793 li a5,120 + 5ae: 0cf68d63 beq a3,a5,688 <vprintf+0x1c8> + putc(fd, '%'); + 5b2: 85d6 mv a1,s5 + 5b4: 855a mv a0,s6 + 5b6: e45ff0ef jal ra,3fa <putc> + putc(fd, c0); + 5ba: 85ca mv a1,s2 + 5bc: 855a mv a0,s6 + 5be: e3dff0ef jal ra,3fa <putc> + state = 0; + 5c2: 4981 li s3,0 + 5c4: bf99 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5c6: 008b8913 addi s2,s7,8 + 5ca: 4685 li a3,1 + 5cc: 4629 li a2,10 + 5ce: 000ba583 lw a1,0(s7) + 5d2: 855a mv a0,s6 + 5d4: e45ff0ef jal ra,418 <printint> + i += 1; + 5d8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5da: 8bca mv s7,s2 + state = 0; + 5dc: 4981 li s3,0 + i += 1; + 5de: bf35 j 51a <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5e0: 03860563 beq a2,s8,60a <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5e4: 07b60963 beq a2,s11,656 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5e8: 07800793 li a5,120 + 5ec: fcf613e3 bne a2,a5,5b2 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 5f0: 008b8913 addi s2,s7,8 + 5f4: 4681 li a3,0 + 5f6: 4641 li a2,16 + 5f8: 000ba583 lw a1,0(s7) + 5fc: 855a mv a0,s6 + 5fe: e1bff0ef jal ra,418 <printint> + i += 2; + 602: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 604: 8bca mv s7,s2 + state = 0; + 606: 4981 li s3,0 + i += 2; + 608: bf09 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 60a: 008b8913 addi s2,s7,8 + 60e: 4685 li a3,1 + 610: 4629 li a2,10 + 612: 000ba583 lw a1,0(s7) + 616: 855a mv a0,s6 + 618: e01ff0ef jal ra,418 <printint> + i += 2; + 61c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 61e: 8bca mv s7,s2 + state = 0; + 620: 4981 li s3,0 + i += 2; + 622: bde5 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 624: 008b8913 addi s2,s7,8 + 628: 4681 li a3,0 + 62a: 4629 li a2,10 + 62c: 000ba583 lw a1,0(s7) + 630: 855a mv a0,s6 + 632: de7ff0ef jal ra,418 <printint> + 636: 8bca mv s7,s2 + state = 0; + 638: 4981 li s3,0 + 63a: b5c5 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 63c: 008b8913 addi s2,s7,8 + 640: 4681 li a3,0 + 642: 4629 li a2,10 + 644: 000ba583 lw a1,0(s7) + 648: 855a mv a0,s6 + 64a: dcfff0ef jal ra,418 <printint> + i += 1; + 64e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 650: 8bca mv s7,s2 + state = 0; + 652: 4981 li s3,0 + i += 1; + 654: b5d9 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 656: 008b8913 addi s2,s7,8 + 65a: 4681 li a3,0 + 65c: 4629 li a2,10 + 65e: 000ba583 lw a1,0(s7) + 662: 855a mv a0,s6 + 664: db5ff0ef jal ra,418 <printint> + i += 2; + 668: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 66a: 8bca mv s7,s2 + state = 0; + 66c: 4981 li s3,0 + i += 2; + 66e: b575 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 670: 008b8913 addi s2,s7,8 + 674: 4681 li a3,0 + 676: 4641 li a2,16 + 678: 000ba583 lw a1,0(s7) + 67c: 855a mv a0,s6 + 67e: d9bff0ef jal ra,418 <printint> + 682: 8bca mv s7,s2 + state = 0; + 684: 4981 li s3,0 + 686: bd51 j 51a <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 688: 008b8913 addi s2,s7,8 + 68c: 4681 li a3,0 + 68e: 4641 li a2,16 + 690: 000ba583 lw a1,0(s7) + 694: 855a mv a0,s6 + 696: d83ff0ef jal ra,418 <printint> + i += 1; + 69a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 69c: 8bca mv s7,s2 + state = 0; + 69e: 4981 li s3,0 + i += 1; + 6a0: bdad j 51a <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 6a2: 008b8793 addi a5,s7,8 + 6a6: f8f43423 sd a5,-120(s0) + 6aa: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6ae: 03000593 li a1,48 + 6b2: 855a mv a0,s6 + 6b4: d47ff0ef jal ra,3fa <putc> + putc(fd, 'x'); + 6b8: 07800593 li a1,120 + 6bc: 855a mv a0,s6 + 6be: d3dff0ef jal ra,3fa <putc> + 6c2: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6c4: 03c9d793 srli a5,s3,0x3c + 6c8: 97e6 add a5,a5,s9 + 6ca: 0007c583 lbu a1,0(a5) + 6ce: 855a mv a0,s6 + 6d0: d2bff0ef jal ra,3fa <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6d4: 0992 slli s3,s3,0x4 + 6d6: 397d addiw s2,s2,-1 + 6d8: fe0916e3 bnez s2,6c4 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 6dc: f8843b83 ld s7,-120(s0) + state = 0; + 6e0: 4981 li s3,0 + 6e2: bd25 j 51a <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 6e4: 008b8993 addi s3,s7,8 + 6e8: 000bb903 ld s2,0(s7) + 6ec: 00090f63 beqz s2,70a <vprintf+0x24a> + for(; *s; s++) + 6f0: 00094583 lbu a1,0(s2) + 6f4: c195 beqz a1,718 <vprintf+0x258> + putc(fd, *s); + 6f6: 855a mv a0,s6 + 6f8: d03ff0ef jal ra,3fa <putc> + for(; *s; s++) + 6fc: 0905 addi s2,s2,1 + 6fe: 00094583 lbu a1,0(s2) + 702: f9f5 bnez a1,6f6 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 704: 8bce mv s7,s3 + state = 0; + 706: 4981 li s3,0 + 708: bd09 j 51a <vprintf+0x5a> + s = "(null)"; + 70a: 00000917 auipc s2,0x0 + 70e: 23690913 addi s2,s2,566 # 940 <malloc+0x126> + for(; *s; s++) + 712: 02800593 li a1,40 + 716: b7c5 j 6f6 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 718: 8bce mv s7,s3 + state = 0; + 71a: 4981 li s3,0 + 71c: bbfd j 51a <vprintf+0x5a> + } + } +} + 71e: 70e6 ld ra,120(sp) + 720: 7446 ld s0,112(sp) + 722: 74a6 ld s1,104(sp) + 724: 7906 ld s2,96(sp) + 726: 69e6 ld s3,88(sp) + 728: 6a46 ld s4,80(sp) + 72a: 6aa6 ld s5,72(sp) + 72c: 6b06 ld s6,64(sp) + 72e: 7be2 ld s7,56(sp) + 730: 7c42 ld s8,48(sp) + 732: 7ca2 ld s9,40(sp) + 734: 7d02 ld s10,32(sp) + 736: 6de2 ld s11,24(sp) + 738: 6109 addi sp,sp,128 + 73a: 8082 ret + +000000000000073c <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 73c: 715d addi sp,sp,-80 + 73e: ec06 sd ra,24(sp) + 740: e822 sd s0,16(sp) + 742: 1000 addi s0,sp,32 + 744: e010 sd a2,0(s0) + 746: e414 sd a3,8(s0) + 748: e818 sd a4,16(s0) + 74a: ec1c sd a5,24(s0) + 74c: 03043023 sd a6,32(s0) + 750: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 754: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 758: 8622 mv a2,s0 + 75a: d67ff0ef jal ra,4c0 <vprintf> +} + 75e: 60e2 ld ra,24(sp) + 760: 6442 ld s0,16(sp) + 762: 6161 addi sp,sp,80 + 764: 8082 ret + +0000000000000766 <printf>: + +void +printf(const char *fmt, ...) +{ + 766: 711d addi sp,sp,-96 + 768: ec06 sd ra,24(sp) + 76a: e822 sd s0,16(sp) + 76c: 1000 addi s0,sp,32 + 76e: e40c sd a1,8(s0) + 770: e810 sd a2,16(s0) + 772: ec14 sd a3,24(s0) + 774: f018 sd a4,32(s0) + 776: f41c sd a5,40(s0) + 778: 03043823 sd a6,48(s0) + 77c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 780: 00840613 addi a2,s0,8 + 784: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 788: 85aa mv a1,a0 + 78a: 4505 li a0,1 + 78c: d35ff0ef jal ra,4c0 <vprintf> +} + 790: 60e2 ld ra,24(sp) + 792: 6442 ld s0,16(sp) + 794: 6125 addi sp,sp,96 + 796: 8082 ret + +0000000000000798 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 798: 1141 addi sp,sp,-16 + 79a: e422 sd s0,8(sp) + 79c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 79e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7a2: 00001797 auipc a5,0x1 + 7a6: 85e7b783 ld a5,-1954(a5) # 1000 <freep> + 7aa: a02d j 7d4 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 7ac: 4618 lw a4,8(a2) + 7ae: 9f2d addw a4,a4,a1 + 7b0: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7b4: 6398 ld a4,0(a5) + 7b6: 6310 ld a2,0(a4) + 7b8: a83d j 7f6 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7ba: ff852703 lw a4,-8(a0) + 7be: 9f31 addw a4,a4,a2 + 7c0: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7c2: ff053683 ld a3,-16(a0) + 7c6: a091 j 80a <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7c8: 6398 ld a4,0(a5) + 7ca: 00e7e463 bltu a5,a4,7d2 <free+0x3a> + 7ce: 00e6ea63 bltu a3,a4,7e2 <free+0x4a> +{ + 7d2: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7d4: fed7fae3 bgeu a5,a3,7c8 <free+0x30> + 7d8: 6398 ld a4,0(a5) + 7da: 00e6e463 bltu a3,a4,7e2 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7de: fee7eae3 bltu a5,a4,7d2 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 7e2: ff852583 lw a1,-8(a0) + 7e6: 6390 ld a2,0(a5) + 7e8: 02059813 slli a6,a1,0x20 + 7ec: 01c85713 srli a4,a6,0x1c + 7f0: 9736 add a4,a4,a3 + 7f2: fae60de3 beq a2,a4,7ac <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 7f6: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7fa: 4790 lw a2,8(a5) + 7fc: 02061593 slli a1,a2,0x20 + 800: 01c5d713 srli a4,a1,0x1c + 804: 973e add a4,a4,a5 + 806: fae68ae3 beq a3,a4,7ba <free+0x22> + p->s.ptr = bp->s.ptr; + 80a: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 80c: 00000717 auipc a4,0x0 + 810: 7ef73a23 sd a5,2036(a4) # 1000 <freep> +} + 814: 6422 ld s0,8(sp) + 816: 0141 addi sp,sp,16 + 818: 8082 ret + +000000000000081a <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 81a: 7139 addi sp,sp,-64 + 81c: fc06 sd ra,56(sp) + 81e: f822 sd s0,48(sp) + 820: f426 sd s1,40(sp) + 822: f04a sd s2,32(sp) + 824: ec4e sd s3,24(sp) + 826: e852 sd s4,16(sp) + 828: e456 sd s5,8(sp) + 82a: e05a sd s6,0(sp) + 82c: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 82e: 02051493 slli s1,a0,0x20 + 832: 9081 srli s1,s1,0x20 + 834: 04bd addi s1,s1,15 + 836: 8091 srli s1,s1,0x4 + 838: 0014899b addiw s3,s1,1 + 83c: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 83e: 00000517 auipc a0,0x0 + 842: 7c253503 ld a0,1986(a0) # 1000 <freep> + 846: c515 beqz a0,872 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 848: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 84a: 4798 lw a4,8(a5) + 84c: 02977f63 bgeu a4,s1,88a <malloc+0x70> + 850: 8a4e mv s4,s3 + 852: 0009871b sext.w a4,s3 + 856: 6685 lui a3,0x1 + 858: 00d77363 bgeu a4,a3,85e <malloc+0x44> + 85c: 6a05 lui s4,0x1 + 85e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 862: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 866: 00000917 auipc s2,0x0 + 86a: 79a90913 addi s2,s2,1946 # 1000 <freep> + if(p == (char*)-1) + 86e: 5afd li s5,-1 + 870: a885 j 8e0 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 872: 00000797 auipc a5,0x0 + 876: 79e78793 addi a5,a5,1950 # 1010 <base> + 87a: 00000717 auipc a4,0x0 + 87e: 78f73323 sd a5,1926(a4) # 1000 <freep> + 882: e39c sd a5,0(a5) + base.s.size = 0; + 884: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 888: b7e1 j 850 <malloc+0x36> + if(p->s.size == nunits) + 88a: 02e48c63 beq s1,a4,8c2 <malloc+0xa8> + p->s.size -= nunits; + 88e: 4137073b subw a4,a4,s3 + 892: c798 sw a4,8(a5) + p += p->s.size; + 894: 02071693 slli a3,a4,0x20 + 898: 01c6d713 srli a4,a3,0x1c + 89c: 97ba add a5,a5,a4 + p->s.size = nunits; + 89e: 0137a423 sw s3,8(a5) + freep = prevp; + 8a2: 00000717 auipc a4,0x0 + 8a6: 74a73f23 sd a0,1886(a4) # 1000 <freep> + return (void*)(p + 1); + 8aa: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 8ae: 70e2 ld ra,56(sp) + 8b0: 7442 ld s0,48(sp) + 8b2: 74a2 ld s1,40(sp) + 8b4: 7902 ld s2,32(sp) + 8b6: 69e2 ld s3,24(sp) + 8b8: 6a42 ld s4,16(sp) + 8ba: 6aa2 ld s5,8(sp) + 8bc: 6b02 ld s6,0(sp) + 8be: 6121 addi sp,sp,64 + 8c0: 8082 ret + prevp->s.ptr = p->s.ptr; + 8c2: 6398 ld a4,0(a5) + 8c4: e118 sd a4,0(a0) + 8c6: bff1 j 8a2 <malloc+0x88> + hp->s.size = nu; + 8c8: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8cc: 0541 addi a0,a0,16 + 8ce: ecbff0ef jal ra,798 <free> + return freep; + 8d2: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8d6: dd61 beqz a0,8ae <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8d8: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8da: 4798 lw a4,8(a5) + 8dc: fa9777e3 bgeu a4,s1,88a <malloc+0x70> + if(p == freep) + 8e0: 00093703 ld a4,0(s2) + 8e4: 853e mv a0,a5 + 8e6: fef719e3 bne a4,a5,8d8 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 8ea: 8552 mv a0,s4 + 8ec: adfff0ef jal ra,3ca <sbrk> + if(p == (char*)-1) + 8f0: fd551ce3 bne a0,s5,8c8 <malloc+0xae> + return 0; + 8f4: 4501 li a0,0 + 8f6: bf65 j 8ae <malloc+0x94> diff --git a/user/stressfs.d b/user/stressfs.d new file mode 100644 index 0000000000000000000000000000000000000000..96b153a1d69700edfab41b5b891a3f393cee800e --- /dev/null +++ b/user/stressfs.d @@ -0,0 +1,3 @@ +user/stressfs.o: user/stressfs.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/stat.h user/user.h kernel/fs.h kernel/fcntl.h diff --git a/user/stressfs.o b/user/stressfs.o new file mode 100644 index 0000000000000000000000000000000000000000..b9d2004d3543b85dd9e79fb2036331cb079fe76a Binary files /dev/null and b/user/stressfs.o differ diff --git a/user/stressfs.sym b/user/stressfs.sym new file mode 100644 index 0000000000000000000000000000000000000000..8784bdaed546bed52a82d16d728528602d995156 --- /dev/null +++ b/user/stressfs.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +00000000000008f8 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 stressfs.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003fa putc +0000000000000418 printint +0000000000000948 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +00000000000000ea strcpy +0000000000000766 printf +0000000000000294 memmove +000000000000038a mknod +00000000000003e2 trace +00000000000001a2 gets +00000000000003c2 getpid +0000000000000326 memcpy +000000000000081a malloc +00000000000003d2 sleep +00000000000003ea mycall +0000000000000352 pipe +0000000000000362 write +000000000000039a fstat +000000000000073c fprintf +0000000000000372 kill +00000000000004c0 vprintf +00000000000003b2 chdir +000000000000037a exec +000000000000034a wait +000000000000035a read +0000000000000392 unlink +00000000000002ec memcmp +000000000000033a fork +00000000000003ca sbrk +00000000000003da uptime +000000000000015c memset +0000000000000000 main +00000000000003f2 GSCinfo +0000000000000106 strcmp +00000000000003ba dup +0000000000000212 stat +00000000000003a2 link +0000000000000342 exit +00000000000000d8 start +000000000000024c atoi +0000000000000132 strlen +0000000000000382 open +000000000000017e strchr +00000000000003aa mkdir +000000000000036a close +0000000000000798 free diff --git a/user/test_SCinfo.asm b/user/test_SCinfo.asm new file mode 100644 index 0000000000000000000000000000000000000000..a7495c6605c2dd2dca2c1f1bfe1077fecfdb0e1c --- /dev/null +++ b/user/test_SCinfo.asm @@ -0,0 +1,1493 @@ + +user/_test_SCinfo: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +#define NUM_SYSCALLS 24 // ä¸Žå†…æ ¸ä¸çš„定义一致 + +int main() { + 0: 7175 addi sp,sp,-144 + 2: e506 sd ra,136(sp) + 4: e122 sd s0,128(sp) + 6: fca6 sd s1,120(sp) + 8: f8ca sd s2,112(sp) + a: f4ce sd s3,104(sp) + c: f0d2 sd s4,96(sp) + e: 0900 addi s0,sp,144 + int counts[NUM_SYSCALLS]; // 用于å˜å‚¨ç³»ç»Ÿè°ƒç”¨ç»Ÿè®¡ä¿¡æ¯ + + // 调用 getsyscallinfo 系统调用 + if (GSCinfo(counts) < 0) { + 10: f7040513 addi a0,s0,-144 + 14: 372000ef jal ra,386 <GSCinfo> + 18: 02054163 bltz a0,3a <main+0x3a> + printf("getsyscallinfo failed\n"); + exit(1); // 退出程åºï¼Œè¿”å›žé”™è¯¯çŠ¶æ€ + } + + // 输出统计结果 + printf("System call usage:\n"); + 1c: 00001517 auipc a0,0x1 + 20: 88c50513 addi a0,a0,-1908 # 8a8 <malloc+0xfa> + 24: 6d6000ef jal ra,6fa <printf> + for (int i = 0; i < NUM_SYSCALLS; i++) { + 28: f7040913 addi s2,s0,-144 + 2c: 4481 li s1,0 + if (counts[i] > 0) { // åªæ˜¾ç¤ºè°ƒç”¨æ¬¡æ•°å¤§äºŽ 0 的系统调用 + printf("Syscall %d: %d times\n", i, counts[i]); + 2e: 00001a17 auipc s4,0x1 + 32: 892a0a13 addi s4,s4,-1902 # 8c0 <malloc+0x112> + for (int i = 0; i < NUM_SYSCALLS; i++) { + 36: 49e1 li s3,24 + 38: a831 j 54 <main+0x54> + printf("getsyscallinfo failed\n"); + 3a: 00001517 auipc a0,0x1 + 3e: 85650513 addi a0,a0,-1962 # 890 <malloc+0xe2> + 42: 6b8000ef jal ra,6fa <printf> + exit(1); // 退出程åºï¼Œè¿”å›žé”™è¯¯çŠ¶æ€ + 46: 4505 li a0,1 + 48: 28e000ef jal ra,2d6 <exit> + for (int i = 0; i < NUM_SYSCALLS; i++) { + 4c: 2485 addiw s1,s1,1 + 4e: 0911 addi s2,s2,4 + 50: 01348b63 beq s1,s3,66 <main+0x66> + if (counts[i] > 0) { // åªæ˜¾ç¤ºè°ƒç”¨æ¬¡æ•°å¤§äºŽ 0 的系统调用 + 54: 00092603 lw a2,0(s2) + 58: fec05ae3 blez a2,4c <main+0x4c> + printf("Syscall %d: %d times\n", i, counts[i]); + 5c: 85a6 mv a1,s1 + 5e: 8552 mv a0,s4 + 60: 69a000ef jal ra,6fa <printf> + 64: b7e5 j 4c <main+0x4c> + } + } + + exit(0); // ç¨‹åºæ£å¸¸ç»“æŸ + 66: 4501 li a0,0 + 68: 26e000ef jal ra,2d6 <exit> + +000000000000006c <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 6c: 1141 addi sp,sp,-16 + 6e: e406 sd ra,8(sp) + 70: e022 sd s0,0(sp) + 72: 0800 addi s0,sp,16 + extern int main(); + main(); + 74: f8dff0ef jal ra,0 <main> + exit(0); + 78: 4501 li a0,0 + 7a: 25c000ef jal ra,2d6 <exit> + +000000000000007e <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 7e: 1141 addi sp,sp,-16 + 80: e422 sd s0,8(sp) + 82: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 84: 87aa mv a5,a0 + 86: 0585 addi a1,a1,1 + 88: 0785 addi a5,a5,1 + 8a: fff5c703 lbu a4,-1(a1) + 8e: fee78fa3 sb a4,-1(a5) + 92: fb75 bnez a4,86 <strcpy+0x8> + ; + return os; +} + 94: 6422 ld s0,8(sp) + 96: 0141 addi sp,sp,16 + 98: 8082 ret + +000000000000009a <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 9a: 1141 addi sp,sp,-16 + 9c: e422 sd s0,8(sp) + 9e: 0800 addi s0,sp,16 + while(*p && *p == *q) + a0: 00054783 lbu a5,0(a0) + a4: cb91 beqz a5,b8 <strcmp+0x1e> + a6: 0005c703 lbu a4,0(a1) + aa: 00f71763 bne a4,a5,b8 <strcmp+0x1e> + p++, q++; + ae: 0505 addi a0,a0,1 + b0: 0585 addi a1,a1,1 + while(*p && *p == *q) + b2: 00054783 lbu a5,0(a0) + b6: fbe5 bnez a5,a6 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + b8: 0005c503 lbu a0,0(a1) +} + bc: 40a7853b subw a0,a5,a0 + c0: 6422 ld s0,8(sp) + c2: 0141 addi sp,sp,16 + c4: 8082 ret + +00000000000000c6 <strlen>: + +uint +strlen(const char *s) +{ + c6: 1141 addi sp,sp,-16 + c8: e422 sd s0,8(sp) + ca: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + cc: 00054783 lbu a5,0(a0) + d0: cf91 beqz a5,ec <strlen+0x26> + d2: 0505 addi a0,a0,1 + d4: 87aa mv a5,a0 + d6: 4685 li a3,1 + d8: 9e89 subw a3,a3,a0 + da: 00f6853b addw a0,a3,a5 + de: 0785 addi a5,a5,1 + e0: fff7c703 lbu a4,-1(a5) + e4: fb7d bnez a4,da <strlen+0x14> + ; + return n; +} + e6: 6422 ld s0,8(sp) + e8: 0141 addi sp,sp,16 + ea: 8082 ret + for(n = 0; s[n]; n++) + ec: 4501 li a0,0 + ee: bfe5 j e6 <strlen+0x20> + +00000000000000f0 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + f0: 1141 addi sp,sp,-16 + f2: e422 sd s0,8(sp) + f4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + f6: ca19 beqz a2,10c <memset+0x1c> + f8: 87aa mv a5,a0 + fa: 1602 slli a2,a2,0x20 + fc: 9201 srli a2,a2,0x20 + fe: 00a60733 add a4,a2,a0 + cdst[i] = c; + 102: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 106: 0785 addi a5,a5,1 + 108: fee79de3 bne a5,a4,102 <memset+0x12> + } + return dst; +} + 10c: 6422 ld s0,8(sp) + 10e: 0141 addi sp,sp,16 + 110: 8082 ret + +0000000000000112 <strchr>: + +char* +strchr(const char *s, char c) +{ + 112: 1141 addi sp,sp,-16 + 114: e422 sd s0,8(sp) + 116: 0800 addi s0,sp,16 + for(; *s; s++) + 118: 00054783 lbu a5,0(a0) + 11c: cb99 beqz a5,132 <strchr+0x20> + if(*s == c) + 11e: 00f58763 beq a1,a5,12c <strchr+0x1a> + for(; *s; s++) + 122: 0505 addi a0,a0,1 + 124: 00054783 lbu a5,0(a0) + 128: fbfd bnez a5,11e <strchr+0xc> + return (char*)s; + return 0; + 12a: 4501 li a0,0 +} + 12c: 6422 ld s0,8(sp) + 12e: 0141 addi sp,sp,16 + 130: 8082 ret + return 0; + 132: 4501 li a0,0 + 134: bfe5 j 12c <strchr+0x1a> + +0000000000000136 <gets>: + +char* +gets(char *buf, int max) +{ + 136: 711d addi sp,sp,-96 + 138: ec86 sd ra,88(sp) + 13a: e8a2 sd s0,80(sp) + 13c: e4a6 sd s1,72(sp) + 13e: e0ca sd s2,64(sp) + 140: fc4e sd s3,56(sp) + 142: f852 sd s4,48(sp) + 144: f456 sd s5,40(sp) + 146: f05a sd s6,32(sp) + 148: ec5e sd s7,24(sp) + 14a: 1080 addi s0,sp,96 + 14c: 8baa mv s7,a0 + 14e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 150: 892a mv s2,a0 + 152: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 154: 4aa9 li s5,10 + 156: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 158: 89a6 mv s3,s1 + 15a: 2485 addiw s1,s1,1 + 15c: 0344d663 bge s1,s4,188 <gets+0x52> + cc = read(0, &c, 1); + 160: 4605 li a2,1 + 162: faf40593 addi a1,s0,-81 + 166: 4501 li a0,0 + 168: 186000ef jal ra,2ee <read> + if(cc < 1) + 16c: 00a05e63 blez a0,188 <gets+0x52> + buf[i++] = c; + 170: faf44783 lbu a5,-81(s0) + 174: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 178: 01578763 beq a5,s5,186 <gets+0x50> + 17c: 0905 addi s2,s2,1 + 17e: fd679de3 bne a5,s6,158 <gets+0x22> + for(i=0; i+1 < max; ){ + 182: 89a6 mv s3,s1 + 184: a011 j 188 <gets+0x52> + 186: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 188: 99de add s3,s3,s7 + 18a: 00098023 sb zero,0(s3) + return buf; +} + 18e: 855e mv a0,s7 + 190: 60e6 ld ra,88(sp) + 192: 6446 ld s0,80(sp) + 194: 64a6 ld s1,72(sp) + 196: 6906 ld s2,64(sp) + 198: 79e2 ld s3,56(sp) + 19a: 7a42 ld s4,48(sp) + 19c: 7aa2 ld s5,40(sp) + 19e: 7b02 ld s6,32(sp) + 1a0: 6be2 ld s7,24(sp) + 1a2: 6125 addi sp,sp,96 + 1a4: 8082 ret + +00000000000001a6 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 1a6: 1101 addi sp,sp,-32 + 1a8: ec06 sd ra,24(sp) + 1aa: e822 sd s0,16(sp) + 1ac: e426 sd s1,8(sp) + 1ae: e04a sd s2,0(sp) + 1b0: 1000 addi s0,sp,32 + 1b2: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1b4: 4581 li a1,0 + 1b6: 160000ef jal ra,316 <open> + if(fd < 0) + 1ba: 02054163 bltz a0,1dc <stat+0x36> + 1be: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1c0: 85ca mv a1,s2 + 1c2: 16c000ef jal ra,32e <fstat> + 1c6: 892a mv s2,a0 + close(fd); + 1c8: 8526 mv a0,s1 + 1ca: 134000ef jal ra,2fe <close> + return r; +} + 1ce: 854a mv a0,s2 + 1d0: 60e2 ld ra,24(sp) + 1d2: 6442 ld s0,16(sp) + 1d4: 64a2 ld s1,8(sp) + 1d6: 6902 ld s2,0(sp) + 1d8: 6105 addi sp,sp,32 + 1da: 8082 ret + return -1; + 1dc: 597d li s2,-1 + 1de: bfc5 j 1ce <stat+0x28> + +00000000000001e0 <atoi>: + +int +atoi(const char *s) +{ + 1e0: 1141 addi sp,sp,-16 + 1e2: e422 sd s0,8(sp) + 1e4: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1e6: 00054683 lbu a3,0(a0) + 1ea: fd06879b addiw a5,a3,-48 + 1ee: 0ff7f793 zext.b a5,a5 + 1f2: 4625 li a2,9 + 1f4: 02f66863 bltu a2,a5,224 <atoi+0x44> + 1f8: 872a mv a4,a0 + n = 0; + 1fa: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1fc: 0705 addi a4,a4,1 + 1fe: 0025179b slliw a5,a0,0x2 + 202: 9fa9 addw a5,a5,a0 + 204: 0017979b slliw a5,a5,0x1 + 208: 9fb5 addw a5,a5,a3 + 20a: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 20e: 00074683 lbu a3,0(a4) + 212: fd06879b addiw a5,a3,-48 + 216: 0ff7f793 zext.b a5,a5 + 21a: fef671e3 bgeu a2,a5,1fc <atoi+0x1c> + return n; +} + 21e: 6422 ld s0,8(sp) + 220: 0141 addi sp,sp,16 + 222: 8082 ret + n = 0; + 224: 4501 li a0,0 + 226: bfe5 j 21e <atoi+0x3e> + +0000000000000228 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 228: 1141 addi sp,sp,-16 + 22a: e422 sd s0,8(sp) + 22c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 22e: 02b57463 bgeu a0,a1,256 <memmove+0x2e> + while(n-- > 0) + 232: 00c05f63 blez a2,250 <memmove+0x28> + 236: 1602 slli a2,a2,0x20 + 238: 9201 srli a2,a2,0x20 + 23a: 00c507b3 add a5,a0,a2 + dst = vdst; + 23e: 872a mv a4,a0 + *dst++ = *src++; + 240: 0585 addi a1,a1,1 + 242: 0705 addi a4,a4,1 + 244: fff5c683 lbu a3,-1(a1) + 248: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 24c: fee79ae3 bne a5,a4,240 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 250: 6422 ld s0,8(sp) + 252: 0141 addi sp,sp,16 + 254: 8082 ret + dst += n; + 256: 00c50733 add a4,a0,a2 + src += n; + 25a: 95b2 add a1,a1,a2 + while(n-- > 0) + 25c: fec05ae3 blez a2,250 <memmove+0x28> + 260: fff6079b addiw a5,a2,-1 + 264: 1782 slli a5,a5,0x20 + 266: 9381 srli a5,a5,0x20 + 268: fff7c793 not a5,a5 + 26c: 97ba add a5,a5,a4 + *--dst = *--src; + 26e: 15fd addi a1,a1,-1 + 270: 177d addi a4,a4,-1 + 272: 0005c683 lbu a3,0(a1) + 276: 00d70023 sb a3,0(a4) + while(n-- > 0) + 27a: fee79ae3 bne a5,a4,26e <memmove+0x46> + 27e: bfc9 j 250 <memmove+0x28> + +0000000000000280 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 280: 1141 addi sp,sp,-16 + 282: e422 sd s0,8(sp) + 284: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 286: ca05 beqz a2,2b6 <memcmp+0x36> + 288: fff6069b addiw a3,a2,-1 + 28c: 1682 slli a3,a3,0x20 + 28e: 9281 srli a3,a3,0x20 + 290: 0685 addi a3,a3,1 + 292: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 294: 00054783 lbu a5,0(a0) + 298: 0005c703 lbu a4,0(a1) + 29c: 00e79863 bne a5,a4,2ac <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 2a0: 0505 addi a0,a0,1 + p2++; + 2a2: 0585 addi a1,a1,1 + while (n-- > 0) { + 2a4: fed518e3 bne a0,a3,294 <memcmp+0x14> + } + return 0; + 2a8: 4501 li a0,0 + 2aa: a019 j 2b0 <memcmp+0x30> + return *p1 - *p2; + 2ac: 40e7853b subw a0,a5,a4 +} + 2b0: 6422 ld s0,8(sp) + 2b2: 0141 addi sp,sp,16 + 2b4: 8082 ret + return 0; + 2b6: 4501 li a0,0 + 2b8: bfe5 j 2b0 <memcmp+0x30> + +00000000000002ba <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2ba: 1141 addi sp,sp,-16 + 2bc: e406 sd ra,8(sp) + 2be: e022 sd s0,0(sp) + 2c0: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2c2: f67ff0ef jal ra,228 <memmove> +} + 2c6: 60a2 ld ra,8(sp) + 2c8: 6402 ld s0,0(sp) + 2ca: 0141 addi sp,sp,16 + 2cc: 8082 ret + +00000000000002ce <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2ce: 4885 li a7,1 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 <exit>: +.global exit +exit: + li a7, SYS_exit + 2d6: 4889 li a7,2 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de <wait>: +.global wait +wait: + li a7, SYS_wait + 2de: 488d li a7,3 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 2e6: 4891 li a7,4 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee <read>: +.global read +read: + li a7, SYS_read + 2ee: 4895 li a7,5 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 <write>: +.global write +write: + li a7, SYS_write + 2f6: 48c1 li a7,16 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe <close>: +.global close +close: + li a7, SYS_close + 2fe: 48d5 li a7,21 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 <kill>: +.global kill +kill: + li a7, SYS_kill + 306: 4899 li a7,6 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e <exec>: +.global exec +exec: + li a7, SYS_exec + 30e: 489d li a7,7 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 <open>: +.global open +open: + li a7, SYS_open + 316: 48bd li a7,15 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 31e: 48c5 li a7,17 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 326: 48c9 li a7,18 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 32e: 48a1 li a7,8 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 <link>: +.global link +link: + li a7, SYS_link + 336: 48cd li a7,19 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 33e: 48d1 li a7,20 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 346: 48a5 li a7,9 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e <dup>: +.global dup +dup: + li a7, SYS_dup + 34e: 48a9 li a7,10 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 356: 48ad li a7,11 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 35e: 48b1 li a7,12 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 366: 48b5 li a7,13 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 36e: 48b9 li a7,14 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 <trace>: +.global trace +trace: + li a7, SYS_trace + 376: 48d9 li a7,22 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 37e: 48dd li a7,23 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 386: 48e1 li a7,24 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 38e: 1101 addi sp,sp,-32 + 390: ec06 sd ra,24(sp) + 392: e822 sd s0,16(sp) + 394: 1000 addi s0,sp,32 + 396: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 39a: 4605 li a2,1 + 39c: fef40593 addi a1,s0,-17 + 3a0: f57ff0ef jal ra,2f6 <write> +} + 3a4: 60e2 ld ra,24(sp) + 3a6: 6442 ld s0,16(sp) + 3a8: 6105 addi sp,sp,32 + 3aa: 8082 ret + +00000000000003ac <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3ac: 7139 addi sp,sp,-64 + 3ae: fc06 sd ra,56(sp) + 3b0: f822 sd s0,48(sp) + 3b2: f426 sd s1,40(sp) + 3b4: f04a sd s2,32(sp) + 3b6: ec4e sd s3,24(sp) + 3b8: 0080 addi s0,sp,64 + 3ba: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3bc: c299 beqz a3,3c2 <printint+0x16> + 3be: 0805c763 bltz a1,44c <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3c2: 2581 sext.w a1,a1 + neg = 0; + 3c4: 4881 li a7,0 + 3c6: fc040693 addi a3,s0,-64 + } + + i = 0; + 3ca: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 3cc: 2601 sext.w a2,a2 + 3ce: 00000517 auipc a0,0x0 + 3d2: 51250513 addi a0,a0,1298 # 8e0 <digits> + 3d6: 883a mv a6,a4 + 3d8: 2705 addiw a4,a4,1 + 3da: 02c5f7bb remuw a5,a1,a2 + 3de: 1782 slli a5,a5,0x20 + 3e0: 9381 srli a5,a5,0x20 + 3e2: 97aa add a5,a5,a0 + 3e4: 0007c783 lbu a5,0(a5) + 3e8: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3ec: 0005879b sext.w a5,a1 + 3f0: 02c5d5bb divuw a1,a1,a2 + 3f4: 0685 addi a3,a3,1 + 3f6: fec7f0e3 bgeu a5,a2,3d6 <printint+0x2a> + if(neg) + 3fa: 00088c63 beqz a7,412 <printint+0x66> + buf[i++] = '-'; + 3fe: fd070793 addi a5,a4,-48 + 402: 00878733 add a4,a5,s0 + 406: 02d00793 li a5,45 + 40a: fef70823 sb a5,-16(a4) + 40e: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 412: 02e05663 blez a4,43e <printint+0x92> + 416: fc040793 addi a5,s0,-64 + 41a: 00e78933 add s2,a5,a4 + 41e: fff78993 addi s3,a5,-1 + 422: 99ba add s3,s3,a4 + 424: 377d addiw a4,a4,-1 + 426: 1702 slli a4,a4,0x20 + 428: 9301 srli a4,a4,0x20 + 42a: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 42e: fff94583 lbu a1,-1(s2) + 432: 8526 mv a0,s1 + 434: f5bff0ef jal ra,38e <putc> + while(--i >= 0) + 438: 197d addi s2,s2,-1 + 43a: ff391ae3 bne s2,s3,42e <printint+0x82> +} + 43e: 70e2 ld ra,56(sp) + 440: 7442 ld s0,48(sp) + 442: 74a2 ld s1,40(sp) + 444: 7902 ld s2,32(sp) + 446: 69e2 ld s3,24(sp) + 448: 6121 addi sp,sp,64 + 44a: 8082 ret + x = -xx; + 44c: 40b005bb negw a1,a1 + neg = 1; + 450: 4885 li a7,1 + x = -xx; + 452: bf95 j 3c6 <printint+0x1a> + +0000000000000454 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 454: 7119 addi sp,sp,-128 + 456: fc86 sd ra,120(sp) + 458: f8a2 sd s0,112(sp) + 45a: f4a6 sd s1,104(sp) + 45c: f0ca sd s2,96(sp) + 45e: ecce sd s3,88(sp) + 460: e8d2 sd s4,80(sp) + 462: e4d6 sd s5,72(sp) + 464: e0da sd s6,64(sp) + 466: fc5e sd s7,56(sp) + 468: f862 sd s8,48(sp) + 46a: f466 sd s9,40(sp) + 46c: f06a sd s10,32(sp) + 46e: ec6e sd s11,24(sp) + 470: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 472: 0005c903 lbu s2,0(a1) + 476: 22090e63 beqz s2,6b2 <vprintf+0x25e> + 47a: 8b2a mv s6,a0 + 47c: 8a2e mv s4,a1 + 47e: 8bb2 mv s7,a2 + state = 0; + 480: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 482: 4481 li s1,0 + 484: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 486: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 48a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 48e: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 492: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 496: 00000c97 auipc s9,0x0 + 49a: 44ac8c93 addi s9,s9,1098 # 8e0 <digits> + 49e: a005 j 4be <vprintf+0x6a> + putc(fd, c0); + 4a0: 85ca mv a1,s2 + 4a2: 855a mv a0,s6 + 4a4: eebff0ef jal ra,38e <putc> + 4a8: a019 j 4ae <vprintf+0x5a> + } else if(state == '%'){ + 4aa: 03598263 beq s3,s5,4ce <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4ae: 2485 addiw s1,s1,1 + 4b0: 8726 mv a4,s1 + 4b2: 009a07b3 add a5,s4,s1 + 4b6: 0007c903 lbu s2,0(a5) + 4ba: 1e090c63 beqz s2,6b2 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4be: 0009079b sext.w a5,s2 + if(state == 0){ + 4c2: fe0994e3 bnez s3,4aa <vprintf+0x56> + if(c0 == '%'){ + 4c6: fd579de3 bne a5,s5,4a0 <vprintf+0x4c> + state = '%'; + 4ca: 89be mv s3,a5 + 4cc: b7cd j 4ae <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4ce: cfa5 beqz a5,546 <vprintf+0xf2> + 4d0: 00ea06b3 add a3,s4,a4 + 4d4: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4d8: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4da: c681 beqz a3,4e2 <vprintf+0x8e> + 4dc: 9752 add a4,a4,s4 + 4de: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4e2: 03878a63 beq a5,s8,516 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4e6: 05a78463 beq a5,s10,52e <vprintf+0xda> + } else if(c0 == 'u'){ + 4ea: 0db78763 beq a5,s11,5b8 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4ee: 07800713 li a4,120 + 4f2: 10e78963 beq a5,a4,604 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4f6: 07000713 li a4,112 + 4fa: 12e78e63 beq a5,a4,636 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4fe: 07300713 li a4,115 + 502: 16e78b63 beq a5,a4,678 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 506: 05579063 bne a5,s5,546 <vprintf+0xf2> + putc(fd, '%'); + 50a: 85d6 mv a1,s5 + 50c: 855a mv a0,s6 + 50e: e81ff0ef jal ra,38e <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 512: 4981 li s3,0 + 514: bf69 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 516: 008b8913 addi s2,s7,8 + 51a: 4685 li a3,1 + 51c: 4629 li a2,10 + 51e: 000ba583 lw a1,0(s7) + 522: 855a mv a0,s6 + 524: e89ff0ef jal ra,3ac <printint> + 528: 8bca mv s7,s2 + state = 0; + 52a: 4981 li s3,0 + 52c: b749 j 4ae <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 52e: 03868663 beq a3,s8,55a <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 532: 05a68163 beq a3,s10,574 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 536: 09b68d63 beq a3,s11,5d0 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 53a: 03a68f63 beq a3,s10,578 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 53e: 07800793 li a5,120 + 542: 0cf68d63 beq a3,a5,61c <vprintf+0x1c8> + putc(fd, '%'); + 546: 85d6 mv a1,s5 + 548: 855a mv a0,s6 + 54a: e45ff0ef jal ra,38e <putc> + putc(fd, c0); + 54e: 85ca mv a1,s2 + 550: 855a mv a0,s6 + 552: e3dff0ef jal ra,38e <putc> + state = 0; + 556: 4981 li s3,0 + 558: bf99 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 55a: 008b8913 addi s2,s7,8 + 55e: 4685 li a3,1 + 560: 4629 li a2,10 + 562: 000ba583 lw a1,0(s7) + 566: 855a mv a0,s6 + 568: e45ff0ef jal ra,3ac <printint> + i += 1; + 56c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 56e: 8bca mv s7,s2 + state = 0; + 570: 4981 li s3,0 + i += 1; + 572: bf35 j 4ae <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 574: 03860563 beq a2,s8,59e <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 578: 07b60963 beq a2,s11,5ea <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 57c: 07800793 li a5,120 + 580: fcf613e3 bne a2,a5,546 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 584: 008b8913 addi s2,s7,8 + 588: 4681 li a3,0 + 58a: 4641 li a2,16 + 58c: 000ba583 lw a1,0(s7) + 590: 855a mv a0,s6 + 592: e1bff0ef jal ra,3ac <printint> + i += 2; + 596: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 598: 8bca mv s7,s2 + state = 0; + 59a: 4981 li s3,0 + i += 2; + 59c: bf09 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 59e: 008b8913 addi s2,s7,8 + 5a2: 4685 li a3,1 + 5a4: 4629 li a2,10 + 5a6: 000ba583 lw a1,0(s7) + 5aa: 855a mv a0,s6 + 5ac: e01ff0ef jal ra,3ac <printint> + i += 2; + 5b0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5b2: 8bca mv s7,s2 + state = 0; + 5b4: 4981 li s3,0 + i += 2; + 5b6: bde5 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 5b8: 008b8913 addi s2,s7,8 + 5bc: 4681 li a3,0 + 5be: 4629 li a2,10 + 5c0: 000ba583 lw a1,0(s7) + 5c4: 855a mv a0,s6 + 5c6: de7ff0ef jal ra,3ac <printint> + 5ca: 8bca mv s7,s2 + state = 0; + 5cc: 4981 li s3,0 + 5ce: b5c5 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5d0: 008b8913 addi s2,s7,8 + 5d4: 4681 li a3,0 + 5d6: 4629 li a2,10 + 5d8: 000ba583 lw a1,0(s7) + 5dc: 855a mv a0,s6 + 5de: dcfff0ef jal ra,3ac <printint> + i += 1; + 5e2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e4: 8bca mv s7,s2 + state = 0; + 5e6: 4981 li s3,0 + i += 1; + 5e8: b5d9 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 5ea: 008b8913 addi s2,s7,8 + 5ee: 4681 li a3,0 + 5f0: 4629 li a2,10 + 5f2: 000ba583 lw a1,0(s7) + 5f6: 855a mv a0,s6 + 5f8: db5ff0ef jal ra,3ac <printint> + i += 2; + 5fc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5fe: 8bca mv s7,s2 + state = 0; + 600: 4981 li s3,0 + i += 2; + 602: b575 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 604: 008b8913 addi s2,s7,8 + 608: 4681 li a3,0 + 60a: 4641 li a2,16 + 60c: 000ba583 lw a1,0(s7) + 610: 855a mv a0,s6 + 612: d9bff0ef jal ra,3ac <printint> + 616: 8bca mv s7,s2 + state = 0; + 618: 4981 li s3,0 + 61a: bd51 j 4ae <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 61c: 008b8913 addi s2,s7,8 + 620: 4681 li a3,0 + 622: 4641 li a2,16 + 624: 000ba583 lw a1,0(s7) + 628: 855a mv a0,s6 + 62a: d83ff0ef jal ra,3ac <printint> + i += 1; + 62e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 630: 8bca mv s7,s2 + state = 0; + 632: 4981 li s3,0 + i += 1; + 634: bdad j 4ae <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 636: 008b8793 addi a5,s7,8 + 63a: f8f43423 sd a5,-120(s0) + 63e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 642: 03000593 li a1,48 + 646: 855a mv a0,s6 + 648: d47ff0ef jal ra,38e <putc> + putc(fd, 'x'); + 64c: 07800593 li a1,120 + 650: 855a mv a0,s6 + 652: d3dff0ef jal ra,38e <putc> + 656: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 658: 03c9d793 srli a5,s3,0x3c + 65c: 97e6 add a5,a5,s9 + 65e: 0007c583 lbu a1,0(a5) + 662: 855a mv a0,s6 + 664: d2bff0ef jal ra,38e <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 668: 0992 slli s3,s3,0x4 + 66a: 397d addiw s2,s2,-1 + 66c: fe0916e3 bnez s2,658 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 670: f8843b83 ld s7,-120(s0) + state = 0; + 674: 4981 li s3,0 + 676: bd25 j 4ae <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 678: 008b8993 addi s3,s7,8 + 67c: 000bb903 ld s2,0(s7) + 680: 00090f63 beqz s2,69e <vprintf+0x24a> + for(; *s; s++) + 684: 00094583 lbu a1,0(s2) + 688: c195 beqz a1,6ac <vprintf+0x258> + putc(fd, *s); + 68a: 855a mv a0,s6 + 68c: d03ff0ef jal ra,38e <putc> + for(; *s; s++) + 690: 0905 addi s2,s2,1 + 692: 00094583 lbu a1,0(s2) + 696: f9f5 bnez a1,68a <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 698: 8bce mv s7,s3 + state = 0; + 69a: 4981 li s3,0 + 69c: bd09 j 4ae <vprintf+0x5a> + s = "(null)"; + 69e: 00000917 auipc s2,0x0 + 6a2: 23a90913 addi s2,s2,570 # 8d8 <malloc+0x12a> + for(; *s; s++) + 6a6: 02800593 li a1,40 + 6aa: b7c5 j 68a <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6ac: 8bce mv s7,s3 + state = 0; + 6ae: 4981 li s3,0 + 6b0: bbfd j 4ae <vprintf+0x5a> + } + } +} + 6b2: 70e6 ld ra,120(sp) + 6b4: 7446 ld s0,112(sp) + 6b6: 74a6 ld s1,104(sp) + 6b8: 7906 ld s2,96(sp) + 6ba: 69e6 ld s3,88(sp) + 6bc: 6a46 ld s4,80(sp) + 6be: 6aa6 ld s5,72(sp) + 6c0: 6b06 ld s6,64(sp) + 6c2: 7be2 ld s7,56(sp) + 6c4: 7c42 ld s8,48(sp) + 6c6: 7ca2 ld s9,40(sp) + 6c8: 7d02 ld s10,32(sp) + 6ca: 6de2 ld s11,24(sp) + 6cc: 6109 addi sp,sp,128 + 6ce: 8082 ret + +00000000000006d0 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 6d0: 715d addi sp,sp,-80 + 6d2: ec06 sd ra,24(sp) + 6d4: e822 sd s0,16(sp) + 6d6: 1000 addi s0,sp,32 + 6d8: e010 sd a2,0(s0) + 6da: e414 sd a3,8(s0) + 6dc: e818 sd a4,16(s0) + 6de: ec1c sd a5,24(s0) + 6e0: 03043023 sd a6,32(s0) + 6e4: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6e8: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6ec: 8622 mv a2,s0 + 6ee: d67ff0ef jal ra,454 <vprintf> +} + 6f2: 60e2 ld ra,24(sp) + 6f4: 6442 ld s0,16(sp) + 6f6: 6161 addi sp,sp,80 + 6f8: 8082 ret + +00000000000006fa <printf>: + +void +printf(const char *fmt, ...) +{ + 6fa: 711d addi sp,sp,-96 + 6fc: ec06 sd ra,24(sp) + 6fe: e822 sd s0,16(sp) + 700: 1000 addi s0,sp,32 + 702: e40c sd a1,8(s0) + 704: e810 sd a2,16(s0) + 706: ec14 sd a3,24(s0) + 708: f018 sd a4,32(s0) + 70a: f41c sd a5,40(s0) + 70c: 03043823 sd a6,48(s0) + 710: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 714: 00840613 addi a2,s0,8 + 718: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 71c: 85aa mv a1,a0 + 71e: 4505 li a0,1 + 720: d35ff0ef jal ra,454 <vprintf> +} + 724: 60e2 ld ra,24(sp) + 726: 6442 ld s0,16(sp) + 728: 6125 addi sp,sp,96 + 72a: 8082 ret + +000000000000072c <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 72c: 1141 addi sp,sp,-16 + 72e: e422 sd s0,8(sp) + 730: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 732: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 736: 00001797 auipc a5,0x1 + 73a: 8ca7b783 ld a5,-1846(a5) # 1000 <freep> + 73e: a02d j 768 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 740: 4618 lw a4,8(a2) + 742: 9f2d addw a4,a4,a1 + 744: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 748: 6398 ld a4,0(a5) + 74a: 6310 ld a2,0(a4) + 74c: a83d j 78a <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 74e: ff852703 lw a4,-8(a0) + 752: 9f31 addw a4,a4,a2 + 754: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 756: ff053683 ld a3,-16(a0) + 75a: a091 j 79e <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 75c: 6398 ld a4,0(a5) + 75e: 00e7e463 bltu a5,a4,766 <free+0x3a> + 762: 00e6ea63 bltu a3,a4,776 <free+0x4a> +{ + 766: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 768: fed7fae3 bgeu a5,a3,75c <free+0x30> + 76c: 6398 ld a4,0(a5) + 76e: 00e6e463 bltu a3,a4,776 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 772: fee7eae3 bltu a5,a4,766 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 776: ff852583 lw a1,-8(a0) + 77a: 6390 ld a2,0(a5) + 77c: 02059813 slli a6,a1,0x20 + 780: 01c85713 srli a4,a6,0x1c + 784: 9736 add a4,a4,a3 + 786: fae60de3 beq a2,a4,740 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 78a: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 78e: 4790 lw a2,8(a5) + 790: 02061593 slli a1,a2,0x20 + 794: 01c5d713 srli a4,a1,0x1c + 798: 973e add a4,a4,a5 + 79a: fae68ae3 beq a3,a4,74e <free+0x22> + p->s.ptr = bp->s.ptr; + 79e: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7a0: 00001717 auipc a4,0x1 + 7a4: 86f73023 sd a5,-1952(a4) # 1000 <freep> +} + 7a8: 6422 ld s0,8(sp) + 7aa: 0141 addi sp,sp,16 + 7ac: 8082 ret + +00000000000007ae <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7ae: 7139 addi sp,sp,-64 + 7b0: fc06 sd ra,56(sp) + 7b2: f822 sd s0,48(sp) + 7b4: f426 sd s1,40(sp) + 7b6: f04a sd s2,32(sp) + 7b8: ec4e sd s3,24(sp) + 7ba: e852 sd s4,16(sp) + 7bc: e456 sd s5,8(sp) + 7be: e05a sd s6,0(sp) + 7c0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7c2: 02051493 slli s1,a0,0x20 + 7c6: 9081 srli s1,s1,0x20 + 7c8: 04bd addi s1,s1,15 + 7ca: 8091 srli s1,s1,0x4 + 7cc: 0014899b addiw s3,s1,1 + 7d0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7d2: 00001517 auipc a0,0x1 + 7d6: 82e53503 ld a0,-2002(a0) # 1000 <freep> + 7da: c515 beqz a0,806 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7dc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7de: 4798 lw a4,8(a5) + 7e0: 02977f63 bgeu a4,s1,81e <malloc+0x70> + 7e4: 8a4e mv s4,s3 + 7e6: 0009871b sext.w a4,s3 + 7ea: 6685 lui a3,0x1 + 7ec: 00d77363 bgeu a4,a3,7f2 <malloc+0x44> + 7f0: 6a05 lui s4,0x1 + 7f2: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7f6: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7fa: 00001917 auipc s2,0x1 + 7fe: 80690913 addi s2,s2,-2042 # 1000 <freep> + if(p == (char*)-1) + 802: 5afd li s5,-1 + 804: a885 j 874 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 806: 00001797 auipc a5,0x1 + 80a: 80a78793 addi a5,a5,-2038 # 1010 <base> + 80e: 00000717 auipc a4,0x0 + 812: 7ef73923 sd a5,2034(a4) # 1000 <freep> + 816: e39c sd a5,0(a5) + base.s.size = 0; + 818: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 81c: b7e1 j 7e4 <malloc+0x36> + if(p->s.size == nunits) + 81e: 02e48c63 beq s1,a4,856 <malloc+0xa8> + p->s.size -= nunits; + 822: 4137073b subw a4,a4,s3 + 826: c798 sw a4,8(a5) + p += p->s.size; + 828: 02071693 slli a3,a4,0x20 + 82c: 01c6d713 srli a4,a3,0x1c + 830: 97ba add a5,a5,a4 + p->s.size = nunits; + 832: 0137a423 sw s3,8(a5) + freep = prevp; + 836: 00000717 auipc a4,0x0 + 83a: 7ca73523 sd a0,1994(a4) # 1000 <freep> + return (void*)(p + 1); + 83e: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 842: 70e2 ld ra,56(sp) + 844: 7442 ld s0,48(sp) + 846: 74a2 ld s1,40(sp) + 848: 7902 ld s2,32(sp) + 84a: 69e2 ld s3,24(sp) + 84c: 6a42 ld s4,16(sp) + 84e: 6aa2 ld s5,8(sp) + 850: 6b02 ld s6,0(sp) + 852: 6121 addi sp,sp,64 + 854: 8082 ret + prevp->s.ptr = p->s.ptr; + 856: 6398 ld a4,0(a5) + 858: e118 sd a4,0(a0) + 85a: bff1 j 836 <malloc+0x88> + hp->s.size = nu; + 85c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 860: 0541 addi a0,a0,16 + 862: ecbff0ef jal ra,72c <free> + return freep; + 866: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 86a: dd61 beqz a0,842 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 86c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 86e: 4798 lw a4,8(a5) + 870: fa9777e3 bgeu a4,s1,81e <malloc+0x70> + if(p == freep) + 874: 00093703 ld a4,0(s2) + 878: 853e mv a0,a5 + 87a: fef719e3 bne a4,a5,86c <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 87e: 8552 mv a0,s4 + 880: adfff0ef jal ra,35e <sbrk> + if(p == (char*)-1) + 884: fd551ce3 bne a0,s5,85c <malloc+0xae> + return 0; + 888: 4501 li a0,0 + 88a: bf65 j 842 <malloc+0x94> diff --git a/user/test_SCinfo.d b/user/test_SCinfo.d new file mode 100644 index 0000000000000000000000000000000000000000..c2b0ae43b22b6a36276ed9fe9af87838c087889c --- /dev/null +++ b/user/test_SCinfo.d @@ -0,0 +1,3 @@ +user/test_SCinfo.o: user/test_SCinfo.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/stat.h user/user.h diff --git a/user/test_SCinfo.o b/user/test_SCinfo.o new file mode 100644 index 0000000000000000000000000000000000000000..0251028f642fdcb734a02a3beea49202e3be798d Binary files /dev/null and b/user/test_SCinfo.o differ diff --git a/user/test_SCinfo.sym b/user/test_SCinfo.sym new file mode 100644 index 0000000000000000000000000000000000000000..b6f16064e370e9ba4922369c6de4b5a4bbf03840 --- /dev/null +++ b/user/test_SCinfo.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000890 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 test_SCinfo.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000038e putc +00000000000003ac printint +00000000000008e0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000007e strcpy +00000000000006fa printf +0000000000000228 memmove +000000000000031e mknod +0000000000000376 trace +0000000000000136 gets +0000000000000356 getpid +00000000000002ba memcpy +00000000000007ae malloc +0000000000000366 sleep +000000000000037e mycall +00000000000002e6 pipe +00000000000002f6 write +000000000000032e fstat +00000000000006d0 fprintf +0000000000000306 kill +0000000000000454 vprintf +0000000000000346 chdir +000000000000030e exec +00000000000002de wait +00000000000002ee read +0000000000000326 unlink +0000000000000280 memcmp +00000000000002ce fork +000000000000035e sbrk +000000000000036e uptime +00000000000000f0 memset +0000000000000000 main +0000000000000386 GSCinfo +000000000000009a strcmp +000000000000034e dup +00000000000001a6 stat +0000000000000336 link +00000000000002d6 exit +000000000000006c start +00000000000001e0 atoi +00000000000000c6 strlen +0000000000000316 open +0000000000000112 strchr +000000000000033e mkdir +00000000000002fe close +000000000000072c free diff --git a/user/test_mycall.asm b/user/test_mycall.asm new file mode 100644 index 0000000000000000000000000000000000000000..aa5546f247baac94e55cbd0f23ece5ebf97e2626 --- /dev/null +++ b/user/test_mycall.asm @@ -0,0 +1,1446 @@ + +user/_test_mycall: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "user.h" + + +int main(void) { + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + int result = mycall(); // 调用自定义系统调用 + 8: 32a000ef jal ra,332 <mycall> + c: 85aa mv a1,a0 + printf("mycall returned: %d\n", result); // 输出返回值 + e: 00001517 auipc a0,0x1 + 12: 83250513 addi a0,a0,-1998 # 840 <malloc+0xde> + 16: 698000ef jal ra,6ae <printf> + exit(0); + 1a: 4501 li a0,0 + 1c: 26e000ef jal ra,28a <exit> + +0000000000000020 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 20: 1141 addi sp,sp,-16 + 22: e406 sd ra,8(sp) + 24: e022 sd s0,0(sp) + 26: 0800 addi s0,sp,16 + extern int main(); + main(); + 28: fd9ff0ef jal ra,0 <main> + exit(0); + 2c: 4501 li a0,0 + 2e: 25c000ef jal ra,28a <exit> + +0000000000000032 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 32: 1141 addi sp,sp,-16 + 34: e422 sd s0,8(sp) + 36: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 38: 87aa mv a5,a0 + 3a: 0585 addi a1,a1,1 + 3c: 0785 addi a5,a5,1 + 3e: fff5c703 lbu a4,-1(a1) + 42: fee78fa3 sb a4,-1(a5) + 46: fb75 bnez a4,3a <strcpy+0x8> + ; + return os; +} + 48: 6422 ld s0,8(sp) + 4a: 0141 addi sp,sp,16 + 4c: 8082 ret + +000000000000004e <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 4e: 1141 addi sp,sp,-16 + 50: e422 sd s0,8(sp) + 52: 0800 addi s0,sp,16 + while(*p && *p == *q) + 54: 00054783 lbu a5,0(a0) + 58: cb91 beqz a5,6c <strcmp+0x1e> + 5a: 0005c703 lbu a4,0(a1) + 5e: 00f71763 bne a4,a5,6c <strcmp+0x1e> + p++, q++; + 62: 0505 addi a0,a0,1 + 64: 0585 addi a1,a1,1 + while(*p && *p == *q) + 66: 00054783 lbu a5,0(a0) + 6a: fbe5 bnez a5,5a <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 6c: 0005c503 lbu a0,0(a1) +} + 70: 40a7853b subw a0,a5,a0 + 74: 6422 ld s0,8(sp) + 76: 0141 addi sp,sp,16 + 78: 8082 ret + +000000000000007a <strlen>: + +uint +strlen(const char *s) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e422 sd s0,8(sp) + 7e: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 80: 00054783 lbu a5,0(a0) + 84: cf91 beqz a5,a0 <strlen+0x26> + 86: 0505 addi a0,a0,1 + 88: 87aa mv a5,a0 + 8a: 4685 li a3,1 + 8c: 9e89 subw a3,a3,a0 + 8e: 00f6853b addw a0,a3,a5 + 92: 0785 addi a5,a5,1 + 94: fff7c703 lbu a4,-1(a5) + 98: fb7d bnez a4,8e <strlen+0x14> + ; + return n; +} + 9a: 6422 ld s0,8(sp) + 9c: 0141 addi sp,sp,16 + 9e: 8082 ret + for(n = 0; s[n]; n++) + a0: 4501 li a0,0 + a2: bfe5 j 9a <strlen+0x20> + +00000000000000a4 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + a4: 1141 addi sp,sp,-16 + a6: e422 sd s0,8(sp) + a8: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + aa: ca19 beqz a2,c0 <memset+0x1c> + ac: 87aa mv a5,a0 + ae: 1602 slli a2,a2,0x20 + b0: 9201 srli a2,a2,0x20 + b2: 00a60733 add a4,a2,a0 + cdst[i] = c; + b6: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + ba: 0785 addi a5,a5,1 + bc: fee79de3 bne a5,a4,b6 <memset+0x12> + } + return dst; +} + c0: 6422 ld s0,8(sp) + c2: 0141 addi sp,sp,16 + c4: 8082 ret + +00000000000000c6 <strchr>: + +char* +strchr(const char *s, char c) +{ + c6: 1141 addi sp,sp,-16 + c8: e422 sd s0,8(sp) + ca: 0800 addi s0,sp,16 + for(; *s; s++) + cc: 00054783 lbu a5,0(a0) + d0: cb99 beqz a5,e6 <strchr+0x20> + if(*s == c) + d2: 00f58763 beq a1,a5,e0 <strchr+0x1a> + for(; *s; s++) + d6: 0505 addi a0,a0,1 + d8: 00054783 lbu a5,0(a0) + dc: fbfd bnez a5,d2 <strchr+0xc> + return (char*)s; + return 0; + de: 4501 li a0,0 +} + e0: 6422 ld s0,8(sp) + e2: 0141 addi sp,sp,16 + e4: 8082 ret + return 0; + e6: 4501 li a0,0 + e8: bfe5 j e0 <strchr+0x1a> + +00000000000000ea <gets>: + +char* +gets(char *buf, int max) +{ + ea: 711d addi sp,sp,-96 + ec: ec86 sd ra,88(sp) + ee: e8a2 sd s0,80(sp) + f0: e4a6 sd s1,72(sp) + f2: e0ca sd s2,64(sp) + f4: fc4e sd s3,56(sp) + f6: f852 sd s4,48(sp) + f8: f456 sd s5,40(sp) + fa: f05a sd s6,32(sp) + fc: ec5e sd s7,24(sp) + fe: 1080 addi s0,sp,96 + 100: 8baa mv s7,a0 + 102: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 104: 892a mv s2,a0 + 106: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 108: 4aa9 li s5,10 + 10a: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 10c: 89a6 mv s3,s1 + 10e: 2485 addiw s1,s1,1 + 110: 0344d663 bge s1,s4,13c <gets+0x52> + cc = read(0, &c, 1); + 114: 4605 li a2,1 + 116: faf40593 addi a1,s0,-81 + 11a: 4501 li a0,0 + 11c: 186000ef jal ra,2a2 <read> + if(cc < 1) + 120: 00a05e63 blez a0,13c <gets+0x52> + buf[i++] = c; + 124: faf44783 lbu a5,-81(s0) + 128: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 12c: 01578763 beq a5,s5,13a <gets+0x50> + 130: 0905 addi s2,s2,1 + 132: fd679de3 bne a5,s6,10c <gets+0x22> + for(i=0; i+1 < max; ){ + 136: 89a6 mv s3,s1 + 138: a011 j 13c <gets+0x52> + 13a: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 13c: 99de add s3,s3,s7 + 13e: 00098023 sb zero,0(s3) + return buf; +} + 142: 855e mv a0,s7 + 144: 60e6 ld ra,88(sp) + 146: 6446 ld s0,80(sp) + 148: 64a6 ld s1,72(sp) + 14a: 6906 ld s2,64(sp) + 14c: 79e2 ld s3,56(sp) + 14e: 7a42 ld s4,48(sp) + 150: 7aa2 ld s5,40(sp) + 152: 7b02 ld s6,32(sp) + 154: 6be2 ld s7,24(sp) + 156: 6125 addi sp,sp,96 + 158: 8082 ret + +000000000000015a <stat>: + +int +stat(const char *n, struct stat *st) +{ + 15a: 1101 addi sp,sp,-32 + 15c: ec06 sd ra,24(sp) + 15e: e822 sd s0,16(sp) + 160: e426 sd s1,8(sp) + 162: e04a sd s2,0(sp) + 164: 1000 addi s0,sp,32 + 166: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 168: 4581 li a1,0 + 16a: 160000ef jal ra,2ca <open> + if(fd < 0) + 16e: 02054163 bltz a0,190 <stat+0x36> + 172: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 174: 85ca mv a1,s2 + 176: 16c000ef jal ra,2e2 <fstat> + 17a: 892a mv s2,a0 + close(fd); + 17c: 8526 mv a0,s1 + 17e: 134000ef jal ra,2b2 <close> + return r; +} + 182: 854a mv a0,s2 + 184: 60e2 ld ra,24(sp) + 186: 6442 ld s0,16(sp) + 188: 64a2 ld s1,8(sp) + 18a: 6902 ld s2,0(sp) + 18c: 6105 addi sp,sp,32 + 18e: 8082 ret + return -1; + 190: 597d li s2,-1 + 192: bfc5 j 182 <stat+0x28> + +0000000000000194 <atoi>: + +int +atoi(const char *s) +{ + 194: 1141 addi sp,sp,-16 + 196: e422 sd s0,8(sp) + 198: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 19a: 00054683 lbu a3,0(a0) + 19e: fd06879b addiw a5,a3,-48 + 1a2: 0ff7f793 zext.b a5,a5 + 1a6: 4625 li a2,9 + 1a8: 02f66863 bltu a2,a5,1d8 <atoi+0x44> + 1ac: 872a mv a4,a0 + n = 0; + 1ae: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1b0: 0705 addi a4,a4,1 + 1b2: 0025179b slliw a5,a0,0x2 + 1b6: 9fa9 addw a5,a5,a0 + 1b8: 0017979b slliw a5,a5,0x1 + 1bc: 9fb5 addw a5,a5,a3 + 1be: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1c2: 00074683 lbu a3,0(a4) + 1c6: fd06879b addiw a5,a3,-48 + 1ca: 0ff7f793 zext.b a5,a5 + 1ce: fef671e3 bgeu a2,a5,1b0 <atoi+0x1c> + return n; +} + 1d2: 6422 ld s0,8(sp) + 1d4: 0141 addi sp,sp,16 + 1d6: 8082 ret + n = 0; + 1d8: 4501 li a0,0 + 1da: bfe5 j 1d2 <atoi+0x3e> + +00000000000001dc <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1dc: 1141 addi sp,sp,-16 + 1de: e422 sd s0,8(sp) + 1e0: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1e2: 02b57463 bgeu a0,a1,20a <memmove+0x2e> + while(n-- > 0) + 1e6: 00c05f63 blez a2,204 <memmove+0x28> + 1ea: 1602 slli a2,a2,0x20 + 1ec: 9201 srli a2,a2,0x20 + 1ee: 00c507b3 add a5,a0,a2 + dst = vdst; + 1f2: 872a mv a4,a0 + *dst++ = *src++; + 1f4: 0585 addi a1,a1,1 + 1f6: 0705 addi a4,a4,1 + 1f8: fff5c683 lbu a3,-1(a1) + 1fc: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 200: fee79ae3 bne a5,a4,1f4 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 204: 6422 ld s0,8(sp) + 206: 0141 addi sp,sp,16 + 208: 8082 ret + dst += n; + 20a: 00c50733 add a4,a0,a2 + src += n; + 20e: 95b2 add a1,a1,a2 + while(n-- > 0) + 210: fec05ae3 blez a2,204 <memmove+0x28> + 214: fff6079b addiw a5,a2,-1 + 218: 1782 slli a5,a5,0x20 + 21a: 9381 srli a5,a5,0x20 + 21c: fff7c793 not a5,a5 + 220: 97ba add a5,a5,a4 + *--dst = *--src; + 222: 15fd addi a1,a1,-1 + 224: 177d addi a4,a4,-1 + 226: 0005c683 lbu a3,0(a1) + 22a: 00d70023 sb a3,0(a4) + while(n-- > 0) + 22e: fee79ae3 bne a5,a4,222 <memmove+0x46> + 232: bfc9 j 204 <memmove+0x28> + +0000000000000234 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 234: 1141 addi sp,sp,-16 + 236: e422 sd s0,8(sp) + 238: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 23a: ca05 beqz a2,26a <memcmp+0x36> + 23c: fff6069b addiw a3,a2,-1 + 240: 1682 slli a3,a3,0x20 + 242: 9281 srli a3,a3,0x20 + 244: 0685 addi a3,a3,1 + 246: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 248: 00054783 lbu a5,0(a0) + 24c: 0005c703 lbu a4,0(a1) + 250: 00e79863 bne a5,a4,260 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 254: 0505 addi a0,a0,1 + p2++; + 256: 0585 addi a1,a1,1 + while (n-- > 0) { + 258: fed518e3 bne a0,a3,248 <memcmp+0x14> + } + return 0; + 25c: 4501 li a0,0 + 25e: a019 j 264 <memcmp+0x30> + return *p1 - *p2; + 260: 40e7853b subw a0,a5,a4 +} + 264: 6422 ld s0,8(sp) + 266: 0141 addi sp,sp,16 + 268: 8082 ret + return 0; + 26a: 4501 li a0,0 + 26c: bfe5 j 264 <memcmp+0x30> + +000000000000026e <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 26e: 1141 addi sp,sp,-16 + 270: e406 sd ra,8(sp) + 272: e022 sd s0,0(sp) + 274: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 276: f67ff0ef jal ra,1dc <memmove> +} + 27a: 60a2 ld ra,8(sp) + 27c: 6402 ld s0,0(sp) + 27e: 0141 addi sp,sp,16 + 280: 8082 ret + +0000000000000282 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 282: 4885 li a7,1 + ecall + 284: 00000073 ecall + ret + 288: 8082 ret + +000000000000028a <exit>: +.global exit +exit: + li a7, SYS_exit + 28a: 4889 li a7,2 + ecall + 28c: 00000073 ecall + ret + 290: 8082 ret + +0000000000000292 <wait>: +.global wait +wait: + li a7, SYS_wait + 292: 488d li a7,3 + ecall + 294: 00000073 ecall + ret + 298: 8082 ret + +000000000000029a <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 29a: 4891 li a7,4 + ecall + 29c: 00000073 ecall + ret + 2a0: 8082 ret + +00000000000002a2 <read>: +.global read +read: + li a7, SYS_read + 2a2: 4895 li a7,5 + ecall + 2a4: 00000073 ecall + ret + 2a8: 8082 ret + +00000000000002aa <write>: +.global write +write: + li a7, SYS_write + 2aa: 48c1 li a7,16 + ecall + 2ac: 00000073 ecall + ret + 2b0: 8082 ret + +00000000000002b2 <close>: +.global close +close: + li a7, SYS_close + 2b2: 48d5 li a7,21 + ecall + 2b4: 00000073 ecall + ret + 2b8: 8082 ret + +00000000000002ba <kill>: +.global kill +kill: + li a7, SYS_kill + 2ba: 4899 li a7,6 + ecall + 2bc: 00000073 ecall + ret + 2c0: 8082 ret + +00000000000002c2 <exec>: +.global exec +exec: + li a7, SYS_exec + 2c2: 489d li a7,7 + ecall + 2c4: 00000073 ecall + ret + 2c8: 8082 ret + +00000000000002ca <open>: +.global open +open: + li a7, SYS_open + 2ca: 48bd li a7,15 + ecall + 2cc: 00000073 ecall + ret + 2d0: 8082 ret + +00000000000002d2 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 2d2: 48c5 li a7,17 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 2da: 48c9 li a7,18 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 2e2: 48a1 li a7,8 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea <link>: +.global link +link: + li a7, SYS_link + 2ea: 48cd li a7,19 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 2f2: 48d1 li a7,20 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 2fa: 48a5 li a7,9 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 <dup>: +.global dup +dup: + li a7, SYS_dup + 302: 48a9 li a7,10 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 30a: 48ad li a7,11 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 312: 48b1 li a7,12 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 31a: 48b5 li a7,13 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 322: 48b9 li a7,14 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a <trace>: +.global trace +trace: + li a7, SYS_trace + 32a: 48d9 li a7,22 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 332: 48dd li a7,23 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 33a: 48e1 li a7,24 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 342: 1101 addi sp,sp,-32 + 344: ec06 sd ra,24(sp) + 346: e822 sd s0,16(sp) + 348: 1000 addi s0,sp,32 + 34a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 34e: 4605 li a2,1 + 350: fef40593 addi a1,s0,-17 + 354: f57ff0ef jal ra,2aa <write> +} + 358: 60e2 ld ra,24(sp) + 35a: 6442 ld s0,16(sp) + 35c: 6105 addi sp,sp,32 + 35e: 8082 ret + +0000000000000360 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 360: 7139 addi sp,sp,-64 + 362: fc06 sd ra,56(sp) + 364: f822 sd s0,48(sp) + 366: f426 sd s1,40(sp) + 368: f04a sd s2,32(sp) + 36a: ec4e sd s3,24(sp) + 36c: 0080 addi s0,sp,64 + 36e: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 370: c299 beqz a3,376 <printint+0x16> + 372: 0805c763 bltz a1,400 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 376: 2581 sext.w a1,a1 + neg = 0; + 378: 4881 li a7,0 + 37a: fc040693 addi a3,s0,-64 + } + + i = 0; + 37e: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 380: 2601 sext.w a2,a2 + 382: 00000517 auipc a0,0x0 + 386: 4de50513 addi a0,a0,1246 # 860 <digits> + 38a: 883a mv a6,a4 + 38c: 2705 addiw a4,a4,1 + 38e: 02c5f7bb remuw a5,a1,a2 + 392: 1782 slli a5,a5,0x20 + 394: 9381 srli a5,a5,0x20 + 396: 97aa add a5,a5,a0 + 398: 0007c783 lbu a5,0(a5) + 39c: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 3a0: 0005879b sext.w a5,a1 + 3a4: 02c5d5bb divuw a1,a1,a2 + 3a8: 0685 addi a3,a3,1 + 3aa: fec7f0e3 bgeu a5,a2,38a <printint+0x2a> + if(neg) + 3ae: 00088c63 beqz a7,3c6 <printint+0x66> + buf[i++] = '-'; + 3b2: fd070793 addi a5,a4,-48 + 3b6: 00878733 add a4,a5,s0 + 3ba: 02d00793 li a5,45 + 3be: fef70823 sb a5,-16(a4) + 3c2: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 3c6: 02e05663 blez a4,3f2 <printint+0x92> + 3ca: fc040793 addi a5,s0,-64 + 3ce: 00e78933 add s2,a5,a4 + 3d2: fff78993 addi s3,a5,-1 + 3d6: 99ba add s3,s3,a4 + 3d8: 377d addiw a4,a4,-1 + 3da: 1702 slli a4,a4,0x20 + 3dc: 9301 srli a4,a4,0x20 + 3de: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 3e2: fff94583 lbu a1,-1(s2) + 3e6: 8526 mv a0,s1 + 3e8: f5bff0ef jal ra,342 <putc> + while(--i >= 0) + 3ec: 197d addi s2,s2,-1 + 3ee: ff391ae3 bne s2,s3,3e2 <printint+0x82> +} + 3f2: 70e2 ld ra,56(sp) + 3f4: 7442 ld s0,48(sp) + 3f6: 74a2 ld s1,40(sp) + 3f8: 7902 ld s2,32(sp) + 3fa: 69e2 ld s3,24(sp) + 3fc: 6121 addi sp,sp,64 + 3fe: 8082 ret + x = -xx; + 400: 40b005bb negw a1,a1 + neg = 1; + 404: 4885 li a7,1 + x = -xx; + 406: bf95 j 37a <printint+0x1a> + +0000000000000408 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 408: 7119 addi sp,sp,-128 + 40a: fc86 sd ra,120(sp) + 40c: f8a2 sd s0,112(sp) + 40e: f4a6 sd s1,104(sp) + 410: f0ca sd s2,96(sp) + 412: ecce sd s3,88(sp) + 414: e8d2 sd s4,80(sp) + 416: e4d6 sd s5,72(sp) + 418: e0da sd s6,64(sp) + 41a: fc5e sd s7,56(sp) + 41c: f862 sd s8,48(sp) + 41e: f466 sd s9,40(sp) + 420: f06a sd s10,32(sp) + 422: ec6e sd s11,24(sp) + 424: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 426: 0005c903 lbu s2,0(a1) + 42a: 22090e63 beqz s2,666 <vprintf+0x25e> + 42e: 8b2a mv s6,a0 + 430: 8a2e mv s4,a1 + 432: 8bb2 mv s7,a2 + state = 0; + 434: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 436: 4481 li s1,0 + 438: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 43a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 43e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 442: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 446: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 44a: 00000c97 auipc s9,0x0 + 44e: 416c8c93 addi s9,s9,1046 # 860 <digits> + 452: a005 j 472 <vprintf+0x6a> + putc(fd, c0); + 454: 85ca mv a1,s2 + 456: 855a mv a0,s6 + 458: eebff0ef jal ra,342 <putc> + 45c: a019 j 462 <vprintf+0x5a> + } else if(state == '%'){ + 45e: 03598263 beq s3,s5,482 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 462: 2485 addiw s1,s1,1 + 464: 8726 mv a4,s1 + 466: 009a07b3 add a5,s4,s1 + 46a: 0007c903 lbu s2,0(a5) + 46e: 1e090c63 beqz s2,666 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 472: 0009079b sext.w a5,s2 + if(state == 0){ + 476: fe0994e3 bnez s3,45e <vprintf+0x56> + if(c0 == '%'){ + 47a: fd579de3 bne a5,s5,454 <vprintf+0x4c> + state = '%'; + 47e: 89be mv s3,a5 + 480: b7cd j 462 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 482: cfa5 beqz a5,4fa <vprintf+0xf2> + 484: 00ea06b3 add a3,s4,a4 + 488: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 48c: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 48e: c681 beqz a3,496 <vprintf+0x8e> + 490: 9752 add a4,a4,s4 + 492: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 496: 03878a63 beq a5,s8,4ca <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 49a: 05a78463 beq a5,s10,4e2 <vprintf+0xda> + } else if(c0 == 'u'){ + 49e: 0db78763 beq a5,s11,56c <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4a2: 07800713 li a4,120 + 4a6: 10e78963 beq a5,a4,5b8 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4aa: 07000713 li a4,112 + 4ae: 12e78e63 beq a5,a4,5ea <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4b2: 07300713 li a4,115 + 4b6: 16e78b63 beq a5,a4,62c <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4ba: 05579063 bne a5,s5,4fa <vprintf+0xf2> + putc(fd, '%'); + 4be: 85d6 mv a1,s5 + 4c0: 855a mv a0,s6 + 4c2: e81ff0ef jal ra,342 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 4c6: 4981 li s3,0 + 4c8: bf69 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 4ca: 008b8913 addi s2,s7,8 + 4ce: 4685 li a3,1 + 4d0: 4629 li a2,10 + 4d2: 000ba583 lw a1,0(s7) + 4d6: 855a mv a0,s6 + 4d8: e89ff0ef jal ra,360 <printint> + 4dc: 8bca mv s7,s2 + state = 0; + 4de: 4981 li s3,0 + 4e0: b749 j 462 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 4e2: 03868663 beq a3,s8,50e <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4e6: 05a68163 beq a3,s10,528 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 4ea: 09b68d63 beq a3,s11,584 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 4ee: 03a68f63 beq a3,s10,52c <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 4f2: 07800793 li a5,120 + 4f6: 0cf68d63 beq a3,a5,5d0 <vprintf+0x1c8> + putc(fd, '%'); + 4fa: 85d6 mv a1,s5 + 4fc: 855a mv a0,s6 + 4fe: e45ff0ef jal ra,342 <putc> + putc(fd, c0); + 502: 85ca mv a1,s2 + 504: 855a mv a0,s6 + 506: e3dff0ef jal ra,342 <putc> + state = 0; + 50a: 4981 li s3,0 + 50c: bf99 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 50e: 008b8913 addi s2,s7,8 + 512: 4685 li a3,1 + 514: 4629 li a2,10 + 516: 000ba583 lw a1,0(s7) + 51a: 855a mv a0,s6 + 51c: e45ff0ef jal ra,360 <printint> + i += 1; + 520: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 522: 8bca mv s7,s2 + state = 0; + 524: 4981 li s3,0 + i += 1; + 526: bf35 j 462 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 528: 03860563 beq a2,s8,552 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 52c: 07b60963 beq a2,s11,59e <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 530: 07800793 li a5,120 + 534: fcf613e3 bne a2,a5,4fa <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 538: 008b8913 addi s2,s7,8 + 53c: 4681 li a3,0 + 53e: 4641 li a2,16 + 540: 000ba583 lw a1,0(s7) + 544: 855a mv a0,s6 + 546: e1bff0ef jal ra,360 <printint> + i += 2; + 54a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 54c: 8bca mv s7,s2 + state = 0; + 54e: 4981 li s3,0 + i += 2; + 550: bf09 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 552: 008b8913 addi s2,s7,8 + 556: 4685 li a3,1 + 558: 4629 li a2,10 + 55a: 000ba583 lw a1,0(s7) + 55e: 855a mv a0,s6 + 560: e01ff0ef jal ra,360 <printint> + i += 2; + 564: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 566: 8bca mv s7,s2 + state = 0; + 568: 4981 li s3,0 + i += 2; + 56a: bde5 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 56c: 008b8913 addi s2,s7,8 + 570: 4681 li a3,0 + 572: 4629 li a2,10 + 574: 000ba583 lw a1,0(s7) + 578: 855a mv a0,s6 + 57a: de7ff0ef jal ra,360 <printint> + 57e: 8bca mv s7,s2 + state = 0; + 580: 4981 li s3,0 + 582: b5c5 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 584: 008b8913 addi s2,s7,8 + 588: 4681 li a3,0 + 58a: 4629 li a2,10 + 58c: 000ba583 lw a1,0(s7) + 590: 855a mv a0,s6 + 592: dcfff0ef jal ra,360 <printint> + i += 1; + 596: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 598: 8bca mv s7,s2 + state = 0; + 59a: 4981 li s3,0 + i += 1; + 59c: b5d9 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 59e: 008b8913 addi s2,s7,8 + 5a2: 4681 li a3,0 + 5a4: 4629 li a2,10 + 5a6: 000ba583 lw a1,0(s7) + 5aa: 855a mv a0,s6 + 5ac: db5ff0ef jal ra,360 <printint> + i += 2; + 5b0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5b2: 8bca mv s7,s2 + state = 0; + 5b4: 4981 li s3,0 + i += 2; + 5b6: b575 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5b8: 008b8913 addi s2,s7,8 + 5bc: 4681 li a3,0 + 5be: 4641 li a2,16 + 5c0: 000ba583 lw a1,0(s7) + 5c4: 855a mv a0,s6 + 5c6: d9bff0ef jal ra,360 <printint> + 5ca: 8bca mv s7,s2 + state = 0; + 5cc: 4981 li s3,0 + 5ce: bd51 j 462 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 5d0: 008b8913 addi s2,s7,8 + 5d4: 4681 li a3,0 + 5d6: 4641 li a2,16 + 5d8: 000ba583 lw a1,0(s7) + 5dc: 855a mv a0,s6 + 5de: d83ff0ef jal ra,360 <printint> + i += 1; + 5e2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 5e4: 8bca mv s7,s2 + state = 0; + 5e6: 4981 li s3,0 + i += 1; + 5e8: bdad j 462 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 5ea: 008b8793 addi a5,s7,8 + 5ee: f8f43423 sd a5,-120(s0) + 5f2: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 5f6: 03000593 li a1,48 + 5fa: 855a mv a0,s6 + 5fc: d47ff0ef jal ra,342 <putc> + putc(fd, 'x'); + 600: 07800593 li a1,120 + 604: 855a mv a0,s6 + 606: d3dff0ef jal ra,342 <putc> + 60a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 60c: 03c9d793 srli a5,s3,0x3c + 610: 97e6 add a5,a5,s9 + 612: 0007c583 lbu a1,0(a5) + 616: 855a mv a0,s6 + 618: d2bff0ef jal ra,342 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 61c: 0992 slli s3,s3,0x4 + 61e: 397d addiw s2,s2,-1 + 620: fe0916e3 bnez s2,60c <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 624: f8843b83 ld s7,-120(s0) + state = 0; + 628: 4981 li s3,0 + 62a: bd25 j 462 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 62c: 008b8993 addi s3,s7,8 + 630: 000bb903 ld s2,0(s7) + 634: 00090f63 beqz s2,652 <vprintf+0x24a> + for(; *s; s++) + 638: 00094583 lbu a1,0(s2) + 63c: c195 beqz a1,660 <vprintf+0x258> + putc(fd, *s); + 63e: 855a mv a0,s6 + 640: d03ff0ef jal ra,342 <putc> + for(; *s; s++) + 644: 0905 addi s2,s2,1 + 646: 00094583 lbu a1,0(s2) + 64a: f9f5 bnez a1,63e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 64c: 8bce mv s7,s3 + state = 0; + 64e: 4981 li s3,0 + 650: bd09 j 462 <vprintf+0x5a> + s = "(null)"; + 652: 00000917 auipc s2,0x0 + 656: 20690913 addi s2,s2,518 # 858 <malloc+0xf6> + for(; *s; s++) + 65a: 02800593 li a1,40 + 65e: b7c5 j 63e <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 660: 8bce mv s7,s3 + state = 0; + 662: 4981 li s3,0 + 664: bbfd j 462 <vprintf+0x5a> + } + } +} + 666: 70e6 ld ra,120(sp) + 668: 7446 ld s0,112(sp) + 66a: 74a6 ld s1,104(sp) + 66c: 7906 ld s2,96(sp) + 66e: 69e6 ld s3,88(sp) + 670: 6a46 ld s4,80(sp) + 672: 6aa6 ld s5,72(sp) + 674: 6b06 ld s6,64(sp) + 676: 7be2 ld s7,56(sp) + 678: 7c42 ld s8,48(sp) + 67a: 7ca2 ld s9,40(sp) + 67c: 7d02 ld s10,32(sp) + 67e: 6de2 ld s11,24(sp) + 680: 6109 addi sp,sp,128 + 682: 8082 ret + +0000000000000684 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 684: 715d addi sp,sp,-80 + 686: ec06 sd ra,24(sp) + 688: e822 sd s0,16(sp) + 68a: 1000 addi s0,sp,32 + 68c: e010 sd a2,0(s0) + 68e: e414 sd a3,8(s0) + 690: e818 sd a4,16(s0) + 692: ec1c sd a5,24(s0) + 694: 03043023 sd a6,32(s0) + 698: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 69c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6a0: 8622 mv a2,s0 + 6a2: d67ff0ef jal ra,408 <vprintf> +} + 6a6: 60e2 ld ra,24(sp) + 6a8: 6442 ld s0,16(sp) + 6aa: 6161 addi sp,sp,80 + 6ac: 8082 ret + +00000000000006ae <printf>: + +void +printf(const char *fmt, ...) +{ + 6ae: 711d addi sp,sp,-96 + 6b0: ec06 sd ra,24(sp) + 6b2: e822 sd s0,16(sp) + 6b4: 1000 addi s0,sp,32 + 6b6: e40c sd a1,8(s0) + 6b8: e810 sd a2,16(s0) + 6ba: ec14 sd a3,24(s0) + 6bc: f018 sd a4,32(s0) + 6be: f41c sd a5,40(s0) + 6c0: 03043823 sd a6,48(s0) + 6c4: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 6c8: 00840613 addi a2,s0,8 + 6cc: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 6d0: 85aa mv a1,a0 + 6d2: 4505 li a0,1 + 6d4: d35ff0ef jal ra,408 <vprintf> +} + 6d8: 60e2 ld ra,24(sp) + 6da: 6442 ld s0,16(sp) + 6dc: 6125 addi sp,sp,96 + 6de: 8082 ret + +00000000000006e0 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 6e0: 1141 addi sp,sp,-16 + 6e2: e422 sd s0,8(sp) + 6e4: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 6e6: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 6ea: 00001797 auipc a5,0x1 + 6ee: 9167b783 ld a5,-1770(a5) # 1000 <freep> + 6f2: a02d j 71c <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 6f4: 4618 lw a4,8(a2) + 6f6: 9f2d addw a4,a4,a1 + 6f8: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 6fc: 6398 ld a4,0(a5) + 6fe: 6310 ld a2,0(a4) + 700: a83d j 73e <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 702: ff852703 lw a4,-8(a0) + 706: 9f31 addw a4,a4,a2 + 708: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 70a: ff053683 ld a3,-16(a0) + 70e: a091 j 752 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 710: 6398 ld a4,0(a5) + 712: 00e7e463 bltu a5,a4,71a <free+0x3a> + 716: 00e6ea63 bltu a3,a4,72a <free+0x4a> +{ + 71a: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 71c: fed7fae3 bgeu a5,a3,710 <free+0x30> + 720: 6398 ld a4,0(a5) + 722: 00e6e463 bltu a3,a4,72a <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 726: fee7eae3 bltu a5,a4,71a <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 72a: ff852583 lw a1,-8(a0) + 72e: 6390 ld a2,0(a5) + 730: 02059813 slli a6,a1,0x20 + 734: 01c85713 srli a4,a6,0x1c + 738: 9736 add a4,a4,a3 + 73a: fae60de3 beq a2,a4,6f4 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 73e: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 742: 4790 lw a2,8(a5) + 744: 02061593 slli a1,a2,0x20 + 748: 01c5d713 srli a4,a1,0x1c + 74c: 973e add a4,a4,a5 + 74e: fae68ae3 beq a3,a4,702 <free+0x22> + p->s.ptr = bp->s.ptr; + 752: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 754: 00001717 auipc a4,0x1 + 758: 8af73623 sd a5,-1876(a4) # 1000 <freep> +} + 75c: 6422 ld s0,8(sp) + 75e: 0141 addi sp,sp,16 + 760: 8082 ret + +0000000000000762 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 762: 7139 addi sp,sp,-64 + 764: fc06 sd ra,56(sp) + 766: f822 sd s0,48(sp) + 768: f426 sd s1,40(sp) + 76a: f04a sd s2,32(sp) + 76c: ec4e sd s3,24(sp) + 76e: e852 sd s4,16(sp) + 770: e456 sd s5,8(sp) + 772: e05a sd s6,0(sp) + 774: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 776: 02051493 slli s1,a0,0x20 + 77a: 9081 srli s1,s1,0x20 + 77c: 04bd addi s1,s1,15 + 77e: 8091 srli s1,s1,0x4 + 780: 0014899b addiw s3,s1,1 + 784: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 786: 00001517 auipc a0,0x1 + 78a: 87a53503 ld a0,-1926(a0) # 1000 <freep> + 78e: c515 beqz a0,7ba <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 790: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 792: 4798 lw a4,8(a5) + 794: 02977f63 bgeu a4,s1,7d2 <malloc+0x70> + 798: 8a4e mv s4,s3 + 79a: 0009871b sext.w a4,s3 + 79e: 6685 lui a3,0x1 + 7a0: 00d77363 bgeu a4,a3,7a6 <malloc+0x44> + 7a4: 6a05 lui s4,0x1 + 7a6: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7aa: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7ae: 00001917 auipc s2,0x1 + 7b2: 85290913 addi s2,s2,-1966 # 1000 <freep> + if(p == (char*)-1) + 7b6: 5afd li s5,-1 + 7b8: a885 j 828 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7ba: 00001797 auipc a5,0x1 + 7be: 85678793 addi a5,a5,-1962 # 1010 <base> + 7c2: 00001717 auipc a4,0x1 + 7c6: 82f73f23 sd a5,-1986(a4) # 1000 <freep> + 7ca: e39c sd a5,0(a5) + base.s.size = 0; + 7cc: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 7d0: b7e1 j 798 <malloc+0x36> + if(p->s.size == nunits) + 7d2: 02e48c63 beq s1,a4,80a <malloc+0xa8> + p->s.size -= nunits; + 7d6: 4137073b subw a4,a4,s3 + 7da: c798 sw a4,8(a5) + p += p->s.size; + 7dc: 02071693 slli a3,a4,0x20 + 7e0: 01c6d713 srli a4,a3,0x1c + 7e4: 97ba add a5,a5,a4 + p->s.size = nunits; + 7e6: 0137a423 sw s3,8(a5) + freep = prevp; + 7ea: 00001717 auipc a4,0x1 + 7ee: 80a73b23 sd a0,-2026(a4) # 1000 <freep> + return (void*)(p + 1); + 7f2: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 7f6: 70e2 ld ra,56(sp) + 7f8: 7442 ld s0,48(sp) + 7fa: 74a2 ld s1,40(sp) + 7fc: 7902 ld s2,32(sp) + 7fe: 69e2 ld s3,24(sp) + 800: 6a42 ld s4,16(sp) + 802: 6aa2 ld s5,8(sp) + 804: 6b02 ld s6,0(sp) + 806: 6121 addi sp,sp,64 + 808: 8082 ret + prevp->s.ptr = p->s.ptr; + 80a: 6398 ld a4,0(a5) + 80c: e118 sd a4,0(a0) + 80e: bff1 j 7ea <malloc+0x88> + hp->s.size = nu; + 810: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 814: 0541 addi a0,a0,16 + 816: ecbff0ef jal ra,6e0 <free> + return freep; + 81a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 81e: dd61 beqz a0,7f6 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 820: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 822: 4798 lw a4,8(a5) + 824: fa9777e3 bgeu a4,s1,7d2 <malloc+0x70> + if(p == freep) + 828: 00093703 ld a4,0(s2) + 82c: 853e mv a0,a5 + 82e: fef719e3 bne a4,a5,820 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 832: 8552 mv a0,s4 + 834: adfff0ef jal ra,312 <sbrk> + if(p == (char*)-1) + 838: fd551ce3 bne a0,s5,810 <malloc+0xae> + return 0; + 83c: 4501 li a0,0 + 83e: bf65 j 7f6 <malloc+0x94> diff --git a/user/test_mycall.d b/user/test_mycall.d new file mode 100644 index 0000000000000000000000000000000000000000..7fdaf79920dc3c90960937d24880705188b7ce42 --- /dev/null +++ b/user/test_mycall.d @@ -0,0 +1,2 @@ +user/test_mycall.o: user/test_mycall.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h user/user.h diff --git a/user/test_mycall.o b/user/test_mycall.o new file mode 100644 index 0000000000000000000000000000000000000000..fc55670b0828db9211e5a6b6b74f208390da3209 Binary files /dev/null and b/user/test_mycall.o differ diff --git a/user/test_mycall.sym b/user/test_mycall.sym new file mode 100644 index 0000000000000000000000000000000000000000..3257a8e6d96c5f154c98908a7ad4aae62c5a54fd --- /dev/null +++ b/user/test_mycall.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000840 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 test_mycall.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000342 putc +0000000000000360 printint +0000000000000860 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000032 strcpy +00000000000006ae printf +00000000000001dc memmove +00000000000002d2 mknod +000000000000032a trace +00000000000000ea gets +000000000000030a getpid +000000000000026e memcpy +0000000000000762 malloc +000000000000031a sleep +0000000000000332 mycall +000000000000029a pipe +00000000000002aa write +00000000000002e2 fstat +0000000000000684 fprintf +00000000000002ba kill +0000000000000408 vprintf +00000000000002fa chdir +00000000000002c2 exec +0000000000000292 wait +00000000000002a2 read +00000000000002da unlink +0000000000000234 memcmp +0000000000000282 fork +0000000000000312 sbrk +0000000000000322 uptime +00000000000000a4 memset +0000000000000000 main +000000000000033a GSCinfo +000000000000004e strcmp +0000000000000302 dup +000000000000015a stat +00000000000002ea link +000000000000028a exit +0000000000000020 start +0000000000000194 atoi +000000000000007a strlen +00000000000002ca open +00000000000000c6 strchr +00000000000002f2 mkdir +00000000000002b2 close +00000000000006e0 free diff --git a/user/trace.asm b/user/trace.asm new file mode 100644 index 0000000000000000000000000000000000000000..6ab2edc3d51c82f247c57099d7313573db576757 --- /dev/null +++ b/user/trace.asm @@ -0,0 +1,1505 @@ + +user/_trace: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc,char* argv[]){ + 0: 712d addi sp,sp,-288 + 2: ee06 sd ra,280(sp) + 4: ea22 sd s0,272(sp) + 6: e626 sd s1,264(sp) + 8: e24a sd s2,256(sp) + a: 1200 addi s0,sp,288 + c: 892e mv s2,a1 + int i; + char *nargv[MAXARG]; + if(argc < 3||(argv[1][0]<'0'||argv[1][0]>'9')){ + e: 4789 li a5,2 + 10: 00a7dd63 bge a5,a0,2a <main+0x2a> + 14: 84aa mv s1,a0 + 16: 6588 ld a0,8(a1) + 18: 00054783 lbu a5,0(a0) + 1c: fd07879b addiw a5,a5,-48 + 20: 0ff7f793 zext.b a5,a5 + 24: 4725 li a4,9 + 26: 00f77e63 bgeu a4,a5,42 <main+0x42> + fprintf(2,"Usage:%s mask command\n",argv[0]); + 2a: 00093603 ld a2,0(s2) + 2e: 00001597 auipc a1,0x1 + 32: 8a258593 addi a1,a1,-1886 # 8d0 <malloc+0xec> + 36: 4509 li a0,2 + 38: 6ce000ef jal ra,706 <fprintf> + exit(1); + 3c: 4505 li a0,1 + 3e: 2ce000ef jal ra,30c <exit> + } + if(trace(atoi(argv[1]))<0) + 42: 1d4000ef jal ra,216 <atoi> + 46: 2501 sext.w a0,a0 + 48: 364000ef jal ra,3ac <trace> + 4c: 02054f63 bltz a0,8a <main+0x8a> + 50: 01090793 addi a5,s2,16 + 54: ee040713 addi a4,s0,-288 + 58: 34f5 addiw s1,s1,-3 + 5a: 02049693 slli a3,s1,0x20 + 5e: 01d6d493 srli s1,a3,0x1d + 62: 94be add s1,s1,a5 + 64: 10090593 addi a1,s2,256 + fprintf(2,"%s: trace failed\n",argv[0]); + exit(1); + } + for(i=2;i<argc&&i<MAXARG;i++) + { + nargv[i-2]=argv[i]; + 68: 6394 ld a3,0(a5) + 6a: e314 sd a3,0(a4) + for(i=2;i<argc&&i<MAXARG;i++) + 6c: 00978663 beq a5,s1,78 <main+0x78> + 70: 07a1 addi a5,a5,8 + 72: 0721 addi a4,a4,8 + 74: feb79ae3 bne a5,a1,68 <main+0x68> + } + exec(nargv[0],nargv); + 78: ee040593 addi a1,s0,-288 + 7c: ee043503 ld a0,-288(s0) + 80: 2c4000ef jal ra,344 <exec> + exit(0); + 84: 4501 li a0,0 + 86: 286000ef jal ra,30c <exit> + fprintf(2,"%s: trace failed\n",argv[0]); + 8a: 00093603 ld a2,0(s2) + 8e: 00001597 auipc a1,0x1 + 92: 85a58593 addi a1,a1,-1958 # 8e8 <malloc+0x104> + 96: 4509 li a0,2 + 98: 66e000ef jal ra,706 <fprintf> + exit(1); + 9c: 4505 li a0,1 + 9e: 26e000ef jal ra,30c <exit> + +00000000000000a2 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + a2: 1141 addi sp,sp,-16 + a4: e406 sd ra,8(sp) + a6: e022 sd s0,0(sp) + a8: 0800 addi s0,sp,16 + extern int main(); + main(); + aa: f57ff0ef jal ra,0 <main> + exit(0); + ae: 4501 li a0,0 + b0: 25c000ef jal ra,30c <exit> + +00000000000000b4 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + b4: 1141 addi sp,sp,-16 + b6: e422 sd s0,8(sp) + b8: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + ba: 87aa mv a5,a0 + bc: 0585 addi a1,a1,1 + be: 0785 addi a5,a5,1 + c0: fff5c703 lbu a4,-1(a1) + c4: fee78fa3 sb a4,-1(a5) + c8: fb75 bnez a4,bc <strcpy+0x8> + ; + return os; +} + ca: 6422 ld s0,8(sp) + cc: 0141 addi sp,sp,16 + ce: 8082 ret + +00000000000000d0 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + d0: 1141 addi sp,sp,-16 + d2: e422 sd s0,8(sp) + d4: 0800 addi s0,sp,16 + while(*p && *p == *q) + d6: 00054783 lbu a5,0(a0) + da: cb91 beqz a5,ee <strcmp+0x1e> + dc: 0005c703 lbu a4,0(a1) + e0: 00f71763 bne a4,a5,ee <strcmp+0x1e> + p++, q++; + e4: 0505 addi a0,a0,1 + e6: 0585 addi a1,a1,1 + while(*p && *p == *q) + e8: 00054783 lbu a5,0(a0) + ec: fbe5 bnez a5,dc <strcmp+0xc> + return (uchar)*p - (uchar)*q; + ee: 0005c503 lbu a0,0(a1) +} + f2: 40a7853b subw a0,a5,a0 + f6: 6422 ld s0,8(sp) + f8: 0141 addi sp,sp,16 + fa: 8082 ret + +00000000000000fc <strlen>: + +uint +strlen(const char *s) +{ + fc: 1141 addi sp,sp,-16 + fe: e422 sd s0,8(sp) + 100: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 102: 00054783 lbu a5,0(a0) + 106: cf91 beqz a5,122 <strlen+0x26> + 108: 0505 addi a0,a0,1 + 10a: 87aa mv a5,a0 + 10c: 4685 li a3,1 + 10e: 9e89 subw a3,a3,a0 + 110: 00f6853b addw a0,a3,a5 + 114: 0785 addi a5,a5,1 + 116: fff7c703 lbu a4,-1(a5) + 11a: fb7d bnez a4,110 <strlen+0x14> + ; + return n; +} + 11c: 6422 ld s0,8(sp) + 11e: 0141 addi sp,sp,16 + 120: 8082 ret + for(n = 0; s[n]; n++) + 122: 4501 li a0,0 + 124: bfe5 j 11c <strlen+0x20> + +0000000000000126 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 126: 1141 addi sp,sp,-16 + 128: e422 sd s0,8(sp) + 12a: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 12c: ca19 beqz a2,142 <memset+0x1c> + 12e: 87aa mv a5,a0 + 130: 1602 slli a2,a2,0x20 + 132: 9201 srli a2,a2,0x20 + 134: 00a60733 add a4,a2,a0 + cdst[i] = c; + 138: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 13c: 0785 addi a5,a5,1 + 13e: fee79de3 bne a5,a4,138 <memset+0x12> + } + return dst; +} + 142: 6422 ld s0,8(sp) + 144: 0141 addi sp,sp,16 + 146: 8082 ret + +0000000000000148 <strchr>: + +char* +strchr(const char *s, char c) +{ + 148: 1141 addi sp,sp,-16 + 14a: e422 sd s0,8(sp) + 14c: 0800 addi s0,sp,16 + for(; *s; s++) + 14e: 00054783 lbu a5,0(a0) + 152: cb99 beqz a5,168 <strchr+0x20> + if(*s == c) + 154: 00f58763 beq a1,a5,162 <strchr+0x1a> + for(; *s; s++) + 158: 0505 addi a0,a0,1 + 15a: 00054783 lbu a5,0(a0) + 15e: fbfd bnez a5,154 <strchr+0xc> + return (char*)s; + return 0; + 160: 4501 li a0,0 +} + 162: 6422 ld s0,8(sp) + 164: 0141 addi sp,sp,16 + 166: 8082 ret + return 0; + 168: 4501 li a0,0 + 16a: bfe5 j 162 <strchr+0x1a> + +000000000000016c <gets>: + +char* +gets(char *buf, int max) +{ + 16c: 711d addi sp,sp,-96 + 16e: ec86 sd ra,88(sp) + 170: e8a2 sd s0,80(sp) + 172: e4a6 sd s1,72(sp) + 174: e0ca sd s2,64(sp) + 176: fc4e sd s3,56(sp) + 178: f852 sd s4,48(sp) + 17a: f456 sd s5,40(sp) + 17c: f05a sd s6,32(sp) + 17e: ec5e sd s7,24(sp) + 180: 1080 addi s0,sp,96 + 182: 8baa mv s7,a0 + 184: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 186: 892a mv s2,a0 + 188: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 18a: 4aa9 li s5,10 + 18c: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 18e: 89a6 mv s3,s1 + 190: 2485 addiw s1,s1,1 + 192: 0344d663 bge s1,s4,1be <gets+0x52> + cc = read(0, &c, 1); + 196: 4605 li a2,1 + 198: faf40593 addi a1,s0,-81 + 19c: 4501 li a0,0 + 19e: 186000ef jal ra,324 <read> + if(cc < 1) + 1a2: 00a05e63 blez a0,1be <gets+0x52> + buf[i++] = c; + 1a6: faf44783 lbu a5,-81(s0) + 1aa: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1ae: 01578763 beq a5,s5,1bc <gets+0x50> + 1b2: 0905 addi s2,s2,1 + 1b4: fd679de3 bne a5,s6,18e <gets+0x22> + for(i=0; i+1 < max; ){ + 1b8: 89a6 mv s3,s1 + 1ba: a011 j 1be <gets+0x52> + 1bc: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1be: 99de add s3,s3,s7 + 1c0: 00098023 sb zero,0(s3) + return buf; +} + 1c4: 855e mv a0,s7 + 1c6: 60e6 ld ra,88(sp) + 1c8: 6446 ld s0,80(sp) + 1ca: 64a6 ld s1,72(sp) + 1cc: 6906 ld s2,64(sp) + 1ce: 79e2 ld s3,56(sp) + 1d0: 7a42 ld s4,48(sp) + 1d2: 7aa2 ld s5,40(sp) + 1d4: 7b02 ld s6,32(sp) + 1d6: 6be2 ld s7,24(sp) + 1d8: 6125 addi sp,sp,96 + 1da: 8082 ret + +00000000000001dc <stat>: + +int +stat(const char *n, struct stat *st) +{ + 1dc: 1101 addi sp,sp,-32 + 1de: ec06 sd ra,24(sp) + 1e0: e822 sd s0,16(sp) + 1e2: e426 sd s1,8(sp) + 1e4: e04a sd s2,0(sp) + 1e6: 1000 addi s0,sp,32 + 1e8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1ea: 4581 li a1,0 + 1ec: 160000ef jal ra,34c <open> + if(fd < 0) + 1f0: 02054163 bltz a0,212 <stat+0x36> + 1f4: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1f6: 85ca mv a1,s2 + 1f8: 16c000ef jal ra,364 <fstat> + 1fc: 892a mv s2,a0 + close(fd); + 1fe: 8526 mv a0,s1 + 200: 134000ef jal ra,334 <close> + return r; +} + 204: 854a mv a0,s2 + 206: 60e2 ld ra,24(sp) + 208: 6442 ld s0,16(sp) + 20a: 64a2 ld s1,8(sp) + 20c: 6902 ld s2,0(sp) + 20e: 6105 addi sp,sp,32 + 210: 8082 ret + return -1; + 212: 597d li s2,-1 + 214: bfc5 j 204 <stat+0x28> + +0000000000000216 <atoi>: + +int +atoi(const char *s) +{ + 216: 1141 addi sp,sp,-16 + 218: e422 sd s0,8(sp) + 21a: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 21c: 00054683 lbu a3,0(a0) + 220: fd06879b addiw a5,a3,-48 + 224: 0ff7f793 zext.b a5,a5 + 228: 4625 li a2,9 + 22a: 02f66863 bltu a2,a5,25a <atoi+0x44> + 22e: 872a mv a4,a0 + n = 0; + 230: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 232: 0705 addi a4,a4,1 + 234: 0025179b slliw a5,a0,0x2 + 238: 9fa9 addw a5,a5,a0 + 23a: 0017979b slliw a5,a5,0x1 + 23e: 9fb5 addw a5,a5,a3 + 240: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 244: 00074683 lbu a3,0(a4) + 248: fd06879b addiw a5,a3,-48 + 24c: 0ff7f793 zext.b a5,a5 + 250: fef671e3 bgeu a2,a5,232 <atoi+0x1c> + return n; +} + 254: 6422 ld s0,8(sp) + 256: 0141 addi sp,sp,16 + 258: 8082 ret + n = 0; + 25a: 4501 li a0,0 + 25c: bfe5 j 254 <atoi+0x3e> + +000000000000025e <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 25e: 1141 addi sp,sp,-16 + 260: e422 sd s0,8(sp) + 262: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 264: 02b57463 bgeu a0,a1,28c <memmove+0x2e> + while(n-- > 0) + 268: 00c05f63 blez a2,286 <memmove+0x28> + 26c: 1602 slli a2,a2,0x20 + 26e: 9201 srli a2,a2,0x20 + 270: 00c507b3 add a5,a0,a2 + dst = vdst; + 274: 872a mv a4,a0 + *dst++ = *src++; + 276: 0585 addi a1,a1,1 + 278: 0705 addi a4,a4,1 + 27a: fff5c683 lbu a3,-1(a1) + 27e: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 282: fee79ae3 bne a5,a4,276 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 286: 6422 ld s0,8(sp) + 288: 0141 addi sp,sp,16 + 28a: 8082 ret + dst += n; + 28c: 00c50733 add a4,a0,a2 + src += n; + 290: 95b2 add a1,a1,a2 + while(n-- > 0) + 292: fec05ae3 blez a2,286 <memmove+0x28> + 296: fff6079b addiw a5,a2,-1 + 29a: 1782 slli a5,a5,0x20 + 29c: 9381 srli a5,a5,0x20 + 29e: fff7c793 not a5,a5 + 2a2: 97ba add a5,a5,a4 + *--dst = *--src; + 2a4: 15fd addi a1,a1,-1 + 2a6: 177d addi a4,a4,-1 + 2a8: 0005c683 lbu a3,0(a1) + 2ac: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2b0: fee79ae3 bne a5,a4,2a4 <memmove+0x46> + 2b4: bfc9 j 286 <memmove+0x28> + +00000000000002b6 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2b6: 1141 addi sp,sp,-16 + 2b8: e422 sd s0,8(sp) + 2ba: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2bc: ca05 beqz a2,2ec <memcmp+0x36> + 2be: fff6069b addiw a3,a2,-1 + 2c2: 1682 slli a3,a3,0x20 + 2c4: 9281 srli a3,a3,0x20 + 2c6: 0685 addi a3,a3,1 + 2c8: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2ca: 00054783 lbu a5,0(a0) + 2ce: 0005c703 lbu a4,0(a1) + 2d2: 00e79863 bne a5,a4,2e2 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 2d6: 0505 addi a0,a0,1 + p2++; + 2d8: 0585 addi a1,a1,1 + while (n-- > 0) { + 2da: fed518e3 bne a0,a3,2ca <memcmp+0x14> + } + return 0; + 2de: 4501 li a0,0 + 2e0: a019 j 2e6 <memcmp+0x30> + return *p1 - *p2; + 2e2: 40e7853b subw a0,a5,a4 +} + 2e6: 6422 ld s0,8(sp) + 2e8: 0141 addi sp,sp,16 + 2ea: 8082 ret + return 0; + 2ec: 4501 li a0,0 + 2ee: bfe5 j 2e6 <memcmp+0x30> + +00000000000002f0 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2f0: 1141 addi sp,sp,-16 + 2f2: e406 sd ra,8(sp) + 2f4: e022 sd s0,0(sp) + 2f6: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2f8: f67ff0ef jal ra,25e <memmove> +} + 2fc: 60a2 ld ra,8(sp) + 2fe: 6402 ld s0,0(sp) + 300: 0141 addi sp,sp,16 + 302: 8082 ret + +0000000000000304 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 304: 4885 li a7,1 + ecall + 306: 00000073 ecall + ret + 30a: 8082 ret + +000000000000030c <exit>: +.global exit +exit: + li a7, SYS_exit + 30c: 4889 li a7,2 + ecall + 30e: 00000073 ecall + ret + 312: 8082 ret + +0000000000000314 <wait>: +.global wait +wait: + li a7, SYS_wait + 314: 488d li a7,3 + ecall + 316: 00000073 ecall + ret + 31a: 8082 ret + +000000000000031c <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 31c: 4891 li a7,4 + ecall + 31e: 00000073 ecall + ret + 322: 8082 ret + +0000000000000324 <read>: +.global read +read: + li a7, SYS_read + 324: 4895 li a7,5 + ecall + 326: 00000073 ecall + ret + 32a: 8082 ret + +000000000000032c <write>: +.global write +write: + li a7, SYS_write + 32c: 48c1 li a7,16 + ecall + 32e: 00000073 ecall + ret + 332: 8082 ret + +0000000000000334 <close>: +.global close +close: + li a7, SYS_close + 334: 48d5 li a7,21 + ecall + 336: 00000073 ecall + ret + 33a: 8082 ret + +000000000000033c <kill>: +.global kill +kill: + li a7, SYS_kill + 33c: 4899 li a7,6 + ecall + 33e: 00000073 ecall + ret + 342: 8082 ret + +0000000000000344 <exec>: +.global exec +exec: + li a7, SYS_exec + 344: 489d li a7,7 + ecall + 346: 00000073 ecall + ret + 34a: 8082 ret + +000000000000034c <open>: +.global open +open: + li a7, SYS_open + 34c: 48bd li a7,15 + ecall + 34e: 00000073 ecall + ret + 352: 8082 ret + +0000000000000354 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 354: 48c5 li a7,17 + ecall + 356: 00000073 ecall + ret + 35a: 8082 ret + +000000000000035c <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 35c: 48c9 li a7,18 + ecall + 35e: 00000073 ecall + ret + 362: 8082 ret + +0000000000000364 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 364: 48a1 li a7,8 + ecall + 366: 00000073 ecall + ret + 36a: 8082 ret + +000000000000036c <link>: +.global link +link: + li a7, SYS_link + 36c: 48cd li a7,19 + ecall + 36e: 00000073 ecall + ret + 372: 8082 ret + +0000000000000374 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 374: 48d1 li a7,20 + ecall + 376: 00000073 ecall + ret + 37a: 8082 ret + +000000000000037c <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 37c: 48a5 li a7,9 + ecall + 37e: 00000073 ecall + ret + 382: 8082 ret + +0000000000000384 <dup>: +.global dup +dup: + li a7, SYS_dup + 384: 48a9 li a7,10 + ecall + 386: 00000073 ecall + ret + 38a: 8082 ret + +000000000000038c <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 38c: 48ad li a7,11 + ecall + 38e: 00000073 ecall + ret + 392: 8082 ret + +0000000000000394 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 394: 48b1 li a7,12 + ecall + 396: 00000073 ecall + ret + 39a: 8082 ret + +000000000000039c <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 39c: 48b5 li a7,13 + ecall + 39e: 00000073 ecall + ret + 3a2: 8082 ret + +00000000000003a4 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 3a4: 48b9 li a7,14 + ecall + 3a6: 00000073 ecall + ret + 3aa: 8082 ret + +00000000000003ac <trace>: +.global trace +trace: + li a7, SYS_trace + 3ac: 48d9 li a7,22 + ecall + 3ae: 00000073 ecall + ret + 3b2: 8082 ret + +00000000000003b4 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 3b4: 48dd li a7,23 + ecall + 3b6: 00000073 ecall + ret + 3ba: 8082 ret + +00000000000003bc <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 3bc: 48e1 li a7,24 + ecall + 3be: 00000073 ecall + ret + 3c2: 8082 ret + +00000000000003c4 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3c4: 1101 addi sp,sp,-32 + 3c6: ec06 sd ra,24(sp) + 3c8: e822 sd s0,16(sp) + 3ca: 1000 addi s0,sp,32 + 3cc: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3d0: 4605 li a2,1 + 3d2: fef40593 addi a1,s0,-17 + 3d6: f57ff0ef jal ra,32c <write> +} + 3da: 60e2 ld ra,24(sp) + 3dc: 6442 ld s0,16(sp) + 3de: 6105 addi sp,sp,32 + 3e0: 8082 ret + +00000000000003e2 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 3e2: 7139 addi sp,sp,-64 + 3e4: fc06 sd ra,56(sp) + 3e6: f822 sd s0,48(sp) + 3e8: f426 sd s1,40(sp) + 3ea: f04a sd s2,32(sp) + 3ec: ec4e sd s3,24(sp) + 3ee: 0080 addi s0,sp,64 + 3f0: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 3f2: c299 beqz a3,3f8 <printint+0x16> + 3f4: 0805c763 bltz a1,482 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 3f8: 2581 sext.w a1,a1 + neg = 0; + 3fa: 4881 li a7,0 + 3fc: fc040693 addi a3,s0,-64 + } + + i = 0; + 400: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 402: 2601 sext.w a2,a2 + 404: 00000517 auipc a0,0x0 + 408: 50450513 addi a0,a0,1284 # 908 <digits> + 40c: 883a mv a6,a4 + 40e: 2705 addiw a4,a4,1 + 410: 02c5f7bb remuw a5,a1,a2 + 414: 1782 slli a5,a5,0x20 + 416: 9381 srli a5,a5,0x20 + 418: 97aa add a5,a5,a0 + 41a: 0007c783 lbu a5,0(a5) + 41e: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 422: 0005879b sext.w a5,a1 + 426: 02c5d5bb divuw a1,a1,a2 + 42a: 0685 addi a3,a3,1 + 42c: fec7f0e3 bgeu a5,a2,40c <printint+0x2a> + if(neg) + 430: 00088c63 beqz a7,448 <printint+0x66> + buf[i++] = '-'; + 434: fd070793 addi a5,a4,-48 + 438: 00878733 add a4,a5,s0 + 43c: 02d00793 li a5,45 + 440: fef70823 sb a5,-16(a4) + 444: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 448: 02e05663 blez a4,474 <printint+0x92> + 44c: fc040793 addi a5,s0,-64 + 450: 00e78933 add s2,a5,a4 + 454: fff78993 addi s3,a5,-1 + 458: 99ba add s3,s3,a4 + 45a: 377d addiw a4,a4,-1 + 45c: 1702 slli a4,a4,0x20 + 45e: 9301 srli a4,a4,0x20 + 460: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 464: fff94583 lbu a1,-1(s2) + 468: 8526 mv a0,s1 + 46a: f5bff0ef jal ra,3c4 <putc> + while(--i >= 0) + 46e: 197d addi s2,s2,-1 + 470: ff391ae3 bne s2,s3,464 <printint+0x82> +} + 474: 70e2 ld ra,56(sp) + 476: 7442 ld s0,48(sp) + 478: 74a2 ld s1,40(sp) + 47a: 7902 ld s2,32(sp) + 47c: 69e2 ld s3,24(sp) + 47e: 6121 addi sp,sp,64 + 480: 8082 ret + x = -xx; + 482: 40b005bb negw a1,a1 + neg = 1; + 486: 4885 li a7,1 + x = -xx; + 488: bf95 j 3fc <printint+0x1a> + +000000000000048a <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 48a: 7119 addi sp,sp,-128 + 48c: fc86 sd ra,120(sp) + 48e: f8a2 sd s0,112(sp) + 490: f4a6 sd s1,104(sp) + 492: f0ca sd s2,96(sp) + 494: ecce sd s3,88(sp) + 496: e8d2 sd s4,80(sp) + 498: e4d6 sd s5,72(sp) + 49a: e0da sd s6,64(sp) + 49c: fc5e sd s7,56(sp) + 49e: f862 sd s8,48(sp) + 4a0: f466 sd s9,40(sp) + 4a2: f06a sd s10,32(sp) + 4a4: ec6e sd s11,24(sp) + 4a6: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4a8: 0005c903 lbu s2,0(a1) + 4ac: 22090e63 beqz s2,6e8 <vprintf+0x25e> + 4b0: 8b2a mv s6,a0 + 4b2: 8a2e mv s4,a1 + 4b4: 8bb2 mv s7,a2 + state = 0; + 4b6: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4b8: 4481 li s1,0 + 4ba: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4bc: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4c0: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4c4: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4c8: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 4cc: 00000c97 auipc s9,0x0 + 4d0: 43cc8c93 addi s9,s9,1084 # 908 <digits> + 4d4: a005 j 4f4 <vprintf+0x6a> + putc(fd, c0); + 4d6: 85ca mv a1,s2 + 4d8: 855a mv a0,s6 + 4da: eebff0ef jal ra,3c4 <putc> + 4de: a019 j 4e4 <vprintf+0x5a> + } else if(state == '%'){ + 4e0: 03598263 beq s3,s5,504 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4e4: 2485 addiw s1,s1,1 + 4e6: 8726 mv a4,s1 + 4e8: 009a07b3 add a5,s4,s1 + 4ec: 0007c903 lbu s2,0(a5) + 4f0: 1e090c63 beqz s2,6e8 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4f4: 0009079b sext.w a5,s2 + if(state == 0){ + 4f8: fe0994e3 bnez s3,4e0 <vprintf+0x56> + if(c0 == '%'){ + 4fc: fd579de3 bne a5,s5,4d6 <vprintf+0x4c> + state = '%'; + 500: 89be mv s3,a5 + 502: b7cd j 4e4 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 504: cfa5 beqz a5,57c <vprintf+0xf2> + 506: 00ea06b3 add a3,s4,a4 + 50a: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 50e: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 510: c681 beqz a3,518 <vprintf+0x8e> + 512: 9752 add a4,a4,s4 + 514: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 518: 03878a63 beq a5,s8,54c <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 51c: 05a78463 beq a5,s10,564 <vprintf+0xda> + } else if(c0 == 'u'){ + 520: 0db78763 beq a5,s11,5ee <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 524: 07800713 li a4,120 + 528: 10e78963 beq a5,a4,63a <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 52c: 07000713 li a4,112 + 530: 12e78e63 beq a5,a4,66c <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 534: 07300713 li a4,115 + 538: 16e78b63 beq a5,a4,6ae <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 53c: 05579063 bne a5,s5,57c <vprintf+0xf2> + putc(fd, '%'); + 540: 85d6 mv a1,s5 + 542: 855a mv a0,s6 + 544: e81ff0ef jal ra,3c4 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 548: 4981 li s3,0 + 54a: bf69 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 54c: 008b8913 addi s2,s7,8 + 550: 4685 li a3,1 + 552: 4629 li a2,10 + 554: 000ba583 lw a1,0(s7) + 558: 855a mv a0,s6 + 55a: e89ff0ef jal ra,3e2 <printint> + 55e: 8bca mv s7,s2 + state = 0; + 560: 4981 li s3,0 + 562: b749 j 4e4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 564: 03868663 beq a3,s8,590 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 568: 05a68163 beq a3,s10,5aa <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 56c: 09b68d63 beq a3,s11,606 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 570: 03a68f63 beq a3,s10,5ae <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 574: 07800793 li a5,120 + 578: 0cf68d63 beq a3,a5,652 <vprintf+0x1c8> + putc(fd, '%'); + 57c: 85d6 mv a1,s5 + 57e: 855a mv a0,s6 + 580: e45ff0ef jal ra,3c4 <putc> + putc(fd, c0); + 584: 85ca mv a1,s2 + 586: 855a mv a0,s6 + 588: e3dff0ef jal ra,3c4 <putc> + state = 0; + 58c: 4981 li s3,0 + 58e: bf99 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 590: 008b8913 addi s2,s7,8 + 594: 4685 li a3,1 + 596: 4629 li a2,10 + 598: 000ba583 lw a1,0(s7) + 59c: 855a mv a0,s6 + 59e: e45ff0ef jal ra,3e2 <printint> + i += 1; + 5a2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5a4: 8bca mv s7,s2 + state = 0; + 5a6: 4981 li s3,0 + i += 1; + 5a8: bf35 j 4e4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5aa: 03860563 beq a2,s8,5d4 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5ae: 07b60963 beq a2,s11,620 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5b2: 07800793 li a5,120 + 5b6: fcf613e3 bne a2,a5,57c <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 5ba: 008b8913 addi s2,s7,8 + 5be: 4681 li a3,0 + 5c0: 4641 li a2,16 + 5c2: 000ba583 lw a1,0(s7) + 5c6: 855a mv a0,s6 + 5c8: e1bff0ef jal ra,3e2 <printint> + i += 2; + 5cc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ce: 8bca mv s7,s2 + state = 0; + 5d0: 4981 li s3,0 + i += 2; + 5d2: bf09 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 5d4: 008b8913 addi s2,s7,8 + 5d8: 4685 li a3,1 + 5da: 4629 li a2,10 + 5dc: 000ba583 lw a1,0(s7) + 5e0: 855a mv a0,s6 + 5e2: e01ff0ef jal ra,3e2 <printint> + i += 2; + 5e6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5e8: 8bca mv s7,s2 + state = 0; + 5ea: 4981 li s3,0 + i += 2; + 5ec: bde5 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 5ee: 008b8913 addi s2,s7,8 + 5f2: 4681 li a3,0 + 5f4: 4629 li a2,10 + 5f6: 000ba583 lw a1,0(s7) + 5fa: 855a mv a0,s6 + 5fc: de7ff0ef jal ra,3e2 <printint> + 600: 8bca mv s7,s2 + state = 0; + 602: 4981 li s3,0 + 604: b5c5 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 606: 008b8913 addi s2,s7,8 + 60a: 4681 li a3,0 + 60c: 4629 li a2,10 + 60e: 000ba583 lw a1,0(s7) + 612: 855a mv a0,s6 + 614: dcfff0ef jal ra,3e2 <printint> + i += 1; + 618: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 61a: 8bca mv s7,s2 + state = 0; + 61c: 4981 li s3,0 + i += 1; + 61e: b5d9 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4629 li a2,10 + 628: 000ba583 lw a1,0(s7) + 62c: 855a mv a0,s6 + 62e: db5ff0ef jal ra,3e2 <printint> + i += 2; + 632: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 634: 8bca mv s7,s2 + state = 0; + 636: 4981 li s3,0 + i += 2; + 638: b575 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 63a: 008b8913 addi s2,s7,8 + 63e: 4681 li a3,0 + 640: 4641 li a2,16 + 642: 000ba583 lw a1,0(s7) + 646: 855a mv a0,s6 + 648: d9bff0ef jal ra,3e2 <printint> + 64c: 8bca mv s7,s2 + state = 0; + 64e: 4981 li s3,0 + 650: bd51 j 4e4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 652: 008b8913 addi s2,s7,8 + 656: 4681 li a3,0 + 658: 4641 li a2,16 + 65a: 000ba583 lw a1,0(s7) + 65e: 855a mv a0,s6 + 660: d83ff0ef jal ra,3e2 <printint> + i += 1; + 664: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 666: 8bca mv s7,s2 + state = 0; + 668: 4981 li s3,0 + i += 1; + 66a: bdad j 4e4 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 66c: 008b8793 addi a5,s7,8 + 670: f8f43423 sd a5,-120(s0) + 674: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 678: 03000593 li a1,48 + 67c: 855a mv a0,s6 + 67e: d47ff0ef jal ra,3c4 <putc> + putc(fd, 'x'); + 682: 07800593 li a1,120 + 686: 855a mv a0,s6 + 688: d3dff0ef jal ra,3c4 <putc> + 68c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 68e: 03c9d793 srli a5,s3,0x3c + 692: 97e6 add a5,a5,s9 + 694: 0007c583 lbu a1,0(a5) + 698: 855a mv a0,s6 + 69a: d2bff0ef jal ra,3c4 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 69e: 0992 slli s3,s3,0x4 + 6a0: 397d addiw s2,s2,-1 + 6a2: fe0916e3 bnez s2,68e <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 6a6: f8843b83 ld s7,-120(s0) + state = 0; + 6aa: 4981 li s3,0 + 6ac: bd25 j 4e4 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 6ae: 008b8993 addi s3,s7,8 + 6b2: 000bb903 ld s2,0(s7) + 6b6: 00090f63 beqz s2,6d4 <vprintf+0x24a> + for(; *s; s++) + 6ba: 00094583 lbu a1,0(s2) + 6be: c195 beqz a1,6e2 <vprintf+0x258> + putc(fd, *s); + 6c0: 855a mv a0,s6 + 6c2: d03ff0ef jal ra,3c4 <putc> + for(; *s; s++) + 6c6: 0905 addi s2,s2,1 + 6c8: 00094583 lbu a1,0(s2) + 6cc: f9f5 bnez a1,6c0 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6ce: 8bce mv s7,s3 + state = 0; + 6d0: 4981 li s3,0 + 6d2: bd09 j 4e4 <vprintf+0x5a> + s = "(null)"; + 6d4: 00000917 auipc s2,0x0 + 6d8: 22c90913 addi s2,s2,556 # 900 <malloc+0x11c> + for(; *s; s++) + 6dc: 02800593 li a1,40 + 6e0: b7c5 j 6c0 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 6e2: 8bce mv s7,s3 + state = 0; + 6e4: 4981 li s3,0 + 6e6: bbfd j 4e4 <vprintf+0x5a> + } + } +} + 6e8: 70e6 ld ra,120(sp) + 6ea: 7446 ld s0,112(sp) + 6ec: 74a6 ld s1,104(sp) + 6ee: 7906 ld s2,96(sp) + 6f0: 69e6 ld s3,88(sp) + 6f2: 6a46 ld s4,80(sp) + 6f4: 6aa6 ld s5,72(sp) + 6f6: 6b06 ld s6,64(sp) + 6f8: 7be2 ld s7,56(sp) + 6fa: 7c42 ld s8,48(sp) + 6fc: 7ca2 ld s9,40(sp) + 6fe: 7d02 ld s10,32(sp) + 700: 6de2 ld s11,24(sp) + 702: 6109 addi sp,sp,128 + 704: 8082 ret + +0000000000000706 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 706: 715d addi sp,sp,-80 + 708: ec06 sd ra,24(sp) + 70a: e822 sd s0,16(sp) + 70c: 1000 addi s0,sp,32 + 70e: e010 sd a2,0(s0) + 710: e414 sd a3,8(s0) + 712: e818 sd a4,16(s0) + 714: ec1c sd a5,24(s0) + 716: 03043023 sd a6,32(s0) + 71a: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 71e: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 722: 8622 mv a2,s0 + 724: d67ff0ef jal ra,48a <vprintf> +} + 728: 60e2 ld ra,24(sp) + 72a: 6442 ld s0,16(sp) + 72c: 6161 addi sp,sp,80 + 72e: 8082 ret + +0000000000000730 <printf>: + +void +printf(const char *fmt, ...) +{ + 730: 711d addi sp,sp,-96 + 732: ec06 sd ra,24(sp) + 734: e822 sd s0,16(sp) + 736: 1000 addi s0,sp,32 + 738: e40c sd a1,8(s0) + 73a: e810 sd a2,16(s0) + 73c: ec14 sd a3,24(s0) + 73e: f018 sd a4,32(s0) + 740: f41c sd a5,40(s0) + 742: 03043823 sd a6,48(s0) + 746: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 74a: 00840613 addi a2,s0,8 + 74e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 752: 85aa mv a1,a0 + 754: 4505 li a0,1 + 756: d35ff0ef jal ra,48a <vprintf> +} + 75a: 60e2 ld ra,24(sp) + 75c: 6442 ld s0,16(sp) + 75e: 6125 addi sp,sp,96 + 760: 8082 ret + +0000000000000762 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 762: 1141 addi sp,sp,-16 + 764: e422 sd s0,8(sp) + 766: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 768: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 76c: 00001797 auipc a5,0x1 + 770: 8947b783 ld a5,-1900(a5) # 1000 <freep> + 774: a02d j 79e <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 776: 4618 lw a4,8(a2) + 778: 9f2d addw a4,a4,a1 + 77a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 77e: 6398 ld a4,0(a5) + 780: 6310 ld a2,0(a4) + 782: a83d j 7c0 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 784: ff852703 lw a4,-8(a0) + 788: 9f31 addw a4,a4,a2 + 78a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 78c: ff053683 ld a3,-16(a0) + 790: a091 j 7d4 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 792: 6398 ld a4,0(a5) + 794: 00e7e463 bltu a5,a4,79c <free+0x3a> + 798: 00e6ea63 bltu a3,a4,7ac <free+0x4a> +{ + 79c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 79e: fed7fae3 bgeu a5,a3,792 <free+0x30> + 7a2: 6398 ld a4,0(a5) + 7a4: 00e6e463 bltu a3,a4,7ac <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7a8: fee7eae3 bltu a5,a4,79c <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 7ac: ff852583 lw a1,-8(a0) + 7b0: 6390 ld a2,0(a5) + 7b2: 02059813 slli a6,a1,0x20 + 7b6: 01c85713 srli a4,a6,0x1c + 7ba: 9736 add a4,a4,a3 + 7bc: fae60de3 beq a2,a4,776 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 7c0: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7c4: 4790 lw a2,8(a5) + 7c6: 02061593 slli a1,a2,0x20 + 7ca: 01c5d713 srli a4,a1,0x1c + 7ce: 973e add a4,a4,a5 + 7d0: fae68ae3 beq a3,a4,784 <free+0x22> + p->s.ptr = bp->s.ptr; + 7d4: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7d6: 00001717 auipc a4,0x1 + 7da: 82f73523 sd a5,-2006(a4) # 1000 <freep> +} + 7de: 6422 ld s0,8(sp) + 7e0: 0141 addi sp,sp,16 + 7e2: 8082 ret + +00000000000007e4 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 7e4: 7139 addi sp,sp,-64 + 7e6: fc06 sd ra,56(sp) + 7e8: f822 sd s0,48(sp) + 7ea: f426 sd s1,40(sp) + 7ec: f04a sd s2,32(sp) + 7ee: ec4e sd s3,24(sp) + 7f0: e852 sd s4,16(sp) + 7f2: e456 sd s5,8(sp) + 7f4: e05a sd s6,0(sp) + 7f6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7f8: 02051493 slli s1,a0,0x20 + 7fc: 9081 srli s1,s1,0x20 + 7fe: 04bd addi s1,s1,15 + 800: 8091 srli s1,s1,0x4 + 802: 0014899b addiw s3,s1,1 + 806: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 808: 00000517 auipc a0,0x0 + 80c: 7f853503 ld a0,2040(a0) # 1000 <freep> + 810: c515 beqz a0,83c <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 812: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 814: 4798 lw a4,8(a5) + 816: 02977f63 bgeu a4,s1,854 <malloc+0x70> + 81a: 8a4e mv s4,s3 + 81c: 0009871b sext.w a4,s3 + 820: 6685 lui a3,0x1 + 822: 00d77363 bgeu a4,a3,828 <malloc+0x44> + 826: 6a05 lui s4,0x1 + 828: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 82c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 830: 00000917 auipc s2,0x0 + 834: 7d090913 addi s2,s2,2000 # 1000 <freep> + if(p == (char*)-1) + 838: 5afd li s5,-1 + 83a: a885 j 8aa <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 83c: 00000797 auipc a5,0x0 + 840: 7d478793 addi a5,a5,2004 # 1010 <base> + 844: 00000717 auipc a4,0x0 + 848: 7af73e23 sd a5,1980(a4) # 1000 <freep> + 84c: e39c sd a5,0(a5) + base.s.size = 0; + 84e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 852: b7e1 j 81a <malloc+0x36> + if(p->s.size == nunits) + 854: 02e48c63 beq s1,a4,88c <malloc+0xa8> + p->s.size -= nunits; + 858: 4137073b subw a4,a4,s3 + 85c: c798 sw a4,8(a5) + p += p->s.size; + 85e: 02071693 slli a3,a4,0x20 + 862: 01c6d713 srli a4,a3,0x1c + 866: 97ba add a5,a5,a4 + p->s.size = nunits; + 868: 0137a423 sw s3,8(a5) + freep = prevp; + 86c: 00000717 auipc a4,0x0 + 870: 78a73a23 sd a0,1940(a4) # 1000 <freep> + return (void*)(p + 1); + 874: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 878: 70e2 ld ra,56(sp) + 87a: 7442 ld s0,48(sp) + 87c: 74a2 ld s1,40(sp) + 87e: 7902 ld s2,32(sp) + 880: 69e2 ld s3,24(sp) + 882: 6a42 ld s4,16(sp) + 884: 6aa2 ld s5,8(sp) + 886: 6b02 ld s6,0(sp) + 888: 6121 addi sp,sp,64 + 88a: 8082 ret + prevp->s.ptr = p->s.ptr; + 88c: 6398 ld a4,0(a5) + 88e: e118 sd a4,0(a0) + 890: bff1 j 86c <malloc+0x88> + hp->s.size = nu; + 892: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 896: 0541 addi a0,a0,16 + 898: ecbff0ef jal ra,762 <free> + return freep; + 89c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8a0: dd61 beqz a0,878 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8a2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8a4: 4798 lw a4,8(a5) + 8a6: fa9777e3 bgeu a4,s1,854 <malloc+0x70> + if(p == freep) + 8aa: 00093703 ld a4,0(s2) + 8ae: 853e mv a0,a5 + 8b0: fef719e3 bne a4,a5,8a2 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 8b4: 8552 mv a0,s4 + 8b6: adfff0ef jal ra,394 <sbrk> + if(p == (char*)-1) + 8ba: fd551ce3 bne a0,s5,892 <malloc+0xae> + return 0; + 8be: 4501 li a0,0 + 8c0: bf65 j 878 <malloc+0x94> diff --git a/user/trace.d b/user/trace.d new file mode 100644 index 0000000000000000000000000000000000000000..e0b17928fa9959a8e0d26c4d08cebc9cc47bcb31 --- /dev/null +++ b/user/trace.d @@ -0,0 +1,2 @@ +user/trace.o: user/trace.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/param.h kernel/types.h kernel/stat.h user/user.h diff --git a/user/trace.o b/user/trace.o new file mode 100644 index 0000000000000000000000000000000000000000..7bdbb6cd109eb12d99bdbf6063ffd9f529364a88 Binary files /dev/null and b/user/trace.o differ diff --git a/user/trace.sym b/user/trace.sym new file mode 100644 index 0000000000000000000000000000000000000000..2ab3073f14e88b5ea836ce86d00dbdb85c36ca46 --- /dev/null +++ b/user/trace.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +00000000000008c8 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 trace.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003c4 putc +00000000000003e2 printint +0000000000000908 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +00000000000000b4 strcpy +0000000000000730 printf +000000000000025e memmove +0000000000000354 mknod +00000000000003ac trace +000000000000016c gets +000000000000038c getpid +00000000000002f0 memcpy +00000000000007e4 malloc +000000000000039c sleep +00000000000003b4 mycall +000000000000031c pipe +000000000000032c write +0000000000000364 fstat +0000000000000706 fprintf +000000000000033c kill +000000000000048a vprintf +000000000000037c chdir +0000000000000344 exec +0000000000000314 wait +0000000000000324 read +000000000000035c unlink +00000000000002b6 memcmp +0000000000000304 fork +0000000000000394 sbrk +00000000000003a4 uptime +0000000000000126 memset +0000000000000000 main +00000000000003bc GSCinfo +00000000000000d0 strcmp +0000000000000384 dup +00000000000001dc stat +000000000000036c link +000000000000030c exit +00000000000000a2 start +0000000000000216 atoi +00000000000000fc strlen +000000000000034c open +0000000000000148 strchr +0000000000000374 mkdir +0000000000000334 close +0000000000000762 free diff --git a/user/ulib.d b/user/ulib.d new file mode 100644 index 0000000000000000000000000000000000000000..ce80833fc6e5cf8a84df00e7eb1c8946c6d7007a --- /dev/null +++ b/user/ulib.d @@ -0,0 +1,2 @@ +user/ulib.o: user/ulib.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h kernel/fcntl.h user/user.h diff --git a/user/ulib.o b/user/ulib.o new file mode 100644 index 0000000000000000000000000000000000000000..81228618c1cf0089c8de3537331a6dad88174e5d Binary files /dev/null and b/user/ulib.o differ diff --git a/user/umalloc.d b/user/umalloc.d new file mode 100644 index 0000000000000000000000000000000000000000..9c4ac33ad8370d6b617ec4a0791c83491fb95c62 --- /dev/null +++ b/user/umalloc.d @@ -0,0 +1,3 @@ +user/umalloc.o: user/umalloc.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/types.h \ + kernel/stat.h user/user.h kernel/param.h diff --git a/user/umalloc.o b/user/umalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..4e917a3fb8ee7b47e5ebd57454e1f24c411209bc Binary files /dev/null and b/user/umalloc.o differ diff --git a/user/usertests.asm b/user/usertests.asm new file mode 100644 index 0000000000000000000000000000000000000000..200c407a9e224132bcaf0bc86fc23fa755516747 --- /dev/null +++ b/user/usertests.asm @@ -0,0 +1,9549 @@ + +user/_usertests: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <copyinstr1>: +} + +// what if you pass ridiculous string pointers to system calls? +void +copyinstr1(char *s) +{ + 0: 711d addi sp,sp,-96 + 2: ec86 sd ra,88(sp) + 4: e8a2 sd s0,80(sp) + 6: e4a6 sd s1,72(sp) + 8: e0ca sd s2,64(sp) + a: fc4e sd s3,56(sp) + c: 1080 addi s0,sp,96 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + e: 00007797 auipc a5,0x7 + 12: 37278793 addi a5,a5,882 # 7380 <malloc+0x2474> + 16: 638c ld a1,0(a5) + 18: 6790 ld a2,8(a5) + 1a: 6b94 ld a3,16(a5) + 1c: 6f98 ld a4,24(a5) + 1e: 739c ld a5,32(a5) + 20: fab43423 sd a1,-88(s0) + 24: fac43823 sd a2,-80(s0) + 28: fad43c23 sd a3,-72(s0) + 2c: fce43023 sd a4,-64(s0) + 30: fcf43423 sd a5,-56(s0) + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 34: fa840493 addi s1,s0,-88 + 38: fd040993 addi s3,s0,-48 + uint64 addr = addrs[ai]; + + int fd = open((char *)addr, O_CREATE|O_WRONLY); + 3c: 0004b903 ld s2,0(s1) + 40: 20100593 li a1,513 + 44: 854a mv a0,s2 + 46: 22f040ef jal ra,4a74 <open> + if(fd >= 0){ + 4a: 00055c63 bgez a0,62 <copyinstr1+0x62> + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4e: 04a1 addi s1,s1,8 + 50: ff3496e3 bne s1,s3,3c <copyinstr1+0x3c> + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + exit(1); + } + } +} + 54: 60e6 ld ra,88(sp) + 56: 6446 ld s0,80(sp) + 58: 64a6 ld s1,72(sp) + 5a: 6906 ld s2,64(sp) + 5c: 79e2 ld s3,56(sp) + 5e: 6125 addi sp,sp,96 + 60: 8082 ret + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + 62: 862a mv a2,a0 + 64: 85ca mv a1,s2 + 66: 00005517 auipc a0,0x5 + 6a: f8a50513 addi a0,a0,-118 # 4ff0 <malloc+0xe4> + 6e: 5eb040ef jal ra,4e58 <printf> + exit(1); + 72: 4505 li a0,1 + 74: 1c1040ef jal ra,4a34 <exit> + +0000000000000078 <bsstest>: +void +bsstest(char *s) +{ + int i; + + for(i = 0; i < sizeof(uninit); i++){ + 78: 00009797 auipc a5,0x9 + 7c: 4f078793 addi a5,a5,1264 # 9568 <uninit> + 80: 0000c697 auipc a3,0xc + 84: bf868693 addi a3,a3,-1032 # bc78 <buf> + if(uninit[i] != '\0'){ + 88: 0007c703 lbu a4,0(a5) + 8c: e709 bnez a4,96 <bsstest+0x1e> + for(i = 0; i < sizeof(uninit); i++){ + 8e: 0785 addi a5,a5,1 + 90: fed79ce3 bne a5,a3,88 <bsstest+0x10> + 94: 8082 ret +{ + 96: 1141 addi sp,sp,-16 + 98: e406 sd ra,8(sp) + 9a: e022 sd s0,0(sp) + 9c: 0800 addi s0,sp,16 + printf("%s: bss test failed\n", s); + 9e: 85aa mv a1,a0 + a0: 00005517 auipc a0,0x5 + a4: f7050513 addi a0,a0,-144 # 5010 <malloc+0x104> + a8: 5b1040ef jal ra,4e58 <printf> + exit(1); + ac: 4505 li a0,1 + ae: 187040ef jal ra,4a34 <exit> + +00000000000000b2 <opentest>: +{ + b2: 1101 addi sp,sp,-32 + b4: ec06 sd ra,24(sp) + b6: e822 sd s0,16(sp) + b8: e426 sd s1,8(sp) + ba: 1000 addi s0,sp,32 + bc: 84aa mv s1,a0 + fd = open("echo", 0); + be: 4581 li a1,0 + c0: 00005517 auipc a0,0x5 + c4: f6850513 addi a0,a0,-152 # 5028 <malloc+0x11c> + c8: 1ad040ef jal ra,4a74 <open> + if(fd < 0){ + cc: 02054263 bltz a0,f0 <opentest+0x3e> + close(fd); + d0: 18d040ef jal ra,4a5c <close> + fd = open("doesnotexist", 0); + d4: 4581 li a1,0 + d6: 00005517 auipc a0,0x5 + da: f7250513 addi a0,a0,-142 # 5048 <malloc+0x13c> + de: 197040ef jal ra,4a74 <open> + if(fd >= 0){ + e2: 02055163 bgez a0,104 <opentest+0x52> +} + e6: 60e2 ld ra,24(sp) + e8: 6442 ld s0,16(sp) + ea: 64a2 ld s1,8(sp) + ec: 6105 addi sp,sp,32 + ee: 8082 ret + printf("%s: open echo failed!\n", s); + f0: 85a6 mv a1,s1 + f2: 00005517 auipc a0,0x5 + f6: f3e50513 addi a0,a0,-194 # 5030 <malloc+0x124> + fa: 55f040ef jal ra,4e58 <printf> + exit(1); + fe: 4505 li a0,1 + 100: 135040ef jal ra,4a34 <exit> + printf("%s: open doesnotexist succeeded!\n", s); + 104: 85a6 mv a1,s1 + 106: 00005517 auipc a0,0x5 + 10a: f5250513 addi a0,a0,-174 # 5058 <malloc+0x14c> + 10e: 54b040ef jal ra,4e58 <printf> + exit(1); + 112: 4505 li a0,1 + 114: 121040ef jal ra,4a34 <exit> + +0000000000000118 <truncate2>: +{ + 118: 7179 addi sp,sp,-48 + 11a: f406 sd ra,40(sp) + 11c: f022 sd s0,32(sp) + 11e: ec26 sd s1,24(sp) + 120: e84a sd s2,16(sp) + 122: e44e sd s3,8(sp) + 124: 1800 addi s0,sp,48 + 126: 89aa mv s3,a0 + unlink("truncfile"); + 128: 00005517 auipc a0,0x5 + 12c: f5850513 addi a0,a0,-168 # 5080 <malloc+0x174> + 130: 155040ef jal ra,4a84 <unlink> + int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY); + 134: 60100593 li a1,1537 + 138: 00005517 auipc a0,0x5 + 13c: f4850513 addi a0,a0,-184 # 5080 <malloc+0x174> + 140: 135040ef jal ra,4a74 <open> + 144: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 146: 4611 li a2,4 + 148: 00005597 auipc a1,0x5 + 14c: f4858593 addi a1,a1,-184 # 5090 <malloc+0x184> + 150: 105040ef jal ra,4a54 <write> + int fd2 = open("truncfile", O_TRUNC|O_WRONLY); + 154: 40100593 li a1,1025 + 158: 00005517 auipc a0,0x5 + 15c: f2850513 addi a0,a0,-216 # 5080 <malloc+0x174> + 160: 115040ef jal ra,4a74 <open> + 164: 892a mv s2,a0 + int n = write(fd1, "x", 1); + 166: 4605 li a2,1 + 168: 00005597 auipc a1,0x5 + 16c: f3058593 addi a1,a1,-208 # 5098 <malloc+0x18c> + 170: 8526 mv a0,s1 + 172: 0e3040ef jal ra,4a54 <write> + if(n != -1){ + 176: 57fd li a5,-1 + 178: 02f51563 bne a0,a5,1a2 <truncate2+0x8a> + unlink("truncfile"); + 17c: 00005517 auipc a0,0x5 + 180: f0450513 addi a0,a0,-252 # 5080 <malloc+0x174> + 184: 101040ef jal ra,4a84 <unlink> + close(fd1); + 188: 8526 mv a0,s1 + 18a: 0d3040ef jal ra,4a5c <close> + close(fd2); + 18e: 854a mv a0,s2 + 190: 0cd040ef jal ra,4a5c <close> +} + 194: 70a2 ld ra,40(sp) + 196: 7402 ld s0,32(sp) + 198: 64e2 ld s1,24(sp) + 19a: 6942 ld s2,16(sp) + 19c: 69a2 ld s3,8(sp) + 19e: 6145 addi sp,sp,48 + 1a0: 8082 ret + printf("%s: write returned %d, expected -1\n", s, n); + 1a2: 862a mv a2,a0 + 1a4: 85ce mv a1,s3 + 1a6: 00005517 auipc a0,0x5 + 1aa: efa50513 addi a0,a0,-262 # 50a0 <malloc+0x194> + 1ae: 4ab040ef jal ra,4e58 <printf> + exit(1); + 1b2: 4505 li a0,1 + 1b4: 081040ef jal ra,4a34 <exit> + +00000000000001b8 <createtest>: +{ + 1b8: 7179 addi sp,sp,-48 + 1ba: f406 sd ra,40(sp) + 1bc: f022 sd s0,32(sp) + 1be: ec26 sd s1,24(sp) + 1c0: e84a sd s2,16(sp) + 1c2: 1800 addi s0,sp,48 + name[0] = 'a'; + 1c4: 06100793 li a5,97 + 1c8: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1cc: fc040d23 sb zero,-38(s0) + 1d0: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 1d4: 06400913 li s2,100 + name[1] = '0' + i; + 1d8: fc940ca3 sb s1,-39(s0) + fd = open(name, O_CREATE|O_RDWR); + 1dc: 20200593 li a1,514 + 1e0: fd840513 addi a0,s0,-40 + 1e4: 091040ef jal ra,4a74 <open> + close(fd); + 1e8: 075040ef jal ra,4a5c <close> + for(i = 0; i < N; i++){ + 1ec: 2485 addiw s1,s1,1 + 1ee: 0ff4f493 zext.b s1,s1 + 1f2: ff2493e3 bne s1,s2,1d8 <createtest+0x20> + name[0] = 'a'; + 1f6: 06100793 li a5,97 + 1fa: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1fe: fc040d23 sb zero,-38(s0) + 202: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 206: 06400913 li s2,100 + name[1] = '0' + i; + 20a: fc940ca3 sb s1,-39(s0) + unlink(name); + 20e: fd840513 addi a0,s0,-40 + 212: 073040ef jal ra,4a84 <unlink> + for(i = 0; i < N; i++){ + 216: 2485 addiw s1,s1,1 + 218: 0ff4f493 zext.b s1,s1 + 21c: ff2497e3 bne s1,s2,20a <createtest+0x52> +} + 220: 70a2 ld ra,40(sp) + 222: 7402 ld s0,32(sp) + 224: 64e2 ld s1,24(sp) + 226: 6942 ld s2,16(sp) + 228: 6145 addi sp,sp,48 + 22a: 8082 ret + +000000000000022c <bigwrite>: +{ + 22c: 715d addi sp,sp,-80 + 22e: e486 sd ra,72(sp) + 230: e0a2 sd s0,64(sp) + 232: fc26 sd s1,56(sp) + 234: f84a sd s2,48(sp) + 236: f44e sd s3,40(sp) + 238: f052 sd s4,32(sp) + 23a: ec56 sd s5,24(sp) + 23c: e85a sd s6,16(sp) + 23e: e45e sd s7,8(sp) + 240: 0880 addi s0,sp,80 + 242: 8baa mv s7,a0 + unlink("bigwrite"); + 244: 00005517 auipc a0,0x5 + 248: e8450513 addi a0,a0,-380 # 50c8 <malloc+0x1bc> + 24c: 039040ef jal ra,4a84 <unlink> + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 250: 1f300493 li s1,499 + fd = open("bigwrite", O_CREATE | O_RDWR); + 254: 00005a97 auipc s5,0x5 + 258: e74a8a93 addi s5,s5,-396 # 50c8 <malloc+0x1bc> + int cc = write(fd, buf, sz); + 25c: 0000ca17 auipc s4,0xc + 260: a1ca0a13 addi s4,s4,-1508 # bc78 <buf> + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 264: 6b0d lui s6,0x3 + 266: 1c9b0b13 addi s6,s6,457 # 31c9 <rmdot+0x53> + fd = open("bigwrite", O_CREATE | O_RDWR); + 26a: 20200593 li a1,514 + 26e: 8556 mv a0,s5 + 270: 005040ef jal ra,4a74 <open> + 274: 892a mv s2,a0 + if(fd < 0){ + 276: 04054563 bltz a0,2c0 <bigwrite+0x94> + int cc = write(fd, buf, sz); + 27a: 8626 mv a2,s1 + 27c: 85d2 mv a1,s4 + 27e: 7d6040ef jal ra,4a54 <write> + 282: 89aa mv s3,a0 + if(cc != sz){ + 284: 04a49863 bne s1,a0,2d4 <bigwrite+0xa8> + int cc = write(fd, buf, sz); + 288: 8626 mv a2,s1 + 28a: 85d2 mv a1,s4 + 28c: 854a mv a0,s2 + 28e: 7c6040ef jal ra,4a54 <write> + if(cc != sz){ + 292: 04951263 bne a0,s1,2d6 <bigwrite+0xaa> + close(fd); + 296: 854a mv a0,s2 + 298: 7c4040ef jal ra,4a5c <close> + unlink("bigwrite"); + 29c: 8556 mv a0,s5 + 29e: 7e6040ef jal ra,4a84 <unlink> + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 2a2: 1d74849b addiw s1,s1,471 + 2a6: fd6492e3 bne s1,s6,26a <bigwrite+0x3e> +} + 2aa: 60a6 ld ra,72(sp) + 2ac: 6406 ld s0,64(sp) + 2ae: 74e2 ld s1,56(sp) + 2b0: 7942 ld s2,48(sp) + 2b2: 79a2 ld s3,40(sp) + 2b4: 7a02 ld s4,32(sp) + 2b6: 6ae2 ld s5,24(sp) + 2b8: 6b42 ld s6,16(sp) + 2ba: 6ba2 ld s7,8(sp) + 2bc: 6161 addi sp,sp,80 + 2be: 8082 ret + printf("%s: cannot create bigwrite\n", s); + 2c0: 85de mv a1,s7 + 2c2: 00005517 auipc a0,0x5 + 2c6: e1650513 addi a0,a0,-490 # 50d8 <malloc+0x1cc> + 2ca: 38f040ef jal ra,4e58 <printf> + exit(1); + 2ce: 4505 li a0,1 + 2d0: 764040ef jal ra,4a34 <exit> + if(cc != sz){ + 2d4: 89a6 mv s3,s1 + printf("%s: write(%d) ret %d\n", s, sz, cc); + 2d6: 86aa mv a3,a0 + 2d8: 864e mv a2,s3 + 2da: 85de mv a1,s7 + 2dc: 00005517 auipc a0,0x5 + 2e0: e1c50513 addi a0,a0,-484 # 50f8 <malloc+0x1ec> + 2e4: 375040ef jal ra,4e58 <printf> + exit(1); + 2e8: 4505 li a0,1 + 2ea: 74a040ef jal ra,4a34 <exit> + +00000000000002ee <badwrite>: +// file is deleted? if the kernel has this bug, it will panic: balloc: +// out of blocks. assumed_free may need to be raised to be more than +// the number of free blocks. this test takes a long time. +void +badwrite(char *s) +{ + 2ee: 7179 addi sp,sp,-48 + 2f0: f406 sd ra,40(sp) + 2f2: f022 sd s0,32(sp) + 2f4: ec26 sd s1,24(sp) + 2f6: e84a sd s2,16(sp) + 2f8: e44e sd s3,8(sp) + 2fa: e052 sd s4,0(sp) + 2fc: 1800 addi s0,sp,48 + int assumed_free = 600; + + unlink("junk"); + 2fe: 00005517 auipc a0,0x5 + 302: e1250513 addi a0,a0,-494 # 5110 <malloc+0x204> + 306: 77e040ef jal ra,4a84 <unlink> + 30a: 25800913 li s2,600 + for(int i = 0; i < assumed_free; i++){ + int fd = open("junk", O_CREATE|O_WRONLY); + 30e: 00005997 auipc s3,0x5 + 312: e0298993 addi s3,s3,-510 # 5110 <malloc+0x204> + if(fd < 0){ + printf("open junk failed\n"); + exit(1); + } + write(fd, (char*)0xffffffffffL, 1); + 316: 5a7d li s4,-1 + 318: 018a5a13 srli s4,s4,0x18 + int fd = open("junk", O_CREATE|O_WRONLY); + 31c: 20100593 li a1,513 + 320: 854e mv a0,s3 + 322: 752040ef jal ra,4a74 <open> + 326: 84aa mv s1,a0 + if(fd < 0){ + 328: 04054d63 bltz a0,382 <badwrite+0x94> + write(fd, (char*)0xffffffffffL, 1); + 32c: 4605 li a2,1 + 32e: 85d2 mv a1,s4 + 330: 724040ef jal ra,4a54 <write> + close(fd); + 334: 8526 mv a0,s1 + 336: 726040ef jal ra,4a5c <close> + unlink("junk"); + 33a: 854e mv a0,s3 + 33c: 748040ef jal ra,4a84 <unlink> + for(int i = 0; i < assumed_free; i++){ + 340: 397d addiw s2,s2,-1 + 342: fc091de3 bnez s2,31c <badwrite+0x2e> + } + + int fd = open("junk", O_CREATE|O_WRONLY); + 346: 20100593 li a1,513 + 34a: 00005517 auipc a0,0x5 + 34e: dc650513 addi a0,a0,-570 # 5110 <malloc+0x204> + 352: 722040ef jal ra,4a74 <open> + 356: 84aa mv s1,a0 + if(fd < 0){ + 358: 02054e63 bltz a0,394 <badwrite+0xa6> + printf("open junk failed\n"); + exit(1); + } + if(write(fd, "x", 1) != 1){ + 35c: 4605 li a2,1 + 35e: 00005597 auipc a1,0x5 + 362: d3a58593 addi a1,a1,-710 # 5098 <malloc+0x18c> + 366: 6ee040ef jal ra,4a54 <write> + 36a: 4785 li a5,1 + 36c: 02f50d63 beq a0,a5,3a6 <badwrite+0xb8> + printf("write failed\n"); + 370: 00005517 auipc a0,0x5 + 374: dc050513 addi a0,a0,-576 # 5130 <malloc+0x224> + 378: 2e1040ef jal ra,4e58 <printf> + exit(1); + 37c: 4505 li a0,1 + 37e: 6b6040ef jal ra,4a34 <exit> + printf("open junk failed\n"); + 382: 00005517 auipc a0,0x5 + 386: d9650513 addi a0,a0,-618 # 5118 <malloc+0x20c> + 38a: 2cf040ef jal ra,4e58 <printf> + exit(1); + 38e: 4505 li a0,1 + 390: 6a4040ef jal ra,4a34 <exit> + printf("open junk failed\n"); + 394: 00005517 auipc a0,0x5 + 398: d8450513 addi a0,a0,-636 # 5118 <malloc+0x20c> + 39c: 2bd040ef jal ra,4e58 <printf> + exit(1); + 3a0: 4505 li a0,1 + 3a2: 692040ef jal ra,4a34 <exit> + } + close(fd); + 3a6: 8526 mv a0,s1 + 3a8: 6b4040ef jal ra,4a5c <close> + unlink("junk"); + 3ac: 00005517 auipc a0,0x5 + 3b0: d6450513 addi a0,a0,-668 # 5110 <malloc+0x204> + 3b4: 6d0040ef jal ra,4a84 <unlink> + + exit(0); + 3b8: 4501 li a0,0 + 3ba: 67a040ef jal ra,4a34 <exit> + +00000000000003be <outofinodes>: + } +} + +void +outofinodes(char *s) +{ + 3be: 715d addi sp,sp,-80 + 3c0: e486 sd ra,72(sp) + 3c2: e0a2 sd s0,64(sp) + 3c4: fc26 sd s1,56(sp) + 3c6: f84a sd s2,48(sp) + 3c8: f44e sd s3,40(sp) + 3ca: 0880 addi s0,sp,80 + int nzz = 32*32; + for(int i = 0; i < nzz; i++){ + 3cc: 4481 li s1,0 + char name[32]; + name[0] = 'z'; + 3ce: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 3d2: 40000993 li s3,1024 + name[0] = 'z'; + 3d6: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 3da: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 3de: 41f4d71b sraiw a4,s1,0x1f + 3e2: 01b7571b srliw a4,a4,0x1b + 3e6: 009707bb addw a5,a4,s1 + 3ea: 4057d69b sraiw a3,a5,0x5 + 3ee: 0306869b addiw a3,a3,48 + 3f2: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 3f6: 8bfd andi a5,a5,31 + 3f8: 9f99 subw a5,a5,a4 + 3fa: 0307879b addiw a5,a5,48 + 3fe: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 402: fa040a23 sb zero,-76(s0) + unlink(name); + 406: fb040513 addi a0,s0,-80 + 40a: 67a040ef jal ra,4a84 <unlink> + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 40e: 60200593 li a1,1538 + 412: fb040513 addi a0,s0,-80 + 416: 65e040ef jal ra,4a74 <open> + if(fd < 0){ + 41a: 00054763 bltz a0,428 <outofinodes+0x6a> + // failure is eventually expected. + break; + } + close(fd); + 41e: 63e040ef jal ra,4a5c <close> + for(int i = 0; i < nzz; i++){ + 422: 2485 addiw s1,s1,1 + 424: fb3499e3 bne s1,s3,3d6 <outofinodes+0x18> + 428: 4481 li s1,0 + } + + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + 42a: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 42e: 40000993 li s3,1024 + name[0] = 'z'; + 432: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 436: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 43a: 41f4d71b sraiw a4,s1,0x1f + 43e: 01b7571b srliw a4,a4,0x1b + 442: 009707bb addw a5,a4,s1 + 446: 4057d69b sraiw a3,a5,0x5 + 44a: 0306869b addiw a3,a3,48 + 44e: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 452: 8bfd andi a5,a5,31 + 454: 9f99 subw a5,a5,a4 + 456: 0307879b addiw a5,a5,48 + 45a: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 45e: fa040a23 sb zero,-76(s0) + unlink(name); + 462: fb040513 addi a0,s0,-80 + 466: 61e040ef jal ra,4a84 <unlink> + for(int i = 0; i < nzz; i++){ + 46a: 2485 addiw s1,s1,1 + 46c: fd3493e3 bne s1,s3,432 <outofinodes+0x74> + } +} + 470: 60a6 ld ra,72(sp) + 472: 6406 ld s0,64(sp) + 474: 74e2 ld s1,56(sp) + 476: 7942 ld s2,48(sp) + 478: 79a2 ld s3,40(sp) + 47a: 6161 addi sp,sp,80 + 47c: 8082 ret + +000000000000047e <copyin>: +{ + 47e: 7159 addi sp,sp,-112 + 480: f486 sd ra,104(sp) + 482: f0a2 sd s0,96(sp) + 484: eca6 sd s1,88(sp) + 486: e8ca sd s2,80(sp) + 488: e4ce sd s3,72(sp) + 48a: e0d2 sd s4,64(sp) + 48c: fc56 sd s5,56(sp) + 48e: 1880 addi s0,sp,112 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 490: 00007797 auipc a5,0x7 + 494: ef078793 addi a5,a5,-272 # 7380 <malloc+0x2474> + 498: 638c ld a1,0(a5) + 49a: 6790 ld a2,8(a5) + 49c: 6b94 ld a3,16(a5) + 49e: 6f98 ld a4,24(a5) + 4a0: 739c ld a5,32(a5) + 4a2: f8b43c23 sd a1,-104(s0) + 4a6: fac43023 sd a2,-96(s0) + 4aa: fad43423 sd a3,-88(s0) + 4ae: fae43823 sd a4,-80(s0) + 4b2: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4b6: f9840913 addi s2,s0,-104 + 4ba: fc040a93 addi s5,s0,-64 + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4be: 00005a17 auipc s4,0x5 + 4c2: c82a0a13 addi s4,s4,-894 # 5140 <malloc+0x234> + uint64 addr = addrs[ai]; + 4c6: 00093983 ld s3,0(s2) + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4ca: 20100593 li a1,513 + 4ce: 8552 mv a0,s4 + 4d0: 5a4040ef jal ra,4a74 <open> + 4d4: 84aa mv s1,a0 + if(fd < 0){ + 4d6: 06054763 bltz a0,544 <copyin+0xc6> + int n = write(fd, (void*)addr, 8192); + 4da: 6609 lui a2,0x2 + 4dc: 85ce mv a1,s3 + 4de: 576040ef jal ra,4a54 <write> + if(n >= 0){ + 4e2: 06055a63 bgez a0,556 <copyin+0xd8> + close(fd); + 4e6: 8526 mv a0,s1 + 4e8: 574040ef jal ra,4a5c <close> + unlink("copyin1"); + 4ec: 8552 mv a0,s4 + 4ee: 596040ef jal ra,4a84 <unlink> + n = write(1, (char*)addr, 8192); + 4f2: 6609 lui a2,0x2 + 4f4: 85ce mv a1,s3 + 4f6: 4505 li a0,1 + 4f8: 55c040ef jal ra,4a54 <write> + if(n > 0){ + 4fc: 06a04863 bgtz a0,56c <copyin+0xee> + if(pipe(fds) < 0){ + 500: f9040513 addi a0,s0,-112 + 504: 540040ef jal ra,4a44 <pipe> + 508: 06054d63 bltz a0,582 <copyin+0x104> + n = write(fds[1], (char*)addr, 8192); + 50c: 6609 lui a2,0x2 + 50e: 85ce mv a1,s3 + 510: f9442503 lw a0,-108(s0) + 514: 540040ef jal ra,4a54 <write> + if(n > 0){ + 518: 06a04e63 bgtz a0,594 <copyin+0x116> + close(fds[0]); + 51c: f9042503 lw a0,-112(s0) + 520: 53c040ef jal ra,4a5c <close> + close(fds[1]); + 524: f9442503 lw a0,-108(s0) + 528: 534040ef jal ra,4a5c <close> + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 52c: 0921 addi s2,s2,8 + 52e: f9591ce3 bne s2,s5,4c6 <copyin+0x48> +} + 532: 70a6 ld ra,104(sp) + 534: 7406 ld s0,96(sp) + 536: 64e6 ld s1,88(sp) + 538: 6946 ld s2,80(sp) + 53a: 69a6 ld s3,72(sp) + 53c: 6a06 ld s4,64(sp) + 53e: 7ae2 ld s5,56(sp) + 540: 6165 addi sp,sp,112 + 542: 8082 ret + printf("open(copyin1) failed\n"); + 544: 00005517 auipc a0,0x5 + 548: c0450513 addi a0,a0,-1020 # 5148 <malloc+0x23c> + 54c: 10d040ef jal ra,4e58 <printf> + exit(1); + 550: 4505 li a0,1 + 552: 4e2040ef jal ra,4a34 <exit> + printf("write(fd, %p, 8192) returned %d, not -1\n", (void*)addr, n); + 556: 862a mv a2,a0 + 558: 85ce mv a1,s3 + 55a: 00005517 auipc a0,0x5 + 55e: c0650513 addi a0,a0,-1018 # 5160 <malloc+0x254> + 562: 0f7040ef jal ra,4e58 <printf> + exit(1); + 566: 4505 li a0,1 + 568: 4cc040ef jal ra,4a34 <exit> + printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 56c: 862a mv a2,a0 + 56e: 85ce mv a1,s3 + 570: 00005517 auipc a0,0x5 + 574: c2050513 addi a0,a0,-992 # 5190 <malloc+0x284> + 578: 0e1040ef jal ra,4e58 <printf> + exit(1); + 57c: 4505 li a0,1 + 57e: 4b6040ef jal ra,4a34 <exit> + printf("pipe() failed\n"); + 582: 00005517 auipc a0,0x5 + 586: c3e50513 addi a0,a0,-962 # 51c0 <malloc+0x2b4> + 58a: 0cf040ef jal ra,4e58 <printf> + exit(1); + 58e: 4505 li a0,1 + 590: 4a4040ef jal ra,4a34 <exit> + printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 594: 862a mv a2,a0 + 596: 85ce mv a1,s3 + 598: 00005517 auipc a0,0x5 + 59c: c3850513 addi a0,a0,-968 # 51d0 <malloc+0x2c4> + 5a0: 0b9040ef jal ra,4e58 <printf> + exit(1); + 5a4: 4505 li a0,1 + 5a6: 48e040ef jal ra,4a34 <exit> + +00000000000005aa <copyout>: +{ + 5aa: 7119 addi sp,sp,-128 + 5ac: fc86 sd ra,120(sp) + 5ae: f8a2 sd s0,112(sp) + 5b0: f4a6 sd s1,104(sp) + 5b2: f0ca sd s2,96(sp) + 5b4: ecce sd s3,88(sp) + 5b6: e8d2 sd s4,80(sp) + 5b8: e4d6 sd s5,72(sp) + 5ba: e0da sd s6,64(sp) + 5bc: 0100 addi s0,sp,128 + uint64 addrs[] = { 0LL, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 5be: 00007797 auipc a5,0x7 + 5c2: dc278793 addi a5,a5,-574 # 7380 <malloc+0x2474> + 5c6: 7788 ld a0,40(a5) + 5c8: 7b8c ld a1,48(a5) + 5ca: 7f90 ld a2,56(a5) + 5cc: 63b4 ld a3,64(a5) + 5ce: 67b8 ld a4,72(a5) + 5d0: 6bbc ld a5,80(a5) + 5d2: f8a43823 sd a0,-112(s0) + 5d6: f8b43c23 sd a1,-104(s0) + 5da: fac43023 sd a2,-96(s0) + 5de: fad43423 sd a3,-88(s0) + 5e2: fae43823 sd a4,-80(s0) + 5e6: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 5ea: f9040913 addi s2,s0,-112 + 5ee: fc040b13 addi s6,s0,-64 + int fd = open("README", 0); + 5f2: 00005a17 auipc s4,0x5 + 5f6: c0ea0a13 addi s4,s4,-1010 # 5200 <malloc+0x2f4> + n = write(fds[1], "x", 1); + 5fa: 00005a97 auipc s5,0x5 + 5fe: a9ea8a93 addi s5,s5,-1378 # 5098 <malloc+0x18c> + uint64 addr = addrs[ai]; + 602: 00093983 ld s3,0(s2) + int fd = open("README", 0); + 606: 4581 li a1,0 + 608: 8552 mv a0,s4 + 60a: 46a040ef jal ra,4a74 <open> + 60e: 84aa mv s1,a0 + if(fd < 0){ + 610: 06054763 bltz a0,67e <copyout+0xd4> + int n = read(fd, (void*)addr, 8192); + 614: 6609 lui a2,0x2 + 616: 85ce mv a1,s3 + 618: 434040ef jal ra,4a4c <read> + if(n > 0){ + 61c: 06a04a63 bgtz a0,690 <copyout+0xe6> + close(fd); + 620: 8526 mv a0,s1 + 622: 43a040ef jal ra,4a5c <close> + if(pipe(fds) < 0){ + 626: f8840513 addi a0,s0,-120 + 62a: 41a040ef jal ra,4a44 <pipe> + 62e: 06054c63 bltz a0,6a6 <copyout+0xfc> + n = write(fds[1], "x", 1); + 632: 4605 li a2,1 + 634: 85d6 mv a1,s5 + 636: f8c42503 lw a0,-116(s0) + 63a: 41a040ef jal ra,4a54 <write> + if(n != 1){ + 63e: 4785 li a5,1 + 640: 06f51c63 bne a0,a5,6b8 <copyout+0x10e> + n = read(fds[0], (void*)addr, 8192); + 644: 6609 lui a2,0x2 + 646: 85ce mv a1,s3 + 648: f8842503 lw a0,-120(s0) + 64c: 400040ef jal ra,4a4c <read> + if(n > 0){ + 650: 06a04d63 bgtz a0,6ca <copyout+0x120> + close(fds[0]); + 654: f8842503 lw a0,-120(s0) + 658: 404040ef jal ra,4a5c <close> + close(fds[1]); + 65c: f8c42503 lw a0,-116(s0) + 660: 3fc040ef jal ra,4a5c <close> + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 664: 0921 addi s2,s2,8 + 666: f9691ee3 bne s2,s6,602 <copyout+0x58> +} + 66a: 70e6 ld ra,120(sp) + 66c: 7446 ld s0,112(sp) + 66e: 74a6 ld s1,104(sp) + 670: 7906 ld s2,96(sp) + 672: 69e6 ld s3,88(sp) + 674: 6a46 ld s4,80(sp) + 676: 6aa6 ld s5,72(sp) + 678: 6b06 ld s6,64(sp) + 67a: 6109 addi sp,sp,128 + 67c: 8082 ret + printf("open(README) failed\n"); + 67e: 00005517 auipc a0,0x5 + 682: b8a50513 addi a0,a0,-1142 # 5208 <malloc+0x2fc> + 686: 7d2040ef jal ra,4e58 <printf> + exit(1); + 68a: 4505 li a0,1 + 68c: 3a8040ef jal ra,4a34 <exit> + printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 690: 862a mv a2,a0 + 692: 85ce mv a1,s3 + 694: 00005517 auipc a0,0x5 + 698: b8c50513 addi a0,a0,-1140 # 5220 <malloc+0x314> + 69c: 7bc040ef jal ra,4e58 <printf> + exit(1); + 6a0: 4505 li a0,1 + 6a2: 392040ef jal ra,4a34 <exit> + printf("pipe() failed\n"); + 6a6: 00005517 auipc a0,0x5 + 6aa: b1a50513 addi a0,a0,-1254 # 51c0 <malloc+0x2b4> + 6ae: 7aa040ef jal ra,4e58 <printf> + exit(1); + 6b2: 4505 li a0,1 + 6b4: 380040ef jal ra,4a34 <exit> + printf("pipe write failed\n"); + 6b8: 00005517 auipc a0,0x5 + 6bc: b9850513 addi a0,a0,-1128 # 5250 <malloc+0x344> + 6c0: 798040ef jal ra,4e58 <printf> + exit(1); + 6c4: 4505 li a0,1 + 6c6: 36e040ef jal ra,4a34 <exit> + printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 6ca: 862a mv a2,a0 + 6cc: 85ce mv a1,s3 + 6ce: 00005517 auipc a0,0x5 + 6d2: b9a50513 addi a0,a0,-1126 # 5268 <malloc+0x35c> + 6d6: 782040ef jal ra,4e58 <printf> + exit(1); + 6da: 4505 li a0,1 + 6dc: 358040ef jal ra,4a34 <exit> + +00000000000006e0 <truncate1>: +{ + 6e0: 711d addi sp,sp,-96 + 6e2: ec86 sd ra,88(sp) + 6e4: e8a2 sd s0,80(sp) + 6e6: e4a6 sd s1,72(sp) + 6e8: e0ca sd s2,64(sp) + 6ea: fc4e sd s3,56(sp) + 6ec: f852 sd s4,48(sp) + 6ee: f456 sd s5,40(sp) + 6f0: 1080 addi s0,sp,96 + 6f2: 8aaa mv s5,a0 + unlink("truncfile"); + 6f4: 00005517 auipc a0,0x5 + 6f8: 98c50513 addi a0,a0,-1652 # 5080 <malloc+0x174> + 6fc: 388040ef jal ra,4a84 <unlink> + int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 700: 60100593 li a1,1537 + 704: 00005517 auipc a0,0x5 + 708: 97c50513 addi a0,a0,-1668 # 5080 <malloc+0x174> + 70c: 368040ef jal ra,4a74 <open> + 710: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 712: 4611 li a2,4 + 714: 00005597 auipc a1,0x5 + 718: 97c58593 addi a1,a1,-1668 # 5090 <malloc+0x184> + 71c: 338040ef jal ra,4a54 <write> + close(fd1); + 720: 8526 mv a0,s1 + 722: 33a040ef jal ra,4a5c <close> + int fd2 = open("truncfile", O_RDONLY); + 726: 4581 li a1,0 + 728: 00005517 auipc a0,0x5 + 72c: 95850513 addi a0,a0,-1704 # 5080 <malloc+0x174> + 730: 344040ef jal ra,4a74 <open> + 734: 84aa mv s1,a0 + int n = read(fd2, buf, sizeof(buf)); + 736: 02000613 li a2,32 + 73a: fa040593 addi a1,s0,-96 + 73e: 30e040ef jal ra,4a4c <read> + if(n != 4){ + 742: 4791 li a5,4 + 744: 0af51863 bne a0,a5,7f4 <truncate1+0x114> + fd1 = open("truncfile", O_WRONLY|O_TRUNC); + 748: 40100593 li a1,1025 + 74c: 00005517 auipc a0,0x5 + 750: 93450513 addi a0,a0,-1740 # 5080 <malloc+0x174> + 754: 320040ef jal ra,4a74 <open> + 758: 89aa mv s3,a0 + int fd3 = open("truncfile", O_RDONLY); + 75a: 4581 li a1,0 + 75c: 00005517 auipc a0,0x5 + 760: 92450513 addi a0,a0,-1756 # 5080 <malloc+0x174> + 764: 310040ef jal ra,4a74 <open> + 768: 892a mv s2,a0 + n = read(fd3, buf, sizeof(buf)); + 76a: 02000613 li a2,32 + 76e: fa040593 addi a1,s0,-96 + 772: 2da040ef jal ra,4a4c <read> + 776: 8a2a mv s4,a0 + if(n != 0){ + 778: e949 bnez a0,80a <truncate1+0x12a> + n = read(fd2, buf, sizeof(buf)); + 77a: 02000613 li a2,32 + 77e: fa040593 addi a1,s0,-96 + 782: 8526 mv a0,s1 + 784: 2c8040ef jal ra,4a4c <read> + 788: 8a2a mv s4,a0 + if(n != 0){ + 78a: e155 bnez a0,82e <truncate1+0x14e> + write(fd1, "abcdef", 6); + 78c: 4619 li a2,6 + 78e: 00005597 auipc a1,0x5 + 792: b6a58593 addi a1,a1,-1174 # 52f8 <malloc+0x3ec> + 796: 854e mv a0,s3 + 798: 2bc040ef jal ra,4a54 <write> + n = read(fd3, buf, sizeof(buf)); + 79c: 02000613 li a2,32 + 7a0: fa040593 addi a1,s0,-96 + 7a4: 854a mv a0,s2 + 7a6: 2a6040ef jal ra,4a4c <read> + if(n != 6){ + 7aa: 4799 li a5,6 + 7ac: 0af51363 bne a0,a5,852 <truncate1+0x172> + n = read(fd2, buf, sizeof(buf)); + 7b0: 02000613 li a2,32 + 7b4: fa040593 addi a1,s0,-96 + 7b8: 8526 mv a0,s1 + 7ba: 292040ef jal ra,4a4c <read> + if(n != 2){ + 7be: 4789 li a5,2 + 7c0: 0af51463 bne a0,a5,868 <truncate1+0x188> + unlink("truncfile"); + 7c4: 00005517 auipc a0,0x5 + 7c8: 8bc50513 addi a0,a0,-1860 # 5080 <malloc+0x174> + 7cc: 2b8040ef jal ra,4a84 <unlink> + close(fd1); + 7d0: 854e mv a0,s3 + 7d2: 28a040ef jal ra,4a5c <close> + close(fd2); + 7d6: 8526 mv a0,s1 + 7d8: 284040ef jal ra,4a5c <close> + close(fd3); + 7dc: 854a mv a0,s2 + 7de: 27e040ef jal ra,4a5c <close> +} + 7e2: 60e6 ld ra,88(sp) + 7e4: 6446 ld s0,80(sp) + 7e6: 64a6 ld s1,72(sp) + 7e8: 6906 ld s2,64(sp) + 7ea: 79e2 ld s3,56(sp) + 7ec: 7a42 ld s4,48(sp) + 7ee: 7aa2 ld s5,40(sp) + 7f0: 6125 addi sp,sp,96 + 7f2: 8082 ret + printf("%s: read %d bytes, wanted 4\n", s, n); + 7f4: 862a mv a2,a0 + 7f6: 85d6 mv a1,s5 + 7f8: 00005517 auipc a0,0x5 + 7fc: aa050513 addi a0,a0,-1376 # 5298 <malloc+0x38c> + 800: 658040ef jal ra,4e58 <printf> + exit(1); + 804: 4505 li a0,1 + 806: 22e040ef jal ra,4a34 <exit> + printf("aaa fd3=%d\n", fd3); + 80a: 85ca mv a1,s2 + 80c: 00005517 auipc a0,0x5 + 810: aac50513 addi a0,a0,-1364 # 52b8 <malloc+0x3ac> + 814: 644040ef jal ra,4e58 <printf> + printf("%s: read %d bytes, wanted 0\n", s, n); + 818: 8652 mv a2,s4 + 81a: 85d6 mv a1,s5 + 81c: 00005517 auipc a0,0x5 + 820: aac50513 addi a0,a0,-1364 # 52c8 <malloc+0x3bc> + 824: 634040ef jal ra,4e58 <printf> + exit(1); + 828: 4505 li a0,1 + 82a: 20a040ef jal ra,4a34 <exit> + printf("bbb fd2=%d\n", fd2); + 82e: 85a6 mv a1,s1 + 830: 00005517 auipc a0,0x5 + 834: ab850513 addi a0,a0,-1352 # 52e8 <malloc+0x3dc> + 838: 620040ef jal ra,4e58 <printf> + printf("%s: read %d bytes, wanted 0\n", s, n); + 83c: 8652 mv a2,s4 + 83e: 85d6 mv a1,s5 + 840: 00005517 auipc a0,0x5 + 844: a8850513 addi a0,a0,-1400 # 52c8 <malloc+0x3bc> + 848: 610040ef jal ra,4e58 <printf> + exit(1); + 84c: 4505 li a0,1 + 84e: 1e6040ef jal ra,4a34 <exit> + printf("%s: read %d bytes, wanted 6\n", s, n); + 852: 862a mv a2,a0 + 854: 85d6 mv a1,s5 + 856: 00005517 auipc a0,0x5 + 85a: aaa50513 addi a0,a0,-1366 # 5300 <malloc+0x3f4> + 85e: 5fa040ef jal ra,4e58 <printf> + exit(1); + 862: 4505 li a0,1 + 864: 1d0040ef jal ra,4a34 <exit> + printf("%s: read %d bytes, wanted 2\n", s, n); + 868: 862a mv a2,a0 + 86a: 85d6 mv a1,s5 + 86c: 00005517 auipc a0,0x5 + 870: ab450513 addi a0,a0,-1356 # 5320 <malloc+0x414> + 874: 5e4040ef jal ra,4e58 <printf> + exit(1); + 878: 4505 li a0,1 + 87a: 1ba040ef jal ra,4a34 <exit> + +000000000000087e <writetest>: +{ + 87e: 7139 addi sp,sp,-64 + 880: fc06 sd ra,56(sp) + 882: f822 sd s0,48(sp) + 884: f426 sd s1,40(sp) + 886: f04a sd s2,32(sp) + 888: ec4e sd s3,24(sp) + 88a: e852 sd s4,16(sp) + 88c: e456 sd s5,8(sp) + 88e: e05a sd s6,0(sp) + 890: 0080 addi s0,sp,64 + 892: 8b2a mv s6,a0 + fd = open("small", O_CREATE|O_RDWR); + 894: 20200593 li a1,514 + 898: 00005517 auipc a0,0x5 + 89c: aa850513 addi a0,a0,-1368 # 5340 <malloc+0x434> + 8a0: 1d4040ef jal ra,4a74 <open> + if(fd < 0){ + 8a4: 08054f63 bltz a0,942 <writetest+0xc4> + 8a8: 892a mv s2,a0 + 8aa: 4481 li s1,0 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8ac: 00005997 auipc s3,0x5 + 8b0: abc98993 addi s3,s3,-1348 # 5368 <malloc+0x45c> + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8b4: 00005a97 auipc s5,0x5 + 8b8: aeca8a93 addi s5,s5,-1300 # 53a0 <malloc+0x494> + for(i = 0; i < N; i++){ + 8bc: 06400a13 li s4,100 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8c0: 4629 li a2,10 + 8c2: 85ce mv a1,s3 + 8c4: 854a mv a0,s2 + 8c6: 18e040ef jal ra,4a54 <write> + 8ca: 47a9 li a5,10 + 8cc: 08f51563 bne a0,a5,956 <writetest+0xd8> + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8d0: 4629 li a2,10 + 8d2: 85d6 mv a1,s5 + 8d4: 854a mv a0,s2 + 8d6: 17e040ef jal ra,4a54 <write> + 8da: 47a9 li a5,10 + 8dc: 08f51863 bne a0,a5,96c <writetest+0xee> + for(i = 0; i < N; i++){ + 8e0: 2485 addiw s1,s1,1 + 8e2: fd449fe3 bne s1,s4,8c0 <writetest+0x42> + close(fd); + 8e6: 854a mv a0,s2 + 8e8: 174040ef jal ra,4a5c <close> + fd = open("small", O_RDONLY); + 8ec: 4581 li a1,0 + 8ee: 00005517 auipc a0,0x5 + 8f2: a5250513 addi a0,a0,-1454 # 5340 <malloc+0x434> + 8f6: 17e040ef jal ra,4a74 <open> + 8fa: 84aa mv s1,a0 + if(fd < 0){ + 8fc: 08054363 bltz a0,982 <writetest+0x104> + i = read(fd, buf, N*SZ*2); + 900: 7d000613 li a2,2000 + 904: 0000b597 auipc a1,0xb + 908: 37458593 addi a1,a1,884 # bc78 <buf> + 90c: 140040ef jal ra,4a4c <read> + if(i != N*SZ*2){ + 910: 7d000793 li a5,2000 + 914: 08f51163 bne a0,a5,996 <writetest+0x118> + close(fd); + 918: 8526 mv a0,s1 + 91a: 142040ef jal ra,4a5c <close> + if(unlink("small") < 0){ + 91e: 00005517 auipc a0,0x5 + 922: a2250513 addi a0,a0,-1502 # 5340 <malloc+0x434> + 926: 15e040ef jal ra,4a84 <unlink> + 92a: 08054063 bltz a0,9aa <writetest+0x12c> +} + 92e: 70e2 ld ra,56(sp) + 930: 7442 ld s0,48(sp) + 932: 74a2 ld s1,40(sp) + 934: 7902 ld s2,32(sp) + 936: 69e2 ld s3,24(sp) + 938: 6a42 ld s4,16(sp) + 93a: 6aa2 ld s5,8(sp) + 93c: 6b02 ld s6,0(sp) + 93e: 6121 addi sp,sp,64 + 940: 8082 ret + printf("%s: error: creat small failed!\n", s); + 942: 85da mv a1,s6 + 944: 00005517 auipc a0,0x5 + 948: a0450513 addi a0,a0,-1532 # 5348 <malloc+0x43c> + 94c: 50c040ef jal ra,4e58 <printf> + exit(1); + 950: 4505 li a0,1 + 952: 0e2040ef jal ra,4a34 <exit> + printf("%s: error: write aa %d new file failed\n", s, i); + 956: 8626 mv a2,s1 + 958: 85da mv a1,s6 + 95a: 00005517 auipc a0,0x5 + 95e: a1e50513 addi a0,a0,-1506 # 5378 <malloc+0x46c> + 962: 4f6040ef jal ra,4e58 <printf> + exit(1); + 966: 4505 li a0,1 + 968: 0cc040ef jal ra,4a34 <exit> + printf("%s: error: write bb %d new file failed\n", s, i); + 96c: 8626 mv a2,s1 + 96e: 85da mv a1,s6 + 970: 00005517 auipc a0,0x5 + 974: a4050513 addi a0,a0,-1472 # 53b0 <malloc+0x4a4> + 978: 4e0040ef jal ra,4e58 <printf> + exit(1); + 97c: 4505 li a0,1 + 97e: 0b6040ef jal ra,4a34 <exit> + printf("%s: error: open small failed!\n", s); + 982: 85da mv a1,s6 + 984: 00005517 auipc a0,0x5 + 988: a5450513 addi a0,a0,-1452 # 53d8 <malloc+0x4cc> + 98c: 4cc040ef jal ra,4e58 <printf> + exit(1); + 990: 4505 li a0,1 + 992: 0a2040ef jal ra,4a34 <exit> + printf("%s: read failed\n", s); + 996: 85da mv a1,s6 + 998: 00005517 auipc a0,0x5 + 99c: a6050513 addi a0,a0,-1440 # 53f8 <malloc+0x4ec> + 9a0: 4b8040ef jal ra,4e58 <printf> + exit(1); + 9a4: 4505 li a0,1 + 9a6: 08e040ef jal ra,4a34 <exit> + printf("%s: unlink small failed\n", s); + 9aa: 85da mv a1,s6 + 9ac: 00005517 auipc a0,0x5 + 9b0: a6450513 addi a0,a0,-1436 # 5410 <malloc+0x504> + 9b4: 4a4040ef jal ra,4e58 <printf> + exit(1); + 9b8: 4505 li a0,1 + 9ba: 07a040ef jal ra,4a34 <exit> + +00000000000009be <writebig>: +{ + 9be: 7139 addi sp,sp,-64 + 9c0: fc06 sd ra,56(sp) + 9c2: f822 sd s0,48(sp) + 9c4: f426 sd s1,40(sp) + 9c6: f04a sd s2,32(sp) + 9c8: ec4e sd s3,24(sp) + 9ca: e852 sd s4,16(sp) + 9cc: e456 sd s5,8(sp) + 9ce: 0080 addi s0,sp,64 + 9d0: 8aaa mv s5,a0 + fd = open("big", O_CREATE|O_RDWR); + 9d2: 20200593 li a1,514 + 9d6: 00005517 auipc a0,0x5 + 9da: a5a50513 addi a0,a0,-1446 # 5430 <malloc+0x524> + 9de: 096040ef jal ra,4a74 <open> + 9e2: 89aa mv s3,a0 + for(i = 0; i < MAXFILE; i++){ + 9e4: 4481 li s1,0 + ((int*)buf)[0] = i; + 9e6: 0000b917 auipc s2,0xb + 9ea: 29290913 addi s2,s2,658 # bc78 <buf> + for(i = 0; i < MAXFILE; i++){ + 9ee: 10c00a13 li s4,268 + if(fd < 0){ + 9f2: 06054463 bltz a0,a5a <writebig+0x9c> + ((int*)buf)[0] = i; + 9f6: 00992023 sw s1,0(s2) + if(write(fd, buf, BSIZE) != BSIZE){ + 9fa: 40000613 li a2,1024 + 9fe: 85ca mv a1,s2 + a00: 854e mv a0,s3 + a02: 052040ef jal ra,4a54 <write> + a06: 40000793 li a5,1024 + a0a: 06f51263 bne a0,a5,a6e <writebig+0xb0> + for(i = 0; i < MAXFILE; i++){ + a0e: 2485 addiw s1,s1,1 + a10: ff4493e3 bne s1,s4,9f6 <writebig+0x38> + close(fd); + a14: 854e mv a0,s3 + a16: 046040ef jal ra,4a5c <close> + fd = open("big", O_RDONLY); + a1a: 4581 li a1,0 + a1c: 00005517 auipc a0,0x5 + a20: a1450513 addi a0,a0,-1516 # 5430 <malloc+0x524> + a24: 050040ef jal ra,4a74 <open> + a28: 89aa mv s3,a0 + n = 0; + a2a: 4481 li s1,0 + i = read(fd, buf, BSIZE); + a2c: 0000b917 auipc s2,0xb + a30: 24c90913 addi s2,s2,588 # bc78 <buf> + if(fd < 0){ + a34: 04054863 bltz a0,a84 <writebig+0xc6> + i = read(fd, buf, BSIZE); + a38: 40000613 li a2,1024 + a3c: 85ca mv a1,s2 + a3e: 854e mv a0,s3 + a40: 00c040ef jal ra,4a4c <read> + if(i == 0){ + a44: c931 beqz a0,a98 <writebig+0xda> + } else if(i != BSIZE){ + a46: 40000793 li a5,1024 + a4a: 08f51a63 bne a0,a5,ade <writebig+0x120> + if(((int*)buf)[0] != n){ + a4e: 00092683 lw a3,0(s2) + a52: 0a969163 bne a3,s1,af4 <writebig+0x136> + n++; + a56: 2485 addiw s1,s1,1 + i = read(fd, buf, BSIZE); + a58: b7c5 j a38 <writebig+0x7a> + printf("%s: error: creat big failed!\n", s); + a5a: 85d6 mv a1,s5 + a5c: 00005517 auipc a0,0x5 + a60: 9dc50513 addi a0,a0,-1572 # 5438 <malloc+0x52c> + a64: 3f4040ef jal ra,4e58 <printf> + exit(1); + a68: 4505 li a0,1 + a6a: 7cb030ef jal ra,4a34 <exit> + printf("%s: error: write big file failed i=%d\n", s, i); + a6e: 8626 mv a2,s1 + a70: 85d6 mv a1,s5 + a72: 00005517 auipc a0,0x5 + a76: 9e650513 addi a0,a0,-1562 # 5458 <malloc+0x54c> + a7a: 3de040ef jal ra,4e58 <printf> + exit(1); + a7e: 4505 li a0,1 + a80: 7b5030ef jal ra,4a34 <exit> + printf("%s: error: open big failed!\n", s); + a84: 85d6 mv a1,s5 + a86: 00005517 auipc a0,0x5 + a8a: 9fa50513 addi a0,a0,-1542 # 5480 <malloc+0x574> + a8e: 3ca040ef jal ra,4e58 <printf> + exit(1); + a92: 4505 li a0,1 + a94: 7a1030ef jal ra,4a34 <exit> + if(n != MAXFILE){ + a98: 10c00793 li a5,268 + a9c: 02f49663 bne s1,a5,ac8 <writebig+0x10a> + close(fd); + aa0: 854e mv a0,s3 + aa2: 7bb030ef jal ra,4a5c <close> + if(unlink("big") < 0){ + aa6: 00005517 auipc a0,0x5 + aaa: 98a50513 addi a0,a0,-1654 # 5430 <malloc+0x524> + aae: 7d7030ef jal ra,4a84 <unlink> + ab2: 04054c63 bltz a0,b0a <writebig+0x14c> +} + ab6: 70e2 ld ra,56(sp) + ab8: 7442 ld s0,48(sp) + aba: 74a2 ld s1,40(sp) + abc: 7902 ld s2,32(sp) + abe: 69e2 ld s3,24(sp) + ac0: 6a42 ld s4,16(sp) + ac2: 6aa2 ld s5,8(sp) + ac4: 6121 addi sp,sp,64 + ac6: 8082 ret + printf("%s: read only %d blocks from big", s, n); + ac8: 8626 mv a2,s1 + aca: 85d6 mv a1,s5 + acc: 00005517 auipc a0,0x5 + ad0: 9d450513 addi a0,a0,-1580 # 54a0 <malloc+0x594> + ad4: 384040ef jal ra,4e58 <printf> + exit(1); + ad8: 4505 li a0,1 + ada: 75b030ef jal ra,4a34 <exit> + printf("%s: read failed %d\n", s, i); + ade: 862a mv a2,a0 + ae0: 85d6 mv a1,s5 + ae2: 00005517 auipc a0,0x5 + ae6: 9e650513 addi a0,a0,-1562 # 54c8 <malloc+0x5bc> + aea: 36e040ef jal ra,4e58 <printf> + exit(1); + aee: 4505 li a0,1 + af0: 745030ef jal ra,4a34 <exit> + printf("%s: read content of block %d is %d\n", s, + af4: 8626 mv a2,s1 + af6: 85d6 mv a1,s5 + af8: 00005517 auipc a0,0x5 + afc: 9e850513 addi a0,a0,-1560 # 54e0 <malloc+0x5d4> + b00: 358040ef jal ra,4e58 <printf> + exit(1); + b04: 4505 li a0,1 + b06: 72f030ef jal ra,4a34 <exit> + printf("%s: unlink big failed\n", s); + b0a: 85d6 mv a1,s5 + b0c: 00005517 auipc a0,0x5 + b10: 9fc50513 addi a0,a0,-1540 # 5508 <malloc+0x5fc> + b14: 344040ef jal ra,4e58 <printf> + exit(1); + b18: 4505 li a0,1 + b1a: 71b030ef jal ra,4a34 <exit> + +0000000000000b1e <unlinkread>: +{ + b1e: 7179 addi sp,sp,-48 + b20: f406 sd ra,40(sp) + b22: f022 sd s0,32(sp) + b24: ec26 sd s1,24(sp) + b26: e84a sd s2,16(sp) + b28: e44e sd s3,8(sp) + b2a: 1800 addi s0,sp,48 + b2c: 89aa mv s3,a0 + fd = open("unlinkread", O_CREATE | O_RDWR); + b2e: 20200593 li a1,514 + b32: 00005517 auipc a0,0x5 + b36: 9ee50513 addi a0,a0,-1554 # 5520 <malloc+0x614> + b3a: 73b030ef jal ra,4a74 <open> + if(fd < 0){ + b3e: 0a054f63 bltz a0,bfc <unlinkread+0xde> + b42: 84aa mv s1,a0 + write(fd, "hello", SZ); + b44: 4615 li a2,5 + b46: 00005597 auipc a1,0x5 + b4a: a0a58593 addi a1,a1,-1526 # 5550 <malloc+0x644> + b4e: 707030ef jal ra,4a54 <write> + close(fd); + b52: 8526 mv a0,s1 + b54: 709030ef jal ra,4a5c <close> + fd = open("unlinkread", O_RDWR); + b58: 4589 li a1,2 + b5a: 00005517 auipc a0,0x5 + b5e: 9c650513 addi a0,a0,-1594 # 5520 <malloc+0x614> + b62: 713030ef jal ra,4a74 <open> + b66: 84aa mv s1,a0 + if(fd < 0){ + b68: 0a054463 bltz a0,c10 <unlinkread+0xf2> + if(unlink("unlinkread") != 0){ + b6c: 00005517 auipc a0,0x5 + b70: 9b450513 addi a0,a0,-1612 # 5520 <malloc+0x614> + b74: 711030ef jal ra,4a84 <unlink> + b78: e555 bnez a0,c24 <unlinkread+0x106> + fd1 = open("unlinkread", O_CREATE | O_RDWR); + b7a: 20200593 li a1,514 + b7e: 00005517 auipc a0,0x5 + b82: 9a250513 addi a0,a0,-1630 # 5520 <malloc+0x614> + b86: 6ef030ef jal ra,4a74 <open> + b8a: 892a mv s2,a0 + write(fd1, "yyy", 3); + b8c: 460d li a2,3 + b8e: 00005597 auipc a1,0x5 + b92: a0a58593 addi a1,a1,-1526 # 5598 <malloc+0x68c> + b96: 6bf030ef jal ra,4a54 <write> + close(fd1); + b9a: 854a mv a0,s2 + b9c: 6c1030ef jal ra,4a5c <close> + if(read(fd, buf, sizeof(buf)) != SZ){ + ba0: 660d lui a2,0x3 + ba2: 0000b597 auipc a1,0xb + ba6: 0d658593 addi a1,a1,214 # bc78 <buf> + baa: 8526 mv a0,s1 + bac: 6a1030ef jal ra,4a4c <read> + bb0: 4795 li a5,5 + bb2: 08f51363 bne a0,a5,c38 <unlinkread+0x11a> + if(buf[0] != 'h'){ + bb6: 0000b717 auipc a4,0xb + bba: 0c274703 lbu a4,194(a4) # bc78 <buf> + bbe: 06800793 li a5,104 + bc2: 08f71563 bne a4,a5,c4c <unlinkread+0x12e> + if(write(fd, buf, 10) != 10){ + bc6: 4629 li a2,10 + bc8: 0000b597 auipc a1,0xb + bcc: 0b058593 addi a1,a1,176 # bc78 <buf> + bd0: 8526 mv a0,s1 + bd2: 683030ef jal ra,4a54 <write> + bd6: 47a9 li a5,10 + bd8: 08f51463 bne a0,a5,c60 <unlinkread+0x142> + close(fd); + bdc: 8526 mv a0,s1 + bde: 67f030ef jal ra,4a5c <close> + unlink("unlinkread"); + be2: 00005517 auipc a0,0x5 + be6: 93e50513 addi a0,a0,-1730 # 5520 <malloc+0x614> + bea: 69b030ef jal ra,4a84 <unlink> +} + bee: 70a2 ld ra,40(sp) + bf0: 7402 ld s0,32(sp) + bf2: 64e2 ld s1,24(sp) + bf4: 6942 ld s2,16(sp) + bf6: 69a2 ld s3,8(sp) + bf8: 6145 addi sp,sp,48 + bfa: 8082 ret + printf("%s: create unlinkread failed\n", s); + bfc: 85ce mv a1,s3 + bfe: 00005517 auipc a0,0x5 + c02: 93250513 addi a0,a0,-1742 # 5530 <malloc+0x624> + c06: 252040ef jal ra,4e58 <printf> + exit(1); + c0a: 4505 li a0,1 + c0c: 629030ef jal ra,4a34 <exit> + printf("%s: open unlinkread failed\n", s); + c10: 85ce mv a1,s3 + c12: 00005517 auipc a0,0x5 + c16: 94650513 addi a0,a0,-1722 # 5558 <malloc+0x64c> + c1a: 23e040ef jal ra,4e58 <printf> + exit(1); + c1e: 4505 li a0,1 + c20: 615030ef jal ra,4a34 <exit> + printf("%s: unlink unlinkread failed\n", s); + c24: 85ce mv a1,s3 + c26: 00005517 auipc a0,0x5 + c2a: 95250513 addi a0,a0,-1710 # 5578 <malloc+0x66c> + c2e: 22a040ef jal ra,4e58 <printf> + exit(1); + c32: 4505 li a0,1 + c34: 601030ef jal ra,4a34 <exit> + printf("%s: unlinkread read failed", s); + c38: 85ce mv a1,s3 + c3a: 00005517 auipc a0,0x5 + c3e: 96650513 addi a0,a0,-1690 # 55a0 <malloc+0x694> + c42: 216040ef jal ra,4e58 <printf> + exit(1); + c46: 4505 li a0,1 + c48: 5ed030ef jal ra,4a34 <exit> + printf("%s: unlinkread wrong data\n", s); + c4c: 85ce mv a1,s3 + c4e: 00005517 auipc a0,0x5 + c52: 97250513 addi a0,a0,-1678 # 55c0 <malloc+0x6b4> + c56: 202040ef jal ra,4e58 <printf> + exit(1); + c5a: 4505 li a0,1 + c5c: 5d9030ef jal ra,4a34 <exit> + printf("%s: unlinkread write failed\n", s); + c60: 85ce mv a1,s3 + c62: 00005517 auipc a0,0x5 + c66: 97e50513 addi a0,a0,-1666 # 55e0 <malloc+0x6d4> + c6a: 1ee040ef jal ra,4e58 <printf> + exit(1); + c6e: 4505 li a0,1 + c70: 5c5030ef jal ra,4a34 <exit> + +0000000000000c74 <linktest>: +{ + c74: 1101 addi sp,sp,-32 + c76: ec06 sd ra,24(sp) + c78: e822 sd s0,16(sp) + c7a: e426 sd s1,8(sp) + c7c: e04a sd s2,0(sp) + c7e: 1000 addi s0,sp,32 + c80: 892a mv s2,a0 + unlink("lf1"); + c82: 00005517 auipc a0,0x5 + c86: 97e50513 addi a0,a0,-1666 # 5600 <malloc+0x6f4> + c8a: 5fb030ef jal ra,4a84 <unlink> + unlink("lf2"); + c8e: 00005517 auipc a0,0x5 + c92: 97a50513 addi a0,a0,-1670 # 5608 <malloc+0x6fc> + c96: 5ef030ef jal ra,4a84 <unlink> + fd = open("lf1", O_CREATE|O_RDWR); + c9a: 20200593 li a1,514 + c9e: 00005517 auipc a0,0x5 + ca2: 96250513 addi a0,a0,-1694 # 5600 <malloc+0x6f4> + ca6: 5cf030ef jal ra,4a74 <open> + if(fd < 0){ + caa: 0c054f63 bltz a0,d88 <linktest+0x114> + cae: 84aa mv s1,a0 + if(write(fd, "hello", SZ) != SZ){ + cb0: 4615 li a2,5 + cb2: 00005597 auipc a1,0x5 + cb6: 89e58593 addi a1,a1,-1890 # 5550 <malloc+0x644> + cba: 59b030ef jal ra,4a54 <write> + cbe: 4795 li a5,5 + cc0: 0cf51e63 bne a0,a5,d9c <linktest+0x128> + close(fd); + cc4: 8526 mv a0,s1 + cc6: 597030ef jal ra,4a5c <close> + if(link("lf1", "lf2") < 0){ + cca: 00005597 auipc a1,0x5 + cce: 93e58593 addi a1,a1,-1730 # 5608 <malloc+0x6fc> + cd2: 00005517 auipc a0,0x5 + cd6: 92e50513 addi a0,a0,-1746 # 5600 <malloc+0x6f4> + cda: 5bb030ef jal ra,4a94 <link> + cde: 0c054963 bltz a0,db0 <linktest+0x13c> + unlink("lf1"); + ce2: 00005517 auipc a0,0x5 + ce6: 91e50513 addi a0,a0,-1762 # 5600 <malloc+0x6f4> + cea: 59b030ef jal ra,4a84 <unlink> + if(open("lf1", 0) >= 0){ + cee: 4581 li a1,0 + cf0: 00005517 auipc a0,0x5 + cf4: 91050513 addi a0,a0,-1776 # 5600 <malloc+0x6f4> + cf8: 57d030ef jal ra,4a74 <open> + cfc: 0c055463 bgez a0,dc4 <linktest+0x150> + fd = open("lf2", 0); + d00: 4581 li a1,0 + d02: 00005517 auipc a0,0x5 + d06: 90650513 addi a0,a0,-1786 # 5608 <malloc+0x6fc> + d0a: 56b030ef jal ra,4a74 <open> + d0e: 84aa mv s1,a0 + if(fd < 0){ + d10: 0c054463 bltz a0,dd8 <linktest+0x164> + if(read(fd, buf, sizeof(buf)) != SZ){ + d14: 660d lui a2,0x3 + d16: 0000b597 auipc a1,0xb + d1a: f6258593 addi a1,a1,-158 # bc78 <buf> + d1e: 52f030ef jal ra,4a4c <read> + d22: 4795 li a5,5 + d24: 0cf51463 bne a0,a5,dec <linktest+0x178> + close(fd); + d28: 8526 mv a0,s1 + d2a: 533030ef jal ra,4a5c <close> + if(link("lf2", "lf2") >= 0){ + d2e: 00005597 auipc a1,0x5 + d32: 8da58593 addi a1,a1,-1830 # 5608 <malloc+0x6fc> + d36: 852e mv a0,a1 + d38: 55d030ef jal ra,4a94 <link> + d3c: 0c055263 bgez a0,e00 <linktest+0x18c> + unlink("lf2"); + d40: 00005517 auipc a0,0x5 + d44: 8c850513 addi a0,a0,-1848 # 5608 <malloc+0x6fc> + d48: 53d030ef jal ra,4a84 <unlink> + if(link("lf2", "lf1") >= 0){ + d4c: 00005597 auipc a1,0x5 + d50: 8b458593 addi a1,a1,-1868 # 5600 <malloc+0x6f4> + d54: 00005517 auipc a0,0x5 + d58: 8b450513 addi a0,a0,-1868 # 5608 <malloc+0x6fc> + d5c: 539030ef jal ra,4a94 <link> + d60: 0a055a63 bgez a0,e14 <linktest+0x1a0> + if(link(".", "lf1") >= 0){ + d64: 00005597 auipc a1,0x5 + d68: 89c58593 addi a1,a1,-1892 # 5600 <malloc+0x6f4> + d6c: 00005517 auipc a0,0x5 + d70: 9a450513 addi a0,a0,-1628 # 5710 <malloc+0x804> + d74: 521030ef jal ra,4a94 <link> + d78: 0a055863 bgez a0,e28 <linktest+0x1b4> +} + d7c: 60e2 ld ra,24(sp) + d7e: 6442 ld s0,16(sp) + d80: 64a2 ld s1,8(sp) + d82: 6902 ld s2,0(sp) + d84: 6105 addi sp,sp,32 + d86: 8082 ret + printf("%s: create lf1 failed\n", s); + d88: 85ca mv a1,s2 + d8a: 00005517 auipc a0,0x5 + d8e: 88650513 addi a0,a0,-1914 # 5610 <malloc+0x704> + d92: 0c6040ef jal ra,4e58 <printf> + exit(1); + d96: 4505 li a0,1 + d98: 49d030ef jal ra,4a34 <exit> + printf("%s: write lf1 failed\n", s); + d9c: 85ca mv a1,s2 + d9e: 00005517 auipc a0,0x5 + da2: 88a50513 addi a0,a0,-1910 # 5628 <malloc+0x71c> + da6: 0b2040ef jal ra,4e58 <printf> + exit(1); + daa: 4505 li a0,1 + dac: 489030ef jal ra,4a34 <exit> + printf("%s: link lf1 lf2 failed\n", s); + db0: 85ca mv a1,s2 + db2: 00005517 auipc a0,0x5 + db6: 88e50513 addi a0,a0,-1906 # 5640 <malloc+0x734> + dba: 09e040ef jal ra,4e58 <printf> + exit(1); + dbe: 4505 li a0,1 + dc0: 475030ef jal ra,4a34 <exit> + printf("%s: unlinked lf1 but it is still there!\n", s); + dc4: 85ca mv a1,s2 + dc6: 00005517 auipc a0,0x5 + dca: 89a50513 addi a0,a0,-1894 # 5660 <malloc+0x754> + dce: 08a040ef jal ra,4e58 <printf> + exit(1); + dd2: 4505 li a0,1 + dd4: 461030ef jal ra,4a34 <exit> + printf("%s: open lf2 failed\n", s); + dd8: 85ca mv a1,s2 + dda: 00005517 auipc a0,0x5 + dde: 8b650513 addi a0,a0,-1866 # 5690 <malloc+0x784> + de2: 076040ef jal ra,4e58 <printf> + exit(1); + de6: 4505 li a0,1 + de8: 44d030ef jal ra,4a34 <exit> + printf("%s: read lf2 failed\n", s); + dec: 85ca mv a1,s2 + dee: 00005517 auipc a0,0x5 + df2: 8ba50513 addi a0,a0,-1862 # 56a8 <malloc+0x79c> + df6: 062040ef jal ra,4e58 <printf> + exit(1); + dfa: 4505 li a0,1 + dfc: 439030ef jal ra,4a34 <exit> + printf("%s: link lf2 lf2 succeeded! oops\n", s); + e00: 85ca mv a1,s2 + e02: 00005517 auipc a0,0x5 + e06: 8be50513 addi a0,a0,-1858 # 56c0 <malloc+0x7b4> + e0a: 04e040ef jal ra,4e58 <printf> + exit(1); + e0e: 4505 li a0,1 + e10: 425030ef jal ra,4a34 <exit> + printf("%s: link non-existent succeeded! oops\n", s); + e14: 85ca mv a1,s2 + e16: 00005517 auipc a0,0x5 + e1a: 8d250513 addi a0,a0,-1838 # 56e8 <malloc+0x7dc> + e1e: 03a040ef jal ra,4e58 <printf> + exit(1); + e22: 4505 li a0,1 + e24: 411030ef jal ra,4a34 <exit> + printf("%s: link . lf1 succeeded! oops\n", s); + e28: 85ca mv a1,s2 + e2a: 00005517 auipc a0,0x5 + e2e: 8ee50513 addi a0,a0,-1810 # 5718 <malloc+0x80c> + e32: 026040ef jal ra,4e58 <printf> + exit(1); + e36: 4505 li a0,1 + e38: 3fd030ef jal ra,4a34 <exit> + +0000000000000e3c <validatetest>: +{ + e3c: 7139 addi sp,sp,-64 + e3e: fc06 sd ra,56(sp) + e40: f822 sd s0,48(sp) + e42: f426 sd s1,40(sp) + e44: f04a sd s2,32(sp) + e46: ec4e sd s3,24(sp) + e48: e852 sd s4,16(sp) + e4a: e456 sd s5,8(sp) + e4c: e05a sd s6,0(sp) + e4e: 0080 addi s0,sp,64 + e50: 8b2a mv s6,a0 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e52: 4481 li s1,0 + if(link("nosuchfile", (char*)p) != -1){ + e54: 00005997 auipc s3,0x5 + e58: 8e498993 addi s3,s3,-1820 # 5738 <malloc+0x82c> + e5c: 597d li s2,-1 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e5e: 6a85 lui s5,0x1 + e60: 00114a37 lui s4,0x114 + if(link("nosuchfile", (char*)p) != -1){ + e64: 85a6 mv a1,s1 + e66: 854e mv a0,s3 + e68: 42d030ef jal ra,4a94 <link> + e6c: 01251f63 bne a0,s2,e8a <validatetest+0x4e> + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e70: 94d6 add s1,s1,s5 + e72: ff4499e3 bne s1,s4,e64 <validatetest+0x28> +} + e76: 70e2 ld ra,56(sp) + e78: 7442 ld s0,48(sp) + e7a: 74a2 ld s1,40(sp) + e7c: 7902 ld s2,32(sp) + e7e: 69e2 ld s3,24(sp) + e80: 6a42 ld s4,16(sp) + e82: 6aa2 ld s5,8(sp) + e84: 6b02 ld s6,0(sp) + e86: 6121 addi sp,sp,64 + e88: 8082 ret + printf("%s: link should not succeed\n", s); + e8a: 85da mv a1,s6 + e8c: 00005517 auipc a0,0x5 + e90: 8bc50513 addi a0,a0,-1860 # 5748 <malloc+0x83c> + e94: 7c5030ef jal ra,4e58 <printf> + exit(1); + e98: 4505 li a0,1 + e9a: 39b030ef jal ra,4a34 <exit> + +0000000000000e9e <bigdir>: +{ + e9e: 715d addi sp,sp,-80 + ea0: e486 sd ra,72(sp) + ea2: e0a2 sd s0,64(sp) + ea4: fc26 sd s1,56(sp) + ea6: f84a sd s2,48(sp) + ea8: f44e sd s3,40(sp) + eaa: f052 sd s4,32(sp) + eac: ec56 sd s5,24(sp) + eae: e85a sd s6,16(sp) + eb0: 0880 addi s0,sp,80 + eb2: 89aa mv s3,a0 + unlink("bd"); + eb4: 00005517 auipc a0,0x5 + eb8: 8b450513 addi a0,a0,-1868 # 5768 <malloc+0x85c> + ebc: 3c9030ef jal ra,4a84 <unlink> + fd = open("bd", O_CREATE); + ec0: 20000593 li a1,512 + ec4: 00005517 auipc a0,0x5 + ec8: 8a450513 addi a0,a0,-1884 # 5768 <malloc+0x85c> + ecc: 3a9030ef jal ra,4a74 <open> + if(fd < 0){ + ed0: 0c054163 bltz a0,f92 <bigdir+0xf4> + close(fd); + ed4: 389030ef jal ra,4a5c <close> + for(i = 0; i < N; i++){ + ed8: 4901 li s2,0 + name[0] = 'x'; + eda: 07800a93 li s5,120 + if(link("bd", name) != 0){ + ede: 00005a17 auipc s4,0x5 + ee2: 88aa0a13 addi s4,s4,-1910 # 5768 <malloc+0x85c> + for(i = 0; i < N; i++){ + ee6: 1f400b13 li s6,500 + name[0] = 'x'; + eea: fb540823 sb s5,-80(s0) + name[1] = '0' + (i / 64); + eee: 41f9571b sraiw a4,s2,0x1f + ef2: 01a7571b srliw a4,a4,0x1a + ef6: 012707bb addw a5,a4,s2 + efa: 4067d69b sraiw a3,a5,0x6 + efe: 0306869b addiw a3,a3,48 + f02: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f06: 03f7f793 andi a5,a5,63 + f0a: 9f99 subw a5,a5,a4 + f0c: 0307879b addiw a5,a5,48 + f10: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f14: fa0409a3 sb zero,-77(s0) + if(link("bd", name) != 0){ + f18: fb040593 addi a1,s0,-80 + f1c: 8552 mv a0,s4 + f1e: 377030ef jal ra,4a94 <link> + f22: 84aa mv s1,a0 + f24: e149 bnez a0,fa6 <bigdir+0x108> + for(i = 0; i < N; i++){ + f26: 2905 addiw s2,s2,1 + f28: fd6911e3 bne s2,s6,eea <bigdir+0x4c> + unlink("bd"); + f2c: 00005517 auipc a0,0x5 + f30: 83c50513 addi a0,a0,-1988 # 5768 <malloc+0x85c> + f34: 351030ef jal ra,4a84 <unlink> + name[0] = 'x'; + f38: 07800913 li s2,120 + for(i = 0; i < N; i++){ + f3c: 1f400a13 li s4,500 + name[0] = 'x'; + f40: fb240823 sb s2,-80(s0) + name[1] = '0' + (i / 64); + f44: 41f4d71b sraiw a4,s1,0x1f + f48: 01a7571b srliw a4,a4,0x1a + f4c: 009707bb addw a5,a4,s1 + f50: 4067d69b sraiw a3,a5,0x6 + f54: 0306869b addiw a3,a3,48 + f58: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f5c: 03f7f793 andi a5,a5,63 + f60: 9f99 subw a5,a5,a4 + f62: 0307879b addiw a5,a5,48 + f66: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f6a: fa0409a3 sb zero,-77(s0) + if(unlink(name) != 0){ + f6e: fb040513 addi a0,s0,-80 + f72: 313030ef jal ra,4a84 <unlink> + f76: e529 bnez a0,fc0 <bigdir+0x122> + for(i = 0; i < N; i++){ + f78: 2485 addiw s1,s1,1 + f7a: fd4493e3 bne s1,s4,f40 <bigdir+0xa2> +} + f7e: 60a6 ld ra,72(sp) + f80: 6406 ld s0,64(sp) + f82: 74e2 ld s1,56(sp) + f84: 7942 ld s2,48(sp) + f86: 79a2 ld s3,40(sp) + f88: 7a02 ld s4,32(sp) + f8a: 6ae2 ld s5,24(sp) + f8c: 6b42 ld s6,16(sp) + f8e: 6161 addi sp,sp,80 + f90: 8082 ret + printf("%s: bigdir create failed\n", s); + f92: 85ce mv a1,s3 + f94: 00004517 auipc a0,0x4 + f98: 7dc50513 addi a0,a0,2012 # 5770 <malloc+0x864> + f9c: 6bd030ef jal ra,4e58 <printf> + exit(1); + fa0: 4505 li a0,1 + fa2: 293030ef jal ra,4a34 <exit> + printf("%s: bigdir i=%d link(bd, %s) failed\n", s, i, name); + fa6: fb040693 addi a3,s0,-80 + faa: 864a mv a2,s2 + fac: 85ce mv a1,s3 + fae: 00004517 auipc a0,0x4 + fb2: 7e250513 addi a0,a0,2018 # 5790 <malloc+0x884> + fb6: 6a3030ef jal ra,4e58 <printf> + exit(1); + fba: 4505 li a0,1 + fbc: 279030ef jal ra,4a34 <exit> + printf("%s: bigdir unlink failed", s); + fc0: 85ce mv a1,s3 + fc2: 00004517 auipc a0,0x4 + fc6: 7f650513 addi a0,a0,2038 # 57b8 <malloc+0x8ac> + fca: 68f030ef jal ra,4e58 <printf> + exit(1); + fce: 4505 li a0,1 + fd0: 265030ef jal ra,4a34 <exit> + +0000000000000fd4 <pgbug>: +{ + fd4: 7179 addi sp,sp,-48 + fd6: f406 sd ra,40(sp) + fd8: f022 sd s0,32(sp) + fda: ec26 sd s1,24(sp) + fdc: 1800 addi s0,sp,48 + argv[0] = 0; + fde: fc043c23 sd zero,-40(s0) + exec(big, argv); + fe2: 00007497 auipc s1,0x7 + fe6: 01e48493 addi s1,s1,30 # 8000 <big> + fea: fd840593 addi a1,s0,-40 + fee: 6088 ld a0,0(s1) + ff0: 27d030ef jal ra,4a6c <exec> + pipe(big); + ff4: 6088 ld a0,0(s1) + ff6: 24f030ef jal ra,4a44 <pipe> + exit(0); + ffa: 4501 li a0,0 + ffc: 239030ef jal ra,4a34 <exit> + +0000000000001000 <badarg>: +{ + 1000: 7139 addi sp,sp,-64 + 1002: fc06 sd ra,56(sp) + 1004: f822 sd s0,48(sp) + 1006: f426 sd s1,40(sp) + 1008: f04a sd s2,32(sp) + 100a: ec4e sd s3,24(sp) + 100c: 0080 addi s0,sp,64 + 100e: 64b1 lui s1,0xc + 1010: 35048493 addi s1,s1,848 # c350 <buf+0x6d8> + argv[0] = (char*)0xffffffff; + 1014: 597d li s2,-1 + 1016: 02095913 srli s2,s2,0x20 + exec("echo", argv); + 101a: 00004997 auipc s3,0x4 + 101e: 00e98993 addi s3,s3,14 # 5028 <malloc+0x11c> + argv[0] = (char*)0xffffffff; + 1022: fd243023 sd s2,-64(s0) + argv[1] = 0; + 1026: fc043423 sd zero,-56(s0) + exec("echo", argv); + 102a: fc040593 addi a1,s0,-64 + 102e: 854e mv a0,s3 + 1030: 23d030ef jal ra,4a6c <exec> + for(int i = 0; i < 50000; i++){ + 1034: 34fd addiw s1,s1,-1 + 1036: f4f5 bnez s1,1022 <badarg+0x22> + exit(0); + 1038: 4501 li a0,0 + 103a: 1fb030ef jal ra,4a34 <exit> + +000000000000103e <copyinstr2>: +{ + 103e: 7155 addi sp,sp,-208 + 1040: e586 sd ra,200(sp) + 1042: e1a2 sd s0,192(sp) + 1044: 0980 addi s0,sp,208 + for(int i = 0; i < MAXPATH; i++) + 1046: f6840793 addi a5,s0,-152 + 104a: fe840693 addi a3,s0,-24 + b[i] = 'x'; + 104e: 07800713 li a4,120 + 1052: 00e78023 sb a4,0(a5) + for(int i = 0; i < MAXPATH; i++) + 1056: 0785 addi a5,a5,1 + 1058: fed79de3 bne a5,a3,1052 <copyinstr2+0x14> + b[MAXPATH] = '\0'; + 105c: fe040423 sb zero,-24(s0) + int ret = unlink(b); + 1060: f6840513 addi a0,s0,-152 + 1064: 221030ef jal ra,4a84 <unlink> + if(ret != -1){ + 1068: 57fd li a5,-1 + 106a: 0cf51263 bne a0,a5,112e <copyinstr2+0xf0> + int fd = open(b, O_CREATE | O_WRONLY); + 106e: 20100593 li a1,513 + 1072: f6840513 addi a0,s0,-152 + 1076: 1ff030ef jal ra,4a74 <open> + if(fd != -1){ + 107a: 57fd li a5,-1 + 107c: 0cf51563 bne a0,a5,1146 <copyinstr2+0x108> + ret = link(b, b); + 1080: f6840593 addi a1,s0,-152 + 1084: 852e mv a0,a1 + 1086: 20f030ef jal ra,4a94 <link> + if(ret != -1){ + 108a: 57fd li a5,-1 + 108c: 0cf51963 bne a0,a5,115e <copyinstr2+0x120> + char *args[] = { "xx", 0 }; + 1090: 00006797 auipc a5,0x6 + 1094: 87878793 addi a5,a5,-1928 # 6908 <malloc+0x19fc> + 1098: f4f43c23 sd a5,-168(s0) + 109c: f6043023 sd zero,-160(s0) + ret = exec(b, args); + 10a0: f5840593 addi a1,s0,-168 + 10a4: f6840513 addi a0,s0,-152 + 10a8: 1c5030ef jal ra,4a6c <exec> + if(ret != -1){ + 10ac: 57fd li a5,-1 + 10ae: 0cf51563 bne a0,a5,1178 <copyinstr2+0x13a> + int pid = fork(); + 10b2: 17b030ef jal ra,4a2c <fork> + if(pid < 0){ + 10b6: 0c054d63 bltz a0,1190 <copyinstr2+0x152> + if(pid == 0){ + 10ba: 0e051863 bnez a0,11aa <copyinstr2+0x16c> + 10be: 00007797 auipc a5,0x7 + 10c2: 4a278793 addi a5,a5,1186 # 8560 <big.0> + 10c6: 00008697 auipc a3,0x8 + 10ca: 49a68693 addi a3,a3,1178 # 9560 <big.0+0x1000> + big[i] = 'x'; + 10ce: 07800713 li a4,120 + 10d2: 00e78023 sb a4,0(a5) + for(int i = 0; i < PGSIZE; i++) + 10d6: 0785 addi a5,a5,1 + 10d8: fed79de3 bne a5,a3,10d2 <copyinstr2+0x94> + big[PGSIZE] = '\0'; + 10dc: 00008797 auipc a5,0x8 + 10e0: 48078223 sb zero,1156(a5) # 9560 <big.0+0x1000> + char *args2[] = { big, big, big, 0 }; + 10e4: 00006797 auipc a5,0x6 + 10e8: 29c78793 addi a5,a5,668 # 7380 <malloc+0x2474> + 10ec: 6fb0 ld a2,88(a5) + 10ee: 73b4 ld a3,96(a5) + 10f0: 77b8 ld a4,104(a5) + 10f2: 7bbc ld a5,112(a5) + 10f4: f2c43823 sd a2,-208(s0) + 10f8: f2d43c23 sd a3,-200(s0) + 10fc: f4e43023 sd a4,-192(s0) + 1100: f4f43423 sd a5,-184(s0) + ret = exec("echo", args2); + 1104: f3040593 addi a1,s0,-208 + 1108: 00004517 auipc a0,0x4 + 110c: f2050513 addi a0,a0,-224 # 5028 <malloc+0x11c> + 1110: 15d030ef jal ra,4a6c <exec> + if(ret != -1){ + 1114: 57fd li a5,-1 + 1116: 08f50663 beq a0,a5,11a2 <copyinstr2+0x164> + printf("exec(echo, BIG) returned %d, not -1\n", fd); + 111a: 55fd li a1,-1 + 111c: 00004517 auipc a0,0x4 + 1120: 74450513 addi a0,a0,1860 # 5860 <malloc+0x954> + 1124: 535030ef jal ra,4e58 <printf> + exit(1); + 1128: 4505 li a0,1 + 112a: 10b030ef jal ra,4a34 <exit> + printf("unlink(%s) returned %d, not -1\n", b, ret); + 112e: 862a mv a2,a0 + 1130: f6840593 addi a1,s0,-152 + 1134: 00004517 auipc a0,0x4 + 1138: 6a450513 addi a0,a0,1700 # 57d8 <malloc+0x8cc> + 113c: 51d030ef jal ra,4e58 <printf> + exit(1); + 1140: 4505 li a0,1 + 1142: 0f3030ef jal ra,4a34 <exit> + printf("open(%s) returned %d, not -1\n", b, fd); + 1146: 862a mv a2,a0 + 1148: f6840593 addi a1,s0,-152 + 114c: 00004517 auipc a0,0x4 + 1150: 6ac50513 addi a0,a0,1708 # 57f8 <malloc+0x8ec> + 1154: 505030ef jal ra,4e58 <printf> + exit(1); + 1158: 4505 li a0,1 + 115a: 0db030ef jal ra,4a34 <exit> + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 115e: 86aa mv a3,a0 + 1160: f6840613 addi a2,s0,-152 + 1164: 85b2 mv a1,a2 + 1166: 00004517 auipc a0,0x4 + 116a: 6b250513 addi a0,a0,1714 # 5818 <malloc+0x90c> + 116e: 4eb030ef jal ra,4e58 <printf> + exit(1); + 1172: 4505 li a0,1 + 1174: 0c1030ef jal ra,4a34 <exit> + printf("exec(%s) returned %d, not -1\n", b, fd); + 1178: 567d li a2,-1 + 117a: f6840593 addi a1,s0,-152 + 117e: 00004517 auipc a0,0x4 + 1182: 6c250513 addi a0,a0,1730 # 5840 <malloc+0x934> + 1186: 4d3030ef jal ra,4e58 <printf> + exit(1); + 118a: 4505 li a0,1 + 118c: 0a9030ef jal ra,4a34 <exit> + printf("fork failed\n"); + 1190: 00006517 auipc a0,0x6 + 1194: c9850513 addi a0,a0,-872 # 6e28 <malloc+0x1f1c> + 1198: 4c1030ef jal ra,4e58 <printf> + exit(1); + 119c: 4505 li a0,1 + 119e: 097030ef jal ra,4a34 <exit> + exit(747); // OK + 11a2: 2eb00513 li a0,747 + 11a6: 08f030ef jal ra,4a34 <exit> + int st = 0; + 11aa: f4042a23 sw zero,-172(s0) + wait(&st); + 11ae: f5440513 addi a0,s0,-172 + 11b2: 08b030ef jal ra,4a3c <wait> + if(st != 747){ + 11b6: f5442703 lw a4,-172(s0) + 11ba: 2eb00793 li a5,747 + 11be: 00f71663 bne a4,a5,11ca <copyinstr2+0x18c> +} + 11c2: 60ae ld ra,200(sp) + 11c4: 640e ld s0,192(sp) + 11c6: 6169 addi sp,sp,208 + 11c8: 8082 ret + printf("exec(echo, BIG) succeeded, should have failed\n"); + 11ca: 00004517 auipc a0,0x4 + 11ce: 6be50513 addi a0,a0,1726 # 5888 <malloc+0x97c> + 11d2: 487030ef jal ra,4e58 <printf> + exit(1); + 11d6: 4505 li a0,1 + 11d8: 05d030ef jal ra,4a34 <exit> + +00000000000011dc <truncate3>: +{ + 11dc: 7159 addi sp,sp,-112 + 11de: f486 sd ra,104(sp) + 11e0: f0a2 sd s0,96(sp) + 11e2: eca6 sd s1,88(sp) + 11e4: e8ca sd s2,80(sp) + 11e6: e4ce sd s3,72(sp) + 11e8: e0d2 sd s4,64(sp) + 11ea: fc56 sd s5,56(sp) + 11ec: 1880 addi s0,sp,112 + 11ee: 892a mv s2,a0 + close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY)); + 11f0: 60100593 li a1,1537 + 11f4: 00004517 auipc a0,0x4 + 11f8: e8c50513 addi a0,a0,-372 # 5080 <malloc+0x174> + 11fc: 079030ef jal ra,4a74 <open> + 1200: 05d030ef jal ra,4a5c <close> + pid = fork(); + 1204: 029030ef jal ra,4a2c <fork> + if(pid < 0){ + 1208: 06054263 bltz a0,126c <truncate3+0x90> + if(pid == 0){ + 120c: ed59 bnez a0,12aa <truncate3+0xce> + 120e: 06400993 li s3,100 + int fd = open("truncfile", O_WRONLY); + 1212: 00004a17 auipc s4,0x4 + 1216: e6ea0a13 addi s4,s4,-402 # 5080 <malloc+0x174> + int n = write(fd, "1234567890", 10); + 121a: 00004a97 auipc s5,0x4 + 121e: 6cea8a93 addi s5,s5,1742 # 58e8 <malloc+0x9dc> + int fd = open("truncfile", O_WRONLY); + 1222: 4585 li a1,1 + 1224: 8552 mv a0,s4 + 1226: 04f030ef jal ra,4a74 <open> + 122a: 84aa mv s1,a0 + if(fd < 0){ + 122c: 04054a63 bltz a0,1280 <truncate3+0xa4> + int n = write(fd, "1234567890", 10); + 1230: 4629 li a2,10 + 1232: 85d6 mv a1,s5 + 1234: 021030ef jal ra,4a54 <write> + if(n != 10){ + 1238: 47a9 li a5,10 + 123a: 04f51d63 bne a0,a5,1294 <truncate3+0xb8> + close(fd); + 123e: 8526 mv a0,s1 + 1240: 01d030ef jal ra,4a5c <close> + fd = open("truncfile", O_RDONLY); + 1244: 4581 li a1,0 + 1246: 8552 mv a0,s4 + 1248: 02d030ef jal ra,4a74 <open> + 124c: 84aa mv s1,a0 + read(fd, buf, sizeof(buf)); + 124e: 02000613 li a2,32 + 1252: f9840593 addi a1,s0,-104 + 1256: 7f6030ef jal ra,4a4c <read> + close(fd); + 125a: 8526 mv a0,s1 + 125c: 001030ef jal ra,4a5c <close> + for(int i = 0; i < 100; i++){ + 1260: 39fd addiw s3,s3,-1 + 1262: fc0990e3 bnez s3,1222 <truncate3+0x46> + exit(0); + 1266: 4501 li a0,0 + 1268: 7cc030ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 126c: 85ca mv a1,s2 + 126e: 00004517 auipc a0,0x4 + 1272: 64a50513 addi a0,a0,1610 # 58b8 <malloc+0x9ac> + 1276: 3e3030ef jal ra,4e58 <printf> + exit(1); + 127a: 4505 li a0,1 + 127c: 7b8030ef jal ra,4a34 <exit> + printf("%s: open failed\n", s); + 1280: 85ca mv a1,s2 + 1282: 00004517 auipc a0,0x4 + 1286: 64e50513 addi a0,a0,1614 # 58d0 <malloc+0x9c4> + 128a: 3cf030ef jal ra,4e58 <printf> + exit(1); + 128e: 4505 li a0,1 + 1290: 7a4030ef jal ra,4a34 <exit> + printf("%s: write got %d, expected 10\n", s, n); + 1294: 862a mv a2,a0 + 1296: 85ca mv a1,s2 + 1298: 00004517 auipc a0,0x4 + 129c: 66050513 addi a0,a0,1632 # 58f8 <malloc+0x9ec> + 12a0: 3b9030ef jal ra,4e58 <printf> + exit(1); + 12a4: 4505 li a0,1 + 12a6: 78e030ef jal ra,4a34 <exit> + 12aa: 09600993 li s3,150 + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12ae: 00004a17 auipc s4,0x4 + 12b2: dd2a0a13 addi s4,s4,-558 # 5080 <malloc+0x174> + int n = write(fd, "xxx", 3); + 12b6: 00004a97 auipc s5,0x4 + 12ba: 662a8a93 addi s5,s5,1634 # 5918 <malloc+0xa0c> + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12be: 60100593 li a1,1537 + 12c2: 8552 mv a0,s4 + 12c4: 7b0030ef jal ra,4a74 <open> + 12c8: 84aa mv s1,a0 + if(fd < 0){ + 12ca: 02054d63 bltz a0,1304 <truncate3+0x128> + int n = write(fd, "xxx", 3); + 12ce: 460d li a2,3 + 12d0: 85d6 mv a1,s5 + 12d2: 782030ef jal ra,4a54 <write> + if(n != 3){ + 12d6: 478d li a5,3 + 12d8: 04f51063 bne a0,a5,1318 <truncate3+0x13c> + close(fd); + 12dc: 8526 mv a0,s1 + 12de: 77e030ef jal ra,4a5c <close> + for(int i = 0; i < 150; i++){ + 12e2: 39fd addiw s3,s3,-1 + 12e4: fc099de3 bnez s3,12be <truncate3+0xe2> + wait(&xstatus); + 12e8: fbc40513 addi a0,s0,-68 + 12ec: 750030ef jal ra,4a3c <wait> + unlink("truncfile"); + 12f0: 00004517 auipc a0,0x4 + 12f4: d9050513 addi a0,a0,-624 # 5080 <malloc+0x174> + 12f8: 78c030ef jal ra,4a84 <unlink> + exit(xstatus); + 12fc: fbc42503 lw a0,-68(s0) + 1300: 734030ef jal ra,4a34 <exit> + printf("%s: open failed\n", s); + 1304: 85ca mv a1,s2 + 1306: 00004517 auipc a0,0x4 + 130a: 5ca50513 addi a0,a0,1482 # 58d0 <malloc+0x9c4> + 130e: 34b030ef jal ra,4e58 <printf> + exit(1); + 1312: 4505 li a0,1 + 1314: 720030ef jal ra,4a34 <exit> + printf("%s: write got %d, expected 3\n", s, n); + 1318: 862a mv a2,a0 + 131a: 85ca mv a1,s2 + 131c: 00004517 auipc a0,0x4 + 1320: 60450513 addi a0,a0,1540 # 5920 <malloc+0xa14> + 1324: 335030ef jal ra,4e58 <printf> + exit(1); + 1328: 4505 li a0,1 + 132a: 70a030ef jal ra,4a34 <exit> + +000000000000132e <exectest>: +{ + 132e: 715d addi sp,sp,-80 + 1330: e486 sd ra,72(sp) + 1332: e0a2 sd s0,64(sp) + 1334: fc26 sd s1,56(sp) + 1336: f84a sd s2,48(sp) + 1338: 0880 addi s0,sp,80 + 133a: 892a mv s2,a0 + char *echoargv[] = { "echo", "OK", 0 }; + 133c: 00004797 auipc a5,0x4 + 1340: cec78793 addi a5,a5,-788 # 5028 <malloc+0x11c> + 1344: fcf43023 sd a5,-64(s0) + 1348: 00004797 auipc a5,0x4 + 134c: 5f878793 addi a5,a5,1528 # 5940 <malloc+0xa34> + 1350: fcf43423 sd a5,-56(s0) + 1354: fc043823 sd zero,-48(s0) + unlink("echo-ok"); + 1358: 00004517 auipc a0,0x4 + 135c: 5f050513 addi a0,a0,1520 # 5948 <malloc+0xa3c> + 1360: 724030ef jal ra,4a84 <unlink> + pid = fork(); + 1364: 6c8030ef jal ra,4a2c <fork> + if(pid < 0) { + 1368: 02054e63 bltz a0,13a4 <exectest+0x76> + 136c: 84aa mv s1,a0 + if(pid == 0) { + 136e: e92d bnez a0,13e0 <exectest+0xb2> + close(1); + 1370: 4505 li a0,1 + 1372: 6ea030ef jal ra,4a5c <close> + fd = open("echo-ok", O_CREATE|O_WRONLY); + 1376: 20100593 li a1,513 + 137a: 00004517 auipc a0,0x4 + 137e: 5ce50513 addi a0,a0,1486 # 5948 <malloc+0xa3c> + 1382: 6f2030ef jal ra,4a74 <open> + if(fd < 0) { + 1386: 02054963 bltz a0,13b8 <exectest+0x8a> + if(fd != 1) { + 138a: 4785 li a5,1 + 138c: 04f50063 beq a0,a5,13cc <exectest+0x9e> + printf("%s: wrong fd\n", s); + 1390: 85ca mv a1,s2 + 1392: 00004517 auipc a0,0x4 + 1396: 5d650513 addi a0,a0,1494 # 5968 <malloc+0xa5c> + 139a: 2bf030ef jal ra,4e58 <printf> + exit(1); + 139e: 4505 li a0,1 + 13a0: 694030ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 13a4: 85ca mv a1,s2 + 13a6: 00004517 auipc a0,0x4 + 13aa: 51250513 addi a0,a0,1298 # 58b8 <malloc+0x9ac> + 13ae: 2ab030ef jal ra,4e58 <printf> + exit(1); + 13b2: 4505 li a0,1 + 13b4: 680030ef jal ra,4a34 <exit> + printf("%s: create failed\n", s); + 13b8: 85ca mv a1,s2 + 13ba: 00004517 auipc a0,0x4 + 13be: 59650513 addi a0,a0,1430 # 5950 <malloc+0xa44> + 13c2: 297030ef jal ra,4e58 <printf> + exit(1); + 13c6: 4505 li a0,1 + 13c8: 66c030ef jal ra,4a34 <exit> + if(exec("echo", echoargv) < 0){ + 13cc: fc040593 addi a1,s0,-64 + 13d0: 00004517 auipc a0,0x4 + 13d4: c5850513 addi a0,a0,-936 # 5028 <malloc+0x11c> + 13d8: 694030ef jal ra,4a6c <exec> + 13dc: 00054d63 bltz a0,13f6 <exectest+0xc8> + if (wait(&xstatus) != pid) { + 13e0: fdc40513 addi a0,s0,-36 + 13e4: 658030ef jal ra,4a3c <wait> + 13e8: 02951163 bne a0,s1,140a <exectest+0xdc> + if(xstatus != 0) + 13ec: fdc42503 lw a0,-36(s0) + 13f0: c50d beqz a0,141a <exectest+0xec> + exit(xstatus); + 13f2: 642030ef jal ra,4a34 <exit> + printf("%s: exec echo failed\n", s); + 13f6: 85ca mv a1,s2 + 13f8: 00004517 auipc a0,0x4 + 13fc: 58050513 addi a0,a0,1408 # 5978 <malloc+0xa6c> + 1400: 259030ef jal ra,4e58 <printf> + exit(1); + 1404: 4505 li a0,1 + 1406: 62e030ef jal ra,4a34 <exit> + printf("%s: wait failed!\n", s); + 140a: 85ca mv a1,s2 + 140c: 00004517 auipc a0,0x4 + 1410: 58450513 addi a0,a0,1412 # 5990 <malloc+0xa84> + 1414: 245030ef jal ra,4e58 <printf> + 1418: bfd1 j 13ec <exectest+0xbe> + fd = open("echo-ok", O_RDONLY); + 141a: 4581 li a1,0 + 141c: 00004517 auipc a0,0x4 + 1420: 52c50513 addi a0,a0,1324 # 5948 <malloc+0xa3c> + 1424: 650030ef jal ra,4a74 <open> + if(fd < 0) { + 1428: 02054463 bltz a0,1450 <exectest+0x122> + if (read(fd, buf, 2) != 2) { + 142c: 4609 li a2,2 + 142e: fb840593 addi a1,s0,-72 + 1432: 61a030ef jal ra,4a4c <read> + 1436: 4789 li a5,2 + 1438: 02f50663 beq a0,a5,1464 <exectest+0x136> + printf("%s: read failed\n", s); + 143c: 85ca mv a1,s2 + 143e: 00004517 auipc a0,0x4 + 1442: fba50513 addi a0,a0,-70 # 53f8 <malloc+0x4ec> + 1446: 213030ef jal ra,4e58 <printf> + exit(1); + 144a: 4505 li a0,1 + 144c: 5e8030ef jal ra,4a34 <exit> + printf("%s: open failed\n", s); + 1450: 85ca mv a1,s2 + 1452: 00004517 auipc a0,0x4 + 1456: 47e50513 addi a0,a0,1150 # 58d0 <malloc+0x9c4> + 145a: 1ff030ef jal ra,4e58 <printf> + exit(1); + 145e: 4505 li a0,1 + 1460: 5d4030ef jal ra,4a34 <exit> + unlink("echo-ok"); + 1464: 00004517 auipc a0,0x4 + 1468: 4e450513 addi a0,a0,1252 # 5948 <malloc+0xa3c> + 146c: 618030ef jal ra,4a84 <unlink> + if(buf[0] == 'O' && buf[1] == 'K') + 1470: fb844703 lbu a4,-72(s0) + 1474: 04f00793 li a5,79 + 1478: 00f71863 bne a4,a5,1488 <exectest+0x15a> + 147c: fb944703 lbu a4,-71(s0) + 1480: 04b00793 li a5,75 + 1484: 00f70c63 beq a4,a5,149c <exectest+0x16e> + printf("%s: wrong output\n", s); + 1488: 85ca mv a1,s2 + 148a: 00004517 auipc a0,0x4 + 148e: 51e50513 addi a0,a0,1310 # 59a8 <malloc+0xa9c> + 1492: 1c7030ef jal ra,4e58 <printf> + exit(1); + 1496: 4505 li a0,1 + 1498: 59c030ef jal ra,4a34 <exit> + exit(0); + 149c: 4501 li a0,0 + 149e: 596030ef jal ra,4a34 <exit> + +00000000000014a2 <pipe1>: +{ + 14a2: 711d addi sp,sp,-96 + 14a4: ec86 sd ra,88(sp) + 14a6: e8a2 sd s0,80(sp) + 14a8: e4a6 sd s1,72(sp) + 14aa: e0ca sd s2,64(sp) + 14ac: fc4e sd s3,56(sp) + 14ae: f852 sd s4,48(sp) + 14b0: f456 sd s5,40(sp) + 14b2: f05a sd s6,32(sp) + 14b4: ec5e sd s7,24(sp) + 14b6: 1080 addi s0,sp,96 + 14b8: 892a mv s2,a0 + if(pipe(fds) != 0){ + 14ba: fa840513 addi a0,s0,-88 + 14be: 586030ef jal ra,4a44 <pipe> + 14c2: e52d bnez a0,152c <pipe1+0x8a> + 14c4: 84aa mv s1,a0 + pid = fork(); + 14c6: 566030ef jal ra,4a2c <fork> + 14ca: 8a2a mv s4,a0 + if(pid == 0){ + 14cc: c935 beqz a0,1540 <pipe1+0x9e> + } else if(pid > 0){ + 14ce: 14a05063 blez a0,160e <pipe1+0x16c> + close(fds[1]); + 14d2: fac42503 lw a0,-84(s0) + 14d6: 586030ef jal ra,4a5c <close> + total = 0; + 14da: 8a26 mv s4,s1 + cc = 1; + 14dc: 4985 li s3,1 + while((n = read(fds[0], buf, cc)) > 0){ + 14de: 0000aa97 auipc s5,0xa + 14e2: 79aa8a93 addi s5,s5,1946 # bc78 <buf> + if(cc > sizeof(buf)) + 14e6: 6b0d lui s6,0x3 + while((n = read(fds[0], buf, cc)) > 0){ + 14e8: 864e mv a2,s3 + 14ea: 85d6 mv a1,s5 + 14ec: fa842503 lw a0,-88(s0) + 14f0: 55c030ef jal ra,4a4c <read> + 14f4: 0ea05163 blez a0,15d6 <pipe1+0x134> + for(i = 0; i < n; i++){ + 14f8: 0000a717 auipc a4,0xa + 14fc: 78070713 addi a4,a4,1920 # bc78 <buf> + 1500: 00a4863b addw a2,s1,a0 + if((buf[i] & 0xff) != (seq++ & 0xff)){ + 1504: 00074683 lbu a3,0(a4) + 1508: 0ff4f793 zext.b a5,s1 + 150c: 2485 addiw s1,s1,1 + 150e: 0af69263 bne a3,a5,15b2 <pipe1+0x110> + for(i = 0; i < n; i++){ + 1512: 0705 addi a4,a4,1 + 1514: fec498e3 bne s1,a2,1504 <pipe1+0x62> + total += n; + 1518: 00aa0a3b addw s4,s4,a0 + cc = cc * 2; + 151c: 0019979b slliw a5,s3,0x1 + 1520: 0007899b sext.w s3,a5 + if(cc > sizeof(buf)) + 1524: fd3b72e3 bgeu s6,s3,14e8 <pipe1+0x46> + cc = sizeof(buf); + 1528: 89da mv s3,s6 + 152a: bf7d j 14e8 <pipe1+0x46> + printf("%s: pipe() failed\n", s); + 152c: 85ca mv a1,s2 + 152e: 00004517 auipc a0,0x4 + 1532: 49250513 addi a0,a0,1170 # 59c0 <malloc+0xab4> + 1536: 123030ef jal ra,4e58 <printf> + exit(1); + 153a: 4505 li a0,1 + 153c: 4f8030ef jal ra,4a34 <exit> + close(fds[0]); + 1540: fa842503 lw a0,-88(s0) + 1544: 518030ef jal ra,4a5c <close> + for(n = 0; n < N; n++){ + 1548: 0000ab17 auipc s6,0xa + 154c: 730b0b13 addi s6,s6,1840 # bc78 <buf> + 1550: 416004bb negw s1,s6 + 1554: 0ff4f493 zext.b s1,s1 + 1558: 409b0993 addi s3,s6,1033 + if(write(fds[1], buf, SZ) != SZ){ + 155c: 8bda mv s7,s6 + for(n = 0; n < N; n++){ + 155e: 6a85 lui s5,0x1 + 1560: 42da8a93 addi s5,s5,1069 # 142d <exectest+0xff> +{ + 1564: 87da mv a5,s6 + buf[i] = seq++; + 1566: 0097873b addw a4,a5,s1 + 156a: 00e78023 sb a4,0(a5) + for(i = 0; i < SZ; i++) + 156e: 0785 addi a5,a5,1 + 1570: fef99be3 bne s3,a5,1566 <pipe1+0xc4> + buf[i] = seq++; + 1574: 409a0a1b addiw s4,s4,1033 + if(write(fds[1], buf, SZ) != SZ){ + 1578: 40900613 li a2,1033 + 157c: 85de mv a1,s7 + 157e: fac42503 lw a0,-84(s0) + 1582: 4d2030ef jal ra,4a54 <write> + 1586: 40900793 li a5,1033 + 158a: 00f51a63 bne a0,a5,159e <pipe1+0xfc> + for(n = 0; n < N; n++){ + 158e: 24a5 addiw s1,s1,9 + 1590: 0ff4f493 zext.b s1,s1 + 1594: fd5a18e3 bne s4,s5,1564 <pipe1+0xc2> + exit(0); + 1598: 4501 li a0,0 + 159a: 49a030ef jal ra,4a34 <exit> + printf("%s: pipe1 oops 1\n", s); + 159e: 85ca mv a1,s2 + 15a0: 00004517 auipc a0,0x4 + 15a4: 43850513 addi a0,a0,1080 # 59d8 <malloc+0xacc> + 15a8: 0b1030ef jal ra,4e58 <printf> + exit(1); + 15ac: 4505 li a0,1 + 15ae: 486030ef jal ra,4a34 <exit> + printf("%s: pipe1 oops 2\n", s); + 15b2: 85ca mv a1,s2 + 15b4: 00004517 auipc a0,0x4 + 15b8: 43c50513 addi a0,a0,1084 # 59f0 <malloc+0xae4> + 15bc: 09d030ef jal ra,4e58 <printf> +} + 15c0: 60e6 ld ra,88(sp) + 15c2: 6446 ld s0,80(sp) + 15c4: 64a6 ld s1,72(sp) + 15c6: 6906 ld s2,64(sp) + 15c8: 79e2 ld s3,56(sp) + 15ca: 7a42 ld s4,48(sp) + 15cc: 7aa2 ld s5,40(sp) + 15ce: 7b02 ld s6,32(sp) + 15d0: 6be2 ld s7,24(sp) + 15d2: 6125 addi sp,sp,96 + 15d4: 8082 ret + if(total != N * SZ){ + 15d6: 6785 lui a5,0x1 + 15d8: 42d78793 addi a5,a5,1069 # 142d <exectest+0xff> + 15dc: 00fa0d63 beq s4,a5,15f6 <pipe1+0x154> + printf("%s: pipe1 oops 3 total %d\n", s, total); + 15e0: 8652 mv a2,s4 + 15e2: 85ca mv a1,s2 + 15e4: 00004517 auipc a0,0x4 + 15e8: 42450513 addi a0,a0,1060 # 5a08 <malloc+0xafc> + 15ec: 06d030ef jal ra,4e58 <printf> + exit(1); + 15f0: 4505 li a0,1 + 15f2: 442030ef jal ra,4a34 <exit> + close(fds[0]); + 15f6: fa842503 lw a0,-88(s0) + 15fa: 462030ef jal ra,4a5c <close> + wait(&xstatus); + 15fe: fa440513 addi a0,s0,-92 + 1602: 43a030ef jal ra,4a3c <wait> + exit(xstatus); + 1606: fa442503 lw a0,-92(s0) + 160a: 42a030ef jal ra,4a34 <exit> + printf("%s: fork() failed\n", s); + 160e: 85ca mv a1,s2 + 1610: 00004517 auipc a0,0x4 + 1614: 41850513 addi a0,a0,1048 # 5a28 <malloc+0xb1c> + 1618: 041030ef jal ra,4e58 <printf> + exit(1); + 161c: 4505 li a0,1 + 161e: 416030ef jal ra,4a34 <exit> + +0000000000001622 <exitwait>: +{ + 1622: 7139 addi sp,sp,-64 + 1624: fc06 sd ra,56(sp) + 1626: f822 sd s0,48(sp) + 1628: f426 sd s1,40(sp) + 162a: f04a sd s2,32(sp) + 162c: ec4e sd s3,24(sp) + 162e: e852 sd s4,16(sp) + 1630: 0080 addi s0,sp,64 + 1632: 8a2a mv s4,a0 + for(i = 0; i < 100; i++){ + 1634: 4901 li s2,0 + 1636: 06400993 li s3,100 + pid = fork(); + 163a: 3f2030ef jal ra,4a2c <fork> + 163e: 84aa mv s1,a0 + if(pid < 0){ + 1640: 02054863 bltz a0,1670 <exitwait+0x4e> + if(pid){ + 1644: c525 beqz a0,16ac <exitwait+0x8a> + if(wait(&xstate) != pid){ + 1646: fcc40513 addi a0,s0,-52 + 164a: 3f2030ef jal ra,4a3c <wait> + 164e: 02951b63 bne a0,s1,1684 <exitwait+0x62> + if(i != xstate) { + 1652: fcc42783 lw a5,-52(s0) + 1656: 05279163 bne a5,s2,1698 <exitwait+0x76> + for(i = 0; i < 100; i++){ + 165a: 2905 addiw s2,s2,1 + 165c: fd391fe3 bne s2,s3,163a <exitwait+0x18> +} + 1660: 70e2 ld ra,56(sp) + 1662: 7442 ld s0,48(sp) + 1664: 74a2 ld s1,40(sp) + 1666: 7902 ld s2,32(sp) + 1668: 69e2 ld s3,24(sp) + 166a: 6a42 ld s4,16(sp) + 166c: 6121 addi sp,sp,64 + 166e: 8082 ret + printf("%s: fork failed\n", s); + 1670: 85d2 mv a1,s4 + 1672: 00004517 auipc a0,0x4 + 1676: 24650513 addi a0,a0,582 # 58b8 <malloc+0x9ac> + 167a: 7de030ef jal ra,4e58 <printf> + exit(1); + 167e: 4505 li a0,1 + 1680: 3b4030ef jal ra,4a34 <exit> + printf("%s: wait wrong pid\n", s); + 1684: 85d2 mv a1,s4 + 1686: 00004517 auipc a0,0x4 + 168a: 3ba50513 addi a0,a0,954 # 5a40 <malloc+0xb34> + 168e: 7ca030ef jal ra,4e58 <printf> + exit(1); + 1692: 4505 li a0,1 + 1694: 3a0030ef jal ra,4a34 <exit> + printf("%s: wait wrong exit status\n", s); + 1698: 85d2 mv a1,s4 + 169a: 00004517 auipc a0,0x4 + 169e: 3be50513 addi a0,a0,958 # 5a58 <malloc+0xb4c> + 16a2: 7b6030ef jal ra,4e58 <printf> + exit(1); + 16a6: 4505 li a0,1 + 16a8: 38c030ef jal ra,4a34 <exit> + exit(i); + 16ac: 854a mv a0,s2 + 16ae: 386030ef jal ra,4a34 <exit> + +00000000000016b2 <twochildren>: +{ + 16b2: 1101 addi sp,sp,-32 + 16b4: ec06 sd ra,24(sp) + 16b6: e822 sd s0,16(sp) + 16b8: e426 sd s1,8(sp) + 16ba: e04a sd s2,0(sp) + 16bc: 1000 addi s0,sp,32 + 16be: 892a mv s2,a0 + 16c0: 3e800493 li s1,1000 + int pid1 = fork(); + 16c4: 368030ef jal ra,4a2c <fork> + if(pid1 < 0){ + 16c8: 02054663 bltz a0,16f4 <twochildren+0x42> + if(pid1 == 0){ + 16cc: cd15 beqz a0,1708 <twochildren+0x56> + int pid2 = fork(); + 16ce: 35e030ef jal ra,4a2c <fork> + if(pid2 < 0){ + 16d2: 02054d63 bltz a0,170c <twochildren+0x5a> + if(pid2 == 0){ + 16d6: c529 beqz a0,1720 <twochildren+0x6e> + wait(0); + 16d8: 4501 li a0,0 + 16da: 362030ef jal ra,4a3c <wait> + wait(0); + 16de: 4501 li a0,0 + 16e0: 35c030ef jal ra,4a3c <wait> + for(int i = 0; i < 1000; i++){ + 16e4: 34fd addiw s1,s1,-1 + 16e6: fcf9 bnez s1,16c4 <twochildren+0x12> +} + 16e8: 60e2 ld ra,24(sp) + 16ea: 6442 ld s0,16(sp) + 16ec: 64a2 ld s1,8(sp) + 16ee: 6902 ld s2,0(sp) + 16f0: 6105 addi sp,sp,32 + 16f2: 8082 ret + printf("%s: fork failed\n", s); + 16f4: 85ca mv a1,s2 + 16f6: 00004517 auipc a0,0x4 + 16fa: 1c250513 addi a0,a0,450 # 58b8 <malloc+0x9ac> + 16fe: 75a030ef jal ra,4e58 <printf> + exit(1); + 1702: 4505 li a0,1 + 1704: 330030ef jal ra,4a34 <exit> + exit(0); + 1708: 32c030ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 170c: 85ca mv a1,s2 + 170e: 00004517 auipc a0,0x4 + 1712: 1aa50513 addi a0,a0,426 # 58b8 <malloc+0x9ac> + 1716: 742030ef jal ra,4e58 <printf> + exit(1); + 171a: 4505 li a0,1 + 171c: 318030ef jal ra,4a34 <exit> + exit(0); + 1720: 314030ef jal ra,4a34 <exit> + +0000000000001724 <forkfork>: +{ + 1724: 7179 addi sp,sp,-48 + 1726: f406 sd ra,40(sp) + 1728: f022 sd s0,32(sp) + 172a: ec26 sd s1,24(sp) + 172c: 1800 addi s0,sp,48 + 172e: 84aa mv s1,a0 + int pid = fork(); + 1730: 2fc030ef jal ra,4a2c <fork> + if(pid < 0){ + 1734: 02054b63 bltz a0,176a <forkfork+0x46> + if(pid == 0){ + 1738: c139 beqz a0,177e <forkfork+0x5a> + int pid = fork(); + 173a: 2f2030ef jal ra,4a2c <fork> + if(pid < 0){ + 173e: 02054663 bltz a0,176a <forkfork+0x46> + if(pid == 0){ + 1742: cd15 beqz a0,177e <forkfork+0x5a> + wait(&xstatus); + 1744: fdc40513 addi a0,s0,-36 + 1748: 2f4030ef jal ra,4a3c <wait> + if(xstatus != 0) { + 174c: fdc42783 lw a5,-36(s0) + 1750: ebb9 bnez a5,17a6 <forkfork+0x82> + wait(&xstatus); + 1752: fdc40513 addi a0,s0,-36 + 1756: 2e6030ef jal ra,4a3c <wait> + if(xstatus != 0) { + 175a: fdc42783 lw a5,-36(s0) + 175e: e7a1 bnez a5,17a6 <forkfork+0x82> +} + 1760: 70a2 ld ra,40(sp) + 1762: 7402 ld s0,32(sp) + 1764: 64e2 ld s1,24(sp) + 1766: 6145 addi sp,sp,48 + 1768: 8082 ret + printf("%s: fork failed", s); + 176a: 85a6 mv a1,s1 + 176c: 00004517 auipc a0,0x4 + 1770: 30c50513 addi a0,a0,780 # 5a78 <malloc+0xb6c> + 1774: 6e4030ef jal ra,4e58 <printf> + exit(1); + 1778: 4505 li a0,1 + 177a: 2ba030ef jal ra,4a34 <exit> +{ + 177e: 0c800493 li s1,200 + int pid1 = fork(); + 1782: 2aa030ef jal ra,4a2c <fork> + if(pid1 < 0){ + 1786: 00054b63 bltz a0,179c <forkfork+0x78> + if(pid1 == 0){ + 178a: cd01 beqz a0,17a2 <forkfork+0x7e> + wait(0); + 178c: 4501 li a0,0 + 178e: 2ae030ef jal ra,4a3c <wait> + for(int j = 0; j < 200; j++){ + 1792: 34fd addiw s1,s1,-1 + 1794: f4fd bnez s1,1782 <forkfork+0x5e> + exit(0); + 1796: 4501 li a0,0 + 1798: 29c030ef jal ra,4a34 <exit> + exit(1); + 179c: 4505 li a0,1 + 179e: 296030ef jal ra,4a34 <exit> + exit(0); + 17a2: 292030ef jal ra,4a34 <exit> + printf("%s: fork in child failed", s); + 17a6: 85a6 mv a1,s1 + 17a8: 00004517 auipc a0,0x4 + 17ac: 2e050513 addi a0,a0,736 # 5a88 <malloc+0xb7c> + 17b0: 6a8030ef jal ra,4e58 <printf> + exit(1); + 17b4: 4505 li a0,1 + 17b6: 27e030ef jal ra,4a34 <exit> + +00000000000017ba <reparent2>: +{ + 17ba: 1101 addi sp,sp,-32 + 17bc: ec06 sd ra,24(sp) + 17be: e822 sd s0,16(sp) + 17c0: e426 sd s1,8(sp) + 17c2: 1000 addi s0,sp,32 + 17c4: 32000493 li s1,800 + int pid1 = fork(); + 17c8: 264030ef jal ra,4a2c <fork> + if(pid1 < 0){ + 17cc: 00054b63 bltz a0,17e2 <reparent2+0x28> + if(pid1 == 0){ + 17d0: c115 beqz a0,17f4 <reparent2+0x3a> + wait(0); + 17d2: 4501 li a0,0 + 17d4: 268030ef jal ra,4a3c <wait> + for(int i = 0; i < 800; i++){ + 17d8: 34fd addiw s1,s1,-1 + 17da: f4fd bnez s1,17c8 <reparent2+0xe> + exit(0); + 17dc: 4501 li a0,0 + 17de: 256030ef jal ra,4a34 <exit> + printf("fork failed\n"); + 17e2: 00005517 auipc a0,0x5 + 17e6: 64650513 addi a0,a0,1606 # 6e28 <malloc+0x1f1c> + 17ea: 66e030ef jal ra,4e58 <printf> + exit(1); + 17ee: 4505 li a0,1 + 17f0: 244030ef jal ra,4a34 <exit> + fork(); + 17f4: 238030ef jal ra,4a2c <fork> + fork(); + 17f8: 234030ef jal ra,4a2c <fork> + exit(0); + 17fc: 4501 li a0,0 + 17fe: 236030ef jal ra,4a34 <exit> + +0000000000001802 <createdelete>: +{ + 1802: 7175 addi sp,sp,-144 + 1804: e506 sd ra,136(sp) + 1806: e122 sd s0,128(sp) + 1808: fca6 sd s1,120(sp) + 180a: f8ca sd s2,112(sp) + 180c: f4ce sd s3,104(sp) + 180e: f0d2 sd s4,96(sp) + 1810: ecd6 sd s5,88(sp) + 1812: e8da sd s6,80(sp) + 1814: e4de sd s7,72(sp) + 1816: e0e2 sd s8,64(sp) + 1818: fc66 sd s9,56(sp) + 181a: 0900 addi s0,sp,144 + 181c: 8caa mv s9,a0 + for(pi = 0; pi < NCHILD; pi++){ + 181e: 4901 li s2,0 + 1820: 4991 li s3,4 + pid = fork(); + 1822: 20a030ef jal ra,4a2c <fork> + 1826: 84aa mv s1,a0 + if(pid < 0){ + 1828: 02054d63 bltz a0,1862 <createdelete+0x60> + if(pid == 0){ + 182c: c529 beqz a0,1876 <createdelete+0x74> + for(pi = 0; pi < NCHILD; pi++){ + 182e: 2905 addiw s2,s2,1 + 1830: ff3919e3 bne s2,s3,1822 <createdelete+0x20> + 1834: 4491 li s1,4 + wait(&xstatus); + 1836: f7c40513 addi a0,s0,-132 + 183a: 202030ef jal ra,4a3c <wait> + if(xstatus != 0) + 183e: f7c42903 lw s2,-132(s0) + 1842: 0a091e63 bnez s2,18fe <createdelete+0xfc> + for(pi = 0; pi < NCHILD; pi++){ + 1846: 34fd addiw s1,s1,-1 + 1848: f4fd bnez s1,1836 <createdelete+0x34> + name[0] = name[1] = name[2] = 0; + 184a: f8040123 sb zero,-126(s0) + 184e: 03000993 li s3,48 + 1852: 5a7d li s4,-1 + 1854: 07000c13 li s8,112 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1858: 4b21 li s6,8 + if((i == 0 || i >= N/2) && fd < 0){ + 185a: 4ba5 li s7,9 + for(pi = 0; pi < NCHILD; pi++){ + 185c: 07400a93 li s5,116 + 1860: a20d j 1982 <createdelete+0x180> + printf("%s: fork failed\n", s); + 1862: 85e6 mv a1,s9 + 1864: 00004517 auipc a0,0x4 + 1868: 05450513 addi a0,a0,84 # 58b8 <malloc+0x9ac> + 186c: 5ec030ef jal ra,4e58 <printf> + exit(1); + 1870: 4505 li a0,1 + 1872: 1c2030ef jal ra,4a34 <exit> + name[0] = 'p' + pi; + 1876: 0709091b addiw s2,s2,112 + 187a: f9240023 sb s2,-128(s0) + name[2] = '\0'; + 187e: f8040123 sb zero,-126(s0) + for(i = 0; i < N; i++){ + 1882: 4951 li s2,20 + 1884: a831 j 18a0 <createdelete+0x9e> + printf("%s: create failed\n", s); + 1886: 85e6 mv a1,s9 + 1888: 00004517 auipc a0,0x4 + 188c: 0c850513 addi a0,a0,200 # 5950 <malloc+0xa44> + 1890: 5c8030ef jal ra,4e58 <printf> + exit(1); + 1894: 4505 li a0,1 + 1896: 19e030ef jal ra,4a34 <exit> + for(i = 0; i < N; i++){ + 189a: 2485 addiw s1,s1,1 + 189c: 05248e63 beq s1,s2,18f8 <createdelete+0xf6> + name[1] = '0' + i; + 18a0: 0304879b addiw a5,s1,48 + 18a4: f8f400a3 sb a5,-127(s0) + fd = open(name, O_CREATE | O_RDWR); + 18a8: 20200593 li a1,514 + 18ac: f8040513 addi a0,s0,-128 + 18b0: 1c4030ef jal ra,4a74 <open> + if(fd < 0){ + 18b4: fc0549e3 bltz a0,1886 <createdelete+0x84> + close(fd); + 18b8: 1a4030ef jal ra,4a5c <close> + if(i > 0 && (i % 2 ) == 0){ + 18bc: fc905fe3 blez s1,189a <createdelete+0x98> + 18c0: 0014f793 andi a5,s1,1 + 18c4: fbf9 bnez a5,189a <createdelete+0x98> + name[1] = '0' + (i / 2); + 18c6: 01f4d79b srliw a5,s1,0x1f + 18ca: 9fa5 addw a5,a5,s1 + 18cc: 4017d79b sraiw a5,a5,0x1 + 18d0: 0307879b addiw a5,a5,48 + 18d4: f8f400a3 sb a5,-127(s0) + if(unlink(name) < 0){ + 18d8: f8040513 addi a0,s0,-128 + 18dc: 1a8030ef jal ra,4a84 <unlink> + 18e0: fa055de3 bgez a0,189a <createdelete+0x98> + printf("%s: unlink failed\n", s); + 18e4: 85e6 mv a1,s9 + 18e6: 00004517 auipc a0,0x4 + 18ea: 1c250513 addi a0,a0,450 # 5aa8 <malloc+0xb9c> + 18ee: 56a030ef jal ra,4e58 <printf> + exit(1); + 18f2: 4505 li a0,1 + 18f4: 140030ef jal ra,4a34 <exit> + exit(0); + 18f8: 4501 li a0,0 + 18fa: 13a030ef jal ra,4a34 <exit> + exit(1); + 18fe: 4505 li a0,1 + 1900: 134030ef jal ra,4a34 <exit> + printf("%s: oops createdelete %s didn't exist\n", s, name); + 1904: f8040613 addi a2,s0,-128 + 1908: 85e6 mv a1,s9 + 190a: 00004517 auipc a0,0x4 + 190e: 1b650513 addi a0,a0,438 # 5ac0 <malloc+0xbb4> + 1912: 546030ef jal ra,4e58 <printf> + exit(1); + 1916: 4505 li a0,1 + 1918: 11c030ef jal ra,4a34 <exit> + } else if((i >= 1 && i < N/2) && fd >= 0){ + 191c: 034b7d63 bgeu s6,s4,1956 <createdelete+0x154> + if(fd >= 0) + 1920: 02055863 bgez a0,1950 <createdelete+0x14e> + for(pi = 0; pi < NCHILD; pi++){ + 1924: 2485 addiw s1,s1,1 + 1926: 0ff4f493 zext.b s1,s1 + 192a: 05548463 beq s1,s5,1972 <createdelete+0x170> + name[0] = 'p' + pi; + 192e: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 1932: f93400a3 sb s3,-127(s0) + fd = open(name, 0); + 1936: 4581 li a1,0 + 1938: f8040513 addi a0,s0,-128 + 193c: 138030ef jal ra,4a74 <open> + if((i == 0 || i >= N/2) && fd < 0){ + 1940: 00090463 beqz s2,1948 <createdelete+0x146> + 1944: fd2bdce3 bge s7,s2,191c <createdelete+0x11a> + 1948: fa054ee3 bltz a0,1904 <createdelete+0x102> + } else if((i >= 1 && i < N/2) && fd >= 0){ + 194c: 014b7763 bgeu s6,s4,195a <createdelete+0x158> + close(fd); + 1950: 10c030ef jal ra,4a5c <close> + 1954: bfc1 j 1924 <createdelete+0x122> + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1956: fc0547e3 bltz a0,1924 <createdelete+0x122> + printf("%s: oops createdelete %s did exist\n", s, name); + 195a: f8040613 addi a2,s0,-128 + 195e: 85e6 mv a1,s9 + 1960: 00004517 auipc a0,0x4 + 1964: 18850513 addi a0,a0,392 # 5ae8 <malloc+0xbdc> + 1968: 4f0030ef jal ra,4e58 <printf> + exit(1); + 196c: 4505 li a0,1 + 196e: 0c6030ef jal ra,4a34 <exit> + for(i = 0; i < N; i++){ + 1972: 2905 addiw s2,s2,1 + 1974: 2a05 addiw s4,s4,1 + 1976: 2985 addiw s3,s3,1 + 1978: 0ff9f993 zext.b s3,s3 + 197c: 47d1 li a5,20 + 197e: 02f90863 beq s2,a5,19ae <createdelete+0x1ac> + for(pi = 0; pi < NCHILD; pi++){ + 1982: 84e2 mv s1,s8 + 1984: b76d j 192e <createdelete+0x12c> + for(i = 0; i < N; i++){ + 1986: 2905 addiw s2,s2,1 + 1988: 0ff97913 zext.b s2,s2 + 198c: 03490a63 beq s2,s4,19c0 <createdelete+0x1be> + name[0] = name[1] = name[2] = 0; + 1990: 84d6 mv s1,s5 + name[0] = 'p' + pi; + 1992: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 1996: f92400a3 sb s2,-127(s0) + unlink(name); + 199a: f8040513 addi a0,s0,-128 + 199e: 0e6030ef jal ra,4a84 <unlink> + for(pi = 0; pi < NCHILD; pi++){ + 19a2: 2485 addiw s1,s1,1 + 19a4: 0ff4f493 zext.b s1,s1 + 19a8: ff3495e3 bne s1,s3,1992 <createdelete+0x190> + 19ac: bfe9 j 1986 <createdelete+0x184> + 19ae: 03000913 li s2,48 + name[0] = name[1] = name[2] = 0; + 19b2: 07000a93 li s5,112 + for(pi = 0; pi < NCHILD; pi++){ + 19b6: 07400993 li s3,116 + for(i = 0; i < N; i++){ + 19ba: 04400a13 li s4,68 + 19be: bfc9 j 1990 <createdelete+0x18e> +} + 19c0: 60aa ld ra,136(sp) + 19c2: 640a ld s0,128(sp) + 19c4: 74e6 ld s1,120(sp) + 19c6: 7946 ld s2,112(sp) + 19c8: 79a6 ld s3,104(sp) + 19ca: 7a06 ld s4,96(sp) + 19cc: 6ae6 ld s5,88(sp) + 19ce: 6b46 ld s6,80(sp) + 19d0: 6ba6 ld s7,72(sp) + 19d2: 6c06 ld s8,64(sp) + 19d4: 7ce2 ld s9,56(sp) + 19d6: 6149 addi sp,sp,144 + 19d8: 8082 ret + +00000000000019da <linkunlink>: +{ + 19da: 711d addi sp,sp,-96 + 19dc: ec86 sd ra,88(sp) + 19de: e8a2 sd s0,80(sp) + 19e0: e4a6 sd s1,72(sp) + 19e2: e0ca sd s2,64(sp) + 19e4: fc4e sd s3,56(sp) + 19e6: f852 sd s4,48(sp) + 19e8: f456 sd s5,40(sp) + 19ea: f05a sd s6,32(sp) + 19ec: ec5e sd s7,24(sp) + 19ee: e862 sd s8,16(sp) + 19f0: e466 sd s9,8(sp) + 19f2: 1080 addi s0,sp,96 + 19f4: 84aa mv s1,a0 + unlink("x"); + 19f6: 00003517 auipc a0,0x3 + 19fa: 6a250513 addi a0,a0,1698 # 5098 <malloc+0x18c> + 19fe: 086030ef jal ra,4a84 <unlink> + pid = fork(); + 1a02: 02a030ef jal ra,4a2c <fork> + if(pid < 0){ + 1a06: 02054b63 bltz a0,1a3c <linkunlink+0x62> + 1a0a: 8c2a mv s8,a0 + unsigned int x = (pid ? 1 : 97); + 1a0c: 4c85 li s9,1 + 1a0e: e119 bnez a0,1a14 <linkunlink+0x3a> + 1a10: 06100c93 li s9,97 + 1a14: 06400493 li s1,100 + x = x * 1103515245 + 12345; + 1a18: 41c659b7 lui s3,0x41c65 + 1a1c: e6d9899b addiw s3,s3,-403 # 41c64e6d <base+0x41c561f5> + 1a20: 690d lui s2,0x3 + 1a22: 0399091b addiw s2,s2,57 # 3039 <subdir+0x4b1> + if((x % 3) == 0){ + 1a26: 4a0d li s4,3 + } else if((x % 3) == 1){ + 1a28: 4b05 li s6,1 + unlink("x"); + 1a2a: 00003a97 auipc s5,0x3 + 1a2e: 66ea8a93 addi s5,s5,1646 # 5098 <malloc+0x18c> + link("cat", "x"); + 1a32: 00004b97 auipc s7,0x4 + 1a36: 0deb8b93 addi s7,s7,222 # 5b10 <malloc+0xc04> + 1a3a: a025 j 1a62 <linkunlink+0x88> + printf("%s: fork failed\n", s); + 1a3c: 85a6 mv a1,s1 + 1a3e: 00004517 auipc a0,0x4 + 1a42: e7a50513 addi a0,a0,-390 # 58b8 <malloc+0x9ac> + 1a46: 412030ef jal ra,4e58 <printf> + exit(1); + 1a4a: 4505 li a0,1 + 1a4c: 7e9020ef jal ra,4a34 <exit> + close(open("x", O_RDWR | O_CREATE)); + 1a50: 20200593 li a1,514 + 1a54: 8556 mv a0,s5 + 1a56: 01e030ef jal ra,4a74 <open> + 1a5a: 002030ef jal ra,4a5c <close> + for(i = 0; i < 100; i++){ + 1a5e: 34fd addiw s1,s1,-1 + 1a60: c48d beqz s1,1a8a <linkunlink+0xb0> + x = x * 1103515245 + 12345; + 1a62: 033c87bb mulw a5,s9,s3 + 1a66: 012787bb addw a5,a5,s2 + 1a6a: 00078c9b sext.w s9,a5 + if((x % 3) == 0){ + 1a6e: 0347f7bb remuw a5,a5,s4 + 1a72: dff9 beqz a5,1a50 <linkunlink+0x76> + } else if((x % 3) == 1){ + 1a74: 01678663 beq a5,s6,1a80 <linkunlink+0xa6> + unlink("x"); + 1a78: 8556 mv a0,s5 + 1a7a: 00a030ef jal ra,4a84 <unlink> + 1a7e: b7c5 j 1a5e <linkunlink+0x84> + link("cat", "x"); + 1a80: 85d6 mv a1,s5 + 1a82: 855e mv a0,s7 + 1a84: 010030ef jal ra,4a94 <link> + 1a88: bfd9 j 1a5e <linkunlink+0x84> + if(pid) + 1a8a: 020c0263 beqz s8,1aae <linkunlink+0xd4> + wait(0); + 1a8e: 4501 li a0,0 + 1a90: 7ad020ef jal ra,4a3c <wait> +} + 1a94: 60e6 ld ra,88(sp) + 1a96: 6446 ld s0,80(sp) + 1a98: 64a6 ld s1,72(sp) + 1a9a: 6906 ld s2,64(sp) + 1a9c: 79e2 ld s3,56(sp) + 1a9e: 7a42 ld s4,48(sp) + 1aa0: 7aa2 ld s5,40(sp) + 1aa2: 7b02 ld s6,32(sp) + 1aa4: 6be2 ld s7,24(sp) + 1aa6: 6c42 ld s8,16(sp) + 1aa8: 6ca2 ld s9,8(sp) + 1aaa: 6125 addi sp,sp,96 + 1aac: 8082 ret + exit(0); + 1aae: 4501 li a0,0 + 1ab0: 785020ef jal ra,4a34 <exit> + +0000000000001ab4 <forktest>: +{ + 1ab4: 7179 addi sp,sp,-48 + 1ab6: f406 sd ra,40(sp) + 1ab8: f022 sd s0,32(sp) + 1aba: ec26 sd s1,24(sp) + 1abc: e84a sd s2,16(sp) + 1abe: e44e sd s3,8(sp) + 1ac0: 1800 addi s0,sp,48 + 1ac2: 89aa mv s3,a0 + for(n=0; n<N; n++){ + 1ac4: 4481 li s1,0 + 1ac6: 3e800913 li s2,1000 + pid = fork(); + 1aca: 763020ef jal ra,4a2c <fork> + if(pid < 0) + 1ace: 02054263 bltz a0,1af2 <forktest+0x3e> + if(pid == 0) + 1ad2: cd11 beqz a0,1aee <forktest+0x3a> + for(n=0; n<N; n++){ + 1ad4: 2485 addiw s1,s1,1 + 1ad6: ff249ae3 bne s1,s2,1aca <forktest+0x16> + printf("%s: fork claimed to work 1000 times!\n", s); + 1ada: 85ce mv a1,s3 + 1adc: 00004517 auipc a0,0x4 + 1ae0: 05450513 addi a0,a0,84 # 5b30 <malloc+0xc24> + 1ae4: 374030ef jal ra,4e58 <printf> + exit(1); + 1ae8: 4505 li a0,1 + 1aea: 74b020ef jal ra,4a34 <exit> + exit(0); + 1aee: 747020ef jal ra,4a34 <exit> + if (n == 0) { + 1af2: c89d beqz s1,1b28 <forktest+0x74> + if(n == N){ + 1af4: 3e800793 li a5,1000 + 1af8: fef481e3 beq s1,a5,1ada <forktest+0x26> + for(; n > 0; n--){ + 1afc: 00905963 blez s1,1b0e <forktest+0x5a> + if(wait(0) < 0){ + 1b00: 4501 li a0,0 + 1b02: 73b020ef jal ra,4a3c <wait> + 1b06: 02054b63 bltz a0,1b3c <forktest+0x88> + for(; n > 0; n--){ + 1b0a: 34fd addiw s1,s1,-1 + 1b0c: f8f5 bnez s1,1b00 <forktest+0x4c> + if(wait(0) != -1){ + 1b0e: 4501 li a0,0 + 1b10: 72d020ef jal ra,4a3c <wait> + 1b14: 57fd li a5,-1 + 1b16: 02f51d63 bne a0,a5,1b50 <forktest+0x9c> +} + 1b1a: 70a2 ld ra,40(sp) + 1b1c: 7402 ld s0,32(sp) + 1b1e: 64e2 ld s1,24(sp) + 1b20: 6942 ld s2,16(sp) + 1b22: 69a2 ld s3,8(sp) + 1b24: 6145 addi sp,sp,48 + 1b26: 8082 ret + printf("%s: no fork at all!\n", s); + 1b28: 85ce mv a1,s3 + 1b2a: 00004517 auipc a0,0x4 + 1b2e: fee50513 addi a0,a0,-18 # 5b18 <malloc+0xc0c> + 1b32: 326030ef jal ra,4e58 <printf> + exit(1); + 1b36: 4505 li a0,1 + 1b38: 6fd020ef jal ra,4a34 <exit> + printf("%s: wait stopped early\n", s); + 1b3c: 85ce mv a1,s3 + 1b3e: 00004517 auipc a0,0x4 + 1b42: 01a50513 addi a0,a0,26 # 5b58 <malloc+0xc4c> + 1b46: 312030ef jal ra,4e58 <printf> + exit(1); + 1b4a: 4505 li a0,1 + 1b4c: 6e9020ef jal ra,4a34 <exit> + printf("%s: wait got too many\n", s); + 1b50: 85ce mv a1,s3 + 1b52: 00004517 auipc a0,0x4 + 1b56: 01e50513 addi a0,a0,30 # 5b70 <malloc+0xc64> + 1b5a: 2fe030ef jal ra,4e58 <printf> + exit(1); + 1b5e: 4505 li a0,1 + 1b60: 6d5020ef jal ra,4a34 <exit> + +0000000000001b64 <kernmem>: +{ + 1b64: 715d addi sp,sp,-80 + 1b66: e486 sd ra,72(sp) + 1b68: e0a2 sd s0,64(sp) + 1b6a: fc26 sd s1,56(sp) + 1b6c: f84a sd s2,48(sp) + 1b6e: f44e sd s3,40(sp) + 1b70: f052 sd s4,32(sp) + 1b72: ec56 sd s5,24(sp) + 1b74: 0880 addi s0,sp,80 + 1b76: 8a2a mv s4,a0 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1b78: 4485 li s1,1 + 1b7a: 04fe slli s1,s1,0x1f + if(xstatus != -1) // did kernel kill child? + 1b7c: 5afd li s5,-1 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1b7e: 69b1 lui s3,0xc + 1b80: 35098993 addi s3,s3,848 # c350 <buf+0x6d8> + 1b84: 1003d937 lui s2,0x1003d + 1b88: 090e slli s2,s2,0x3 + 1b8a: 48090913 addi s2,s2,1152 # 1003d480 <base+0x1002e808> + pid = fork(); + 1b8e: 69f020ef jal ra,4a2c <fork> + if(pid < 0){ + 1b92: 02054763 bltz a0,1bc0 <kernmem+0x5c> + if(pid == 0){ + 1b96: cd1d beqz a0,1bd4 <kernmem+0x70> + wait(&xstatus); + 1b98: fbc40513 addi a0,s0,-68 + 1b9c: 6a1020ef jal ra,4a3c <wait> + if(xstatus != -1) // did kernel kill child? + 1ba0: fbc42783 lw a5,-68(s0) + 1ba4: 05579563 bne a5,s5,1bee <kernmem+0x8a> + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1ba8: 94ce add s1,s1,s3 + 1baa: ff2492e3 bne s1,s2,1b8e <kernmem+0x2a> +} + 1bae: 60a6 ld ra,72(sp) + 1bb0: 6406 ld s0,64(sp) + 1bb2: 74e2 ld s1,56(sp) + 1bb4: 7942 ld s2,48(sp) + 1bb6: 79a2 ld s3,40(sp) + 1bb8: 7a02 ld s4,32(sp) + 1bba: 6ae2 ld s5,24(sp) + 1bbc: 6161 addi sp,sp,80 + 1bbe: 8082 ret + printf("%s: fork failed\n", s); + 1bc0: 85d2 mv a1,s4 + 1bc2: 00004517 auipc a0,0x4 + 1bc6: cf650513 addi a0,a0,-778 # 58b8 <malloc+0x9ac> + 1bca: 28e030ef jal ra,4e58 <printf> + exit(1); + 1bce: 4505 li a0,1 + 1bd0: 665020ef jal ra,4a34 <exit> + printf("%s: oops could read %p = %x\n", s, a, *a); + 1bd4: 0004c683 lbu a3,0(s1) + 1bd8: 8626 mv a2,s1 + 1bda: 85d2 mv a1,s4 + 1bdc: 00004517 auipc a0,0x4 + 1be0: fac50513 addi a0,a0,-84 # 5b88 <malloc+0xc7c> + 1be4: 274030ef jal ra,4e58 <printf> + exit(1); + 1be8: 4505 li a0,1 + 1bea: 64b020ef jal ra,4a34 <exit> + exit(1); + 1bee: 4505 li a0,1 + 1bf0: 645020ef jal ra,4a34 <exit> + +0000000000001bf4 <MAXVAplus>: +{ + 1bf4: 7179 addi sp,sp,-48 + 1bf6: f406 sd ra,40(sp) + 1bf8: f022 sd s0,32(sp) + 1bfa: ec26 sd s1,24(sp) + 1bfc: e84a sd s2,16(sp) + 1bfe: 1800 addi s0,sp,48 + volatile uint64 a = MAXVA; + 1c00: 4785 li a5,1 + 1c02: 179a slli a5,a5,0x26 + 1c04: fcf43c23 sd a5,-40(s0) + for( ; a != 0; a <<= 1){ + 1c08: fd843783 ld a5,-40(s0) + 1c0c: cb85 beqz a5,1c3c <MAXVAplus+0x48> + 1c0e: 892a mv s2,a0 + if(xstatus != -1) // did kernel kill child? + 1c10: 54fd li s1,-1 + pid = fork(); + 1c12: 61b020ef jal ra,4a2c <fork> + if(pid < 0){ + 1c16: 02054963 bltz a0,1c48 <MAXVAplus+0x54> + if(pid == 0){ + 1c1a: c129 beqz a0,1c5c <MAXVAplus+0x68> + wait(&xstatus); + 1c1c: fd440513 addi a0,s0,-44 + 1c20: 61d020ef jal ra,4a3c <wait> + if(xstatus != -1) // did kernel kill child? + 1c24: fd442783 lw a5,-44(s0) + 1c28: 04979c63 bne a5,s1,1c80 <MAXVAplus+0x8c> + for( ; a != 0; a <<= 1){ + 1c2c: fd843783 ld a5,-40(s0) + 1c30: 0786 slli a5,a5,0x1 + 1c32: fcf43c23 sd a5,-40(s0) + 1c36: fd843783 ld a5,-40(s0) + 1c3a: ffe1 bnez a5,1c12 <MAXVAplus+0x1e> +} + 1c3c: 70a2 ld ra,40(sp) + 1c3e: 7402 ld s0,32(sp) + 1c40: 64e2 ld s1,24(sp) + 1c42: 6942 ld s2,16(sp) + 1c44: 6145 addi sp,sp,48 + 1c46: 8082 ret + printf("%s: fork failed\n", s); + 1c48: 85ca mv a1,s2 + 1c4a: 00004517 auipc a0,0x4 + 1c4e: c6e50513 addi a0,a0,-914 # 58b8 <malloc+0x9ac> + 1c52: 206030ef jal ra,4e58 <printf> + exit(1); + 1c56: 4505 li a0,1 + 1c58: 5dd020ef jal ra,4a34 <exit> + *(char*)a = 99; + 1c5c: fd843783 ld a5,-40(s0) + 1c60: 06300713 li a4,99 + 1c64: 00e78023 sb a4,0(a5) + printf("%s: oops wrote %p\n", s, (void*)a); + 1c68: fd843603 ld a2,-40(s0) + 1c6c: 85ca mv a1,s2 + 1c6e: 00004517 auipc a0,0x4 + 1c72: f3a50513 addi a0,a0,-198 # 5ba8 <malloc+0xc9c> + 1c76: 1e2030ef jal ra,4e58 <printf> + exit(1); + 1c7a: 4505 li a0,1 + 1c7c: 5b9020ef jal ra,4a34 <exit> + exit(1); + 1c80: 4505 li a0,1 + 1c82: 5b3020ef jal ra,4a34 <exit> + +0000000000001c86 <stacktest>: +{ + 1c86: 7179 addi sp,sp,-48 + 1c88: f406 sd ra,40(sp) + 1c8a: f022 sd s0,32(sp) + 1c8c: ec26 sd s1,24(sp) + 1c8e: 1800 addi s0,sp,48 + 1c90: 84aa mv s1,a0 + pid = fork(); + 1c92: 59b020ef jal ra,4a2c <fork> + if(pid == 0) { + 1c96: cd11 beqz a0,1cb2 <stacktest+0x2c> + } else if(pid < 0){ + 1c98: 02054c63 bltz a0,1cd0 <stacktest+0x4a> + wait(&xstatus); + 1c9c: fdc40513 addi a0,s0,-36 + 1ca0: 59d020ef jal ra,4a3c <wait> + if(xstatus == -1) // kernel killed child? + 1ca4: fdc42503 lw a0,-36(s0) + 1ca8: 57fd li a5,-1 + 1caa: 02f50d63 beq a0,a5,1ce4 <stacktest+0x5e> + exit(xstatus); + 1cae: 587020ef jal ra,4a34 <exit> + +static inline uint64 +r_sp() +{ + uint64 x; + asm volatile("mv %0, sp" : "=r" (x) ); + 1cb2: 870a mv a4,sp + printf("%s: stacktest: read below stack %d\n", s, *sp); + 1cb4: 77fd lui a5,0xfffff + 1cb6: 97ba add a5,a5,a4 + 1cb8: 0007c603 lbu a2,0(a5) # fffffffffffff000 <base+0xffffffffffff0388> + 1cbc: 85a6 mv a1,s1 + 1cbe: 00004517 auipc a0,0x4 + 1cc2: f0250513 addi a0,a0,-254 # 5bc0 <malloc+0xcb4> + 1cc6: 192030ef jal ra,4e58 <printf> + exit(1); + 1cca: 4505 li a0,1 + 1ccc: 569020ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 1cd0: 85a6 mv a1,s1 + 1cd2: 00004517 auipc a0,0x4 + 1cd6: be650513 addi a0,a0,-1050 # 58b8 <malloc+0x9ac> + 1cda: 17e030ef jal ra,4e58 <printf> + exit(1); + 1cde: 4505 li a0,1 + 1ce0: 555020ef jal ra,4a34 <exit> + exit(0); + 1ce4: 4501 li a0,0 + 1ce6: 54f020ef jal ra,4a34 <exit> + +0000000000001cea <nowrite>: +{ + 1cea: 7159 addi sp,sp,-112 + 1cec: f486 sd ra,104(sp) + 1cee: f0a2 sd s0,96(sp) + 1cf0: eca6 sd s1,88(sp) + 1cf2: e8ca sd s2,80(sp) + 1cf4: e4ce sd s3,72(sp) + 1cf6: 1880 addi s0,sp,112 + 1cf8: 89aa mv s3,a0 + uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 1cfa: 00005797 auipc a5,0x5 + 1cfe: 68678793 addi a5,a5,1670 # 7380 <malloc+0x2474> + 1d02: 7788 ld a0,40(a5) + 1d04: 7b8c ld a1,48(a5) + 1d06: 7f90 ld a2,56(a5) + 1d08: 63b4 ld a3,64(a5) + 1d0a: 67b8 ld a4,72(a5) + 1d0c: 6bbc ld a5,80(a5) + 1d0e: f8a43c23 sd a0,-104(s0) + 1d12: fab43023 sd a1,-96(s0) + 1d16: fac43423 sd a2,-88(s0) + 1d1a: fad43823 sd a3,-80(s0) + 1d1e: fae43c23 sd a4,-72(s0) + 1d22: fcf43023 sd a5,-64(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d26: 4481 li s1,0 + 1d28: 4919 li s2,6 + pid = fork(); + 1d2a: 503020ef jal ra,4a2c <fork> + if(pid == 0) { + 1d2e: c105 beqz a0,1d4e <nowrite+0x64> + } else if(pid < 0){ + 1d30: 04054263 bltz a0,1d74 <nowrite+0x8a> + wait(&xstatus); + 1d34: fcc40513 addi a0,s0,-52 + 1d38: 505020ef jal ra,4a3c <wait> + if(xstatus == 0){ + 1d3c: fcc42783 lw a5,-52(s0) + 1d40: c7a1 beqz a5,1d88 <nowrite+0x9e> + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d42: 2485 addiw s1,s1,1 + 1d44: ff2493e3 bne s1,s2,1d2a <nowrite+0x40> + exit(0); + 1d48: 4501 li a0,0 + 1d4a: 4eb020ef jal ra,4a34 <exit> + volatile int *addr = (int *) addrs[ai]; + 1d4e: 048e slli s1,s1,0x3 + 1d50: fd048793 addi a5,s1,-48 + 1d54: 008784b3 add s1,a5,s0 + 1d58: fc84b603 ld a2,-56(s1) + *addr = 10; + 1d5c: 47a9 li a5,10 + 1d5e: c21c sw a5,0(a2) + printf("%s: write to %p did not fail!\n", s, addr); + 1d60: 85ce mv a1,s3 + 1d62: 00004517 auipc a0,0x4 + 1d66: e8650513 addi a0,a0,-378 # 5be8 <malloc+0xcdc> + 1d6a: 0ee030ef jal ra,4e58 <printf> + exit(0); + 1d6e: 4501 li a0,0 + 1d70: 4c5020ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 1d74: 85ce mv a1,s3 + 1d76: 00004517 auipc a0,0x4 + 1d7a: b4250513 addi a0,a0,-1214 # 58b8 <malloc+0x9ac> + 1d7e: 0da030ef jal ra,4e58 <printf> + exit(1); + 1d82: 4505 li a0,1 + 1d84: 4b1020ef jal ra,4a34 <exit> + exit(1); + 1d88: 4505 li a0,1 + 1d8a: 4ab020ef jal ra,4a34 <exit> + +0000000000001d8e <manywrites>: +{ + 1d8e: 711d addi sp,sp,-96 + 1d90: ec86 sd ra,88(sp) + 1d92: e8a2 sd s0,80(sp) + 1d94: e4a6 sd s1,72(sp) + 1d96: e0ca sd s2,64(sp) + 1d98: fc4e sd s3,56(sp) + 1d9a: f852 sd s4,48(sp) + 1d9c: f456 sd s5,40(sp) + 1d9e: f05a sd s6,32(sp) + 1da0: ec5e sd s7,24(sp) + 1da2: 1080 addi s0,sp,96 + 1da4: 8aaa mv s5,a0 + for(int ci = 0; ci < nchildren; ci++){ + 1da6: 4981 li s3,0 + 1da8: 4911 li s2,4 + int pid = fork(); + 1daa: 483020ef jal ra,4a2c <fork> + 1dae: 84aa mv s1,a0 + if(pid < 0){ + 1db0: 02054563 bltz a0,1dda <manywrites+0x4c> + if(pid == 0){ + 1db4: cd05 beqz a0,1dec <manywrites+0x5e> + for(int ci = 0; ci < nchildren; ci++){ + 1db6: 2985 addiw s3,s3,1 + 1db8: ff2999e3 bne s3,s2,1daa <manywrites+0x1c> + 1dbc: 4491 li s1,4 + int st = 0; + 1dbe: fa042423 sw zero,-88(s0) + wait(&st); + 1dc2: fa840513 addi a0,s0,-88 + 1dc6: 477020ef jal ra,4a3c <wait> + if(st != 0) + 1dca: fa842503 lw a0,-88(s0) + 1dce: e169 bnez a0,1e90 <manywrites+0x102> + for(int ci = 0; ci < nchildren; ci++){ + 1dd0: 34fd addiw s1,s1,-1 + 1dd2: f4f5 bnez s1,1dbe <manywrites+0x30> + exit(0); + 1dd4: 4501 li a0,0 + 1dd6: 45f020ef jal ra,4a34 <exit> + printf("fork failed\n"); + 1dda: 00005517 auipc a0,0x5 + 1dde: 04e50513 addi a0,a0,78 # 6e28 <malloc+0x1f1c> + 1de2: 076030ef jal ra,4e58 <printf> + exit(1); + 1de6: 4505 li a0,1 + 1de8: 44d020ef jal ra,4a34 <exit> + name[0] = 'b'; + 1dec: 06200793 li a5,98 + 1df0: faf40423 sb a5,-88(s0) + name[1] = 'a' + ci; + 1df4: 0619879b addiw a5,s3,97 + 1df8: faf404a3 sb a5,-87(s0) + name[2] = '\0'; + 1dfc: fa040523 sb zero,-86(s0) + unlink(name); + 1e00: fa840513 addi a0,s0,-88 + 1e04: 481020ef jal ra,4a84 <unlink> + 1e08: 4bf9 li s7,30 + int cc = write(fd, buf, sz); + 1e0a: 0000ab17 auipc s6,0xa + 1e0e: e6eb0b13 addi s6,s6,-402 # bc78 <buf> + for(int i = 0; i < ci+1; i++){ + 1e12: 8a26 mv s4,s1 + 1e14: 0209c863 bltz s3,1e44 <manywrites+0xb6> + int fd = open(name, O_CREATE | O_RDWR); + 1e18: 20200593 li a1,514 + 1e1c: fa840513 addi a0,s0,-88 + 1e20: 455020ef jal ra,4a74 <open> + 1e24: 892a mv s2,a0 + if(fd < 0){ + 1e26: 02054d63 bltz a0,1e60 <manywrites+0xd2> + int cc = write(fd, buf, sz); + 1e2a: 660d lui a2,0x3 + 1e2c: 85da mv a1,s6 + 1e2e: 427020ef jal ra,4a54 <write> + if(cc != sz){ + 1e32: 678d lui a5,0x3 + 1e34: 04f51263 bne a0,a5,1e78 <manywrites+0xea> + close(fd); + 1e38: 854a mv a0,s2 + 1e3a: 423020ef jal ra,4a5c <close> + for(int i = 0; i < ci+1; i++){ + 1e3e: 2a05 addiw s4,s4,1 + 1e40: fd49dce3 bge s3,s4,1e18 <manywrites+0x8a> + unlink(name); + 1e44: fa840513 addi a0,s0,-88 + 1e48: 43d020ef jal ra,4a84 <unlink> + for(int iters = 0; iters < howmany; iters++){ + 1e4c: 3bfd addiw s7,s7,-1 + 1e4e: fc0b92e3 bnez s7,1e12 <manywrites+0x84> + unlink(name); + 1e52: fa840513 addi a0,s0,-88 + 1e56: 42f020ef jal ra,4a84 <unlink> + exit(0); + 1e5a: 4501 li a0,0 + 1e5c: 3d9020ef jal ra,4a34 <exit> + printf("%s: cannot create %s\n", s, name); + 1e60: fa840613 addi a2,s0,-88 + 1e64: 85d6 mv a1,s5 + 1e66: 00004517 auipc a0,0x4 + 1e6a: da250513 addi a0,a0,-606 # 5c08 <malloc+0xcfc> + 1e6e: 7eb020ef jal ra,4e58 <printf> + exit(1); + 1e72: 4505 li a0,1 + 1e74: 3c1020ef jal ra,4a34 <exit> + printf("%s: write(%d) ret %d\n", s, sz, cc); + 1e78: 86aa mv a3,a0 + 1e7a: 660d lui a2,0x3 + 1e7c: 85d6 mv a1,s5 + 1e7e: 00003517 auipc a0,0x3 + 1e82: 27a50513 addi a0,a0,634 # 50f8 <malloc+0x1ec> + 1e86: 7d3020ef jal ra,4e58 <printf> + exit(1); + 1e8a: 4505 li a0,1 + 1e8c: 3a9020ef jal ra,4a34 <exit> + exit(st); + 1e90: 3a5020ef jal ra,4a34 <exit> + +0000000000001e94 <copyinstr3>: +{ + 1e94: 7179 addi sp,sp,-48 + 1e96: f406 sd ra,40(sp) + 1e98: f022 sd s0,32(sp) + 1e9a: ec26 sd s1,24(sp) + 1e9c: 1800 addi s0,sp,48 + sbrk(8192); + 1e9e: 6509 lui a0,0x2 + 1ea0: 41d020ef jal ra,4abc <sbrk> + uint64 top = (uint64) sbrk(0); + 1ea4: 4501 li a0,0 + 1ea6: 417020ef jal ra,4abc <sbrk> + if((top % PGSIZE) != 0){ + 1eaa: 03451793 slli a5,a0,0x34 + 1eae: e7bd bnez a5,1f1c <copyinstr3+0x88> + top = (uint64) sbrk(0); + 1eb0: 4501 li a0,0 + 1eb2: 40b020ef jal ra,4abc <sbrk> + if(top % PGSIZE){ + 1eb6: 03451793 slli a5,a0,0x34 + 1eba: ebad bnez a5,1f2c <copyinstr3+0x98> + char *b = (char *) (top - 1); + 1ebc: fff50493 addi s1,a0,-1 # 1fff <rwsbrk+0x67> + *b = 'x'; + 1ec0: 07800793 li a5,120 + 1ec4: fef50fa3 sb a5,-1(a0) + int ret = unlink(b); + 1ec8: 8526 mv a0,s1 + 1eca: 3bb020ef jal ra,4a84 <unlink> + if(ret != -1){ + 1ece: 57fd li a5,-1 + 1ed0: 06f51763 bne a0,a5,1f3e <copyinstr3+0xaa> + int fd = open(b, O_CREATE | O_WRONLY); + 1ed4: 20100593 li a1,513 + 1ed8: 8526 mv a0,s1 + 1eda: 39b020ef jal ra,4a74 <open> + if(fd != -1){ + 1ede: 57fd li a5,-1 + 1ee0: 06f51a63 bne a0,a5,1f54 <copyinstr3+0xc0> + ret = link(b, b); + 1ee4: 85a6 mv a1,s1 + 1ee6: 8526 mv a0,s1 + 1ee8: 3ad020ef jal ra,4a94 <link> + if(ret != -1){ + 1eec: 57fd li a5,-1 + 1eee: 06f51e63 bne a0,a5,1f6a <copyinstr3+0xd6> + char *args[] = { "xx", 0 }; + 1ef2: 00005797 auipc a5,0x5 + 1ef6: a1678793 addi a5,a5,-1514 # 6908 <malloc+0x19fc> + 1efa: fcf43823 sd a5,-48(s0) + 1efe: fc043c23 sd zero,-40(s0) + ret = exec(b, args); + 1f02: fd040593 addi a1,s0,-48 + 1f06: 8526 mv a0,s1 + 1f08: 365020ef jal ra,4a6c <exec> + if(ret != -1){ + 1f0c: 57fd li a5,-1 + 1f0e: 06f51a63 bne a0,a5,1f82 <copyinstr3+0xee> +} + 1f12: 70a2 ld ra,40(sp) + 1f14: 7402 ld s0,32(sp) + 1f16: 64e2 ld s1,24(sp) + 1f18: 6145 addi sp,sp,48 + 1f1a: 8082 ret + sbrk(PGSIZE - (top % PGSIZE)); + 1f1c: 0347d513 srli a0,a5,0x34 + 1f20: 6785 lui a5,0x1 + 1f22: 40a7853b subw a0,a5,a0 + 1f26: 397020ef jal ra,4abc <sbrk> + 1f2a: b759 j 1eb0 <copyinstr3+0x1c> + printf("oops\n"); + 1f2c: 00004517 auipc a0,0x4 + 1f30: cf450513 addi a0,a0,-780 # 5c20 <malloc+0xd14> + 1f34: 725020ef jal ra,4e58 <printf> + exit(1); + 1f38: 4505 li a0,1 + 1f3a: 2fb020ef jal ra,4a34 <exit> + printf("unlink(%s) returned %d, not -1\n", b, ret); + 1f3e: 862a mv a2,a0 + 1f40: 85a6 mv a1,s1 + 1f42: 00004517 auipc a0,0x4 + 1f46: 89650513 addi a0,a0,-1898 # 57d8 <malloc+0x8cc> + 1f4a: 70f020ef jal ra,4e58 <printf> + exit(1); + 1f4e: 4505 li a0,1 + 1f50: 2e5020ef jal ra,4a34 <exit> + printf("open(%s) returned %d, not -1\n", b, fd); + 1f54: 862a mv a2,a0 + 1f56: 85a6 mv a1,s1 + 1f58: 00004517 auipc a0,0x4 + 1f5c: 8a050513 addi a0,a0,-1888 # 57f8 <malloc+0x8ec> + 1f60: 6f9020ef jal ra,4e58 <printf> + exit(1); + 1f64: 4505 li a0,1 + 1f66: 2cf020ef jal ra,4a34 <exit> + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 1f6a: 86aa mv a3,a0 + 1f6c: 8626 mv a2,s1 + 1f6e: 85a6 mv a1,s1 + 1f70: 00004517 auipc a0,0x4 + 1f74: 8a850513 addi a0,a0,-1880 # 5818 <malloc+0x90c> + 1f78: 6e1020ef jal ra,4e58 <printf> + exit(1); + 1f7c: 4505 li a0,1 + 1f7e: 2b7020ef jal ra,4a34 <exit> + printf("exec(%s) returned %d, not -1\n", b, fd); + 1f82: 567d li a2,-1 + 1f84: 85a6 mv a1,s1 + 1f86: 00004517 auipc a0,0x4 + 1f8a: 8ba50513 addi a0,a0,-1862 # 5840 <malloc+0x934> + 1f8e: 6cb020ef jal ra,4e58 <printf> + exit(1); + 1f92: 4505 li a0,1 + 1f94: 2a1020ef jal ra,4a34 <exit> + +0000000000001f98 <rwsbrk>: +{ + 1f98: 1101 addi sp,sp,-32 + 1f9a: ec06 sd ra,24(sp) + 1f9c: e822 sd s0,16(sp) + 1f9e: e426 sd s1,8(sp) + 1fa0: e04a sd s2,0(sp) + 1fa2: 1000 addi s0,sp,32 + uint64 a = (uint64) sbrk(8192); + 1fa4: 6509 lui a0,0x2 + 1fa6: 317020ef jal ra,4abc <sbrk> + if(a == 0xffffffffffffffffLL) { + 1faa: 57fd li a5,-1 + 1fac: 04f50863 beq a0,a5,1ffc <rwsbrk+0x64> + 1fb0: 84aa mv s1,a0 + if ((uint64) sbrk(-8192) == 0xffffffffffffffffLL) { + 1fb2: 7579 lui a0,0xffffe + 1fb4: 309020ef jal ra,4abc <sbrk> + 1fb8: 57fd li a5,-1 + 1fba: 04f50a63 beq a0,a5,200e <rwsbrk+0x76> + fd = open("rwsbrk", O_CREATE|O_WRONLY); + 1fbe: 20100593 li a1,513 + 1fc2: 00004517 auipc a0,0x4 + 1fc6: c9e50513 addi a0,a0,-866 # 5c60 <malloc+0xd54> + 1fca: 2ab020ef jal ra,4a74 <open> + 1fce: 892a mv s2,a0 + if(fd < 0){ + 1fd0: 04054863 bltz a0,2020 <rwsbrk+0x88> + n = write(fd, (void*)(a+4096), 1024); + 1fd4: 6785 lui a5,0x1 + 1fd6: 94be add s1,s1,a5 + 1fd8: 40000613 li a2,1024 + 1fdc: 85a6 mv a1,s1 + 1fde: 277020ef jal ra,4a54 <write> + 1fe2: 862a mv a2,a0 + if(n >= 0){ + 1fe4: 04054763 bltz a0,2032 <rwsbrk+0x9a> + printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+4096, n); + 1fe8: 85a6 mv a1,s1 + 1fea: 00004517 auipc a0,0x4 + 1fee: c9650513 addi a0,a0,-874 # 5c80 <malloc+0xd74> + 1ff2: 667020ef jal ra,4e58 <printf> + exit(1); + 1ff6: 4505 li a0,1 + 1ff8: 23d020ef jal ra,4a34 <exit> + printf("sbrk(rwsbrk) failed\n"); + 1ffc: 00004517 auipc a0,0x4 + 2000: c2c50513 addi a0,a0,-980 # 5c28 <malloc+0xd1c> + 2004: 655020ef jal ra,4e58 <printf> + exit(1); + 2008: 4505 li a0,1 + 200a: 22b020ef jal ra,4a34 <exit> + printf("sbrk(rwsbrk) shrink failed\n"); + 200e: 00004517 auipc a0,0x4 + 2012: c3250513 addi a0,a0,-974 # 5c40 <malloc+0xd34> + 2016: 643020ef jal ra,4e58 <printf> + exit(1); + 201a: 4505 li a0,1 + 201c: 219020ef jal ra,4a34 <exit> + printf("open(rwsbrk) failed\n"); + 2020: 00004517 auipc a0,0x4 + 2024: c4850513 addi a0,a0,-952 # 5c68 <malloc+0xd5c> + 2028: 631020ef jal ra,4e58 <printf> + exit(1); + 202c: 4505 li a0,1 + 202e: 207020ef jal ra,4a34 <exit> + close(fd); + 2032: 854a mv a0,s2 + 2034: 229020ef jal ra,4a5c <close> + unlink("rwsbrk"); + 2038: 00004517 auipc a0,0x4 + 203c: c2850513 addi a0,a0,-984 # 5c60 <malloc+0xd54> + 2040: 245020ef jal ra,4a84 <unlink> + fd = open("README", O_RDONLY); + 2044: 4581 li a1,0 + 2046: 00003517 auipc a0,0x3 + 204a: 1ba50513 addi a0,a0,442 # 5200 <malloc+0x2f4> + 204e: 227020ef jal ra,4a74 <open> + 2052: 892a mv s2,a0 + if(fd < 0){ + 2054: 02054363 bltz a0,207a <rwsbrk+0xe2> + n = read(fd, (void*)(a+4096), 10); + 2058: 4629 li a2,10 + 205a: 85a6 mv a1,s1 + 205c: 1f1020ef jal ra,4a4c <read> + 2060: 862a mv a2,a0 + if(n >= 0){ + 2062: 02054563 bltz a0,208c <rwsbrk+0xf4> + printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+4096, n); + 2066: 85a6 mv a1,s1 + 2068: 00004517 auipc a0,0x4 + 206c: c4850513 addi a0,a0,-952 # 5cb0 <malloc+0xda4> + 2070: 5e9020ef jal ra,4e58 <printf> + exit(1); + 2074: 4505 li a0,1 + 2076: 1bf020ef jal ra,4a34 <exit> + printf("open(rwsbrk) failed\n"); + 207a: 00004517 auipc a0,0x4 + 207e: bee50513 addi a0,a0,-1042 # 5c68 <malloc+0xd5c> + 2082: 5d7020ef jal ra,4e58 <printf> + exit(1); + 2086: 4505 li a0,1 + 2088: 1ad020ef jal ra,4a34 <exit> + close(fd); + 208c: 854a mv a0,s2 + 208e: 1cf020ef jal ra,4a5c <close> + exit(0); + 2092: 4501 li a0,0 + 2094: 1a1020ef jal ra,4a34 <exit> + +0000000000002098 <sbrkbasic>: +{ + 2098: 7139 addi sp,sp,-64 + 209a: fc06 sd ra,56(sp) + 209c: f822 sd s0,48(sp) + 209e: f426 sd s1,40(sp) + 20a0: f04a sd s2,32(sp) + 20a2: ec4e sd s3,24(sp) + 20a4: e852 sd s4,16(sp) + 20a6: 0080 addi s0,sp,64 + 20a8: 8a2a mv s4,a0 + pid = fork(); + 20aa: 183020ef jal ra,4a2c <fork> + if(pid < 0){ + 20ae: 02054863 bltz a0,20de <sbrkbasic+0x46> + if(pid == 0){ + 20b2: e131 bnez a0,20f6 <sbrkbasic+0x5e> + a = sbrk(TOOMUCH); + 20b4: 40000537 lui a0,0x40000 + 20b8: 205020ef jal ra,4abc <sbrk> + if(a == (char*)0xffffffffffffffffL){ + 20bc: 57fd li a5,-1 + 20be: 02f50963 beq a0,a5,20f0 <sbrkbasic+0x58> + for(b = a; b < a+TOOMUCH; b += 4096){ + 20c2: 400007b7 lui a5,0x40000 + 20c6: 97aa add a5,a5,a0 + *b = 99; + 20c8: 06300693 li a3,99 + for(b = a; b < a+TOOMUCH; b += 4096){ + 20cc: 6705 lui a4,0x1 + *b = 99; + 20ce: 00d50023 sb a3,0(a0) # 40000000 <base+0x3fff1388> + for(b = a; b < a+TOOMUCH; b += 4096){ + 20d2: 953a add a0,a0,a4 + 20d4: fef51de3 bne a0,a5,20ce <sbrkbasic+0x36> + exit(1); + 20d8: 4505 li a0,1 + 20da: 15b020ef jal ra,4a34 <exit> + printf("fork failed in sbrkbasic\n"); + 20de: 00004517 auipc a0,0x4 + 20e2: bfa50513 addi a0,a0,-1030 # 5cd8 <malloc+0xdcc> + 20e6: 573020ef jal ra,4e58 <printf> + exit(1); + 20ea: 4505 li a0,1 + 20ec: 149020ef jal ra,4a34 <exit> + exit(0); + 20f0: 4501 li a0,0 + 20f2: 143020ef jal ra,4a34 <exit> + wait(&xstatus); + 20f6: fcc40513 addi a0,s0,-52 + 20fa: 143020ef jal ra,4a3c <wait> + if(xstatus == 1){ + 20fe: fcc42703 lw a4,-52(s0) + 2102: 4785 li a5,1 + 2104: 00f70b63 beq a4,a5,211a <sbrkbasic+0x82> + a = sbrk(0); + 2108: 4501 li a0,0 + 210a: 1b3020ef jal ra,4abc <sbrk> + 210e: 84aa mv s1,a0 + for(i = 0; i < 5000; i++){ + 2110: 4901 li s2,0 + 2112: 6985 lui s3,0x1 + 2114: 38898993 addi s3,s3,904 # 1388 <exectest+0x5a> + 2118: a821 j 2130 <sbrkbasic+0x98> + printf("%s: too much memory allocated!\n", s); + 211a: 85d2 mv a1,s4 + 211c: 00004517 auipc a0,0x4 + 2120: bdc50513 addi a0,a0,-1060 # 5cf8 <malloc+0xdec> + 2124: 535020ef jal ra,4e58 <printf> + exit(1); + 2128: 4505 li a0,1 + 212a: 10b020ef jal ra,4a34 <exit> + a = b + 1; + 212e: 84be mv s1,a5 + b = sbrk(1); + 2130: 4505 li a0,1 + 2132: 18b020ef jal ra,4abc <sbrk> + if(b != a){ + 2136: 04951263 bne a0,s1,217a <sbrkbasic+0xe2> + *b = 1; + 213a: 4785 li a5,1 + 213c: 00f48023 sb a5,0(s1) + a = b + 1; + 2140: 00148793 addi a5,s1,1 + for(i = 0; i < 5000; i++){ + 2144: 2905 addiw s2,s2,1 + 2146: ff3914e3 bne s2,s3,212e <sbrkbasic+0x96> + pid = fork(); + 214a: 0e3020ef jal ra,4a2c <fork> + 214e: 892a mv s2,a0 + if(pid < 0){ + 2150: 04054263 bltz a0,2194 <sbrkbasic+0xfc> + c = sbrk(1); + 2154: 4505 li a0,1 + 2156: 167020ef jal ra,4abc <sbrk> + c = sbrk(1); + 215a: 4505 li a0,1 + 215c: 161020ef jal ra,4abc <sbrk> + if(c != a + 1){ + 2160: 0489 addi s1,s1,2 + 2162: 04a48363 beq s1,a0,21a8 <sbrkbasic+0x110> + printf("%s: sbrk test failed post-fork\n", s); + 2166: 85d2 mv a1,s4 + 2168: 00004517 auipc a0,0x4 + 216c: bf050513 addi a0,a0,-1040 # 5d58 <malloc+0xe4c> + 2170: 4e9020ef jal ra,4e58 <printf> + exit(1); + 2174: 4505 li a0,1 + 2176: 0bf020ef jal ra,4a34 <exit> + printf("%s: sbrk test failed %d %p %p\n", s, i, a, b); + 217a: 872a mv a4,a0 + 217c: 86a6 mv a3,s1 + 217e: 864a mv a2,s2 + 2180: 85d2 mv a1,s4 + 2182: 00004517 auipc a0,0x4 + 2186: b9650513 addi a0,a0,-1130 # 5d18 <malloc+0xe0c> + 218a: 4cf020ef jal ra,4e58 <printf> + exit(1); + 218e: 4505 li a0,1 + 2190: 0a5020ef jal ra,4a34 <exit> + printf("%s: sbrk test fork failed\n", s); + 2194: 85d2 mv a1,s4 + 2196: 00004517 auipc a0,0x4 + 219a: ba250513 addi a0,a0,-1118 # 5d38 <malloc+0xe2c> + 219e: 4bb020ef jal ra,4e58 <printf> + exit(1); + 21a2: 4505 li a0,1 + 21a4: 091020ef jal ra,4a34 <exit> + if(pid == 0) + 21a8: 00091563 bnez s2,21b2 <sbrkbasic+0x11a> + exit(0); + 21ac: 4501 li a0,0 + 21ae: 087020ef jal ra,4a34 <exit> + wait(&xstatus); + 21b2: fcc40513 addi a0,s0,-52 + 21b6: 087020ef jal ra,4a3c <wait> + exit(xstatus); + 21ba: fcc42503 lw a0,-52(s0) + 21be: 077020ef jal ra,4a34 <exit> + +00000000000021c2 <sbrkmuch>: +{ + 21c2: 7179 addi sp,sp,-48 + 21c4: f406 sd ra,40(sp) + 21c6: f022 sd s0,32(sp) + 21c8: ec26 sd s1,24(sp) + 21ca: e84a sd s2,16(sp) + 21cc: e44e sd s3,8(sp) + 21ce: e052 sd s4,0(sp) + 21d0: 1800 addi s0,sp,48 + 21d2: 89aa mv s3,a0 + oldbrk = sbrk(0); + 21d4: 4501 li a0,0 + 21d6: 0e7020ef jal ra,4abc <sbrk> + 21da: 892a mv s2,a0 + a = sbrk(0); + 21dc: 4501 li a0,0 + 21de: 0df020ef jal ra,4abc <sbrk> + 21e2: 84aa mv s1,a0 + p = sbrk(amt); + 21e4: 06400537 lui a0,0x6400 + 21e8: 9d05 subw a0,a0,s1 + 21ea: 0d3020ef jal ra,4abc <sbrk> + if (p != a) { + 21ee: 0aa49463 bne s1,a0,2296 <sbrkmuch+0xd4> + char *eee = sbrk(0); + 21f2: 4501 li a0,0 + 21f4: 0c9020ef jal ra,4abc <sbrk> + 21f8: 87aa mv a5,a0 + for(char *pp = a; pp < eee; pp += 4096) + 21fa: 00a4f963 bgeu s1,a0,220c <sbrkmuch+0x4a> + *pp = 1; + 21fe: 4685 li a3,1 + for(char *pp = a; pp < eee; pp += 4096) + 2200: 6705 lui a4,0x1 + *pp = 1; + 2202: 00d48023 sb a3,0(s1) + for(char *pp = a; pp < eee; pp += 4096) + 2206: 94ba add s1,s1,a4 + 2208: fef4ede3 bltu s1,a5,2202 <sbrkmuch+0x40> + *lastaddr = 99; + 220c: 064007b7 lui a5,0x6400 + 2210: 06300713 li a4,99 + 2214: fee78fa3 sb a4,-1(a5) # 63fffff <base+0x63f1387> + a = sbrk(0); + 2218: 4501 li a0,0 + 221a: 0a3020ef jal ra,4abc <sbrk> + 221e: 84aa mv s1,a0 + c = sbrk(-PGSIZE); + 2220: 757d lui a0,0xfffff + 2222: 09b020ef jal ra,4abc <sbrk> + if(c == (char*)0xffffffffffffffffL){ + 2226: 57fd li a5,-1 + 2228: 08f50163 beq a0,a5,22aa <sbrkmuch+0xe8> + c = sbrk(0); + 222c: 4501 li a0,0 + 222e: 08f020ef jal ra,4abc <sbrk> + if(c != a - PGSIZE){ + 2232: 77fd lui a5,0xfffff + 2234: 97a6 add a5,a5,s1 + 2236: 08f51463 bne a0,a5,22be <sbrkmuch+0xfc> + a = sbrk(0); + 223a: 4501 li a0,0 + 223c: 081020ef jal ra,4abc <sbrk> + 2240: 84aa mv s1,a0 + c = sbrk(PGSIZE); + 2242: 6505 lui a0,0x1 + 2244: 079020ef jal ra,4abc <sbrk> + 2248: 8a2a mv s4,a0 + if(c != a || sbrk(0) != a + PGSIZE){ + 224a: 08a49663 bne s1,a0,22d6 <sbrkmuch+0x114> + 224e: 4501 li a0,0 + 2250: 06d020ef jal ra,4abc <sbrk> + 2254: 6785 lui a5,0x1 + 2256: 97a6 add a5,a5,s1 + 2258: 06f51f63 bne a0,a5,22d6 <sbrkmuch+0x114> + if(*lastaddr == 99){ + 225c: 064007b7 lui a5,0x6400 + 2260: fff7c703 lbu a4,-1(a5) # 63fffff <base+0x63f1387> + 2264: 06300793 li a5,99 + 2268: 08f70363 beq a4,a5,22ee <sbrkmuch+0x12c> + a = sbrk(0); + 226c: 4501 li a0,0 + 226e: 04f020ef jal ra,4abc <sbrk> + 2272: 84aa mv s1,a0 + c = sbrk(-(sbrk(0) - oldbrk)); + 2274: 4501 li a0,0 + 2276: 047020ef jal ra,4abc <sbrk> + 227a: 40a9053b subw a0,s2,a0 + 227e: 03f020ef jal ra,4abc <sbrk> + if(c != a){ + 2282: 08a49063 bne s1,a0,2302 <sbrkmuch+0x140> +} + 2286: 70a2 ld ra,40(sp) + 2288: 7402 ld s0,32(sp) + 228a: 64e2 ld s1,24(sp) + 228c: 6942 ld s2,16(sp) + 228e: 69a2 ld s3,8(sp) + 2290: 6a02 ld s4,0(sp) + 2292: 6145 addi sp,sp,48 + 2294: 8082 ret + printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s); + 2296: 85ce mv a1,s3 + 2298: 00004517 auipc a0,0x4 + 229c: ae050513 addi a0,a0,-1312 # 5d78 <malloc+0xe6c> + 22a0: 3b9020ef jal ra,4e58 <printf> + exit(1); + 22a4: 4505 li a0,1 + 22a6: 78e020ef jal ra,4a34 <exit> + printf("%s: sbrk could not deallocate\n", s); + 22aa: 85ce mv a1,s3 + 22ac: 00004517 auipc a0,0x4 + 22b0: b1450513 addi a0,a0,-1260 # 5dc0 <malloc+0xeb4> + 22b4: 3a5020ef jal ra,4e58 <printf> + exit(1); + 22b8: 4505 li a0,1 + 22ba: 77a020ef jal ra,4a34 <exit> + printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c); + 22be: 86aa mv a3,a0 + 22c0: 8626 mv a2,s1 + 22c2: 85ce mv a1,s3 + 22c4: 00004517 auipc a0,0x4 + 22c8: b1c50513 addi a0,a0,-1252 # 5de0 <malloc+0xed4> + 22cc: 38d020ef jal ra,4e58 <printf> + exit(1); + 22d0: 4505 li a0,1 + 22d2: 762020ef jal ra,4a34 <exit> + printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c); + 22d6: 86d2 mv a3,s4 + 22d8: 8626 mv a2,s1 + 22da: 85ce mv a1,s3 + 22dc: 00004517 auipc a0,0x4 + 22e0: b4450513 addi a0,a0,-1212 # 5e20 <malloc+0xf14> + 22e4: 375020ef jal ra,4e58 <printf> + exit(1); + 22e8: 4505 li a0,1 + 22ea: 74a020ef jal ra,4a34 <exit> + printf("%s: sbrk de-allocation didn't really deallocate\n", s); + 22ee: 85ce mv a1,s3 + 22f0: 00004517 auipc a0,0x4 + 22f4: b6050513 addi a0,a0,-1184 # 5e50 <malloc+0xf44> + 22f8: 361020ef jal ra,4e58 <printf> + exit(1); + 22fc: 4505 li a0,1 + 22fe: 736020ef jal ra,4a34 <exit> + printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c); + 2302: 86aa mv a3,a0 + 2304: 8626 mv a2,s1 + 2306: 85ce mv a1,s3 + 2308: 00004517 auipc a0,0x4 + 230c: b8050513 addi a0,a0,-1152 # 5e88 <malloc+0xf7c> + 2310: 349020ef jal ra,4e58 <printf> + exit(1); + 2314: 4505 li a0,1 + 2316: 71e020ef jal ra,4a34 <exit> + +000000000000231a <sbrkarg>: +{ + 231a: 7179 addi sp,sp,-48 + 231c: f406 sd ra,40(sp) + 231e: f022 sd s0,32(sp) + 2320: ec26 sd s1,24(sp) + 2322: e84a sd s2,16(sp) + 2324: e44e sd s3,8(sp) + 2326: 1800 addi s0,sp,48 + 2328: 89aa mv s3,a0 + a = sbrk(PGSIZE); + 232a: 6505 lui a0,0x1 + 232c: 790020ef jal ra,4abc <sbrk> + 2330: 892a mv s2,a0 + fd = open("sbrk", O_CREATE|O_WRONLY); + 2332: 20100593 li a1,513 + 2336: 00004517 auipc a0,0x4 + 233a: b7a50513 addi a0,a0,-1158 # 5eb0 <malloc+0xfa4> + 233e: 736020ef jal ra,4a74 <open> + 2342: 84aa mv s1,a0 + unlink("sbrk"); + 2344: 00004517 auipc a0,0x4 + 2348: b6c50513 addi a0,a0,-1172 # 5eb0 <malloc+0xfa4> + 234c: 738020ef jal ra,4a84 <unlink> + if(fd < 0) { + 2350: 0204c963 bltz s1,2382 <sbrkarg+0x68> + if ((n = write(fd, a, PGSIZE)) < 0) { + 2354: 6605 lui a2,0x1 + 2356: 85ca mv a1,s2 + 2358: 8526 mv a0,s1 + 235a: 6fa020ef jal ra,4a54 <write> + 235e: 02054c63 bltz a0,2396 <sbrkarg+0x7c> + close(fd); + 2362: 8526 mv a0,s1 + 2364: 6f8020ef jal ra,4a5c <close> + a = sbrk(PGSIZE); + 2368: 6505 lui a0,0x1 + 236a: 752020ef jal ra,4abc <sbrk> + if(pipe((int *) a) != 0){ + 236e: 6d6020ef jal ra,4a44 <pipe> + 2372: ed05 bnez a0,23aa <sbrkarg+0x90> +} + 2374: 70a2 ld ra,40(sp) + 2376: 7402 ld s0,32(sp) + 2378: 64e2 ld s1,24(sp) + 237a: 6942 ld s2,16(sp) + 237c: 69a2 ld s3,8(sp) + 237e: 6145 addi sp,sp,48 + 2380: 8082 ret + printf("%s: open sbrk failed\n", s); + 2382: 85ce mv a1,s3 + 2384: 00004517 auipc a0,0x4 + 2388: b3450513 addi a0,a0,-1228 # 5eb8 <malloc+0xfac> + 238c: 2cd020ef jal ra,4e58 <printf> + exit(1); + 2390: 4505 li a0,1 + 2392: 6a2020ef jal ra,4a34 <exit> + printf("%s: write sbrk failed\n", s); + 2396: 85ce mv a1,s3 + 2398: 00004517 auipc a0,0x4 + 239c: b3850513 addi a0,a0,-1224 # 5ed0 <malloc+0xfc4> + 23a0: 2b9020ef jal ra,4e58 <printf> + exit(1); + 23a4: 4505 li a0,1 + 23a6: 68e020ef jal ra,4a34 <exit> + printf("%s: pipe() failed\n", s); + 23aa: 85ce mv a1,s3 + 23ac: 00003517 auipc a0,0x3 + 23b0: 61450513 addi a0,a0,1556 # 59c0 <malloc+0xab4> + 23b4: 2a5020ef jal ra,4e58 <printf> + exit(1); + 23b8: 4505 li a0,1 + 23ba: 67a020ef jal ra,4a34 <exit> + +00000000000023be <argptest>: +{ + 23be: 1101 addi sp,sp,-32 + 23c0: ec06 sd ra,24(sp) + 23c2: e822 sd s0,16(sp) + 23c4: e426 sd s1,8(sp) + 23c6: e04a sd s2,0(sp) + 23c8: 1000 addi s0,sp,32 + 23ca: 892a mv s2,a0 + fd = open("init", O_RDONLY); + 23cc: 4581 li a1,0 + 23ce: 00004517 auipc a0,0x4 + 23d2: b1a50513 addi a0,a0,-1254 # 5ee8 <malloc+0xfdc> + 23d6: 69e020ef jal ra,4a74 <open> + if (fd < 0) { + 23da: 02054563 bltz a0,2404 <argptest+0x46> + 23de: 84aa mv s1,a0 + read(fd, sbrk(0) - 1, -1); + 23e0: 4501 li a0,0 + 23e2: 6da020ef jal ra,4abc <sbrk> + 23e6: 567d li a2,-1 + 23e8: fff50593 addi a1,a0,-1 + 23ec: 8526 mv a0,s1 + 23ee: 65e020ef jal ra,4a4c <read> + close(fd); + 23f2: 8526 mv a0,s1 + 23f4: 668020ef jal ra,4a5c <close> +} + 23f8: 60e2 ld ra,24(sp) + 23fa: 6442 ld s0,16(sp) + 23fc: 64a2 ld s1,8(sp) + 23fe: 6902 ld s2,0(sp) + 2400: 6105 addi sp,sp,32 + 2402: 8082 ret + printf("%s: open failed\n", s); + 2404: 85ca mv a1,s2 + 2406: 00003517 auipc a0,0x3 + 240a: 4ca50513 addi a0,a0,1226 # 58d0 <malloc+0x9c4> + 240e: 24b020ef jal ra,4e58 <printf> + exit(1); + 2412: 4505 li a0,1 + 2414: 620020ef jal ra,4a34 <exit> + +0000000000002418 <sbrkbugs>: +{ + 2418: 1141 addi sp,sp,-16 + 241a: e406 sd ra,8(sp) + 241c: e022 sd s0,0(sp) + 241e: 0800 addi s0,sp,16 + int pid = fork(); + 2420: 60c020ef jal ra,4a2c <fork> + if(pid < 0){ + 2424: 00054c63 bltz a0,243c <sbrkbugs+0x24> + if(pid == 0){ + 2428: e11d bnez a0,244e <sbrkbugs+0x36> + int sz = (uint64) sbrk(0); + 242a: 692020ef jal ra,4abc <sbrk> + sbrk(-sz); + 242e: 40a0053b negw a0,a0 + 2432: 68a020ef jal ra,4abc <sbrk> + exit(0); + 2436: 4501 li a0,0 + 2438: 5fc020ef jal ra,4a34 <exit> + printf("fork failed\n"); + 243c: 00005517 auipc a0,0x5 + 2440: 9ec50513 addi a0,a0,-1556 # 6e28 <malloc+0x1f1c> + 2444: 215020ef jal ra,4e58 <printf> + exit(1); + 2448: 4505 li a0,1 + 244a: 5ea020ef jal ra,4a34 <exit> + wait(0); + 244e: 4501 li a0,0 + 2450: 5ec020ef jal ra,4a3c <wait> + pid = fork(); + 2454: 5d8020ef jal ra,4a2c <fork> + if(pid < 0){ + 2458: 00054f63 bltz a0,2476 <sbrkbugs+0x5e> + if(pid == 0){ + 245c: e515 bnez a0,2488 <sbrkbugs+0x70> + int sz = (uint64) sbrk(0); + 245e: 65e020ef jal ra,4abc <sbrk> + sbrk(-(sz - 3500)); + 2462: 6785 lui a5,0x1 + 2464: dac7879b addiw a5,a5,-596 # dac <linktest+0x138> + 2468: 40a7853b subw a0,a5,a0 + 246c: 650020ef jal ra,4abc <sbrk> + exit(0); + 2470: 4501 li a0,0 + 2472: 5c2020ef jal ra,4a34 <exit> + printf("fork failed\n"); + 2476: 00005517 auipc a0,0x5 + 247a: 9b250513 addi a0,a0,-1614 # 6e28 <malloc+0x1f1c> + 247e: 1db020ef jal ra,4e58 <printf> + exit(1); + 2482: 4505 li a0,1 + 2484: 5b0020ef jal ra,4a34 <exit> + wait(0); + 2488: 4501 li a0,0 + 248a: 5b2020ef jal ra,4a3c <wait> + pid = fork(); + 248e: 59e020ef jal ra,4a2c <fork> + if(pid < 0){ + 2492: 02054263 bltz a0,24b6 <sbrkbugs+0x9e> + if(pid == 0){ + 2496: e90d bnez a0,24c8 <sbrkbugs+0xb0> + sbrk((10*4096 + 2048) - (uint64)sbrk(0)); + 2498: 624020ef jal ra,4abc <sbrk> + 249c: 67ad lui a5,0xb + 249e: 8007879b addiw a5,a5,-2048 # a800 <uninit+0x1298> + 24a2: 40a7853b subw a0,a5,a0 + 24a6: 616020ef jal ra,4abc <sbrk> + sbrk(-10); + 24aa: 5559 li a0,-10 + 24ac: 610020ef jal ra,4abc <sbrk> + exit(0); + 24b0: 4501 li a0,0 + 24b2: 582020ef jal ra,4a34 <exit> + printf("fork failed\n"); + 24b6: 00005517 auipc a0,0x5 + 24ba: 97250513 addi a0,a0,-1678 # 6e28 <malloc+0x1f1c> + 24be: 19b020ef jal ra,4e58 <printf> + exit(1); + 24c2: 4505 li a0,1 + 24c4: 570020ef jal ra,4a34 <exit> + wait(0); + 24c8: 4501 li a0,0 + 24ca: 572020ef jal ra,4a3c <wait> + exit(0); + 24ce: 4501 li a0,0 + 24d0: 564020ef jal ra,4a34 <exit> + +00000000000024d4 <sbrklast>: +{ + 24d4: 7179 addi sp,sp,-48 + 24d6: f406 sd ra,40(sp) + 24d8: f022 sd s0,32(sp) + 24da: ec26 sd s1,24(sp) + 24dc: e84a sd s2,16(sp) + 24de: e44e sd s3,8(sp) + 24e0: e052 sd s4,0(sp) + 24e2: 1800 addi s0,sp,48 + uint64 top = (uint64) sbrk(0); + 24e4: 4501 li a0,0 + 24e6: 5d6020ef jal ra,4abc <sbrk> + if((top % 4096) != 0) + 24ea: 03451793 slli a5,a0,0x34 + 24ee: ebad bnez a5,2560 <sbrklast+0x8c> + sbrk(4096); + 24f0: 6505 lui a0,0x1 + 24f2: 5ca020ef jal ra,4abc <sbrk> + sbrk(10); + 24f6: 4529 li a0,10 + 24f8: 5c4020ef jal ra,4abc <sbrk> + sbrk(-20); + 24fc: 5531 li a0,-20 + 24fe: 5be020ef jal ra,4abc <sbrk> + top = (uint64) sbrk(0); + 2502: 4501 li a0,0 + 2504: 5b8020ef jal ra,4abc <sbrk> + 2508: 84aa mv s1,a0 + char *p = (char *) (top - 64); + 250a: fc050913 addi s2,a0,-64 # fc0 <bigdir+0x122> + p[0] = 'x'; + 250e: 07800a13 li s4,120 + 2512: fd450023 sb s4,-64(a0) + p[1] = '\0'; + 2516: fc0500a3 sb zero,-63(a0) + int fd = open(p, O_RDWR|O_CREATE); + 251a: 20200593 li a1,514 + 251e: 854a mv a0,s2 + 2520: 554020ef jal ra,4a74 <open> + 2524: 89aa mv s3,a0 + write(fd, p, 1); + 2526: 4605 li a2,1 + 2528: 85ca mv a1,s2 + 252a: 52a020ef jal ra,4a54 <write> + close(fd); + 252e: 854e mv a0,s3 + 2530: 52c020ef jal ra,4a5c <close> + fd = open(p, O_RDWR); + 2534: 4589 li a1,2 + 2536: 854a mv a0,s2 + 2538: 53c020ef jal ra,4a74 <open> + p[0] = '\0'; + 253c: fc048023 sb zero,-64(s1) + read(fd, p, 1); + 2540: 4605 li a2,1 + 2542: 85ca mv a1,s2 + 2544: 508020ef jal ra,4a4c <read> + if(p[0] != 'x') + 2548: fc04c783 lbu a5,-64(s1) + 254c: 03479263 bne a5,s4,2570 <sbrklast+0x9c> +} + 2550: 70a2 ld ra,40(sp) + 2552: 7402 ld s0,32(sp) + 2554: 64e2 ld s1,24(sp) + 2556: 6942 ld s2,16(sp) + 2558: 69a2 ld s3,8(sp) + 255a: 6a02 ld s4,0(sp) + 255c: 6145 addi sp,sp,48 + 255e: 8082 ret + sbrk(4096 - (top % 4096)); + 2560: 0347d513 srli a0,a5,0x34 + 2564: 6785 lui a5,0x1 + 2566: 40a7853b subw a0,a5,a0 + 256a: 552020ef jal ra,4abc <sbrk> + 256e: b749 j 24f0 <sbrklast+0x1c> + exit(1); + 2570: 4505 li a0,1 + 2572: 4c2020ef jal ra,4a34 <exit> + +0000000000002576 <sbrk8000>: +{ + 2576: 1141 addi sp,sp,-16 + 2578: e406 sd ra,8(sp) + 257a: e022 sd s0,0(sp) + 257c: 0800 addi s0,sp,16 + sbrk(0x80000004); + 257e: 80000537 lui a0,0x80000 + 2582: 0511 addi a0,a0,4 # ffffffff80000004 <base+0xffffffff7fff138c> + 2584: 538020ef jal ra,4abc <sbrk> + volatile char *top = sbrk(0); + 2588: 4501 li a0,0 + 258a: 532020ef jal ra,4abc <sbrk> + *(top-1) = *(top-1) + 1; + 258e: fff54783 lbu a5,-1(a0) + 2592: 2785 addiw a5,a5,1 # 1001 <badarg+0x1> + 2594: 0ff7f793 zext.b a5,a5 + 2598: fef50fa3 sb a5,-1(a0) +} + 259c: 60a2 ld ra,8(sp) + 259e: 6402 ld s0,0(sp) + 25a0: 0141 addi sp,sp,16 + 25a2: 8082 ret + +00000000000025a4 <execout>: +{ + 25a4: 715d addi sp,sp,-80 + 25a6: e486 sd ra,72(sp) + 25a8: e0a2 sd s0,64(sp) + 25aa: fc26 sd s1,56(sp) + 25ac: f84a sd s2,48(sp) + 25ae: f44e sd s3,40(sp) + 25b0: f052 sd s4,32(sp) + 25b2: 0880 addi s0,sp,80 + for(int avail = 0; avail < 15; avail++){ + 25b4: 4901 li s2,0 + 25b6: 49bd li s3,15 + int pid = fork(); + 25b8: 474020ef jal ra,4a2c <fork> + 25bc: 84aa mv s1,a0 + if(pid < 0){ + 25be: 00054c63 bltz a0,25d6 <execout+0x32> + } else if(pid == 0){ + 25c2: c11d beqz a0,25e8 <execout+0x44> + wait((int*)0); + 25c4: 4501 li a0,0 + 25c6: 476020ef jal ra,4a3c <wait> + for(int avail = 0; avail < 15; avail++){ + 25ca: 2905 addiw s2,s2,1 + 25cc: ff3916e3 bne s2,s3,25b8 <execout+0x14> + exit(0); + 25d0: 4501 li a0,0 + 25d2: 462020ef jal ra,4a34 <exit> + printf("fork failed\n"); + 25d6: 00005517 auipc a0,0x5 + 25da: 85250513 addi a0,a0,-1966 # 6e28 <malloc+0x1f1c> + 25de: 07b020ef jal ra,4e58 <printf> + exit(1); + 25e2: 4505 li a0,1 + 25e4: 450020ef jal ra,4a34 <exit> + if(a == 0xffffffffffffffffLL) + 25e8: 59fd li s3,-1 + *(char*)(a + 4096 - 1) = 1; + 25ea: 4a05 li s4,1 + uint64 a = (uint64) sbrk(4096); + 25ec: 6505 lui a0,0x1 + 25ee: 4ce020ef jal ra,4abc <sbrk> + if(a == 0xffffffffffffffffLL) + 25f2: 01350763 beq a0,s3,2600 <execout+0x5c> + *(char*)(a + 4096 - 1) = 1; + 25f6: 6785 lui a5,0x1 + 25f8: 97aa add a5,a5,a0 + 25fa: ff478fa3 sb s4,-1(a5) # fff <pgbug+0x2b> + while(1){ + 25fe: b7fd j 25ec <execout+0x48> + for(int i = 0; i < avail; i++) + 2600: 01205863 blez s2,2610 <execout+0x6c> + sbrk(-4096); + 2604: 757d lui a0,0xfffff + 2606: 4b6020ef jal ra,4abc <sbrk> + for(int i = 0; i < avail; i++) + 260a: 2485 addiw s1,s1,1 + 260c: ff249ce3 bne s1,s2,2604 <execout+0x60> + close(1); + 2610: 4505 li a0,1 + 2612: 44a020ef jal ra,4a5c <close> + char *args[] = { "echo", "x", 0 }; + 2616: 00003517 auipc a0,0x3 + 261a: a1250513 addi a0,a0,-1518 # 5028 <malloc+0x11c> + 261e: faa43c23 sd a0,-72(s0) + 2622: 00003797 auipc a5,0x3 + 2626: a7678793 addi a5,a5,-1418 # 5098 <malloc+0x18c> + 262a: fcf43023 sd a5,-64(s0) + 262e: fc043423 sd zero,-56(s0) + exec("echo", args); + 2632: fb840593 addi a1,s0,-72 + 2636: 436020ef jal ra,4a6c <exec> + exit(0); + 263a: 4501 li a0,0 + 263c: 3f8020ef jal ra,4a34 <exit> + +0000000000002640 <fourteen>: +{ + 2640: 1101 addi sp,sp,-32 + 2642: ec06 sd ra,24(sp) + 2644: e822 sd s0,16(sp) + 2646: e426 sd s1,8(sp) + 2648: 1000 addi s0,sp,32 + 264a: 84aa mv s1,a0 + if(mkdir("12345678901234") != 0){ + 264c: 00004517 auipc a0,0x4 + 2650: a7450513 addi a0,a0,-1420 # 60c0 <malloc+0x11b4> + 2654: 448020ef jal ra,4a9c <mkdir> + 2658: e555 bnez a0,2704 <fourteen+0xc4> + if(mkdir("12345678901234/123456789012345") != 0){ + 265a: 00004517 auipc a0,0x4 + 265e: 8be50513 addi a0,a0,-1858 # 5f18 <malloc+0x100c> + 2662: 43a020ef jal ra,4a9c <mkdir> + 2666: e94d bnez a0,2718 <fourteen+0xd8> + fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); + 2668: 20000593 li a1,512 + 266c: 00004517 auipc a0,0x4 + 2670: 90450513 addi a0,a0,-1788 # 5f70 <malloc+0x1064> + 2674: 400020ef jal ra,4a74 <open> + if(fd < 0){ + 2678: 0a054a63 bltz a0,272c <fourteen+0xec> + close(fd); + 267c: 3e0020ef jal ra,4a5c <close> + fd = open("12345678901234/12345678901234/12345678901234", 0); + 2680: 4581 li a1,0 + 2682: 00004517 auipc a0,0x4 + 2686: 96650513 addi a0,a0,-1690 # 5fe8 <malloc+0x10dc> + 268a: 3ea020ef jal ra,4a74 <open> + if(fd < 0){ + 268e: 0a054963 bltz a0,2740 <fourteen+0x100> + close(fd); + 2692: 3ca020ef jal ra,4a5c <close> + if(mkdir("12345678901234/12345678901234") == 0){ + 2696: 00004517 auipc a0,0x4 + 269a: 9c250513 addi a0,a0,-1598 # 6058 <malloc+0x114c> + 269e: 3fe020ef jal ra,4a9c <mkdir> + 26a2: c94d beqz a0,2754 <fourteen+0x114> + if(mkdir("123456789012345/12345678901234") == 0){ + 26a4: 00004517 auipc a0,0x4 + 26a8: a0c50513 addi a0,a0,-1524 # 60b0 <malloc+0x11a4> + 26ac: 3f0020ef jal ra,4a9c <mkdir> + 26b0: cd45 beqz a0,2768 <fourteen+0x128> + unlink("123456789012345/12345678901234"); + 26b2: 00004517 auipc a0,0x4 + 26b6: 9fe50513 addi a0,a0,-1538 # 60b0 <malloc+0x11a4> + 26ba: 3ca020ef jal ra,4a84 <unlink> + unlink("12345678901234/12345678901234"); + 26be: 00004517 auipc a0,0x4 + 26c2: 99a50513 addi a0,a0,-1638 # 6058 <malloc+0x114c> + 26c6: 3be020ef jal ra,4a84 <unlink> + unlink("12345678901234/12345678901234/12345678901234"); + 26ca: 00004517 auipc a0,0x4 + 26ce: 91e50513 addi a0,a0,-1762 # 5fe8 <malloc+0x10dc> + 26d2: 3b2020ef jal ra,4a84 <unlink> + unlink("123456789012345/123456789012345/123456789012345"); + 26d6: 00004517 auipc a0,0x4 + 26da: 89a50513 addi a0,a0,-1894 # 5f70 <malloc+0x1064> + 26de: 3a6020ef jal ra,4a84 <unlink> + unlink("12345678901234/123456789012345"); + 26e2: 00004517 auipc a0,0x4 + 26e6: 83650513 addi a0,a0,-1994 # 5f18 <malloc+0x100c> + 26ea: 39a020ef jal ra,4a84 <unlink> + unlink("12345678901234"); + 26ee: 00004517 auipc a0,0x4 + 26f2: 9d250513 addi a0,a0,-1582 # 60c0 <malloc+0x11b4> + 26f6: 38e020ef jal ra,4a84 <unlink> +} + 26fa: 60e2 ld ra,24(sp) + 26fc: 6442 ld s0,16(sp) + 26fe: 64a2 ld s1,8(sp) + 2700: 6105 addi sp,sp,32 + 2702: 8082 ret + printf("%s: mkdir 12345678901234 failed\n", s); + 2704: 85a6 mv a1,s1 + 2706: 00003517 auipc a0,0x3 + 270a: 7ea50513 addi a0,a0,2026 # 5ef0 <malloc+0xfe4> + 270e: 74a020ef jal ra,4e58 <printf> + exit(1); + 2712: 4505 li a0,1 + 2714: 320020ef jal ra,4a34 <exit> + printf("%s: mkdir 12345678901234/123456789012345 failed\n", s); + 2718: 85a6 mv a1,s1 + 271a: 00004517 auipc a0,0x4 + 271e: 81e50513 addi a0,a0,-2018 # 5f38 <malloc+0x102c> + 2722: 736020ef jal ra,4e58 <printf> + exit(1); + 2726: 4505 li a0,1 + 2728: 30c020ef jal ra,4a34 <exit> + printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s); + 272c: 85a6 mv a1,s1 + 272e: 00004517 auipc a0,0x4 + 2732: 87250513 addi a0,a0,-1934 # 5fa0 <malloc+0x1094> + 2736: 722020ef jal ra,4e58 <printf> + exit(1); + 273a: 4505 li a0,1 + 273c: 2f8020ef jal ra,4a34 <exit> + printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s); + 2740: 85a6 mv a1,s1 + 2742: 00004517 auipc a0,0x4 + 2746: 8d650513 addi a0,a0,-1834 # 6018 <malloc+0x110c> + 274a: 70e020ef jal ra,4e58 <printf> + exit(1); + 274e: 4505 li a0,1 + 2750: 2e4020ef jal ra,4a34 <exit> + printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s); + 2754: 85a6 mv a1,s1 + 2756: 00004517 auipc a0,0x4 + 275a: 92250513 addi a0,a0,-1758 # 6078 <malloc+0x116c> + 275e: 6fa020ef jal ra,4e58 <printf> + exit(1); + 2762: 4505 li a0,1 + 2764: 2d0020ef jal ra,4a34 <exit> + printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s); + 2768: 85a6 mv a1,s1 + 276a: 00004517 auipc a0,0x4 + 276e: 96650513 addi a0,a0,-1690 # 60d0 <malloc+0x11c4> + 2772: 6e6020ef jal ra,4e58 <printf> + exit(1); + 2776: 4505 li a0,1 + 2778: 2bc020ef jal ra,4a34 <exit> + +000000000000277c <diskfull>: +{ + 277c: b8010113 addi sp,sp,-1152 + 2780: 46113c23 sd ra,1144(sp) + 2784: 46813823 sd s0,1136(sp) + 2788: 46913423 sd s1,1128(sp) + 278c: 47213023 sd s2,1120(sp) + 2790: 45313c23 sd s3,1112(sp) + 2794: 45413823 sd s4,1104(sp) + 2798: 45513423 sd s5,1096(sp) + 279c: 45613023 sd s6,1088(sp) + 27a0: 43713c23 sd s7,1080(sp) + 27a4: 43813823 sd s8,1072(sp) + 27a8: 43913423 sd s9,1064(sp) + 27ac: 48010413 addi s0,sp,1152 + 27b0: 8caa mv s9,a0 + unlink("diskfulldir"); + 27b2: 00004517 auipc a0,0x4 + 27b6: 95650513 addi a0,a0,-1706 # 6108 <malloc+0x11fc> + 27ba: 2ca020ef jal ra,4a84 <unlink> + 27be: 03000993 li s3,48 + name[0] = 'b'; + 27c2: 06200b13 li s6,98 + name[1] = 'i'; + 27c6: 06900a93 li s5,105 + name[2] = 'g'; + 27ca: 06700a13 li s4,103 + 27ce: 10c00b93 li s7,268 + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 27d2: 07f00c13 li s8,127 + 27d6: aab9 j 2934 <diskfull+0x1b8> + printf("%s: could not create file %s\n", s, name); + 27d8: b8040613 addi a2,s0,-1152 + 27dc: 85e6 mv a1,s9 + 27de: 00004517 auipc a0,0x4 + 27e2: 93a50513 addi a0,a0,-1734 # 6118 <malloc+0x120c> + 27e6: 672020ef jal ra,4e58 <printf> + break; + 27ea: a039 j 27f8 <diskfull+0x7c> + close(fd); + 27ec: 854a mv a0,s2 + 27ee: 26e020ef jal ra,4a5c <close> + close(fd); + 27f2: 854a mv a0,s2 + 27f4: 268020ef jal ra,4a5c <close> + for(int i = 0; i < nzz; i++){ + 27f8: 4481 li s1,0 + name[0] = 'z'; + 27fa: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 27fe: 08000993 li s3,128 + name[0] = 'z'; + 2802: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 2806: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 280a: 41f4d71b sraiw a4,s1,0x1f + 280e: 01b7571b srliw a4,a4,0x1b + 2812: 009707bb addw a5,a4,s1 + 2816: 4057d69b sraiw a3,a5,0x5 + 281a: 0306869b addiw a3,a3,48 + 281e: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 2822: 8bfd andi a5,a5,31 + 2824: 9f99 subw a5,a5,a4 + 2826: 0307879b addiw a5,a5,48 + 282a: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 282e: ba040223 sb zero,-1116(s0) + unlink(name); + 2832: ba040513 addi a0,s0,-1120 + 2836: 24e020ef jal ra,4a84 <unlink> + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 283a: 60200593 li a1,1538 + 283e: ba040513 addi a0,s0,-1120 + 2842: 232020ef jal ra,4a74 <open> + if(fd < 0) + 2846: 00054763 bltz a0,2854 <diskfull+0xd8> + close(fd); + 284a: 212020ef jal ra,4a5c <close> + for(int i = 0; i < nzz; i++){ + 284e: 2485 addiw s1,s1,1 + 2850: fb3499e3 bne s1,s3,2802 <diskfull+0x86> + if(mkdir("diskfulldir") == 0) + 2854: 00004517 auipc a0,0x4 + 2858: 8b450513 addi a0,a0,-1868 # 6108 <malloc+0x11fc> + 285c: 240020ef jal ra,4a9c <mkdir> + 2860: 12050063 beqz a0,2980 <diskfull+0x204> + unlink("diskfulldir"); + 2864: 00004517 auipc a0,0x4 + 2868: 8a450513 addi a0,a0,-1884 # 6108 <malloc+0x11fc> + 286c: 218020ef jal ra,4a84 <unlink> + for(int i = 0; i < nzz; i++){ + 2870: 4481 li s1,0 + name[0] = 'z'; + 2872: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 2876: 08000993 li s3,128 + name[0] = 'z'; + 287a: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 287e: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 2882: 41f4d71b sraiw a4,s1,0x1f + 2886: 01b7571b srliw a4,a4,0x1b + 288a: 009707bb addw a5,a4,s1 + 288e: 4057d69b sraiw a3,a5,0x5 + 2892: 0306869b addiw a3,a3,48 + 2896: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 289a: 8bfd andi a5,a5,31 + 289c: 9f99 subw a5,a5,a4 + 289e: 0307879b addiw a5,a5,48 + 28a2: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 28a6: ba040223 sb zero,-1116(s0) + unlink(name); + 28aa: ba040513 addi a0,s0,-1120 + 28ae: 1d6020ef jal ra,4a84 <unlink> + for(int i = 0; i < nzz; i++){ + 28b2: 2485 addiw s1,s1,1 + 28b4: fd3493e3 bne s1,s3,287a <diskfull+0xfe> + 28b8: 03000493 li s1,48 + name[0] = 'b'; + 28bc: 06200a93 li s5,98 + name[1] = 'i'; + 28c0: 06900a13 li s4,105 + name[2] = 'g'; + 28c4: 06700993 li s3,103 + for(int i = 0; '0' + i < 0177; i++){ + 28c8: 07f00913 li s2,127 + name[0] = 'b'; + 28cc: bb540023 sb s5,-1120(s0) + name[1] = 'i'; + 28d0: bb4400a3 sb s4,-1119(s0) + name[2] = 'g'; + 28d4: bb340123 sb s3,-1118(s0) + name[3] = '0' + i; + 28d8: ba9401a3 sb s1,-1117(s0) + name[4] = '\0'; + 28dc: ba040223 sb zero,-1116(s0) + unlink(name); + 28e0: ba040513 addi a0,s0,-1120 + 28e4: 1a0020ef jal ra,4a84 <unlink> + for(int i = 0; '0' + i < 0177; i++){ + 28e8: 2485 addiw s1,s1,1 + 28ea: 0ff4f493 zext.b s1,s1 + 28ee: fd249fe3 bne s1,s2,28cc <diskfull+0x150> +} + 28f2: 47813083 ld ra,1144(sp) + 28f6: 47013403 ld s0,1136(sp) + 28fa: 46813483 ld s1,1128(sp) + 28fe: 46013903 ld s2,1120(sp) + 2902: 45813983 ld s3,1112(sp) + 2906: 45013a03 ld s4,1104(sp) + 290a: 44813a83 ld s5,1096(sp) + 290e: 44013b03 ld s6,1088(sp) + 2912: 43813b83 ld s7,1080(sp) + 2916: 43013c03 ld s8,1072(sp) + 291a: 42813c83 ld s9,1064(sp) + 291e: 48010113 addi sp,sp,1152 + 2922: 8082 ret + close(fd); + 2924: 854a mv a0,s2 + 2926: 136020ef jal ra,4a5c <close> + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 292a: 2985 addiw s3,s3,1 + 292c: 0ff9f993 zext.b s3,s3 + 2930: ed8984e3 beq s3,s8,27f8 <diskfull+0x7c> + name[0] = 'b'; + 2934: b9640023 sb s6,-1152(s0) + name[1] = 'i'; + 2938: b95400a3 sb s5,-1151(s0) + name[2] = 'g'; + 293c: b9440123 sb s4,-1150(s0) + name[3] = '0' + fi; + 2940: b93401a3 sb s3,-1149(s0) + name[4] = '\0'; + 2944: b8040223 sb zero,-1148(s0) + unlink(name); + 2948: b8040513 addi a0,s0,-1152 + 294c: 138020ef jal ra,4a84 <unlink> + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 2950: 60200593 li a1,1538 + 2954: b8040513 addi a0,s0,-1152 + 2958: 11c020ef jal ra,4a74 <open> + 295c: 892a mv s2,a0 + if(fd < 0){ + 295e: e6054de3 bltz a0,27d8 <diskfull+0x5c> + 2962: 84de mv s1,s7 + if(write(fd, buf, BSIZE) != BSIZE){ + 2964: 40000613 li a2,1024 + 2968: ba040593 addi a1,s0,-1120 + 296c: 854a mv a0,s2 + 296e: 0e6020ef jal ra,4a54 <write> + 2972: 40000793 li a5,1024 + 2976: e6f51be3 bne a0,a5,27ec <diskfull+0x70> + for(int i = 0; i < MAXFILE; i++){ + 297a: 34fd addiw s1,s1,-1 + 297c: f4e5 bnez s1,2964 <diskfull+0x1e8> + 297e: b75d j 2924 <diskfull+0x1a8> + printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s); + 2980: 85e6 mv a1,s9 + 2982: 00003517 auipc a0,0x3 + 2986: 7b650513 addi a0,a0,1974 # 6138 <malloc+0x122c> + 298a: 4ce020ef jal ra,4e58 <printf> + 298e: bdd9 j 2864 <diskfull+0xe8> + +0000000000002990 <iputtest>: +{ + 2990: 1101 addi sp,sp,-32 + 2992: ec06 sd ra,24(sp) + 2994: e822 sd s0,16(sp) + 2996: e426 sd s1,8(sp) + 2998: 1000 addi s0,sp,32 + 299a: 84aa mv s1,a0 + if(mkdir("iputdir") < 0){ + 299c: 00003517 auipc a0,0x3 + 29a0: 7cc50513 addi a0,a0,1996 # 6168 <malloc+0x125c> + 29a4: 0f8020ef jal ra,4a9c <mkdir> + 29a8: 02054f63 bltz a0,29e6 <iputtest+0x56> + if(chdir("iputdir") < 0){ + 29ac: 00003517 auipc a0,0x3 + 29b0: 7bc50513 addi a0,a0,1980 # 6168 <malloc+0x125c> + 29b4: 0f0020ef jal ra,4aa4 <chdir> + 29b8: 04054163 bltz a0,29fa <iputtest+0x6a> + if(unlink("../iputdir") < 0){ + 29bc: 00003517 auipc a0,0x3 + 29c0: 7ec50513 addi a0,a0,2028 # 61a8 <malloc+0x129c> + 29c4: 0c0020ef jal ra,4a84 <unlink> + 29c8: 04054363 bltz a0,2a0e <iputtest+0x7e> + if(chdir("/") < 0){ + 29cc: 00004517 auipc a0,0x4 + 29d0: 80c50513 addi a0,a0,-2036 # 61d8 <malloc+0x12cc> + 29d4: 0d0020ef jal ra,4aa4 <chdir> + 29d8: 04054563 bltz a0,2a22 <iputtest+0x92> +} + 29dc: 60e2 ld ra,24(sp) + 29de: 6442 ld s0,16(sp) + 29e0: 64a2 ld s1,8(sp) + 29e2: 6105 addi sp,sp,32 + 29e4: 8082 ret + printf("%s: mkdir failed\n", s); + 29e6: 85a6 mv a1,s1 + 29e8: 00003517 auipc a0,0x3 + 29ec: 78850513 addi a0,a0,1928 # 6170 <malloc+0x1264> + 29f0: 468020ef jal ra,4e58 <printf> + exit(1); + 29f4: 4505 li a0,1 + 29f6: 03e020ef jal ra,4a34 <exit> + printf("%s: chdir iputdir failed\n", s); + 29fa: 85a6 mv a1,s1 + 29fc: 00003517 auipc a0,0x3 + 2a00: 78c50513 addi a0,a0,1932 # 6188 <malloc+0x127c> + 2a04: 454020ef jal ra,4e58 <printf> + exit(1); + 2a08: 4505 li a0,1 + 2a0a: 02a020ef jal ra,4a34 <exit> + printf("%s: unlink ../iputdir failed\n", s); + 2a0e: 85a6 mv a1,s1 + 2a10: 00003517 auipc a0,0x3 + 2a14: 7a850513 addi a0,a0,1960 # 61b8 <malloc+0x12ac> + 2a18: 440020ef jal ra,4e58 <printf> + exit(1); + 2a1c: 4505 li a0,1 + 2a1e: 016020ef jal ra,4a34 <exit> + printf("%s: chdir / failed\n", s); + 2a22: 85a6 mv a1,s1 + 2a24: 00003517 auipc a0,0x3 + 2a28: 7bc50513 addi a0,a0,1980 # 61e0 <malloc+0x12d4> + 2a2c: 42c020ef jal ra,4e58 <printf> + exit(1); + 2a30: 4505 li a0,1 + 2a32: 002020ef jal ra,4a34 <exit> + +0000000000002a36 <exitiputtest>: +{ + 2a36: 7179 addi sp,sp,-48 + 2a38: f406 sd ra,40(sp) + 2a3a: f022 sd s0,32(sp) + 2a3c: ec26 sd s1,24(sp) + 2a3e: 1800 addi s0,sp,48 + 2a40: 84aa mv s1,a0 + pid = fork(); + 2a42: 7eb010ef jal ra,4a2c <fork> + if(pid < 0){ + 2a46: 02054e63 bltz a0,2a82 <exitiputtest+0x4c> + if(pid == 0){ + 2a4a: e541 bnez a0,2ad2 <exitiputtest+0x9c> + if(mkdir("iputdir") < 0){ + 2a4c: 00003517 auipc a0,0x3 + 2a50: 71c50513 addi a0,a0,1820 # 6168 <malloc+0x125c> + 2a54: 048020ef jal ra,4a9c <mkdir> + 2a58: 02054f63 bltz a0,2a96 <exitiputtest+0x60> + if(chdir("iputdir") < 0){ + 2a5c: 00003517 auipc a0,0x3 + 2a60: 70c50513 addi a0,a0,1804 # 6168 <malloc+0x125c> + 2a64: 040020ef jal ra,4aa4 <chdir> + 2a68: 04054163 bltz a0,2aaa <exitiputtest+0x74> + if(unlink("../iputdir") < 0){ + 2a6c: 00003517 auipc a0,0x3 + 2a70: 73c50513 addi a0,a0,1852 # 61a8 <malloc+0x129c> + 2a74: 010020ef jal ra,4a84 <unlink> + 2a78: 04054363 bltz a0,2abe <exitiputtest+0x88> + exit(0); + 2a7c: 4501 li a0,0 + 2a7e: 7b7010ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 2a82: 85a6 mv a1,s1 + 2a84: 00003517 auipc a0,0x3 + 2a88: e3450513 addi a0,a0,-460 # 58b8 <malloc+0x9ac> + 2a8c: 3cc020ef jal ra,4e58 <printf> + exit(1); + 2a90: 4505 li a0,1 + 2a92: 7a3010ef jal ra,4a34 <exit> + printf("%s: mkdir failed\n", s); + 2a96: 85a6 mv a1,s1 + 2a98: 00003517 auipc a0,0x3 + 2a9c: 6d850513 addi a0,a0,1752 # 6170 <malloc+0x1264> + 2aa0: 3b8020ef jal ra,4e58 <printf> + exit(1); + 2aa4: 4505 li a0,1 + 2aa6: 78f010ef jal ra,4a34 <exit> + printf("%s: child chdir failed\n", s); + 2aaa: 85a6 mv a1,s1 + 2aac: 00003517 auipc a0,0x3 + 2ab0: 74c50513 addi a0,a0,1868 # 61f8 <malloc+0x12ec> + 2ab4: 3a4020ef jal ra,4e58 <printf> + exit(1); + 2ab8: 4505 li a0,1 + 2aba: 77b010ef jal ra,4a34 <exit> + printf("%s: unlink ../iputdir failed\n", s); + 2abe: 85a6 mv a1,s1 + 2ac0: 00003517 auipc a0,0x3 + 2ac4: 6f850513 addi a0,a0,1784 # 61b8 <malloc+0x12ac> + 2ac8: 390020ef jal ra,4e58 <printf> + exit(1); + 2acc: 4505 li a0,1 + 2ace: 767010ef jal ra,4a34 <exit> + wait(&xstatus); + 2ad2: fdc40513 addi a0,s0,-36 + 2ad6: 767010ef jal ra,4a3c <wait> + exit(xstatus); + 2ada: fdc42503 lw a0,-36(s0) + 2ade: 757010ef jal ra,4a34 <exit> + +0000000000002ae2 <dirtest>: +{ + 2ae2: 1101 addi sp,sp,-32 + 2ae4: ec06 sd ra,24(sp) + 2ae6: e822 sd s0,16(sp) + 2ae8: e426 sd s1,8(sp) + 2aea: 1000 addi s0,sp,32 + 2aec: 84aa mv s1,a0 + if(mkdir("dir0") < 0){ + 2aee: 00003517 auipc a0,0x3 + 2af2: 72250513 addi a0,a0,1826 # 6210 <malloc+0x1304> + 2af6: 7a7010ef jal ra,4a9c <mkdir> + 2afa: 02054f63 bltz a0,2b38 <dirtest+0x56> + if(chdir("dir0") < 0){ + 2afe: 00003517 auipc a0,0x3 + 2b02: 71250513 addi a0,a0,1810 # 6210 <malloc+0x1304> + 2b06: 79f010ef jal ra,4aa4 <chdir> + 2b0a: 04054163 bltz a0,2b4c <dirtest+0x6a> + if(chdir("..") < 0){ + 2b0e: 00003517 auipc a0,0x3 + 2b12: 72250513 addi a0,a0,1826 # 6230 <malloc+0x1324> + 2b16: 78f010ef jal ra,4aa4 <chdir> + 2b1a: 04054363 bltz a0,2b60 <dirtest+0x7e> + if(unlink("dir0") < 0){ + 2b1e: 00003517 auipc a0,0x3 + 2b22: 6f250513 addi a0,a0,1778 # 6210 <malloc+0x1304> + 2b26: 75f010ef jal ra,4a84 <unlink> + 2b2a: 04054563 bltz a0,2b74 <dirtest+0x92> +} + 2b2e: 60e2 ld ra,24(sp) + 2b30: 6442 ld s0,16(sp) + 2b32: 64a2 ld s1,8(sp) + 2b34: 6105 addi sp,sp,32 + 2b36: 8082 ret + printf("%s: mkdir failed\n", s); + 2b38: 85a6 mv a1,s1 + 2b3a: 00003517 auipc a0,0x3 + 2b3e: 63650513 addi a0,a0,1590 # 6170 <malloc+0x1264> + 2b42: 316020ef jal ra,4e58 <printf> + exit(1); + 2b46: 4505 li a0,1 + 2b48: 6ed010ef jal ra,4a34 <exit> + printf("%s: chdir dir0 failed\n", s); + 2b4c: 85a6 mv a1,s1 + 2b4e: 00003517 auipc a0,0x3 + 2b52: 6ca50513 addi a0,a0,1738 # 6218 <malloc+0x130c> + 2b56: 302020ef jal ra,4e58 <printf> + exit(1); + 2b5a: 4505 li a0,1 + 2b5c: 6d9010ef jal ra,4a34 <exit> + printf("%s: chdir .. failed\n", s); + 2b60: 85a6 mv a1,s1 + 2b62: 00003517 auipc a0,0x3 + 2b66: 6d650513 addi a0,a0,1750 # 6238 <malloc+0x132c> + 2b6a: 2ee020ef jal ra,4e58 <printf> + exit(1); + 2b6e: 4505 li a0,1 + 2b70: 6c5010ef jal ra,4a34 <exit> + printf("%s: unlink dir0 failed\n", s); + 2b74: 85a6 mv a1,s1 + 2b76: 00003517 auipc a0,0x3 + 2b7a: 6da50513 addi a0,a0,1754 # 6250 <malloc+0x1344> + 2b7e: 2da020ef jal ra,4e58 <printf> + exit(1); + 2b82: 4505 li a0,1 + 2b84: 6b1010ef jal ra,4a34 <exit> + +0000000000002b88 <subdir>: +{ + 2b88: 1101 addi sp,sp,-32 + 2b8a: ec06 sd ra,24(sp) + 2b8c: e822 sd s0,16(sp) + 2b8e: e426 sd s1,8(sp) + 2b90: e04a sd s2,0(sp) + 2b92: 1000 addi s0,sp,32 + 2b94: 892a mv s2,a0 + unlink("ff"); + 2b96: 00004517 auipc a0,0x4 + 2b9a: 80250513 addi a0,a0,-2046 # 6398 <malloc+0x148c> + 2b9e: 6e7010ef jal ra,4a84 <unlink> + if(mkdir("dd") != 0){ + 2ba2: 00003517 auipc a0,0x3 + 2ba6: 6c650513 addi a0,a0,1734 # 6268 <malloc+0x135c> + 2baa: 6f3010ef jal ra,4a9c <mkdir> + 2bae: 2e051263 bnez a0,2e92 <subdir+0x30a> + fd = open("dd/ff", O_CREATE | O_RDWR); + 2bb2: 20200593 li a1,514 + 2bb6: 00003517 auipc a0,0x3 + 2bba: 6d250513 addi a0,a0,1746 # 6288 <malloc+0x137c> + 2bbe: 6b7010ef jal ra,4a74 <open> + 2bc2: 84aa mv s1,a0 + if(fd < 0){ + 2bc4: 2e054163 bltz a0,2ea6 <subdir+0x31e> + write(fd, "ff", 2); + 2bc8: 4609 li a2,2 + 2bca: 00003597 auipc a1,0x3 + 2bce: 7ce58593 addi a1,a1,1998 # 6398 <malloc+0x148c> + 2bd2: 683010ef jal ra,4a54 <write> + close(fd); + 2bd6: 8526 mv a0,s1 + 2bd8: 685010ef jal ra,4a5c <close> + if(unlink("dd") >= 0){ + 2bdc: 00003517 auipc a0,0x3 + 2be0: 68c50513 addi a0,a0,1676 # 6268 <malloc+0x135c> + 2be4: 6a1010ef jal ra,4a84 <unlink> + 2be8: 2c055963 bgez a0,2eba <subdir+0x332> + if(mkdir("/dd/dd") != 0){ + 2bec: 00003517 auipc a0,0x3 + 2bf0: 6f450513 addi a0,a0,1780 # 62e0 <malloc+0x13d4> + 2bf4: 6a9010ef jal ra,4a9c <mkdir> + 2bf8: 2c051b63 bnez a0,2ece <subdir+0x346> + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + 2bfc: 20200593 li a1,514 + 2c00: 00003517 auipc a0,0x3 + 2c04: 70850513 addi a0,a0,1800 # 6308 <malloc+0x13fc> + 2c08: 66d010ef jal ra,4a74 <open> + 2c0c: 84aa mv s1,a0 + if(fd < 0){ + 2c0e: 2c054a63 bltz a0,2ee2 <subdir+0x35a> + write(fd, "FF", 2); + 2c12: 4609 li a2,2 + 2c14: 00003597 auipc a1,0x3 + 2c18: 72458593 addi a1,a1,1828 # 6338 <malloc+0x142c> + 2c1c: 639010ef jal ra,4a54 <write> + close(fd); + 2c20: 8526 mv a0,s1 + 2c22: 63b010ef jal ra,4a5c <close> + fd = open("dd/dd/../ff", 0); + 2c26: 4581 li a1,0 + 2c28: 00003517 auipc a0,0x3 + 2c2c: 71850513 addi a0,a0,1816 # 6340 <malloc+0x1434> + 2c30: 645010ef jal ra,4a74 <open> + 2c34: 84aa mv s1,a0 + if(fd < 0){ + 2c36: 2c054063 bltz a0,2ef6 <subdir+0x36e> + cc = read(fd, buf, sizeof(buf)); + 2c3a: 660d lui a2,0x3 + 2c3c: 00009597 auipc a1,0x9 + 2c40: 03c58593 addi a1,a1,60 # bc78 <buf> + 2c44: 609010ef jal ra,4a4c <read> + if(cc != 2 || buf[0] != 'f'){ + 2c48: 4789 li a5,2 + 2c4a: 2cf51063 bne a0,a5,2f0a <subdir+0x382> + 2c4e: 00009717 auipc a4,0x9 + 2c52: 02a74703 lbu a4,42(a4) # bc78 <buf> + 2c56: 06600793 li a5,102 + 2c5a: 2af71863 bne a4,a5,2f0a <subdir+0x382> + close(fd); + 2c5e: 8526 mv a0,s1 + 2c60: 5fd010ef jal ra,4a5c <close> + if(link("dd/dd/ff", "dd/dd/ffff") != 0){ + 2c64: 00003597 auipc a1,0x3 + 2c68: 72c58593 addi a1,a1,1836 # 6390 <malloc+0x1484> + 2c6c: 00003517 auipc a0,0x3 + 2c70: 69c50513 addi a0,a0,1692 # 6308 <malloc+0x13fc> + 2c74: 621010ef jal ra,4a94 <link> + 2c78: 2a051363 bnez a0,2f1e <subdir+0x396> + if(unlink("dd/dd/ff") != 0){ + 2c7c: 00003517 auipc a0,0x3 + 2c80: 68c50513 addi a0,a0,1676 # 6308 <malloc+0x13fc> + 2c84: 601010ef jal ra,4a84 <unlink> + 2c88: 2a051563 bnez a0,2f32 <subdir+0x3aa> + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2c8c: 4581 li a1,0 + 2c8e: 00003517 auipc a0,0x3 + 2c92: 67a50513 addi a0,a0,1658 # 6308 <malloc+0x13fc> + 2c96: 5df010ef jal ra,4a74 <open> + 2c9a: 2a055663 bgez a0,2f46 <subdir+0x3be> + if(chdir("dd") != 0){ + 2c9e: 00003517 auipc a0,0x3 + 2ca2: 5ca50513 addi a0,a0,1482 # 6268 <malloc+0x135c> + 2ca6: 5ff010ef jal ra,4aa4 <chdir> + 2caa: 2a051863 bnez a0,2f5a <subdir+0x3d2> + if(chdir("dd/../../dd") != 0){ + 2cae: 00003517 auipc a0,0x3 + 2cb2: 77a50513 addi a0,a0,1914 # 6428 <malloc+0x151c> + 2cb6: 5ef010ef jal ra,4aa4 <chdir> + 2cba: 2a051a63 bnez a0,2f6e <subdir+0x3e6> + if(chdir("dd/../../../dd") != 0){ + 2cbe: 00003517 auipc a0,0x3 + 2cc2: 79a50513 addi a0,a0,1946 # 6458 <malloc+0x154c> + 2cc6: 5df010ef jal ra,4aa4 <chdir> + 2cca: 2a051c63 bnez a0,2f82 <subdir+0x3fa> + if(chdir("./..") != 0){ + 2cce: 00003517 auipc a0,0x3 + 2cd2: 7c250513 addi a0,a0,1986 # 6490 <malloc+0x1584> + 2cd6: 5cf010ef jal ra,4aa4 <chdir> + 2cda: 2a051e63 bnez a0,2f96 <subdir+0x40e> + fd = open("dd/dd/ffff", 0); + 2cde: 4581 li a1,0 + 2ce0: 00003517 auipc a0,0x3 + 2ce4: 6b050513 addi a0,a0,1712 # 6390 <malloc+0x1484> + 2ce8: 58d010ef jal ra,4a74 <open> + 2cec: 84aa mv s1,a0 + if(fd < 0){ + 2cee: 2a054e63 bltz a0,2faa <subdir+0x422> + if(read(fd, buf, sizeof(buf)) != 2){ + 2cf2: 660d lui a2,0x3 + 2cf4: 00009597 auipc a1,0x9 + 2cf8: f8458593 addi a1,a1,-124 # bc78 <buf> + 2cfc: 551010ef jal ra,4a4c <read> + 2d00: 4789 li a5,2 + 2d02: 2af51e63 bne a0,a5,2fbe <subdir+0x436> + close(fd); + 2d06: 8526 mv a0,s1 + 2d08: 555010ef jal ra,4a5c <close> + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2d0c: 4581 li a1,0 + 2d0e: 00003517 auipc a0,0x3 + 2d12: 5fa50513 addi a0,a0,1530 # 6308 <malloc+0x13fc> + 2d16: 55f010ef jal ra,4a74 <open> + 2d1a: 2a055c63 bgez a0,2fd2 <subdir+0x44a> + if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ + 2d1e: 20200593 li a1,514 + 2d22: 00003517 auipc a0,0x3 + 2d26: 7fe50513 addi a0,a0,2046 # 6520 <malloc+0x1614> + 2d2a: 54b010ef jal ra,4a74 <open> + 2d2e: 2a055c63 bgez a0,2fe6 <subdir+0x45e> + if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ + 2d32: 20200593 li a1,514 + 2d36: 00004517 auipc a0,0x4 + 2d3a: 81a50513 addi a0,a0,-2022 # 6550 <malloc+0x1644> + 2d3e: 537010ef jal ra,4a74 <open> + 2d42: 2a055c63 bgez a0,2ffa <subdir+0x472> + if(open("dd", O_CREATE) >= 0){ + 2d46: 20000593 li a1,512 + 2d4a: 00003517 auipc a0,0x3 + 2d4e: 51e50513 addi a0,a0,1310 # 6268 <malloc+0x135c> + 2d52: 523010ef jal ra,4a74 <open> + 2d56: 2a055c63 bgez a0,300e <subdir+0x486> + if(open("dd", O_RDWR) >= 0){ + 2d5a: 4589 li a1,2 + 2d5c: 00003517 auipc a0,0x3 + 2d60: 50c50513 addi a0,a0,1292 # 6268 <malloc+0x135c> + 2d64: 511010ef jal ra,4a74 <open> + 2d68: 2a055d63 bgez a0,3022 <subdir+0x49a> + if(open("dd", O_WRONLY) >= 0){ + 2d6c: 4585 li a1,1 + 2d6e: 00003517 auipc a0,0x3 + 2d72: 4fa50513 addi a0,a0,1274 # 6268 <malloc+0x135c> + 2d76: 4ff010ef jal ra,4a74 <open> + 2d7a: 2a055e63 bgez a0,3036 <subdir+0x4ae> + if(link("dd/ff/ff", "dd/dd/xx") == 0){ + 2d7e: 00004597 auipc a1,0x4 + 2d82: 86258593 addi a1,a1,-1950 # 65e0 <malloc+0x16d4> + 2d86: 00003517 auipc a0,0x3 + 2d8a: 79a50513 addi a0,a0,1946 # 6520 <malloc+0x1614> + 2d8e: 507010ef jal ra,4a94 <link> + 2d92: 2a050c63 beqz a0,304a <subdir+0x4c2> + if(link("dd/xx/ff", "dd/dd/xx") == 0){ + 2d96: 00004597 auipc a1,0x4 + 2d9a: 84a58593 addi a1,a1,-1974 # 65e0 <malloc+0x16d4> + 2d9e: 00003517 auipc a0,0x3 + 2da2: 7b250513 addi a0,a0,1970 # 6550 <malloc+0x1644> + 2da6: 4ef010ef jal ra,4a94 <link> + 2daa: 2a050a63 beqz a0,305e <subdir+0x4d6> + if(link("dd/ff", "dd/dd/ffff") == 0){ + 2dae: 00003597 auipc a1,0x3 + 2db2: 5e258593 addi a1,a1,1506 # 6390 <malloc+0x1484> + 2db6: 00003517 auipc a0,0x3 + 2dba: 4d250513 addi a0,a0,1234 # 6288 <malloc+0x137c> + 2dbe: 4d7010ef jal ra,4a94 <link> + 2dc2: 2a050863 beqz a0,3072 <subdir+0x4ea> + if(mkdir("dd/ff/ff") == 0){ + 2dc6: 00003517 auipc a0,0x3 + 2dca: 75a50513 addi a0,a0,1882 # 6520 <malloc+0x1614> + 2dce: 4cf010ef jal ra,4a9c <mkdir> + 2dd2: 2a050a63 beqz a0,3086 <subdir+0x4fe> + if(mkdir("dd/xx/ff") == 0){ + 2dd6: 00003517 auipc a0,0x3 + 2dda: 77a50513 addi a0,a0,1914 # 6550 <malloc+0x1644> + 2dde: 4bf010ef jal ra,4a9c <mkdir> + 2de2: 2a050c63 beqz a0,309a <subdir+0x512> + if(mkdir("dd/dd/ffff") == 0){ + 2de6: 00003517 auipc a0,0x3 + 2dea: 5aa50513 addi a0,a0,1450 # 6390 <malloc+0x1484> + 2dee: 4af010ef jal ra,4a9c <mkdir> + 2df2: 2a050e63 beqz a0,30ae <subdir+0x526> + if(unlink("dd/xx/ff") == 0){ + 2df6: 00003517 auipc a0,0x3 + 2dfa: 75a50513 addi a0,a0,1882 # 6550 <malloc+0x1644> + 2dfe: 487010ef jal ra,4a84 <unlink> + 2e02: 2c050063 beqz a0,30c2 <subdir+0x53a> + if(unlink("dd/ff/ff") == 0){ + 2e06: 00003517 auipc a0,0x3 + 2e0a: 71a50513 addi a0,a0,1818 # 6520 <malloc+0x1614> + 2e0e: 477010ef jal ra,4a84 <unlink> + 2e12: 2c050263 beqz a0,30d6 <subdir+0x54e> + if(chdir("dd/ff") == 0){ + 2e16: 00003517 auipc a0,0x3 + 2e1a: 47250513 addi a0,a0,1138 # 6288 <malloc+0x137c> + 2e1e: 487010ef jal ra,4aa4 <chdir> + 2e22: 2c050463 beqz a0,30ea <subdir+0x562> + if(chdir("dd/xx") == 0){ + 2e26: 00004517 auipc a0,0x4 + 2e2a: 90a50513 addi a0,a0,-1782 # 6730 <malloc+0x1824> + 2e2e: 477010ef jal ra,4aa4 <chdir> + 2e32: 2c050663 beqz a0,30fe <subdir+0x576> + if(unlink("dd/dd/ffff") != 0){ + 2e36: 00003517 auipc a0,0x3 + 2e3a: 55a50513 addi a0,a0,1370 # 6390 <malloc+0x1484> + 2e3e: 447010ef jal ra,4a84 <unlink> + 2e42: 2c051863 bnez a0,3112 <subdir+0x58a> + if(unlink("dd/ff") != 0){ + 2e46: 00003517 auipc a0,0x3 + 2e4a: 44250513 addi a0,a0,1090 # 6288 <malloc+0x137c> + 2e4e: 437010ef jal ra,4a84 <unlink> + 2e52: 2c051a63 bnez a0,3126 <subdir+0x59e> + if(unlink("dd") == 0){ + 2e56: 00003517 auipc a0,0x3 + 2e5a: 41250513 addi a0,a0,1042 # 6268 <malloc+0x135c> + 2e5e: 427010ef jal ra,4a84 <unlink> + 2e62: 2c050c63 beqz a0,313a <subdir+0x5b2> + if(unlink("dd/dd") < 0){ + 2e66: 00004517 auipc a0,0x4 + 2e6a: 93a50513 addi a0,a0,-1734 # 67a0 <malloc+0x1894> + 2e6e: 417010ef jal ra,4a84 <unlink> + 2e72: 2c054e63 bltz a0,314e <subdir+0x5c6> + if(unlink("dd") < 0){ + 2e76: 00003517 auipc a0,0x3 + 2e7a: 3f250513 addi a0,a0,1010 # 6268 <malloc+0x135c> + 2e7e: 407010ef jal ra,4a84 <unlink> + 2e82: 2e054063 bltz a0,3162 <subdir+0x5da> +} + 2e86: 60e2 ld ra,24(sp) + 2e88: 6442 ld s0,16(sp) + 2e8a: 64a2 ld s1,8(sp) + 2e8c: 6902 ld s2,0(sp) + 2e8e: 6105 addi sp,sp,32 + 2e90: 8082 ret + printf("%s: mkdir dd failed\n", s); + 2e92: 85ca mv a1,s2 + 2e94: 00003517 auipc a0,0x3 + 2e98: 3dc50513 addi a0,a0,988 # 6270 <malloc+0x1364> + 2e9c: 7bd010ef jal ra,4e58 <printf> + exit(1); + 2ea0: 4505 li a0,1 + 2ea2: 393010ef jal ra,4a34 <exit> + printf("%s: create dd/ff failed\n", s); + 2ea6: 85ca mv a1,s2 + 2ea8: 00003517 auipc a0,0x3 + 2eac: 3e850513 addi a0,a0,1000 # 6290 <malloc+0x1384> + 2eb0: 7a9010ef jal ra,4e58 <printf> + exit(1); + 2eb4: 4505 li a0,1 + 2eb6: 37f010ef jal ra,4a34 <exit> + printf("%s: unlink dd (non-empty dir) succeeded!\n", s); + 2eba: 85ca mv a1,s2 + 2ebc: 00003517 auipc a0,0x3 + 2ec0: 3f450513 addi a0,a0,1012 # 62b0 <malloc+0x13a4> + 2ec4: 795010ef jal ra,4e58 <printf> + exit(1); + 2ec8: 4505 li a0,1 + 2eca: 36b010ef jal ra,4a34 <exit> + printf("%s: subdir mkdir dd/dd failed\n", s); + 2ece: 85ca mv a1,s2 + 2ed0: 00003517 auipc a0,0x3 + 2ed4: 41850513 addi a0,a0,1048 # 62e8 <malloc+0x13dc> + 2ed8: 781010ef jal ra,4e58 <printf> + exit(1); + 2edc: 4505 li a0,1 + 2ede: 357010ef jal ra,4a34 <exit> + printf("%s: create dd/dd/ff failed\n", s); + 2ee2: 85ca mv a1,s2 + 2ee4: 00003517 auipc a0,0x3 + 2ee8: 43450513 addi a0,a0,1076 # 6318 <malloc+0x140c> + 2eec: 76d010ef jal ra,4e58 <printf> + exit(1); + 2ef0: 4505 li a0,1 + 2ef2: 343010ef jal ra,4a34 <exit> + printf("%s: open dd/dd/../ff failed\n", s); + 2ef6: 85ca mv a1,s2 + 2ef8: 00003517 auipc a0,0x3 + 2efc: 45850513 addi a0,a0,1112 # 6350 <malloc+0x1444> + 2f00: 759010ef jal ra,4e58 <printf> + exit(1); + 2f04: 4505 li a0,1 + 2f06: 32f010ef jal ra,4a34 <exit> + printf("%s: dd/dd/../ff wrong content\n", s); + 2f0a: 85ca mv a1,s2 + 2f0c: 00003517 auipc a0,0x3 + 2f10: 46450513 addi a0,a0,1124 # 6370 <malloc+0x1464> + 2f14: 745010ef jal ra,4e58 <printf> + exit(1); + 2f18: 4505 li a0,1 + 2f1a: 31b010ef jal ra,4a34 <exit> + printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s); + 2f1e: 85ca mv a1,s2 + 2f20: 00003517 auipc a0,0x3 + 2f24: 48050513 addi a0,a0,1152 # 63a0 <malloc+0x1494> + 2f28: 731010ef jal ra,4e58 <printf> + exit(1); + 2f2c: 4505 li a0,1 + 2f2e: 307010ef jal ra,4a34 <exit> + printf("%s: unlink dd/dd/ff failed\n", s); + 2f32: 85ca mv a1,s2 + 2f34: 00003517 auipc a0,0x3 + 2f38: 49450513 addi a0,a0,1172 # 63c8 <malloc+0x14bc> + 2f3c: 71d010ef jal ra,4e58 <printf> + exit(1); + 2f40: 4505 li a0,1 + 2f42: 2f3010ef jal ra,4a34 <exit> + printf("%s: open (unlinked) dd/dd/ff succeeded\n", s); + 2f46: 85ca mv a1,s2 + 2f48: 00003517 auipc a0,0x3 + 2f4c: 4a050513 addi a0,a0,1184 # 63e8 <malloc+0x14dc> + 2f50: 709010ef jal ra,4e58 <printf> + exit(1); + 2f54: 4505 li a0,1 + 2f56: 2df010ef jal ra,4a34 <exit> + printf("%s: chdir dd failed\n", s); + 2f5a: 85ca mv a1,s2 + 2f5c: 00003517 auipc a0,0x3 + 2f60: 4b450513 addi a0,a0,1204 # 6410 <malloc+0x1504> + 2f64: 6f5010ef jal ra,4e58 <printf> + exit(1); + 2f68: 4505 li a0,1 + 2f6a: 2cb010ef jal ra,4a34 <exit> + printf("%s: chdir dd/../../dd failed\n", s); + 2f6e: 85ca mv a1,s2 + 2f70: 00003517 auipc a0,0x3 + 2f74: 4c850513 addi a0,a0,1224 # 6438 <malloc+0x152c> + 2f78: 6e1010ef jal ra,4e58 <printf> + exit(1); + 2f7c: 4505 li a0,1 + 2f7e: 2b7010ef jal ra,4a34 <exit> + printf("%s: chdir dd/../../../dd failed\n", s); + 2f82: 85ca mv a1,s2 + 2f84: 00003517 auipc a0,0x3 + 2f88: 4e450513 addi a0,a0,1252 # 6468 <malloc+0x155c> + 2f8c: 6cd010ef jal ra,4e58 <printf> + exit(1); + 2f90: 4505 li a0,1 + 2f92: 2a3010ef jal ra,4a34 <exit> + printf("%s: chdir ./.. failed\n", s); + 2f96: 85ca mv a1,s2 + 2f98: 00003517 auipc a0,0x3 + 2f9c: 50050513 addi a0,a0,1280 # 6498 <malloc+0x158c> + 2fa0: 6b9010ef jal ra,4e58 <printf> + exit(1); + 2fa4: 4505 li a0,1 + 2fa6: 28f010ef jal ra,4a34 <exit> + printf("%s: open dd/dd/ffff failed\n", s); + 2faa: 85ca mv a1,s2 + 2fac: 00003517 auipc a0,0x3 + 2fb0: 50450513 addi a0,a0,1284 # 64b0 <malloc+0x15a4> + 2fb4: 6a5010ef jal ra,4e58 <printf> + exit(1); + 2fb8: 4505 li a0,1 + 2fba: 27b010ef jal ra,4a34 <exit> + printf("%s: read dd/dd/ffff wrong len\n", s); + 2fbe: 85ca mv a1,s2 + 2fc0: 00003517 auipc a0,0x3 + 2fc4: 51050513 addi a0,a0,1296 # 64d0 <malloc+0x15c4> + 2fc8: 691010ef jal ra,4e58 <printf> + exit(1); + 2fcc: 4505 li a0,1 + 2fce: 267010ef jal ra,4a34 <exit> + printf("%s: open (unlinked) dd/dd/ff succeeded!\n", s); + 2fd2: 85ca mv a1,s2 + 2fd4: 00003517 auipc a0,0x3 + 2fd8: 51c50513 addi a0,a0,1308 # 64f0 <malloc+0x15e4> + 2fdc: 67d010ef jal ra,4e58 <printf> + exit(1); + 2fe0: 4505 li a0,1 + 2fe2: 253010ef jal ra,4a34 <exit> + printf("%s: create dd/ff/ff succeeded!\n", s); + 2fe6: 85ca mv a1,s2 + 2fe8: 00003517 auipc a0,0x3 + 2fec: 54850513 addi a0,a0,1352 # 6530 <malloc+0x1624> + 2ff0: 669010ef jal ra,4e58 <printf> + exit(1); + 2ff4: 4505 li a0,1 + 2ff6: 23f010ef jal ra,4a34 <exit> + printf("%s: create dd/xx/ff succeeded!\n", s); + 2ffa: 85ca mv a1,s2 + 2ffc: 00003517 auipc a0,0x3 + 3000: 56450513 addi a0,a0,1380 # 6560 <malloc+0x1654> + 3004: 655010ef jal ra,4e58 <printf> + exit(1); + 3008: 4505 li a0,1 + 300a: 22b010ef jal ra,4a34 <exit> + printf("%s: create dd succeeded!\n", s); + 300e: 85ca mv a1,s2 + 3010: 00003517 auipc a0,0x3 + 3014: 57050513 addi a0,a0,1392 # 6580 <malloc+0x1674> + 3018: 641010ef jal ra,4e58 <printf> + exit(1); + 301c: 4505 li a0,1 + 301e: 217010ef jal ra,4a34 <exit> + printf("%s: open dd rdwr succeeded!\n", s); + 3022: 85ca mv a1,s2 + 3024: 00003517 auipc a0,0x3 + 3028: 57c50513 addi a0,a0,1404 # 65a0 <malloc+0x1694> + 302c: 62d010ef jal ra,4e58 <printf> + exit(1); + 3030: 4505 li a0,1 + 3032: 203010ef jal ra,4a34 <exit> + printf("%s: open dd wronly succeeded!\n", s); + 3036: 85ca mv a1,s2 + 3038: 00003517 auipc a0,0x3 + 303c: 58850513 addi a0,a0,1416 # 65c0 <malloc+0x16b4> + 3040: 619010ef jal ra,4e58 <printf> + exit(1); + 3044: 4505 li a0,1 + 3046: 1ef010ef jal ra,4a34 <exit> + printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s); + 304a: 85ca mv a1,s2 + 304c: 00003517 auipc a0,0x3 + 3050: 5a450513 addi a0,a0,1444 # 65f0 <malloc+0x16e4> + 3054: 605010ef jal ra,4e58 <printf> + exit(1); + 3058: 4505 li a0,1 + 305a: 1db010ef jal ra,4a34 <exit> + printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s); + 305e: 85ca mv a1,s2 + 3060: 00003517 auipc a0,0x3 + 3064: 5b850513 addi a0,a0,1464 # 6618 <malloc+0x170c> + 3068: 5f1010ef jal ra,4e58 <printf> + exit(1); + 306c: 4505 li a0,1 + 306e: 1c7010ef jal ra,4a34 <exit> + printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s); + 3072: 85ca mv a1,s2 + 3074: 00003517 auipc a0,0x3 + 3078: 5cc50513 addi a0,a0,1484 # 6640 <malloc+0x1734> + 307c: 5dd010ef jal ra,4e58 <printf> + exit(1); + 3080: 4505 li a0,1 + 3082: 1b3010ef jal ra,4a34 <exit> + printf("%s: mkdir dd/ff/ff succeeded!\n", s); + 3086: 85ca mv a1,s2 + 3088: 00003517 auipc a0,0x3 + 308c: 5e050513 addi a0,a0,1504 # 6668 <malloc+0x175c> + 3090: 5c9010ef jal ra,4e58 <printf> + exit(1); + 3094: 4505 li a0,1 + 3096: 19f010ef jal ra,4a34 <exit> + printf("%s: mkdir dd/xx/ff succeeded!\n", s); + 309a: 85ca mv a1,s2 + 309c: 00003517 auipc a0,0x3 + 30a0: 5ec50513 addi a0,a0,1516 # 6688 <malloc+0x177c> + 30a4: 5b5010ef jal ra,4e58 <printf> + exit(1); + 30a8: 4505 li a0,1 + 30aa: 18b010ef jal ra,4a34 <exit> + printf("%s: mkdir dd/dd/ffff succeeded!\n", s); + 30ae: 85ca mv a1,s2 + 30b0: 00003517 auipc a0,0x3 + 30b4: 5f850513 addi a0,a0,1528 # 66a8 <malloc+0x179c> + 30b8: 5a1010ef jal ra,4e58 <printf> + exit(1); + 30bc: 4505 li a0,1 + 30be: 177010ef jal ra,4a34 <exit> + printf("%s: unlink dd/xx/ff succeeded!\n", s); + 30c2: 85ca mv a1,s2 + 30c4: 00003517 auipc a0,0x3 + 30c8: 60c50513 addi a0,a0,1548 # 66d0 <malloc+0x17c4> + 30cc: 58d010ef jal ra,4e58 <printf> + exit(1); + 30d0: 4505 li a0,1 + 30d2: 163010ef jal ra,4a34 <exit> + printf("%s: unlink dd/ff/ff succeeded!\n", s); + 30d6: 85ca mv a1,s2 + 30d8: 00003517 auipc a0,0x3 + 30dc: 61850513 addi a0,a0,1560 # 66f0 <malloc+0x17e4> + 30e0: 579010ef jal ra,4e58 <printf> + exit(1); + 30e4: 4505 li a0,1 + 30e6: 14f010ef jal ra,4a34 <exit> + printf("%s: chdir dd/ff succeeded!\n", s); + 30ea: 85ca mv a1,s2 + 30ec: 00003517 auipc a0,0x3 + 30f0: 62450513 addi a0,a0,1572 # 6710 <malloc+0x1804> + 30f4: 565010ef jal ra,4e58 <printf> + exit(1); + 30f8: 4505 li a0,1 + 30fa: 13b010ef jal ra,4a34 <exit> + printf("%s: chdir dd/xx succeeded!\n", s); + 30fe: 85ca mv a1,s2 + 3100: 00003517 auipc a0,0x3 + 3104: 63850513 addi a0,a0,1592 # 6738 <malloc+0x182c> + 3108: 551010ef jal ra,4e58 <printf> + exit(1); + 310c: 4505 li a0,1 + 310e: 127010ef jal ra,4a34 <exit> + printf("%s: unlink dd/dd/ff failed\n", s); + 3112: 85ca mv a1,s2 + 3114: 00003517 auipc a0,0x3 + 3118: 2b450513 addi a0,a0,692 # 63c8 <malloc+0x14bc> + 311c: 53d010ef jal ra,4e58 <printf> + exit(1); + 3120: 4505 li a0,1 + 3122: 113010ef jal ra,4a34 <exit> + printf("%s: unlink dd/ff failed\n", s); + 3126: 85ca mv a1,s2 + 3128: 00003517 auipc a0,0x3 + 312c: 63050513 addi a0,a0,1584 # 6758 <malloc+0x184c> + 3130: 529010ef jal ra,4e58 <printf> + exit(1); + 3134: 4505 li a0,1 + 3136: 0ff010ef jal ra,4a34 <exit> + printf("%s: unlink non-empty dd succeeded!\n", s); + 313a: 85ca mv a1,s2 + 313c: 00003517 auipc a0,0x3 + 3140: 63c50513 addi a0,a0,1596 # 6778 <malloc+0x186c> + 3144: 515010ef jal ra,4e58 <printf> + exit(1); + 3148: 4505 li a0,1 + 314a: 0eb010ef jal ra,4a34 <exit> + printf("%s: unlink dd/dd failed\n", s); + 314e: 85ca mv a1,s2 + 3150: 00003517 auipc a0,0x3 + 3154: 65850513 addi a0,a0,1624 # 67a8 <malloc+0x189c> + 3158: 501010ef jal ra,4e58 <printf> + exit(1); + 315c: 4505 li a0,1 + 315e: 0d7010ef jal ra,4a34 <exit> + printf("%s: unlink dd failed\n", s); + 3162: 85ca mv a1,s2 + 3164: 00003517 auipc a0,0x3 + 3168: 66450513 addi a0,a0,1636 # 67c8 <malloc+0x18bc> + 316c: 4ed010ef jal ra,4e58 <printf> + exit(1); + 3170: 4505 li a0,1 + 3172: 0c3010ef jal ra,4a34 <exit> + +0000000000003176 <rmdot>: +{ + 3176: 1101 addi sp,sp,-32 + 3178: ec06 sd ra,24(sp) + 317a: e822 sd s0,16(sp) + 317c: e426 sd s1,8(sp) + 317e: 1000 addi s0,sp,32 + 3180: 84aa mv s1,a0 + if(mkdir("dots") != 0){ + 3182: 00003517 auipc a0,0x3 + 3186: 65e50513 addi a0,a0,1630 # 67e0 <malloc+0x18d4> + 318a: 113010ef jal ra,4a9c <mkdir> + 318e: e53d bnez a0,31fc <rmdot+0x86> + if(chdir("dots") != 0){ + 3190: 00003517 auipc a0,0x3 + 3194: 65050513 addi a0,a0,1616 # 67e0 <malloc+0x18d4> + 3198: 10d010ef jal ra,4aa4 <chdir> + 319c: e935 bnez a0,3210 <rmdot+0x9a> + if(unlink(".") == 0){ + 319e: 00002517 auipc a0,0x2 + 31a2: 57250513 addi a0,a0,1394 # 5710 <malloc+0x804> + 31a6: 0df010ef jal ra,4a84 <unlink> + 31aa: cd2d beqz a0,3224 <rmdot+0xae> + if(unlink("..") == 0){ + 31ac: 00003517 auipc a0,0x3 + 31b0: 08450513 addi a0,a0,132 # 6230 <malloc+0x1324> + 31b4: 0d1010ef jal ra,4a84 <unlink> + 31b8: c141 beqz a0,3238 <rmdot+0xc2> + if(chdir("/") != 0){ + 31ba: 00003517 auipc a0,0x3 + 31be: 01e50513 addi a0,a0,30 # 61d8 <malloc+0x12cc> + 31c2: 0e3010ef jal ra,4aa4 <chdir> + 31c6: e159 bnez a0,324c <rmdot+0xd6> + if(unlink("dots/.") == 0){ + 31c8: 00003517 auipc a0,0x3 + 31cc: 68050513 addi a0,a0,1664 # 6848 <malloc+0x193c> + 31d0: 0b5010ef jal ra,4a84 <unlink> + 31d4: c551 beqz a0,3260 <rmdot+0xea> + if(unlink("dots/..") == 0){ + 31d6: 00003517 auipc a0,0x3 + 31da: 69a50513 addi a0,a0,1690 # 6870 <malloc+0x1964> + 31de: 0a7010ef jal ra,4a84 <unlink> + 31e2: c949 beqz a0,3274 <rmdot+0xfe> + if(unlink("dots") != 0){ + 31e4: 00003517 auipc a0,0x3 + 31e8: 5fc50513 addi a0,a0,1532 # 67e0 <malloc+0x18d4> + 31ec: 099010ef jal ra,4a84 <unlink> + 31f0: ed41 bnez a0,3288 <rmdot+0x112> +} + 31f2: 60e2 ld ra,24(sp) + 31f4: 6442 ld s0,16(sp) + 31f6: 64a2 ld s1,8(sp) + 31f8: 6105 addi sp,sp,32 + 31fa: 8082 ret + printf("%s: mkdir dots failed\n", s); + 31fc: 85a6 mv a1,s1 + 31fe: 00003517 auipc a0,0x3 + 3202: 5ea50513 addi a0,a0,1514 # 67e8 <malloc+0x18dc> + 3206: 453010ef jal ra,4e58 <printf> + exit(1); + 320a: 4505 li a0,1 + 320c: 029010ef jal ra,4a34 <exit> + printf("%s: chdir dots failed\n", s); + 3210: 85a6 mv a1,s1 + 3212: 00003517 auipc a0,0x3 + 3216: 5ee50513 addi a0,a0,1518 # 6800 <malloc+0x18f4> + 321a: 43f010ef jal ra,4e58 <printf> + exit(1); + 321e: 4505 li a0,1 + 3220: 015010ef jal ra,4a34 <exit> + printf("%s: rm . worked!\n", s); + 3224: 85a6 mv a1,s1 + 3226: 00003517 auipc a0,0x3 + 322a: 5f250513 addi a0,a0,1522 # 6818 <malloc+0x190c> + 322e: 42b010ef jal ra,4e58 <printf> + exit(1); + 3232: 4505 li a0,1 + 3234: 001010ef jal ra,4a34 <exit> + printf("%s: rm .. worked!\n", s); + 3238: 85a6 mv a1,s1 + 323a: 00003517 auipc a0,0x3 + 323e: 5f650513 addi a0,a0,1526 # 6830 <malloc+0x1924> + 3242: 417010ef jal ra,4e58 <printf> + exit(1); + 3246: 4505 li a0,1 + 3248: 7ec010ef jal ra,4a34 <exit> + printf("%s: chdir / failed\n", s); + 324c: 85a6 mv a1,s1 + 324e: 00003517 auipc a0,0x3 + 3252: f9250513 addi a0,a0,-110 # 61e0 <malloc+0x12d4> + 3256: 403010ef jal ra,4e58 <printf> + exit(1); + 325a: 4505 li a0,1 + 325c: 7d8010ef jal ra,4a34 <exit> + printf("%s: unlink dots/. worked!\n", s); + 3260: 85a6 mv a1,s1 + 3262: 00003517 auipc a0,0x3 + 3266: 5ee50513 addi a0,a0,1518 # 6850 <malloc+0x1944> + 326a: 3ef010ef jal ra,4e58 <printf> + exit(1); + 326e: 4505 li a0,1 + 3270: 7c4010ef jal ra,4a34 <exit> + printf("%s: unlink dots/.. worked!\n", s); + 3274: 85a6 mv a1,s1 + 3276: 00003517 auipc a0,0x3 + 327a: 60250513 addi a0,a0,1538 # 6878 <malloc+0x196c> + 327e: 3db010ef jal ra,4e58 <printf> + exit(1); + 3282: 4505 li a0,1 + 3284: 7b0010ef jal ra,4a34 <exit> + printf("%s: unlink dots failed!\n", s); + 3288: 85a6 mv a1,s1 + 328a: 00003517 auipc a0,0x3 + 328e: 60e50513 addi a0,a0,1550 # 6898 <malloc+0x198c> + 3292: 3c7010ef jal ra,4e58 <printf> + exit(1); + 3296: 4505 li a0,1 + 3298: 79c010ef jal ra,4a34 <exit> + +000000000000329c <dirfile>: +{ + 329c: 1101 addi sp,sp,-32 + 329e: ec06 sd ra,24(sp) + 32a0: e822 sd s0,16(sp) + 32a2: e426 sd s1,8(sp) + 32a4: e04a sd s2,0(sp) + 32a6: 1000 addi s0,sp,32 + 32a8: 892a mv s2,a0 + fd = open("dirfile", O_CREATE); + 32aa: 20000593 li a1,512 + 32ae: 00003517 auipc a0,0x3 + 32b2: 60a50513 addi a0,a0,1546 # 68b8 <malloc+0x19ac> + 32b6: 7be010ef jal ra,4a74 <open> + if(fd < 0){ + 32ba: 0c054563 bltz a0,3384 <dirfile+0xe8> + close(fd); + 32be: 79e010ef jal ra,4a5c <close> + if(chdir("dirfile") == 0){ + 32c2: 00003517 auipc a0,0x3 + 32c6: 5f650513 addi a0,a0,1526 # 68b8 <malloc+0x19ac> + 32ca: 7da010ef jal ra,4aa4 <chdir> + 32ce: c569 beqz a0,3398 <dirfile+0xfc> + fd = open("dirfile/xx", 0); + 32d0: 4581 li a1,0 + 32d2: 00003517 auipc a0,0x3 + 32d6: 62e50513 addi a0,a0,1582 # 6900 <malloc+0x19f4> + 32da: 79a010ef jal ra,4a74 <open> + if(fd >= 0){ + 32de: 0c055763 bgez a0,33ac <dirfile+0x110> + fd = open("dirfile/xx", O_CREATE); + 32e2: 20000593 li a1,512 + 32e6: 00003517 auipc a0,0x3 + 32ea: 61a50513 addi a0,a0,1562 # 6900 <malloc+0x19f4> + 32ee: 786010ef jal ra,4a74 <open> + if(fd >= 0){ + 32f2: 0c055763 bgez a0,33c0 <dirfile+0x124> + if(mkdir("dirfile/xx") == 0){ + 32f6: 00003517 auipc a0,0x3 + 32fa: 60a50513 addi a0,a0,1546 # 6900 <malloc+0x19f4> + 32fe: 79e010ef jal ra,4a9c <mkdir> + 3302: 0c050963 beqz a0,33d4 <dirfile+0x138> + if(unlink("dirfile/xx") == 0){ + 3306: 00003517 auipc a0,0x3 + 330a: 5fa50513 addi a0,a0,1530 # 6900 <malloc+0x19f4> + 330e: 776010ef jal ra,4a84 <unlink> + 3312: 0c050b63 beqz a0,33e8 <dirfile+0x14c> + if(link("README", "dirfile/xx") == 0){ + 3316: 00003597 auipc a1,0x3 + 331a: 5ea58593 addi a1,a1,1514 # 6900 <malloc+0x19f4> + 331e: 00002517 auipc a0,0x2 + 3322: ee250513 addi a0,a0,-286 # 5200 <malloc+0x2f4> + 3326: 76e010ef jal ra,4a94 <link> + 332a: 0c050963 beqz a0,33fc <dirfile+0x160> + if(unlink("dirfile") != 0){ + 332e: 00003517 auipc a0,0x3 + 3332: 58a50513 addi a0,a0,1418 # 68b8 <malloc+0x19ac> + 3336: 74e010ef jal ra,4a84 <unlink> + 333a: 0c051b63 bnez a0,3410 <dirfile+0x174> + fd = open(".", O_RDWR); + 333e: 4589 li a1,2 + 3340: 00002517 auipc a0,0x2 + 3344: 3d050513 addi a0,a0,976 # 5710 <malloc+0x804> + 3348: 72c010ef jal ra,4a74 <open> + if(fd >= 0){ + 334c: 0c055c63 bgez a0,3424 <dirfile+0x188> + fd = open(".", 0); + 3350: 4581 li a1,0 + 3352: 00002517 auipc a0,0x2 + 3356: 3be50513 addi a0,a0,958 # 5710 <malloc+0x804> + 335a: 71a010ef jal ra,4a74 <open> + 335e: 84aa mv s1,a0 + if(write(fd, "x", 1) > 0){ + 3360: 4605 li a2,1 + 3362: 00002597 auipc a1,0x2 + 3366: d3658593 addi a1,a1,-714 # 5098 <malloc+0x18c> + 336a: 6ea010ef jal ra,4a54 <write> + 336e: 0ca04563 bgtz a0,3438 <dirfile+0x19c> + close(fd); + 3372: 8526 mv a0,s1 + 3374: 6e8010ef jal ra,4a5c <close> +} + 3378: 60e2 ld ra,24(sp) + 337a: 6442 ld s0,16(sp) + 337c: 64a2 ld s1,8(sp) + 337e: 6902 ld s2,0(sp) + 3380: 6105 addi sp,sp,32 + 3382: 8082 ret + printf("%s: create dirfile failed\n", s); + 3384: 85ca mv a1,s2 + 3386: 00003517 auipc a0,0x3 + 338a: 53a50513 addi a0,a0,1338 # 68c0 <malloc+0x19b4> + 338e: 2cb010ef jal ra,4e58 <printf> + exit(1); + 3392: 4505 li a0,1 + 3394: 6a0010ef jal ra,4a34 <exit> + printf("%s: chdir dirfile succeeded!\n", s); + 3398: 85ca mv a1,s2 + 339a: 00003517 auipc a0,0x3 + 339e: 54650513 addi a0,a0,1350 # 68e0 <malloc+0x19d4> + 33a2: 2b7010ef jal ra,4e58 <printf> + exit(1); + 33a6: 4505 li a0,1 + 33a8: 68c010ef jal ra,4a34 <exit> + printf("%s: create dirfile/xx succeeded!\n", s); + 33ac: 85ca mv a1,s2 + 33ae: 00003517 auipc a0,0x3 + 33b2: 56250513 addi a0,a0,1378 # 6910 <malloc+0x1a04> + 33b6: 2a3010ef jal ra,4e58 <printf> + exit(1); + 33ba: 4505 li a0,1 + 33bc: 678010ef jal ra,4a34 <exit> + printf("%s: create dirfile/xx succeeded!\n", s); + 33c0: 85ca mv a1,s2 + 33c2: 00003517 auipc a0,0x3 + 33c6: 54e50513 addi a0,a0,1358 # 6910 <malloc+0x1a04> + 33ca: 28f010ef jal ra,4e58 <printf> + exit(1); + 33ce: 4505 li a0,1 + 33d0: 664010ef jal ra,4a34 <exit> + printf("%s: mkdir dirfile/xx succeeded!\n", s); + 33d4: 85ca mv a1,s2 + 33d6: 00003517 auipc a0,0x3 + 33da: 56250513 addi a0,a0,1378 # 6938 <malloc+0x1a2c> + 33de: 27b010ef jal ra,4e58 <printf> + exit(1); + 33e2: 4505 li a0,1 + 33e4: 650010ef jal ra,4a34 <exit> + printf("%s: unlink dirfile/xx succeeded!\n", s); + 33e8: 85ca mv a1,s2 + 33ea: 00003517 auipc a0,0x3 + 33ee: 57650513 addi a0,a0,1398 # 6960 <malloc+0x1a54> + 33f2: 267010ef jal ra,4e58 <printf> + exit(1); + 33f6: 4505 li a0,1 + 33f8: 63c010ef jal ra,4a34 <exit> + printf("%s: link to dirfile/xx succeeded!\n", s); + 33fc: 85ca mv a1,s2 + 33fe: 00003517 auipc a0,0x3 + 3402: 58a50513 addi a0,a0,1418 # 6988 <malloc+0x1a7c> + 3406: 253010ef jal ra,4e58 <printf> + exit(1); + 340a: 4505 li a0,1 + 340c: 628010ef jal ra,4a34 <exit> + printf("%s: unlink dirfile failed!\n", s); + 3410: 85ca mv a1,s2 + 3412: 00003517 auipc a0,0x3 + 3416: 59e50513 addi a0,a0,1438 # 69b0 <malloc+0x1aa4> + 341a: 23f010ef jal ra,4e58 <printf> + exit(1); + 341e: 4505 li a0,1 + 3420: 614010ef jal ra,4a34 <exit> + printf("%s: open . for writing succeeded!\n", s); + 3424: 85ca mv a1,s2 + 3426: 00003517 auipc a0,0x3 + 342a: 5aa50513 addi a0,a0,1450 # 69d0 <malloc+0x1ac4> + 342e: 22b010ef jal ra,4e58 <printf> + exit(1); + 3432: 4505 li a0,1 + 3434: 600010ef jal ra,4a34 <exit> + printf("%s: write . succeeded!\n", s); + 3438: 85ca mv a1,s2 + 343a: 00003517 auipc a0,0x3 + 343e: 5be50513 addi a0,a0,1470 # 69f8 <malloc+0x1aec> + 3442: 217010ef jal ra,4e58 <printf> + exit(1); + 3446: 4505 li a0,1 + 3448: 5ec010ef jal ra,4a34 <exit> + +000000000000344c <iref>: +{ + 344c: 7139 addi sp,sp,-64 + 344e: fc06 sd ra,56(sp) + 3450: f822 sd s0,48(sp) + 3452: f426 sd s1,40(sp) + 3454: f04a sd s2,32(sp) + 3456: ec4e sd s3,24(sp) + 3458: e852 sd s4,16(sp) + 345a: e456 sd s5,8(sp) + 345c: e05a sd s6,0(sp) + 345e: 0080 addi s0,sp,64 + 3460: 8b2a mv s6,a0 + 3462: 03300913 li s2,51 + if(mkdir("irefd") != 0){ + 3466: 00003a17 auipc s4,0x3 + 346a: 5aaa0a13 addi s4,s4,1450 # 6a10 <malloc+0x1b04> + mkdir(""); + 346e: 00003497 auipc s1,0x3 + 3472: 0aa48493 addi s1,s1,170 # 6518 <malloc+0x160c> + link("README", ""); + 3476: 00002a97 auipc s5,0x2 + 347a: d8aa8a93 addi s5,s5,-630 # 5200 <malloc+0x2f4> + fd = open("xx", O_CREATE); + 347e: 00003997 auipc s3,0x3 + 3482: 48a98993 addi s3,s3,1162 # 6908 <malloc+0x19fc> + 3486: a835 j 34c2 <iref+0x76> + printf("%s: mkdir irefd failed\n", s); + 3488: 85da mv a1,s6 + 348a: 00003517 auipc a0,0x3 + 348e: 58e50513 addi a0,a0,1422 # 6a18 <malloc+0x1b0c> + 3492: 1c7010ef jal ra,4e58 <printf> + exit(1); + 3496: 4505 li a0,1 + 3498: 59c010ef jal ra,4a34 <exit> + printf("%s: chdir irefd failed\n", s); + 349c: 85da mv a1,s6 + 349e: 00003517 auipc a0,0x3 + 34a2: 59250513 addi a0,a0,1426 # 6a30 <malloc+0x1b24> + 34a6: 1b3010ef jal ra,4e58 <printf> + exit(1); + 34aa: 4505 li a0,1 + 34ac: 588010ef jal ra,4a34 <exit> + close(fd); + 34b0: 5ac010ef jal ra,4a5c <close> + 34b4: a82d j 34ee <iref+0xa2> + unlink("xx"); + 34b6: 854e mv a0,s3 + 34b8: 5cc010ef jal ra,4a84 <unlink> + for(i = 0; i < NINODE + 1; i++){ + 34bc: 397d addiw s2,s2,-1 + 34be: 04090263 beqz s2,3502 <iref+0xb6> + if(mkdir("irefd") != 0){ + 34c2: 8552 mv a0,s4 + 34c4: 5d8010ef jal ra,4a9c <mkdir> + 34c8: f161 bnez a0,3488 <iref+0x3c> + if(chdir("irefd") != 0){ + 34ca: 8552 mv a0,s4 + 34cc: 5d8010ef jal ra,4aa4 <chdir> + 34d0: f571 bnez a0,349c <iref+0x50> + mkdir(""); + 34d2: 8526 mv a0,s1 + 34d4: 5c8010ef jal ra,4a9c <mkdir> + link("README", ""); + 34d8: 85a6 mv a1,s1 + 34da: 8556 mv a0,s5 + 34dc: 5b8010ef jal ra,4a94 <link> + fd = open("", O_CREATE); + 34e0: 20000593 li a1,512 + 34e4: 8526 mv a0,s1 + 34e6: 58e010ef jal ra,4a74 <open> + if(fd >= 0) + 34ea: fc0553e3 bgez a0,34b0 <iref+0x64> + fd = open("xx", O_CREATE); + 34ee: 20000593 li a1,512 + 34f2: 854e mv a0,s3 + 34f4: 580010ef jal ra,4a74 <open> + if(fd >= 0) + 34f8: fa054fe3 bltz a0,34b6 <iref+0x6a> + close(fd); + 34fc: 560010ef jal ra,4a5c <close> + 3500: bf5d j 34b6 <iref+0x6a> + 3502: 03300493 li s1,51 + chdir(".."); + 3506: 00003997 auipc s3,0x3 + 350a: d2a98993 addi s3,s3,-726 # 6230 <malloc+0x1324> + unlink("irefd"); + 350e: 00003917 auipc s2,0x3 + 3512: 50290913 addi s2,s2,1282 # 6a10 <malloc+0x1b04> + chdir(".."); + 3516: 854e mv a0,s3 + 3518: 58c010ef jal ra,4aa4 <chdir> + unlink("irefd"); + 351c: 854a mv a0,s2 + 351e: 566010ef jal ra,4a84 <unlink> + for(i = 0; i < NINODE + 1; i++){ + 3522: 34fd addiw s1,s1,-1 + 3524: f8ed bnez s1,3516 <iref+0xca> + chdir("/"); + 3526: 00003517 auipc a0,0x3 + 352a: cb250513 addi a0,a0,-846 # 61d8 <malloc+0x12cc> + 352e: 576010ef jal ra,4aa4 <chdir> +} + 3532: 70e2 ld ra,56(sp) + 3534: 7442 ld s0,48(sp) + 3536: 74a2 ld s1,40(sp) + 3538: 7902 ld s2,32(sp) + 353a: 69e2 ld s3,24(sp) + 353c: 6a42 ld s4,16(sp) + 353e: 6aa2 ld s5,8(sp) + 3540: 6b02 ld s6,0(sp) + 3542: 6121 addi sp,sp,64 + 3544: 8082 ret + +0000000000003546 <openiputtest>: +{ + 3546: 7179 addi sp,sp,-48 + 3548: f406 sd ra,40(sp) + 354a: f022 sd s0,32(sp) + 354c: ec26 sd s1,24(sp) + 354e: 1800 addi s0,sp,48 + 3550: 84aa mv s1,a0 + if(mkdir("oidir") < 0){ + 3552: 00003517 auipc a0,0x3 + 3556: 4f650513 addi a0,a0,1270 # 6a48 <malloc+0x1b3c> + 355a: 542010ef jal ra,4a9c <mkdir> + 355e: 02054a63 bltz a0,3592 <openiputtest+0x4c> + pid = fork(); + 3562: 4ca010ef jal ra,4a2c <fork> + if(pid < 0){ + 3566: 04054063 bltz a0,35a6 <openiputtest+0x60> + if(pid == 0){ + 356a: e939 bnez a0,35c0 <openiputtest+0x7a> + int fd = open("oidir", O_RDWR); + 356c: 4589 li a1,2 + 356e: 00003517 auipc a0,0x3 + 3572: 4da50513 addi a0,a0,1242 # 6a48 <malloc+0x1b3c> + 3576: 4fe010ef jal ra,4a74 <open> + if(fd >= 0){ + 357a: 04054063 bltz a0,35ba <openiputtest+0x74> + printf("%s: open directory for write succeeded\n", s); + 357e: 85a6 mv a1,s1 + 3580: 00003517 auipc a0,0x3 + 3584: 4e850513 addi a0,a0,1256 # 6a68 <malloc+0x1b5c> + 3588: 0d1010ef jal ra,4e58 <printf> + exit(1); + 358c: 4505 li a0,1 + 358e: 4a6010ef jal ra,4a34 <exit> + printf("%s: mkdir oidir failed\n", s); + 3592: 85a6 mv a1,s1 + 3594: 00003517 auipc a0,0x3 + 3598: 4bc50513 addi a0,a0,1212 # 6a50 <malloc+0x1b44> + 359c: 0bd010ef jal ra,4e58 <printf> + exit(1); + 35a0: 4505 li a0,1 + 35a2: 492010ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 35a6: 85a6 mv a1,s1 + 35a8: 00002517 auipc a0,0x2 + 35ac: 31050513 addi a0,a0,784 # 58b8 <malloc+0x9ac> + 35b0: 0a9010ef jal ra,4e58 <printf> + exit(1); + 35b4: 4505 li a0,1 + 35b6: 47e010ef jal ra,4a34 <exit> + exit(0); + 35ba: 4501 li a0,0 + 35bc: 478010ef jal ra,4a34 <exit> + sleep(1); + 35c0: 4505 li a0,1 + 35c2: 502010ef jal ra,4ac4 <sleep> + if(unlink("oidir") != 0){ + 35c6: 00003517 auipc a0,0x3 + 35ca: 48250513 addi a0,a0,1154 # 6a48 <malloc+0x1b3c> + 35ce: 4b6010ef jal ra,4a84 <unlink> + 35d2: c919 beqz a0,35e8 <openiputtest+0xa2> + printf("%s: unlink failed\n", s); + 35d4: 85a6 mv a1,s1 + 35d6: 00002517 auipc a0,0x2 + 35da: 4d250513 addi a0,a0,1234 # 5aa8 <malloc+0xb9c> + 35de: 07b010ef jal ra,4e58 <printf> + exit(1); + 35e2: 4505 li a0,1 + 35e4: 450010ef jal ra,4a34 <exit> + wait(&xstatus); + 35e8: fdc40513 addi a0,s0,-36 + 35ec: 450010ef jal ra,4a3c <wait> + exit(xstatus); + 35f0: fdc42503 lw a0,-36(s0) + 35f4: 440010ef jal ra,4a34 <exit> + +00000000000035f8 <forkforkfork>: +{ + 35f8: 1101 addi sp,sp,-32 + 35fa: ec06 sd ra,24(sp) + 35fc: e822 sd s0,16(sp) + 35fe: e426 sd s1,8(sp) + 3600: 1000 addi s0,sp,32 + 3602: 84aa mv s1,a0 + unlink("stopforking"); + 3604: 00003517 auipc a0,0x3 + 3608: 48c50513 addi a0,a0,1164 # 6a90 <malloc+0x1b84> + 360c: 478010ef jal ra,4a84 <unlink> + int pid = fork(); + 3610: 41c010ef jal ra,4a2c <fork> + if(pid < 0){ + 3614: 02054b63 bltz a0,364a <forkforkfork+0x52> + if(pid == 0){ + 3618: c139 beqz a0,365e <forkforkfork+0x66> + sleep(20); // two seconds + 361a: 4551 li a0,20 + 361c: 4a8010ef jal ra,4ac4 <sleep> + close(open("stopforking", O_CREATE|O_RDWR)); + 3620: 20200593 li a1,514 + 3624: 00003517 auipc a0,0x3 + 3628: 46c50513 addi a0,a0,1132 # 6a90 <malloc+0x1b84> + 362c: 448010ef jal ra,4a74 <open> + 3630: 42c010ef jal ra,4a5c <close> + wait(0); + 3634: 4501 li a0,0 + 3636: 406010ef jal ra,4a3c <wait> + sleep(10); // one second + 363a: 4529 li a0,10 + 363c: 488010ef jal ra,4ac4 <sleep> +} + 3640: 60e2 ld ra,24(sp) + 3642: 6442 ld s0,16(sp) + 3644: 64a2 ld s1,8(sp) + 3646: 6105 addi sp,sp,32 + 3648: 8082 ret + printf("%s: fork failed", s); + 364a: 85a6 mv a1,s1 + 364c: 00002517 auipc a0,0x2 + 3650: 42c50513 addi a0,a0,1068 # 5a78 <malloc+0xb6c> + 3654: 005010ef jal ra,4e58 <printf> + exit(1); + 3658: 4505 li a0,1 + 365a: 3da010ef jal ra,4a34 <exit> + int fd = open("stopforking", 0); + 365e: 00003497 auipc s1,0x3 + 3662: 43248493 addi s1,s1,1074 # 6a90 <malloc+0x1b84> + 3666: 4581 li a1,0 + 3668: 8526 mv a0,s1 + 366a: 40a010ef jal ra,4a74 <open> + if(fd >= 0){ + 366e: 00055e63 bgez a0,368a <forkforkfork+0x92> + if(fork() < 0){ + 3672: 3ba010ef jal ra,4a2c <fork> + 3676: fe0558e3 bgez a0,3666 <forkforkfork+0x6e> + close(open("stopforking", O_CREATE|O_RDWR)); + 367a: 20200593 li a1,514 + 367e: 8526 mv a0,s1 + 3680: 3f4010ef jal ra,4a74 <open> + 3684: 3d8010ef jal ra,4a5c <close> + 3688: bff9 j 3666 <forkforkfork+0x6e> + exit(0); + 368a: 4501 li a0,0 + 368c: 3a8010ef jal ra,4a34 <exit> + +0000000000003690 <killstatus>: +{ + 3690: 7139 addi sp,sp,-64 + 3692: fc06 sd ra,56(sp) + 3694: f822 sd s0,48(sp) + 3696: f426 sd s1,40(sp) + 3698: f04a sd s2,32(sp) + 369a: ec4e sd s3,24(sp) + 369c: e852 sd s4,16(sp) + 369e: 0080 addi s0,sp,64 + 36a0: 8a2a mv s4,a0 + 36a2: 06400913 li s2,100 + if(xst != -1) { + 36a6: 59fd li s3,-1 + int pid1 = fork(); + 36a8: 384010ef jal ra,4a2c <fork> + 36ac: 84aa mv s1,a0 + if(pid1 < 0){ + 36ae: 02054763 bltz a0,36dc <killstatus+0x4c> + if(pid1 == 0){ + 36b2: cd1d beqz a0,36f0 <killstatus+0x60> + sleep(1); + 36b4: 4505 li a0,1 + 36b6: 40e010ef jal ra,4ac4 <sleep> + kill(pid1); + 36ba: 8526 mv a0,s1 + 36bc: 3a8010ef jal ra,4a64 <kill> + wait(&xst); + 36c0: fcc40513 addi a0,s0,-52 + 36c4: 378010ef jal ra,4a3c <wait> + if(xst != -1) { + 36c8: fcc42783 lw a5,-52(s0) + 36cc: 03379563 bne a5,s3,36f6 <killstatus+0x66> + for(int i = 0; i < 100; i++){ + 36d0: 397d addiw s2,s2,-1 + 36d2: fc091be3 bnez s2,36a8 <killstatus+0x18> + exit(0); + 36d6: 4501 li a0,0 + 36d8: 35c010ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 36dc: 85d2 mv a1,s4 + 36de: 00002517 auipc a0,0x2 + 36e2: 1da50513 addi a0,a0,474 # 58b8 <malloc+0x9ac> + 36e6: 772010ef jal ra,4e58 <printf> + exit(1); + 36ea: 4505 li a0,1 + 36ec: 348010ef jal ra,4a34 <exit> + getpid(); + 36f0: 3c4010ef jal ra,4ab4 <getpid> + while(1) { + 36f4: bff5 j 36f0 <killstatus+0x60> + printf("%s: status should be -1\n", s); + 36f6: 85d2 mv a1,s4 + 36f8: 00003517 auipc a0,0x3 + 36fc: 3a850513 addi a0,a0,936 # 6aa0 <malloc+0x1b94> + 3700: 758010ef jal ra,4e58 <printf> + exit(1); + 3704: 4505 li a0,1 + 3706: 32e010ef jal ra,4a34 <exit> + +000000000000370a <preempt>: +{ + 370a: 7139 addi sp,sp,-64 + 370c: fc06 sd ra,56(sp) + 370e: f822 sd s0,48(sp) + 3710: f426 sd s1,40(sp) + 3712: f04a sd s2,32(sp) + 3714: ec4e sd s3,24(sp) + 3716: e852 sd s4,16(sp) + 3718: 0080 addi s0,sp,64 + 371a: 892a mv s2,a0 + pid1 = fork(); + 371c: 310010ef jal ra,4a2c <fork> + if(pid1 < 0) { + 3720: 00054563 bltz a0,372a <preempt+0x20> + 3724: 84aa mv s1,a0 + if(pid1 == 0) + 3726: ed01 bnez a0,373e <preempt+0x34> + for(;;) + 3728: a001 j 3728 <preempt+0x1e> + printf("%s: fork failed", s); + 372a: 85ca mv a1,s2 + 372c: 00002517 auipc a0,0x2 + 3730: 34c50513 addi a0,a0,844 # 5a78 <malloc+0xb6c> + 3734: 724010ef jal ra,4e58 <printf> + exit(1); + 3738: 4505 li a0,1 + 373a: 2fa010ef jal ra,4a34 <exit> + pid2 = fork(); + 373e: 2ee010ef jal ra,4a2c <fork> + 3742: 89aa mv s3,a0 + if(pid2 < 0) { + 3744: 00054463 bltz a0,374c <preempt+0x42> + if(pid2 == 0) + 3748: ed01 bnez a0,3760 <preempt+0x56> + for(;;) + 374a: a001 j 374a <preempt+0x40> + printf("%s: fork failed\n", s); + 374c: 85ca mv a1,s2 + 374e: 00002517 auipc a0,0x2 + 3752: 16a50513 addi a0,a0,362 # 58b8 <malloc+0x9ac> + 3756: 702010ef jal ra,4e58 <printf> + exit(1); + 375a: 4505 li a0,1 + 375c: 2d8010ef jal ra,4a34 <exit> + pipe(pfds); + 3760: fc840513 addi a0,s0,-56 + 3764: 2e0010ef jal ra,4a44 <pipe> + pid3 = fork(); + 3768: 2c4010ef jal ra,4a2c <fork> + 376c: 8a2a mv s4,a0 + if(pid3 < 0) { + 376e: 02054863 bltz a0,379e <preempt+0x94> + if(pid3 == 0){ + 3772: e921 bnez a0,37c2 <preempt+0xb8> + close(pfds[0]); + 3774: fc842503 lw a0,-56(s0) + 3778: 2e4010ef jal ra,4a5c <close> + if(write(pfds[1], "x", 1) != 1) + 377c: 4605 li a2,1 + 377e: 00002597 auipc a1,0x2 + 3782: 91a58593 addi a1,a1,-1766 # 5098 <malloc+0x18c> + 3786: fcc42503 lw a0,-52(s0) + 378a: 2ca010ef jal ra,4a54 <write> + 378e: 4785 li a5,1 + 3790: 02f51163 bne a0,a5,37b2 <preempt+0xa8> + close(pfds[1]); + 3794: fcc42503 lw a0,-52(s0) + 3798: 2c4010ef jal ra,4a5c <close> + for(;;) + 379c: a001 j 379c <preempt+0x92> + printf("%s: fork failed\n", s); + 379e: 85ca mv a1,s2 + 37a0: 00002517 auipc a0,0x2 + 37a4: 11850513 addi a0,a0,280 # 58b8 <malloc+0x9ac> + 37a8: 6b0010ef jal ra,4e58 <printf> + exit(1); + 37ac: 4505 li a0,1 + 37ae: 286010ef jal ra,4a34 <exit> + printf("%s: preempt write error", s); + 37b2: 85ca mv a1,s2 + 37b4: 00003517 auipc a0,0x3 + 37b8: 30c50513 addi a0,a0,780 # 6ac0 <malloc+0x1bb4> + 37bc: 69c010ef jal ra,4e58 <printf> + 37c0: bfd1 j 3794 <preempt+0x8a> + close(pfds[1]); + 37c2: fcc42503 lw a0,-52(s0) + 37c6: 296010ef jal ra,4a5c <close> + if(read(pfds[0], buf, sizeof(buf)) != 1){ + 37ca: 660d lui a2,0x3 + 37cc: 00008597 auipc a1,0x8 + 37d0: 4ac58593 addi a1,a1,1196 # bc78 <buf> + 37d4: fc842503 lw a0,-56(s0) + 37d8: 274010ef jal ra,4a4c <read> + 37dc: 4785 li a5,1 + 37de: 02f50163 beq a0,a5,3800 <preempt+0xf6> + printf("%s: preempt read error", s); + 37e2: 85ca mv a1,s2 + 37e4: 00003517 auipc a0,0x3 + 37e8: 2f450513 addi a0,a0,756 # 6ad8 <malloc+0x1bcc> + 37ec: 66c010ef jal ra,4e58 <printf> +} + 37f0: 70e2 ld ra,56(sp) + 37f2: 7442 ld s0,48(sp) + 37f4: 74a2 ld s1,40(sp) + 37f6: 7902 ld s2,32(sp) + 37f8: 69e2 ld s3,24(sp) + 37fa: 6a42 ld s4,16(sp) + 37fc: 6121 addi sp,sp,64 + 37fe: 8082 ret + close(pfds[0]); + 3800: fc842503 lw a0,-56(s0) + 3804: 258010ef jal ra,4a5c <close> + printf("kill... "); + 3808: 00003517 auipc a0,0x3 + 380c: 2e850513 addi a0,a0,744 # 6af0 <malloc+0x1be4> + 3810: 648010ef jal ra,4e58 <printf> + kill(pid1); + 3814: 8526 mv a0,s1 + 3816: 24e010ef jal ra,4a64 <kill> + kill(pid2); + 381a: 854e mv a0,s3 + 381c: 248010ef jal ra,4a64 <kill> + kill(pid3); + 3820: 8552 mv a0,s4 + 3822: 242010ef jal ra,4a64 <kill> + printf("wait... "); + 3826: 00003517 auipc a0,0x3 + 382a: 2da50513 addi a0,a0,730 # 6b00 <malloc+0x1bf4> + 382e: 62a010ef jal ra,4e58 <printf> + wait(0); + 3832: 4501 li a0,0 + 3834: 208010ef jal ra,4a3c <wait> + wait(0); + 3838: 4501 li a0,0 + 383a: 202010ef jal ra,4a3c <wait> + wait(0); + 383e: 4501 li a0,0 + 3840: 1fc010ef jal ra,4a3c <wait> + 3844: b775 j 37f0 <preempt+0xe6> + +0000000000003846 <reparent>: +{ + 3846: 7179 addi sp,sp,-48 + 3848: f406 sd ra,40(sp) + 384a: f022 sd s0,32(sp) + 384c: ec26 sd s1,24(sp) + 384e: e84a sd s2,16(sp) + 3850: e44e sd s3,8(sp) + 3852: e052 sd s4,0(sp) + 3854: 1800 addi s0,sp,48 + 3856: 89aa mv s3,a0 + int master_pid = getpid(); + 3858: 25c010ef jal ra,4ab4 <getpid> + 385c: 8a2a mv s4,a0 + 385e: 0c800913 li s2,200 + int pid = fork(); + 3862: 1ca010ef jal ra,4a2c <fork> + 3866: 84aa mv s1,a0 + if(pid < 0){ + 3868: 00054e63 bltz a0,3884 <reparent+0x3e> + if(pid){ + 386c: c121 beqz a0,38ac <reparent+0x66> + if(wait(0) != pid){ + 386e: 4501 li a0,0 + 3870: 1cc010ef jal ra,4a3c <wait> + 3874: 02951263 bne a0,s1,3898 <reparent+0x52> + for(int i = 0; i < 200; i++){ + 3878: 397d addiw s2,s2,-1 + 387a: fe0914e3 bnez s2,3862 <reparent+0x1c> + exit(0); + 387e: 4501 li a0,0 + 3880: 1b4010ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 3884: 85ce mv a1,s3 + 3886: 00002517 auipc a0,0x2 + 388a: 03250513 addi a0,a0,50 # 58b8 <malloc+0x9ac> + 388e: 5ca010ef jal ra,4e58 <printf> + exit(1); + 3892: 4505 li a0,1 + 3894: 1a0010ef jal ra,4a34 <exit> + printf("%s: wait wrong pid\n", s); + 3898: 85ce mv a1,s3 + 389a: 00002517 auipc a0,0x2 + 389e: 1a650513 addi a0,a0,422 # 5a40 <malloc+0xb34> + 38a2: 5b6010ef jal ra,4e58 <printf> + exit(1); + 38a6: 4505 li a0,1 + 38a8: 18c010ef jal ra,4a34 <exit> + int pid2 = fork(); + 38ac: 180010ef jal ra,4a2c <fork> + if(pid2 < 0){ + 38b0: 00054563 bltz a0,38ba <reparent+0x74> + exit(0); + 38b4: 4501 li a0,0 + 38b6: 17e010ef jal ra,4a34 <exit> + kill(master_pid); + 38ba: 8552 mv a0,s4 + 38bc: 1a8010ef jal ra,4a64 <kill> + exit(1); + 38c0: 4505 li a0,1 + 38c2: 172010ef jal ra,4a34 <exit> + +00000000000038c6 <sbrkfail>: +{ + 38c6: 7119 addi sp,sp,-128 + 38c8: fc86 sd ra,120(sp) + 38ca: f8a2 sd s0,112(sp) + 38cc: f4a6 sd s1,104(sp) + 38ce: f0ca sd s2,96(sp) + 38d0: ecce sd s3,88(sp) + 38d2: e8d2 sd s4,80(sp) + 38d4: e4d6 sd s5,72(sp) + 38d6: 0100 addi s0,sp,128 + 38d8: 8aaa mv s5,a0 + if(pipe(fds) != 0){ + 38da: fb040513 addi a0,s0,-80 + 38de: 166010ef jal ra,4a44 <pipe> + 38e2: e901 bnez a0,38f2 <sbrkfail+0x2c> + 38e4: f8040493 addi s1,s0,-128 + 38e8: fa840993 addi s3,s0,-88 + 38ec: 8926 mv s2,s1 + if(pids[i] != -1) + 38ee: 5a7d li s4,-1 + 38f0: a0a1 j 3938 <sbrkfail+0x72> + printf("%s: pipe() failed\n", s); + 38f2: 85d6 mv a1,s5 + 38f4: 00002517 auipc a0,0x2 + 38f8: 0cc50513 addi a0,a0,204 # 59c0 <malloc+0xab4> + 38fc: 55c010ef jal ra,4e58 <printf> + exit(1); + 3900: 4505 li a0,1 + 3902: 132010ef jal ra,4a34 <exit> + sbrk(BIG - (uint64)sbrk(0)); + 3906: 1b6010ef jal ra,4abc <sbrk> + 390a: 064007b7 lui a5,0x6400 + 390e: 40a7853b subw a0,a5,a0 + 3912: 1aa010ef jal ra,4abc <sbrk> + write(fds[1], "x", 1); + 3916: 4605 li a2,1 + 3918: 00001597 auipc a1,0x1 + 391c: 78058593 addi a1,a1,1920 # 5098 <malloc+0x18c> + 3920: fb442503 lw a0,-76(s0) + 3924: 130010ef jal ra,4a54 <write> + for(;;) sleep(1000); + 3928: 3e800513 li a0,1000 + 392c: 198010ef jal ra,4ac4 <sleep> + 3930: bfe5 j 3928 <sbrkfail+0x62> + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 3932: 0911 addi s2,s2,4 + 3934: 03390163 beq s2,s3,3956 <sbrkfail+0x90> + if((pids[i] = fork()) == 0){ + 3938: 0f4010ef jal ra,4a2c <fork> + 393c: 00a92023 sw a0,0(s2) + 3940: d179 beqz a0,3906 <sbrkfail+0x40> + if(pids[i] != -1) + 3942: ff4508e3 beq a0,s4,3932 <sbrkfail+0x6c> + read(fds[0], &scratch, 1); + 3946: 4605 li a2,1 + 3948: faf40593 addi a1,s0,-81 + 394c: fb042503 lw a0,-80(s0) + 3950: 0fc010ef jal ra,4a4c <read> + 3954: bff9 j 3932 <sbrkfail+0x6c> + c = sbrk(PGSIZE); + 3956: 6505 lui a0,0x1 + 3958: 164010ef jal ra,4abc <sbrk> + 395c: 8a2a mv s4,a0 + if(pids[i] == -1) + 395e: 597d li s2,-1 + 3960: a021 j 3968 <sbrkfail+0xa2> + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 3962: 0491 addi s1,s1,4 + 3964: 01348b63 beq s1,s3,397a <sbrkfail+0xb4> + if(pids[i] == -1) + 3968: 4088 lw a0,0(s1) + 396a: ff250ce3 beq a0,s2,3962 <sbrkfail+0x9c> + kill(pids[i]); + 396e: 0f6010ef jal ra,4a64 <kill> + wait(0); + 3972: 4501 li a0,0 + 3974: 0c8010ef jal ra,4a3c <wait> + 3978: b7ed j 3962 <sbrkfail+0x9c> + if(c == (char*)0xffffffffffffffffL){ + 397a: 57fd li a5,-1 + 397c: 02fa0d63 beq s4,a5,39b6 <sbrkfail+0xf0> + pid = fork(); + 3980: 0ac010ef jal ra,4a2c <fork> + 3984: 84aa mv s1,a0 + if(pid < 0){ + 3986: 04054263 bltz a0,39ca <sbrkfail+0x104> + if(pid == 0){ + 398a: c931 beqz a0,39de <sbrkfail+0x118> + wait(&xstatus); + 398c: fbc40513 addi a0,s0,-68 + 3990: 0ac010ef jal ra,4a3c <wait> + if(xstatus != -1 && xstatus != 2) + 3994: fbc42783 lw a5,-68(s0) + 3998: 577d li a4,-1 + 399a: 00e78563 beq a5,a4,39a4 <sbrkfail+0xde> + 399e: 4709 li a4,2 + 39a0: 06e79d63 bne a5,a4,3a1a <sbrkfail+0x154> +} + 39a4: 70e6 ld ra,120(sp) + 39a6: 7446 ld s0,112(sp) + 39a8: 74a6 ld s1,104(sp) + 39aa: 7906 ld s2,96(sp) + 39ac: 69e6 ld s3,88(sp) + 39ae: 6a46 ld s4,80(sp) + 39b0: 6aa6 ld s5,72(sp) + 39b2: 6109 addi sp,sp,128 + 39b4: 8082 ret + printf("%s: failed sbrk leaked memory\n", s); + 39b6: 85d6 mv a1,s5 + 39b8: 00003517 auipc a0,0x3 + 39bc: 15850513 addi a0,a0,344 # 6b10 <malloc+0x1c04> + 39c0: 498010ef jal ra,4e58 <printf> + exit(1); + 39c4: 4505 li a0,1 + 39c6: 06e010ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 39ca: 85d6 mv a1,s5 + 39cc: 00002517 auipc a0,0x2 + 39d0: eec50513 addi a0,a0,-276 # 58b8 <malloc+0x9ac> + 39d4: 484010ef jal ra,4e58 <printf> + exit(1); + 39d8: 4505 li a0,1 + 39da: 05a010ef jal ra,4a34 <exit> + a = sbrk(0); + 39de: 4501 li a0,0 + 39e0: 0dc010ef jal ra,4abc <sbrk> + 39e4: 892a mv s2,a0 + sbrk(10*BIG); + 39e6: 3e800537 lui a0,0x3e800 + 39ea: 0d2010ef jal ra,4abc <sbrk> + for (i = 0; i < 10*BIG; i += PGSIZE) { + 39ee: 87ca mv a5,s2 + 39f0: 3e800737 lui a4,0x3e800 + 39f4: 993a add s2,s2,a4 + 39f6: 6705 lui a4,0x1 + n += *(a+i); + 39f8: 0007c683 lbu a3,0(a5) # 6400000 <base+0x63f1388> + 39fc: 9cb5 addw s1,s1,a3 + for (i = 0; i < 10*BIG; i += PGSIZE) { + 39fe: 97ba add a5,a5,a4 + 3a00: ff279ce3 bne a5,s2,39f8 <sbrkfail+0x132> + printf("%s: allocate a lot of memory succeeded %d\n", s, n); + 3a04: 8626 mv a2,s1 + 3a06: 85d6 mv a1,s5 + 3a08: 00003517 auipc a0,0x3 + 3a0c: 12850513 addi a0,a0,296 # 6b30 <malloc+0x1c24> + 3a10: 448010ef jal ra,4e58 <printf> + exit(1); + 3a14: 4505 li a0,1 + 3a16: 01e010ef jal ra,4a34 <exit> + exit(1); + 3a1a: 4505 li a0,1 + 3a1c: 018010ef jal ra,4a34 <exit> + +0000000000003a20 <mem>: +{ + 3a20: 7139 addi sp,sp,-64 + 3a22: fc06 sd ra,56(sp) + 3a24: f822 sd s0,48(sp) + 3a26: f426 sd s1,40(sp) + 3a28: f04a sd s2,32(sp) + 3a2a: ec4e sd s3,24(sp) + 3a2c: 0080 addi s0,sp,64 + 3a2e: 89aa mv s3,a0 + if((pid = fork()) == 0){ + 3a30: 7fd000ef jal ra,4a2c <fork> + m1 = 0; + 3a34: 4481 li s1,0 + while((m2 = malloc(10001)) != 0){ + 3a36: 6909 lui s2,0x2 + 3a38: 71190913 addi s2,s2,1809 # 2711 <fourteen+0xd1> + if((pid = fork()) == 0){ + 3a3c: cd11 beqz a0,3a58 <mem+0x38> + wait(&xstatus); + 3a3e: fcc40513 addi a0,s0,-52 + 3a42: 7fb000ef jal ra,4a3c <wait> + if(xstatus == -1){ + 3a46: fcc42503 lw a0,-52(s0) + 3a4a: 57fd li a5,-1 + 3a4c: 04f50363 beq a0,a5,3a92 <mem+0x72> + exit(xstatus); + 3a50: 7e5000ef jal ra,4a34 <exit> + *(char**)m2 = m1; + 3a54: e104 sd s1,0(a0) + m1 = m2; + 3a56: 84aa mv s1,a0 + while((m2 = malloc(10001)) != 0){ + 3a58: 854a mv a0,s2 + 3a5a: 4b2010ef jal ra,4f0c <malloc> + 3a5e: f97d bnez a0,3a54 <mem+0x34> + while(m1){ + 3a60: c491 beqz s1,3a6c <mem+0x4c> + m2 = *(char**)m1; + 3a62: 8526 mv a0,s1 + 3a64: 6084 ld s1,0(s1) + free(m1); + 3a66: 424010ef jal ra,4e8a <free> + while(m1){ + 3a6a: fce5 bnez s1,3a62 <mem+0x42> + m1 = malloc(1024*20); + 3a6c: 6515 lui a0,0x5 + 3a6e: 49e010ef jal ra,4f0c <malloc> + if(m1 == 0){ + 3a72: c511 beqz a0,3a7e <mem+0x5e> + free(m1); + 3a74: 416010ef jal ra,4e8a <free> + exit(0); + 3a78: 4501 li a0,0 + 3a7a: 7bb000ef jal ra,4a34 <exit> + printf("%s: couldn't allocate mem?!!\n", s); + 3a7e: 85ce mv a1,s3 + 3a80: 00003517 auipc a0,0x3 + 3a84: 0e050513 addi a0,a0,224 # 6b60 <malloc+0x1c54> + 3a88: 3d0010ef jal ra,4e58 <printf> + exit(1); + 3a8c: 4505 li a0,1 + 3a8e: 7a7000ef jal ra,4a34 <exit> + exit(0); + 3a92: 4501 li a0,0 + 3a94: 7a1000ef jal ra,4a34 <exit> + +0000000000003a98 <sharedfd>: +{ + 3a98: 7159 addi sp,sp,-112 + 3a9a: f486 sd ra,104(sp) + 3a9c: f0a2 sd s0,96(sp) + 3a9e: eca6 sd s1,88(sp) + 3aa0: e8ca sd s2,80(sp) + 3aa2: e4ce sd s3,72(sp) + 3aa4: e0d2 sd s4,64(sp) + 3aa6: fc56 sd s5,56(sp) + 3aa8: f85a sd s6,48(sp) + 3aaa: f45e sd s7,40(sp) + 3aac: 1880 addi s0,sp,112 + 3aae: 8a2a mv s4,a0 + unlink("sharedfd"); + 3ab0: 00003517 auipc a0,0x3 + 3ab4: 0d050513 addi a0,a0,208 # 6b80 <malloc+0x1c74> + 3ab8: 7cd000ef jal ra,4a84 <unlink> + fd = open("sharedfd", O_CREATE|O_RDWR); + 3abc: 20200593 li a1,514 + 3ac0: 00003517 auipc a0,0x3 + 3ac4: 0c050513 addi a0,a0,192 # 6b80 <malloc+0x1c74> + 3ac8: 7ad000ef jal ra,4a74 <open> + if(fd < 0){ + 3acc: 04054263 bltz a0,3b10 <sharedfd+0x78> + 3ad0: 892a mv s2,a0 + pid = fork(); + 3ad2: 75b000ef jal ra,4a2c <fork> + 3ad6: 89aa mv s3,a0 + memset(buf, pid==0?'c':'p', sizeof(buf)); + 3ad8: 06300593 li a1,99 + 3adc: c119 beqz a0,3ae2 <sharedfd+0x4a> + 3ade: 07000593 li a1,112 + 3ae2: 4629 li a2,10 + 3ae4: fa040513 addi a0,s0,-96 + 3ae8: 567000ef jal ra,484e <memset> + 3aec: 3e800493 li s1,1000 + if(write(fd, buf, sizeof(buf)) != sizeof(buf)){ + 3af0: 4629 li a2,10 + 3af2: fa040593 addi a1,s0,-96 + 3af6: 854a mv a0,s2 + 3af8: 75d000ef jal ra,4a54 <write> + 3afc: 47a9 li a5,10 + 3afe: 02f51363 bne a0,a5,3b24 <sharedfd+0x8c> + for(i = 0; i < N; i++){ + 3b02: 34fd addiw s1,s1,-1 + 3b04: f4f5 bnez s1,3af0 <sharedfd+0x58> + if(pid == 0) { + 3b06: 02099963 bnez s3,3b38 <sharedfd+0xa0> + exit(0); + 3b0a: 4501 li a0,0 + 3b0c: 729000ef jal ra,4a34 <exit> + printf("%s: cannot open sharedfd for writing", s); + 3b10: 85d2 mv a1,s4 + 3b12: 00003517 auipc a0,0x3 + 3b16: 07e50513 addi a0,a0,126 # 6b90 <malloc+0x1c84> + 3b1a: 33e010ef jal ra,4e58 <printf> + exit(1); + 3b1e: 4505 li a0,1 + 3b20: 715000ef jal ra,4a34 <exit> + printf("%s: write sharedfd failed\n", s); + 3b24: 85d2 mv a1,s4 + 3b26: 00003517 auipc a0,0x3 + 3b2a: 09250513 addi a0,a0,146 # 6bb8 <malloc+0x1cac> + 3b2e: 32a010ef jal ra,4e58 <printf> + exit(1); + 3b32: 4505 li a0,1 + 3b34: 701000ef jal ra,4a34 <exit> + wait(&xstatus); + 3b38: f9c40513 addi a0,s0,-100 + 3b3c: 701000ef jal ra,4a3c <wait> + if(xstatus != 0) + 3b40: f9c42983 lw s3,-100(s0) + 3b44: 00098563 beqz s3,3b4e <sharedfd+0xb6> + exit(xstatus); + 3b48: 854e mv a0,s3 + 3b4a: 6eb000ef jal ra,4a34 <exit> + close(fd); + 3b4e: 854a mv a0,s2 + 3b50: 70d000ef jal ra,4a5c <close> + fd = open("sharedfd", 0); + 3b54: 4581 li a1,0 + 3b56: 00003517 auipc a0,0x3 + 3b5a: 02a50513 addi a0,a0,42 # 6b80 <malloc+0x1c74> + 3b5e: 717000ef jal ra,4a74 <open> + 3b62: 8baa mv s7,a0 + nc = np = 0; + 3b64: 8ace mv s5,s3 + if(fd < 0){ + 3b66: 02054363 bltz a0,3b8c <sharedfd+0xf4> + 3b6a: faa40913 addi s2,s0,-86 + if(buf[i] == 'c') + 3b6e: 06300493 li s1,99 + if(buf[i] == 'p') + 3b72: 07000b13 li s6,112 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3b76: 4629 li a2,10 + 3b78: fa040593 addi a1,s0,-96 + 3b7c: 855e mv a0,s7 + 3b7e: 6cf000ef jal ra,4a4c <read> + 3b82: 02a05b63 blez a0,3bb8 <sharedfd+0x120> + 3b86: fa040793 addi a5,s0,-96 + 3b8a: a839 j 3ba8 <sharedfd+0x110> + printf("%s: cannot open sharedfd for reading\n", s); + 3b8c: 85d2 mv a1,s4 + 3b8e: 00003517 auipc a0,0x3 + 3b92: 04a50513 addi a0,a0,74 # 6bd8 <malloc+0x1ccc> + 3b96: 2c2010ef jal ra,4e58 <printf> + exit(1); + 3b9a: 4505 li a0,1 + 3b9c: 699000ef jal ra,4a34 <exit> + nc++; + 3ba0: 2985 addiw s3,s3,1 + for(i = 0; i < sizeof(buf); i++){ + 3ba2: 0785 addi a5,a5,1 + 3ba4: fd2789e3 beq a5,s2,3b76 <sharedfd+0xde> + if(buf[i] == 'c') + 3ba8: 0007c703 lbu a4,0(a5) + 3bac: fe970ae3 beq a4,s1,3ba0 <sharedfd+0x108> + if(buf[i] == 'p') + 3bb0: ff6719e3 bne a4,s6,3ba2 <sharedfd+0x10a> + np++; + 3bb4: 2a85 addiw s5,s5,1 + 3bb6: b7f5 j 3ba2 <sharedfd+0x10a> + close(fd); + 3bb8: 855e mv a0,s7 + 3bba: 6a3000ef jal ra,4a5c <close> + unlink("sharedfd"); + 3bbe: 00003517 auipc a0,0x3 + 3bc2: fc250513 addi a0,a0,-62 # 6b80 <malloc+0x1c74> + 3bc6: 6bf000ef jal ra,4a84 <unlink> + if(nc == N*SZ && np == N*SZ){ + 3bca: 6789 lui a5,0x2 + 3bcc: 71078793 addi a5,a5,1808 # 2710 <fourteen+0xd0> + 3bd0: 00f99763 bne s3,a5,3bde <sharedfd+0x146> + 3bd4: 6789 lui a5,0x2 + 3bd6: 71078793 addi a5,a5,1808 # 2710 <fourteen+0xd0> + 3bda: 00fa8c63 beq s5,a5,3bf2 <sharedfd+0x15a> + printf("%s: nc/np test fails\n", s); + 3bde: 85d2 mv a1,s4 + 3be0: 00003517 auipc a0,0x3 + 3be4: 02050513 addi a0,a0,32 # 6c00 <malloc+0x1cf4> + 3be8: 270010ef jal ra,4e58 <printf> + exit(1); + 3bec: 4505 li a0,1 + 3bee: 647000ef jal ra,4a34 <exit> + exit(0); + 3bf2: 4501 li a0,0 + 3bf4: 641000ef jal ra,4a34 <exit> + +0000000000003bf8 <fourfiles>: +{ + 3bf8: 7171 addi sp,sp,-176 + 3bfa: f506 sd ra,168(sp) + 3bfc: f122 sd s0,160(sp) + 3bfe: ed26 sd s1,152(sp) + 3c00: e94a sd s2,144(sp) + 3c02: e54e sd s3,136(sp) + 3c04: e152 sd s4,128(sp) + 3c06: fcd6 sd s5,120(sp) + 3c08: f8da sd s6,112(sp) + 3c0a: f4de sd s7,104(sp) + 3c0c: f0e2 sd s8,96(sp) + 3c0e: ece6 sd s9,88(sp) + 3c10: e8ea sd s10,80(sp) + 3c12: e4ee sd s11,72(sp) + 3c14: 1900 addi s0,sp,176 + 3c16: f4a43c23 sd a0,-168(s0) + char *names[] = { "f0", "f1", "f2", "f3" }; + 3c1a: 00003797 auipc a5,0x3 + 3c1e: ffe78793 addi a5,a5,-2 # 6c18 <malloc+0x1d0c> + 3c22: f6f43823 sd a5,-144(s0) + 3c26: 00003797 auipc a5,0x3 + 3c2a: ffa78793 addi a5,a5,-6 # 6c20 <malloc+0x1d14> + 3c2e: f6f43c23 sd a5,-136(s0) + 3c32: 00003797 auipc a5,0x3 + 3c36: ff678793 addi a5,a5,-10 # 6c28 <malloc+0x1d1c> + 3c3a: f8f43023 sd a5,-128(s0) + 3c3e: 00003797 auipc a5,0x3 + 3c42: ff278793 addi a5,a5,-14 # 6c30 <malloc+0x1d24> + 3c46: f8f43423 sd a5,-120(s0) + for(pi = 0; pi < NCHILD; pi++){ + 3c4a: f7040c13 addi s8,s0,-144 + char *names[] = { "f0", "f1", "f2", "f3" }; + 3c4e: 8962 mv s2,s8 + for(pi = 0; pi < NCHILD; pi++){ + 3c50: 4481 li s1,0 + 3c52: 4a11 li s4,4 + fname = names[pi]; + 3c54: 00093983 ld s3,0(s2) + unlink(fname); + 3c58: 854e mv a0,s3 + 3c5a: 62b000ef jal ra,4a84 <unlink> + pid = fork(); + 3c5e: 5cf000ef jal ra,4a2c <fork> + if(pid < 0){ + 3c62: 04054263 bltz a0,3ca6 <fourfiles+0xae> + if(pid == 0){ + 3c66: c939 beqz a0,3cbc <fourfiles+0xc4> + for(pi = 0; pi < NCHILD; pi++){ + 3c68: 2485 addiw s1,s1,1 + 3c6a: 0921 addi s2,s2,8 + 3c6c: ff4494e3 bne s1,s4,3c54 <fourfiles+0x5c> + 3c70: 4491 li s1,4 + wait(&xstatus); + 3c72: f6c40513 addi a0,s0,-148 + 3c76: 5c7000ef jal ra,4a3c <wait> + if(xstatus != 0) + 3c7a: f6c42b03 lw s6,-148(s0) + 3c7e: 0a0b1a63 bnez s6,3d32 <fourfiles+0x13a> + for(pi = 0; pi < NCHILD; pi++){ + 3c82: 34fd addiw s1,s1,-1 + 3c84: f4fd bnez s1,3c72 <fourfiles+0x7a> + 3c86: 03000b93 li s7,48 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3c8a: 00008a17 auipc s4,0x8 + 3c8e: feea0a13 addi s4,s4,-18 # bc78 <buf> + 3c92: 00008a97 auipc s5,0x8 + 3c96: fe7a8a93 addi s5,s5,-25 # bc79 <buf+0x1> + if(total != N*SZ){ + 3c9a: 6d85 lui s11,0x1 + 3c9c: 770d8d93 addi s11,s11,1904 # 1770 <forkfork+0x4c> + for(i = 0; i < NCHILD; i++){ + 3ca0: 03400d13 li s10,52 + 3ca4: a8dd j 3d9a <fourfiles+0x1a2> + printf("%s: fork failed\n", s); + 3ca6: f5843583 ld a1,-168(s0) + 3caa: 00002517 auipc a0,0x2 + 3cae: c0e50513 addi a0,a0,-1010 # 58b8 <malloc+0x9ac> + 3cb2: 1a6010ef jal ra,4e58 <printf> + exit(1); + 3cb6: 4505 li a0,1 + 3cb8: 57d000ef jal ra,4a34 <exit> + fd = open(fname, O_CREATE | O_RDWR); + 3cbc: 20200593 li a1,514 + 3cc0: 854e mv a0,s3 + 3cc2: 5b3000ef jal ra,4a74 <open> + 3cc6: 892a mv s2,a0 + if(fd < 0){ + 3cc8: 04054163 bltz a0,3d0a <fourfiles+0x112> + memset(buf, '0'+pi, SZ); + 3ccc: 1f400613 li a2,500 + 3cd0: 0304859b addiw a1,s1,48 + 3cd4: 00008517 auipc a0,0x8 + 3cd8: fa450513 addi a0,a0,-92 # bc78 <buf> + 3cdc: 373000ef jal ra,484e <memset> + 3ce0: 44b1 li s1,12 + if((n = write(fd, buf, SZ)) != SZ){ + 3ce2: 00008997 auipc s3,0x8 + 3ce6: f9698993 addi s3,s3,-106 # bc78 <buf> + 3cea: 1f400613 li a2,500 + 3cee: 85ce mv a1,s3 + 3cf0: 854a mv a0,s2 + 3cf2: 563000ef jal ra,4a54 <write> + 3cf6: 85aa mv a1,a0 + 3cf8: 1f400793 li a5,500 + 3cfc: 02f51263 bne a0,a5,3d20 <fourfiles+0x128> + for(i = 0; i < N; i++){ + 3d00: 34fd addiw s1,s1,-1 + 3d02: f4e5 bnez s1,3cea <fourfiles+0xf2> + exit(0); + 3d04: 4501 li a0,0 + 3d06: 52f000ef jal ra,4a34 <exit> + printf("%s: create failed\n", s); + 3d0a: f5843583 ld a1,-168(s0) + 3d0e: 00002517 auipc a0,0x2 + 3d12: c4250513 addi a0,a0,-958 # 5950 <malloc+0xa44> + 3d16: 142010ef jal ra,4e58 <printf> + exit(1); + 3d1a: 4505 li a0,1 + 3d1c: 519000ef jal ra,4a34 <exit> + printf("write failed %d\n", n); + 3d20: 00003517 auipc a0,0x3 + 3d24: f1850513 addi a0,a0,-232 # 6c38 <malloc+0x1d2c> + 3d28: 130010ef jal ra,4e58 <printf> + exit(1); + 3d2c: 4505 li a0,1 + 3d2e: 507000ef jal ra,4a34 <exit> + exit(xstatus); + 3d32: 855a mv a0,s6 + 3d34: 501000ef jal ra,4a34 <exit> + printf("%s: wrong char\n", s); + 3d38: f5843583 ld a1,-168(s0) + 3d3c: 00003517 auipc a0,0x3 + 3d40: f1450513 addi a0,a0,-236 # 6c50 <malloc+0x1d44> + 3d44: 114010ef jal ra,4e58 <printf> + exit(1); + 3d48: 4505 li a0,1 + 3d4a: 4eb000ef jal ra,4a34 <exit> + total += n; + 3d4e: 00a9093b addw s2,s2,a0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3d52: 660d lui a2,0x3 + 3d54: 85d2 mv a1,s4 + 3d56: 854e mv a0,s3 + 3d58: 4f5000ef jal ra,4a4c <read> + 3d5c: 02a05363 blez a0,3d82 <fourfiles+0x18a> + 3d60: 00008797 auipc a5,0x8 + 3d64: f1878793 addi a5,a5,-232 # bc78 <buf> + 3d68: fff5069b addiw a3,a0,-1 + 3d6c: 1682 slli a3,a3,0x20 + 3d6e: 9281 srli a3,a3,0x20 + 3d70: 96d6 add a3,a3,s5 + if(buf[j] != '0'+i){ + 3d72: 0007c703 lbu a4,0(a5) + 3d76: fc9711e3 bne a4,s1,3d38 <fourfiles+0x140> + for(j = 0; j < n; j++){ + 3d7a: 0785 addi a5,a5,1 + 3d7c: fed79be3 bne a5,a3,3d72 <fourfiles+0x17a> + 3d80: b7f9 j 3d4e <fourfiles+0x156> + close(fd); + 3d82: 854e mv a0,s3 + 3d84: 4d9000ef jal ra,4a5c <close> + if(total != N*SZ){ + 3d88: 03b91463 bne s2,s11,3db0 <fourfiles+0x1b8> + unlink(fname); + 3d8c: 8566 mv a0,s9 + 3d8e: 4f7000ef jal ra,4a84 <unlink> + for(i = 0; i < NCHILD; i++){ + 3d92: 0c21 addi s8,s8,8 + 3d94: 2b85 addiw s7,s7,1 + 3d96: 03ab8763 beq s7,s10,3dc4 <fourfiles+0x1cc> + fname = names[i]; + 3d9a: 000c3c83 ld s9,0(s8) + fd = open(fname, 0); + 3d9e: 4581 li a1,0 + 3da0: 8566 mv a0,s9 + 3da2: 4d3000ef jal ra,4a74 <open> + 3da6: 89aa mv s3,a0 + total = 0; + 3da8: 895a mv s2,s6 + if(buf[j] != '0'+i){ + 3daa: 000b849b sext.w s1,s7 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3dae: b755 j 3d52 <fourfiles+0x15a> + printf("wrong length %d\n", total); + 3db0: 85ca mv a1,s2 + 3db2: 00003517 auipc a0,0x3 + 3db6: eae50513 addi a0,a0,-338 # 6c60 <malloc+0x1d54> + 3dba: 09e010ef jal ra,4e58 <printf> + exit(1); + 3dbe: 4505 li a0,1 + 3dc0: 475000ef jal ra,4a34 <exit> +} + 3dc4: 70aa ld ra,168(sp) + 3dc6: 740a ld s0,160(sp) + 3dc8: 64ea ld s1,152(sp) + 3dca: 694a ld s2,144(sp) + 3dcc: 69aa ld s3,136(sp) + 3dce: 6a0a ld s4,128(sp) + 3dd0: 7ae6 ld s5,120(sp) + 3dd2: 7b46 ld s6,112(sp) + 3dd4: 7ba6 ld s7,104(sp) + 3dd6: 7c06 ld s8,96(sp) + 3dd8: 6ce6 ld s9,88(sp) + 3dda: 6d46 ld s10,80(sp) + 3ddc: 6da6 ld s11,72(sp) + 3dde: 614d addi sp,sp,176 + 3de0: 8082 ret + +0000000000003de2 <concreate>: +{ + 3de2: 7135 addi sp,sp,-160 + 3de4: ed06 sd ra,152(sp) + 3de6: e922 sd s0,144(sp) + 3de8: e526 sd s1,136(sp) + 3dea: e14a sd s2,128(sp) + 3dec: fcce sd s3,120(sp) + 3dee: f8d2 sd s4,112(sp) + 3df0: f4d6 sd s5,104(sp) + 3df2: f0da sd s6,96(sp) + 3df4: ecde sd s7,88(sp) + 3df6: 1100 addi s0,sp,160 + 3df8: 89aa mv s3,a0 + file[0] = 'C'; + 3dfa: 04300793 li a5,67 + 3dfe: faf40423 sb a5,-88(s0) + file[2] = '\0'; + 3e02: fa040523 sb zero,-86(s0) + for(i = 0; i < N; i++){ + 3e06: 4901 li s2,0 + if(pid && (i % 3) == 1){ + 3e08: 4b0d li s6,3 + 3e0a: 4a85 li s5,1 + link("C0", file); + 3e0c: 00003b97 auipc s7,0x3 + 3e10: e6cb8b93 addi s7,s7,-404 # 6c78 <malloc+0x1d6c> + for(i = 0; i < N; i++){ + 3e14: 02800a13 li s4,40 + 3e18: a41d j 403e <concreate+0x25c> + link("C0", file); + 3e1a: fa840593 addi a1,s0,-88 + 3e1e: 855e mv a0,s7 + 3e20: 475000ef jal ra,4a94 <link> + if(pid == 0) { + 3e24: a411 j 4028 <concreate+0x246> + } else if(pid == 0 && (i % 5) == 1){ + 3e26: 4795 li a5,5 + 3e28: 02f9693b remw s2,s2,a5 + 3e2c: 4785 li a5,1 + 3e2e: 02f90563 beq s2,a5,3e58 <concreate+0x76> + fd = open(file, O_CREATE | O_RDWR); + 3e32: 20200593 li a1,514 + 3e36: fa840513 addi a0,s0,-88 + 3e3a: 43b000ef jal ra,4a74 <open> + if(fd < 0){ + 3e3e: 1e055063 bgez a0,401e <concreate+0x23c> + printf("concreate create %s failed\n", file); + 3e42: fa840593 addi a1,s0,-88 + 3e46: 00003517 auipc a0,0x3 + 3e4a: e3a50513 addi a0,a0,-454 # 6c80 <malloc+0x1d74> + 3e4e: 00a010ef jal ra,4e58 <printf> + exit(1); + 3e52: 4505 li a0,1 + 3e54: 3e1000ef jal ra,4a34 <exit> + link("C0", file); + 3e58: fa840593 addi a1,s0,-88 + 3e5c: 00003517 auipc a0,0x3 + 3e60: e1c50513 addi a0,a0,-484 # 6c78 <malloc+0x1d6c> + 3e64: 431000ef jal ra,4a94 <link> + exit(0); + 3e68: 4501 li a0,0 + 3e6a: 3cb000ef jal ra,4a34 <exit> + exit(1); + 3e6e: 4505 li a0,1 + 3e70: 3c5000ef jal ra,4a34 <exit> + memset(fa, 0, sizeof(fa)); + 3e74: 02800613 li a2,40 + 3e78: 4581 li a1,0 + 3e7a: f8040513 addi a0,s0,-128 + 3e7e: 1d1000ef jal ra,484e <memset> + fd = open(".", 0); + 3e82: 4581 li a1,0 + 3e84: 00002517 auipc a0,0x2 + 3e88: 88c50513 addi a0,a0,-1908 # 5710 <malloc+0x804> + 3e8c: 3e9000ef jal ra,4a74 <open> + 3e90: 892a mv s2,a0 + n = 0; + 3e92: 8aa6 mv s5,s1 + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3e94: 04300a13 li s4,67 + if(i < 0 || i >= sizeof(fa)){ + 3e98: 02700b13 li s6,39 + fa[i] = 1; + 3e9c: 4b85 li s7,1 + while(read(fd, &de, sizeof(de)) > 0){ + 3e9e: 4641 li a2,16 + 3ea0: f7040593 addi a1,s0,-144 + 3ea4: 854a mv a0,s2 + 3ea6: 3a7000ef jal ra,4a4c <read> + 3eaa: 06a05a63 blez a0,3f1e <concreate+0x13c> + if(de.inum == 0) + 3eae: f7045783 lhu a5,-144(s0) + 3eb2: d7f5 beqz a5,3e9e <concreate+0xbc> + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3eb4: f7244783 lbu a5,-142(s0) + 3eb8: ff4793e3 bne a5,s4,3e9e <concreate+0xbc> + 3ebc: f7444783 lbu a5,-140(s0) + 3ec0: fff9 bnez a5,3e9e <concreate+0xbc> + i = de.name[1] - '0'; + 3ec2: f7344783 lbu a5,-141(s0) + 3ec6: fd07879b addiw a5,a5,-48 + 3eca: 0007871b sext.w a4,a5 + if(i < 0 || i >= sizeof(fa)){ + 3ece: 02eb6063 bltu s6,a4,3eee <concreate+0x10c> + if(fa[i]){ + 3ed2: fb070793 addi a5,a4,-80 # fb0 <bigdir+0x112> + 3ed6: 97a2 add a5,a5,s0 + 3ed8: fd07c783 lbu a5,-48(a5) + 3edc: e78d bnez a5,3f06 <concreate+0x124> + fa[i] = 1; + 3ede: fb070793 addi a5,a4,-80 + 3ee2: 00878733 add a4,a5,s0 + 3ee6: fd770823 sb s7,-48(a4) + n++; + 3eea: 2a85 addiw s5,s5,1 + 3eec: bf4d j 3e9e <concreate+0xbc> + printf("%s: concreate weird file %s\n", s, de.name); + 3eee: f7240613 addi a2,s0,-142 + 3ef2: 85ce mv a1,s3 + 3ef4: 00003517 auipc a0,0x3 + 3ef8: dac50513 addi a0,a0,-596 # 6ca0 <malloc+0x1d94> + 3efc: 75d000ef jal ra,4e58 <printf> + exit(1); + 3f00: 4505 li a0,1 + 3f02: 333000ef jal ra,4a34 <exit> + printf("%s: concreate duplicate file %s\n", s, de.name); + 3f06: f7240613 addi a2,s0,-142 + 3f0a: 85ce mv a1,s3 + 3f0c: 00003517 auipc a0,0x3 + 3f10: db450513 addi a0,a0,-588 # 6cc0 <malloc+0x1db4> + 3f14: 745000ef jal ra,4e58 <printf> + exit(1); + 3f18: 4505 li a0,1 + 3f1a: 31b000ef jal ra,4a34 <exit> + close(fd); + 3f1e: 854a mv a0,s2 + 3f20: 33d000ef jal ra,4a5c <close> + if(n != N){ + 3f24: 02800793 li a5,40 + 3f28: 00fa9763 bne s5,a5,3f36 <concreate+0x154> + if(((i % 3) == 0 && pid == 0) || + 3f2c: 4a8d li s5,3 + 3f2e: 4b05 li s6,1 + for(i = 0; i < N; i++){ + 3f30: 02800a13 li s4,40 + 3f34: a079 j 3fc2 <concreate+0x1e0> + printf("%s: concreate not enough files in directory listing\n", s); + 3f36: 85ce mv a1,s3 + 3f38: 00003517 auipc a0,0x3 + 3f3c: db050513 addi a0,a0,-592 # 6ce8 <malloc+0x1ddc> + 3f40: 719000ef jal ra,4e58 <printf> + exit(1); + 3f44: 4505 li a0,1 + 3f46: 2ef000ef jal ra,4a34 <exit> + printf("%s: fork failed\n", s); + 3f4a: 85ce mv a1,s3 + 3f4c: 00002517 auipc a0,0x2 + 3f50: 96c50513 addi a0,a0,-1684 # 58b8 <malloc+0x9ac> + 3f54: 705000ef jal ra,4e58 <printf> + exit(1); + 3f58: 4505 li a0,1 + 3f5a: 2db000ef jal ra,4a34 <exit> + close(open(file, 0)); + 3f5e: 4581 li a1,0 + 3f60: fa840513 addi a0,s0,-88 + 3f64: 311000ef jal ra,4a74 <open> + 3f68: 2f5000ef jal ra,4a5c <close> + close(open(file, 0)); + 3f6c: 4581 li a1,0 + 3f6e: fa840513 addi a0,s0,-88 + 3f72: 303000ef jal ra,4a74 <open> + 3f76: 2e7000ef jal ra,4a5c <close> + close(open(file, 0)); + 3f7a: 4581 li a1,0 + 3f7c: fa840513 addi a0,s0,-88 + 3f80: 2f5000ef jal ra,4a74 <open> + 3f84: 2d9000ef jal ra,4a5c <close> + close(open(file, 0)); + 3f88: 4581 li a1,0 + 3f8a: fa840513 addi a0,s0,-88 + 3f8e: 2e7000ef jal ra,4a74 <open> + 3f92: 2cb000ef jal ra,4a5c <close> + close(open(file, 0)); + 3f96: 4581 li a1,0 + 3f98: fa840513 addi a0,s0,-88 + 3f9c: 2d9000ef jal ra,4a74 <open> + 3fa0: 2bd000ef jal ra,4a5c <close> + close(open(file, 0)); + 3fa4: 4581 li a1,0 + 3fa6: fa840513 addi a0,s0,-88 + 3faa: 2cb000ef jal ra,4a74 <open> + 3fae: 2af000ef jal ra,4a5c <close> + if(pid == 0) + 3fb2: 06090363 beqz s2,4018 <concreate+0x236> + wait(0); + 3fb6: 4501 li a0,0 + 3fb8: 285000ef jal ra,4a3c <wait> + for(i = 0; i < N; i++){ + 3fbc: 2485 addiw s1,s1,1 + 3fbe: 0b448963 beq s1,s4,4070 <concreate+0x28e> + file[1] = '0' + i; + 3fc2: 0304879b addiw a5,s1,48 + 3fc6: faf404a3 sb a5,-87(s0) + pid = fork(); + 3fca: 263000ef jal ra,4a2c <fork> + 3fce: 892a mv s2,a0 + if(pid < 0){ + 3fd0: f6054de3 bltz a0,3f4a <concreate+0x168> + if(((i % 3) == 0 && pid == 0) || + 3fd4: 0354e73b remw a4,s1,s5 + 3fd8: 00a767b3 or a5,a4,a0 + 3fdc: 2781 sext.w a5,a5 + 3fde: d3c1 beqz a5,3f5e <concreate+0x17c> + 3fe0: 01671363 bne a4,s6,3fe6 <concreate+0x204> + ((i % 3) == 1 && pid != 0)){ + 3fe4: fd2d bnez a0,3f5e <concreate+0x17c> + unlink(file); + 3fe6: fa840513 addi a0,s0,-88 + 3fea: 29b000ef jal ra,4a84 <unlink> + unlink(file); + 3fee: fa840513 addi a0,s0,-88 + 3ff2: 293000ef jal ra,4a84 <unlink> + unlink(file); + 3ff6: fa840513 addi a0,s0,-88 + 3ffa: 28b000ef jal ra,4a84 <unlink> + unlink(file); + 3ffe: fa840513 addi a0,s0,-88 + 4002: 283000ef jal ra,4a84 <unlink> + unlink(file); + 4006: fa840513 addi a0,s0,-88 + 400a: 27b000ef jal ra,4a84 <unlink> + unlink(file); + 400e: fa840513 addi a0,s0,-88 + 4012: 273000ef jal ra,4a84 <unlink> + 4016: bf71 j 3fb2 <concreate+0x1d0> + exit(0); + 4018: 4501 li a0,0 + 401a: 21b000ef jal ra,4a34 <exit> + close(fd); + 401e: 23f000ef jal ra,4a5c <close> + if(pid == 0) { + 4022: b599 j 3e68 <concreate+0x86> + close(fd); + 4024: 239000ef jal ra,4a5c <close> + wait(&xstatus); + 4028: f6c40513 addi a0,s0,-148 + 402c: 211000ef jal ra,4a3c <wait> + if(xstatus != 0) + 4030: f6c42483 lw s1,-148(s0) + 4034: e2049de3 bnez s1,3e6e <concreate+0x8c> + for(i = 0; i < N; i++){ + 4038: 2905 addiw s2,s2,1 + 403a: e3490de3 beq s2,s4,3e74 <concreate+0x92> + file[1] = '0' + i; + 403e: 0309079b addiw a5,s2,48 + 4042: faf404a3 sb a5,-87(s0) + unlink(file); + 4046: fa840513 addi a0,s0,-88 + 404a: 23b000ef jal ra,4a84 <unlink> + pid = fork(); + 404e: 1df000ef jal ra,4a2c <fork> + if(pid && (i % 3) == 1){ + 4052: dc050ae3 beqz a0,3e26 <concreate+0x44> + 4056: 036967bb remw a5,s2,s6 + 405a: dd5780e3 beq a5,s5,3e1a <concreate+0x38> + fd = open(file, O_CREATE | O_RDWR); + 405e: 20200593 li a1,514 + 4062: fa840513 addi a0,s0,-88 + 4066: 20f000ef jal ra,4a74 <open> + if(fd < 0){ + 406a: fa055de3 bgez a0,4024 <concreate+0x242> + 406e: bbd1 j 3e42 <concreate+0x60> +} + 4070: 60ea ld ra,152(sp) + 4072: 644a ld s0,144(sp) + 4074: 64aa ld s1,136(sp) + 4076: 690a ld s2,128(sp) + 4078: 79e6 ld s3,120(sp) + 407a: 7a46 ld s4,112(sp) + 407c: 7aa6 ld s5,104(sp) + 407e: 7b06 ld s6,96(sp) + 4080: 6be6 ld s7,88(sp) + 4082: 610d addi sp,sp,160 + 4084: 8082 ret + +0000000000004086 <bigfile>: +{ + 4086: 7139 addi sp,sp,-64 + 4088: fc06 sd ra,56(sp) + 408a: f822 sd s0,48(sp) + 408c: f426 sd s1,40(sp) + 408e: f04a sd s2,32(sp) + 4090: ec4e sd s3,24(sp) + 4092: e852 sd s4,16(sp) + 4094: e456 sd s5,8(sp) + 4096: 0080 addi s0,sp,64 + 4098: 8aaa mv s5,a0 + unlink("bigfile.dat"); + 409a: 00003517 auipc a0,0x3 + 409e: c8650513 addi a0,a0,-890 # 6d20 <malloc+0x1e14> + 40a2: 1e3000ef jal ra,4a84 <unlink> + fd = open("bigfile.dat", O_CREATE | O_RDWR); + 40a6: 20200593 li a1,514 + 40aa: 00003517 auipc a0,0x3 + 40ae: c7650513 addi a0,a0,-906 # 6d20 <malloc+0x1e14> + 40b2: 1c3000ef jal ra,4a74 <open> + 40b6: 89aa mv s3,a0 + for(i = 0; i < N; i++){ + 40b8: 4481 li s1,0 + memset(buf, i, SZ); + 40ba: 00008917 auipc s2,0x8 + 40be: bbe90913 addi s2,s2,-1090 # bc78 <buf> + for(i = 0; i < N; i++){ + 40c2: 4a51 li s4,20 + if(fd < 0){ + 40c4: 08054663 bltz a0,4150 <bigfile+0xca> + memset(buf, i, SZ); + 40c8: 25800613 li a2,600 + 40cc: 85a6 mv a1,s1 + 40ce: 854a mv a0,s2 + 40d0: 77e000ef jal ra,484e <memset> + if(write(fd, buf, SZ) != SZ){ + 40d4: 25800613 li a2,600 + 40d8: 85ca mv a1,s2 + 40da: 854e mv a0,s3 + 40dc: 179000ef jal ra,4a54 <write> + 40e0: 25800793 li a5,600 + 40e4: 08f51063 bne a0,a5,4164 <bigfile+0xde> + for(i = 0; i < N; i++){ + 40e8: 2485 addiw s1,s1,1 + 40ea: fd449fe3 bne s1,s4,40c8 <bigfile+0x42> + close(fd); + 40ee: 854e mv a0,s3 + 40f0: 16d000ef jal ra,4a5c <close> + fd = open("bigfile.dat", 0); + 40f4: 4581 li a1,0 + 40f6: 00003517 auipc a0,0x3 + 40fa: c2a50513 addi a0,a0,-982 # 6d20 <malloc+0x1e14> + 40fe: 177000ef jal ra,4a74 <open> + 4102: 8a2a mv s4,a0 + total = 0; + 4104: 4981 li s3,0 + for(i = 0; ; i++){ + 4106: 4481 li s1,0 + cc = read(fd, buf, SZ/2); + 4108: 00008917 auipc s2,0x8 + 410c: b7090913 addi s2,s2,-1168 # bc78 <buf> + if(fd < 0){ + 4110: 06054463 bltz a0,4178 <bigfile+0xf2> + cc = read(fd, buf, SZ/2); + 4114: 12c00613 li a2,300 + 4118: 85ca mv a1,s2 + 411a: 8552 mv a0,s4 + 411c: 131000ef jal ra,4a4c <read> + if(cc < 0){ + 4120: 06054663 bltz a0,418c <bigfile+0x106> + if(cc == 0) + 4124: c155 beqz a0,41c8 <bigfile+0x142> + if(cc != SZ/2){ + 4126: 12c00793 li a5,300 + 412a: 06f51b63 bne a0,a5,41a0 <bigfile+0x11a> + if(buf[0] != i/2 || buf[SZ/2-1] != i/2){ + 412e: 01f4d79b srliw a5,s1,0x1f + 4132: 9fa5 addw a5,a5,s1 + 4134: 4017d79b sraiw a5,a5,0x1 + 4138: 00094703 lbu a4,0(s2) + 413c: 06f71c63 bne a4,a5,41b4 <bigfile+0x12e> + 4140: 12b94703 lbu a4,299(s2) + 4144: 06f71863 bne a4,a5,41b4 <bigfile+0x12e> + total += cc; + 4148: 12c9899b addiw s3,s3,300 + for(i = 0; ; i++){ + 414c: 2485 addiw s1,s1,1 + cc = read(fd, buf, SZ/2); + 414e: b7d9 j 4114 <bigfile+0x8e> + printf("%s: cannot create bigfile", s); + 4150: 85d6 mv a1,s5 + 4152: 00003517 auipc a0,0x3 + 4156: bde50513 addi a0,a0,-1058 # 6d30 <malloc+0x1e24> + 415a: 4ff000ef jal ra,4e58 <printf> + exit(1); + 415e: 4505 li a0,1 + 4160: 0d5000ef jal ra,4a34 <exit> + printf("%s: write bigfile failed\n", s); + 4164: 85d6 mv a1,s5 + 4166: 00003517 auipc a0,0x3 + 416a: bea50513 addi a0,a0,-1046 # 6d50 <malloc+0x1e44> + 416e: 4eb000ef jal ra,4e58 <printf> + exit(1); + 4172: 4505 li a0,1 + 4174: 0c1000ef jal ra,4a34 <exit> + printf("%s: cannot open bigfile\n", s); + 4178: 85d6 mv a1,s5 + 417a: 00003517 auipc a0,0x3 + 417e: bf650513 addi a0,a0,-1034 # 6d70 <malloc+0x1e64> + 4182: 4d7000ef jal ra,4e58 <printf> + exit(1); + 4186: 4505 li a0,1 + 4188: 0ad000ef jal ra,4a34 <exit> + printf("%s: read bigfile failed\n", s); + 418c: 85d6 mv a1,s5 + 418e: 00003517 auipc a0,0x3 + 4192: c0250513 addi a0,a0,-1022 # 6d90 <malloc+0x1e84> + 4196: 4c3000ef jal ra,4e58 <printf> + exit(1); + 419a: 4505 li a0,1 + 419c: 099000ef jal ra,4a34 <exit> + printf("%s: short read bigfile\n", s); + 41a0: 85d6 mv a1,s5 + 41a2: 00003517 auipc a0,0x3 + 41a6: c0e50513 addi a0,a0,-1010 # 6db0 <malloc+0x1ea4> + 41aa: 4af000ef jal ra,4e58 <printf> + exit(1); + 41ae: 4505 li a0,1 + 41b0: 085000ef jal ra,4a34 <exit> + printf("%s: read bigfile wrong data\n", s); + 41b4: 85d6 mv a1,s5 + 41b6: 00003517 auipc a0,0x3 + 41ba: c1250513 addi a0,a0,-1006 # 6dc8 <malloc+0x1ebc> + 41be: 49b000ef jal ra,4e58 <printf> + exit(1); + 41c2: 4505 li a0,1 + 41c4: 071000ef jal ra,4a34 <exit> + close(fd); + 41c8: 8552 mv a0,s4 + 41ca: 093000ef jal ra,4a5c <close> + if(total != N*SZ){ + 41ce: 678d lui a5,0x3 + 41d0: ee078793 addi a5,a5,-288 # 2ee0 <subdir+0x358> + 41d4: 02f99163 bne s3,a5,41f6 <bigfile+0x170> + unlink("bigfile.dat"); + 41d8: 00003517 auipc a0,0x3 + 41dc: b4850513 addi a0,a0,-1208 # 6d20 <malloc+0x1e14> + 41e0: 0a5000ef jal ra,4a84 <unlink> +} + 41e4: 70e2 ld ra,56(sp) + 41e6: 7442 ld s0,48(sp) + 41e8: 74a2 ld s1,40(sp) + 41ea: 7902 ld s2,32(sp) + 41ec: 69e2 ld s3,24(sp) + 41ee: 6a42 ld s4,16(sp) + 41f0: 6aa2 ld s5,8(sp) + 41f2: 6121 addi sp,sp,64 + 41f4: 8082 ret + printf("%s: read bigfile wrong total\n", s); + 41f6: 85d6 mv a1,s5 + 41f8: 00003517 auipc a0,0x3 + 41fc: bf050513 addi a0,a0,-1040 # 6de8 <malloc+0x1edc> + 4200: 459000ef jal ra,4e58 <printf> + exit(1); + 4204: 4505 li a0,1 + 4206: 02f000ef jal ra,4a34 <exit> + +000000000000420a <bigargtest>: +{ + 420a: 7121 addi sp,sp,-448 + 420c: ff06 sd ra,440(sp) + 420e: fb22 sd s0,432(sp) + 4210: f726 sd s1,424(sp) + 4212: 0380 addi s0,sp,448 + 4214: 84aa mv s1,a0 + unlink("bigarg-ok"); + 4216: 00003517 auipc a0,0x3 + 421a: bf250513 addi a0,a0,-1038 # 6e08 <malloc+0x1efc> + 421e: 067000ef jal ra,4a84 <unlink> + pid = fork(); + 4222: 00b000ef jal ra,4a2c <fork> + if(pid == 0){ + 4226: c915 beqz a0,425a <bigargtest+0x50> + } else if(pid < 0){ + 4228: 08054a63 bltz a0,42bc <bigargtest+0xb2> + wait(&xstatus); + 422c: fdc40513 addi a0,s0,-36 + 4230: 00d000ef jal ra,4a3c <wait> + if(xstatus != 0) + 4234: fdc42503 lw a0,-36(s0) + 4238: ed41 bnez a0,42d0 <bigargtest+0xc6> + fd = open("bigarg-ok", 0); + 423a: 4581 li a1,0 + 423c: 00003517 auipc a0,0x3 + 4240: bcc50513 addi a0,a0,-1076 # 6e08 <malloc+0x1efc> + 4244: 031000ef jal ra,4a74 <open> + if(fd < 0){ + 4248: 08054663 bltz a0,42d4 <bigargtest+0xca> + close(fd); + 424c: 011000ef jal ra,4a5c <close> +} + 4250: 70fa ld ra,440(sp) + 4252: 745a ld s0,432(sp) + 4254: 74ba ld s1,424(sp) + 4256: 6139 addi sp,sp,448 + 4258: 8082 ret + memset(big, ' ', sizeof(big)); + 425a: 19000613 li a2,400 + 425e: 02000593 li a1,32 + 4262: e4840513 addi a0,s0,-440 + 4266: 5e8000ef jal ra,484e <memset> + big[sizeof(big)-1] = '\0'; + 426a: fc040ba3 sb zero,-41(s0) + for(i = 0; i < MAXARG-1; i++) + 426e: 00004797 auipc a5,0x4 + 4272: 1f278793 addi a5,a5,498 # 8460 <args.1> + 4276: 00004697 auipc a3,0x4 + 427a: 2e268693 addi a3,a3,738 # 8558 <args.1+0xf8> + args[i] = big; + 427e: e4840713 addi a4,s0,-440 + 4282: e398 sd a4,0(a5) + for(i = 0; i < MAXARG-1; i++) + 4284: 07a1 addi a5,a5,8 + 4286: fed79ee3 bne a5,a3,4282 <bigargtest+0x78> + args[MAXARG-1] = 0; + 428a: 00004597 auipc a1,0x4 + 428e: 1d658593 addi a1,a1,470 # 8460 <args.1> + 4292: 0e05bc23 sd zero,248(a1) + exec("echo", args); + 4296: 00001517 auipc a0,0x1 + 429a: d9250513 addi a0,a0,-622 # 5028 <malloc+0x11c> + 429e: 7ce000ef jal ra,4a6c <exec> + fd = open("bigarg-ok", O_CREATE); + 42a2: 20000593 li a1,512 + 42a6: 00003517 auipc a0,0x3 + 42aa: b6250513 addi a0,a0,-1182 # 6e08 <malloc+0x1efc> + 42ae: 7c6000ef jal ra,4a74 <open> + close(fd); + 42b2: 7aa000ef jal ra,4a5c <close> + exit(0); + 42b6: 4501 li a0,0 + 42b8: 77c000ef jal ra,4a34 <exit> + printf("%s: bigargtest: fork failed\n", s); + 42bc: 85a6 mv a1,s1 + 42be: 00003517 auipc a0,0x3 + 42c2: b5a50513 addi a0,a0,-1190 # 6e18 <malloc+0x1f0c> + 42c6: 393000ef jal ra,4e58 <printf> + exit(1); + 42ca: 4505 li a0,1 + 42cc: 768000ef jal ra,4a34 <exit> + exit(xstatus); + 42d0: 764000ef jal ra,4a34 <exit> + printf("%s: bigarg test failed!\n", s); + 42d4: 85a6 mv a1,s1 + 42d6: 00003517 auipc a0,0x3 + 42da: b6250513 addi a0,a0,-1182 # 6e38 <malloc+0x1f2c> + 42de: 37b000ef jal ra,4e58 <printf> + exit(1); + 42e2: 4505 li a0,1 + 42e4: 750000ef jal ra,4a34 <exit> + +00000000000042e8 <fsfull>: +{ + 42e8: 7171 addi sp,sp,-176 + 42ea: f506 sd ra,168(sp) + 42ec: f122 sd s0,160(sp) + 42ee: ed26 sd s1,152(sp) + 42f0: e94a sd s2,144(sp) + 42f2: e54e sd s3,136(sp) + 42f4: e152 sd s4,128(sp) + 42f6: fcd6 sd s5,120(sp) + 42f8: f8da sd s6,112(sp) + 42fa: f4de sd s7,104(sp) + 42fc: f0e2 sd s8,96(sp) + 42fe: ece6 sd s9,88(sp) + 4300: e8ea sd s10,80(sp) + 4302: e4ee sd s11,72(sp) + 4304: 1900 addi s0,sp,176 + printf("fsfull test\n"); + 4306: 00003517 auipc a0,0x3 + 430a: b5250513 addi a0,a0,-1198 # 6e58 <malloc+0x1f4c> + 430e: 34b000ef jal ra,4e58 <printf> + for(nfiles = 0; ; nfiles++){ + 4312: 4481 li s1,0 + name[0] = 'f'; + 4314: 06600d13 li s10,102 + name[1] = '0' + nfiles / 1000; + 4318: 3e800c13 li s8,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 431c: 06400b93 li s7,100 + name[3] = '0' + (nfiles % 100) / 10; + 4320: 4b29 li s6,10 + printf("writing %s\n", name); + 4322: 00003c97 auipc s9,0x3 + 4326: b46c8c93 addi s9,s9,-1210 # 6e68 <malloc+0x1f5c> + int total = 0; + 432a: 4d81 li s11,0 + int cc = write(fd, buf, BSIZE); + 432c: 00008a17 auipc s4,0x8 + 4330: 94ca0a13 addi s4,s4,-1716 # bc78 <buf> + name[0] = 'f'; + 4334: f5a40823 sb s10,-176(s0) + name[1] = '0' + nfiles / 1000; + 4338: 0384c7bb divw a5,s1,s8 + 433c: 0307879b addiw a5,a5,48 + 4340: f4f408a3 sb a5,-175(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 4344: 0384e7bb remw a5,s1,s8 + 4348: 0377c7bb divw a5,a5,s7 + 434c: 0307879b addiw a5,a5,48 + 4350: f4f40923 sb a5,-174(s0) + name[3] = '0' + (nfiles % 100) / 10; + 4354: 0374e7bb remw a5,s1,s7 + 4358: 0367c7bb divw a5,a5,s6 + 435c: 0307879b addiw a5,a5,48 + 4360: f4f409a3 sb a5,-173(s0) + name[4] = '0' + (nfiles % 10); + 4364: 0364e7bb remw a5,s1,s6 + 4368: 0307879b addiw a5,a5,48 + 436c: f4f40a23 sb a5,-172(s0) + name[5] = '\0'; + 4370: f4040aa3 sb zero,-171(s0) + printf("writing %s\n", name); + 4374: f5040593 addi a1,s0,-176 + 4378: 8566 mv a0,s9 + 437a: 2df000ef jal ra,4e58 <printf> + int fd = open(name, O_CREATE|O_RDWR); + 437e: 20200593 li a1,514 + 4382: f5040513 addi a0,s0,-176 + 4386: 6ee000ef jal ra,4a74 <open> + 438a: 892a mv s2,a0 + if(fd < 0){ + 438c: 0a055063 bgez a0,442c <fsfull+0x144> + printf("open %s failed\n", name); + 4390: f5040593 addi a1,s0,-176 + 4394: 00003517 auipc a0,0x3 + 4398: ae450513 addi a0,a0,-1308 # 6e78 <malloc+0x1f6c> + 439c: 2bd000ef jal ra,4e58 <printf> + while(nfiles >= 0){ + 43a0: 0604c163 bltz s1,4402 <fsfull+0x11a> + name[0] = 'f'; + 43a4: 06600b13 li s6,102 + name[1] = '0' + nfiles / 1000; + 43a8: 3e800a13 li s4,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 43ac: 06400993 li s3,100 + name[3] = '0' + (nfiles % 100) / 10; + 43b0: 4929 li s2,10 + while(nfiles >= 0){ + 43b2: 5afd li s5,-1 + name[0] = 'f'; + 43b4: f5640823 sb s6,-176(s0) + name[1] = '0' + nfiles / 1000; + 43b8: 0344c7bb divw a5,s1,s4 + 43bc: 0307879b addiw a5,a5,48 + 43c0: f4f408a3 sb a5,-175(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 43c4: 0344e7bb remw a5,s1,s4 + 43c8: 0337c7bb divw a5,a5,s3 + 43cc: 0307879b addiw a5,a5,48 + 43d0: f4f40923 sb a5,-174(s0) + name[3] = '0' + (nfiles % 100) / 10; + 43d4: 0334e7bb remw a5,s1,s3 + 43d8: 0327c7bb divw a5,a5,s2 + 43dc: 0307879b addiw a5,a5,48 + 43e0: f4f409a3 sb a5,-173(s0) + name[4] = '0' + (nfiles % 10); + 43e4: 0324e7bb remw a5,s1,s2 + 43e8: 0307879b addiw a5,a5,48 + 43ec: f4f40a23 sb a5,-172(s0) + name[5] = '\0'; + 43f0: f4040aa3 sb zero,-171(s0) + unlink(name); + 43f4: f5040513 addi a0,s0,-176 + 43f8: 68c000ef jal ra,4a84 <unlink> + nfiles--; + 43fc: 34fd addiw s1,s1,-1 + while(nfiles >= 0){ + 43fe: fb549be3 bne s1,s5,43b4 <fsfull+0xcc> + printf("fsfull test finished\n"); + 4402: 00003517 auipc a0,0x3 + 4406: a9650513 addi a0,a0,-1386 # 6e98 <malloc+0x1f8c> + 440a: 24f000ef jal ra,4e58 <printf> +} + 440e: 70aa ld ra,168(sp) + 4410: 740a ld s0,160(sp) + 4412: 64ea ld s1,152(sp) + 4414: 694a ld s2,144(sp) + 4416: 69aa ld s3,136(sp) + 4418: 6a0a ld s4,128(sp) + 441a: 7ae6 ld s5,120(sp) + 441c: 7b46 ld s6,112(sp) + 441e: 7ba6 ld s7,104(sp) + 4420: 7c06 ld s8,96(sp) + 4422: 6ce6 ld s9,88(sp) + 4424: 6d46 ld s10,80(sp) + 4426: 6da6 ld s11,72(sp) + 4428: 614d addi sp,sp,176 + 442a: 8082 ret + int total = 0; + 442c: 89ee mv s3,s11 + if(cc < BSIZE) + 442e: 3ff00a93 li s5,1023 + int cc = write(fd, buf, BSIZE); + 4432: 40000613 li a2,1024 + 4436: 85d2 mv a1,s4 + 4438: 854a mv a0,s2 + 443a: 61a000ef jal ra,4a54 <write> + if(cc < BSIZE) + 443e: 00aad563 bge s5,a0,4448 <fsfull+0x160> + total += cc; + 4442: 00a989bb addw s3,s3,a0 + while(1){ + 4446: b7f5 j 4432 <fsfull+0x14a> + printf("wrote %d bytes\n", total); + 4448: 85ce mv a1,s3 + 444a: 00003517 auipc a0,0x3 + 444e: a3e50513 addi a0,a0,-1474 # 6e88 <malloc+0x1f7c> + 4452: 207000ef jal ra,4e58 <printf> + close(fd); + 4456: 854a mv a0,s2 + 4458: 604000ef jal ra,4a5c <close> + if(total == 0) + 445c: f40982e3 beqz s3,43a0 <fsfull+0xb8> + for(nfiles = 0; ; nfiles++){ + 4460: 2485 addiw s1,s1,1 + 4462: bdc9 j 4334 <fsfull+0x4c> + +0000000000004464 <run>: +// + +// run each test in its own process. run returns 1 if child's exit() +// indicates success. +int +run(void f(char *), char *s) { + 4464: 7179 addi sp,sp,-48 + 4466: f406 sd ra,40(sp) + 4468: f022 sd s0,32(sp) + 446a: ec26 sd s1,24(sp) + 446c: e84a sd s2,16(sp) + 446e: 1800 addi s0,sp,48 + 4470: 84aa mv s1,a0 + 4472: 892e mv s2,a1 + int pid; + int xstatus; + + printf("test %s: ", s); + 4474: 00003517 auipc a0,0x3 + 4478: a3c50513 addi a0,a0,-1476 # 6eb0 <malloc+0x1fa4> + 447c: 1dd000ef jal ra,4e58 <printf> + if((pid = fork()) < 0) { + 4480: 5ac000ef jal ra,4a2c <fork> + 4484: 02054a63 bltz a0,44b8 <run+0x54> + printf("runtest: fork error\n"); + exit(1); + } + if(pid == 0) { + 4488: c129 beqz a0,44ca <run+0x66> + f(s); + exit(0); + } else { + wait(&xstatus); + 448a: fdc40513 addi a0,s0,-36 + 448e: 5ae000ef jal ra,4a3c <wait> + if(xstatus != 0) + 4492: fdc42783 lw a5,-36(s0) + 4496: cf9d beqz a5,44d4 <run+0x70> + printf("FAILED\n"); + 4498: 00003517 auipc a0,0x3 + 449c: a4050513 addi a0,a0,-1472 # 6ed8 <malloc+0x1fcc> + 44a0: 1b9000ef jal ra,4e58 <printf> + else + printf("OK\n"); + return xstatus == 0; + 44a4: fdc42503 lw a0,-36(s0) + } +} + 44a8: 00153513 seqz a0,a0 + 44ac: 70a2 ld ra,40(sp) + 44ae: 7402 ld s0,32(sp) + 44b0: 64e2 ld s1,24(sp) + 44b2: 6942 ld s2,16(sp) + 44b4: 6145 addi sp,sp,48 + 44b6: 8082 ret + printf("runtest: fork error\n"); + 44b8: 00003517 auipc a0,0x3 + 44bc: a0850513 addi a0,a0,-1528 # 6ec0 <malloc+0x1fb4> + 44c0: 199000ef jal ra,4e58 <printf> + exit(1); + 44c4: 4505 li a0,1 + 44c6: 56e000ef jal ra,4a34 <exit> + f(s); + 44ca: 854a mv a0,s2 + 44cc: 9482 jalr s1 + exit(0); + 44ce: 4501 li a0,0 + 44d0: 564000ef jal ra,4a34 <exit> + printf("OK\n"); + 44d4: 00003517 auipc a0,0x3 + 44d8: a0c50513 addi a0,a0,-1524 # 6ee0 <malloc+0x1fd4> + 44dc: 17d000ef jal ra,4e58 <printf> + 44e0: b7d1 j 44a4 <run+0x40> + +00000000000044e2 <runtests>: + +int +runtests(struct test *tests, char *justone, int continuous) { + 44e2: 7139 addi sp,sp,-64 + 44e4: fc06 sd ra,56(sp) + 44e6: f822 sd s0,48(sp) + 44e8: f426 sd s1,40(sp) + 44ea: f04a sd s2,32(sp) + 44ec: ec4e sd s3,24(sp) + 44ee: e852 sd s4,16(sp) + 44f0: e456 sd s5,8(sp) + 44f2: 0080 addi s0,sp,64 + for (struct test *t = tests; t->s != 0; t++) { + 44f4: 00853903 ld s2,8(a0) + 44f8: 04090c63 beqz s2,4550 <runtests+0x6e> + 44fc: 84aa mv s1,a0 + 44fe: 89ae mv s3,a1 + 4500: 8a32 mv s4,a2 + if((justone == 0) || strcmp(t->s, justone) == 0) { + if(!run(t->f, t->s)){ + if(continuous != 2){ + 4502: 4a89 li s5,2 + 4504: a031 j 4510 <runtests+0x2e> + for (struct test *t = tests; t->s != 0; t++) { + 4506: 04c1 addi s1,s1,16 + 4508: 0084b903 ld s2,8(s1) + 450c: 02090863 beqz s2,453c <runtests+0x5a> + if((justone == 0) || strcmp(t->s, justone) == 0) { + 4510: 00098763 beqz s3,451e <runtests+0x3c> + 4514: 85ce mv a1,s3 + 4516: 854a mv a0,s2 + 4518: 2e0000ef jal ra,47f8 <strcmp> + 451c: f56d bnez a0,4506 <runtests+0x24> + if(!run(t->f, t->s)){ + 451e: 85ca mv a1,s2 + 4520: 6088 ld a0,0(s1) + 4522: f43ff0ef jal ra,4464 <run> + 4526: f165 bnez a0,4506 <runtests+0x24> + if(continuous != 2){ + 4528: fd5a0fe3 beq s4,s5,4506 <runtests+0x24> + printf("SOME TESTS FAILED\n"); + 452c: 00003517 auipc a0,0x3 + 4530: 9bc50513 addi a0,a0,-1604 # 6ee8 <malloc+0x1fdc> + 4534: 125000ef jal ra,4e58 <printf> + return 1; + 4538: 4505 li a0,1 + 453a: a011 j 453e <runtests+0x5c> + } + } + } + } + return 0; + 453c: 4501 li a0,0 +} + 453e: 70e2 ld ra,56(sp) + 4540: 7442 ld s0,48(sp) + 4542: 74a2 ld s1,40(sp) + 4544: 7902 ld s2,32(sp) + 4546: 69e2 ld s3,24(sp) + 4548: 6a42 ld s4,16(sp) + 454a: 6aa2 ld s5,8(sp) + 454c: 6121 addi sp,sp,64 + 454e: 8082 ret + return 0; + 4550: 4501 li a0,0 + 4552: b7f5 j 453e <runtests+0x5c> + +0000000000004554 <countfree>: +// because out of memory with lazy allocation results in the process +// taking a fault and being killed, fork and report back. +// +int +countfree() +{ + 4554: 7139 addi sp,sp,-64 + 4556: fc06 sd ra,56(sp) + 4558: f822 sd s0,48(sp) + 455a: f426 sd s1,40(sp) + 455c: f04a sd s2,32(sp) + 455e: ec4e sd s3,24(sp) + 4560: 0080 addi s0,sp,64 + int fds[2]; + + if(pipe(fds) < 0){ + 4562: fc840513 addi a0,s0,-56 + 4566: 4de000ef jal ra,4a44 <pipe> + 456a: 04054b63 bltz a0,45c0 <countfree+0x6c> + printf("pipe() failed in countfree()\n"); + exit(1); + } + + int pid = fork(); + 456e: 4be000ef jal ra,4a2c <fork> + + if(pid < 0){ + 4572: 06054063 bltz a0,45d2 <countfree+0x7e> + printf("fork failed in countfree()\n"); + exit(1); + } + + if(pid == 0){ + 4576: e935 bnez a0,45ea <countfree+0x96> + close(fds[0]); + 4578: fc842503 lw a0,-56(s0) + 457c: 4e0000ef jal ra,4a5c <close> + + while(1){ + uint64 a = (uint64) sbrk(4096); + if(a == 0xffffffffffffffff){ + 4580: 597d li s2,-1 + break; + } + + // modify the memory to make sure it's really allocated. + *(char *)(a + 4096 - 1) = 1; + 4582: 4485 li s1,1 + + // report back one more page. + if(write(fds[1], "x", 1) != 1){ + 4584: 00001997 auipc s3,0x1 + 4588: b1498993 addi s3,s3,-1260 # 5098 <malloc+0x18c> + uint64 a = (uint64) sbrk(4096); + 458c: 6505 lui a0,0x1 + 458e: 52e000ef jal ra,4abc <sbrk> + if(a == 0xffffffffffffffff){ + 4592: 05250963 beq a0,s2,45e4 <countfree+0x90> + *(char *)(a + 4096 - 1) = 1; + 4596: 6785 lui a5,0x1 + 4598: 97aa add a5,a5,a0 + 459a: fe978fa3 sb s1,-1(a5) # fff <pgbug+0x2b> + if(write(fds[1], "x", 1) != 1){ + 459e: 8626 mv a2,s1 + 45a0: 85ce mv a1,s3 + 45a2: fcc42503 lw a0,-52(s0) + 45a6: 4ae000ef jal ra,4a54 <write> + 45aa: fe9501e3 beq a0,s1,458c <countfree+0x38> + printf("write() failed in countfree()\n"); + 45ae: 00003517 auipc a0,0x3 + 45b2: 99250513 addi a0,a0,-1646 # 6f40 <malloc+0x2034> + 45b6: 0a3000ef jal ra,4e58 <printf> + exit(1); + 45ba: 4505 li a0,1 + 45bc: 478000ef jal ra,4a34 <exit> + printf("pipe() failed in countfree()\n"); + 45c0: 00003517 auipc a0,0x3 + 45c4: 94050513 addi a0,a0,-1728 # 6f00 <malloc+0x1ff4> + 45c8: 091000ef jal ra,4e58 <printf> + exit(1); + 45cc: 4505 li a0,1 + 45ce: 466000ef jal ra,4a34 <exit> + printf("fork failed in countfree()\n"); + 45d2: 00003517 auipc a0,0x3 + 45d6: 94e50513 addi a0,a0,-1714 # 6f20 <malloc+0x2014> + 45da: 07f000ef jal ra,4e58 <printf> + exit(1); + 45de: 4505 li a0,1 + 45e0: 454000ef jal ra,4a34 <exit> + } + } + + exit(0); + 45e4: 4501 li a0,0 + 45e6: 44e000ef jal ra,4a34 <exit> + } + + close(fds[1]); + 45ea: fcc42503 lw a0,-52(s0) + 45ee: 46e000ef jal ra,4a5c <close> + + int n = 0; + 45f2: 4481 li s1,0 + while(1){ + char c; + int cc = read(fds[0], &c, 1); + 45f4: 4605 li a2,1 + 45f6: fc740593 addi a1,s0,-57 + 45fa: fc842503 lw a0,-56(s0) + 45fe: 44e000ef jal ra,4a4c <read> + if(cc < 0){ + 4602: 00054563 bltz a0,460c <countfree+0xb8> + printf("read() failed in countfree()\n"); + exit(1); + } + if(cc == 0) + 4606: cd01 beqz a0,461e <countfree+0xca> + break; + n += 1; + 4608: 2485 addiw s1,s1,1 + while(1){ + 460a: b7ed j 45f4 <countfree+0xa0> + printf("read() failed in countfree()\n"); + 460c: 00003517 auipc a0,0x3 + 4610: 95450513 addi a0,a0,-1708 # 6f60 <malloc+0x2054> + 4614: 045000ef jal ra,4e58 <printf> + exit(1); + 4618: 4505 li a0,1 + 461a: 41a000ef jal ra,4a34 <exit> + } + + close(fds[0]); + 461e: fc842503 lw a0,-56(s0) + 4622: 43a000ef jal ra,4a5c <close> + wait((int*)0); + 4626: 4501 li a0,0 + 4628: 414000ef jal ra,4a3c <wait> + + return n; +} + 462c: 8526 mv a0,s1 + 462e: 70e2 ld ra,56(sp) + 4630: 7442 ld s0,48(sp) + 4632: 74a2 ld s1,40(sp) + 4634: 7902 ld s2,32(sp) + 4636: 69e2 ld s3,24(sp) + 4638: 6121 addi sp,sp,64 + 463a: 8082 ret + +000000000000463c <drivetests>: + +int +drivetests(int quick, int continuous, char *justone) { + 463c: 711d addi sp,sp,-96 + 463e: ec86 sd ra,88(sp) + 4640: e8a2 sd s0,80(sp) + 4642: e4a6 sd s1,72(sp) + 4644: e0ca sd s2,64(sp) + 4646: fc4e sd s3,56(sp) + 4648: f852 sd s4,48(sp) + 464a: f456 sd s5,40(sp) + 464c: f05a sd s6,32(sp) + 464e: ec5e sd s7,24(sp) + 4650: e862 sd s8,16(sp) + 4652: e466 sd s9,8(sp) + 4654: e06a sd s10,0(sp) + 4656: 1080 addi s0,sp,96 + 4658: 8a2a mv s4,a0 + 465a: 892e mv s2,a1 + 465c: 89b2 mv s3,a2 + do { + printf("usertests starting\n"); + 465e: 00003b97 auipc s7,0x3 + 4662: 922b8b93 addi s7,s7,-1758 # 6f80 <malloc+0x2074> + int free0 = countfree(); + int free1 = 0; + if (runtests(quicktests, justone, continuous)) { + 4666: 00004b17 auipc s6,0x4 + 466a: 9aab0b13 addi s6,s6,-1622 # 8010 <quicktests> + if(continuous != 2) { + 466e: 4a89 li s5,2 + return 1; + } + } + } + if((free1 = countfree()) < free0) { + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 4670: 00003c97 auipc s9,0x3 + 4674: 948c8c93 addi s9,s9,-1720 # 6fb8 <malloc+0x20ac> + if (runtests(slowtests, justone, continuous)) { + 4678: 00004c17 auipc s8,0x4 + 467c: d68c0c13 addi s8,s8,-664 # 83e0 <slowtests> + printf("usertests slow tests starting\n"); + 4680: 00003d17 auipc s10,0x3 + 4684: 918d0d13 addi s10,s10,-1768 # 6f98 <malloc+0x208c> + 4688: a819 j 469e <drivetests+0x62> + 468a: 856a mv a0,s10 + 468c: 7cc000ef jal ra,4e58 <printf> + 4690: a80d j 46c2 <drivetests+0x86> + if((free1 = countfree()) < free0) { + 4692: ec3ff0ef jal ra,4554 <countfree> + 4696: 04954863 blt a0,s1,46e6 <drivetests+0xaa> + if(continuous != 2) { + return 1; + } + } + } while(continuous); + 469a: 06090363 beqz s2,4700 <drivetests+0xc4> + printf("usertests starting\n"); + 469e: 855e mv a0,s7 + 46a0: 7b8000ef jal ra,4e58 <printf> + int free0 = countfree(); + 46a4: eb1ff0ef jal ra,4554 <countfree> + 46a8: 84aa mv s1,a0 + if (runtests(quicktests, justone, continuous)) { + 46aa: 864a mv a2,s2 + 46ac: 85ce mv a1,s3 + 46ae: 855a mv a0,s6 + 46b0: e33ff0ef jal ra,44e2 <runtests> + 46b4: c119 beqz a0,46ba <drivetests+0x7e> + if(continuous != 2) { + 46b6: 05591163 bne s2,s5,46f8 <drivetests+0xbc> + if(!quick) { + 46ba: fc0a1ce3 bnez s4,4692 <drivetests+0x56> + if (justone == 0) + 46be: fc0986e3 beqz s3,468a <drivetests+0x4e> + if (runtests(slowtests, justone, continuous)) { + 46c2: 864a mv a2,s2 + 46c4: 85ce mv a1,s3 + 46c6: 8562 mv a0,s8 + 46c8: e1bff0ef jal ra,44e2 <runtests> + 46cc: d179 beqz a0,4692 <drivetests+0x56> + if(continuous != 2) { + 46ce: 03591763 bne s2,s5,46fc <drivetests+0xc0> + if((free1 = countfree()) < free0) { + 46d2: e83ff0ef jal ra,4554 <countfree> + 46d6: fc9552e3 bge a0,s1,469a <drivetests+0x5e> + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 46da: 8626 mv a2,s1 + 46dc: 85aa mv a1,a0 + 46de: 8566 mv a0,s9 + 46e0: 778000ef jal ra,4e58 <printf> + if(continuous != 2) { + 46e4: bf6d j 469e <drivetests+0x62> + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 46e6: 8626 mv a2,s1 + 46e8: 85aa mv a1,a0 + 46ea: 8566 mv a0,s9 + 46ec: 76c000ef jal ra,4e58 <printf> + if(continuous != 2) { + 46f0: fb5907e3 beq s2,s5,469e <drivetests+0x62> + return 1; + 46f4: 4505 li a0,1 + 46f6: a031 j 4702 <drivetests+0xc6> + return 1; + 46f8: 4505 li a0,1 + 46fa: a021 j 4702 <drivetests+0xc6> + return 1; + 46fc: 4505 li a0,1 + 46fe: a011 j 4702 <drivetests+0xc6> + return 0; + 4700: 854a mv a0,s2 +} + 4702: 60e6 ld ra,88(sp) + 4704: 6446 ld s0,80(sp) + 4706: 64a6 ld s1,72(sp) + 4708: 6906 ld s2,64(sp) + 470a: 79e2 ld s3,56(sp) + 470c: 7a42 ld s4,48(sp) + 470e: 7aa2 ld s5,40(sp) + 4710: 7b02 ld s6,32(sp) + 4712: 6be2 ld s7,24(sp) + 4714: 6c42 ld s8,16(sp) + 4716: 6ca2 ld s9,8(sp) + 4718: 6d02 ld s10,0(sp) + 471a: 6125 addi sp,sp,96 + 471c: 8082 ret + +000000000000471e <main>: + +int +main(int argc, char *argv[]) +{ + 471e: 1101 addi sp,sp,-32 + 4720: ec06 sd ra,24(sp) + 4722: e822 sd s0,16(sp) + 4724: e426 sd s1,8(sp) + 4726: e04a sd s2,0(sp) + 4728: 1000 addi s0,sp,32 + 472a: 84aa mv s1,a0 + int continuous = 0; + int quick = 0; + char *justone = 0; + + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 472c: 4789 li a5,2 + 472e: 00f50f63 beq a0,a5,474c <main+0x2e> + continuous = 1; + } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ + continuous = 2; + } else if(argc == 2 && argv[1][0] != '-'){ + justone = argv[1]; + } else if(argc > 1){ + 4732: 4785 li a5,1 + 4734: 06a7c063 blt a5,a0,4794 <main+0x76> + char *justone = 0; + 4738: 4901 li s2,0 + int quick = 0; + 473a: 4501 li a0,0 + int continuous = 0; + 473c: 4581 li a1,0 + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + exit(1); + } + if (drivetests(quick, continuous, justone)) { + 473e: 864a mv a2,s2 + 4740: efdff0ef jal ra,463c <drivetests> + 4744: c935 beqz a0,47b8 <main+0x9a> + exit(1); + 4746: 4505 li a0,1 + 4748: 2ec000ef jal ra,4a34 <exit> + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 474c: 0085b903 ld s2,8(a1) + 4750: 00003597 auipc a1,0x3 + 4754: 89858593 addi a1,a1,-1896 # 6fe8 <malloc+0x20dc> + 4758: 854a mv a0,s2 + 475a: 09e000ef jal ra,47f8 <strcmp> + 475e: 85aa mv a1,a0 + 4760: c139 beqz a0,47a6 <main+0x88> + } else if(argc == 2 && strcmp(argv[1], "-c") == 0){ + 4762: 00003597 auipc a1,0x3 + 4766: 88e58593 addi a1,a1,-1906 # 6ff0 <malloc+0x20e4> + 476a: 854a mv a0,s2 + 476c: 08c000ef jal ra,47f8 <strcmp> + 4770: cd15 beqz a0,47ac <main+0x8e> + } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ + 4772: 00003597 auipc a1,0x3 + 4776: 88658593 addi a1,a1,-1914 # 6ff8 <malloc+0x20ec> + 477a: 854a mv a0,s2 + 477c: 07c000ef jal ra,47f8 <strcmp> + 4780: c90d beqz a0,47b2 <main+0x94> + } else if(argc == 2 && argv[1][0] != '-'){ + 4782: 00094703 lbu a4,0(s2) + 4786: 02d00793 li a5,45 + 478a: 00f70563 beq a4,a5,4794 <main+0x76> + int quick = 0; + 478e: 4501 li a0,0 + int continuous = 0; + 4790: 4581 li a1,0 + 4792: b775 j 473e <main+0x20> + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + 4794: 00003517 auipc a0,0x3 + 4798: 86c50513 addi a0,a0,-1940 # 7000 <malloc+0x20f4> + 479c: 6bc000ef jal ra,4e58 <printf> + exit(1); + 47a0: 4505 li a0,1 + 47a2: 292000ef jal ra,4a34 <exit> + char *justone = 0; + 47a6: 4901 li s2,0 + quick = 1; + 47a8: 4505 li a0,1 + 47aa: bf51 j 473e <main+0x20> + char *justone = 0; + 47ac: 4901 li s2,0 + continuous = 1; + 47ae: 4585 li a1,1 + 47b0: b779 j 473e <main+0x20> + continuous = 2; + 47b2: 85a6 mv a1,s1 + char *justone = 0; + 47b4: 4901 li s2,0 + 47b6: b761 j 473e <main+0x20> + } + printf("ALL TESTS PASSED\n"); + 47b8: 00003517 auipc a0,0x3 + 47bc: 87850513 addi a0,a0,-1928 # 7030 <malloc+0x2124> + 47c0: 698000ef jal ra,4e58 <printf> + exit(0); + 47c4: 4501 li a0,0 + 47c6: 26e000ef jal ra,4a34 <exit> + +00000000000047ca <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 47ca: 1141 addi sp,sp,-16 + 47cc: e406 sd ra,8(sp) + 47ce: e022 sd s0,0(sp) + 47d0: 0800 addi s0,sp,16 + extern int main(); + main(); + 47d2: f4dff0ef jal ra,471e <main> + exit(0); + 47d6: 4501 li a0,0 + 47d8: 25c000ef jal ra,4a34 <exit> + +00000000000047dc <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 47dc: 1141 addi sp,sp,-16 + 47de: e422 sd s0,8(sp) + 47e0: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 47e2: 87aa mv a5,a0 + 47e4: 0585 addi a1,a1,1 + 47e6: 0785 addi a5,a5,1 + 47e8: fff5c703 lbu a4,-1(a1) + 47ec: fee78fa3 sb a4,-1(a5) + 47f0: fb75 bnez a4,47e4 <strcpy+0x8> + ; + return os; +} + 47f2: 6422 ld s0,8(sp) + 47f4: 0141 addi sp,sp,16 + 47f6: 8082 ret + +00000000000047f8 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 47f8: 1141 addi sp,sp,-16 + 47fa: e422 sd s0,8(sp) + 47fc: 0800 addi s0,sp,16 + while(*p && *p == *q) + 47fe: 00054783 lbu a5,0(a0) + 4802: cb91 beqz a5,4816 <strcmp+0x1e> + 4804: 0005c703 lbu a4,0(a1) + 4808: 00f71763 bne a4,a5,4816 <strcmp+0x1e> + p++, q++; + 480c: 0505 addi a0,a0,1 + 480e: 0585 addi a1,a1,1 + while(*p && *p == *q) + 4810: 00054783 lbu a5,0(a0) + 4814: fbe5 bnez a5,4804 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 4816: 0005c503 lbu a0,0(a1) +} + 481a: 40a7853b subw a0,a5,a0 + 481e: 6422 ld s0,8(sp) + 4820: 0141 addi sp,sp,16 + 4822: 8082 ret + +0000000000004824 <strlen>: + +uint +strlen(const char *s) +{ + 4824: 1141 addi sp,sp,-16 + 4826: e422 sd s0,8(sp) + 4828: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 482a: 00054783 lbu a5,0(a0) + 482e: cf91 beqz a5,484a <strlen+0x26> + 4830: 0505 addi a0,a0,1 + 4832: 87aa mv a5,a0 + 4834: 4685 li a3,1 + 4836: 9e89 subw a3,a3,a0 + 4838: 00f6853b addw a0,a3,a5 + 483c: 0785 addi a5,a5,1 + 483e: fff7c703 lbu a4,-1(a5) + 4842: fb7d bnez a4,4838 <strlen+0x14> + ; + return n; +} + 4844: 6422 ld s0,8(sp) + 4846: 0141 addi sp,sp,16 + 4848: 8082 ret + for(n = 0; s[n]; n++) + 484a: 4501 li a0,0 + 484c: bfe5 j 4844 <strlen+0x20> + +000000000000484e <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 484e: 1141 addi sp,sp,-16 + 4850: e422 sd s0,8(sp) + 4852: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 4854: ca19 beqz a2,486a <memset+0x1c> + 4856: 87aa mv a5,a0 + 4858: 1602 slli a2,a2,0x20 + 485a: 9201 srli a2,a2,0x20 + 485c: 00a60733 add a4,a2,a0 + cdst[i] = c; + 4860: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 4864: 0785 addi a5,a5,1 + 4866: fee79de3 bne a5,a4,4860 <memset+0x12> + } + return dst; +} + 486a: 6422 ld s0,8(sp) + 486c: 0141 addi sp,sp,16 + 486e: 8082 ret + +0000000000004870 <strchr>: + +char* +strchr(const char *s, char c) +{ + 4870: 1141 addi sp,sp,-16 + 4872: e422 sd s0,8(sp) + 4874: 0800 addi s0,sp,16 + for(; *s; s++) + 4876: 00054783 lbu a5,0(a0) + 487a: cb99 beqz a5,4890 <strchr+0x20> + if(*s == c) + 487c: 00f58763 beq a1,a5,488a <strchr+0x1a> + for(; *s; s++) + 4880: 0505 addi a0,a0,1 + 4882: 00054783 lbu a5,0(a0) + 4886: fbfd bnez a5,487c <strchr+0xc> + return (char*)s; + return 0; + 4888: 4501 li a0,0 +} + 488a: 6422 ld s0,8(sp) + 488c: 0141 addi sp,sp,16 + 488e: 8082 ret + return 0; + 4890: 4501 li a0,0 + 4892: bfe5 j 488a <strchr+0x1a> + +0000000000004894 <gets>: + +char* +gets(char *buf, int max) +{ + 4894: 711d addi sp,sp,-96 + 4896: ec86 sd ra,88(sp) + 4898: e8a2 sd s0,80(sp) + 489a: e4a6 sd s1,72(sp) + 489c: e0ca sd s2,64(sp) + 489e: fc4e sd s3,56(sp) + 48a0: f852 sd s4,48(sp) + 48a2: f456 sd s5,40(sp) + 48a4: f05a sd s6,32(sp) + 48a6: ec5e sd s7,24(sp) + 48a8: 1080 addi s0,sp,96 + 48aa: 8baa mv s7,a0 + 48ac: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 48ae: 892a mv s2,a0 + 48b0: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 48b2: 4aa9 li s5,10 + 48b4: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 48b6: 89a6 mv s3,s1 + 48b8: 2485 addiw s1,s1,1 + 48ba: 0344d663 bge s1,s4,48e6 <gets+0x52> + cc = read(0, &c, 1); + 48be: 4605 li a2,1 + 48c0: faf40593 addi a1,s0,-81 + 48c4: 4501 li a0,0 + 48c6: 186000ef jal ra,4a4c <read> + if(cc < 1) + 48ca: 00a05e63 blez a0,48e6 <gets+0x52> + buf[i++] = c; + 48ce: faf44783 lbu a5,-81(s0) + 48d2: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 48d6: 01578763 beq a5,s5,48e4 <gets+0x50> + 48da: 0905 addi s2,s2,1 + 48dc: fd679de3 bne a5,s6,48b6 <gets+0x22> + for(i=0; i+1 < max; ){ + 48e0: 89a6 mv s3,s1 + 48e2: a011 j 48e6 <gets+0x52> + 48e4: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 48e6: 99de add s3,s3,s7 + 48e8: 00098023 sb zero,0(s3) + return buf; +} + 48ec: 855e mv a0,s7 + 48ee: 60e6 ld ra,88(sp) + 48f0: 6446 ld s0,80(sp) + 48f2: 64a6 ld s1,72(sp) + 48f4: 6906 ld s2,64(sp) + 48f6: 79e2 ld s3,56(sp) + 48f8: 7a42 ld s4,48(sp) + 48fa: 7aa2 ld s5,40(sp) + 48fc: 7b02 ld s6,32(sp) + 48fe: 6be2 ld s7,24(sp) + 4900: 6125 addi sp,sp,96 + 4902: 8082 ret + +0000000000004904 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 4904: 1101 addi sp,sp,-32 + 4906: ec06 sd ra,24(sp) + 4908: e822 sd s0,16(sp) + 490a: e426 sd s1,8(sp) + 490c: e04a sd s2,0(sp) + 490e: 1000 addi s0,sp,32 + 4910: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 4912: 4581 li a1,0 + 4914: 160000ef jal ra,4a74 <open> + if(fd < 0) + 4918: 02054163 bltz a0,493a <stat+0x36> + 491c: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 491e: 85ca mv a1,s2 + 4920: 16c000ef jal ra,4a8c <fstat> + 4924: 892a mv s2,a0 + close(fd); + 4926: 8526 mv a0,s1 + 4928: 134000ef jal ra,4a5c <close> + return r; +} + 492c: 854a mv a0,s2 + 492e: 60e2 ld ra,24(sp) + 4930: 6442 ld s0,16(sp) + 4932: 64a2 ld s1,8(sp) + 4934: 6902 ld s2,0(sp) + 4936: 6105 addi sp,sp,32 + 4938: 8082 ret + return -1; + 493a: 597d li s2,-1 + 493c: bfc5 j 492c <stat+0x28> + +000000000000493e <atoi>: + +int +atoi(const char *s) +{ + 493e: 1141 addi sp,sp,-16 + 4940: e422 sd s0,8(sp) + 4942: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 4944: 00054683 lbu a3,0(a0) + 4948: fd06879b addiw a5,a3,-48 + 494c: 0ff7f793 zext.b a5,a5 + 4950: 4625 li a2,9 + 4952: 02f66863 bltu a2,a5,4982 <atoi+0x44> + 4956: 872a mv a4,a0 + n = 0; + 4958: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 495a: 0705 addi a4,a4,1 + 495c: 0025179b slliw a5,a0,0x2 + 4960: 9fa9 addw a5,a5,a0 + 4962: 0017979b slliw a5,a5,0x1 + 4966: 9fb5 addw a5,a5,a3 + 4968: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 496c: 00074683 lbu a3,0(a4) + 4970: fd06879b addiw a5,a3,-48 + 4974: 0ff7f793 zext.b a5,a5 + 4978: fef671e3 bgeu a2,a5,495a <atoi+0x1c> + return n; +} + 497c: 6422 ld s0,8(sp) + 497e: 0141 addi sp,sp,16 + 4980: 8082 ret + n = 0; + 4982: 4501 li a0,0 + 4984: bfe5 j 497c <atoi+0x3e> + +0000000000004986 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 4986: 1141 addi sp,sp,-16 + 4988: e422 sd s0,8(sp) + 498a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 498c: 02b57463 bgeu a0,a1,49b4 <memmove+0x2e> + while(n-- > 0) + 4990: 00c05f63 blez a2,49ae <memmove+0x28> + 4994: 1602 slli a2,a2,0x20 + 4996: 9201 srli a2,a2,0x20 + 4998: 00c507b3 add a5,a0,a2 + dst = vdst; + 499c: 872a mv a4,a0 + *dst++ = *src++; + 499e: 0585 addi a1,a1,1 + 49a0: 0705 addi a4,a4,1 + 49a2: fff5c683 lbu a3,-1(a1) + 49a6: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 49aa: fee79ae3 bne a5,a4,499e <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 49ae: 6422 ld s0,8(sp) + 49b0: 0141 addi sp,sp,16 + 49b2: 8082 ret + dst += n; + 49b4: 00c50733 add a4,a0,a2 + src += n; + 49b8: 95b2 add a1,a1,a2 + while(n-- > 0) + 49ba: fec05ae3 blez a2,49ae <memmove+0x28> + 49be: fff6079b addiw a5,a2,-1 # 2fff <subdir+0x477> + 49c2: 1782 slli a5,a5,0x20 + 49c4: 9381 srli a5,a5,0x20 + 49c6: fff7c793 not a5,a5 + 49ca: 97ba add a5,a5,a4 + *--dst = *--src; + 49cc: 15fd addi a1,a1,-1 + 49ce: 177d addi a4,a4,-1 + 49d0: 0005c683 lbu a3,0(a1) + 49d4: 00d70023 sb a3,0(a4) + while(n-- > 0) + 49d8: fee79ae3 bne a5,a4,49cc <memmove+0x46> + 49dc: bfc9 j 49ae <memmove+0x28> + +00000000000049de <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 49de: 1141 addi sp,sp,-16 + 49e0: e422 sd s0,8(sp) + 49e2: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 49e4: ca05 beqz a2,4a14 <memcmp+0x36> + 49e6: fff6069b addiw a3,a2,-1 + 49ea: 1682 slli a3,a3,0x20 + 49ec: 9281 srli a3,a3,0x20 + 49ee: 0685 addi a3,a3,1 + 49f0: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 49f2: 00054783 lbu a5,0(a0) + 49f6: 0005c703 lbu a4,0(a1) + 49fa: 00e79863 bne a5,a4,4a0a <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 49fe: 0505 addi a0,a0,1 + p2++; + 4a00: 0585 addi a1,a1,1 + while (n-- > 0) { + 4a02: fed518e3 bne a0,a3,49f2 <memcmp+0x14> + } + return 0; + 4a06: 4501 li a0,0 + 4a08: a019 j 4a0e <memcmp+0x30> + return *p1 - *p2; + 4a0a: 40e7853b subw a0,a5,a4 +} + 4a0e: 6422 ld s0,8(sp) + 4a10: 0141 addi sp,sp,16 + 4a12: 8082 ret + return 0; + 4a14: 4501 li a0,0 + 4a16: bfe5 j 4a0e <memcmp+0x30> + +0000000000004a18 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4a18: 1141 addi sp,sp,-16 + 4a1a: e406 sd ra,8(sp) + 4a1c: e022 sd s0,0(sp) + 4a1e: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4a20: f67ff0ef jal ra,4986 <memmove> +} + 4a24: 60a2 ld ra,8(sp) + 4a26: 6402 ld s0,0(sp) + 4a28: 0141 addi sp,sp,16 + 4a2a: 8082 ret + +0000000000004a2c <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4a2c: 4885 li a7,1 + ecall + 4a2e: 00000073 ecall + ret + 4a32: 8082 ret + +0000000000004a34 <exit>: +.global exit +exit: + li a7, SYS_exit + 4a34: 4889 li a7,2 + ecall + 4a36: 00000073 ecall + ret + 4a3a: 8082 ret + +0000000000004a3c <wait>: +.global wait +wait: + li a7, SYS_wait + 4a3c: 488d li a7,3 + ecall + 4a3e: 00000073 ecall + ret + 4a42: 8082 ret + +0000000000004a44 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 4a44: 4891 li a7,4 + ecall + 4a46: 00000073 ecall + ret + 4a4a: 8082 ret + +0000000000004a4c <read>: +.global read +read: + li a7, SYS_read + 4a4c: 4895 li a7,5 + ecall + 4a4e: 00000073 ecall + ret + 4a52: 8082 ret + +0000000000004a54 <write>: +.global write +write: + li a7, SYS_write + 4a54: 48c1 li a7,16 + ecall + 4a56: 00000073 ecall + ret + 4a5a: 8082 ret + +0000000000004a5c <close>: +.global close +close: + li a7, SYS_close + 4a5c: 48d5 li a7,21 + ecall + 4a5e: 00000073 ecall + ret + 4a62: 8082 ret + +0000000000004a64 <kill>: +.global kill +kill: + li a7, SYS_kill + 4a64: 4899 li a7,6 + ecall + 4a66: 00000073 ecall + ret + 4a6a: 8082 ret + +0000000000004a6c <exec>: +.global exec +exec: + li a7, SYS_exec + 4a6c: 489d li a7,7 + ecall + 4a6e: 00000073 ecall + ret + 4a72: 8082 ret + +0000000000004a74 <open>: +.global open +open: + li a7, SYS_open + 4a74: 48bd li a7,15 + ecall + 4a76: 00000073 ecall + ret + 4a7a: 8082 ret + +0000000000004a7c <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 4a7c: 48c5 li a7,17 + ecall + 4a7e: 00000073 ecall + ret + 4a82: 8082 ret + +0000000000004a84 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 4a84: 48c9 li a7,18 + ecall + 4a86: 00000073 ecall + ret + 4a8a: 8082 ret + +0000000000004a8c <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 4a8c: 48a1 li a7,8 + ecall + 4a8e: 00000073 ecall + ret + 4a92: 8082 ret + +0000000000004a94 <link>: +.global link +link: + li a7, SYS_link + 4a94: 48cd li a7,19 + ecall + 4a96: 00000073 ecall + ret + 4a9a: 8082 ret + +0000000000004a9c <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 4a9c: 48d1 li a7,20 + ecall + 4a9e: 00000073 ecall + ret + 4aa2: 8082 ret + +0000000000004aa4 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 4aa4: 48a5 li a7,9 + ecall + 4aa6: 00000073 ecall + ret + 4aaa: 8082 ret + +0000000000004aac <dup>: +.global dup +dup: + li a7, SYS_dup + 4aac: 48a9 li a7,10 + ecall + 4aae: 00000073 ecall + ret + 4ab2: 8082 ret + +0000000000004ab4 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 4ab4: 48ad li a7,11 + ecall + 4ab6: 00000073 ecall + ret + 4aba: 8082 ret + +0000000000004abc <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 4abc: 48b1 li a7,12 + ecall + 4abe: 00000073 ecall + ret + 4ac2: 8082 ret + +0000000000004ac4 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 4ac4: 48b5 li a7,13 + ecall + 4ac6: 00000073 ecall + ret + 4aca: 8082 ret + +0000000000004acc <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 4acc: 48b9 li a7,14 + ecall + 4ace: 00000073 ecall + ret + 4ad2: 8082 ret + +0000000000004ad4 <trace>: +.global trace +trace: + li a7, SYS_trace + 4ad4: 48d9 li a7,22 + ecall + 4ad6: 00000073 ecall + ret + 4ada: 8082 ret + +0000000000004adc <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 4adc: 48dd li a7,23 + ecall + 4ade: 00000073 ecall + ret + 4ae2: 8082 ret + +0000000000004ae4 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 4ae4: 48e1 li a7,24 + ecall + 4ae6: 00000073 ecall + ret + 4aea: 8082 ret + +0000000000004aec <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 4aec: 1101 addi sp,sp,-32 + 4aee: ec06 sd ra,24(sp) + 4af0: e822 sd s0,16(sp) + 4af2: 1000 addi s0,sp,32 + 4af4: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 4af8: 4605 li a2,1 + 4afa: fef40593 addi a1,s0,-17 + 4afe: f57ff0ef jal ra,4a54 <write> +} + 4b02: 60e2 ld ra,24(sp) + 4b04: 6442 ld s0,16(sp) + 4b06: 6105 addi sp,sp,32 + 4b08: 8082 ret + +0000000000004b0a <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 4b0a: 7139 addi sp,sp,-64 + 4b0c: fc06 sd ra,56(sp) + 4b0e: f822 sd s0,48(sp) + 4b10: f426 sd s1,40(sp) + 4b12: f04a sd s2,32(sp) + 4b14: ec4e sd s3,24(sp) + 4b16: 0080 addi s0,sp,64 + 4b18: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 4b1a: c299 beqz a3,4b20 <printint+0x16> + 4b1c: 0805c763 bltz a1,4baa <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 4b20: 2581 sext.w a1,a1 + neg = 0; + 4b22: 4881 li a7,0 + 4b24: fc040693 addi a3,s0,-64 + } + + i = 0; + 4b28: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 4b2a: 2601 sext.w a2,a2 + 4b2c: 00003517 auipc a0,0x3 + 4b30: 8d450513 addi a0,a0,-1836 # 7400 <digits> + 4b34: 883a mv a6,a4 + 4b36: 2705 addiw a4,a4,1 + 4b38: 02c5f7bb remuw a5,a1,a2 + 4b3c: 1782 slli a5,a5,0x20 + 4b3e: 9381 srli a5,a5,0x20 + 4b40: 97aa add a5,a5,a0 + 4b42: 0007c783 lbu a5,0(a5) + 4b46: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 4b4a: 0005879b sext.w a5,a1 + 4b4e: 02c5d5bb divuw a1,a1,a2 + 4b52: 0685 addi a3,a3,1 + 4b54: fec7f0e3 bgeu a5,a2,4b34 <printint+0x2a> + if(neg) + 4b58: 00088c63 beqz a7,4b70 <printint+0x66> + buf[i++] = '-'; + 4b5c: fd070793 addi a5,a4,-48 + 4b60: 00878733 add a4,a5,s0 + 4b64: 02d00793 li a5,45 + 4b68: fef70823 sb a5,-16(a4) + 4b6c: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 4b70: 02e05663 blez a4,4b9c <printint+0x92> + 4b74: fc040793 addi a5,s0,-64 + 4b78: 00e78933 add s2,a5,a4 + 4b7c: fff78993 addi s3,a5,-1 + 4b80: 99ba add s3,s3,a4 + 4b82: 377d addiw a4,a4,-1 + 4b84: 1702 slli a4,a4,0x20 + 4b86: 9301 srli a4,a4,0x20 + 4b88: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 4b8c: fff94583 lbu a1,-1(s2) + 4b90: 8526 mv a0,s1 + 4b92: f5bff0ef jal ra,4aec <putc> + while(--i >= 0) + 4b96: 197d addi s2,s2,-1 + 4b98: ff391ae3 bne s2,s3,4b8c <printint+0x82> +} + 4b9c: 70e2 ld ra,56(sp) + 4b9e: 7442 ld s0,48(sp) + 4ba0: 74a2 ld s1,40(sp) + 4ba2: 7902 ld s2,32(sp) + 4ba4: 69e2 ld s3,24(sp) + 4ba6: 6121 addi sp,sp,64 + 4ba8: 8082 ret + x = -xx; + 4baa: 40b005bb negw a1,a1 + neg = 1; + 4bae: 4885 li a7,1 + x = -xx; + 4bb0: bf95 j 4b24 <printint+0x1a> + +0000000000004bb2 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4bb2: 7119 addi sp,sp,-128 + 4bb4: fc86 sd ra,120(sp) + 4bb6: f8a2 sd s0,112(sp) + 4bb8: f4a6 sd s1,104(sp) + 4bba: f0ca sd s2,96(sp) + 4bbc: ecce sd s3,88(sp) + 4bbe: e8d2 sd s4,80(sp) + 4bc0: e4d6 sd s5,72(sp) + 4bc2: e0da sd s6,64(sp) + 4bc4: fc5e sd s7,56(sp) + 4bc6: f862 sd s8,48(sp) + 4bc8: f466 sd s9,40(sp) + 4bca: f06a sd s10,32(sp) + 4bcc: ec6e sd s11,24(sp) + 4bce: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4bd0: 0005c903 lbu s2,0(a1) + 4bd4: 22090e63 beqz s2,4e10 <vprintf+0x25e> + 4bd8: 8b2a mv s6,a0 + 4bda: 8a2e mv s4,a1 + 4bdc: 8bb2 mv s7,a2 + state = 0; + 4bde: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4be0: 4481 li s1,0 + 4be2: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4be4: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4be8: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4bec: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4bf0: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 4bf4: 00003c97 auipc s9,0x3 + 4bf8: 80cc8c93 addi s9,s9,-2036 # 7400 <digits> + 4bfc: a005 j 4c1c <vprintf+0x6a> + putc(fd, c0); + 4bfe: 85ca mv a1,s2 + 4c00: 855a mv a0,s6 + 4c02: eebff0ef jal ra,4aec <putc> + 4c06: a019 j 4c0c <vprintf+0x5a> + } else if(state == '%'){ + 4c08: 03598263 beq s3,s5,4c2c <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 4c0c: 2485 addiw s1,s1,1 + 4c0e: 8726 mv a4,s1 + 4c10: 009a07b3 add a5,s4,s1 + 4c14: 0007c903 lbu s2,0(a5) + 4c18: 1e090c63 beqz s2,4e10 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 4c1c: 0009079b sext.w a5,s2 + if(state == 0){ + 4c20: fe0994e3 bnez s3,4c08 <vprintf+0x56> + if(c0 == '%'){ + 4c24: fd579de3 bne a5,s5,4bfe <vprintf+0x4c> + state = '%'; + 4c28: 89be mv s3,a5 + 4c2a: b7cd j 4c0c <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 4c2c: cfa5 beqz a5,4ca4 <vprintf+0xf2> + 4c2e: 00ea06b3 add a3,s4,a4 + 4c32: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4c36: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4c38: c681 beqz a3,4c40 <vprintf+0x8e> + 4c3a: 9752 add a4,a4,s4 + 4c3c: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4c40: 03878a63 beq a5,s8,4c74 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 4c44: 05a78463 beq a5,s10,4c8c <vprintf+0xda> + } else if(c0 == 'u'){ + 4c48: 0db78763 beq a5,s11,4d16 <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4c4c: 07800713 li a4,120 + 4c50: 10e78963 beq a5,a4,4d62 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4c54: 07000713 li a4,112 + 4c58: 12e78e63 beq a5,a4,4d94 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4c5c: 07300713 li a4,115 + 4c60: 16e78b63 beq a5,a4,4dd6 <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4c64: 05579063 bne a5,s5,4ca4 <vprintf+0xf2> + putc(fd, '%'); + 4c68: 85d6 mv a1,s5 + 4c6a: 855a mv a0,s6 + 4c6c: e81ff0ef jal ra,4aec <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 4c70: 4981 li s3,0 + 4c72: bf69 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 4c74: 008b8913 addi s2,s7,8 + 4c78: 4685 li a3,1 + 4c7a: 4629 li a2,10 + 4c7c: 000ba583 lw a1,0(s7) + 4c80: 855a mv a0,s6 + 4c82: e89ff0ef jal ra,4b0a <printint> + 4c86: 8bca mv s7,s2 + state = 0; + 4c88: 4981 li s3,0 + 4c8a: b749 j 4c0c <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 4c8c: 03868663 beq a3,s8,4cb8 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4c90: 05a68163 beq a3,s10,4cd2 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 4c94: 09b68d63 beq a3,s11,4d2e <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 4c98: 03a68f63 beq a3,s10,4cd6 <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 4c9c: 07800793 li a5,120 + 4ca0: 0cf68d63 beq a3,a5,4d7a <vprintf+0x1c8> + putc(fd, '%'); + 4ca4: 85d6 mv a1,s5 + 4ca6: 855a mv a0,s6 + 4ca8: e45ff0ef jal ra,4aec <putc> + putc(fd, c0); + 4cac: 85ca mv a1,s2 + 4cae: 855a mv a0,s6 + 4cb0: e3dff0ef jal ra,4aec <putc> + state = 0; + 4cb4: 4981 li s3,0 + 4cb6: bf99 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 4cb8: 008b8913 addi s2,s7,8 + 4cbc: 4685 li a3,1 + 4cbe: 4629 li a2,10 + 4cc0: 000ba583 lw a1,0(s7) + 4cc4: 855a mv a0,s6 + 4cc6: e45ff0ef jal ra,4b0a <printint> + i += 1; + 4cca: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 4ccc: 8bca mv s7,s2 + state = 0; + 4cce: 4981 li s3,0 + i += 1; + 4cd0: bf35 j 4c0c <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4cd2: 03860563 beq a2,s8,4cfc <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 4cd6: 07b60963 beq a2,s11,4d48 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 4cda: 07800793 li a5,120 + 4cde: fcf613e3 bne a2,a5,4ca4 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 4ce2: 008b8913 addi s2,s7,8 + 4ce6: 4681 li a3,0 + 4ce8: 4641 li a2,16 + 4cea: 000ba583 lw a1,0(s7) + 4cee: 855a mv a0,s6 + 4cf0: e1bff0ef jal ra,4b0a <printint> + i += 2; + 4cf4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 4cf6: 8bca mv s7,s2 + state = 0; + 4cf8: 4981 li s3,0 + i += 2; + 4cfa: bf09 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 4cfc: 008b8913 addi s2,s7,8 + 4d00: 4685 li a3,1 + 4d02: 4629 li a2,10 + 4d04: 000ba583 lw a1,0(s7) + 4d08: 855a mv a0,s6 + 4d0a: e01ff0ef jal ra,4b0a <printint> + i += 2; + 4d0e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 4d10: 8bca mv s7,s2 + state = 0; + 4d12: 4981 li s3,0 + i += 2; + 4d14: bde5 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 4d16: 008b8913 addi s2,s7,8 + 4d1a: 4681 li a3,0 + 4d1c: 4629 li a2,10 + 4d1e: 000ba583 lw a1,0(s7) + 4d22: 855a mv a0,s6 + 4d24: de7ff0ef jal ra,4b0a <printint> + 4d28: 8bca mv s7,s2 + state = 0; + 4d2a: 4981 li s3,0 + 4d2c: b5c5 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 4d2e: 008b8913 addi s2,s7,8 + 4d32: 4681 li a3,0 + 4d34: 4629 li a2,10 + 4d36: 000ba583 lw a1,0(s7) + 4d3a: 855a mv a0,s6 + 4d3c: dcfff0ef jal ra,4b0a <printint> + i += 1; + 4d40: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 4d42: 8bca mv s7,s2 + state = 0; + 4d44: 4981 li s3,0 + i += 1; + 4d46: b5d9 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 4d48: 008b8913 addi s2,s7,8 + 4d4c: 4681 li a3,0 + 4d4e: 4629 li a2,10 + 4d50: 000ba583 lw a1,0(s7) + 4d54: 855a mv a0,s6 + 4d56: db5ff0ef jal ra,4b0a <printint> + i += 2; + 4d5a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 4d5c: 8bca mv s7,s2 + state = 0; + 4d5e: 4981 li s3,0 + i += 2; + 4d60: b575 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 4d62: 008b8913 addi s2,s7,8 + 4d66: 4681 li a3,0 + 4d68: 4641 li a2,16 + 4d6a: 000ba583 lw a1,0(s7) + 4d6e: 855a mv a0,s6 + 4d70: d9bff0ef jal ra,4b0a <printint> + 4d74: 8bca mv s7,s2 + state = 0; + 4d76: 4981 li s3,0 + 4d78: bd51 j 4c0c <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 4d7a: 008b8913 addi s2,s7,8 + 4d7e: 4681 li a3,0 + 4d80: 4641 li a2,16 + 4d82: 000ba583 lw a1,0(s7) + 4d86: 855a mv a0,s6 + 4d88: d83ff0ef jal ra,4b0a <printint> + i += 1; + 4d8c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 4d8e: 8bca mv s7,s2 + state = 0; + 4d90: 4981 li s3,0 + i += 1; + 4d92: bdad j 4c0c <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 4d94: 008b8793 addi a5,s7,8 + 4d98: f8f43423 sd a5,-120(s0) + 4d9c: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 4da0: 03000593 li a1,48 + 4da4: 855a mv a0,s6 + 4da6: d47ff0ef jal ra,4aec <putc> + putc(fd, 'x'); + 4daa: 07800593 li a1,120 + 4dae: 855a mv a0,s6 + 4db0: d3dff0ef jal ra,4aec <putc> + 4db4: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 4db6: 03c9d793 srli a5,s3,0x3c + 4dba: 97e6 add a5,a5,s9 + 4dbc: 0007c583 lbu a1,0(a5) + 4dc0: 855a mv a0,s6 + 4dc2: d2bff0ef jal ra,4aec <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 4dc6: 0992 slli s3,s3,0x4 + 4dc8: 397d addiw s2,s2,-1 + 4dca: fe0916e3 bnez s2,4db6 <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 4dce: f8843b83 ld s7,-120(s0) + state = 0; + 4dd2: 4981 li s3,0 + 4dd4: bd25 j 4c0c <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 4dd6: 008b8993 addi s3,s7,8 + 4dda: 000bb903 ld s2,0(s7) + 4dde: 00090f63 beqz s2,4dfc <vprintf+0x24a> + for(; *s; s++) + 4de2: 00094583 lbu a1,0(s2) + 4de6: c195 beqz a1,4e0a <vprintf+0x258> + putc(fd, *s); + 4de8: 855a mv a0,s6 + 4dea: d03ff0ef jal ra,4aec <putc> + for(; *s; s++) + 4dee: 0905 addi s2,s2,1 + 4df0: 00094583 lbu a1,0(s2) + 4df4: f9f5 bnez a1,4de8 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 4df6: 8bce mv s7,s3 + state = 0; + 4df8: 4981 li s3,0 + 4dfa: bd09 j 4c0c <vprintf+0x5a> + s = "(null)"; + 4dfc: 00002917 auipc s2,0x2 + 4e00: 5fc90913 addi s2,s2,1532 # 73f8 <malloc+0x24ec> + for(; *s; s++) + 4e04: 02800593 li a1,40 + 4e08: b7c5 j 4de8 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 4e0a: 8bce mv s7,s3 + state = 0; + 4e0c: 4981 li s3,0 + 4e0e: bbfd j 4c0c <vprintf+0x5a> + } + } +} + 4e10: 70e6 ld ra,120(sp) + 4e12: 7446 ld s0,112(sp) + 4e14: 74a6 ld s1,104(sp) + 4e16: 7906 ld s2,96(sp) + 4e18: 69e6 ld s3,88(sp) + 4e1a: 6a46 ld s4,80(sp) + 4e1c: 6aa6 ld s5,72(sp) + 4e1e: 6b06 ld s6,64(sp) + 4e20: 7be2 ld s7,56(sp) + 4e22: 7c42 ld s8,48(sp) + 4e24: 7ca2 ld s9,40(sp) + 4e26: 7d02 ld s10,32(sp) + 4e28: 6de2 ld s11,24(sp) + 4e2a: 6109 addi sp,sp,128 + 4e2c: 8082 ret + +0000000000004e2e <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 4e2e: 715d addi sp,sp,-80 + 4e30: ec06 sd ra,24(sp) + 4e32: e822 sd s0,16(sp) + 4e34: 1000 addi s0,sp,32 + 4e36: e010 sd a2,0(s0) + 4e38: e414 sd a3,8(s0) + 4e3a: e818 sd a4,16(s0) + 4e3c: ec1c sd a5,24(s0) + 4e3e: 03043023 sd a6,32(s0) + 4e42: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 4e46: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 4e4a: 8622 mv a2,s0 + 4e4c: d67ff0ef jal ra,4bb2 <vprintf> +} + 4e50: 60e2 ld ra,24(sp) + 4e52: 6442 ld s0,16(sp) + 4e54: 6161 addi sp,sp,80 + 4e56: 8082 ret + +0000000000004e58 <printf>: + +void +printf(const char *fmt, ...) +{ + 4e58: 711d addi sp,sp,-96 + 4e5a: ec06 sd ra,24(sp) + 4e5c: e822 sd s0,16(sp) + 4e5e: 1000 addi s0,sp,32 + 4e60: e40c sd a1,8(s0) + 4e62: e810 sd a2,16(s0) + 4e64: ec14 sd a3,24(s0) + 4e66: f018 sd a4,32(s0) + 4e68: f41c sd a5,40(s0) + 4e6a: 03043823 sd a6,48(s0) + 4e6e: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 4e72: 00840613 addi a2,s0,8 + 4e76: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 4e7a: 85aa mv a1,a0 + 4e7c: 4505 li a0,1 + 4e7e: d35ff0ef jal ra,4bb2 <vprintf> +} + 4e82: 60e2 ld ra,24(sp) + 4e84: 6442 ld s0,16(sp) + 4e86: 6125 addi sp,sp,96 + 4e88: 8082 ret + +0000000000004e8a <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 4e8a: 1141 addi sp,sp,-16 + 4e8c: e422 sd s0,8(sp) + 4e8e: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 4e90: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 4e94: 00003797 auipc a5,0x3 + 4e98: 5bc7b783 ld a5,1468(a5) # 8450 <freep> + 4e9c: a02d j 4ec6 <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 4e9e: 4618 lw a4,8(a2) + 4ea0: 9f2d addw a4,a4,a1 + 4ea2: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 4ea6: 6398 ld a4,0(a5) + 4ea8: 6310 ld a2,0(a4) + 4eaa: a83d j 4ee8 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 4eac: ff852703 lw a4,-8(a0) + 4eb0: 9f31 addw a4,a4,a2 + 4eb2: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 4eb4: ff053683 ld a3,-16(a0) + 4eb8: a091 j 4efc <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 4eba: 6398 ld a4,0(a5) + 4ebc: 00e7e463 bltu a5,a4,4ec4 <free+0x3a> + 4ec0: 00e6ea63 bltu a3,a4,4ed4 <free+0x4a> +{ + 4ec4: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 4ec6: fed7fae3 bgeu a5,a3,4eba <free+0x30> + 4eca: 6398 ld a4,0(a5) + 4ecc: 00e6e463 bltu a3,a4,4ed4 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 4ed0: fee7eae3 bltu a5,a4,4ec4 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 4ed4: ff852583 lw a1,-8(a0) + 4ed8: 6390 ld a2,0(a5) + 4eda: 02059813 slli a6,a1,0x20 + 4ede: 01c85713 srli a4,a6,0x1c + 4ee2: 9736 add a4,a4,a3 + 4ee4: fae60de3 beq a2,a4,4e9e <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 4ee8: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 4eec: 4790 lw a2,8(a5) + 4eee: 02061593 slli a1,a2,0x20 + 4ef2: 01c5d713 srli a4,a1,0x1c + 4ef6: 973e add a4,a4,a5 + 4ef8: fae68ae3 beq a3,a4,4eac <free+0x22> + p->s.ptr = bp->s.ptr; + 4efc: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 4efe: 00003717 auipc a4,0x3 + 4f02: 54f73923 sd a5,1362(a4) # 8450 <freep> +} + 4f06: 6422 ld s0,8(sp) + 4f08: 0141 addi sp,sp,16 + 4f0a: 8082 ret + +0000000000004f0c <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 4f0c: 7139 addi sp,sp,-64 + 4f0e: fc06 sd ra,56(sp) + 4f10: f822 sd s0,48(sp) + 4f12: f426 sd s1,40(sp) + 4f14: f04a sd s2,32(sp) + 4f16: ec4e sd s3,24(sp) + 4f18: e852 sd s4,16(sp) + 4f1a: e456 sd s5,8(sp) + 4f1c: e05a sd s6,0(sp) + 4f1e: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 4f20: 02051493 slli s1,a0,0x20 + 4f24: 9081 srli s1,s1,0x20 + 4f26: 04bd addi s1,s1,15 + 4f28: 8091 srli s1,s1,0x4 + 4f2a: 0014899b addiw s3,s1,1 + 4f2e: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 4f30: 00003517 auipc a0,0x3 + 4f34: 52053503 ld a0,1312(a0) # 8450 <freep> + 4f38: c515 beqz a0,4f64 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 4f3a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 4f3c: 4798 lw a4,8(a5) + 4f3e: 02977f63 bgeu a4,s1,4f7c <malloc+0x70> + 4f42: 8a4e mv s4,s3 + 4f44: 0009871b sext.w a4,s3 + 4f48: 6685 lui a3,0x1 + 4f4a: 00d77363 bgeu a4,a3,4f50 <malloc+0x44> + 4f4e: 6a05 lui s4,0x1 + 4f50: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 4f54: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 4f58: 00003917 auipc s2,0x3 + 4f5c: 4f890913 addi s2,s2,1272 # 8450 <freep> + if(p == (char*)-1) + 4f60: 5afd li s5,-1 + 4f62: a885 j 4fd2 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 4f64: 0000a797 auipc a5,0xa + 4f68: d1478793 addi a5,a5,-748 # ec78 <base> + 4f6c: 00003717 auipc a4,0x3 + 4f70: 4ef73223 sd a5,1252(a4) # 8450 <freep> + 4f74: e39c sd a5,0(a5) + base.s.size = 0; + 4f76: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 4f7a: b7e1 j 4f42 <malloc+0x36> + if(p->s.size == nunits) + 4f7c: 02e48c63 beq s1,a4,4fb4 <malloc+0xa8> + p->s.size -= nunits; + 4f80: 4137073b subw a4,a4,s3 + 4f84: c798 sw a4,8(a5) + p += p->s.size; + 4f86: 02071693 slli a3,a4,0x20 + 4f8a: 01c6d713 srli a4,a3,0x1c + 4f8e: 97ba add a5,a5,a4 + p->s.size = nunits; + 4f90: 0137a423 sw s3,8(a5) + freep = prevp; + 4f94: 00003717 auipc a4,0x3 + 4f98: 4aa73e23 sd a0,1212(a4) # 8450 <freep> + return (void*)(p + 1); + 4f9c: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 4fa0: 70e2 ld ra,56(sp) + 4fa2: 7442 ld s0,48(sp) + 4fa4: 74a2 ld s1,40(sp) + 4fa6: 7902 ld s2,32(sp) + 4fa8: 69e2 ld s3,24(sp) + 4faa: 6a42 ld s4,16(sp) + 4fac: 6aa2 ld s5,8(sp) + 4fae: 6b02 ld s6,0(sp) + 4fb0: 6121 addi sp,sp,64 + 4fb2: 8082 ret + prevp->s.ptr = p->s.ptr; + 4fb4: 6398 ld a4,0(a5) + 4fb6: e118 sd a4,0(a0) + 4fb8: bff1 j 4f94 <malloc+0x88> + hp->s.size = nu; + 4fba: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 4fbe: 0541 addi a0,a0,16 + 4fc0: ecbff0ef jal ra,4e8a <free> + return freep; + 4fc4: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 4fc8: dd61 beqz a0,4fa0 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 4fca: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 4fcc: 4798 lw a4,8(a5) + 4fce: fa9777e3 bgeu a4,s1,4f7c <malloc+0x70> + if(p == freep) + 4fd2: 00093703 ld a4,0(s2) + 4fd6: 853e mv a0,a5 + 4fd8: fef719e3 bne a4,a5,4fca <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 4fdc: 8552 mv a0,s4 + 4fde: adfff0ef jal ra,4abc <sbrk> + if(p == (char*)-1) + 4fe2: fd551ce3 bne a0,s5,4fba <malloc+0xae> + return 0; + 4fe6: 4501 li a0,0 + 4fe8: bf65 j 4fa0 <malloc+0x94> diff --git a/user/usertests.d b/user/usertests.d new file mode 100644 index 0000000000000000000000000000000000000000..091b1232dbde726d1669a4b705faff346f890d6d --- /dev/null +++ b/user/usertests.d @@ -0,0 +1,4 @@ +user/usertests.o: user/usertests.c \ + /usr/riscv64-linux-gnu/include/stdc-predef.h kernel/param.h \ + kernel/types.h kernel/stat.h user/user.h kernel/fs.h kernel/fcntl.h \ + kernel/syscall.h kernel/memlayout.h kernel/riscv.h diff --git a/user/usertests.o b/user/usertests.o new file mode 100644 index 0000000000000000000000000000000000000000..24d57fd4d14884784015f38bed06c6e75a3669d8 Binary files /dev/null and b/user/usertests.o differ diff --git a/user/usertests.sym b/user/usertests.sym new file mode 100644 index 0000000000000000000000000000000000000000..0cc8d671cbd02db876e2bcbffa66fab871618bb7 --- /dev/null +++ b/user/usertests.sym @@ -0,0 +1,144 @@ +0000000000000000 .text +0000000000004ff0 .rodata +0000000000008000 .data +0000000000008450 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 usertests.c +0000000000008560 big.0 +0000000000008460 args.1 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000004aec putc +0000000000004b0a printint +0000000000007400 digits +0000000000000000 umalloc.c +0000000000008450 freep +000000000000ec78 base +00000000000009be writebig +0000000000002576 sbrk8000 +00000000000047dc strcpy +0000000000001622 exitwait +0000000000001d8e manywrites +0000000000004e58 printf +00000000000003be outofinodes +000000000000420a bigargtest +0000000000004986 memmove +0000000000003546 openiputtest +0000000000004a7c mknod +0000000000004ad4 trace +0000000000003846 reparent +0000000000004894 gets +0000000000004ab4 getpid +00000000000014a2 pipe1 +0000000000004a18 memcpy +000000000000344c iref +0000000000000fd4 pgbug +0000000000001cea nowrite +0000000000004f0c malloc +00000000000005aa copyout +0000000000004ac4 sleep +0000000000001c86 stacktest +00000000000025a4 execout +0000000000002418 sbrkbugs +0000000000002a36 exitiputtest +0000000000004adc mycall +00000000000042e8 fsfull +0000000000000e9e bigdir +0000000000001ab4 forktest +0000000000001f98 rwsbrk +00000000000011dc truncate3 +000000000000022c bigwrite +0000000000003a98 sharedfd +0000000000004a44 pipe +0000000000003690 killstatus +0000000000009568 uninit +000000000000329c dirfile +0000000000004a54 write +0000000000000078 bsstest +0000000000004a8c fstat +0000000000004e2e fprintf +0000000000004a64 kill +000000000000277c diskfull +0000000000000e3c validatetest +0000000000008010 quicktests +0000000000003176 rmdot +000000000000047e copyin +0000000000004bb2 vprintf +0000000000000118 truncate2 +0000000000004aa4 chdir +0000000000008000 big +000000000000132e exectest +0000000000004a6c exec +00000000000002ee badwrite +0000000000004a3c wait +0000000000004a4c read +000000000000370a preempt +0000000000004a84 unlink +0000000000001000 badarg +00000000000023be argptest +0000000000003a20 mem +00000000000044e2 runtests +00000000000049de memcmp +0000000000004a2c fork +00000000000024d4 sbrklast +0000000000001e94 copyinstr3 +0000000000001724 forkfork +0000000000004abc sbrk +00000000000083e0 slowtests +0000000000004acc uptime +00000000000016b2 twochildren +0000000000001bf4 MAXVAplus +000000000000484e memset +0000000000001b64 kernmem +00000000000001b8 createtest +000000000000471e main +0000000000001802 createdelete +0000000000004ae4 GSCinfo +00000000000035f8 forkforkfork +00000000000038c6 sbrkfail +00000000000047f8 strcmp +000000000000087e writetest +0000000000004aac dup +00000000000006e0 truncate1 +00000000000000b2 opentest +0000000000004464 run +0000000000002b88 subdir +000000000000103e copyinstr2 +0000000000000c74 linktest +000000000000bc78 buf +0000000000002ae2 dirtest +000000000000463c drivetests +000000000000231a sbrkarg +0000000000002990 iputtest +0000000000004904 stat +0000000000004086 bigfile +0000000000004554 countfree +0000000000000b1e unlinkread +0000000000004a94 link +0000000000004a34 exit +00000000000047ca start +000000000000493e atoi +0000000000000000 copyinstr1 +00000000000019da linkunlink +0000000000002098 sbrkbasic +0000000000004824 strlen +0000000000004a74 open +0000000000004870 strchr +0000000000003de2 concreate +0000000000002640 fourteen +0000000000003bf8 fourfiles +00000000000021c2 sbrkmuch +0000000000004a9c mkdir +0000000000004a5c close +00000000000017ba reparent2 +0000000000004e8a free diff --git a/user/usys.S b/user/usys.S new file mode 100644 index 0000000000000000000000000000000000000000..a8f2773b75e533dec7059ca082887e6cb6de3382 --- /dev/null +++ b/user/usys.S @@ -0,0 +1,122 @@ +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + ecall + ret +.global exit +exit: + li a7, SYS_exit + ecall + ret +.global wait +wait: + li a7, SYS_wait + ecall + ret +.global pipe +pipe: + li a7, SYS_pipe + ecall + ret +.global read +read: + li a7, SYS_read + ecall + ret +.global write +write: + li a7, SYS_write + ecall + ret +.global close +close: + li a7, SYS_close + ecall + ret +.global kill +kill: + li a7, SYS_kill + ecall + ret +.global exec +exec: + li a7, SYS_exec + ecall + ret +.global open +open: + li a7, SYS_open + ecall + ret +.global mknod +mknod: + li a7, SYS_mknod + ecall + ret +.global unlink +unlink: + li a7, SYS_unlink + ecall + ret +.global fstat +fstat: + li a7, SYS_fstat + ecall + ret +.global link +link: + li a7, SYS_link + ecall + ret +.global mkdir +mkdir: + li a7, SYS_mkdir + ecall + ret +.global chdir +chdir: + li a7, SYS_chdir + ecall + ret +.global dup +dup: + li a7, SYS_dup + ecall + ret +.global getpid +getpid: + li a7, SYS_getpid + ecall + ret +.global sbrk +sbrk: + li a7, SYS_sbrk + ecall + ret +.global sleep +sleep: + li a7, SYS_sleep + ecall + ret +.global uptime +uptime: + li a7, SYS_uptime + ecall + ret +.global trace +trace: + li a7, SYS_trace + ecall + ret +.global mycall +mycall: + li a7, SYS_mycall + ecall + ret +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + ecall + ret diff --git a/user/usys.d b/user/usys.d new file mode 100644 index 0000000000000000000000000000000000000000..9a2c506842970fb57aac6052d7d51cf9796ae11c --- /dev/null +++ b/user/usys.d @@ -0,0 +1,2 @@ +user/usys.o: user/usys.S /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/syscall.h diff --git a/user/usys.o b/user/usys.o new file mode 100644 index 0000000000000000000000000000000000000000..a68ed458d9c5e045eea8e4b1bf422f2e134aa664 Binary files /dev/null and b/user/usys.o differ diff --git a/user/wc.asm b/user/wc.asm new file mode 100644 index 0000000000000000000000000000000000000000..64069cce3e396ebfd7640053eec3611a0d094f7b --- /dev/null +++ b/user/wc.asm @@ -0,0 +1,1623 @@ + +user/_wc: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <wc>: + +char buf[512]; + +void +wc(int fd, char *name) +{ + 0: 7119 addi sp,sp,-128 + 2: fc86 sd ra,120(sp) + 4: f8a2 sd s0,112(sp) + 6: f4a6 sd s1,104(sp) + 8: f0ca sd s2,96(sp) + a: ecce sd s3,88(sp) + c: e8d2 sd s4,80(sp) + e: e4d6 sd s5,72(sp) + 10: e0da sd s6,64(sp) + 12: fc5e sd s7,56(sp) + 14: f862 sd s8,48(sp) + 16: f466 sd s9,40(sp) + 18: f06a sd s10,32(sp) + 1a: ec6e sd s11,24(sp) + 1c: 0100 addi s0,sp,128 + 1e: f8a43423 sd a0,-120(s0) + 22: f8b43023 sd a1,-128(s0) + int i, n; + int l, w, c, inword; + + l = w = c = 0; + inword = 0; + 26: 4981 li s3,0 + l = w = c = 0; + 28: 4c81 li s9,0 + 2a: 4c01 li s8,0 + 2c: 4b81 li s7,0 + 2e: 00001d97 auipc s11,0x1 + 32: fe3d8d93 addi s11,s11,-29 # 1011 <buf+0x1> + while((n = read(fd, buf, sizeof(buf))) > 0){ + for(i=0; i<n; i++){ + c++; + if(buf[i] == '\n') + 36: 4aa9 li s5,10 + l++; + if(strchr(" \r\t\n\v", buf[i])) + 38: 00001a17 auipc s4,0x1 + 3c: 958a0a13 addi s4,s4,-1704 # 990 <malloc+0xec> + inword = 0; + 40: 4b01 li s6,0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 42: a035 j 6e <wc+0x6e> + if(strchr(" \r\t\n\v", buf[i])) + 44: 8552 mv a0,s4 + 46: 1c2000ef jal ra,208 <strchr> + 4a: c919 beqz a0,60 <wc+0x60> + inword = 0; + 4c: 89da mv s3,s6 + for(i=0; i<n; i++){ + 4e: 0485 addi s1,s1,1 + 50: 01248d63 beq s1,s2,6a <wc+0x6a> + if(buf[i] == '\n') + 54: 0004c583 lbu a1,0(s1) + 58: ff5596e3 bne a1,s5,44 <wc+0x44> + l++; + 5c: 2b85 addiw s7,s7,1 + 5e: b7dd j 44 <wc+0x44> + else if(!inword){ + 60: fe0997e3 bnez s3,4e <wc+0x4e> + w++; + 64: 2c05 addiw s8,s8,1 + inword = 1; + 66: 4985 li s3,1 + 68: b7dd j 4e <wc+0x4e> + c++; + 6a: 01ac8cbb addw s9,s9,s10 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 6e: 20000613 li a2,512 + 72: 00001597 auipc a1,0x1 + 76: f9e58593 addi a1,a1,-98 # 1010 <buf> + 7a: f8843503 ld a0,-120(s0) + 7e: 366000ef jal ra,3e4 <read> + 82: 00a05f63 blez a0,a0 <wc+0xa0> + for(i=0; i<n; i++){ + 86: 00001497 auipc s1,0x1 + 8a: f8a48493 addi s1,s1,-118 # 1010 <buf> + 8e: 00050d1b sext.w s10,a0 + 92: fff5091b addiw s2,a0,-1 + 96: 1902 slli s2,s2,0x20 + 98: 02095913 srli s2,s2,0x20 + 9c: 996e add s2,s2,s11 + 9e: bf5d j 54 <wc+0x54> + } + } + } + if(n < 0){ + a0: 02054c63 bltz a0,d8 <wc+0xd8> + printf("wc: read error\n"); + exit(1); + } + printf("%d %d %d %s\n", l, w, c, name); + a4: f8043703 ld a4,-128(s0) + a8: 86e6 mv a3,s9 + aa: 8662 mv a2,s8 + ac: 85de mv a1,s7 + ae: 00001517 auipc a0,0x1 + b2: 8fa50513 addi a0,a0,-1798 # 9a8 <malloc+0x104> + b6: 73a000ef jal ra,7f0 <printf> +} + ba: 70e6 ld ra,120(sp) + bc: 7446 ld s0,112(sp) + be: 74a6 ld s1,104(sp) + c0: 7906 ld s2,96(sp) + c2: 69e6 ld s3,88(sp) + c4: 6a46 ld s4,80(sp) + c6: 6aa6 ld s5,72(sp) + c8: 6b06 ld s6,64(sp) + ca: 7be2 ld s7,56(sp) + cc: 7c42 ld s8,48(sp) + ce: 7ca2 ld s9,40(sp) + d0: 7d02 ld s10,32(sp) + d2: 6de2 ld s11,24(sp) + d4: 6109 addi sp,sp,128 + d6: 8082 ret + printf("wc: read error\n"); + d8: 00001517 auipc a0,0x1 + dc: 8c050513 addi a0,a0,-1856 # 998 <malloc+0xf4> + e0: 710000ef jal ra,7f0 <printf> + exit(1); + e4: 4505 li a0,1 + e6: 2e6000ef jal ra,3cc <exit> + +00000000000000ea <main>: + +int +main(int argc, char *argv[]) +{ + ea: 7179 addi sp,sp,-48 + ec: f406 sd ra,40(sp) + ee: f022 sd s0,32(sp) + f0: ec26 sd s1,24(sp) + f2: e84a sd s2,16(sp) + f4: e44e sd s3,8(sp) + f6: e052 sd s4,0(sp) + f8: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + fa: 4785 li a5,1 + fc: 02a7df63 bge a5,a0,13a <main+0x50> + 100: 00858493 addi s1,a1,8 + 104: ffe5099b addiw s3,a0,-2 + 108: 02099793 slli a5,s3,0x20 + 10c: 01d7d993 srli s3,a5,0x1d + 110: 05c1 addi a1,a1,16 + 112: 99ae add s3,s3,a1 + wc(0, ""); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 114: 4581 li a1,0 + 116: 6088 ld a0,0(s1) + 118: 2f4000ef jal ra,40c <open> + 11c: 892a mv s2,a0 + 11e: 02054863 bltz a0,14e <main+0x64> + printf("wc: cannot open %s\n", argv[i]); + exit(1); + } + wc(fd, argv[i]); + 122: 608c ld a1,0(s1) + 124: eddff0ef jal ra,0 <wc> + close(fd); + 128: 854a mv a0,s2 + 12a: 2ca000ef jal ra,3f4 <close> + for(i = 1; i < argc; i++){ + 12e: 04a1 addi s1,s1,8 + 130: ff3492e3 bne s1,s3,114 <main+0x2a> + } + exit(0); + 134: 4501 li a0,0 + 136: 296000ef jal ra,3cc <exit> + wc(0, ""); + 13a: 00001597 auipc a1,0x1 + 13e: 87e58593 addi a1,a1,-1922 # 9b8 <malloc+0x114> + 142: 4501 li a0,0 + 144: ebdff0ef jal ra,0 <wc> + exit(0); + 148: 4501 li a0,0 + 14a: 282000ef jal ra,3cc <exit> + printf("wc: cannot open %s\n", argv[i]); + 14e: 608c ld a1,0(s1) + 150: 00001517 auipc a0,0x1 + 154: 87050513 addi a0,a0,-1936 # 9c0 <malloc+0x11c> + 158: 698000ef jal ra,7f0 <printf> + exit(1); + 15c: 4505 li a0,1 + 15e: 26e000ef jal ra,3cc <exit> + +0000000000000162 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 162: 1141 addi sp,sp,-16 + 164: e406 sd ra,8(sp) + 166: e022 sd s0,0(sp) + 168: 0800 addi s0,sp,16 + extern int main(); + main(); + 16a: f81ff0ef jal ra,ea <main> + exit(0); + 16e: 4501 li a0,0 + 170: 25c000ef jal ra,3cc <exit> + +0000000000000174 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 174: 1141 addi sp,sp,-16 + 176: e422 sd s0,8(sp) + 178: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 17a: 87aa mv a5,a0 + 17c: 0585 addi a1,a1,1 + 17e: 0785 addi a5,a5,1 + 180: fff5c703 lbu a4,-1(a1) + 184: fee78fa3 sb a4,-1(a5) + 188: fb75 bnez a4,17c <strcpy+0x8> + ; + return os; +} + 18a: 6422 ld s0,8(sp) + 18c: 0141 addi sp,sp,16 + 18e: 8082 ret + +0000000000000190 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 190: 1141 addi sp,sp,-16 + 192: e422 sd s0,8(sp) + 194: 0800 addi s0,sp,16 + while(*p && *p == *q) + 196: 00054783 lbu a5,0(a0) + 19a: cb91 beqz a5,1ae <strcmp+0x1e> + 19c: 0005c703 lbu a4,0(a1) + 1a0: 00f71763 bne a4,a5,1ae <strcmp+0x1e> + p++, q++; + 1a4: 0505 addi a0,a0,1 + 1a6: 0585 addi a1,a1,1 + while(*p && *p == *q) + 1a8: 00054783 lbu a5,0(a0) + 1ac: fbe5 bnez a5,19c <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 1ae: 0005c503 lbu a0,0(a1) +} + 1b2: 40a7853b subw a0,a5,a0 + 1b6: 6422 ld s0,8(sp) + 1b8: 0141 addi sp,sp,16 + 1ba: 8082 ret + +00000000000001bc <strlen>: + +uint +strlen(const char *s) +{ + 1bc: 1141 addi sp,sp,-16 + 1be: e422 sd s0,8(sp) + 1c0: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 1c2: 00054783 lbu a5,0(a0) + 1c6: cf91 beqz a5,1e2 <strlen+0x26> + 1c8: 0505 addi a0,a0,1 + 1ca: 87aa mv a5,a0 + 1cc: 4685 li a3,1 + 1ce: 9e89 subw a3,a3,a0 + 1d0: 00f6853b addw a0,a3,a5 + 1d4: 0785 addi a5,a5,1 + 1d6: fff7c703 lbu a4,-1(a5) + 1da: fb7d bnez a4,1d0 <strlen+0x14> + ; + return n; +} + 1dc: 6422 ld s0,8(sp) + 1de: 0141 addi sp,sp,16 + 1e0: 8082 ret + for(n = 0; s[n]; n++) + 1e2: 4501 li a0,0 + 1e4: bfe5 j 1dc <strlen+0x20> + +00000000000001e6 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + 1e6: 1141 addi sp,sp,-16 + 1e8: e422 sd s0,8(sp) + 1ea: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 1ec: ca19 beqz a2,202 <memset+0x1c> + 1ee: 87aa mv a5,a0 + 1f0: 1602 slli a2,a2,0x20 + 1f2: 9201 srli a2,a2,0x20 + 1f4: 00a60733 add a4,a2,a0 + cdst[i] = c; + 1f8: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 1fc: 0785 addi a5,a5,1 + 1fe: fee79de3 bne a5,a4,1f8 <memset+0x12> + } + return dst; +} + 202: 6422 ld s0,8(sp) + 204: 0141 addi sp,sp,16 + 206: 8082 ret + +0000000000000208 <strchr>: + +char* +strchr(const char *s, char c) +{ + 208: 1141 addi sp,sp,-16 + 20a: e422 sd s0,8(sp) + 20c: 0800 addi s0,sp,16 + for(; *s; s++) + 20e: 00054783 lbu a5,0(a0) + 212: cb99 beqz a5,228 <strchr+0x20> + if(*s == c) + 214: 00f58763 beq a1,a5,222 <strchr+0x1a> + for(; *s; s++) + 218: 0505 addi a0,a0,1 + 21a: 00054783 lbu a5,0(a0) + 21e: fbfd bnez a5,214 <strchr+0xc> + return (char*)s; + return 0; + 220: 4501 li a0,0 +} + 222: 6422 ld s0,8(sp) + 224: 0141 addi sp,sp,16 + 226: 8082 ret + return 0; + 228: 4501 li a0,0 + 22a: bfe5 j 222 <strchr+0x1a> + +000000000000022c <gets>: + +char* +gets(char *buf, int max) +{ + 22c: 711d addi sp,sp,-96 + 22e: ec86 sd ra,88(sp) + 230: e8a2 sd s0,80(sp) + 232: e4a6 sd s1,72(sp) + 234: e0ca sd s2,64(sp) + 236: fc4e sd s3,56(sp) + 238: f852 sd s4,48(sp) + 23a: f456 sd s5,40(sp) + 23c: f05a sd s6,32(sp) + 23e: ec5e sd s7,24(sp) + 240: 1080 addi s0,sp,96 + 242: 8baa mv s7,a0 + 244: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 246: 892a mv s2,a0 + 248: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 24a: 4aa9 li s5,10 + 24c: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 24e: 89a6 mv s3,s1 + 250: 2485 addiw s1,s1,1 + 252: 0344d663 bge s1,s4,27e <gets+0x52> + cc = read(0, &c, 1); + 256: 4605 li a2,1 + 258: faf40593 addi a1,s0,-81 + 25c: 4501 li a0,0 + 25e: 186000ef jal ra,3e4 <read> + if(cc < 1) + 262: 00a05e63 blez a0,27e <gets+0x52> + buf[i++] = c; + 266: faf44783 lbu a5,-81(s0) + 26a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 26e: 01578763 beq a5,s5,27c <gets+0x50> + 272: 0905 addi s2,s2,1 + 274: fd679de3 bne a5,s6,24e <gets+0x22> + for(i=0; i+1 < max; ){ + 278: 89a6 mv s3,s1 + 27a: a011 j 27e <gets+0x52> + 27c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 27e: 99de add s3,s3,s7 + 280: 00098023 sb zero,0(s3) + return buf; +} + 284: 855e mv a0,s7 + 286: 60e6 ld ra,88(sp) + 288: 6446 ld s0,80(sp) + 28a: 64a6 ld s1,72(sp) + 28c: 6906 ld s2,64(sp) + 28e: 79e2 ld s3,56(sp) + 290: 7a42 ld s4,48(sp) + 292: 7aa2 ld s5,40(sp) + 294: 7b02 ld s6,32(sp) + 296: 6be2 ld s7,24(sp) + 298: 6125 addi sp,sp,96 + 29a: 8082 ret + +000000000000029c <stat>: + +int +stat(const char *n, struct stat *st) +{ + 29c: 1101 addi sp,sp,-32 + 29e: ec06 sd ra,24(sp) + 2a0: e822 sd s0,16(sp) + 2a2: e426 sd s1,8(sp) + 2a4: e04a sd s2,0(sp) + 2a6: 1000 addi s0,sp,32 + 2a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 2aa: 4581 li a1,0 + 2ac: 160000ef jal ra,40c <open> + if(fd < 0) + 2b0: 02054163 bltz a0,2d2 <stat+0x36> + 2b4: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 2b6: 85ca mv a1,s2 + 2b8: 16c000ef jal ra,424 <fstat> + 2bc: 892a mv s2,a0 + close(fd); + 2be: 8526 mv a0,s1 + 2c0: 134000ef jal ra,3f4 <close> + return r; +} + 2c4: 854a mv a0,s2 + 2c6: 60e2 ld ra,24(sp) + 2c8: 6442 ld s0,16(sp) + 2ca: 64a2 ld s1,8(sp) + 2cc: 6902 ld s2,0(sp) + 2ce: 6105 addi sp,sp,32 + 2d0: 8082 ret + return -1; + 2d2: 597d li s2,-1 + 2d4: bfc5 j 2c4 <stat+0x28> + +00000000000002d6 <atoi>: + +int +atoi(const char *s) +{ + 2d6: 1141 addi sp,sp,-16 + 2d8: e422 sd s0,8(sp) + 2da: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 2dc: 00054683 lbu a3,0(a0) + 2e0: fd06879b addiw a5,a3,-48 + 2e4: 0ff7f793 zext.b a5,a5 + 2e8: 4625 li a2,9 + 2ea: 02f66863 bltu a2,a5,31a <atoi+0x44> + 2ee: 872a mv a4,a0 + n = 0; + 2f0: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 2f2: 0705 addi a4,a4,1 + 2f4: 0025179b slliw a5,a0,0x2 + 2f8: 9fa9 addw a5,a5,a0 + 2fa: 0017979b slliw a5,a5,0x1 + 2fe: 9fb5 addw a5,a5,a3 + 300: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 304: 00074683 lbu a3,0(a4) + 308: fd06879b addiw a5,a3,-48 + 30c: 0ff7f793 zext.b a5,a5 + 310: fef671e3 bgeu a2,a5,2f2 <atoi+0x1c> + return n; +} + 314: 6422 ld s0,8(sp) + 316: 0141 addi sp,sp,16 + 318: 8082 ret + n = 0; + 31a: 4501 li a0,0 + 31c: bfe5 j 314 <atoi+0x3e> + +000000000000031e <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 31e: 1141 addi sp,sp,-16 + 320: e422 sd s0,8(sp) + 322: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 324: 02b57463 bgeu a0,a1,34c <memmove+0x2e> + while(n-- > 0) + 328: 00c05f63 blez a2,346 <memmove+0x28> + 32c: 1602 slli a2,a2,0x20 + 32e: 9201 srli a2,a2,0x20 + 330: 00c507b3 add a5,a0,a2 + dst = vdst; + 334: 872a mv a4,a0 + *dst++ = *src++; + 336: 0585 addi a1,a1,1 + 338: 0705 addi a4,a4,1 + 33a: fff5c683 lbu a3,-1(a1) + 33e: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 342: fee79ae3 bne a5,a4,336 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 346: 6422 ld s0,8(sp) + 348: 0141 addi sp,sp,16 + 34a: 8082 ret + dst += n; + 34c: 00c50733 add a4,a0,a2 + src += n; + 350: 95b2 add a1,a1,a2 + while(n-- > 0) + 352: fec05ae3 blez a2,346 <memmove+0x28> + 356: fff6079b addiw a5,a2,-1 + 35a: 1782 slli a5,a5,0x20 + 35c: 9381 srli a5,a5,0x20 + 35e: fff7c793 not a5,a5 + 362: 97ba add a5,a5,a4 + *--dst = *--src; + 364: 15fd addi a1,a1,-1 + 366: 177d addi a4,a4,-1 + 368: 0005c683 lbu a3,0(a1) + 36c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 370: fee79ae3 bne a5,a4,364 <memmove+0x46> + 374: bfc9 j 346 <memmove+0x28> + +0000000000000376 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 376: 1141 addi sp,sp,-16 + 378: e422 sd s0,8(sp) + 37a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 37c: ca05 beqz a2,3ac <memcmp+0x36> + 37e: fff6069b addiw a3,a2,-1 + 382: 1682 slli a3,a3,0x20 + 384: 9281 srli a3,a3,0x20 + 386: 0685 addi a3,a3,1 + 388: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 38a: 00054783 lbu a5,0(a0) + 38e: 0005c703 lbu a4,0(a1) + 392: 00e79863 bne a5,a4,3a2 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 396: 0505 addi a0,a0,1 + p2++; + 398: 0585 addi a1,a1,1 + while (n-- > 0) { + 39a: fed518e3 bne a0,a3,38a <memcmp+0x14> + } + return 0; + 39e: 4501 li a0,0 + 3a0: a019 j 3a6 <memcmp+0x30> + return *p1 - *p2; + 3a2: 40e7853b subw a0,a5,a4 +} + 3a6: 6422 ld s0,8(sp) + 3a8: 0141 addi sp,sp,16 + 3aa: 8082 ret + return 0; + 3ac: 4501 li a0,0 + 3ae: bfe5 j 3a6 <memcmp+0x30> + +00000000000003b0 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 3b0: 1141 addi sp,sp,-16 + 3b2: e406 sd ra,8(sp) + 3b4: e022 sd s0,0(sp) + 3b6: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 3b8: f67ff0ef jal ra,31e <memmove> +} + 3bc: 60a2 ld ra,8(sp) + 3be: 6402 ld s0,0(sp) + 3c0: 0141 addi sp,sp,16 + 3c2: 8082 ret + +00000000000003c4 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 3c4: 4885 li a7,1 + ecall + 3c6: 00000073 ecall + ret + 3ca: 8082 ret + +00000000000003cc <exit>: +.global exit +exit: + li a7, SYS_exit + 3cc: 4889 li a7,2 + ecall + 3ce: 00000073 ecall + ret + 3d2: 8082 ret + +00000000000003d4 <wait>: +.global wait +wait: + li a7, SYS_wait + 3d4: 488d li a7,3 + ecall + 3d6: 00000073 ecall + ret + 3da: 8082 ret + +00000000000003dc <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 3dc: 4891 li a7,4 + ecall + 3de: 00000073 ecall + ret + 3e2: 8082 ret + +00000000000003e4 <read>: +.global read +read: + li a7, SYS_read + 3e4: 4895 li a7,5 + ecall + 3e6: 00000073 ecall + ret + 3ea: 8082 ret + +00000000000003ec <write>: +.global write +write: + li a7, SYS_write + 3ec: 48c1 li a7,16 + ecall + 3ee: 00000073 ecall + ret + 3f2: 8082 ret + +00000000000003f4 <close>: +.global close +close: + li a7, SYS_close + 3f4: 48d5 li a7,21 + ecall + 3f6: 00000073 ecall + ret + 3fa: 8082 ret + +00000000000003fc <kill>: +.global kill +kill: + li a7, SYS_kill + 3fc: 4899 li a7,6 + ecall + 3fe: 00000073 ecall + ret + 402: 8082 ret + +0000000000000404 <exec>: +.global exec +exec: + li a7, SYS_exec + 404: 489d li a7,7 + ecall + 406: 00000073 ecall + ret + 40a: 8082 ret + +000000000000040c <open>: +.global open +open: + li a7, SYS_open + 40c: 48bd li a7,15 + ecall + 40e: 00000073 ecall + ret + 412: 8082 ret + +0000000000000414 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 414: 48c5 li a7,17 + ecall + 416: 00000073 ecall + ret + 41a: 8082 ret + +000000000000041c <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 41c: 48c9 li a7,18 + ecall + 41e: 00000073 ecall + ret + 422: 8082 ret + +0000000000000424 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 424: 48a1 li a7,8 + ecall + 426: 00000073 ecall + ret + 42a: 8082 ret + +000000000000042c <link>: +.global link +link: + li a7, SYS_link + 42c: 48cd li a7,19 + ecall + 42e: 00000073 ecall + ret + 432: 8082 ret + +0000000000000434 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 434: 48d1 li a7,20 + ecall + 436: 00000073 ecall + ret + 43a: 8082 ret + +000000000000043c <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 43c: 48a5 li a7,9 + ecall + 43e: 00000073 ecall + ret + 442: 8082 ret + +0000000000000444 <dup>: +.global dup +dup: + li a7, SYS_dup + 444: 48a9 li a7,10 + ecall + 446: 00000073 ecall + ret + 44a: 8082 ret + +000000000000044c <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 44c: 48ad li a7,11 + ecall + 44e: 00000073 ecall + ret + 452: 8082 ret + +0000000000000454 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 454: 48b1 li a7,12 + ecall + 456: 00000073 ecall + ret + 45a: 8082 ret + +000000000000045c <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 45c: 48b5 li a7,13 + ecall + 45e: 00000073 ecall + ret + 462: 8082 ret + +0000000000000464 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 464: 48b9 li a7,14 + ecall + 466: 00000073 ecall + ret + 46a: 8082 ret + +000000000000046c <trace>: +.global trace +trace: + li a7, SYS_trace + 46c: 48d9 li a7,22 + ecall + 46e: 00000073 ecall + ret + 472: 8082 ret + +0000000000000474 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 474: 48dd li a7,23 + ecall + 476: 00000073 ecall + ret + 47a: 8082 ret + +000000000000047c <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 47c: 48e1 li a7,24 + ecall + 47e: 00000073 ecall + ret + 482: 8082 ret + +0000000000000484 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 484: 1101 addi sp,sp,-32 + 486: ec06 sd ra,24(sp) + 488: e822 sd s0,16(sp) + 48a: 1000 addi s0,sp,32 + 48c: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 490: 4605 li a2,1 + 492: fef40593 addi a1,s0,-17 + 496: f57ff0ef jal ra,3ec <write> +} + 49a: 60e2 ld ra,24(sp) + 49c: 6442 ld s0,16(sp) + 49e: 6105 addi sp,sp,32 + 4a0: 8082 ret + +00000000000004a2 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 4a2: 7139 addi sp,sp,-64 + 4a4: fc06 sd ra,56(sp) + 4a6: f822 sd s0,48(sp) + 4a8: f426 sd s1,40(sp) + 4aa: f04a sd s2,32(sp) + 4ac: ec4e sd s3,24(sp) + 4ae: 0080 addi s0,sp,64 + 4b0: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 4b2: c299 beqz a3,4b8 <printint+0x16> + 4b4: 0805c763 bltz a1,542 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 4b8: 2581 sext.w a1,a1 + neg = 0; + 4ba: 4881 li a7,0 + 4bc: fc040693 addi a3,s0,-64 + } + + i = 0; + 4c0: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 4c2: 2601 sext.w a2,a2 + 4c4: 00000517 auipc a0,0x0 + 4c8: 51c50513 addi a0,a0,1308 # 9e0 <digits> + 4cc: 883a mv a6,a4 + 4ce: 2705 addiw a4,a4,1 + 4d0: 02c5f7bb remuw a5,a1,a2 + 4d4: 1782 slli a5,a5,0x20 + 4d6: 9381 srli a5,a5,0x20 + 4d8: 97aa add a5,a5,a0 + 4da: 0007c783 lbu a5,0(a5) + 4de: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 4e2: 0005879b sext.w a5,a1 + 4e6: 02c5d5bb divuw a1,a1,a2 + 4ea: 0685 addi a3,a3,1 + 4ec: fec7f0e3 bgeu a5,a2,4cc <printint+0x2a> + if(neg) + 4f0: 00088c63 beqz a7,508 <printint+0x66> + buf[i++] = '-'; + 4f4: fd070793 addi a5,a4,-48 + 4f8: 00878733 add a4,a5,s0 + 4fc: 02d00793 li a5,45 + 500: fef70823 sb a5,-16(a4) + 504: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 508: 02e05663 blez a4,534 <printint+0x92> + 50c: fc040793 addi a5,s0,-64 + 510: 00e78933 add s2,a5,a4 + 514: fff78993 addi s3,a5,-1 + 518: 99ba add s3,s3,a4 + 51a: 377d addiw a4,a4,-1 + 51c: 1702 slli a4,a4,0x20 + 51e: 9301 srli a4,a4,0x20 + 520: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 524: fff94583 lbu a1,-1(s2) + 528: 8526 mv a0,s1 + 52a: f5bff0ef jal ra,484 <putc> + while(--i >= 0) + 52e: 197d addi s2,s2,-1 + 530: ff391ae3 bne s2,s3,524 <printint+0x82> +} + 534: 70e2 ld ra,56(sp) + 536: 7442 ld s0,48(sp) + 538: 74a2 ld s1,40(sp) + 53a: 7902 ld s2,32(sp) + 53c: 69e2 ld s3,24(sp) + 53e: 6121 addi sp,sp,64 + 540: 8082 ret + x = -xx; + 542: 40b005bb negw a1,a1 + neg = 1; + 546: 4885 li a7,1 + x = -xx; + 548: bf95 j 4bc <printint+0x1a> + +000000000000054a <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 54a: 7119 addi sp,sp,-128 + 54c: fc86 sd ra,120(sp) + 54e: f8a2 sd s0,112(sp) + 550: f4a6 sd s1,104(sp) + 552: f0ca sd s2,96(sp) + 554: ecce sd s3,88(sp) + 556: e8d2 sd s4,80(sp) + 558: e4d6 sd s5,72(sp) + 55a: e0da sd s6,64(sp) + 55c: fc5e sd s7,56(sp) + 55e: f862 sd s8,48(sp) + 560: f466 sd s9,40(sp) + 562: f06a sd s10,32(sp) + 564: ec6e sd s11,24(sp) + 566: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 568: 0005c903 lbu s2,0(a1) + 56c: 22090e63 beqz s2,7a8 <vprintf+0x25e> + 570: 8b2a mv s6,a0 + 572: 8a2e mv s4,a1 + 574: 8bb2 mv s7,a2 + state = 0; + 576: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 578: 4481 li s1,0 + 57a: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 57c: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 580: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 584: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 588: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 58c: 00000c97 auipc s9,0x0 + 590: 454c8c93 addi s9,s9,1108 # 9e0 <digits> + 594: a005 j 5b4 <vprintf+0x6a> + putc(fd, c0); + 596: 85ca mv a1,s2 + 598: 855a mv a0,s6 + 59a: eebff0ef jal ra,484 <putc> + 59e: a019 j 5a4 <vprintf+0x5a> + } else if(state == '%'){ + 5a0: 03598263 beq s3,s5,5c4 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 5a4: 2485 addiw s1,s1,1 + 5a6: 8726 mv a4,s1 + 5a8: 009a07b3 add a5,s4,s1 + 5ac: 0007c903 lbu s2,0(a5) + 5b0: 1e090c63 beqz s2,7a8 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 5b4: 0009079b sext.w a5,s2 + if(state == 0){ + 5b8: fe0994e3 bnez s3,5a0 <vprintf+0x56> + if(c0 == '%'){ + 5bc: fd579de3 bne a5,s5,596 <vprintf+0x4c> + state = '%'; + 5c0: 89be mv s3,a5 + 5c2: b7cd j 5a4 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 5c4: cfa5 beqz a5,63c <vprintf+0xf2> + 5c6: 00ea06b3 add a3,s4,a4 + 5ca: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 5ce: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 5d0: c681 beqz a3,5d8 <vprintf+0x8e> + 5d2: 9752 add a4,a4,s4 + 5d4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 5d8: 03878a63 beq a5,s8,60c <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 5dc: 05a78463 beq a5,s10,624 <vprintf+0xda> + } else if(c0 == 'u'){ + 5e0: 0db78763 beq a5,s11,6ae <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 5e4: 07800713 li a4,120 + 5e8: 10e78963 beq a5,a4,6fa <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 5ec: 07000713 li a4,112 + 5f0: 12e78e63 beq a5,a4,72c <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 5f4: 07300713 li a4,115 + 5f8: 16e78b63 beq a5,a4,76e <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 5fc: 05579063 bne a5,s5,63c <vprintf+0xf2> + putc(fd, '%'); + 600: 85d6 mv a1,s5 + 602: 855a mv a0,s6 + 604: e81ff0ef jal ra,484 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 608: 4981 li s3,0 + 60a: bf69 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 60c: 008b8913 addi s2,s7,8 + 610: 4685 li a3,1 + 612: 4629 li a2,10 + 614: 000ba583 lw a1,0(s7) + 618: 855a mv a0,s6 + 61a: e89ff0ef jal ra,4a2 <printint> + 61e: 8bca mv s7,s2 + state = 0; + 620: 4981 li s3,0 + 622: b749 j 5a4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 624: 03868663 beq a3,s8,650 <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 628: 05a68163 beq a3,s10,66a <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 62c: 09b68d63 beq a3,s11,6c6 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 630: 03a68f63 beq a3,s10,66e <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 634: 07800793 li a5,120 + 638: 0cf68d63 beq a3,a5,712 <vprintf+0x1c8> + putc(fd, '%'); + 63c: 85d6 mv a1,s5 + 63e: 855a mv a0,s6 + 640: e45ff0ef jal ra,484 <putc> + putc(fd, c0); + 644: 85ca mv a1,s2 + 646: 855a mv a0,s6 + 648: e3dff0ef jal ra,484 <putc> + state = 0; + 64c: 4981 li s3,0 + 64e: bf99 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 650: 008b8913 addi s2,s7,8 + 654: 4685 li a3,1 + 656: 4629 li a2,10 + 658: 000ba583 lw a1,0(s7) + 65c: 855a mv a0,s6 + 65e: e45ff0ef jal ra,4a2 <printint> + i += 1; + 662: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 664: 8bca mv s7,s2 + state = 0; + 666: 4981 li s3,0 + i += 1; + 668: bf35 j 5a4 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 66a: 03860563 beq a2,s8,694 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 66e: 07b60963 beq a2,s11,6e0 <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 672: 07800793 li a5,120 + 676: fcf613e3 bne a2,a5,63c <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 67a: 008b8913 addi s2,s7,8 + 67e: 4681 li a3,0 + 680: 4641 li a2,16 + 682: 000ba583 lw a1,0(s7) + 686: 855a mv a0,s6 + 688: e1bff0ef jal ra,4a2 <printint> + i += 2; + 68c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 68e: 8bca mv s7,s2 + state = 0; + 690: 4981 li s3,0 + i += 2; + 692: bf09 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 694: 008b8913 addi s2,s7,8 + 698: 4685 li a3,1 + 69a: 4629 li a2,10 + 69c: 000ba583 lw a1,0(s7) + 6a0: 855a mv a0,s6 + 6a2: e01ff0ef jal ra,4a2 <printint> + i += 2; + 6a6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 6a8: 8bca mv s7,s2 + state = 0; + 6aa: 4981 li s3,0 + i += 2; + 6ac: bde5 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 6ae: 008b8913 addi s2,s7,8 + 6b2: 4681 li a3,0 + 6b4: 4629 li a2,10 + 6b6: 000ba583 lw a1,0(s7) + 6ba: 855a mv a0,s6 + 6bc: de7ff0ef jal ra,4a2 <printint> + 6c0: 8bca mv s7,s2 + state = 0; + 6c2: 4981 li s3,0 + 6c4: b5c5 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 6c6: 008b8913 addi s2,s7,8 + 6ca: 4681 li a3,0 + 6cc: 4629 li a2,10 + 6ce: 000ba583 lw a1,0(s7) + 6d2: 855a mv a0,s6 + 6d4: dcfff0ef jal ra,4a2 <printint> + i += 1; + 6d8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 6da: 8bca mv s7,s2 + state = 0; + 6dc: 4981 li s3,0 + i += 1; + 6de: b5d9 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 6e0: 008b8913 addi s2,s7,8 + 6e4: 4681 li a3,0 + 6e6: 4629 li a2,10 + 6e8: 000ba583 lw a1,0(s7) + 6ec: 855a mv a0,s6 + 6ee: db5ff0ef jal ra,4a2 <printint> + i += 2; + 6f2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 6f4: 8bca mv s7,s2 + state = 0; + 6f6: 4981 li s3,0 + i += 2; + 6f8: b575 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 6fa: 008b8913 addi s2,s7,8 + 6fe: 4681 li a3,0 + 700: 4641 li a2,16 + 702: 000ba583 lw a1,0(s7) + 706: 855a mv a0,s6 + 708: d9bff0ef jal ra,4a2 <printint> + 70c: 8bca mv s7,s2 + state = 0; + 70e: 4981 li s3,0 + 710: bd51 j 5a4 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 712: 008b8913 addi s2,s7,8 + 716: 4681 li a3,0 + 718: 4641 li a2,16 + 71a: 000ba583 lw a1,0(s7) + 71e: 855a mv a0,s6 + 720: d83ff0ef jal ra,4a2 <printint> + i += 1; + 724: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 726: 8bca mv s7,s2 + state = 0; + 728: 4981 li s3,0 + i += 1; + 72a: bdad j 5a4 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 72c: 008b8793 addi a5,s7,8 + 730: f8f43423 sd a5,-120(s0) + 734: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 738: 03000593 li a1,48 + 73c: 855a mv a0,s6 + 73e: d47ff0ef jal ra,484 <putc> + putc(fd, 'x'); + 742: 07800593 li a1,120 + 746: 855a mv a0,s6 + 748: d3dff0ef jal ra,484 <putc> + 74c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 74e: 03c9d793 srli a5,s3,0x3c + 752: 97e6 add a5,a5,s9 + 754: 0007c583 lbu a1,0(a5) + 758: 855a mv a0,s6 + 75a: d2bff0ef jal ra,484 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 75e: 0992 slli s3,s3,0x4 + 760: 397d addiw s2,s2,-1 + 762: fe0916e3 bnez s2,74e <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 766: f8843b83 ld s7,-120(s0) + state = 0; + 76a: 4981 li s3,0 + 76c: bd25 j 5a4 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 76e: 008b8993 addi s3,s7,8 + 772: 000bb903 ld s2,0(s7) + 776: 00090f63 beqz s2,794 <vprintf+0x24a> + for(; *s; s++) + 77a: 00094583 lbu a1,0(s2) + 77e: c195 beqz a1,7a2 <vprintf+0x258> + putc(fd, *s); + 780: 855a mv a0,s6 + 782: d03ff0ef jal ra,484 <putc> + for(; *s; s++) + 786: 0905 addi s2,s2,1 + 788: 00094583 lbu a1,0(s2) + 78c: f9f5 bnez a1,780 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 78e: 8bce mv s7,s3 + state = 0; + 790: 4981 li s3,0 + 792: bd09 j 5a4 <vprintf+0x5a> + s = "(null)"; + 794: 00000917 auipc s2,0x0 + 798: 24490913 addi s2,s2,580 # 9d8 <malloc+0x134> + for(; *s; s++) + 79c: 02800593 li a1,40 + 7a0: b7c5 j 780 <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 7a2: 8bce mv s7,s3 + state = 0; + 7a4: 4981 li s3,0 + 7a6: bbfd j 5a4 <vprintf+0x5a> + } + } +} + 7a8: 70e6 ld ra,120(sp) + 7aa: 7446 ld s0,112(sp) + 7ac: 74a6 ld s1,104(sp) + 7ae: 7906 ld s2,96(sp) + 7b0: 69e6 ld s3,88(sp) + 7b2: 6a46 ld s4,80(sp) + 7b4: 6aa6 ld s5,72(sp) + 7b6: 6b06 ld s6,64(sp) + 7b8: 7be2 ld s7,56(sp) + 7ba: 7c42 ld s8,48(sp) + 7bc: 7ca2 ld s9,40(sp) + 7be: 7d02 ld s10,32(sp) + 7c0: 6de2 ld s11,24(sp) + 7c2: 6109 addi sp,sp,128 + 7c4: 8082 ret + +00000000000007c6 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 7c6: 715d addi sp,sp,-80 + 7c8: ec06 sd ra,24(sp) + 7ca: e822 sd s0,16(sp) + 7cc: 1000 addi s0,sp,32 + 7ce: e010 sd a2,0(s0) + 7d0: e414 sd a3,8(s0) + 7d2: e818 sd a4,16(s0) + 7d4: ec1c sd a5,24(s0) + 7d6: 03043023 sd a6,32(s0) + 7da: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 7de: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 7e2: 8622 mv a2,s0 + 7e4: d67ff0ef jal ra,54a <vprintf> +} + 7e8: 60e2 ld ra,24(sp) + 7ea: 6442 ld s0,16(sp) + 7ec: 6161 addi sp,sp,80 + 7ee: 8082 ret + +00000000000007f0 <printf>: + +void +printf(const char *fmt, ...) +{ + 7f0: 711d addi sp,sp,-96 + 7f2: ec06 sd ra,24(sp) + 7f4: e822 sd s0,16(sp) + 7f6: 1000 addi s0,sp,32 + 7f8: e40c sd a1,8(s0) + 7fa: e810 sd a2,16(s0) + 7fc: ec14 sd a3,24(s0) + 7fe: f018 sd a4,32(s0) + 800: f41c sd a5,40(s0) + 802: 03043823 sd a6,48(s0) + 806: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 80a: 00840613 addi a2,s0,8 + 80e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 812: 85aa mv a1,a0 + 814: 4505 li a0,1 + 816: d35ff0ef jal ra,54a <vprintf> +} + 81a: 60e2 ld ra,24(sp) + 81c: 6442 ld s0,16(sp) + 81e: 6125 addi sp,sp,96 + 820: 8082 ret + +0000000000000822 <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 822: 1141 addi sp,sp,-16 + 824: e422 sd s0,8(sp) + 826: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 828: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 82c: 00000797 auipc a5,0x0 + 830: 7d47b783 ld a5,2004(a5) # 1000 <freep> + 834: a02d j 85e <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 836: 4618 lw a4,8(a2) + 838: 9f2d addw a4,a4,a1 + 83a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 83e: 6398 ld a4,0(a5) + 840: 6310 ld a2,0(a4) + 842: a83d j 880 <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 844: ff852703 lw a4,-8(a0) + 848: 9f31 addw a4,a4,a2 + 84a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 84c: ff053683 ld a3,-16(a0) + 850: a091 j 894 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 852: 6398 ld a4,0(a5) + 854: 00e7e463 bltu a5,a4,85c <free+0x3a> + 858: 00e6ea63 bltu a3,a4,86c <free+0x4a> +{ + 85c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 85e: fed7fae3 bgeu a5,a3,852 <free+0x30> + 862: 6398 ld a4,0(a5) + 864: 00e6e463 bltu a3,a4,86c <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 868: fee7eae3 bltu a5,a4,85c <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 86c: ff852583 lw a1,-8(a0) + 870: 6390 ld a2,0(a5) + 872: 02059813 slli a6,a1,0x20 + 876: 01c85713 srli a4,a6,0x1c + 87a: 9736 add a4,a4,a3 + 87c: fae60de3 beq a2,a4,836 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 880: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 884: 4790 lw a2,8(a5) + 886: 02061593 slli a1,a2,0x20 + 88a: 01c5d713 srli a4,a1,0x1c + 88e: 973e add a4,a4,a5 + 890: fae68ae3 beq a3,a4,844 <free+0x22> + p->s.ptr = bp->s.ptr; + 894: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 896: 00000717 auipc a4,0x0 + 89a: 76f73523 sd a5,1898(a4) # 1000 <freep> +} + 89e: 6422 ld s0,8(sp) + 8a0: 0141 addi sp,sp,16 + 8a2: 8082 ret + +00000000000008a4 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 8a4: 7139 addi sp,sp,-64 + 8a6: fc06 sd ra,56(sp) + 8a8: f822 sd s0,48(sp) + 8aa: f426 sd s1,40(sp) + 8ac: f04a sd s2,32(sp) + 8ae: ec4e sd s3,24(sp) + 8b0: e852 sd s4,16(sp) + 8b2: e456 sd s5,8(sp) + 8b4: e05a sd s6,0(sp) + 8b6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 8b8: 02051493 slli s1,a0,0x20 + 8bc: 9081 srli s1,s1,0x20 + 8be: 04bd addi s1,s1,15 + 8c0: 8091 srli s1,s1,0x4 + 8c2: 0014899b addiw s3,s1,1 + 8c6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 8c8: 00000517 auipc a0,0x0 + 8cc: 73853503 ld a0,1848(a0) # 1000 <freep> + 8d0: c515 beqz a0,8fc <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8d2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8d4: 4798 lw a4,8(a5) + 8d6: 02977f63 bgeu a4,s1,914 <malloc+0x70> + 8da: 8a4e mv s4,s3 + 8dc: 0009871b sext.w a4,s3 + 8e0: 6685 lui a3,0x1 + 8e2: 00d77363 bgeu a4,a3,8e8 <malloc+0x44> + 8e6: 6a05 lui s4,0x1 + 8e8: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8ec: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8f0: 00000917 auipc s2,0x0 + 8f4: 71090913 addi s2,s2,1808 # 1000 <freep> + if(p == (char*)-1) + 8f8: 5afd li s5,-1 + 8fa: a885 j 96a <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 8fc: 00001797 auipc a5,0x1 + 900: 91478793 addi a5,a5,-1772 # 1210 <base> + 904: 00000717 auipc a4,0x0 + 908: 6ef73e23 sd a5,1788(a4) # 1000 <freep> + 90c: e39c sd a5,0(a5) + base.s.size = 0; + 90e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 912: b7e1 j 8da <malloc+0x36> + if(p->s.size == nunits) + 914: 02e48c63 beq s1,a4,94c <malloc+0xa8> + p->s.size -= nunits; + 918: 4137073b subw a4,a4,s3 + 91c: c798 sw a4,8(a5) + p += p->s.size; + 91e: 02071693 slli a3,a4,0x20 + 922: 01c6d713 srli a4,a3,0x1c + 926: 97ba add a5,a5,a4 + p->s.size = nunits; + 928: 0137a423 sw s3,8(a5) + freep = prevp; + 92c: 00000717 auipc a4,0x0 + 930: 6ca73a23 sd a0,1748(a4) # 1000 <freep> + return (void*)(p + 1); + 934: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 938: 70e2 ld ra,56(sp) + 93a: 7442 ld s0,48(sp) + 93c: 74a2 ld s1,40(sp) + 93e: 7902 ld s2,32(sp) + 940: 69e2 ld s3,24(sp) + 942: 6a42 ld s4,16(sp) + 944: 6aa2 ld s5,8(sp) + 946: 6b02 ld s6,0(sp) + 948: 6121 addi sp,sp,64 + 94a: 8082 ret + prevp->s.ptr = p->s.ptr; + 94c: 6398 ld a4,0(a5) + 94e: e118 sd a4,0(a0) + 950: bff1 j 92c <malloc+0x88> + hp->s.size = nu; + 952: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 956: 0541 addi a0,a0,16 + 958: ecbff0ef jal ra,822 <free> + return freep; + 95c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 960: dd61 beqz a0,938 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 962: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 964: 4798 lw a4,8(a5) + 966: fa9777e3 bgeu a4,s1,914 <malloc+0x70> + if(p == freep) + 96a: 00093703 ld a4,0(s2) + 96e: 853e mv a0,a5 + 970: fef719e3 bne a4,a5,962 <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 974: 8552 mv a0,s4 + 976: adfff0ef jal ra,454 <sbrk> + if(p == (char*)-1) + 97a: fd551ce3 bne a0,s5,952 <malloc+0xae> + return 0; + 97e: 4501 li a0,0 + 980: bf65 j 938 <malloc+0x94> diff --git a/user/wc.d b/user/wc.d new file mode 100644 index 0000000000000000000000000000000000000000..46d2d3adc5b3ec0cde24bd977906a1887d876adc --- /dev/null +++ b/user/wc.d @@ -0,0 +1,2 @@ +user/wc.o: user/wc.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h kernel/fcntl.h user/user.h diff --git a/user/wc.o b/user/wc.o new file mode 100644 index 0000000000000000000000000000000000000000..7a813244a59deeedd912fb7546d0f7d01aa10695 Binary files /dev/null and b/user/wc.o differ diff --git a/user/wc.sym b/user/wc.sym new file mode 100644 index 0000000000000000000000000000000000000000..eb1576be74b263e678b759b4fd5ca06be6443a0d --- /dev/null +++ b/user/wc.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +0000000000000988 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 wc.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000484 putc +00000000000004a2 printint +00000000000009e0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001210 base +0000000000000174 strcpy +00000000000007f0 printf +000000000000031e memmove +0000000000000414 mknod +000000000000046c trace +000000000000022c gets +000000000000044c getpid +00000000000003b0 memcpy +00000000000008a4 malloc +000000000000045c sleep +0000000000000474 mycall +00000000000003dc pipe +00000000000003ec write +0000000000000424 fstat +00000000000007c6 fprintf +00000000000003fc kill +000000000000054a vprintf +000000000000043c chdir +0000000000000404 exec +00000000000003d4 wait +00000000000003e4 read +000000000000041c unlink +0000000000000000 wc +0000000000000376 memcmp +00000000000003c4 fork +0000000000000454 sbrk +0000000000000464 uptime +00000000000001e6 memset +00000000000000ea main +000000000000047c GSCinfo +0000000000000190 strcmp +0000000000000444 dup +0000000000001010 buf +000000000000029c stat +000000000000042c link +00000000000003cc exit +0000000000000162 start +00000000000002d6 atoi +00000000000001bc strlen +000000000000040c open +0000000000000208 strchr +0000000000000434 mkdir +00000000000003f4 close +0000000000000822 free diff --git a/user/zombie.asm b/user/zombie.asm new file mode 100644 index 0000000000000000000000000000000000000000..c891f95348a84a1450840b92997b1d3993cd1792 --- /dev/null +++ b/user/zombie.asm @@ -0,0 +1,1449 @@ + +user/_zombie: æ–‡ä»¶æ ¼å¼ elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <main>: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(void) +{ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + if(fork() > 0) + 8: 278000ef jal ra,280 <fork> + c: 00a04563 bgtz a0,16 <main+0x16> + sleep(5); // Let child exit before parent. + exit(0); + 10: 4501 li a0,0 + 12: 276000ef jal ra,288 <exit> + sleep(5); // Let child exit before parent. + 16: 4515 li a0,5 + 18: 300000ef jal ra,318 <sleep> + 1c: bfd5 j 10 <main+0x10> + +000000000000001e <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ + 1e: 1141 addi sp,sp,-16 + 20: e406 sd ra,8(sp) + 22: e022 sd s0,0(sp) + 24: 0800 addi s0,sp,16 + extern int main(); + main(); + 26: fdbff0ef jal ra,0 <main> + exit(0); + 2a: 4501 li a0,0 + 2c: 25c000ef jal ra,288 <exit> + +0000000000000030 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ + 30: 1141 addi sp,sp,-16 + 32: e422 sd s0,8(sp) + 34: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 36: 87aa mv a5,a0 + 38: 0585 addi a1,a1,1 + 3a: 0785 addi a5,a5,1 + 3c: fff5c703 lbu a4,-1(a1) + 40: fee78fa3 sb a4,-1(a5) + 44: fb75 bnez a4,38 <strcpy+0x8> + ; + return os; +} + 46: 6422 ld s0,8(sp) + 48: 0141 addi sp,sp,16 + 4a: 8082 ret + +000000000000004c <strcmp>: + +int +strcmp(const char *p, const char *q) +{ + 4c: 1141 addi sp,sp,-16 + 4e: e422 sd s0,8(sp) + 50: 0800 addi s0,sp,16 + while(*p && *p == *q) + 52: 00054783 lbu a5,0(a0) + 56: cb91 beqz a5,6a <strcmp+0x1e> + 58: 0005c703 lbu a4,0(a1) + 5c: 00f71763 bne a4,a5,6a <strcmp+0x1e> + p++, q++; + 60: 0505 addi a0,a0,1 + 62: 0585 addi a1,a1,1 + while(*p && *p == *q) + 64: 00054783 lbu a5,0(a0) + 68: fbe5 bnez a5,58 <strcmp+0xc> + return (uchar)*p - (uchar)*q; + 6a: 0005c503 lbu a0,0(a1) +} + 6e: 40a7853b subw a0,a5,a0 + 72: 6422 ld s0,8(sp) + 74: 0141 addi sp,sp,16 + 76: 8082 ret + +0000000000000078 <strlen>: + +uint +strlen(const char *s) +{ + 78: 1141 addi sp,sp,-16 + 7a: e422 sd s0,8(sp) + 7c: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 7e: 00054783 lbu a5,0(a0) + 82: cf91 beqz a5,9e <strlen+0x26> + 84: 0505 addi a0,a0,1 + 86: 87aa mv a5,a0 + 88: 4685 li a3,1 + 8a: 9e89 subw a3,a3,a0 + 8c: 00f6853b addw a0,a3,a5 + 90: 0785 addi a5,a5,1 + 92: fff7c703 lbu a4,-1(a5) + 96: fb7d bnez a4,8c <strlen+0x14> + ; + return n; +} + 98: 6422 ld s0,8(sp) + 9a: 0141 addi sp,sp,16 + 9c: 8082 ret + for(n = 0; s[n]; n++) + 9e: 4501 li a0,0 + a0: bfe5 j 98 <strlen+0x20> + +00000000000000a2 <memset>: + +void* +memset(void *dst, int c, uint n) +{ + a2: 1141 addi sp,sp,-16 + a4: e422 sd s0,8(sp) + a6: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a8: ca19 beqz a2,be <memset+0x1c> + aa: 87aa mv a5,a0 + ac: 1602 slli a2,a2,0x20 + ae: 9201 srli a2,a2,0x20 + b0: 00a60733 add a4,a2,a0 + cdst[i] = c; + b4: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + b8: 0785 addi a5,a5,1 + ba: fee79de3 bne a5,a4,b4 <memset+0x12> + } + return dst; +} + be: 6422 ld s0,8(sp) + c0: 0141 addi sp,sp,16 + c2: 8082 ret + +00000000000000c4 <strchr>: + +char* +strchr(const char *s, char c) +{ + c4: 1141 addi sp,sp,-16 + c6: e422 sd s0,8(sp) + c8: 0800 addi s0,sp,16 + for(; *s; s++) + ca: 00054783 lbu a5,0(a0) + ce: cb99 beqz a5,e4 <strchr+0x20> + if(*s == c) + d0: 00f58763 beq a1,a5,de <strchr+0x1a> + for(; *s; s++) + d4: 0505 addi a0,a0,1 + d6: 00054783 lbu a5,0(a0) + da: fbfd bnez a5,d0 <strchr+0xc> + return (char*)s; + return 0; + dc: 4501 li a0,0 +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + return 0; + e4: 4501 li a0,0 + e6: bfe5 j de <strchr+0x1a> + +00000000000000e8 <gets>: + +char* +gets(char *buf, int max) +{ + e8: 711d addi sp,sp,-96 + ea: ec86 sd ra,88(sp) + ec: e8a2 sd s0,80(sp) + ee: e4a6 sd s1,72(sp) + f0: e0ca sd s2,64(sp) + f2: fc4e sd s3,56(sp) + f4: f852 sd s4,48(sp) + f6: f456 sd s5,40(sp) + f8: f05a sd s6,32(sp) + fa: ec5e sd s7,24(sp) + fc: 1080 addi s0,sp,96 + fe: 8baa mv s7,a0 + 100: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 102: 892a mv s2,a0 + 104: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 106: 4aa9 li s5,10 + 108: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 10a: 89a6 mv s3,s1 + 10c: 2485 addiw s1,s1,1 + 10e: 0344d663 bge s1,s4,13a <gets+0x52> + cc = read(0, &c, 1); + 112: 4605 li a2,1 + 114: faf40593 addi a1,s0,-81 + 118: 4501 li a0,0 + 11a: 186000ef jal ra,2a0 <read> + if(cc < 1) + 11e: 00a05e63 blez a0,13a <gets+0x52> + buf[i++] = c; + 122: faf44783 lbu a5,-81(s0) + 126: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 12a: 01578763 beq a5,s5,138 <gets+0x50> + 12e: 0905 addi s2,s2,1 + 130: fd679de3 bne a5,s6,10a <gets+0x22> + for(i=0; i+1 < max; ){ + 134: 89a6 mv s3,s1 + 136: a011 j 13a <gets+0x52> + 138: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 13a: 99de add s3,s3,s7 + 13c: 00098023 sb zero,0(s3) + return buf; +} + 140: 855e mv a0,s7 + 142: 60e6 ld ra,88(sp) + 144: 6446 ld s0,80(sp) + 146: 64a6 ld s1,72(sp) + 148: 6906 ld s2,64(sp) + 14a: 79e2 ld s3,56(sp) + 14c: 7a42 ld s4,48(sp) + 14e: 7aa2 ld s5,40(sp) + 150: 7b02 ld s6,32(sp) + 152: 6be2 ld s7,24(sp) + 154: 6125 addi sp,sp,96 + 156: 8082 ret + +0000000000000158 <stat>: + +int +stat(const char *n, struct stat *st) +{ + 158: 1101 addi sp,sp,-32 + 15a: ec06 sd ra,24(sp) + 15c: e822 sd s0,16(sp) + 15e: e426 sd s1,8(sp) + 160: e04a sd s2,0(sp) + 162: 1000 addi s0,sp,32 + 164: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 166: 4581 li a1,0 + 168: 160000ef jal ra,2c8 <open> + if(fd < 0) + 16c: 02054163 bltz a0,18e <stat+0x36> + 170: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 172: 85ca mv a1,s2 + 174: 16c000ef jal ra,2e0 <fstat> + 178: 892a mv s2,a0 + close(fd); + 17a: 8526 mv a0,s1 + 17c: 134000ef jal ra,2b0 <close> + return r; +} + 180: 854a mv a0,s2 + 182: 60e2 ld ra,24(sp) + 184: 6442 ld s0,16(sp) + 186: 64a2 ld s1,8(sp) + 188: 6902 ld s2,0(sp) + 18a: 6105 addi sp,sp,32 + 18c: 8082 ret + return -1; + 18e: 597d li s2,-1 + 190: bfc5 j 180 <stat+0x28> + +0000000000000192 <atoi>: + +int +atoi(const char *s) +{ + 192: 1141 addi sp,sp,-16 + 194: e422 sd s0,8(sp) + 196: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 198: 00054683 lbu a3,0(a0) + 19c: fd06879b addiw a5,a3,-48 + 1a0: 0ff7f793 zext.b a5,a5 + 1a4: 4625 li a2,9 + 1a6: 02f66863 bltu a2,a5,1d6 <atoi+0x44> + 1aa: 872a mv a4,a0 + n = 0; + 1ac: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1ae: 0705 addi a4,a4,1 + 1b0: 0025179b slliw a5,a0,0x2 + 1b4: 9fa9 addw a5,a5,a0 + 1b6: 0017979b slliw a5,a5,0x1 + 1ba: 9fb5 addw a5,a5,a3 + 1bc: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1c0: 00074683 lbu a3,0(a4) + 1c4: fd06879b addiw a5,a3,-48 + 1c8: 0ff7f793 zext.b a5,a5 + 1cc: fef671e3 bgeu a2,a5,1ae <atoi+0x1c> + return n; +} + 1d0: 6422 ld s0,8(sp) + 1d2: 0141 addi sp,sp,16 + 1d4: 8082 ret + n = 0; + 1d6: 4501 li a0,0 + 1d8: bfe5 j 1d0 <atoi+0x3e> + +00000000000001da <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1da: 1141 addi sp,sp,-16 + 1dc: e422 sd s0,8(sp) + 1de: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1e0: 02b57463 bgeu a0,a1,208 <memmove+0x2e> + while(n-- > 0) + 1e4: 00c05f63 blez a2,202 <memmove+0x28> + 1e8: 1602 slli a2,a2,0x20 + 1ea: 9201 srli a2,a2,0x20 + 1ec: 00c507b3 add a5,a0,a2 + dst = vdst; + 1f0: 872a mv a4,a0 + *dst++ = *src++; + 1f2: 0585 addi a1,a1,1 + 1f4: 0705 addi a4,a4,1 + 1f6: fff5c683 lbu a3,-1(a1) + 1fa: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 1fe: fee79ae3 bne a5,a4,1f2 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 202: 6422 ld s0,8(sp) + 204: 0141 addi sp,sp,16 + 206: 8082 ret + dst += n; + 208: 00c50733 add a4,a0,a2 + src += n; + 20c: 95b2 add a1,a1,a2 + while(n-- > 0) + 20e: fec05ae3 blez a2,202 <memmove+0x28> + 212: fff6079b addiw a5,a2,-1 + 216: 1782 slli a5,a5,0x20 + 218: 9381 srli a5,a5,0x20 + 21a: fff7c793 not a5,a5 + 21e: 97ba add a5,a5,a4 + *--dst = *--src; + 220: 15fd addi a1,a1,-1 + 222: 177d addi a4,a4,-1 + 224: 0005c683 lbu a3,0(a1) + 228: 00d70023 sb a3,0(a4) + while(n-- > 0) + 22c: fee79ae3 bne a5,a4,220 <memmove+0x46> + 230: bfc9 j 202 <memmove+0x28> + +0000000000000232 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 232: 1141 addi sp,sp,-16 + 234: e422 sd s0,8(sp) + 236: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 238: ca05 beqz a2,268 <memcmp+0x36> + 23a: fff6069b addiw a3,a2,-1 + 23e: 1682 slli a3,a3,0x20 + 240: 9281 srli a3,a3,0x20 + 242: 0685 addi a3,a3,1 + 244: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 246: 00054783 lbu a5,0(a0) + 24a: 0005c703 lbu a4,0(a1) + 24e: 00e79863 bne a5,a4,25e <memcmp+0x2c> + return *p1 - *p2; + } + p1++; + 252: 0505 addi a0,a0,1 + p2++; + 254: 0585 addi a1,a1,1 + while (n-- > 0) { + 256: fed518e3 bne a0,a3,246 <memcmp+0x14> + } + return 0; + 25a: 4501 li a0,0 + 25c: a019 j 262 <memcmp+0x30> + return *p1 - *p2; + 25e: 40e7853b subw a0,a5,a4 +} + 262: 6422 ld s0,8(sp) + 264: 0141 addi sp,sp,16 + 266: 8082 ret + return 0; + 268: 4501 li a0,0 + 26a: bfe5 j 262 <memcmp+0x30> + +000000000000026c <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ + 26c: 1141 addi sp,sp,-16 + 26e: e406 sd ra,8(sp) + 270: e022 sd s0,0(sp) + 272: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 274: f67ff0ef jal ra,1da <memmove> +} + 278: 60a2 ld ra,8(sp) + 27a: 6402 ld s0,0(sp) + 27c: 0141 addi sp,sp,16 + 27e: 8082 ret + +0000000000000280 <fork>: +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 280: 4885 li a7,1 + ecall + 282: 00000073 ecall + ret + 286: 8082 ret + +0000000000000288 <exit>: +.global exit +exit: + li a7, SYS_exit + 288: 4889 li a7,2 + ecall + 28a: 00000073 ecall + ret + 28e: 8082 ret + +0000000000000290 <wait>: +.global wait +wait: + li a7, SYS_wait + 290: 488d li a7,3 + ecall + 292: 00000073 ecall + ret + 296: 8082 ret + +0000000000000298 <pipe>: +.global pipe +pipe: + li a7, SYS_pipe + 298: 4891 li a7,4 + ecall + 29a: 00000073 ecall + ret + 29e: 8082 ret + +00000000000002a0 <read>: +.global read +read: + li a7, SYS_read + 2a0: 4895 li a7,5 + ecall + 2a2: 00000073 ecall + ret + 2a6: 8082 ret + +00000000000002a8 <write>: +.global write +write: + li a7, SYS_write + 2a8: 48c1 li a7,16 + ecall + 2aa: 00000073 ecall + ret + 2ae: 8082 ret + +00000000000002b0 <close>: +.global close +close: + li a7, SYS_close + 2b0: 48d5 li a7,21 + ecall + 2b2: 00000073 ecall + ret + 2b6: 8082 ret + +00000000000002b8 <kill>: +.global kill +kill: + li a7, SYS_kill + 2b8: 4899 li a7,6 + ecall + 2ba: 00000073 ecall + ret + 2be: 8082 ret + +00000000000002c0 <exec>: +.global exec +exec: + li a7, SYS_exec + 2c0: 489d li a7,7 + ecall + 2c2: 00000073 ecall + ret + 2c6: 8082 ret + +00000000000002c8 <open>: +.global open +open: + li a7, SYS_open + 2c8: 48bd li a7,15 + ecall + 2ca: 00000073 ecall + ret + 2ce: 8082 ret + +00000000000002d0 <mknod>: +.global mknod +mknod: + li a7, SYS_mknod + 2d0: 48c5 li a7,17 + ecall + 2d2: 00000073 ecall + ret + 2d6: 8082 ret + +00000000000002d8 <unlink>: +.global unlink +unlink: + li a7, SYS_unlink + 2d8: 48c9 li a7,18 + ecall + 2da: 00000073 ecall + ret + 2de: 8082 ret + +00000000000002e0 <fstat>: +.global fstat +fstat: + li a7, SYS_fstat + 2e0: 48a1 li a7,8 + ecall + 2e2: 00000073 ecall + ret + 2e6: 8082 ret + +00000000000002e8 <link>: +.global link +link: + li a7, SYS_link + 2e8: 48cd li a7,19 + ecall + 2ea: 00000073 ecall + ret + 2ee: 8082 ret + +00000000000002f0 <mkdir>: +.global mkdir +mkdir: + li a7, SYS_mkdir + 2f0: 48d1 li a7,20 + ecall + 2f2: 00000073 ecall + ret + 2f6: 8082 ret + +00000000000002f8 <chdir>: +.global chdir +chdir: + li a7, SYS_chdir + 2f8: 48a5 li a7,9 + ecall + 2fa: 00000073 ecall + ret + 2fe: 8082 ret + +0000000000000300 <dup>: +.global dup +dup: + li a7, SYS_dup + 300: 48a9 li a7,10 + ecall + 302: 00000073 ecall + ret + 306: 8082 ret + +0000000000000308 <getpid>: +.global getpid +getpid: + li a7, SYS_getpid + 308: 48ad li a7,11 + ecall + 30a: 00000073 ecall + ret + 30e: 8082 ret + +0000000000000310 <sbrk>: +.global sbrk +sbrk: + li a7, SYS_sbrk + 310: 48b1 li a7,12 + ecall + 312: 00000073 ecall + ret + 316: 8082 ret + +0000000000000318 <sleep>: +.global sleep +sleep: + li a7, SYS_sleep + 318: 48b5 li a7,13 + ecall + 31a: 00000073 ecall + ret + 31e: 8082 ret + +0000000000000320 <uptime>: +.global uptime +uptime: + li a7, SYS_uptime + 320: 48b9 li a7,14 + ecall + 322: 00000073 ecall + ret + 326: 8082 ret + +0000000000000328 <trace>: +.global trace +trace: + li a7, SYS_trace + 328: 48d9 li a7,22 + ecall + 32a: 00000073 ecall + ret + 32e: 8082 ret + +0000000000000330 <mycall>: +.global mycall +mycall: + li a7, SYS_mycall + 330: 48dd li a7,23 + ecall + 332: 00000073 ecall + ret + 336: 8082 ret + +0000000000000338 <GSCinfo>: +.global GSCinfo +GSCinfo: + li a7, SYS_GSCinfo + 338: 48e1 li a7,24 + ecall + 33a: 00000073 ecall + ret + 33e: 8082 ret + +0000000000000340 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 340: 1101 addi sp,sp,-32 + 342: ec06 sd ra,24(sp) + 344: e822 sd s0,16(sp) + 346: 1000 addi s0,sp,32 + 348: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 34c: 4605 li a2,1 + 34e: fef40593 addi a1,s0,-17 + 352: f57ff0ef jal ra,2a8 <write> +} + 356: 60e2 ld ra,24(sp) + 358: 6442 ld s0,16(sp) + 35a: 6105 addi sp,sp,32 + 35c: 8082 ret + +000000000000035e <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ + 35e: 7139 addi sp,sp,-64 + 360: fc06 sd ra,56(sp) + 362: f822 sd s0,48(sp) + 364: f426 sd s1,40(sp) + 366: f04a sd s2,32(sp) + 368: ec4e sd s3,24(sp) + 36a: 0080 addi s0,sp,64 + 36c: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ + 36e: c299 beqz a3,374 <printint+0x16> + 370: 0805c763 bltz a1,3fe <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; + 374: 2581 sext.w a1,a1 + neg = 0; + 376: 4881 li a7,0 + 378: fc040693 addi a3,s0,-64 + } + + i = 0; + 37c: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; + 37e: 2601 sext.w a2,a2 + 380: 00000517 auipc a0,0x0 + 384: 4c850513 addi a0,a0,1224 # 848 <digits> + 388: 883a mv a6,a4 + 38a: 2705 addiw a4,a4,1 + 38c: 02c5f7bb remuw a5,a1,a2 + 390: 1782 slli a5,a5,0x20 + 392: 9381 srli a5,a5,0x20 + 394: 97aa add a5,a5,a0 + 396: 0007c783 lbu a5,0(a5) + 39a: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); + 39e: 0005879b sext.w a5,a1 + 3a2: 02c5d5bb divuw a1,a1,a2 + 3a6: 0685 addi a3,a3,1 + 3a8: fec7f0e3 bgeu a5,a2,388 <printint+0x2a> + if(neg) + 3ac: 00088c63 beqz a7,3c4 <printint+0x66> + buf[i++] = '-'; + 3b0: fd070793 addi a5,a4,-48 + 3b4: 00878733 add a4,a5,s0 + 3b8: 02d00793 li a5,45 + 3bc: fef70823 sb a5,-16(a4) + 3c0: 0028071b addiw a4,a6,2 + + while(--i >= 0) + 3c4: 02e05663 blez a4,3f0 <printint+0x92> + 3c8: fc040793 addi a5,s0,-64 + 3cc: 00e78933 add s2,a5,a4 + 3d0: fff78993 addi s3,a5,-1 + 3d4: 99ba add s3,s3,a4 + 3d6: 377d addiw a4,a4,-1 + 3d8: 1702 slli a4,a4,0x20 + 3da: 9301 srli a4,a4,0x20 + 3dc: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); + 3e0: fff94583 lbu a1,-1(s2) + 3e4: 8526 mv a0,s1 + 3e6: f5bff0ef jal ra,340 <putc> + while(--i >= 0) + 3ea: 197d addi s2,s2,-1 + 3ec: ff391ae3 bne s2,s3,3e0 <printint+0x82> +} + 3f0: 70e2 ld ra,56(sp) + 3f2: 7442 ld s0,48(sp) + 3f4: 74a2 ld s1,40(sp) + 3f6: 7902 ld s2,32(sp) + 3f8: 69e2 ld s3,24(sp) + 3fa: 6121 addi sp,sp,64 + 3fc: 8082 ret + x = -xx; + 3fe: 40b005bb negw a1,a1 + neg = 1; + 402: 4885 li a7,1 + x = -xx; + 404: bf95 j 378 <printint+0x1a> + +0000000000000406 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 406: 7119 addi sp,sp,-128 + 408: fc86 sd ra,120(sp) + 40a: f8a2 sd s0,112(sp) + 40c: f4a6 sd s1,104(sp) + 40e: f0ca sd s2,96(sp) + 410: ecce sd s3,88(sp) + 412: e8d2 sd s4,80(sp) + 414: e4d6 sd s5,72(sp) + 416: e0da sd s6,64(sp) + 418: fc5e sd s7,56(sp) + 41a: f862 sd s8,48(sp) + 41c: f466 sd s9,40(sp) + 41e: f06a sd s10,32(sp) + 420: ec6e sd s11,24(sp) + 422: 0100 addi s0,sp,128 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 424: 0005c903 lbu s2,0(a1) + 428: 22090e63 beqz s2,664 <vprintf+0x25e> + 42c: 8b2a mv s6,a0 + 42e: 8a2e mv s4,a1 + 430: 8bb2 mv s7,a2 + state = 0; + 432: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 434: 4481 li s1,0 + 436: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 438: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 43c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 440: 06c00d13 li s10,108 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 444: 07500d93 li s11,117 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 448: 00000c97 auipc s9,0x0 + 44c: 400c8c93 addi s9,s9,1024 # 848 <digits> + 450: a005 j 470 <vprintf+0x6a> + putc(fd, c0); + 452: 85ca mv a1,s2 + 454: 855a mv a0,s6 + 456: eebff0ef jal ra,340 <putc> + 45a: a019 j 460 <vprintf+0x5a> + } else if(state == '%'){ + 45c: 03598263 beq s3,s5,480 <vprintf+0x7a> + for(i = 0; fmt[i]; i++){ + 460: 2485 addiw s1,s1,1 + 462: 8726 mv a4,s1 + 464: 009a07b3 add a5,s4,s1 + 468: 0007c903 lbu s2,0(a5) + 46c: 1e090c63 beqz s2,664 <vprintf+0x25e> + c0 = fmt[i] & 0xff; + 470: 0009079b sext.w a5,s2 + if(state == 0){ + 474: fe0994e3 bnez s3,45c <vprintf+0x56> + if(c0 == '%'){ + 478: fd579de3 bne a5,s5,452 <vprintf+0x4c> + state = '%'; + 47c: 89be mv s3,a5 + 47e: b7cd j 460 <vprintf+0x5a> + if(c0) c1 = fmt[i+1] & 0xff; + 480: cfa5 beqz a5,4f8 <vprintf+0xf2> + 482: 00ea06b3 add a3,s4,a4 + 486: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 48a: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 48c: c681 beqz a3,494 <vprintf+0x8e> + 48e: 9752 add a4,a4,s4 + 490: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 494: 03878a63 beq a5,s8,4c8 <vprintf+0xc2> + } else if(c0 == 'l' && c1 == 'd'){ + 498: 05a78463 beq a5,s10,4e0 <vprintf+0xda> + } else if(c0 == 'u'){ + 49c: 0db78763 beq a5,s11,56a <vprintf+0x164> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4a0: 07800713 li a4,120 + 4a4: 10e78963 beq a5,a4,5b6 <vprintf+0x1b0> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4a8: 07000713 li a4,112 + 4ac: 12e78e63 beq a5,a4,5e8 <vprintf+0x1e2> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ + 4b0: 07300713 li a4,115 + 4b4: 16e78b63 beq a5,a4,62a <vprintf+0x224> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4b8: 05579063 bne a5,s5,4f8 <vprintf+0xf2> + putc(fd, '%'); + 4bc: 85d6 mv a1,s5 + 4be: 855a mv a0,s6 + 4c0: e81ff0ef jal ra,340 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; + 4c4: 4981 li s3,0 + 4c6: bf69 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 1); + 4c8: 008b8913 addi s2,s7,8 + 4cc: 4685 li a3,1 + 4ce: 4629 li a2,10 + 4d0: 000ba583 lw a1,0(s7) + 4d4: 855a mv a0,s6 + 4d6: e89ff0ef jal ra,35e <printint> + 4da: 8bca mv s7,s2 + state = 0; + 4dc: 4981 li s3,0 + 4de: b749 j 460 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'd'){ + 4e0: 03868663 beq a3,s8,50c <vprintf+0x106> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4e4: 05a68163 beq a3,s10,526 <vprintf+0x120> + } else if(c0 == 'l' && c1 == 'u'){ + 4e8: 09b68d63 beq a3,s11,582 <vprintf+0x17c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 4ec: 03a68f63 beq a3,s10,52a <vprintf+0x124> + } else if(c0 == 'l' && c1 == 'x'){ + 4f0: 07800793 li a5,120 + 4f4: 0cf68d63 beq a3,a5,5ce <vprintf+0x1c8> + putc(fd, '%'); + 4f8: 85d6 mv a1,s5 + 4fa: 855a mv a0,s6 + 4fc: e45ff0ef jal ra,340 <putc> + putc(fd, c0); + 500: 85ca mv a1,s2 + 502: 855a mv a0,s6 + 504: e3dff0ef jal ra,340 <putc> + state = 0; + 508: 4981 li s3,0 + 50a: bf99 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 50c: 008b8913 addi s2,s7,8 + 510: 4685 li a3,1 + 512: 4629 li a2,10 + 514: 000ba583 lw a1,0(s7) + 518: 855a mv a0,s6 + 51a: e45ff0ef jal ra,35e <printint> + i += 1; + 51e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 520: 8bca mv s7,s2 + state = 0; + 522: 4981 li s3,0 + i += 1; + 524: bf35 j 460 <vprintf+0x5a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 526: 03860563 beq a2,s8,550 <vprintf+0x14a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 52a: 07b60963 beq a2,s11,59c <vprintf+0x196> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 52e: 07800793 li a5,120 + 532: fcf613e3 bne a2,a5,4f8 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); + 536: 008b8913 addi s2,s7,8 + 53a: 4681 li a3,0 + 53c: 4641 li a2,16 + 53e: 000ba583 lw a1,0(s7) + 542: 855a mv a0,s6 + 544: e1bff0ef jal ra,35e <printint> + i += 2; + 548: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 54a: 8bca mv s7,s2 + state = 0; + 54c: 4981 li s3,0 + i += 2; + 54e: bf09 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 1); + 550: 008b8913 addi s2,s7,8 + 554: 4685 li a3,1 + 556: 4629 li a2,10 + 558: 000ba583 lw a1,0(s7) + 55c: 855a mv a0,s6 + 55e: e01ff0ef jal ra,35e <printint> + i += 2; + 562: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 564: 8bca mv s7,s2 + state = 0; + 566: 4981 li s3,0 + i += 2; + 568: bde5 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 10, 0); + 56a: 008b8913 addi s2,s7,8 + 56e: 4681 li a3,0 + 570: 4629 li a2,10 + 572: 000ba583 lw a1,0(s7) + 576: 855a mv a0,s6 + 578: de7ff0ef jal ra,35e <printint> + 57c: 8bca mv s7,s2 + state = 0; + 57e: 4981 li s3,0 + 580: b5c5 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 582: 008b8913 addi s2,s7,8 + 586: 4681 li a3,0 + 588: 4629 li a2,10 + 58a: 000ba583 lw a1,0(s7) + 58e: 855a mv a0,s6 + 590: dcfff0ef jal ra,35e <printint> + i += 1; + 594: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 596: 8bca mv s7,s2 + state = 0; + 598: 4981 li s3,0 + i += 1; + 59a: b5d9 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 10, 0); + 59c: 008b8913 addi s2,s7,8 + 5a0: 4681 li a3,0 + 5a2: 4629 li a2,10 + 5a4: 000ba583 lw a1,0(s7) + 5a8: 855a mv a0,s6 + 5aa: db5ff0ef jal ra,35e <printint> + i += 2; + 5ae: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5b0: 8bca mv s7,s2 + state = 0; + 5b2: 4981 li s3,0 + i += 2; + 5b4: b575 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, int), 16, 0); + 5b6: 008b8913 addi s2,s7,8 + 5ba: 4681 li a3,0 + 5bc: 4641 li a2,16 + 5be: 000ba583 lw a1,0(s7) + 5c2: 855a mv a0,s6 + 5c4: d9bff0ef jal ra,35e <printint> + 5c8: 8bca mv s7,s2 + state = 0; + 5ca: 4981 li s3,0 + 5cc: bd51 j 460 <vprintf+0x5a> + printint(fd, va_arg(ap, uint64), 16, 0); + 5ce: 008b8913 addi s2,s7,8 + 5d2: 4681 li a3,0 + 5d4: 4641 li a2,16 + 5d6: 000ba583 lw a1,0(s7) + 5da: 855a mv a0,s6 + 5dc: d83ff0ef jal ra,35e <printint> + i += 1; + 5e0: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 5e2: 8bca mv s7,s2 + state = 0; + 5e4: 4981 li s3,0 + i += 1; + 5e6: bdad j 460 <vprintf+0x5a> + printptr(fd, va_arg(ap, uint64)); + 5e8: 008b8793 addi a5,s7,8 + 5ec: f8f43423 sd a5,-120(s0) + 5f0: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 5f4: 03000593 li a1,48 + 5f8: 855a mv a0,s6 + 5fa: d47ff0ef jal ra,340 <putc> + putc(fd, 'x'); + 5fe: 07800593 li a1,120 + 602: 855a mv a0,s6 + 604: d3dff0ef jal ra,340 <putc> + 608: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 60a: 03c9d793 srli a5,s3,0x3c + 60e: 97e6 add a5,a5,s9 + 610: 0007c583 lbu a1,0(a5) + 614: 855a mv a0,s6 + 616: d2bff0ef jal ra,340 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 61a: 0992 slli s3,s3,0x4 + 61c: 397d addiw s2,s2,-1 + 61e: fe0916e3 bnez s2,60a <vprintf+0x204> + printptr(fd, va_arg(ap, uint64)); + 622: f8843b83 ld s7,-120(s0) + state = 0; + 626: 4981 li s3,0 + 628: bd25 j 460 <vprintf+0x5a> + if((s = va_arg(ap, char*)) == 0) + 62a: 008b8993 addi s3,s7,8 + 62e: 000bb903 ld s2,0(s7) + 632: 00090f63 beqz s2,650 <vprintf+0x24a> + for(; *s; s++) + 636: 00094583 lbu a1,0(s2) + 63a: c195 beqz a1,65e <vprintf+0x258> + putc(fd, *s); + 63c: 855a mv a0,s6 + 63e: d03ff0ef jal ra,340 <putc> + for(; *s; s++) + 642: 0905 addi s2,s2,1 + 644: 00094583 lbu a1,0(s2) + 648: f9f5 bnez a1,63c <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 64a: 8bce mv s7,s3 + state = 0; + 64c: 4981 li s3,0 + 64e: bd09 j 460 <vprintf+0x5a> + s = "(null)"; + 650: 00000917 auipc s2,0x0 + 654: 1f090913 addi s2,s2,496 # 840 <malloc+0xe0> + for(; *s; s++) + 658: 02800593 li a1,40 + 65c: b7c5 j 63c <vprintf+0x236> + if((s = va_arg(ap, char*)) == 0) + 65e: 8bce mv s7,s3 + state = 0; + 660: 4981 li s3,0 + 662: bbfd j 460 <vprintf+0x5a> + } + } +} + 664: 70e6 ld ra,120(sp) + 666: 7446 ld s0,112(sp) + 668: 74a6 ld s1,104(sp) + 66a: 7906 ld s2,96(sp) + 66c: 69e6 ld s3,88(sp) + 66e: 6a46 ld s4,80(sp) + 670: 6aa6 ld s5,72(sp) + 672: 6b06 ld s6,64(sp) + 674: 7be2 ld s7,56(sp) + 676: 7c42 ld s8,48(sp) + 678: 7ca2 ld s9,40(sp) + 67a: 7d02 ld s10,32(sp) + 67c: 6de2 ld s11,24(sp) + 67e: 6109 addi sp,sp,128 + 680: 8082 ret + +0000000000000682 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ + 682: 715d addi sp,sp,-80 + 684: ec06 sd ra,24(sp) + 686: e822 sd s0,16(sp) + 688: 1000 addi s0,sp,32 + 68a: e010 sd a2,0(s0) + 68c: e414 sd a3,8(s0) + 68e: e818 sd a4,16(s0) + 690: ec1c sd a5,24(s0) + 692: 03043023 sd a6,32(s0) + 696: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 69a: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 69e: 8622 mv a2,s0 + 6a0: d67ff0ef jal ra,406 <vprintf> +} + 6a4: 60e2 ld ra,24(sp) + 6a6: 6442 ld s0,16(sp) + 6a8: 6161 addi sp,sp,80 + 6aa: 8082 ret + +00000000000006ac <printf>: + +void +printf(const char *fmt, ...) +{ + 6ac: 711d addi sp,sp,-96 + 6ae: ec06 sd ra,24(sp) + 6b0: e822 sd s0,16(sp) + 6b2: 1000 addi s0,sp,32 + 6b4: e40c sd a1,8(s0) + 6b6: e810 sd a2,16(s0) + 6b8: ec14 sd a3,24(s0) + 6ba: f018 sd a4,32(s0) + 6bc: f41c sd a5,40(s0) + 6be: 03043823 sd a6,48(s0) + 6c2: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 6c6: 00840613 addi a2,s0,8 + 6ca: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 6ce: 85aa mv a1,a0 + 6d0: 4505 li a0,1 + 6d2: d35ff0ef jal ra,406 <vprintf> +} + 6d6: 60e2 ld ra,24(sp) + 6d8: 6442 ld s0,16(sp) + 6da: 6125 addi sp,sp,96 + 6dc: 8082 ret + +00000000000006de <free>: +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 6de: 1141 addi sp,sp,-16 + 6e0: e422 sd s0,8(sp) + 6e2: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 6e4: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 6e8: 00001797 auipc a5,0x1 + 6ec: 9187b783 ld a5,-1768(a5) # 1000 <freep> + 6f0: a02d j 71a <free+0x3c> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 6f2: 4618 lw a4,8(a2) + 6f4: 9f2d addw a4,a4,a1 + 6f6: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 6fa: 6398 ld a4,0(a5) + 6fc: 6310 ld a2,0(a4) + 6fe: a83d j 73c <free+0x5e> + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 700: ff852703 lw a4,-8(a0) + 704: 9f31 addw a4,a4,a2 + 706: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 708: ff053683 ld a3,-16(a0) + 70c: a091 j 750 <free+0x72> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 70e: 6398 ld a4,0(a5) + 710: 00e7e463 bltu a5,a4,718 <free+0x3a> + 714: 00e6ea63 bltu a3,a4,728 <free+0x4a> +{ + 718: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 71a: fed7fae3 bgeu a5,a3,70e <free+0x30> + 71e: 6398 ld a4,0(a5) + 720: 00e6e463 bltu a3,a4,728 <free+0x4a> + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 724: fee7eae3 bltu a5,a4,718 <free+0x3a> + if(bp + bp->s.size == p->s.ptr){ + 728: ff852583 lw a1,-8(a0) + 72c: 6390 ld a2,0(a5) + 72e: 02059813 slli a6,a1,0x20 + 732: 01c85713 srli a4,a6,0x1c + 736: 9736 add a4,a4,a3 + 738: fae60de3 beq a2,a4,6f2 <free+0x14> + bp->s.ptr = p->s.ptr->s.ptr; + 73c: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 740: 4790 lw a2,8(a5) + 742: 02061593 slli a1,a2,0x20 + 746: 01c5d713 srli a4,a1,0x1c + 74a: 973e add a4,a4,a5 + 74c: fae68ae3 beq a3,a4,700 <free+0x22> + p->s.ptr = bp->s.ptr; + 750: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 752: 00001717 auipc a4,0x1 + 756: 8af73723 sd a5,-1874(a4) # 1000 <freep> +} + 75a: 6422 ld s0,8(sp) + 75c: 0141 addi sp,sp,16 + 75e: 8082 ret + +0000000000000760 <malloc>: + return freep; +} + +void* +malloc(uint nbytes) +{ + 760: 7139 addi sp,sp,-64 + 762: fc06 sd ra,56(sp) + 764: f822 sd s0,48(sp) + 766: f426 sd s1,40(sp) + 768: f04a sd s2,32(sp) + 76a: ec4e sd s3,24(sp) + 76c: e852 sd s4,16(sp) + 76e: e456 sd s5,8(sp) + 770: e05a sd s6,0(sp) + 772: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 774: 02051493 slli s1,a0,0x20 + 778: 9081 srli s1,s1,0x20 + 77a: 04bd addi s1,s1,15 + 77c: 8091 srli s1,s1,0x4 + 77e: 0014899b addiw s3,s1,1 + 782: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 784: 00001517 auipc a0,0x1 + 788: 87c53503 ld a0,-1924(a0) # 1000 <freep> + 78c: c515 beqz a0,7b8 <malloc+0x58> + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 78e: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 790: 4798 lw a4,8(a5) + 792: 02977f63 bgeu a4,s1,7d0 <malloc+0x70> + 796: 8a4e mv s4,s3 + 798: 0009871b sext.w a4,s3 + 79c: 6685 lui a3,0x1 + 79e: 00d77363 bgeu a4,a3,7a4 <malloc+0x44> + 7a2: 6a05 lui s4,0x1 + 7a4: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7a8: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7ac: 00001917 auipc s2,0x1 + 7b0: 85490913 addi s2,s2,-1964 # 1000 <freep> + if(p == (char*)-1) + 7b4: 5afd li s5,-1 + 7b6: a885 j 826 <malloc+0xc6> + base.s.ptr = freep = prevp = &base; + 7b8: 00001797 auipc a5,0x1 + 7bc: 85878793 addi a5,a5,-1960 # 1010 <base> + 7c0: 00001717 auipc a4,0x1 + 7c4: 84f73023 sd a5,-1984(a4) # 1000 <freep> + 7c8: e39c sd a5,0(a5) + base.s.size = 0; + 7ca: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 7ce: b7e1 j 796 <malloc+0x36> + if(p->s.size == nunits) + 7d0: 02e48c63 beq s1,a4,808 <malloc+0xa8> + p->s.size -= nunits; + 7d4: 4137073b subw a4,a4,s3 + 7d8: c798 sw a4,8(a5) + p += p->s.size; + 7da: 02071693 slli a3,a4,0x20 + 7de: 01c6d713 srli a4,a3,0x1c + 7e2: 97ba add a5,a5,a4 + p->s.size = nunits; + 7e4: 0137a423 sw s3,8(a5) + freep = prevp; + 7e8: 00001717 auipc a4,0x1 + 7ec: 80a73c23 sd a0,-2024(a4) # 1000 <freep> + return (void*)(p + 1); + 7f0: 01078513 addi a0,a5,16 + if((p = morecore(nunits)) == 0) + return 0; + } +} + 7f4: 70e2 ld ra,56(sp) + 7f6: 7442 ld s0,48(sp) + 7f8: 74a2 ld s1,40(sp) + 7fa: 7902 ld s2,32(sp) + 7fc: 69e2 ld s3,24(sp) + 7fe: 6a42 ld s4,16(sp) + 800: 6aa2 ld s5,8(sp) + 802: 6b02 ld s6,0(sp) + 804: 6121 addi sp,sp,64 + 806: 8082 ret + prevp->s.ptr = p->s.ptr; + 808: 6398 ld a4,0(a5) + 80a: e118 sd a4,0(a0) + 80c: bff1 j 7e8 <malloc+0x88> + hp->s.size = nu; + 80e: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 812: 0541 addi a0,a0,16 + 814: ecbff0ef jal ra,6de <free> + return freep; + 818: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 81c: dd61 beqz a0,7f4 <malloc+0x94> + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 81e: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 820: 4798 lw a4,8(a5) + 822: fa9777e3 bgeu a4,s1,7d0 <malloc+0x70> + if(p == freep) + 826: 00093703 ld a4,0(s2) + 82a: 853e mv a0,a5 + 82c: fef719e3 bne a4,a5,81e <malloc+0xbe> + p = sbrk(nu * sizeof(Header)); + 830: 8552 mv a0,s4 + 832: adfff0ef jal ra,310 <sbrk> + if(p == (char*)-1) + 836: fd551ce3 bne a0,s5,80e <malloc+0xae> + return 0; + 83a: 4501 li a0,0 + 83c: bf65 j 7f4 <malloc+0x94> diff --git a/user/zombie.d b/user/zombie.d new file mode 100644 index 0000000000000000000000000000000000000000..51a3fac1df0902b9b4881f7f2a3247c68f144ddd --- /dev/null +++ b/user/zombie.d @@ -0,0 +1,2 @@ +user/zombie.o: user/zombie.c /usr/riscv64-linux-gnu/include/stdc-predef.h \ + kernel/types.h kernel/stat.h user/user.h diff --git a/user/zombie.o b/user/zombie.o new file mode 100644 index 0000000000000000000000000000000000000000..00034e682eab14b80d20215c65c36156d59550e6 Binary files /dev/null and b/user/zombie.o differ diff --git a/user/zombie.sym b/user/zombie.sym new file mode 100644 index 0000000000000000000000000000000000000000..9a1a3fe1e9ba8dd9a7213735d1e06a81588dfefb --- /dev/null +++ b/user/zombie.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000840 .rodata +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_frame +0000000000000000 .debug_ranges +0000000000000000 zombie.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000340 putc +000000000000035e printint +0000000000000848 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000030 strcpy +00000000000006ac printf +00000000000001da memmove +00000000000002d0 mknod +0000000000000328 trace +00000000000000e8 gets +0000000000000308 getpid +000000000000026c memcpy +0000000000000760 malloc +0000000000000318 sleep +0000000000000330 mycall +0000000000000298 pipe +00000000000002a8 write +00000000000002e0 fstat +0000000000000682 fprintf +00000000000002b8 kill +0000000000000406 vprintf +00000000000002f8 chdir +00000000000002c0 exec +0000000000000290 wait +00000000000002a0 read +00000000000002d8 unlink +0000000000000232 memcmp +0000000000000280 fork +0000000000000310 sbrk +0000000000000320 uptime +00000000000000a2 memset +0000000000000000 main +0000000000000338 GSCinfo +000000000000004c strcmp +0000000000000300 dup +0000000000000158 stat +00000000000002e8 link +0000000000000288 exit +000000000000001e start +0000000000000192 atoi +0000000000000078 strlen +00000000000002c8 open +00000000000000c4 strchr +00000000000002f0 mkdir +00000000000002b0 close +00000000000006de free