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