diff --git a/doc/cowtest/cowtest.md b/doc/cowtest/cowtest.md
index fc954aac99365251206236a7b064ff1d9d731801..e65f9c3b6a8e912f614ce186c1dda68bf428464e 100644
--- a/doc/cowtest/cowtest.md
+++ b/doc/cowtest/cowtest.md
@@ -313,6 +313,6 @@ int main() {
 
 测试结果:
 
-![](C:\Users\23671\Desktop\cowtest\cowtest.png)
+![cowtest](./cowtest.png)
 
 这个结果说明了操作系统中的 **写时复制 (Copy-On-Write, COW)** 技术的应用。写时复制是一种内存管理优化策略,旨在提高多进程操作的效率,特别是在进程创建时。在这个例子中,当父进程通过 `fork()` 创建子进程时,父子进程最初共享相同的内存区域,因此子进程看到的值与父进程相同,都是 `42`。然而,当子进程修改了这个值时,操作系统触发了写时复制机制,导致子进程的内存空间被复制并修改为 `100`,而父进程的内存空间保持不变。因此,父进程在子进程修改后的值仍然是 `42`,这表明在子进程进行修改时,只有子进程的内存被实际修改,而父进程的内存没有受到影响。这种机制通过延迟实际复制内存,直到进程写入数据时才复制,从而节省了内存和提高了性能。
\ No newline at end of file
diff --git a/doc/lock/lock.md b/doc/lock/lock.md
index 8035416f2ce9cebf54f34ed13aa81fed0b6bc2cc..46ef60783aee170058fe5041fe83f5135bfecee6 100644
--- a/doc/lock/lock.md
+++ b/doc/lock/lock.md
@@ -2,7 +2,7 @@
 
 在并发编程中我们经常用到锁来解决同步互斥问题,但是一个多核机器上对锁的使用不当会带来很多的所谓 “lock contention” 问题。在这里我们对涉及到锁的数据结构进行修改从而降低对锁的竞争。在原来的操作系统中,空闲的物理内存 kmem 组织成一个空闲链表 kmem.freelist,同时用一个锁 kmem.lock 保护 freelist,所有对 kmem.freelist 的访问都需要先取得锁,所以会产生很多竞争。
 
-![](C:\Users\23671\Desktop\lock\问题.png)
+![problem](./problem.png)
 
 因此,在这里我们对数据结构进行了更改,给每一个CPU单独开一个 freelist 和对应的 lock,这样只有同一个 CPU 上的进程同时获取对应锁才会产生竞争。
 
@@ -321,6 +321,6 @@ int main(int argc, char *argv[])
 
 测试结果:
 
-![](C:\Users\23671\Desktop\lock\locktest.png)
+![locktest](./locktest.png)
 
-![](C:\Users\23671\Desktop\lock\5777fcceca6683ced895090bce86bf9.png)
\ No newline at end of file
+![5777fcceca6683ced895090bce86bf9](./5777fcceca6683ced895090bce86bf9.png)
\ No newline at end of file
diff --git "a/doc/lock/\351\227\256\351\242\230.png" b/doc/lock/problem.png
similarity index 100%
rename from "doc/lock/\351\227\256\351\242\230.png"
rename to doc/lock/problem.png
diff --git a/doc/page table/page table.md b/doc/page table/page table.md
index c4ecfbb695304e84cc9da545a5f012270904b94f..a4fa51026af45a4b2e215388d19f2d57774122a6 100644
--- a/doc/page table/page table.md	
+++ b/doc/page table/page table.md	
@@ -4,7 +4,7 @@
 
 首先在内核的proc.h中添加一项指针来保存这个共享页面的地址,在proc.h这个头文件为内核和用户空间程序提供了必要的接口和信息,以确保进程的创建、调度、同步和其他管理任务能够正确执行。
 
-![](C:\Users\23671\Desktop\page table\d2f6c77708324437da426a91fea13ac.png)
+![d2f6c77708324437da426a91fea13ac](./d2f6c77708324437da426a91fea13ac.png)
 
 ```
 struct proc {
@@ -94,4 +94,4 @@ main(int argc, char *argv[]) {
 
 测试结果:
 
-![](C:\Users\23671\Desktop\page table\297e666c18ba53a1c339096014240c6.png)
\ No newline at end of file
+![297e666c18ba53a1c339096014240c6](./297e666c18ba53a1c339096014240c6.png)
\ No newline at end of file
diff --git a/doc/shared_var/shared_var.md b/doc/shared_var/shared_var.md
index 9c2ed61bfad2a36a31358f9af07e10421831a8c7..1d0d81c9d607857f4d4abe419e5b01b80cc5a45b 100644
--- a/doc/shared_var/shared_var.md
+++ b/doc/shared_var/shared_var.md
@@ -174,4 +174,4 @@ main(void)
 
 测试结果:
 
-![./](C:\Users\23671\Desktop\shared_var\d4cf921349df86ccadfd25dc623537d.png)
\ No newline at end of file
+![d4cf921349df86ccadfd25dc623537d](./d4cf921349df86ccadfd25dc623537d.png)
\ No newline at end of file
diff --git a/fs.img b/fs.img
index de29745c9f5504439984964be74874bd4212a540..b442962c2d18201b0731de3c79b1b82f6c284165 100644
Binary files a/fs.img and b/fs.img differ
diff --git a/kernel/bio.o b/kernel/bio.o
index 00f4a78f374d82862073b91afab1ce3973d26feb..334ac1b714305d11789d03013fc91810b81b8b15 100644
Binary files a/kernel/bio.o and b/kernel/bio.o differ
diff --git a/kernel/console.o b/kernel/console.o
index 0a9df90c433c86481a0a3267e1e11327ada2757d..898ed441a3a702f785db4082225e28216d6f961d 100644
Binary files a/kernel/console.o and b/kernel/console.o differ
diff --git a/kernel/exec.o b/kernel/exec.o
index 9bc725a939075019d9b2fb204a2fbec0ea55b5e9..b476c8f93681b489f20a8dba2a9662a05a4bd5af 100644
Binary files a/kernel/exec.o and b/kernel/exec.o differ
diff --git a/kernel/file.o b/kernel/file.o
index 14f10f4af99b4eec36facbf85ddcebf5b48d0551..4db570ef422bf57ce4ae03a4eb66741a18065b68 100644
Binary files a/kernel/file.o and b/kernel/file.o differ
diff --git a/kernel/fs.o b/kernel/fs.o
index b9f22f29dd175762b105441756278e191da6ca07..575454d78ee892450114a7fd3f568714d710bc47 100644
Binary files a/kernel/fs.o and b/kernel/fs.o differ
diff --git a/kernel/kalloc.o b/kernel/kalloc.o
index a9b0963b22fed77c3078d9397d46c51425c7277f..c397ae20bc58f3c1f9dca80bf9ba7302693daaf5 100644
Binary files a/kernel/kalloc.o and b/kernel/kalloc.o differ
diff --git a/kernel/kernel b/kernel/kernel
index bcce695fe6e2e2801f8f73fc96a638c979040304..e675cfe524d0111e3824e44df09255e20d81304a 100755
Binary files a/kernel/kernel and b/kernel/kernel differ
diff --git a/kernel/kernel.asm b/kernel/kernel.asm
index ca8be4c24c8822eeb89ebbc98757ccb05639ff06..77de5de13a410ad710d0624e2c85d2204b515154 100644
--- a/kernel/kernel.asm
+++ b/kernel/kernel.asm
@@ -82,11 +82,20 @@ Disassembly of section .text:
     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:	f84a                	sd	s2,48(sp)
     800000d8:	0880                	addi	s0,sp,80
+  int i;
+
+  for(i = 0; i < n; i++){
     800000da:	04c05263          	blez	a2,8000011e <consolewrite+0x4e>
     800000de:	fc26                	sd	s1,56(sp)
     800000e0:	f44e                	sd	s3,40(sp)
@@ -96,6 +105,8 @@ Disassembly of section .text:
     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
@@ -103,8 +114,11 @@ Disassembly of section .text:
     800000f6:	fbf40513          	addi	a0,s0,-65
     800000fa:	5b8020ef          	jal	800026b2 <either_copyin>
     800000fe:	03550263          	beq	a0,s5,80000122 <consolewrite+0x52>
+      break;
+    uartputc(c);
     80000102:	fbf44503          	lbu	a0,-65(s0)
     80000106:	035000ef          	jal	8000093a <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>
@@ -120,6 +134,10 @@ Disassembly of section .text:
     80000124:	79a2                	ld	s3,40(sp)
     80000126:	7a02                	ld	s4,32(sp)
     80000128:	6ae2                	ld	s5,24(sp)
+  }
+
+  return i;
+}
     8000012a:	854a                	mv	a0,s2
     8000012c:	60a6                	ld	ra,72(sp)
     8000012e:	6406                	ld	s0,64(sp)
@@ -128,6 +146,12 @@ Disassembly of section .text:
     80000134:	8082                	ret
 
 0000000080000136 <consoleread>:
+// user_dist indicates whether dst is a user
+// or kernel address.
+//
+int
+consoleread(int user_dst, uint64 dst, int n)
+{
     80000136:	711d                	addi	sp,sp,-96
     80000138:	ec86                	sd	ra,88(sp)
     8000013a:	e8a2                	sd	s0,80(sp)
@@ -141,28 +165,51 @@ Disassembly of section .text:
     8000014a:	8aaa                	mv	s5,a0
     8000014c:	8a2e                	mv	s4,a1
     8000014e:	89b2                	mv	s3,a2
+  uint target;
+  int c;
+  char cbuf;
+
+  target = n;
     80000150:	00060b1b          	sext.w	s6,a2
+  acquire(&cons.lock);
     80000154:	00014517          	auipc	a0,0x14
     80000158:	8fc50513          	addi	a0,a0,-1796 # 80013a50 <cons>
     8000015c:	52f000ef          	jal	80000e8a <acquire>
+  while(n > 0){
+    // wait until interrupt handler has put some
+    // input into cons.buffer.
+    while(cons.r == cons.w){
     80000160:	00014497          	auipc	s1,0x14
     80000164:	8f048493          	addi	s1,s1,-1808 # 80013a50 <cons>
+      if(killed(myproc())){
+        release(&cons.lock);
+        return -1;
+      }
+      sleep(&cons.r, &cons.lock);
     80000168:	00014917          	auipc	s2,0x14
     8000016c:	98090913          	addi	s2,s2,-1664 # 80013ae8 <cons+0x98>
+  while(n > 0){
     80000170:	0b305d63          	blez	s3,8000022a <consoleread+0xf4>
+    while(cons.r == cons.w){
     80000174:	0984a783          	lw	a5,152(s1)
     80000178:	09c4a703          	lw	a4,156(s1)
     8000017c:	0af71263          	bne	a4,a5,80000220 <consoleread+0xea>
+      if(killed(myproc())){
     80000180:	33d010ef          	jal	80001cbc <myproc>
     80000184:	3c0020ef          	jal	80002544 <killed>
     80000188:	e12d                	bnez	a0,800001ea <consoleread+0xb4>
+      sleep(&cons.r, &cons.lock);
     8000018a:	85a6                	mv	a1,s1
     8000018c:	854a                	mv	a0,s2
     8000018e:	17e020ef          	jal	8000230c <sleep>
+    while(cons.r == cons.w){
     80000192:	0984a783          	lw	a5,152(s1)
     80000196:	09c4a703          	lw	a4,156(s1)
     8000019a:	fef703e3          	beq	a4,a5,80000180 <consoleread+0x4a>
     8000019e:	ec5e                	sd	s7,24(sp)
+    }
+
+    c = cons.buf[cons.r++ % INPUT_BUF_SIZE];
     800001a0:	00014717          	auipc	a4,0x14
     800001a4:	8b070713          	addi	a4,a4,-1872 # 80013a50 <cons>
     800001a8:	0017869b          	addiw	a3,a5,1
@@ -171,9 +218,18 @@ Disassembly of section .text:
     800001b4:	9736                	add	a4,a4,a3
     800001b6:	01874703          	lbu	a4,24(a4)
     800001ba:	00070b9b          	sext.w	s7,a4
+
+    if(c == C('D')){  // end-of-file
     800001be:	4691                	li	a3,4
     800001c0:	04db8663          	beq	s7,a3,8000020c <consoleread+0xd6>
+      }
+      break;
+    }
+
+    // copy the input byte to the user-space buffer.
+    cbuf = c;
     800001c4:	fae407a3          	sb	a4,-81(s0)
+    if(either_copyout(user_dst, dst, &cbuf, 1) == -1)
     800001c8:	4685                	li	a3,1
     800001ca:	faf40613          	addi	a2,s0,-81
     800001ce:	85d2                	mv	a1,s4
@@ -181,16 +237,30 @@ Disassembly of section .text:
     800001d2:	496020ef          	jal	80002668 <either_copyout>
     800001d6:	57fd                	li	a5,-1
     800001d8:	04f50863          	beq	a0,a5,80000228 <consoleread+0xf2>
+      break;
+
+    dst++;
     800001dc:	0a05                	addi	s4,s4,1
+    --n;
     800001de:	39fd                	addiw	s3,s3,-1
+
+    if(c == '\n'){
     800001e0:	47a9                	li	a5,10
     800001e2:	04fb8d63          	beq	s7,a5,8000023c <consoleread+0x106>
     800001e6:	6be2                	ld	s7,24(sp)
     800001e8:	b761                	j	80000170 <consoleread+0x3a>
+        release(&cons.lock);
     800001ea:	00014517          	auipc	a0,0x14
     800001ee:	86650513          	addi	a0,a0,-1946 # 80013a50 <cons>
     800001f2:	531000ef          	jal	80000f22 <release>
+        return -1;
     800001f6:	557d                	li	a0,-1
+    }
+  }
+  release(&cons.lock);
+
+  return target - n;
+}
     800001f8:	60e6                	ld	ra,88(sp)
     800001fa:	6446                	ld	s0,80(sp)
     800001fc:	64a6                	ld	s1,72(sp)
@@ -201,8 +271,10 @@ Disassembly of section .text:
     80000206:	7b02                	ld	s6,32(sp)
     80000208:	6125                	addi	sp,sp,96
     8000020a:	8082                	ret
+      if(n < target){
     8000020c:	0009871b          	sext.w	a4,s3
     80000210:	01677a63          	bgeu	a4,s6,80000224 <consoleread+0xee>
+        cons.r--;
     80000214:	00014717          	auipc	a4,0x14
     80000218:	8cf72a23          	sw	a5,-1836(a4) # 80013ae8 <cons+0x98>
     8000021c:	6be2                	ld	s7,24(sp)
@@ -212,26 +284,33 @@ Disassembly of section .text:
     80000224:	6be2                	ld	s7,24(sp)
     80000226:	a011                	j	8000022a <consoleread+0xf4>
     80000228:	6be2                	ld	s7,24(sp)
+  release(&cons.lock);
     8000022a:	00014517          	auipc	a0,0x14
     8000022e:	82650513          	addi	a0,a0,-2010 # 80013a50 <cons>
     80000232:	4f1000ef          	jal	80000f22 <release>
+  return target - n;
     80000236:	413b053b          	subw	a0,s6,s3
     8000023a:	bf7d                	j	800001f8 <consoleread+0xc2>
     8000023c:	6be2                	ld	s7,24(sp)
     8000023e:	b7f5                	j	8000022a <consoleread+0xf4>
 
 0000000080000240 <consputc>:
+{
     80000240:	1141                	addi	sp,sp,-16
     80000242:	e406                	sd	ra,8(sp)
     80000244:	e022                	sd	s0,0(sp)
     80000246:	0800                	addi	s0,sp,16
+  if(c == BACKSPACE){
     80000248:	10000793          	li	a5,256
     8000024c:	00f50863          	beq	a0,a5,8000025c <consputc+0x1c>
+    uartputc_sync(c);
     80000250:	604000ef          	jal	80000854 <uartputc_sync>
+}
     80000254:	60a2                	ld	ra,8(sp)
     80000256:	6402                	ld	s0,0(sp)
     80000258:	0141                	addi	sp,sp,16
     8000025a:	8082                	ret
+    uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b');
     8000025c:	4521                	li	a0,8
     8000025e:	5f6000ef          	jal	80000854 <uartputc_sync>
     80000262:	02000513          	li	a0,32
@@ -241,15 +320,24 @@ Disassembly of section .text:
     80000270:	b7d5                	j	80000254 <consputc+0x14>
 
 0000000080000272 <consoleintr>:
+// do erase/kill processing, append to cons.buf,
+// wake up consoleread() if a whole line has arrived.
+//
+void
+consoleintr(int c)
+{
     80000272:	1101                	addi	sp,sp,-32
     80000274:	ec06                	sd	ra,24(sp)
     80000276:	e822                	sd	s0,16(sp)
     80000278:	e426                	sd	s1,8(sp)
     8000027a:	1000                	addi	s0,sp,32
     8000027c:	84aa                	mv	s1,a0
+  acquire(&cons.lock);
     8000027e:	00013517          	auipc	a0,0x13
     80000282:	7d250513          	addi	a0,a0,2002 # 80013a50 <cons>
     80000286:	405000ef          	jal	80000e8a <acquire>
+
+  switch(c){
     8000028a:	47d5                	li	a5,21
     8000028c:	08f48f63          	beq	s1,a5,8000032a <consoleintr+0xb8>
     80000290:	0297c563          	blt	a5,s1,800002ba <consoleintr+0x48>
@@ -257,17 +345,28 @@ Disassembly of section .text:
     80000296:	0ef48463          	beq	s1,a5,8000037e <consoleintr+0x10c>
     8000029a:	47c1                	li	a5,16
     8000029c:	10f49563          	bne	s1,a5,800003a6 <consoleintr+0x134>
+  case C('P'):  // Print process list.
+    procdump();
     800002a0:	45c020ef          	jal	800026fc <procdump>
+      }
+    }
+    break;
+  }
+  
+  release(&cons.lock);
     800002a4:	00013517          	auipc	a0,0x13
     800002a8:	7ac50513          	addi	a0,a0,1964 # 80013a50 <cons>
     800002ac:	477000ef          	jal	80000f22 <release>
+}
     800002b0:	60e2                	ld	ra,24(sp)
     800002b2:	6442                	ld	s0,16(sp)
     800002b4:	64a2                	ld	s1,8(sp)
     800002b6:	6105                	addi	sp,sp,32
     800002b8:	8082                	ret
+  switch(c){
     800002ba:	07f00793          	li	a5,127
     800002be:	0cf48063          	beq	s1,a5,8000037e <consoleintr+0x10c>
+    if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){
     800002c2:	00013717          	auipc	a4,0x13
     800002c6:	78e70713          	addi	a4,a4,1934 # 80013a50 <cons>
     800002ca:	0a072783          	lw	a5,160(a4)
@@ -275,10 +374,13 @@ Disassembly of section .text:
     800002d2:	9f99                	subw	a5,a5,a4
     800002d4:	07f00713          	li	a4,127
     800002d8:	fcf766e3          	bltu	a4,a5,800002a4 <consoleintr+0x32>
+      c = (c == '\r') ? '\n' : c;
     800002dc:	47b5                	li	a5,13
     800002de:	0cf48763          	beq	s1,a5,800003ac <consoleintr+0x13a>
+      consputc(c);
     800002e2:	8526                	mv	a0,s1
     800002e4:	f5dff0ef          	jal	80000240 <consputc>
+      cons.buf[cons.e++ % INPUT_BUF_SIZE] = c;
     800002e8:	00013797          	auipc	a5,0x13
     800002ec:	76878793          	addi	a5,a5,1896 # 80013a50 <cons>
     800002f0:	0a07a683          	lw	a3,160(a5)
@@ -288,6 +390,7 @@ Disassembly of section .text:
     80000300:	07f6f693          	andi	a3,a3,127
     80000304:	97b6                	add	a5,a5,a3
     80000306:	00978c23          	sb	s1,24(a5)
+      if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){
     8000030a:	47a9                	li	a5,10
     8000030c:	0cf48563          	beq	s1,a5,800003d6 <consoleintr+0x164>
     80000310:	4791                	li	a5,4
@@ -299,22 +402,30 @@ Disassembly of section .text:
     80000324:	f8f710e3          	bne	a4,a5,800002a4 <consoleintr+0x32>
     80000328:	a07d                	j	800003d6 <consoleintr+0x164>
     8000032a:	e04a                	sd	s2,0(sp)
+    while(cons.e != cons.w &&
     8000032c:	00013717          	auipc	a4,0x13
     80000330:	72470713          	addi	a4,a4,1828 # 80013a50 <cons>
     80000334:	0a072783          	lw	a5,160(a4)
     80000338:	09c72703          	lw	a4,156(a4)
+          cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){
     8000033c:	00013497          	auipc	s1,0x13
     80000340:	71448493          	addi	s1,s1,1812 # 80013a50 <cons>
+    while(cons.e != cons.w &&
     80000344:	4929                	li	s2,10
     80000346:	02f70863          	beq	a4,a5,80000376 <consoleintr+0x104>
+          cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){
     8000034a:	37fd                	addiw	a5,a5,-1
     8000034c:	07f7f713          	andi	a4,a5,127
     80000350:	9726                	add	a4,a4,s1
+    while(cons.e != cons.w &&
     80000352:	01874703          	lbu	a4,24(a4)
     80000356:	03270263          	beq	a4,s2,8000037a <consoleintr+0x108>
+      cons.e--;
     8000035a:	0af4a023          	sw	a5,160(s1)
+      consputc(BACKSPACE);
     8000035e:	10000513          	li	a0,256
     80000362:	edfff0ef          	jal	80000240 <consputc>
+    while(cons.e != cons.w &&
     80000366:	0a04a783          	lw	a5,160(s1)
     8000036a:	09c4a703          	lw	a4,156(s1)
     8000036e:	fcf71ee3          	bne	a4,a5,8000034a <consoleintr+0xd8>
@@ -324,21 +435,27 @@ Disassembly of section .text:
     80000378:	b735                	j	800002a4 <consoleintr+0x32>
     8000037a:	6902                	ld	s2,0(sp)
     8000037c:	b725                	j	800002a4 <consoleintr+0x32>
+    if(cons.e != cons.w){
     8000037e:	00013717          	auipc	a4,0x13
     80000382:	6d270713          	addi	a4,a4,1746 # 80013a50 <cons>
     80000386:	0a072783          	lw	a5,160(a4)
     8000038a:	09c72703          	lw	a4,156(a4)
     8000038e:	f0f70be3          	beq	a4,a5,800002a4 <consoleintr+0x32>
+      cons.e--;
     80000392:	37fd                	addiw	a5,a5,-1
     80000394:	00013717          	auipc	a4,0x13
     80000398:	74f72e23          	sw	a5,1884(a4) # 80013af0 <cons+0xa0>
+      consputc(BACKSPACE);
     8000039c:	10000513          	li	a0,256
     800003a0:	ea1ff0ef          	jal	80000240 <consputc>
     800003a4:	b701                	j	800002a4 <consoleintr+0x32>
+    if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){
     800003a6:	ee048fe3          	beqz	s1,800002a4 <consoleintr+0x32>
     800003aa:	bf21                	j	800002c2 <consoleintr+0x50>
+      consputc(c);
     800003ac:	4529                	li	a0,10
     800003ae:	e93ff0ef          	jal	80000240 <consputc>
+      cons.buf[cons.e++ % INPUT_BUF_SIZE] = c;
     800003b2:	00013797          	auipc	a5,0x13
     800003b6:	69e78793          	addi	a5,a5,1694 # 80013a50 <cons>
     800003ba:	0a07a703          	lw	a4,160(a5)
@@ -349,47 +466,80 @@ Disassembly of section .text:
     800003ce:	97ba                	add	a5,a5,a4
     800003d0:	4729                	li	a4,10
     800003d2:	00e78c23          	sb	a4,24(a5)
+        cons.w = cons.e;
     800003d6:	00013797          	auipc	a5,0x13
     800003da:	70c7ab23          	sw	a2,1814(a5) # 80013aec <cons+0x9c>
+        wakeup(&cons.r);
     800003de:	00013517          	auipc	a0,0x13
     800003e2:	70a50513          	addi	a0,a0,1802 # 80013ae8 <cons+0x98>
     800003e6:	773010ef          	jal	80002358 <wakeup>
     800003ea:	bd6d                	j	800002a4 <consoleintr+0x32>
 
 00000000800003ec <consoleinit>:
+
+void
+consoleinit(void)
+{
     800003ec:	1141                	addi	sp,sp,-16
     800003ee:	e406                	sd	ra,8(sp)
     800003f0:	e022                	sd	s0,0(sp)
     800003f2:	0800                	addi	s0,sp,16
+  initlock(&cons.lock, "cons");
     800003f4:	00008597          	auipc	a1,0x8
     800003f8:	c0c58593          	addi	a1,a1,-1012 # 80008000 <etext>
     800003fc:	00013517          	auipc	a0,0x13
     80000400:	65450513          	addi	a0,a0,1620 # 80013a50 <cons>
     80000404:	207000ef          	jal	80000e0a <initlock>
+
+  uartinit();
     80000408:	3f4000ef          	jal	800007fc <uartinit>
+
+  // connect read and write system calls
+  // to consoleread and consolewrite.
+  devsw[CONSOLE].read = consoleread;
     8000040c:	0004c797          	auipc	a5,0x4c
     80000410:	49478793          	addi	a5,a5,1172 # 8004c8a0 <devsw>
     80000414:	00000717          	auipc	a4,0x0
     80000418:	d2270713          	addi	a4,a4,-734 # 80000136 <consoleread>
     8000041c:	eb98                	sd	a4,16(a5)
+  devsw[CONSOLE].write = consolewrite;
     8000041e:	00000717          	auipc	a4,0x0
     80000422:	cb270713          	addi	a4,a4,-846 # 800000d0 <consolewrite>
     80000426:	ef98                	sd	a4,24(a5)
+}
     80000428:	60a2                	ld	ra,8(sp)
     8000042a:	6402                	ld	s0,0(sp)
     8000042c:	0141                	addi	sp,sp,16
     8000042e:	8082                	ret
 
 0000000080000430 <printint>:
+
+static char digits[] = "0123456789abcdef";
+
+static void
+printint(long long xx, int base, int sign)
+{
     80000430:	7179                	addi	sp,sp,-48
     80000432:	f406                	sd	ra,40(sp)
     80000434:	f022                	sd	s0,32(sp)
     80000436:	1800                	addi	s0,sp,48
+  char buf[16];
+  int i;
+  unsigned long long x;
+
+  if(sign && (sign = (xx < 0)))
     80000438:	c219                	beqz	a2,8000043e <printint+0xe>
     8000043a:	08054063          	bltz	a0,800004ba <printint+0x8a>
+    x = -xx;
+  else
+    x = xx;
     8000043e:	4881                	li	a7,0
     80000440:	fd040693          	addi	a3,s0,-48
+
+  i = 0;
     80000444:	4781                	li	a5,0
+  do {
+    buf[i++] = digits[x % base];
     80000446:	00009617          	auipc	a2,0x9
     8000044a:	86a60613          	addi	a2,a2,-1942 # 80008cb0 <digits>
     8000044e:	883e                	mv	a6,a5
@@ -398,16 +548,22 @@ Disassembly of section .text:
     80000456:	9732                	add	a4,a4,a2
     80000458:	00074703          	lbu	a4,0(a4)
     8000045c:	00e68023          	sb	a4,0(a3)
+  } while((x /= base) != 0);
     80000460:	872a                	mv	a4,a0
     80000462:	02b55533          	divu	a0,a0,a1
     80000466:	0685                	addi	a3,a3,1
     80000468:	feb773e3          	bgeu	a4,a1,8000044e <printint+0x1e>
+
+  if(sign)
     8000046c:	00088a63          	beqz	a7,80000480 <printint+0x50>
+    buf[i++] = '-';
     80000470:	1781                	addi	a5,a5,-32
     80000472:	97a2                	add	a5,a5,s0
     80000474:	02d00713          	li	a4,45
     80000478:	fee78823          	sb	a4,-16(a5)
     8000047c:	0028079b          	addiw	a5,a6,2
+
+  while(--i >= 0)
     80000480:	02f05963          	blez	a5,800004b2 <printint+0x82>
     80000484:	ec26                	sd	s1,24(sp)
     80000486:	e84a                	sd	s2,16(sp)
@@ -419,21 +575,33 @@ Disassembly of section .text:
     80000498:	1782                	slli	a5,a5,0x20
     8000049a:	9381                	srli	a5,a5,0x20
     8000049c:	40f90933          	sub	s2,s2,a5
+    consputc(buf[i]);
     800004a0:	fff4c503          	lbu	a0,-1(s1)
     800004a4:	d9dff0ef          	jal	80000240 <consputc>
+  while(--i >= 0)
     800004a8:	14fd                	addi	s1,s1,-1
     800004aa:	ff249be3          	bne	s1,s2,800004a0 <printint+0x70>
     800004ae:	64e2                	ld	s1,24(sp)
     800004b0:	6942                	ld	s2,16(sp)
+}
     800004b2:	70a2                	ld	ra,40(sp)
     800004b4:	7402                	ld	s0,32(sp)
     800004b6:	6145                	addi	sp,sp,48
     800004b8:	8082                	ret
+    x = -xx;
     800004ba:	40a00533          	neg	a0,a0
+  if(sign && (sign = (xx < 0)))
     800004be:	4885                	li	a7,1
+    x = -xx;
     800004c0:	b741                	j	80000440 <printint+0x10>
 
 00000000800004c2 <printf>:
+}
+
+// Print to the console.
+int
+printf(char *fmt, ...)
+{
     800004c2:	7155                	addi	sp,sp,-208
     800004c4:	e506                	sd	ra,136(sp)
     800004c6:	e122                	sd	s0,128(sp)
@@ -447,12 +615,22 @@ Disassembly of section .text:
     800004d6:	f41c                	sd	a5,40(s0)
     800004d8:	03043823          	sd	a6,48(s0)
     800004dc:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+  int i, cx, c0, c1, c2, locking;
+  char *s;
+
+  locking = pr.locking;
     800004e0:	00013797          	auipc	a5,0x13
     800004e4:	6307a783          	lw	a5,1584(a5) # 80013b10 <pr+0x18>
     800004e8:	f6f43c23          	sd	a5,-136(s0)
+  if(locking)
     800004ec:	e3a1                	bnez	a5,8000052c <printf+0x6a>
+    acquire(&pr.lock);
+
+  va_start(ap, fmt);
     800004ee:	00840793          	addi	a5,s0,8
     800004f2:	f8f43423          	sd	a5,-120(s0)
+  for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){
     800004f6:	00054503          	lbu	a0,0(a0)
     800004fa:	26050763          	beqz	a0,80000768 <printf+0x2a6>
     800004fe:	fca6                	sd	s1,120(sp)
@@ -465,50 +643,109 @@ Disassembly of section .text:
     8000050c:	f86a                	sd	s10,48(sp)
     8000050e:	f46e                	sd	s11,40(sp)
     80000510:	4981                	li	s3,0
+    if(cx != '%'){
     80000512:	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'){
     80000516:	06400b13          	li	s6,100
+      printint(va_arg(ap, int), 10, 1);
+    } else if(c0 == 'l' && c1 == 'd'){
     8000051a:	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'){
     8000051e:	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'){
     80000522:	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'){
     80000526:	07000d93          	li	s11,112
     8000052a:	a815                	j	8000055e <printf+0x9c>
+    acquire(&pr.lock);
     8000052c:	00013517          	auipc	a0,0x13
     80000530:	5cc50513          	addi	a0,a0,1484 # 80013af8 <pr>
     80000534:	157000ef          	jal	80000e8a <acquire>
+  va_start(ap, fmt);
     80000538:	00840793          	addi	a5,s0,8
     8000053c:	f8f43423          	sd	a5,-120(s0)
+  for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){
     80000540:	000a4503          	lbu	a0,0(s4)
     80000544:	fd4d                	bnez	a0,800004fe <printf+0x3c>
     80000546:	a481                	j	80000786 <printf+0x2c4>
+      consputc(cx);
     80000548:	cf9ff0ef          	jal	80000240 <consputc>
+      continue;
     8000054c:	84ce                	mv	s1,s3
+  for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){
     8000054e:	0014899b          	addiw	s3,s1,1
     80000552:	013a07b3          	add	a5,s4,s3
     80000556:	0007c503          	lbu	a0,0(a5)
     8000055a:	1e050b63          	beqz	a0,80000750 <printf+0x28e>
+    if(cx != '%'){
     8000055e:	ff5515e3          	bne	a0,s5,80000548 <printf+0x86>
+    i++;
     80000562:	0019849b          	addiw	s1,s3,1
+    c0 = fmt[i+0] & 0xff;
     80000566:	009a07b3          	add	a5,s4,s1
     8000056a:	0007c903          	lbu	s2,0(a5)
+    if(c0) c1 = fmt[i+1] & 0xff;
     8000056e:	1e090163          	beqz	s2,80000750 <printf+0x28e>
     80000572:	0017c783          	lbu	a5,1(a5)
+    c1 = c2 = 0;
     80000576:	86be                	mv	a3,a5
+    if(c1) c2 = fmt[i+2] & 0xff;
     80000578:	c789                	beqz	a5,80000582 <printf+0xc0>
     8000057a:	009a0733          	add	a4,s4,s1
     8000057e:	00274683          	lbu	a3,2(a4)
+    if(c0 == 'd'){
     80000582:	03690763          	beq	s2,s6,800005b0 <printf+0xee>
+    } else if(c0 == 'l' && c1 == 'd'){
     80000586:	05890163          	beq	s2,s8,800005c8 <printf+0x106>
+    } else if(c0 == 'u'){
     8000058a:	0d990b63          	beq	s2,s9,80000660 <printf+0x19e>
+    } else if(c0 == 'x'){
     8000058e:	13a90163          	beq	s2,s10,800006b0 <printf+0x1ee>
+    } else if(c0 == 'p'){
     80000592:	13b90b63          	beq	s2,s11,800006c8 <printf+0x206>
+      printptr(va_arg(ap, uint64));
+    } else if(c0 == 's'){
     80000596:	07300793          	li	a5,115
     8000059a:	16f90a63          	beq	s2,a5,8000070e <printf+0x24c>
+      if((s = va_arg(ap, char*)) == 0)
+        s = "(null)";
+      for(; *s; s++)
+        consputc(*s);
+    } else if(c0 == '%'){
     8000059e:	1b590463          	beq	s2,s5,80000746 <printf+0x284>
+      consputc('%');
+    } else if(c0 == 0){
+      break;
+    } else {
+      // Print unknown % sequence to draw attention.
+      consputc('%');
     800005a2:	8556                	mv	a0,s5
     800005a4:	c9dff0ef          	jal	80000240 <consputc>
+      consputc(c0);
     800005a8:	854a                	mv	a0,s2
     800005aa:	c97ff0ef          	jal	80000240 <consputc>
     800005ae:	b745                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, int), 10, 1);
     800005b0:	f8843783          	ld	a5,-120(s0)
     800005b4:	00878713          	addi	a4,a5,8
     800005b8:	f8e43423          	sd	a4,-120(s0)
@@ -517,10 +754,15 @@ Disassembly of section .text:
     800005c0:	4388                	lw	a0,0(a5)
     800005c2:	e6fff0ef          	jal	80000430 <printint>
     800005c6:	b761                	j	8000054e <printf+0x8c>
+    } else if(c0 == 'l' && c1 == 'd'){
     800005c8:	03678663          	beq	a5,s6,800005f4 <printf+0x132>
+    } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
     800005cc:	05878263          	beq	a5,s8,80000610 <printf+0x14e>
+    } else if(c0 == 'l' && c1 == 'u'){
     800005d0:	0b978463          	beq	a5,s9,80000678 <printf+0x1b6>
+    } else if(c0 == 'l' && c1 == 'x'){
     800005d4:	fda797e3          	bne	a5,s10,800005a2 <printf+0xe0>
+      printint(va_arg(ap, uint64), 16, 0);
     800005d8:	f8843783          	ld	a5,-120(s0)
     800005dc:	00878713          	addi	a4,a5,8
     800005e0:	f8e43423          	sd	a4,-120(s0)
@@ -528,8 +770,10 @@ Disassembly of section .text:
     800005e6:	45c1                	li	a1,16
     800005e8:	6388                	ld	a0,0(a5)
     800005ea:	e47ff0ef          	jal	80000430 <printint>
+      i += 1;
     800005ee:	0029849b          	addiw	s1,s3,2
     800005f2:	bfb1                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, uint64), 10, 1);
     800005f4:	f8843783          	ld	a5,-120(s0)
     800005f8:	00878713          	addi	a4,a5,8
     800005fc:	f8e43423          	sd	a4,-120(s0)
@@ -537,14 +781,19 @@ Disassembly of section .text:
     80000602:	45a9                	li	a1,10
     80000604:	6388                	ld	a0,0(a5)
     80000606:	e2bff0ef          	jal	80000430 <printint>
+      i += 1;
     8000060a:	0029849b          	addiw	s1,s3,2
     8000060e:	b781                	j	8000054e <printf+0x8c>
+    } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
     80000610:	06400793          	li	a5,100
     80000614:	02f68863          	beq	a3,a5,80000644 <printf+0x182>
+    } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
     80000618:	07500793          	li	a5,117
     8000061c:	06f68c63          	beq	a3,a5,80000694 <printf+0x1d2>
+    } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
     80000620:	07800793          	li	a5,120
     80000624:	f6f69fe3          	bne	a3,a5,800005a2 <printf+0xe0>
+      printint(va_arg(ap, uint64), 16, 0);
     80000628:	f8843783          	ld	a5,-120(s0)
     8000062c:	00878713          	addi	a4,a5,8
     80000630:	f8e43423          	sd	a4,-120(s0)
@@ -552,8 +801,10 @@ Disassembly of section .text:
     80000636:	45c1                	li	a1,16
     80000638:	6388                	ld	a0,0(a5)
     8000063a:	df7ff0ef          	jal	80000430 <printint>
+      i += 2;
     8000063e:	0039849b          	addiw	s1,s3,3
     80000642:	b731                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, uint64), 10, 1);
     80000644:	f8843783          	ld	a5,-120(s0)
     80000648:	00878713          	addi	a4,a5,8
     8000064c:	f8e43423          	sd	a4,-120(s0)
@@ -561,8 +812,10 @@ Disassembly of section .text:
     80000652:	45a9                	li	a1,10
     80000654:	6388                	ld	a0,0(a5)
     80000656:	ddbff0ef          	jal	80000430 <printint>
+      i += 2;
     8000065a:	0039849b          	addiw	s1,s3,3
     8000065e:	bdc5                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, int), 10, 0);
     80000660:	f8843783          	ld	a5,-120(s0)
     80000664:	00878713          	addi	a4,a5,8
     80000668:	f8e43423          	sd	a4,-120(s0)
@@ -571,6 +824,7 @@ Disassembly of section .text:
     80000670:	4388                	lw	a0,0(a5)
     80000672:	dbfff0ef          	jal	80000430 <printint>
     80000676:	bde1                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, uint64), 10, 0);
     80000678:	f8843783          	ld	a5,-120(s0)
     8000067c:	00878713          	addi	a4,a5,8
     80000680:	f8e43423          	sd	a4,-120(s0)
@@ -578,8 +832,10 @@ Disassembly of section .text:
     80000686:	45a9                	li	a1,10
     80000688:	6388                	ld	a0,0(a5)
     8000068a:	da7ff0ef          	jal	80000430 <printint>
+      i += 1;
     8000068e:	0029849b          	addiw	s1,s3,2
     80000692:	bd75                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, uint64), 10, 0);
     80000694:	f8843783          	ld	a5,-120(s0)
     80000698:	00878713          	addi	a4,a5,8
     8000069c:	f8e43423          	sd	a4,-120(s0)
@@ -587,8 +843,10 @@ Disassembly of section .text:
     800006a2:	45a9                	li	a1,10
     800006a4:	6388                	ld	a0,0(a5)
     800006a6:	d8bff0ef          	jal	80000430 <printint>
+      i += 2;
     800006aa:	0039849b          	addiw	s1,s3,3
     800006ae:	b545                	j	8000054e <printf+0x8c>
+      printint(va_arg(ap, int), 16, 0);
     800006b0:	f8843783          	ld	a5,-120(s0)
     800006b4:	00878713          	addi	a4,a5,8
     800006b8:	f8e43423          	sd	a4,-120(s0)
@@ -598,45 +856,63 @@ Disassembly of section .text:
     800006c2:	d6fff0ef          	jal	80000430 <printint>
     800006c6:	b561                	j	8000054e <printf+0x8c>
     800006c8:	e4de                	sd	s7,72(sp)
+      printptr(va_arg(ap, uint64));
     800006ca:	f8843783          	ld	a5,-120(s0)
     800006ce:	00878713          	addi	a4,a5,8
     800006d2:	f8e43423          	sd	a4,-120(s0)
     800006d6:	0007b983          	ld	s3,0(a5)
+  consputc('0');
     800006da:	03000513          	li	a0,48
     800006de:	b63ff0ef          	jal	80000240 <consputc>
+  consputc('x');
     800006e2:	07800513          	li	a0,120
     800006e6:	b5bff0ef          	jal	80000240 <consputc>
     800006ea:	4941                	li	s2,16
+    consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
     800006ec:	00008b97          	auipc	s7,0x8
     800006f0:	5c4b8b93          	addi	s7,s7,1476 # 80008cb0 <digits>
     800006f4:	03c9d793          	srli	a5,s3,0x3c
     800006f8:	97de                	add	a5,a5,s7
     800006fa:	0007c503          	lbu	a0,0(a5)
     800006fe:	b43ff0ef          	jal	80000240 <consputc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
     80000702:	0992                	slli	s3,s3,0x4
     80000704:	397d                	addiw	s2,s2,-1
     80000706:	fe0917e3          	bnez	s2,800006f4 <printf+0x232>
     8000070a:	6ba6                	ld	s7,72(sp)
     8000070c:	b589                	j	8000054e <printf+0x8c>
+      if((s = va_arg(ap, char*)) == 0)
     8000070e:	f8843783          	ld	a5,-120(s0)
     80000712:	00878713          	addi	a4,a5,8
     80000716:	f8e43423          	sd	a4,-120(s0)
     8000071a:	0007b903          	ld	s2,0(a5)
     8000071e:	00090d63          	beqz	s2,80000738 <printf+0x276>
+      for(; *s; s++)
     80000722:	00094503          	lbu	a0,0(s2)
     80000726:	e20504e3          	beqz	a0,8000054e <printf+0x8c>
+        consputc(*s);
     8000072a:	b17ff0ef          	jal	80000240 <consputc>
+      for(; *s; s++)
     8000072e:	0905                	addi	s2,s2,1
     80000730:	00094503          	lbu	a0,0(s2)
     80000734:	f97d                	bnez	a0,8000072a <printf+0x268>
     80000736:	bd21                	j	8000054e <printf+0x8c>
+        s = "(null)";
     80000738:	00008917          	auipc	s2,0x8
     8000073c:	8d090913          	addi	s2,s2,-1840 # 80008008 <etext+0x8>
+      for(; *s; s++)
     80000740:	02800513          	li	a0,40
     80000744:	b7dd                	j	8000072a <printf+0x268>
+      consputc('%');
     80000746:	02500513          	li	a0,37
     8000074a:	af7ff0ef          	jal	80000240 <consputc>
     8000074e:	b501                	j	8000054e <printf+0x8c>
+    }
+#endif
+  }
+  va_end(ap);
+
+  if(locking)
     80000750:	f7843783          	ld	a5,-136(s0)
     80000754:	e385                	bnez	a5,80000774 <printf+0x2b2>
     80000756:	74e6                	ld	s1,120(sp)
@@ -648,6 +924,10 @@ Disassembly of section .text:
     80000762:	7ce2                	ld	s9,56(sp)
     80000764:	7d42                	ld	s10,48(sp)
     80000766:	7da2                	ld	s11,40(sp)
+    release(&pr.lock);
+
+  return 0;
+}
     80000768:	4501                	li	a0,0
     8000076a:	60aa                	ld	ra,136(sp)
     8000076c:	640a                	ld	s0,128(sp)
@@ -663,46 +943,65 @@ Disassembly of section .text:
     80000780:	7ce2                	ld	s9,56(sp)
     80000782:	7d42                	ld	s10,48(sp)
     80000784:	7da2                	ld	s11,40(sp)
+    release(&pr.lock);
     80000786:	00013517          	auipc	a0,0x13
     8000078a:	37250513          	addi	a0,a0,882 # 80013af8 <pr>
     8000078e:	794000ef          	jal	80000f22 <release>
     80000792:	bfd9                	j	80000768 <printf+0x2a6>
 
 0000000080000794 <panic>:
+
+void
+panic(char *s)
+{
     80000794:	1101                	addi	sp,sp,-32
     80000796:	ec06                	sd	ra,24(sp)
     80000798:	e822                	sd	s0,16(sp)
     8000079a:	e426                	sd	s1,8(sp)
     8000079c:	1000                	addi	s0,sp,32
     8000079e:	84aa                	mv	s1,a0
+  pr.locking = 0;
     800007a0:	00013797          	auipc	a5,0x13
     800007a4:	3607a823          	sw	zero,880(a5) # 80013b10 <pr+0x18>
+  printf("panic: ");
     800007a8:	00008517          	auipc	a0,0x8
     800007ac:	87050513          	addi	a0,a0,-1936 # 80008018 <etext+0x18>
     800007b0:	d13ff0ef          	jal	800004c2 <printf>
+  printf("%s\n", s);
     800007b4:	85a6                	mv	a1,s1
     800007b6:	00008517          	auipc	a0,0x8
     800007ba:	86a50513          	addi	a0,a0,-1942 # 80008020 <etext+0x20>
     800007be:	d05ff0ef          	jal	800004c2 <printf>
+  panicked = 1; // freeze uart output from other CPUs
     800007c2:	4785                	li	a5,1
     800007c4:	0000b717          	auipc	a4,0xb
     800007c8:	24f72623          	sw	a5,588(a4) # 8000ba10 <panicked>
+  for(;;)
     800007cc:	a001                	j	800007cc <panic+0x38>
 
 00000000800007ce <printfinit>:
+    ;
+}
+
+void
+printfinit(void)
+{
     800007ce:	1101                	addi	sp,sp,-32
     800007d0:	ec06                	sd	ra,24(sp)
     800007d2:	e822                	sd	s0,16(sp)
     800007d4:	e426                	sd	s1,8(sp)
     800007d6:	1000                	addi	s0,sp,32
+  initlock(&pr.lock, "pr");
     800007d8:	00013497          	auipc	s1,0x13
     800007dc:	32048493          	addi	s1,s1,800 # 80013af8 <pr>
     800007e0:	00008597          	auipc	a1,0x8
     800007e4:	84858593          	addi	a1,a1,-1976 # 80008028 <etext+0x28>
     800007e8:	8526                	mv	a0,s1
     800007ea:	620000ef          	jal	80000e0a <initlock>
+  pr.locking = 1;
     800007ee:	4785                	li	a5,1
     800007f0:	cc9c                	sw	a5,24(s1)
+}
     800007f2:	60e2                	ld	ra,24(sp)
     800007f4:	6442                	ld	s0,16(sp)
     800007f6:	64a2                	ld	s1,8(sp)
@@ -710,125 +1009,67 @@ Disassembly of section .text:
     800007fa:	8082                	ret
 
 00000000800007fc <uartinit>:
-
-void uartstart();
-
-void
-uartinit(void)
-{
     800007fc:	1141                	addi	sp,sp,-16
     800007fe:	e406                	sd	ra,8(sp)
     80000800:	e022                	sd	s0,0(sp)
     80000802:	0800                	addi	s0,sp,16
-  // disable interrupts.
-  WriteReg(IER, 0x00);
     80000804:	100007b7          	lui	a5,0x10000
     80000808:	000780a3          	sb	zero,1(a5) # 10000001 <_entry-0x6fffffff>
-
-  // special mode to set baud rate.
-  WriteReg(LCR, LCR_BAUD_LATCH);
     8000080c:	10000737          	lui	a4,0x10000
     80000810:	f8000693          	li	a3,-128
     80000814:	00d701a3          	sb	a3,3(a4) # 10000003 <_entry-0x6ffffffd>
-
-  // LSB for baud rate of 38.4K.
-  WriteReg(0, 0x03);
     80000818:	468d                	li	a3,3
     8000081a:	10000637          	lui	a2,0x10000
     8000081e:	00d60023          	sb	a3,0(a2) # 10000000 <_entry-0x70000000>
-
-  // MSB for baud rate of 38.4K.
-  WriteReg(1, 0x00);
     80000822:	000780a3          	sb	zero,1(a5)
-
-  // leave set-baud mode,
-  // and set word length to 8 bits, no parity.
-  WriteReg(LCR, LCR_EIGHT_BITS);
     80000826:	00d701a3          	sb	a3,3(a4)
-
-  // reset and enable FIFOs.
-  WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR);
     8000082a:	10000737          	lui	a4,0x10000
     8000082e:	461d                	li	a2,7
     80000830:	00c70123          	sb	a2,2(a4) # 10000002 <_entry-0x6ffffffe>
-
-  // enable transmit and receive interrupts.
-  WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE);
     80000834:	00d780a3          	sb	a3,1(a5)
-
-  initlock(&uart_tx_lock, "uart");
     80000838:	00007597          	auipc	a1,0x7
     8000083c:	7f858593          	addi	a1,a1,2040 # 80008030 <etext+0x30>
     80000840:	00013517          	auipc	a0,0x13
     80000844:	2d850513          	addi	a0,a0,728 # 80013b18 <uart_tx_lock>
     80000848:	5c2000ef          	jal	80000e0a <initlock>
-}
     8000084c:	60a2                	ld	ra,8(sp)
     8000084e:	6402                	ld	s0,0(sp)
     80000850:	0141                	addi	sp,sp,16
     80000852:	8082                	ret
 
 0000000080000854 <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)
-{
     80000854:	1101                	addi	sp,sp,-32
     80000856:	ec06                	sd	ra,24(sp)
     80000858:	e822                	sd	s0,16(sp)
     8000085a:	e426                	sd	s1,8(sp)
     8000085c:	1000                	addi	s0,sp,32
     8000085e:	84aa                	mv	s1,a0
-  push_off();
     80000860:	5ea000ef          	jal	80000e4a <push_off>
-
-  if(panicked){
     80000864:	0000b797          	auipc	a5,0xb
     80000868:	1ac7a783          	lw	a5,428(a5) # 8000ba10 <panicked>
     8000086c:	e795                	bnez	a5,80000898 <uartputc_sync+0x44>
-    for(;;)
-      ;
-  }
-
-  // wait for Transmit Holding Empty to be set in LSR.
-  while((ReadReg(LSR) & LSR_TX_IDLE) == 0)
     8000086e:	10000737          	lui	a4,0x10000
     80000872:	0715                	addi	a4,a4,5 # 10000005 <_entry-0x6ffffffb>
     80000874:	00074783          	lbu	a5,0(a4)
     80000878:	0207f793          	andi	a5,a5,32
     8000087c:	dfe5                	beqz	a5,80000874 <uartputc_sync+0x20>
-    ;
-  WriteReg(THR, c);
     8000087e:	0ff4f513          	zext.b	a0,s1
     80000882:	100007b7          	lui	a5,0x10000
     80000886:	00a78023          	sb	a0,0(a5) # 10000000 <_entry-0x70000000>
-
-  pop_off();
     8000088a:	644000ef          	jal	80000ece <pop_off>
-}
     8000088e:	60e2                	ld	ra,24(sp)
     80000890:	6442                	ld	s0,16(sp)
     80000892:	64a2                	ld	s1,8(sp)
     80000894:	6105                	addi	sp,sp,32
     80000896:	8082                	ret
-    for(;;)
     80000898:	a001                	j	80000898 <uartputc_sync+0x44>
 
 000000008000089a <uartstart>:
-// called from both the top- and bottom-half.
-void
-uartstart()
-{
-  while(1){
-    if(uart_tx_w == uart_tx_r){
     8000089a:	0000b797          	auipc	a5,0xb
     8000089e:	17e7b783          	ld	a5,382(a5) # 8000ba18 <uart_tx_r>
     800008a2:	0000b717          	auipc	a4,0xb
     800008a6:	17e73703          	ld	a4,382(a4) # 8000ba20 <uart_tx_w>
     800008aa:	08f70263          	beq	a4,a5,8000092e <uartstart+0x94>
-{
     800008ae:	7139                	addi	sp,sp,-64
     800008b0:	fc06                	sd	ra,56(sp)
     800008b2:	f822                	sd	s0,48(sp)
@@ -839,60 +1080,32 @@ uartstart()
     800008bc:	e456                	sd	s5,8(sp)
     800008be:	e05a                	sd	s6,0(sp)
     800008c0:	0080                	addi	s0,sp,64
-      // transmit buffer is empty.
-      ReadReg(ISR);
-      return;
-    }
-    
-    if((ReadReg(LSR) & LSR_TX_IDLE) == 0){
     800008c2:	10000937          	lui	s2,0x10000
     800008c6:	0915                	addi	s2,s2,5 # 10000005 <_entry-0x6ffffffb>
-      // 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];
     800008c8:	00013a97          	auipc	s5,0x13
     800008cc:	250a8a93          	addi	s5,s5,592 # 80013b18 <uart_tx_lock>
-    uart_tx_r += 1;
     800008d0:	0000b497          	auipc	s1,0xb
     800008d4:	14848493          	addi	s1,s1,328 # 8000ba18 <uart_tx_r>
-    
-    // maybe uartputc() is waiting for space in the buffer.
-    wakeup(&uart_tx_r);
-    
-    WriteReg(THR, c);
     800008d8:	10000a37          	lui	s4,0x10000
-    if(uart_tx_w == uart_tx_r){
     800008dc:	0000b997          	auipc	s3,0xb
     800008e0:	14498993          	addi	s3,s3,324 # 8000ba20 <uart_tx_w>
-    if((ReadReg(LSR) & LSR_TX_IDLE) == 0){
     800008e4:	00094703          	lbu	a4,0(s2)
     800008e8:	02077713          	andi	a4,a4,32
     800008ec:	c71d                	beqz	a4,8000091a <uartstart+0x80>
-    int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE];
     800008ee:	01f7f713          	andi	a4,a5,31
     800008f2:	9756                	add	a4,a4,s5
     800008f4:	01874b03          	lbu	s6,24(a4)
-    uart_tx_r += 1;
     800008f8:	0785                	addi	a5,a5,1
     800008fa:	e09c                	sd	a5,0(s1)
-    wakeup(&uart_tx_r);
     800008fc:	8526                	mv	a0,s1
     800008fe:	25b010ef          	jal	80002358 <wakeup>
-    WriteReg(THR, c);
     80000902:	016a0023          	sb	s6,0(s4) # 10000000 <_entry-0x70000000>
-    if(uart_tx_w == uart_tx_r){
     80000906:	609c                	ld	a5,0(s1)
     80000908:	0009b703          	ld	a4,0(s3)
     8000090c:	fcf71ce3          	bne	a4,a5,800008e4 <uartstart+0x4a>
-      ReadReg(ISR);
     80000910:	100007b7          	lui	a5,0x10000
     80000914:	0789                	addi	a5,a5,2 # 10000002 <_entry-0x6ffffffe>
     80000916:	0007c783          	lbu	a5,0(a5)
-  }
-}
     8000091a:	70e2                	ld	ra,56(sp)
     8000091c:	7442                	ld	s0,48(sp)
     8000091e:	74a2                	ld	s1,40(sp)
@@ -903,15 +1116,12 @@ uartstart()
     80000928:	6b02                	ld	s6,0(sp)
     8000092a:	6121                	addi	sp,sp,64
     8000092c:	8082                	ret
-      ReadReg(ISR);
     8000092e:	100007b7          	lui	a5,0x10000
     80000932:	0789                	addi	a5,a5,2 # 10000002 <_entry-0x6ffffffe>
     80000934:	0007c783          	lbu	a5,0(a5)
-      return;
     80000938:	8082                	ret
 
 000000008000093a <uartputc>:
-{
     8000093a:	7179                	addi	sp,sp,-48
     8000093c:	f406                	sd	ra,40(sp)
     8000093e:	f022                	sd	s0,32(sp)
@@ -921,54 +1131,42 @@ uartstart()
     80000946:	e052                	sd	s4,0(sp)
     80000948:	1800                	addi	s0,sp,48
     8000094a:	8a2a                	mv	s4,a0
-  acquire(&uart_tx_lock);
     8000094c:	00013517          	auipc	a0,0x13
     80000950:	1cc50513          	addi	a0,a0,460 # 80013b18 <uart_tx_lock>
     80000954:	536000ef          	jal	80000e8a <acquire>
-  if(panicked){
     80000958:	0000b797          	auipc	a5,0xb
     8000095c:	0b87a783          	lw	a5,184(a5) # 8000ba10 <panicked>
     80000960:	efbd                	bnez	a5,800009de <uartputc+0xa4>
-  while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){
     80000962:	0000b717          	auipc	a4,0xb
     80000966:	0be73703          	ld	a4,190(a4) # 8000ba20 <uart_tx_w>
     8000096a:	0000b797          	auipc	a5,0xb
     8000096e:	0ae7b783          	ld	a5,174(a5) # 8000ba18 <uart_tx_r>
     80000972:	02078793          	addi	a5,a5,32
-    sleep(&uart_tx_r, &uart_tx_lock);
     80000976:	00013997          	auipc	s3,0x13
     8000097a:	1a298993          	addi	s3,s3,418 # 80013b18 <uart_tx_lock>
     8000097e:	0000b497          	auipc	s1,0xb
     80000982:	09a48493          	addi	s1,s1,154 # 8000ba18 <uart_tx_r>
-  while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){
     80000986:	0000b917          	auipc	s2,0xb
     8000098a:	09a90913          	addi	s2,s2,154 # 8000ba20 <uart_tx_w>
     8000098e:	00e79d63          	bne	a5,a4,800009a8 <uartputc+0x6e>
-    sleep(&uart_tx_r, &uart_tx_lock);
     80000992:	85ce                	mv	a1,s3
     80000994:	8526                	mv	a0,s1
     80000996:	177010ef          	jal	8000230c <sleep>
-  while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){
     8000099a:	00093703          	ld	a4,0(s2)
     8000099e:	609c                	ld	a5,0(s1)
     800009a0:	02078793          	addi	a5,a5,32
     800009a4:	fee787e3          	beq	a5,a4,80000992 <uartputc+0x58>
-  uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE] = c;
     800009a8:	00013497          	auipc	s1,0x13
     800009ac:	17048493          	addi	s1,s1,368 # 80013b18 <uart_tx_lock>
     800009b0:	01f77793          	andi	a5,a4,31
     800009b4:	97a6                	add	a5,a5,s1
     800009b6:	01478c23          	sb	s4,24(a5)
-  uart_tx_w += 1;
     800009ba:	0705                	addi	a4,a4,1
     800009bc:	0000b797          	auipc	a5,0xb
     800009c0:	06e7b223          	sd	a4,100(a5) # 8000ba20 <uart_tx_w>
-  uartstart();
     800009c4:	ed7ff0ef          	jal	8000089a <uartstart>
-  release(&uart_tx_lock);
     800009c8:	8526                	mv	a0,s1
     800009ca:	558000ef          	jal	80000f22 <release>
-}
     800009ce:	70a2                	ld	ra,40(sp)
     800009d0:	7402                	ld	s0,32(sp)
     800009d2:	64e2                	ld	s1,24(sp)
@@ -977,79 +1175,43 @@ uartstart()
     800009d8:	6a02                	ld	s4,0(sp)
     800009da:	6145                	addi	sp,sp,48
     800009dc:	8082                	ret
-    for(;;)
     800009de:	a001                	j	800009de <uartputc+0xa4>
 
 00000000800009e0 <uartgetc>:
-
-// read one input character from the UART.
-// return -1 if none is waiting.
-int
-uartgetc(void)
-{
     800009e0:	1141                	addi	sp,sp,-16
     800009e2:	e422                	sd	s0,8(sp)
     800009e4:	0800                	addi	s0,sp,16
-  if(ReadReg(LSR) & 0x01){
     800009e6:	100007b7          	lui	a5,0x10000
     800009ea:	0795                	addi	a5,a5,5 # 10000005 <_entry-0x6ffffffb>
     800009ec:	0007c783          	lbu	a5,0(a5)
     800009f0:	8b85                	andi	a5,a5,1
     800009f2:	cb81                	beqz	a5,80000a02 <uartgetc+0x22>
-    // input data is ready.
-    return ReadReg(RHR);
     800009f4:	100007b7          	lui	a5,0x10000
     800009f8:	0007c503          	lbu	a0,0(a5) # 10000000 <_entry-0x70000000>
-  } else {
-    return -1;
-  }
-}
     800009fc:	6422                	ld	s0,8(sp)
     800009fe:	0141                	addi	sp,sp,16
     80000a00:	8082                	ret
-    return -1;
     80000a02:	557d                	li	a0,-1
     80000a04:	bfe5                	j	800009fc <uartgetc+0x1c>
 
 0000000080000a06 <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)
-{
     80000a06:	1101                	addi	sp,sp,-32
     80000a08:	ec06                	sd	ra,24(sp)
     80000a0a:	e822                	sd	s0,16(sp)
     80000a0c:	e426                	sd	s1,8(sp)
     80000a0e:	1000                	addi	s0,sp,32
-  // read and process incoming characters.
-  while(1){
-    int c = uartgetc();
-    if(c == -1)
     80000a10:	54fd                	li	s1,-1
     80000a12:	a019                	j	80000a18 <uartintr+0x12>
-      break;
-    consoleintr(c);
     80000a14:	85fff0ef          	jal	80000272 <consoleintr>
-    int c = uartgetc();
     80000a18:	fc9ff0ef          	jal	800009e0 <uartgetc>
-    if(c == -1)
     80000a1c:	fe951ce3          	bne	a0,s1,80000a14 <uartintr+0xe>
-  }
-
-  // send buffered characters.
-  acquire(&uart_tx_lock);
     80000a20:	00013497          	auipc	s1,0x13
     80000a24:	0f848493          	addi	s1,s1,248 # 80013b18 <uart_tx_lock>
     80000a28:	8526                	mv	a0,s1
     80000a2a:	460000ef          	jal	80000e8a <acquire>
-  uartstart();
     80000a2e:	e6dff0ef          	jal	8000089a <uartstart>
-  release(&uart_tx_lock);
     80000a32:	8526                	mv	a0,s1
     80000a34:	4ee000ef          	jal	80000f22 <release>
-}
     80000a38:	60e2                	ld	ra,24(sp)
     80000a3a:	6442                	ld	s0,16(sp)
     80000a3c:	64a2                	ld	s1,8(sp)
@@ -1057,17 +1219,31 @@ uartintr(void)
     80000a40:	8082                	ret
 
 0000000080000a42 <getRefIdx>:
+struct spinlock ref_lock;  // 别忘了锁
+int pm_ref[(PHYSTOP - KERNBASE)/PGSIZE];  // 记录物理页的引用计数
+
+// va映射为idx
+uint64
+getRefIdx(uint64 pa){
     80000a42:	1141                	addi	sp,sp,-16
     80000a44:	e422                	sd	s0,8(sp)
     80000a46:	0800                	addi	s0,sp,16
+  return (pa-KERNBASE)/PGSIZE;
     80000a48:	800007b7          	lui	a5,0x80000
     80000a4c:	953e                	add	a0,a0,a5
+}
     80000a4e:	8131                	srli	a0,a0,0xc
     80000a50:	6422                	ld	s0,8(sp)
     80000a52:	0141                	addi	sp,sp,16
     80000a54:	8082                	ret
 
 0000000080000a56 <refup>:
+  struct run *freelist;
+} kmem[NCPU]; // NCPU 在 param.h 中定义,表示 CPU 的数量
+
+//myos add
+void
+refup(void* pa){
     80000a56:	1101                	addi	sp,sp,-32
     80000a58:	ec06                	sd	ra,24(sp)
     80000a5a:	e822                	sd	s0,16(sp)
@@ -1075,13 +1251,16 @@ uartintr(void)
     80000a5e:	e04a                	sd	s2,0(sp)
     80000a60:	1000                	addi	s0,sp,32
     80000a62:	84aa                	mv	s1,a0
+  acquire(&ref_lock);
     80000a64:	00013917          	auipc	s2,0x13
     80000a68:	0ec90913          	addi	s2,s2,236 # 80013b50 <ref_lock>
     80000a6c:	854a                	mv	a0,s2
     80000a6e:	41c000ef          	jal	80000e8a <acquire>
+  return (pa-KERNBASE)/PGSIZE;
     80000a72:	800007b7          	lui	a5,0x80000
     80000a76:	94be                	add	s1,s1,a5
     80000a78:	80b1                	srli	s1,s1,0xc
+  pm_ref[getRefIdx((uint64)pa)] ++;
     80000a7a:	048a                	slli	s1,s1,0x2
     80000a7c:	00013797          	auipc	a5,0x13
     80000a80:	1ec78793          	addi	a5,a5,492 # 80013c68 <pm_ref>
@@ -1089,8 +1268,10 @@ uartintr(void)
     80000a86:	4398                	lw	a4,0(a5)
     80000a88:	2705                	addiw	a4,a4,1
     80000a8a:	c398                	sw	a4,0(a5)
+  release(&ref_lock);
     80000a8c:	854a                	mv	a0,s2
     80000a8e:	494000ef          	jal	80000f22 <release>
+}
     80000a92:	60e2                	ld	ra,24(sp)
     80000a94:	6442                	ld	s0,16(sp)
     80000a96:	64a2                	ld	s1,8(sp)
@@ -1099,6 +1280,9 @@ uartintr(void)
     80000a9c:	8082                	ret
 
 0000000080000a9e <refdown>:
+
+void
+refdown(void* pa){
     80000a9e:	1101                	addi	sp,sp,-32
     80000aa0:	ec06                	sd	ra,24(sp)
     80000aa2:	e822                	sd	s0,16(sp)
@@ -1106,13 +1290,16 @@ uartintr(void)
     80000aa6:	e04a                	sd	s2,0(sp)
     80000aa8:	1000                	addi	s0,sp,32
     80000aaa:	84aa                	mv	s1,a0
+  acquire(&ref_lock);
     80000aac:	00013917          	auipc	s2,0x13
     80000ab0:	0a490913          	addi	s2,s2,164 # 80013b50 <ref_lock>
     80000ab4:	854a                	mv	a0,s2
     80000ab6:	3d4000ef          	jal	80000e8a <acquire>
+  return (pa-KERNBASE)/PGSIZE;
     80000aba:	800007b7          	lui	a5,0x80000
     80000abe:	94be                	add	s1,s1,a5
     80000ac0:	80b1                	srli	s1,s1,0xc
+  pm_ref[getRefIdx((uint64)pa)] --;
     80000ac2:	048a                	slli	s1,s1,0x2
     80000ac4:	00013797          	auipc	a5,0x13
     80000ac8:	1a478793          	addi	a5,a5,420 # 80013c68 <pm_ref>
@@ -1120,8 +1307,10 @@ uartintr(void)
     80000ace:	4398                	lw	a4,0(a5)
     80000ad0:	377d                	addiw	a4,a4,-1
     80000ad2:	c398                	sw	a4,0(a5)
+  release(&ref_lock);
     80000ad4:	854a                	mv	a0,s2
     80000ad6:	44c000ef          	jal	80000f22 <release>
+}
     80000ada:	60e2                	ld	ra,24(sp)
     80000adc:	6442                	ld	s0,16(sp)
     80000ade:	64a2                	ld	s1,8(sp)
@@ -1130,11 +1319,20 @@ uartintr(void)
     80000ae4:	8082                	ret
 
 0000000080000ae6 <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)
+{
     80000ae6:	7179                	addi	sp,sp,-48
     80000ae8:	f406                	sd	ra,40(sp)
     80000aea:	f022                	sd	s0,32(sp)
     80000aec:	ec26                	sd	s1,24(sp)
     80000aee:	1800                	addi	s0,sp,48
+  struct run *r;
+
+  if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP)
     80000af0:	03451793          	slli	a5,a0,0x34
     80000af4:	efb1                	bnez	a5,80000b50 <kfree+0x6a>
     80000af6:	84aa                	mv	s1,a0
@@ -1144,12 +1342,17 @@ uartintr(void)
     80000b04:	47c5                	li	a5,17
     80000b06:	07ee                	slli	a5,a5,0x1b
     80000b08:	04f57463          	bgeu	a0,a5,80000b50 <kfree+0x6a>
+    panic("kfree");
+
+  acquire(&ref_lock);
     80000b0c:	00013517          	auipc	a0,0x13
     80000b10:	04450513          	addi	a0,a0,68 # 80013b50 <ref_lock>
     80000b14:	376000ef          	jal	80000e8a <acquire>
+  return (pa-KERNBASE)/PGSIZE;
     80000b18:	800007b7          	lui	a5,0x80000
     80000b1c:	97a6                	add	a5,a5,s1
     80000b1e:	83b1                	srli	a5,a5,0xc
+  pm_ref[getRefIdx((uint64)pa)] --;
     80000b20:	078a                	slli	a5,a5,0x2
     80000b22:	00013717          	auipc	a4,0x13
     80000b26:	14670713          	addi	a4,a4,326 # 80013c68 <pm_ref>
@@ -1158,10 +1361,18 @@ uartintr(void)
     80000b2e:	377d                	addiw	a4,a4,-1
     80000b30:	0007069b          	sext.w	a3,a4
     80000b34:	c398                	sw	a4,0(a5)
+  if(pm_ref[getRefIdx((uint64)pa)] <= 0){
     80000b36:	02d05563          	blez	a3,80000b60 <kfree+0x7a>
+    r->next = kmem->freelist;
+    kmem->freelist = r;
+    release(&kmem->lock);
+  }
+  
+  release(&ref_lock);
     80000b3a:	00013517          	auipc	a0,0x13
     80000b3e:	01650513          	addi	a0,a0,22 # 80013b50 <ref_lock>
     80000b42:	3e0000ef          	jal	80000f22 <release>
+}
     80000b46:	70a2                	ld	ra,40(sp)
     80000b48:	7402                	ld	s0,32(sp)
     80000b4a:	64e2                	ld	s1,24(sp)
@@ -1169,24 +1380,30 @@ uartintr(void)
     80000b4e:	8082                	ret
     80000b50:	e84a                	sd	s2,16(sp)
     80000b52:	e44e                	sd	s3,8(sp)
+    panic("kfree");
     80000b54:	00007517          	auipc	a0,0x7
     80000b58:	4e450513          	addi	a0,a0,1252 # 80008038 <etext+0x38>
     80000b5c:	c39ff0ef          	jal	80000794 <panic>
     80000b60:	e84a                	sd	s2,16(sp)
     80000b62:	e44e                	sd	s3,8(sp)
+    memset(pa, 1, PGSIZE);
     80000b64:	6605                	lui	a2,0x1
     80000b66:	4585                	li	a1,1
     80000b68:	8526                	mv	a0,s1
     80000b6a:	3f4000ef          	jal	80000f5e <memset>
+    acquire(&kmem->lock);
     80000b6e:	00013997          	auipc	s3,0x13
     80000b72:	fe298993          	addi	s3,s3,-30 # 80013b50 <ref_lock>
     80000b76:	00013917          	auipc	s2,0x13
     80000b7a:	ff290913          	addi	s2,s2,-14 # 80013b68 <kmem>
     80000b7e:	854a                	mv	a0,s2
     80000b80:	30a000ef          	jal	80000e8a <acquire>
+    r->next = kmem->freelist;
     80000b84:	0309b783          	ld	a5,48(s3)
     80000b88:	e09c                	sd	a5,0(s1)
+    kmem->freelist = r;
     80000b8a:	0299b823          	sd	s1,48(s3)
+    release(&kmem->lock);
     80000b8e:	854a                	mv	a0,s2
     80000b90:	392000ef          	jal	80000f22 <release>
     80000b94:	6942                	ld	s2,16(sp)
@@ -1194,31 +1411,39 @@ uartintr(void)
     80000b98:	b74d                	j	80000b3a <kfree+0x54>
 
 0000000080000b9a <freerange>:
+{
     80000b9a:	7179                	addi	sp,sp,-48
     80000b9c:	f406                	sd	ra,40(sp)
     80000b9e:	f022                	sd	s0,32(sp)
     80000ba0:	ec26                	sd	s1,24(sp)
     80000ba2:	1800                	addi	s0,sp,48
+  p = (char*)PGROUNDUP((uint64)pa_start);
     80000ba4:	6785                	lui	a5,0x1
     80000ba6:	fff78713          	addi	a4,a5,-1 # fff <_entry-0x7ffff001>
     80000baa:	00e504b3          	add	s1,a0,a4
     80000bae:	777d                	lui	a4,0xfffff
     80000bb0:	8cf9                	and	s1,s1,a4
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
     80000bb2:	94be                	add	s1,s1,a5
     80000bb4:	0295e263          	bltu	a1,s1,80000bd8 <freerange+0x3e>
     80000bb8:	e84a                	sd	s2,16(sp)
     80000bba:	e44e                	sd	s3,8(sp)
     80000bbc:	e052                	sd	s4,0(sp)
     80000bbe:	892e                	mv	s2,a1
+    kfree(p);
     80000bc0:	7a7d                	lui	s4,0xfffff
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
     80000bc2:	6985                	lui	s3,0x1
+    kfree(p);
     80000bc4:	01448533          	add	a0,s1,s4
     80000bc8:	f1fff0ef          	jal	80000ae6 <kfree>
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
     80000bcc:	94ce                	add	s1,s1,s3
     80000bce:	fe997be3          	bgeu	s2,s1,80000bc4 <freerange+0x2a>
     80000bd2:	6942                	ld	s2,16(sp)
     80000bd4:	69a2                	ld	s3,8(sp)
     80000bd6:	6a02                	ld	s4,0(sp)
+}
     80000bd8:	70a2                	ld	ra,40(sp)
     80000bda:	7402                	ld	s0,32(sp)
     80000bdc:	64e2                	ld	s1,24(sp)
@@ -1226,6 +1451,7 @@ uartintr(void)
     80000be0:	8082                	ret
 
 0000000080000be2 <kinit>:
+{
     80000be2:	7179                	addi	sp,sp,-48
     80000be4:	f406                	sd	ra,40(sp)
     80000be6:	f022                	sd	s0,32(sp)
@@ -1233,27 +1459,33 @@ uartintr(void)
     80000bea:	e84a                	sd	s2,16(sp)
     80000bec:	e44e                	sd	s3,8(sp)
     80000bee:	1800                	addi	s0,sp,48
+  for (int i = 0; i < NCPU; i++)
     80000bf0:	00013497          	auipc	s1,0x13
     80000bf4:	f7848493          	addi	s1,s1,-136 # 80013b68 <kmem>
     80000bf8:	00013997          	auipc	s3,0x13
     80000bfc:	07098993          	addi	s3,s3,112 # 80013c68 <pm_ref>
+    initlock(&kmem[i].lock, "kmem");
     80000c00:	00007917          	auipc	s2,0x7
     80000c04:	44090913          	addi	s2,s2,1088 # 80008040 <etext+0x40>
     80000c08:	85ca                	mv	a1,s2
     80000c0a:	8526                	mv	a0,s1
     80000c0c:	1fe000ef          	jal	80000e0a <initlock>
+  for (int i = 0; i < NCPU; i++)
     80000c10:	02048493          	addi	s1,s1,32
     80000c14:	ff349ae3          	bne	s1,s3,80000c08 <kinit+0x26>
+  initlock(&ref_lock, "pm_ref");
     80000c18:	00007597          	auipc	a1,0x7
     80000c1c:	43058593          	addi	a1,a1,1072 # 80008048 <etext+0x48>
     80000c20:	00013517          	auipc	a0,0x13
     80000c24:	f3050513          	addi	a0,a0,-208 # 80013b50 <ref_lock>
     80000c28:	1e2000ef          	jal	80000e0a <initlock>
+  freerange(end, (void*)PHYSTOP);
     80000c2c:	45c5                	li	a1,17
     80000c2e:	05ee                	slli	a1,a1,0x1b
     80000c30:	0004d517          	auipc	a0,0x4d
     80000c34:	e0850513          	addi	a0,a0,-504 # 8004da38 <end>
     80000c38:	f63ff0ef          	jal	80000b9a <freerange>
+}
     80000c3c:	70a2                	ld	ra,40(sp)
     80000c3e:	7402                	ld	s0,32(sp)
     80000c40:	64e2                	ld	s1,24(sp)
@@ -1263,6 +1495,12 @@ uartintr(void)
     80000c48:	8082                	ret
 
 0000000080000c4a <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)
+{
     80000c4a:	7139                	addi	sp,sp,-64
     80000c4c:	fc06                	sd	ra,56(sp)
     80000c4e:	f822                	sd	s0,48(sp)
@@ -1270,42 +1508,67 @@ uartintr(void)
     80000c52:	f04a                	sd	s2,32(sp)
     80000c54:	ec4e                	sd	s3,24(sp)
     80000c56:	0080                	addi	s0,sp,64
+  struct run *r;
+
+  push_off();
     80000c58:	1f2000ef          	jal	80000e4a <push_off>
+  int cpu = cpuid();
     80000c5c:	034010ef          	jal	80001c90 <cpuid>
     80000c60:	84aa                	mv	s1,a0
+  pop_off();
     80000c62:	26c000ef          	jal	80000ece <pop_off>
+
+  acquire(&kmem[cpu].lock);
     80000c66:	00549913          	slli	s2,s1,0x5
     80000c6a:	00013997          	auipc	s3,0x13
     80000c6e:	efe98993          	addi	s3,s3,-258 # 80013b68 <kmem>
     80000c72:	99ca                	add	s3,s3,s2
     80000c74:	854e                	mv	a0,s3
     80000c76:	214000ef          	jal	80000e8a <acquire>
+  r = kmem[cpu].freelist;
     80000c7a:	00013797          	auipc	a5,0x13
     80000c7e:	ed678793          	addi	a5,a5,-298 # 80013b50 <ref_lock>
     80000c82:	97ca                	add	a5,a5,s2
     80000c84:	0307b903          	ld	s2,48(a5)
+  if(r)
     80000c88:	04090763          	beqz	s2,80000cd6 <kalloc+0x8c>
+    kmem[cpu].freelist = r->next;
     80000c8c:	00093703          	ld	a4,0(s2)
+        break;
+      }
+    }
+    r = kmem[cpu].freelist;
+    if (r)
+      kmem[cpu].freelist = r->next;
     80000c90:	0496                	slli	s1,s1,0x5
     80000c92:	00013797          	auipc	a5,0x13
     80000c96:	ebe78793          	addi	a5,a5,-322 # 80013b50 <ref_lock>
     80000c9a:	97a6                	add	a5,a5,s1
     80000c9c:	fb98                	sd	a4,48(a5)
+  }
+  release(&kmem[cpu].lock);
     80000c9e:	854e                	mv	a0,s3
     80000ca0:	282000ef          	jal	80000f22 <release>
+
+  if(r){
+    memset((char*)r, 5, PGSIZE); // fill with junk
     80000ca4:	6605                	lui	a2,0x1
     80000ca6:	4595                	li	a1,5
     80000ca8:	854a                	mv	a0,s2
     80000caa:	2b4000ef          	jal	80000f5e <memset>
+  return (pa-KERNBASE)/PGSIZE;
     80000cae:	800007b7          	lui	a5,0x80000
     80000cb2:	97ca                	add	a5,a5,s2
     80000cb4:	83b1                	srli	a5,a5,0xc
+    pm_ref[getRefIdx((uint64)r)] = 1;  // 初始化不用加锁
     80000cb6:	078a                	slli	a5,a5,0x2
     80000cb8:	00013717          	auipc	a4,0x13
     80000cbc:	fb070713          	addi	a4,a4,-80 # 80013c68 <pm_ref>
     80000cc0:	97ba                	add	a5,a5,a4
     80000cc2:	4705                	li	a4,1
     80000cc4:	c398                	sw	a4,0(a5)
+  }
+  return (void*)r;
     80000cc6:	854a                	mv	a0,s2
     80000cc8:	70e2                	ld	ra,56(sp)
     80000cca:	7442                	ld	s0,48(sp)
@@ -1318,50 +1581,68 @@ uartintr(void)
     80000cd8:	e456                	sd	s5,8(sp)
     80000cda:	00013a17          	auipc	s4,0x13
     80000cde:	e8ea0a13          	addi	s4,s4,-370 # 80013b68 <kmem>
+    for (int i = 0; i < NCPU; ++i)
     80000ce2:	4901                	li	s2,0
+      if (i == cpu) continue;
     80000ce4:	07248663          	beq	s1,s2,80000d50 <kalloc+0x106>
+      acquire(&kmem[i].lock);
     80000ce8:	8ad2                	mv	s5,s4
     80000cea:	8552                	mv	a0,s4
     80000cec:	19e000ef          	jal	80000e8a <acquire>
+      tmp = kmem[i].freelist;
     80000cf0:	018a3603          	ld	a2,24(s4)
+      if (tmp == 0) {
     80000cf4:	ca39                	beqz	a2,80000d4a <kalloc+0x100>
+      tmp = kmem[i].freelist;
     80000cf6:	87b2                	mv	a5,a2
     80000cf8:	40000713          	li	a4,1024
+          if (tmp->next)
     80000cfc:	86be                	mv	a3,a5
     80000cfe:	639c                	ld	a5,0(a5)
     80000d00:	c781                	beqz	a5,80000d08 <kalloc+0xbe>
+        for (int j = 0; j < 1024; j++) {
     80000d02:	377d                	addiw	a4,a4,-1
     80000d04:	ff65                	bnez	a4,80000cfc <kalloc+0xb2>
     80000d06:	86be                	mv	a3,a5
+        kmem[cpu].freelist = kmem[i].freelist;
     80000d08:	00013797          	auipc	a5,0x13
     80000d0c:	e4878793          	addi	a5,a5,-440 # 80013b50 <ref_lock>
     80000d10:	00549713          	slli	a4,s1,0x5
     80000d14:	973e                	add	a4,a4,a5
     80000d16:	fb10                	sd	a2,48(a4)
+        kmem[i].freelist = tmp->next;
     80000d18:	6298                	ld	a4,0(a3)
     80000d1a:	0916                	slli	s2,s2,0x5
     80000d1c:	97ca                	add	a5,a5,s2
     80000d1e:	fb98                	sd	a4,48(a5)
+        tmp->next = 0;
     80000d20:	0006b023          	sd	zero,0(a3)
+        release(&kmem[i].lock);
     80000d24:	8556                	mv	a0,s5
     80000d26:	1fc000ef          	jal	80000f22 <release>
+    r = kmem[cpu].freelist;
     80000d2a:	00549713          	slli	a4,s1,0x5
     80000d2e:	00013797          	auipc	a5,0x13
     80000d32:	e2278793          	addi	a5,a5,-478 # 80013b50 <ref_lock>
     80000d36:	97ba                	add	a5,a5,a4
     80000d38:	0307b903          	ld	s2,48(a5)
+    if (r)
     80000d3c:	02090163          	beqz	s2,80000d5e <kalloc+0x114>
+      kmem[cpu].freelist = r->next;
     80000d40:	00093703          	ld	a4,0(s2)
     80000d44:	6a42                	ld	s4,16(sp)
     80000d46:	6aa2                	ld	s5,8(sp)
     80000d48:	b7a1                	j	80000c90 <kalloc+0x46>
+        release(&kmem[i].lock);
     80000d4a:	8552                	mv	a0,s4
     80000d4c:	1d6000ef          	jal	80000f22 <release>
+    for (int i = 0; i < NCPU; ++i)
     80000d50:	2905                	addiw	s2,s2,1
     80000d52:	020a0a13          	addi	s4,s4,32
     80000d56:	47a1                	li	a5,8
     80000d58:	f8f916e3          	bne	s2,a5,80000ce4 <kalloc+0x9a>
     80000d5c:	b7f9                	j	80000d2a <kalloc+0xe0>
+  release(&kmem[cpu].lock);
     80000d5e:	854e                	mv	a0,s3
     80000d60:	1c2000ef          	jal	80000f22 <release>
     80000d64:	6a42                	ld	s4,16(sp)
@@ -1369,6 +1650,7 @@ uartintr(void)
     80000d68:	bfb9                	j	80000cc6 <kalloc+0x7c>
 
 0000000080000d6a <cowcopy_pa>:
+cowcopy_pa(void* pa){
     80000d6a:	7179                	addi	sp,sp,-48
     80000d6c:	f406                	sd	ra,40(sp)
     80000d6e:	f022                	sd	s0,32(sp)
@@ -1377,12 +1659,15 @@ uartintr(void)
     80000d74:	e44e                	sd	s3,8(sp)
     80000d76:	1800                	addi	s0,sp,48
     80000d78:	892a                	mv	s2,a0
+  acquire(&ref_lock);
     80000d7a:	00013517          	auipc	a0,0x13
     80000d7e:	dd650513          	addi	a0,a0,-554 # 80013b50 <ref_lock>
     80000d82:	108000ef          	jal	80000e8a <acquire>
+  return (pa-KERNBASE)/PGSIZE;
     80000d86:	800004b7          	lui	s1,0x80000
     80000d8a:	94ca                	add	s1,s1,s2
     80000d8c:	80b1                	srli	s1,s1,0xc
+  if(pm_ref[getRefIdx((uint64)pa)] <= 1){
     80000d8e:	00249713          	slli	a4,s1,0x2
     80000d92:	00013797          	auipc	a5,0x13
     80000d96:	ed678793          	addi	a5,a5,-298 # 80013c68 <pm_ref>
@@ -1390,12 +1675,16 @@ uartintr(void)
     80000d9c:	4398                	lw	a4,0(a5)
     80000d9e:	4785                	li	a5,1
     80000da0:	04e7d163          	bge	a5,a4,80000de2 <cowcopy_pa+0x78>
+  char* new = kalloc();
     80000da4:	ea7ff0ef          	jal	80000c4a <kalloc>
     80000da8:	89aa                	mv	s3,a0
+  if(new == 0){
     80000daa:	c521                	beqz	a0,80000df2 <cowcopy_pa+0x88>
+  memmove((void*)new, pa, PGSIZE);
     80000dac:	6605                	lui	a2,0x1
     80000dae:	85ca                	mv	a1,s2
     80000db0:	20a000ef          	jal	80000fba <memmove>
+  pm_ref[getRefIdx((uint64)pa)] --;
     80000db4:	048a                	slli	s1,s1,0x2
     80000db6:	00013797          	auipc	a5,0x13
     80000dba:	eb278793          	addi	a5,a5,-334 # 80013c68 <pm_ref>
@@ -1403,9 +1692,11 @@ uartintr(void)
     80000dc0:	4398                	lw	a4,0(a5)
     80000dc2:	377d                	addiw	a4,a4,-1
     80000dc4:	c398                	sw	a4,0(a5)
+  release(&ref_lock);
     80000dc6:	00013517          	auipc	a0,0x13
     80000dca:	d8a50513          	addi	a0,a0,-630 # 80013b50 <ref_lock>
     80000dce:	154000ef          	jal	80000f22 <release>
+}
     80000dd2:	854e                	mv	a0,s3
     80000dd4:	70a2                	ld	ra,40(sp)
     80000dd6:	7402                	ld	s0,32(sp)
@@ -1414,14 +1705,18 @@ uartintr(void)
     80000ddc:	69a2                	ld	s3,8(sp)
     80000dde:	6145                	addi	sp,sp,48
     80000de0:	8082                	ret
+    release(&ref_lock);
     80000de2:	00013517          	auipc	a0,0x13
     80000de6:	d6e50513          	addi	a0,a0,-658 # 80013b50 <ref_lock>
     80000dea:	138000ef          	jal	80000f22 <release>
+    return pa;
     80000dee:	89ca                	mv	s3,s2
     80000df0:	b7cd                	j	80000dd2 <cowcopy_pa+0x68>
+    release(&ref_lock);
     80000df2:	00013517          	auipc	a0,0x13
     80000df6:	d5e50513          	addi	a0,a0,-674 # 80013b50 <ref_lock>
     80000dfa:	128000ef          	jal	80000f22 <release>
+    panic("out of memory");
     80000dfe:	00007517          	auipc	a0,0x7
     80000e02:	25250513          	addi	a0,a0,594 # 80008050 <etext+0x50>
     80000e06:	98fff0ef          	jal	80000794 <panic>
@@ -1745,106 +2040,124 @@ uartintr(void)
     800010f6:	bfe5                	j	800010ee <strlen+0x20>
 
 00000000800010f8 <main>:
+volatile static int started = 0;
+
+// start() jumps here in supervisor mode on all CPUs.
+void
+main()
+{
     800010f8:	1141                	addi	sp,sp,-16
     800010fa:	e406                	sd	ra,8(sp)
     800010fc:	e022                	sd	s0,0(sp)
     800010fe:	0800                	addi	s0,sp,16
+  if (cpuid() == 0) {
     80001100:	391000ef          	jal	80001c90 <cpuid>
+    userinit();      // first user process
+
+    __sync_synchronize();
+    started = 1;
+  } else {
+    while (started == 0)
     80001104:	0000b717          	auipc	a4,0xb
     80001108:	92470713          	addi	a4,a4,-1756 # 8000ba28 <started>
+  if (cpuid() == 0) {
     8000110c:	c51d                	beqz	a0,8000113a <main+0x42>
+    while (started == 0)
     8000110e:	431c                	lw	a5,0(a4)
     80001110:	2781                	sext.w	a5,a5
     80001112:	dff5                	beqz	a5,8000110e <main+0x16>
+      ;
+
+    __sync_synchronize();
     80001114:	0330000f          	fence	rw,rw
+    printf("hart %d starting\n", cpuid());
     80001118:	379000ef          	jal	80001c90 <cpuid>
     8000111c:	85aa                	mv	a1,a0
     8000111e:	00007517          	auipc	a0,0x7
     80001122:	47a50513          	addi	a0,a0,1146 # 80008598 <etext+0x598>
     80001126:	b9cff0ef          	jal	800004c2 <printf>
+    kvminithart();    // turn on paging
     8000112a:	08c000ef          	jal	800011b6 <kvminithart>
+    trapinithart();   // install kernel trap vector
     8000112e:	700010ef          	jal	8000282e <trapinithart>
+    plicinithart();   // ask PLIC for device interrupts
     80001132:	1b7040ef          	jal	80005ae8 <plicinithart>
+  }
+
+  scheduler();        
     80001136:	03c010ef          	jal	80002172 <scheduler>
+    consoleinit();
     8000113a:	ab2ff0ef          	jal	800003ec <consoleinit>
+    printfinit();
     8000113e:	e90ff0ef          	jal	800007ce <printfinit>
+    printf(
     80001142:	00007517          	auipc	a0,0x7
     80001146:	f4e50513          	addi	a0,a0,-178 # 80008090 <etext+0x90>
     8000114a:	b78ff0ef          	jal	800004c2 <printf>
+    printf("\n");
     8000114e:	00007517          	auipc	a0,0x7
     80001152:	42a50513          	addi	a0,a0,1066 # 80008578 <etext+0x578>
     80001156:	b6cff0ef          	jal	800004c2 <printf>
+    printf("xv6 kernel is booting\n");
     8000115a:	00007517          	auipc	a0,0x7
     8000115e:	42650513          	addi	a0,a0,1062 # 80008580 <etext+0x580>
     80001162:	b60ff0ef          	jal	800004c2 <printf>
+    printf("\n");
     80001166:	00007517          	auipc	a0,0x7
     8000116a:	41250513          	addi	a0,a0,1042 # 80008578 <etext+0x578>
     8000116e:	b54ff0ef          	jal	800004c2 <printf>
+    kinit();         // physical page allocator
     80001172:	a71ff0ef          	jal	80000be2 <kinit>
+    kvminit();       // create kernel page table
     80001176:	316000ef          	jal	8000148c <kvminit>
+    kvminithart();   // turn on paging
     8000117a:	03c000ef          	jal	800011b6 <kvminithart>
+    procinit();      // process table
     8000117e:	249000ef          	jal	80001bc6 <procinit>
+    trapinit();      // trap vectors
     80001182:	688010ef          	jal	8000280a <trapinit>
+    trapinithart();  // install kernel trap vector
     80001186:	6a8010ef          	jal	8000282e <trapinithart>
+    plicinit();      // set up interrupt controller
     8000118a:	145040ef          	jal	80005ace <plicinit>
+    plicinithart();  // ask PLIC for device interrupts
     8000118e:	15b040ef          	jal	80005ae8 <plicinithart>
+    binit();         // buffer cache
     80001192:	527010ef          	jal	80002eb8 <binit>
+    iinit();         // inode table
     80001196:	596020ef          	jal	8000372c <iinit>
+    fileinit();      // file table
     8000119a:	344030ef          	jal	800044de <fileinit>
+    virtio_disk_init(); // emulated hard disk
     8000119e:	23b040ef          	jal	80005bd8 <virtio_disk_init>
+    userinit();      // first user process
     800011a2:	605000ef          	jal	80001fa6 <userinit>
+    __sync_synchronize();
     800011a6:	0330000f          	fence	rw,rw
+    started = 1;
     800011aa:	4785                	li	a5,1
     800011ac:	0000b717          	auipc	a4,0xb
     800011b0:	86f72e23          	sw	a5,-1924(a4) # 8000ba28 <started>
     800011b4:	b749                	j	80001136 <main+0x3e>
 
 00000000800011b6 <kvminithart>:
-
-// Switch h/w page table register to the kernel's page table,
-// and enable paging.
-void
-kvminithart()
-{
     800011b6:	1141                	addi	sp,sp,-16
     800011b8:	e422                	sd	s0,8(sp)
     800011ba:	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");
     800011bc:	12000073          	sfence.vma
-  // wait for any previous writes to the page table memory to finish.
-  sfence_vma();
-
-  w_satp(MAKE_SATP(kernel_pagetable));
     800011c0:	0000b797          	auipc	a5,0xb
     800011c4:	8707b783          	ld	a5,-1936(a5) # 8000ba30 <kernel_pagetable>
     800011c8:	83b1                	srli	a5,a5,0xc
     800011ca:	577d                	li	a4,-1
     800011cc:	177e                	slli	a4,a4,0x3f
     800011ce:	8fd9                	or	a5,a5,a4
-  asm volatile("csrw satp, %0" : : "r" (x));
     800011d0:	18079073          	csrw	satp,a5
-  asm volatile("sfence.vma zero, zero");
     800011d4:	12000073          	sfence.vma
-
-  // flush stale entries from the TLB.
-  sfence_vma();
-}
     800011d8:	6422                	ld	s0,8(sp)
     800011da:	0141                	addi	sp,sp,16
     800011dc:	8082                	ret
 
 00000000800011de <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)
-{
     800011de:	7139                	addi	sp,sp,-64
     800011e0:	fc06                	sd	ra,56(sp)
     800011e2:	f822                	sd	s0,48(sp)
@@ -1858,63 +2171,41 @@ walk(pagetable_t pagetable, uint64 va, int alloc)
     800011f2:	84aa                	mv	s1,a0
     800011f4:	89ae                	mv	s3,a1
     800011f6:	8ab2                	mv	s5,a2
-  if(va >= MAXVA)
     800011f8:	57fd                	li	a5,-1
     800011fa:	83e9                	srli	a5,a5,0x1a
     800011fc:	4a79                	li	s4,30
-    panic("walk");
-
-  for(int level = 2; level > 0; level--) {
     800011fe:	4b31                	li	s6,12
-  if(va >= MAXVA)
     80001200:	02b7fc63          	bgeu	a5,a1,80001238 <walk+0x5a>
-    panic("walk");
     80001204:	00007517          	auipc	a0,0x7
     80001208:	3ac50513          	addi	a0,a0,940 # 800085b0 <etext+0x5b0>
     8000120c:	d88ff0ef          	jal	80000794 <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)
     80001210:	060a8263          	beqz	s5,80001274 <walk+0x96>
     80001214:	a37ff0ef          	jal	80000c4a <kalloc>
     80001218:	84aa                	mv	s1,a0
     8000121a:	c139                	beqz	a0,80001260 <walk+0x82>
-        return 0;
-      memset(pagetable, 0, PGSIZE);
     8000121c:	6605                	lui	a2,0x1
     8000121e:	4581                	li	a1,0
     80001220:	d3fff0ef          	jal	80000f5e <memset>
-      *pte = PA2PTE(pagetable) | PTE_V;
     80001224:	00c4d793          	srli	a5,s1,0xc
     80001228:	07aa                	slli	a5,a5,0xa
     8000122a:	0017e793          	ori	a5,a5,1
     8000122e:	00f93023          	sd	a5,0(s2)
-  for(int level = 2; level > 0; level--) {
     80001232:	3a5d                	addiw	s4,s4,-9
     80001234:	036a0063          	beq	s4,s6,80001254 <walk+0x76>
-    pte_t *pte = &pagetable[PX(level, va)];
     80001238:	0149d933          	srl	s2,s3,s4
     8000123c:	1ff97913          	andi	s2,s2,511
     80001240:	090e                	slli	s2,s2,0x3
     80001242:	9926                	add	s2,s2,s1
-    if(*pte & PTE_V) {
     80001244:	00093483          	ld	s1,0(s2)
     80001248:	0014f793          	andi	a5,s1,1
     8000124c:	d3f1                	beqz	a5,80001210 <walk+0x32>
-      pagetable = (pagetable_t)PTE2PA(*pte);
     8000124e:	80a9                	srli	s1,s1,0xa
     80001250:	04b2                	slli	s1,s1,0xc
     80001252:	b7c5                	j	80001232 <walk+0x54>
-    }
-  }
-  return &pagetable[PX(0, va)];
     80001254:	00c9d513          	srli	a0,s3,0xc
     80001258:	1ff57513          	andi	a0,a0,511
     8000125c:	050e                	slli	a0,a0,0x3
     8000125e:	9526                	add	a0,a0,s1
-}
     80001260:	70e2                	ld	ra,56(sp)
     80001262:	7442                	ld	s0,48(sp)
     80001264:	74a2                	ld	s1,40(sp)
@@ -1925,30 +2216,23 @@ walk(pagetable_t pagetable, uint64 va, int alloc)
     8000126e:	6b02                	ld	s6,0(sp)
     80001270:	6121                	addi	sp,sp,64
     80001272:	8082                	ret
-        return 0;
     80001274:	4501                	li	a0,0
     80001276:	b7ed                	j	80001260 <walk+0x82>
 
 0000000080001278 <iscowpage>:
-iscowpage(uint64 va){
     80001278:	1101                	addi	sp,sp,-32
     8000127a:	ec06                	sd	ra,24(sp)
     8000127c:	e822                	sd	s0,16(sp)
     8000127e:	e426                	sd	s1,8(sp)
     80001280:	1000                	addi	s0,sp,32
     80001282:	84aa                	mv	s1,a0
-  struct proc* p = myproc();
     80001284:	239000ef          	jal	80001cbc <myproc>
-  va = PGROUNDDOWN((uint64)va);
     80001288:	77fd                	lui	a5,0xfffff
     8000128a:	8cfd                	and	s1,s1,a5
-  if(va >= MAXVA)  // 要在walk之前
     8000128c:	57fd                	li	a5,-1
     8000128e:	83e9                	srli	a5,a5,0x1a
     80001290:	0097f863          	bgeu	a5,s1,800012a0 <iscowpage+0x28>
-    return 0;
     80001294:	4501                	li	a0,0
-}
     80001296:	60e2                	ld	ra,24(sp)
     80001298:	6442                	ld	s0,16(sp)
     8000129a:	64a2                	ld	s1,8(sp)
@@ -1956,19 +2240,14 @@ iscowpage(uint64 va){
     8000129e:	8082                	ret
     800012a0:	e04a                	sd	s2,0(sp)
     800012a2:	892a                	mv	s2,a0
-  pte_t* pte = walk(p->pagetable,va,0);
     800012a4:	4601                	li	a2,0
     800012a6:	85a6                	mv	a1,s1
     800012a8:	6d28                	ld	a0,88(a0)
     800012aa:	f35ff0ef          	jal	800011de <walk>
     800012ae:	87aa                	mv	a5,a0
-  if(pte == 0)
     800012b0:	cd19                	beqz	a0,800012ce <iscowpage+0x56>
-  if((va < p->sz)&& (*pte & PTE_COW) && (*pte & PTE_V))
     800012b2:	05093703          	ld	a4,80(s2)
-    return 0;
     800012b6:	4501                	li	a0,0
-  if((va < p->sz)&& (*pte & PTE_COW) && (*pte & PTE_V))
     800012b8:	00e4fe63          	bgeu	s1,a4,800012d4 <iscowpage+0x5c>
     800012bc:	6388                	ld	a0,0(a5)
     800012be:	10157513          	andi	a0,a0,257
@@ -1976,7 +2255,6 @@ iscowpage(uint64 va){
     800012c6:	00153513          	seqz	a0,a0
     800012ca:	6902                	ld	s2,0(sp)
     800012cc:	b7e9                	j	80001296 <iscowpage+0x1e>
-    return 0;
     800012ce:	4501                	li	a0,0
     800012d0:	6902                	ld	s2,0(sp)
     800012d2:	b7d1                	j	80001296 <iscowpage+0x1e>
@@ -1984,64 +2262,34 @@ iscowpage(uint64 va){
     800012d6:	b7c1                	j	80001296 <iscowpage+0x1e>
 
 00000000800012d8 <walkaddr>:
-walkaddr(pagetable_t pagetable, uint64 va)
-{
-  pte_t *pte;
-  uint64 pa;
-
-  if(va >= MAXVA)
     800012d8:	57fd                	li	a5,-1
     800012da:	83e9                	srli	a5,a5,0x1a
     800012dc:	00b7f463          	bgeu	a5,a1,800012e4 <walkaddr+0xc>
-    return 0;
     800012e0:	4501                	li	a0,0
-    return 0;
-  if((*pte & PTE_U) == 0)
-    return 0;
-  pa = PTE2PA(*pte);
-  return pa;
-}
     800012e2:	8082                	ret
-{
     800012e4:	1141                	addi	sp,sp,-16
     800012e6:	e406                	sd	ra,8(sp)
     800012e8:	e022                	sd	s0,0(sp)
     800012ea:	0800                	addi	s0,sp,16
-  pte = walk(pagetable, va, 0);
     800012ec:	4601                	li	a2,0
     800012ee:	ef1ff0ef          	jal	800011de <walk>
-  if(pte == 0)
     800012f2:	c105                	beqz	a0,80001312 <walkaddr+0x3a>
-  if((*pte & PTE_V) == 0)
     800012f4:	611c                	ld	a5,0(a0)
-  if((*pte & PTE_U) == 0)
     800012f6:	0117f693          	andi	a3,a5,17
     800012fa:	4745                	li	a4,17
-    return 0;
     800012fc:	4501                	li	a0,0
-  if((*pte & PTE_U) == 0)
     800012fe:	00e68663          	beq	a3,a4,8000130a <walkaddr+0x32>
-}
     80001302:	60a2                	ld	ra,8(sp)
     80001304:	6402                	ld	s0,0(sp)
     80001306:	0141                	addi	sp,sp,16
     80001308:	8082                	ret
-  pa = PTE2PA(*pte);
     8000130a:	83a9                	srli	a5,a5,0xa
     8000130c:	00c79513          	slli	a0,a5,0xc
-  return pa;
     80001310:	bfcd                	j	80001302 <walkaddr+0x2a>
-    return 0;
     80001312:	4501                	li	a0,0
     80001314:	b7fd                	j	80001302 <walkaddr+0x2a>
 
 0000000080001316 <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)
-{
     80001316:	715d                	addi	sp,sp,-80
     80001318:	e486                	sd	ra,72(sp)
     8000131a:	e0a2                	sd	s0,64(sp)
@@ -2054,82 +2302,44 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     80001328:	e45e                	sd	s7,8(sp)
     8000132a:	0880                	addi	s0,sp,80
     8000132c:	8b3a                	mv	s6,a4
-  uint64 a, last;
-  pte_t *pte;
-
-  // 确保地址对齐
-  va = (va / PGSIZE) * PGSIZE;
     8000132e:	777d                	lui	a4,0xfffff
     80001330:	8df9                	and	a1,a1,a4
-
-  // 确保大小对齐
-  size = (size + PGSIZE - 1) / PGSIZE * PGSIZE;
     80001332:	6785                	lui	a5,0x1
     80001334:	17fd                	addi	a5,a5,-1 # fff <_entry-0x7ffff001>
     80001336:	00f609b3          	add	s3,a2,a5
     8000133a:	00e9f9b3          	and	s3,s3,a4
-    panic("mappages: va not aligned");
-
-  if((size % PGSIZE) != 0)
-    panic("mappages: size not aligned");
-
-  if(size == 0)
     8000133e:	04098063          	beqz	s3,8000137e <mappages+0x68>
     80001342:	8aaa                	mv	s5,a0
-    panic("mappages: size");
-  
-  a = va;
-  last = va + size - PGSIZE;
     80001344:	99ae                	add	s3,s3,a1
     80001346:	77fd                	lui	a5,0xfffff
     80001348:	99be                	add	s3,s3,a5
-  a = va;
     8000134a:	892e                	mv	s2,a1
     8000134c:	40b68a33          	sub	s4,a3,a1
-    if(*pte & PTE_V)
-      panic("mappages: remap");
-    *pte = PA2PTE(pa) | perm | PTE_V;
-    if(a == last)
-      break;
-    a += PGSIZE;
     80001350:	6b85                	lui	s7,0x1
     80001352:	014904b3          	add	s1,s2,s4
-    if((pte = walk(pagetable, a, 1)) == 0)
     80001356:	4605                	li	a2,1
     80001358:	85ca                	mv	a1,s2
     8000135a:	8556                	mv	a0,s5
     8000135c:	e83ff0ef          	jal	800011de <walk>
     80001360:	c91d                	beqz	a0,80001396 <mappages+0x80>
-    if(*pte & PTE_V)
     80001362:	611c                	ld	a5,0(a0)
     80001364:	8b85                	andi	a5,a5,1
     80001366:	e395                	bnez	a5,8000138a <mappages+0x74>
-    *pte = PA2PTE(pa) | perm | PTE_V;
     80001368:	80b1                	srli	s1,s1,0xc
     8000136a:	04aa                	slli	s1,s1,0xa
     8000136c:	0164e4b3          	or	s1,s1,s6
     80001370:	0014e493          	ori	s1,s1,1
     80001374:	e104                	sd	s1,0(a0)
-    if(a == last)
     80001376:	03390c63          	beq	s2,s3,800013ae <mappages+0x98>
-    a += PGSIZE;
     8000137a:	995e                	add	s2,s2,s7
-    if((pte = walk(pagetable, a, 1)) == 0)
     8000137c:	bfd9                	j	80001352 <mappages+0x3c>
-    panic("mappages: size");
     8000137e:	00007517          	auipc	a0,0x7
     80001382:	23a50513          	addi	a0,a0,570 # 800085b8 <etext+0x5b8>
     80001386:	c0eff0ef          	jal	80000794 <panic>
-      panic("mappages: remap");
     8000138a:	00007517          	auipc	a0,0x7
     8000138e:	23e50513          	addi	a0,a0,574 # 800085c8 <etext+0x5c8>
     80001392:	c02ff0ef          	jal	80000794 <panic>
-      return -1;
     80001396:	557d                	li	a0,-1
-    pa += PGSIZE;
-  }
-  return 0;
-}
     80001398:	60a6                	ld	ra,72(sp)
     8000139a:	6406                	ld	s0,64(sp)
     8000139c:	74e2                	ld	s1,56(sp)
@@ -2141,69 +2351,57 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     800013a8:	6ba2                	ld	s7,8(sp)
     800013aa:	6161                	addi	sp,sp,80
     800013ac:	8082                	ret
-  return 0;
     800013ae:	4501                	li	a0,0
     800013b0:	b7e5                	j	80001398 <mappages+0x82>
 
 00000000800013b2 <kvmmap>:
-{
     800013b2:	1141                	addi	sp,sp,-16
     800013b4:	e406                	sd	ra,8(sp)
     800013b6:	e022                	sd	s0,0(sp)
     800013b8:	0800                	addi	s0,sp,16
     800013ba:	87b6                	mv	a5,a3
-  if(mappages(kpgtbl, va, sz, pa, perm) != 0)
     800013bc:	86b2                	mv	a3,a2
     800013be:	863e                	mv	a2,a5
     800013c0:	f57ff0ef          	jal	80001316 <mappages>
     800013c4:	e509                	bnez	a0,800013ce <kvmmap+0x1c>
-}
     800013c6:	60a2                	ld	ra,8(sp)
     800013c8:	6402                	ld	s0,0(sp)
     800013ca:	0141                	addi	sp,sp,16
     800013cc:	8082                	ret
-    panic("kvmmap");
     800013ce:	00007517          	auipc	a0,0x7
     800013d2:	20a50513          	addi	a0,a0,522 # 800085d8 <etext+0x5d8>
     800013d6:	bbeff0ef          	jal	80000794 <panic>
 
 00000000800013da <kvmmake>:
-{
     800013da:	1101                	addi	sp,sp,-32
     800013dc:	ec06                	sd	ra,24(sp)
     800013de:	e822                	sd	s0,16(sp)
     800013e0:	e426                	sd	s1,8(sp)
     800013e2:	e04a                	sd	s2,0(sp)
     800013e4:	1000                	addi	s0,sp,32
-  kpgtbl = (pagetable_t) kalloc();
     800013e6:	865ff0ef          	jal	80000c4a <kalloc>
     800013ea:	84aa                	mv	s1,a0
-  memset(kpgtbl, 0, PGSIZE);
     800013ec:	6605                	lui	a2,0x1
     800013ee:	4581                	li	a1,0
     800013f0:	b6fff0ef          	jal	80000f5e <memset>
-  kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W);
     800013f4:	4719                	li	a4,6
     800013f6:	6685                	lui	a3,0x1
     800013f8:	10000637          	lui	a2,0x10000
     800013fc:	100005b7          	lui	a1,0x10000
     80001400:	8526                	mv	a0,s1
     80001402:	fb1ff0ef          	jal	800013b2 <kvmmap>
-  kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W);
     80001406:	4719                	li	a4,6
     80001408:	6685                	lui	a3,0x1
     8000140a:	10001637          	lui	a2,0x10001
     8000140e:	100015b7          	lui	a1,0x10001
     80001412:	8526                	mv	a0,s1
     80001414:	f9fff0ef          	jal	800013b2 <kvmmap>
-  kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W);
     80001418:	4719                	li	a4,6
     8000141a:	040006b7          	lui	a3,0x4000
     8000141e:	0c000637          	lui	a2,0xc000
     80001422:	0c0005b7          	lui	a1,0xc000
     80001426:	8526                	mv	a0,s1
     80001428:	f8bff0ef          	jal	800013b2 <kvmmap>
-  kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X);
     8000142c:	00007917          	auipc	s2,0x7
     80001430:	bd490913          	addi	s2,s2,-1068 # 80008000 <etext>
     80001434:	4729                	li	a4,10
@@ -2214,7 +2412,6 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     80001442:	85b2                	mv	a1,a2
     80001444:	8526                	mv	a0,s1
     80001446:	f6dff0ef          	jal	800013b2 <kvmmap>
-  kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W);
     8000144a:	46c5                	li	a3,17
     8000144c:	06ee                	slli	a3,a3,0x1b
     8000144e:	4719                	li	a4,6
@@ -2223,7 +2420,6 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     80001456:	85ca                	mv	a1,s2
     80001458:	8526                	mv	a0,s1
     8000145a:	f59ff0ef          	jal	800013b2 <kvmmap>
-  kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X);
     8000145e:	4729                	li	a4,10
     80001460:	6685                	lui	a3,0x1
     80001462:	00006617          	auipc	a2,0x6
@@ -2233,10 +2429,8 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     80001470:	05b2                	slli	a1,a1,0xc
     80001472:	8526                	mv	a0,s1
     80001474:	f3fff0ef          	jal	800013b2 <kvmmap>
-  proc_mapstacks(kpgtbl);
     80001478:	8526                	mv	a0,s1
     8000147a:	6b4000ef          	jal	80001b2e <proc_mapstacks>
-}
     8000147e:	8526                	mv	a0,s1
     80001480:	60e2                	ld	ra,24(sp)
     80001482:	6442                	ld	s0,16(sp)
@@ -2246,36 +2440,23 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
     8000148a:	8082                	ret
 
 000000008000148c <kvminit>:
-{
     8000148c:	1141                	addi	sp,sp,-16
     8000148e:	e406                	sd	ra,8(sp)
     80001490:	e022                	sd	s0,0(sp)
     80001492:	0800                	addi	s0,sp,16
-  kernel_pagetable = kvmmake();
     80001494:	f47ff0ef          	jal	800013da <kvmmake>
     80001498:	0000a797          	auipc	a5,0xa
     8000149c:	58a7bc23          	sd	a0,1432(a5) # 8000ba30 <kernel_pagetable>
-}
     800014a0:	60a2                	ld	ra,8(sp)
     800014a2:	6402                	ld	s0,0(sp)
     800014a4:	0141                	addi	sp,sp,16
     800014a6:	8082                	ret
 
 00000000800014a8 <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)
-{
     800014a8:	715d                	addi	sp,sp,-80
     800014aa:	e486                	sd	ra,72(sp)
     800014ac:	e0a2                	sd	s0,64(sp)
     800014ae:	0880                	addi	s0,sp,80
-  uint64 a;
-  pte_t *pte;
-
-  if((va % PGSIZE) != 0)
     800014b0:	03459793          	slli	a5,a1,0x34
     800014b4:	e39d                	bnez	a5,800014da <uvmunmap+0x32>
     800014b6:	f84a                	sd	s2,48(sp)
@@ -2287,18 +2468,9 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
     800014c2:	8a2a                	mv	s4,a0
     800014c4:	892e                	mv	s2,a1
     800014c6:	8ab6                	mv	s5,a3
-    panic("uvmunmap: not aligned");
-
-  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
     800014c8:	0632                	slli	a2,a2,0xc
     800014ca:	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)
     800014ce:	4b85                	li	s7,1
-  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
     800014d0:	6b05                	lui	s6,0x1
     800014d2:	0735ff63          	bgeu	a1,s3,80001550 <uvmunmap+0xa8>
     800014d6:	fc26                	sd	s1,56(sp)
@@ -2310,50 +2482,34 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
     800014e2:	ec56                	sd	s5,24(sp)
     800014e4:	e85a                	sd	s6,16(sp)
     800014e6:	e45e                	sd	s7,8(sp)
-    panic("uvmunmap: not aligned");
     800014e8:	00007517          	auipc	a0,0x7
     800014ec:	0f850513          	addi	a0,a0,248 # 800085e0 <etext+0x5e0>
     800014f0:	aa4ff0ef          	jal	80000794 <panic>
-      panic("uvmunmap: walk");
     800014f4:	00007517          	auipc	a0,0x7
     800014f8:	10450513          	addi	a0,a0,260 # 800085f8 <etext+0x5f8>
     800014fc:	a98ff0ef          	jal	80000794 <panic>
-      panic("uvmunmap: not mapped");
     80001500:	00007517          	auipc	a0,0x7
     80001504:	10850513          	addi	a0,a0,264 # 80008608 <etext+0x608>
     80001508:	a8cff0ef          	jal	80000794 <panic>
-      panic("uvmunmap: not a leaf");
     8000150c:	00007517          	auipc	a0,0x7
     80001510:	11450513          	addi	a0,a0,276 # 80008620 <etext+0x620>
     80001514:	a80ff0ef          	jal	80000794 <panic>
-    if(do_free){
-      uint64 pa = PTE2PA(*pte);
-      kfree((void*)pa);
-    }
-    *pte = 0;
     80001518:	0004b023          	sd	zero,0(s1)
-  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
     8000151c:	995a                	add	s2,s2,s6
     8000151e:	03397863          	bgeu	s2,s3,8000154e <uvmunmap+0xa6>
-    if((pte = walk(pagetable, a, 0)) == 0)
     80001522:	4601                	li	a2,0
     80001524:	85ca                	mv	a1,s2
     80001526:	8552                	mv	a0,s4
     80001528:	cb7ff0ef          	jal	800011de <walk>
     8000152c:	84aa                	mv	s1,a0
     8000152e:	d179                	beqz	a0,800014f4 <uvmunmap+0x4c>
-    if((*pte & PTE_V) == 0)
     80001530:	6108                	ld	a0,0(a0)
     80001532:	00157793          	andi	a5,a0,1
     80001536:	d7e9                	beqz	a5,80001500 <uvmunmap+0x58>
-    if(PTE_FLAGS(*pte) == PTE_V)
     80001538:	3ff57793          	andi	a5,a0,1023
     8000153c:	fd7788e3          	beq	a5,s7,8000150c <uvmunmap+0x64>
-    if(do_free){
     80001540:	fc0a8ce3          	beqz	s5,80001518 <uvmunmap+0x70>
-      uint64 pa = PTE2PA(*pte);
     80001544:	8129                	srli	a0,a0,0xa
-      kfree((void*)pa);
     80001546:	0532                	slli	a0,a0,0xc
     80001548:	d9eff0ef          	jal	80000ae6 <kfree>
     8000154c:	b7f1                	j	80001518 <uvmunmap+0x70>
@@ -2364,15 +2520,12 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
     80001556:	6ae2                	ld	s5,24(sp)
     80001558:	6b42                	ld	s6,16(sp)
     8000155a:	6ba2                	ld	s7,8(sp)
-  }
-}
     8000155c:	60a6                	ld	ra,72(sp)
     8000155e:	6406                	ld	s0,64(sp)
     80001560:	6161                	addi	sp,sp,80
     80001562:	8082                	ret
 
 0000000080001564 <startcowcopy>:
-startcowcopy(uint64 va){
     80001564:	7179                	addi	sp,sp,-48
     80001566:	f406                	sd	ra,40(sp)
     80001568:	f022                	sd	s0,32(sp)
@@ -2382,38 +2535,29 @@ startcowcopy(uint64 va){
     80001570:	e052                	sd	s4,0(sp)
     80001572:	1800                	addi	s0,sp,48
     80001574:	84aa                	mv	s1,a0
-  struct proc* p = myproc();
     80001576:	746000ef          	jal	80001cbc <myproc>
     8000157a:	892a                	mv	s2,a0
-  va = PGROUNDDOWN((uint64)va);
     8000157c:	77fd                	lui	a5,0xfffff
     8000157e:	8cfd                	and	s1,s1,a5
-  pte_t* pte = walk(p->pagetable,va,0);
     80001580:	4601                	li	a2,0
     80001582:	85a6                	mv	a1,s1
     80001584:	6d28                	ld	a0,88(a0)
     80001586:	c59ff0ef          	jal	800011de <walk>
     8000158a:	89aa                	mv	s3,a0
-  uint64 pa = PTE2PA(*pte);
     8000158c:	6108                	ld	a0,0(a0)
     8000158e:	8129                	srli	a0,a0,0xa
-  void* new = cowcopy_pa((void*)pa);
     80001590:	0532                	slli	a0,a0,0xc
     80001592:	fd8ff0ef          	jal	80000d6a <cowcopy_pa>
-  if((uint64)new == 0){
     80001596:	c131                	beqz	a0,800015da <startcowcopy+0x76>
     80001598:	8a2a                	mv	s4,a0
-  uint64 flags = (PTE_FLAGS(*pte) | PTE_W) & (~PTE_COW);
     8000159a:	0009b983          	ld	s3,0(s3)
     8000159e:	2fb9f993          	andi	s3,s3,763
     800015a2:	0049e993          	ori	s3,s3,4
-  uvmunmap(p->pagetable, va, 1, 0);  // 不包含kfree,因为ref--在cowcopy_pa中已经进行了
     800015a6:	4681                	li	a3,0
     800015a8:	4605                	li	a2,1
     800015aa:	85a6                	mv	a1,s1
     800015ac:	05893503          	ld	a0,88(s2)
     800015b0:	ef9ff0ef          	jal	800014a8 <uvmunmap>
-  if(mappages(p->pagetable, va, 1, (uint64)new, flags) == -1){
     800015b4:	874e                	mv	a4,s3
     800015b6:	86d2                	mv	a3,s4
     800015b8:	4605                	li	a2,1
@@ -2422,7 +2566,6 @@ startcowcopy(uint64 va){
     800015c0:	d57ff0ef          	jal	80001316 <mappages>
     800015c4:	57fd                	li	a5,-1
     800015c6:	02f50063          	beq	a0,a5,800015e6 <startcowcopy+0x82>
-}
     800015ca:	70a2                	ld	ra,40(sp)
     800015cc:	7402                	ld	s0,32(sp)
     800015ce:	64e2                	ld	s1,24(sp)
@@ -2431,43 +2574,27 @@ startcowcopy(uint64 va){
     800015d4:	6a02                	ld	s4,0(sp)
     800015d6:	6145                	addi	sp,sp,48
     800015d8:	8082                	ret
-    panic("cowcopy_pa err\n");
     800015da:	00007517          	auipc	a0,0x7
     800015de:	05e50513          	addi	a0,a0,94 # 80008638 <etext+0x638>
     800015e2:	9b2ff0ef          	jal	80000794 <panic>
-    kfree(new);
     800015e6:	8552                	mv	a0,s4
     800015e8:	cfeff0ef          	jal	80000ae6 <kfree>
-    panic("cow mappages failed");
     800015ec:	00007517          	auipc	a0,0x7
     800015f0:	05c50513          	addi	a0,a0,92 # 80008648 <etext+0x648>
     800015f4:	9a0ff0ef          	jal	80000794 <panic>
 
 00000000800015f8 <uvmcreate>:
-
-// create an empty user page table.
-// returns 0 if out of memory.
-pagetable_t
-uvmcreate()
-{
     800015f8:	1101                	addi	sp,sp,-32
     800015fa:	ec06                	sd	ra,24(sp)
     800015fc:	e822                	sd	s0,16(sp)
     800015fe:	e426                	sd	s1,8(sp)
     80001600:	1000                	addi	s0,sp,32
-  pagetable_t pagetable;
-  pagetable = (pagetable_t) kalloc();
     80001602:	e48ff0ef          	jal	80000c4a <kalloc>
     80001606:	84aa                	mv	s1,a0
-  if(pagetable == 0)
     80001608:	c509                	beqz	a0,80001612 <uvmcreate+0x1a>
-    return 0;
-  memset(pagetable, 0, PGSIZE);
     8000160a:	6605                	lui	a2,0x1
     8000160c:	4581                	li	a1,0
     8000160e:	951ff0ef          	jal	80000f5e <memset>
-  return pagetable;
-}
     80001612:	8526                	mv	a0,s1
     80001614:	60e2                	ld	ra,24(sp)
     80001616:	6442                	ld	s0,16(sp)
@@ -2476,12 +2603,6 @@ uvmcreate()
     8000161c:	8082                	ret
 
 000000008000161e <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)
-{
     8000161e:	7179                	addi	sp,sp,-48
     80001620:	f406                	sd	ra,40(sp)
     80001622:	f022                	sd	s0,32(sp)
@@ -2490,35 +2611,26 @@ uvmfirst(pagetable_t pagetable, uchar *src, uint sz)
     80001628:	e44e                	sd	s3,8(sp)
     8000162a:	e052                	sd	s4,0(sp)
     8000162c:	1800                	addi	s0,sp,48
-  char *mem;
-
-  if(sz >= PGSIZE)
     8000162e:	6785                	lui	a5,0x1
     80001630:	04f67063          	bgeu	a2,a5,80001670 <uvmfirst+0x52>
     80001634:	8a2a                	mv	s4,a0
     80001636:	89ae                	mv	s3,a1
     80001638:	84b2                	mv	s1,a2
-    panic("uvmfirst: more than a page");
-  mem = kalloc();
     8000163a:	e10ff0ef          	jal	80000c4a <kalloc>
     8000163e:	892a                	mv	s2,a0
-  memset(mem, 0, PGSIZE);
     80001640:	6605                	lui	a2,0x1
     80001642:	4581                	li	a1,0
     80001644:	91bff0ef          	jal	80000f5e <memset>
-  mappages(pagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X|PTE_U);
     80001648:	4779                	li	a4,30
     8000164a:	86ca                	mv	a3,s2
     8000164c:	6605                	lui	a2,0x1
     8000164e:	4581                	li	a1,0
     80001650:	8552                	mv	a0,s4
     80001652:	cc5ff0ef          	jal	80001316 <mappages>
-  memmove(mem, src, sz);
     80001656:	8626                	mv	a2,s1
     80001658:	85ce                	mv	a1,s3
     8000165a:	854a                	mv	a0,s2
     8000165c:	95fff0ef          	jal	80000fba <memmove>
-}
     80001660:	70a2                	ld	ra,40(sp)
     80001662:	7402                	ld	s0,32(sp)
     80001664:	64e2                	ld	s1,24(sp)
@@ -2527,31 +2639,19 @@ uvmfirst(pagetable_t pagetable, uchar *src, uint sz)
     8000166a:	6a02                	ld	s4,0(sp)
     8000166c:	6145                	addi	sp,sp,48
     8000166e:	8082                	ret
-    panic("uvmfirst: more than a page");
     80001670:	00007517          	auipc	a0,0x7
     80001674:	ff050513          	addi	a0,a0,-16 # 80008660 <etext+0x660>
     80001678:	91cff0ef          	jal	80000794 <panic>
 
 000000008000167c <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)
-{
     8000167c:	1101                	addi	sp,sp,-32
     8000167e:	ec06                	sd	ra,24(sp)
     80001680:	e822                	sd	s0,16(sp)
     80001682:	e426                	sd	s1,8(sp)
     80001684:	1000                	addi	s0,sp,32
-  if(newsz >= oldsz)
-    return oldsz;
     80001686:	84ae                	mv	s1,a1
-  if(newsz >= oldsz)
     80001688:	00b67d63          	bgeu	a2,a1,800016a2 <uvmdealloc+0x26>
     8000168c:	84b2                	mv	s1,a2
-
-  if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){
     8000168e:	6785                	lui	a5,0x1
     80001690:	17fd                	addi	a5,a5,-1 # fff <_entry-0x7ffff001>
     80001692:	00f60733          	add	a4,a2,a5
@@ -2560,22 +2660,14 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
     8000169a:	97ae                	add	a5,a5,a1
     8000169c:	8ff5                	and	a5,a5,a3
     8000169e:	00f76863          	bltu	a4,a5,800016ae <uvmdealloc+0x32>
-    int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE;
-    uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1);
-  }
-
-  return newsz;
-}
     800016a2:	8526                	mv	a0,s1
     800016a4:	60e2                	ld	ra,24(sp)
     800016a6:	6442                	ld	s0,16(sp)
     800016a8:	64a2                	ld	s1,8(sp)
     800016aa:	6105                	addi	sp,sp,32
     800016ac:	8082                	ret
-    int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE;
     800016ae:	8f99                	sub	a5,a5,a4
     800016b0:	83b1                	srli	a5,a5,0xc
-    uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1);
     800016b2:	4685                	li	a3,1
     800016b4:	0007861b          	sext.w	a2,a5
     800016b8:	85ba                	mv	a1,a4
@@ -2583,9 +2675,7 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
     800016be:	b7d5                	j	800016a2 <uvmdealloc+0x26>
 
 00000000800016c0 <uvmalloc>:
-  if(newsz < oldsz)
     800016c0:	08b66f63          	bltu	a2,a1,8000175e <uvmalloc+0x9e>
-{
     800016c4:	7139                	addi	sp,sp,-64
     800016c6:	fc06                	sd	ra,56(sp)
     800016c8:	f822                	sd	s0,48(sp)
@@ -2595,30 +2685,23 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
     800016d0:	0080                	addi	s0,sp,64
     800016d2:	8aaa                	mv	s5,a0
     800016d4:	8a32                	mv	s4,a2
-  oldsz = PGROUNDUP(oldsz);
     800016d6:	6785                	lui	a5,0x1
     800016d8:	17fd                	addi	a5,a5,-1 # fff <_entry-0x7ffff001>
     800016da:	95be                	add	a1,a1,a5
     800016dc:	77fd                	lui	a5,0xfffff
     800016de:	00f5f9b3          	and	s3,a1,a5
-  for(a = oldsz; a < newsz; a += PGSIZE){
     800016e2:	08c9f063          	bgeu	s3,a2,80001762 <uvmalloc+0xa2>
     800016e6:	f426                	sd	s1,40(sp)
     800016e8:	f04a                	sd	s2,32(sp)
     800016ea:	e05a                	sd	s6,0(sp)
     800016ec:	894e                	mv	s2,s3
-    if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){
     800016ee:	0126eb13          	ori	s6,a3,18
-    mem = kalloc();
     800016f2:	d58ff0ef          	jal	80000c4a <kalloc>
     800016f6:	84aa                	mv	s1,a0
-    if(mem == 0){
     800016f8:	c515                	beqz	a0,80001724 <uvmalloc+0x64>
-    memset(mem, 0, PGSIZE);
     800016fa:	6605                	lui	a2,0x1
     800016fc:	4581                	li	a1,0
     800016fe:	861ff0ef          	jal	80000f5e <memset>
-    if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){
     80001702:	875a                	mv	a4,s6
     80001704:	86a6                	mv	a3,s1
     80001706:	6605                	lui	a2,0x1
@@ -2626,27 +2709,22 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
     8000170a:	8556                	mv	a0,s5
     8000170c:	c0bff0ef          	jal	80001316 <mappages>
     80001710:	e915                	bnez	a0,80001744 <uvmalloc+0x84>
-  for(a = oldsz; a < newsz; a += PGSIZE){
     80001712:	6785                	lui	a5,0x1
     80001714:	993e                	add	s2,s2,a5
     80001716:	fd496ee3          	bltu	s2,s4,800016f2 <uvmalloc+0x32>
-  return newsz;
     8000171a:	8552                	mv	a0,s4
     8000171c:	74a2                	ld	s1,40(sp)
     8000171e:	7902                	ld	s2,32(sp)
     80001720:	6b02                	ld	s6,0(sp)
     80001722:	a811                	j	80001736 <uvmalloc+0x76>
-      uvmdealloc(pagetable, a, oldsz);
     80001724:	864e                	mv	a2,s3
     80001726:	85ca                	mv	a1,s2
     80001728:	8556                	mv	a0,s5
     8000172a:	f53ff0ef          	jal	8000167c <uvmdealloc>
-      return 0;
     8000172e:	4501                	li	a0,0
     80001730:	74a2                	ld	s1,40(sp)
     80001732:	7902                	ld	s2,32(sp)
     80001734:	6b02                	ld	s6,0(sp)
-}
     80001736:	70e2                	ld	ra,56(sp)
     80001738:	7442                	ld	s0,48(sp)
     8000173a:	69e2                	ld	s3,24(sp)
@@ -2654,35 +2732,23 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
     8000173e:	6aa2                	ld	s5,8(sp)
     80001740:	6121                	addi	sp,sp,64
     80001742:	8082                	ret
-      kfree(mem);
     80001744:	8526                	mv	a0,s1
     80001746:	ba0ff0ef          	jal	80000ae6 <kfree>
-      uvmdealloc(pagetable, a, oldsz);
     8000174a:	864e                	mv	a2,s3
     8000174c:	85ca                	mv	a1,s2
     8000174e:	8556                	mv	a0,s5
     80001750:	f2dff0ef          	jal	8000167c <uvmdealloc>
-      return 0;
     80001754:	4501                	li	a0,0
     80001756:	74a2                	ld	s1,40(sp)
     80001758:	7902                	ld	s2,32(sp)
     8000175a:	6b02                	ld	s6,0(sp)
     8000175c:	bfe9                	j	80001736 <uvmalloc+0x76>
-    return oldsz;
     8000175e:	852e                	mv	a0,a1
-}
     80001760:	8082                	ret
-  return newsz;
     80001762:	8532                	mv	a0,a2
     80001764:	bfc9                	j	80001736 <uvmalloc+0x76>
 
 0000000080001766 <freewalk>:
-
-// Recursively free page-table pages.
-// All leaf mappings must already have been removed.
-void
-freewalk(pagetable_t pagetable)
-{
     80001766:	7179                	addi	sp,sp,-48
     80001768:	f406                	sd	ra,40(sp)
     8000176a:	f022                	sd	s0,32(sp)
@@ -2692,44 +2758,27 @@ freewalk(pagetable_t pagetable)
     80001772:	e052                	sd	s4,0(sp)
     80001774:	1800                	addi	s0,sp,48
     80001776:	8a2a                	mv	s4,a0
-  // there are 2^9 = 512 PTEs in a page table.
-  for(int i = 0; i < 512; i++){
     80001778:	84aa                	mv	s1,a0
     8000177a:	6905                	lui	s2,0x1
     8000177c:	992a                	add	s2,s2,a0
-    pte_t pte = pagetable[i];
-    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
     8000177e:	4985                	li	s3,1
     80001780:	a819                	j	80001796 <freewalk+0x30>
-      // this PTE points to a lower-level page table.
-      uint64 child = PTE2PA(pte);
     80001782:	83a9                	srli	a5,a5,0xa
-      freewalk((pagetable_t)child);
     80001784:	00c79513          	slli	a0,a5,0xc
     80001788:	fdfff0ef          	jal	80001766 <freewalk>
-      pagetable[i] = 0;
     8000178c:	0004b023          	sd	zero,0(s1)
-  for(int i = 0; i < 512; i++){
     80001790:	04a1                	addi	s1,s1,8
     80001792:	01248f63          	beq	s1,s2,800017b0 <freewalk+0x4a>
-    pte_t pte = pagetable[i];
     80001796:	609c                	ld	a5,0(s1)
-    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
     80001798:	00f7f713          	andi	a4,a5,15
     8000179c:	ff3703e3          	beq	a4,s3,80001782 <freewalk+0x1c>
-    } else if(pte & PTE_V){
     800017a0:	8b85                	andi	a5,a5,1
     800017a2:	d7fd                	beqz	a5,80001790 <freewalk+0x2a>
-      panic("freewalk: leaf");
     800017a4:	00007517          	auipc	a0,0x7
     800017a8:	edc50513          	addi	a0,a0,-292 # 80008680 <etext+0x680>
     800017ac:	fe9fe0ef          	jal	80000794 <panic>
-    }
-  }
-  kfree((void*)pagetable);
     800017b0:	8552                	mv	a0,s4
     800017b2:	b34ff0ef          	jal	80000ae6 <kfree>
-}
     800017b6:	70a2                	ld	ra,40(sp)
     800017b8:	7402                	ld	s0,32(sp)
     800017ba:	64e2                	ld	s1,24(sp)
@@ -2740,31 +2789,20 @@ freewalk(pagetable_t pagetable)
     800017c4:	8082                	ret
 
 00000000800017c6 <uvmfree>:
-
-// Free user memory pages,
-// then free page-table pages.
-void
-uvmfree(pagetable_t pagetable, uint64 sz)
-{
     800017c6:	1101                	addi	sp,sp,-32
     800017c8:	ec06                	sd	ra,24(sp)
     800017ca:	e822                	sd	s0,16(sp)
     800017cc:	e426                	sd	s1,8(sp)
     800017ce:	1000                	addi	s0,sp,32
     800017d0:	84aa                	mv	s1,a0
-  if(sz > 0)
     800017d2:	e989                	bnez	a1,800017e4 <uvmfree+0x1e>
-    uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
-  freewalk(pagetable);
     800017d4:	8526                	mv	a0,s1
     800017d6:	f91ff0ef          	jal	80001766 <freewalk>
-}
     800017da:	60e2                	ld	ra,24(sp)
     800017dc:	6442                	ld	s0,16(sp)
     800017de:	64a2                	ld	s1,8(sp)
     800017e0:	6105                	addi	sp,sp,32
     800017e2:	8082                	ret
-    uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
     800017e4:	6785                	lui	a5,0x1
     800017e6:	17fd                	addi	a5,a5,-1 # fff <_entry-0x7ffff001>
     800017e8:	95be                	add	a1,a1,a5
@@ -2775,22 +2813,11 @@ uvmfree(pagetable_t pagetable, uint64 sz)
     800017f6:	bff9                	j	800017d4 <uvmfree+0xe>
 
 00000000800017f8 <uvmcopy>:
-// returns 0 on success, -1 on failure.
-// frees any allocated pages on failure.
-// kernel/vm.c
-int
-uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
-{
     800017f8:	7139                	addi	sp,sp,-64
     800017fa:	fc06                	sd	ra,56(sp)
     800017fc:	f822                	sd	s0,48(sp)
     800017fe:	ec4e                	sd	s3,24(sp)
     80001800:	0080                	addi	s0,sp,64
-  pte_t *pte;
-  uint64 pa, i;
-  uint flags;
-
-  for(i = 0; i < sz; i += PGSIZE){
     80001802:	c65d                	beqz	a2,800018b0 <uvmcopy+0xb8>
     80001804:	f426                	sd	s1,40(sp)
     80001806:	f04a                	sd	s2,32(sp)
@@ -2802,25 +2829,13 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
     80001812:	8a32                	mv	s4,a2
     80001814:	4481                	li	s1,0
     80001816:	a83d                	j	80001854 <uvmcopy+0x5c>
-    if((pte = walk(old, i, 0)) == 0)
-      panic("uvmcopy: pte should exist");
     80001818:	00007517          	auipc	a0,0x7
     8000181c:	e7850513          	addi	a0,a0,-392 # 80008690 <etext+0x690>
     80001820:	f75fe0ef          	jal	80000794 <panic>
-    if((*pte & PTE_V) == 0)
-      panic("uvmcopy: page not present");
     80001824:	00007517          	auipc	a0,0x7
     80001828:	e8c50513          	addi	a0,a0,-372 # 800086b0 <etext+0x6b0>
     8000182c:	f69fe0ef          	jal	80000794 <panic>
-    // 如果该页本身就不可写,那么子进程肯定也不可写,不用对其考虑COW
-    if(*pte & PTE_W){  
-        *pte &= ~PTE_W;
-        *pte |= PTE_COW;
-    }
-    flags = PTE_FLAGS(*pte);
     80001830:	6118                	ld	a4,0(a0)
-    // child
-    if(mappages(new, i, PGSIZE, (uint64)pa, flags) != 0){
     80001832:	3ff77713          	andi	a4,a4,1023
     80001836:	86ca                	mv	a3,s2
     80001838:	6605                	lui	a2,0x1
@@ -2829,55 +2844,38 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
     8000183e:	ad9ff0ef          	jal	80001316 <mappages>
     80001842:	89aa                	mv	s3,a0
     80001844:	ed0d                	bnez	a0,8000187e <uvmcopy+0x86>
-      goto err;
-    }
-    refup((void*)pa);
     80001846:	854a                	mv	a0,s2
     80001848:	a0eff0ef          	jal	80000a56 <refup>
-  for(i = 0; i < sz; i += PGSIZE){
     8000184c:	6785                	lui	a5,0x1
     8000184e:	94be                	add	s1,s1,a5
     80001850:	0544fa63          	bgeu	s1,s4,800018a4 <uvmcopy+0xac>
-    if((pte = walk(old, i, 0)) == 0)
     80001854:	4601                	li	a2,0
     80001856:	85a6                	mv	a1,s1
     80001858:	855a                	mv	a0,s6
     8000185a:	985ff0ef          	jal	800011de <walk>
     8000185e:	dd4d                	beqz	a0,80001818 <uvmcopy+0x20>
-    if((*pte & PTE_V) == 0)
     80001860:	611c                	ld	a5,0(a0)
     80001862:	0017f713          	andi	a4,a5,1
     80001866:	df5d                	beqz	a4,80001824 <uvmcopy+0x2c>
-    pa = PTE2PA(*pte);
     80001868:	00a7d913          	srli	s2,a5,0xa
     8000186c:	0932                	slli	s2,s2,0xc
-    if(*pte & PTE_W){  
     8000186e:	0047f713          	andi	a4,a5,4
     80001872:	df5d                	beqz	a4,80001830 <uvmcopy+0x38>
-        *pte &= ~PTE_W;
     80001874:	9bed                	andi	a5,a5,-5
-        *pte |= PTE_COW;
     80001876:	1007e793          	ori	a5,a5,256
     8000187a:	e11c                	sd	a5,0(a0)
     8000187c:	bf55                	j	80001830 <uvmcopy+0x38>
-  }
-  return 0;
-
- err:
-  uvmunmap(new, 0, i / PGSIZE, 1);
     8000187e:	4685                	li	a3,1
     80001880:	00c4d613          	srli	a2,s1,0xc
     80001884:	4581                	li	a1,0
     80001886:	8556                	mv	a0,s5
     80001888:	c21ff0ef          	jal	800014a8 <uvmunmap>
-  return -1;
     8000188c:	59fd                	li	s3,-1
     8000188e:	74a2                	ld	s1,40(sp)
     80001890:	7902                	ld	s2,32(sp)
     80001892:	6a42                	ld	s4,16(sp)
     80001894:	6aa2                	ld	s5,8(sp)
     80001896:	6b02                	ld	s6,0(sp)
-}
     80001898:	854e                	mv	a0,s3
     8000189a:	70e2                	ld	ra,56(sp)
     8000189c:	7442                	ld	s0,48(sp)
@@ -2890,52 +2888,30 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
     800018aa:	6aa2                	ld	s5,8(sp)
     800018ac:	6b02                	ld	s6,0(sp)
     800018ae:	b7ed                	j	80001898 <uvmcopy+0xa0>
-  return 0;
     800018b0:	4981                	li	s3,0
     800018b2:	b7dd                	j	80001898 <uvmcopy+0xa0>
 
 00000000800018b4 <uvmclear>:
-
-// mark a PTE invalid for user access.
-// used by exec for the user stack guard page.
-void
-uvmclear(pagetable_t pagetable, uint64 va)
-{
     800018b4:	1141                	addi	sp,sp,-16
     800018b6:	e406                	sd	ra,8(sp)
     800018b8:	e022                	sd	s0,0(sp)
     800018ba:	0800                	addi	s0,sp,16
-  pte_t *pte;
-  
-  pte = walk(pagetable, va, 0);
     800018bc:	4601                	li	a2,0
     800018be:	921ff0ef          	jal	800011de <walk>
-  if(pte == 0)
     800018c2:	c901                	beqz	a0,800018d2 <uvmclear+0x1e>
-    panic("uvmclear");
-  *pte &= ~PTE_U;
     800018c4:	611c                	ld	a5,0(a0)
     800018c6:	9bbd                	andi	a5,a5,-17
     800018c8:	e11c                	sd	a5,0(a0)
-}
     800018ca:	60a2                	ld	ra,8(sp)
     800018cc:	6402                	ld	s0,0(sp)
     800018ce:	0141                	addi	sp,sp,16
     800018d0:	8082                	ret
-    panic("uvmclear");
     800018d2:	00007517          	auipc	a0,0x7
     800018d6:	dfe50513          	addi	a0,a0,-514 # 800086d0 <etext+0x6d0>
     800018da:	ebbfe0ef          	jal	80000794 <panic>
 
 00000000800018de <copyout>:
-int
-copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
-{
-  uint64 n, va0, pa0;
-
-  while(len > 0){
     800018de:	c2d9                	beqz	a3,80001964 <copyout+0x86>
-{
     800018e0:	711d                	addi	sp,sp,-96
     800018e2:	ec86                	sd	ra,88(sp)
     800018e4:	e8a2                	sd	s0,80(sp)
@@ -2953,72 +2929,44 @@ copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
     800018fc:	89ae                	mv	s3,a1
     800018fe:	8ab2                	mv	s5,a2
     80001900:	8a36                	mv	s4,a3
-    va0 = PGROUNDDOWN(dstva);
     80001902:	7c7d                	lui	s8,0xfffff
-    if(iscowpage(va0)){                 // è¿™
-      startcowcopy(va0);                // 是
-      pa0 = walkaddr(pagetable, va0);   // 加
-    }                                   // çš„
-
-    n = PGSIZE - (dstva - va0);
     80001904:	6b05                	lui	s6,0x1
     80001906:	a815                	j	8000193a <copyout+0x5c>
-      startcowcopy(va0);                // 是
     80001908:	854a                	mv	a0,s2
     8000190a:	c5bff0ef          	jal	80001564 <startcowcopy>
-      pa0 = walkaddr(pagetable, va0);   // 加
     8000190e:	85ca                	mv	a1,s2
     80001910:	855e                	mv	a0,s7
     80001912:	9c7ff0ef          	jal	800012d8 <walkaddr>
     80001916:	8caa                	mv	s9,a0
     80001918:	a82d                	j	80001952 <copyout+0x74>
-    if(n > len)
-      n = len;
-    memmove((void *)(pa0 + (dstva - va0)), src, n);
     8000191a:	412989b3          	sub	s3,s3,s2
     8000191e:	0004861b          	sext.w	a2,s1
     80001922:	85d6                	mv	a1,s5
     80001924:	01998533          	add	a0,s3,s9
     80001928:	e92ff0ef          	jal	80000fba <memmove>
-
-    len -= n;
     8000192c:	409a0a33          	sub	s4,s4,s1
-    src += n;
     80001930:	9aa6                	add	s5,s5,s1
-    dstva = va0 + PGSIZE;
     80001932:	016909b3          	add	s3,s2,s6
-  while(len > 0){
     80001936:	020a0563          	beqz	s4,80001960 <copyout+0x82>
-    va0 = PGROUNDDOWN(dstva);
     8000193a:	0189f933          	and	s2,s3,s8
-    pa0 = walkaddr(pagetable, va0);
     8000193e:	85ca                	mv	a1,s2
     80001940:	855e                	mv	a0,s7
     80001942:	997ff0ef          	jal	800012d8 <walkaddr>
     80001946:	8caa                	mv	s9,a0
-    if(pa0 == 0)
     80001948:	c105                	beqz	a0,80001968 <copyout+0x8a>
-    if(iscowpage(va0)){                 // è¿™
     8000194a:	854a                	mv	a0,s2
     8000194c:	92dff0ef          	jal	80001278 <iscowpage>
     80001950:	fd45                	bnez	a0,80001908 <copyout+0x2a>
-    n = PGSIZE - (dstva - va0);
     80001952:	413904b3          	sub	s1,s2,s3
     80001956:	94da                	add	s1,s1,s6
-    if(n > len)
     80001958:	fc9a71e3          	bgeu	s4,s1,8000191a <copyout+0x3c>
     8000195c:	84d2                	mv	s1,s4
     8000195e:	bf75                	j	8000191a <copyout+0x3c>
-  }
-  return 0;
     80001960:	4501                	li	a0,0
     80001962:	a021                	j	8000196a <copyout+0x8c>
     80001964:	4501                	li	a0,0
-}
     80001966:	8082                	ret
-      return -1;
     80001968:	557d                	li	a0,-1
-}
     8000196a:	60e6                	ld	ra,88(sp)
     8000196c:	6446                	ld	s0,80(sp)
     8000196e:	64a6                	ld	s1,72(sp)
@@ -3034,14 +2982,7 @@ copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
     80001982:	8082                	ret
 
 0000000080001984 <copyin>:
-int
-copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
-{
-  uint64 n, va0, pa0;
-
-  while(len > 0){
     80001984:	c6a5                	beqz	a3,800019ec <copyin+0x68>
-{
     80001986:	715d                	addi	sp,sp,-80
     80001988:	e486                	sd	ra,72(sp)
     8000198a:	e0a2                	sd	s0,64(sp)
@@ -3058,56 +2999,33 @@ copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
     800019a0:	8a2e                	mv	s4,a1
     800019a2:	8c32                	mv	s8,a2
     800019a4:	89b6                	mv	s3,a3
-    va0 = PGROUNDDOWN(srcva);
     800019a6:	7bfd                	lui	s7,0xfffff
-    pa0 = walkaddr(pagetable, va0);
-    if(pa0 == 0)
-      return -1;
-    n = PGSIZE - (srcva - va0);
     800019a8:	6a85                	lui	s5,0x1
     800019aa:	a00d                	j	800019cc <copyin+0x48>
-    if(n > len)
-      n = len;
-    memmove(dst, (void *)(pa0 + (srcva - va0)), n);
     800019ac:	018505b3          	add	a1,a0,s8
     800019b0:	0004861b          	sext.w	a2,s1
     800019b4:	412585b3          	sub	a1,a1,s2
     800019b8:	8552                	mv	a0,s4
     800019ba:	e00ff0ef          	jal	80000fba <memmove>
-
-    len -= n;
     800019be:	409989b3          	sub	s3,s3,s1
-    dst += n;
     800019c2:	9a26                	add	s4,s4,s1
-    srcva = va0 + PGSIZE;
     800019c4:	01590c33          	add	s8,s2,s5
-  while(len > 0){
     800019c8:	02098063          	beqz	s3,800019e8 <copyin+0x64>
-    va0 = PGROUNDDOWN(srcva);
     800019cc:	017c7933          	and	s2,s8,s7
-    pa0 = walkaddr(pagetable, va0);
     800019d0:	85ca                	mv	a1,s2
     800019d2:	855a                	mv	a0,s6
     800019d4:	905ff0ef          	jal	800012d8 <walkaddr>
-    if(pa0 == 0)
     800019d8:	cd01                	beqz	a0,800019f0 <copyin+0x6c>
-    n = PGSIZE - (srcva - va0);
     800019da:	418904b3          	sub	s1,s2,s8
     800019de:	94d6                	add	s1,s1,s5
-    if(n > len)
     800019e0:	fc99f6e3          	bgeu	s3,s1,800019ac <copyin+0x28>
     800019e4:	84ce                	mv	s1,s3
     800019e6:	b7d9                	j	800019ac <copyin+0x28>
-  }
-  return 0;
     800019e8:	4501                	li	a0,0
     800019ea:	a021                	j	800019f2 <copyin+0x6e>
     800019ec:	4501                	li	a0,0
-}
     800019ee:	8082                	ret
-      return -1;
     800019f0:	557d                	li	a0,-1
-}
     800019f2:	60a6                	ld	ra,72(sp)
     800019f4:	6406                	ld	s0,64(sp)
     800019f6:	74e2                	ld	s1,56(sp)
@@ -3122,14 +3040,7 @@ copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
     80001a08:	8082                	ret
 
 0000000080001a0a <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){
     80001a0a:	c6dd                	beqz	a3,80001ab8 <copyinstr+0xae>
-{
     80001a0c:	715d                	addi	sp,sp,-80
     80001a0e:	e486                	sd	ra,72(sp)
     80001a10:	e0a2                	sd	s0,64(sp)
@@ -3145,35 +3056,13 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
     80001a24:	8b2e                	mv	s6,a1
     80001a26:	8bb2                	mv	s7,a2
     80001a28:	8936                	mv	s2,a3
-    va0 = PGROUNDDOWN(srcva);
     80001a2a:	7afd                	lui	s5,0xfffff
-    pa0 = walkaddr(pagetable, va0);
-    if(pa0 == 0)
-      return -1;
-    n = PGSIZE - (srcva - va0);
     80001a2c:	6985                	lui	s3,0x1
     80001a2e:	a825                	j	80001a66 <copyinstr+0x5c>
-      n = max;
-
-    char *p = (char *) (pa0 + (srcva - va0));
-    while(n > 0){
-      if(*p == '\0'){
-        *dst = '\0';
     80001a30:	00078023          	sb	zero,0(a5) # 1000 <_entry-0x7ffff000>
     80001a34:	4785                	li	a5,1
-      dst++;
-    }
-
-    srcva = va0 + PGSIZE;
-  }
-  if(got_null){
     80001a36:	37fd                	addiw	a5,a5,-1
     80001a38:	0007851b          	sext.w	a0,a5
-    return 0;
-  } else {
-    return -1;
-  }
-}
     80001a3c:	60a6                	ld	ra,72(sp)
     80001a3e:	6406                	ld	s0,64(sp)
     80001a40:	74e2                	ld	s1,56(sp)
@@ -3187,67 +3076,45 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
     80001a50:	8082                	ret
     80001a52:	fff90713          	addi	a4,s2,-1 # fff <_entry-0x7ffff001>
     80001a56:	9742                	add	a4,a4,a6
-      --max;
     80001a58:	40b70933          	sub	s2,a4,a1
-    srcva = va0 + PGSIZE;
     80001a5c:	01348bb3          	add	s7,s1,s3
-  while(got_null == 0 && max > 0){
     80001a60:	04e58463          	beq	a1,a4,80001aa8 <copyinstr+0x9e>
-{
     80001a64:	8b3e                	mv	s6,a5
-    va0 = PGROUNDDOWN(srcva);
     80001a66:	015bf4b3          	and	s1,s7,s5
-    pa0 = walkaddr(pagetable, va0);
     80001a6a:	85a6                	mv	a1,s1
     80001a6c:	8552                	mv	a0,s4
     80001a6e:	86bff0ef          	jal	800012d8 <walkaddr>
-    if(pa0 == 0)
     80001a72:	cd0d                	beqz	a0,80001aac <copyinstr+0xa2>
-    n = PGSIZE - (srcva - va0);
     80001a74:	417486b3          	sub	a3,s1,s7
     80001a78:	96ce                	add	a3,a3,s3
-    if(n > max)
     80001a7a:	00d97363          	bgeu	s2,a3,80001a80 <copyinstr+0x76>
     80001a7e:	86ca                	mv	a3,s2
-    char *p = (char *) (pa0 + (srcva - va0));
     80001a80:	955e                	add	a0,a0,s7
     80001a82:	8d05                	sub	a0,a0,s1
-    while(n > 0){
     80001a84:	c695                	beqz	a3,80001ab0 <copyinstr+0xa6>
     80001a86:	87da                	mv	a5,s6
     80001a88:	885a                	mv	a6,s6
-      if(*p == '\0'){
     80001a8a:	41650633          	sub	a2,a0,s6
-    while(n > 0){
     80001a8e:	96da                	add	a3,a3,s6
     80001a90:	85be                	mv	a1,a5
-      if(*p == '\0'){
     80001a92:	00f60733          	add	a4,a2,a5
     80001a96:	00074703          	lbu	a4,0(a4) # fffffffffffff000 <end+0xffffffff7ffb15c8>
     80001a9a:	db59                	beqz	a4,80001a30 <copyinstr+0x26>
-        *dst = *p;
     80001a9c:	00e78023          	sb	a4,0(a5)
-      dst++;
     80001aa0:	0785                	addi	a5,a5,1
-    while(n > 0){
     80001aa2:	fed797e3          	bne	a5,a3,80001a90 <copyinstr+0x86>
     80001aa6:	b775                	j	80001a52 <copyinstr+0x48>
     80001aa8:	4781                	li	a5,0
     80001aaa:	b771                	j	80001a36 <copyinstr+0x2c>
-      return -1;
     80001aac:	557d                	li	a0,-1
     80001aae:	b779                	j	80001a3c <copyinstr+0x32>
-    srcva = va0 + PGSIZE;
     80001ab0:	6b85                	lui	s7,0x1
     80001ab2:	9ba6                	add	s7,s7,s1
     80001ab4:	87da                	mv	a5,s6
     80001ab6:	b77d                	j	80001a64 <copyinstr+0x5a>
-  int got_null = 0;
     80001ab8:	4781                	li	a5,0
-  if(got_null){
     80001aba:	37fd                	addiw	a5,a5,-1
     80001abc:	0007851b          	sext.w	a0,a5
-}
     80001ac0:	8082                	ret
 
 0000000080001ac2 <get_shared_var>:
@@ -4584,6 +4451,11 @@ trapinithart(void)
     8000282e:	1141                	addi	sp,sp,-16
     80002830:	e422                	sd	s0,8(sp)
     80002832:	0800                	addi	s0,sp,16
+// Supervisor Trap-Vector Base Address
+// low two bits are mode.
+static inline void 
+w_stvec(uint64 x)
+{
   asm volatile("csrw stvec, %0" : : "r" (x));
     80002834:	00003797          	auipc	a5,0x3
     80002838:	23c78793          	addi	a5,a5,572 # 80005a70 <kernelvec>
@@ -4609,6 +4481,11 @@ usertrapret(void)
     8000284e:	c6eff0ef          	jal	80001cbc <myproc>
   asm volatile("csrr %0, sstatus" : "=r" (x) );
     80002852:	100027f3          	csrr	a5,sstatus
+
+// disable device interrupts
+static inline void
+intr_off()
+{
   w_sstatus(r_sstatus() & ~SSTATUS_SIE);
     80002856:	9bf5                	andi	a5,a5,-3
   asm volatile("csrw sstatus, %0" : : "r" (x));
@@ -4652,6 +4529,11 @@ usertrapret(void)
     80002898:	eb10                	sd	a2,16(a4)
   p->trapframe->kernel_hartid = r_tp();         // hartid for cpuid()
     8000289a:	7138                	ld	a4,96(a0)
+// this core's hartid (core number), the index into cpus[].
+static inline uint64
+r_tp()
+{
+  uint64 x;
   asm volatile("mv %0, tp" : "=r" (x) );
     8000289c:	8612                	mv	a2,tp
     8000289e:	f310                	sd	a2,32(a4)
@@ -5405,19 +5287,31 @@ devintr()
     80002e9c:	8082                	ret
 
 0000000080002e9e <HASHNUM>:
+  // head.next is most recent, head.prev is least.
+  struct buf head[NBUCKET];           // 哈希桶头
+  struct spinlock hash_lock[NBUCKET]; // 哈希桶锁
+} bcache;
+ 
+int HASHNUM(int blockno) {
     80002e9e:	1141                	addi	sp,sp,-16
     80002ea0:	e422                	sd	s0,8(sp)
     80002ea2:	0800                	addi	s0,sp,16
+  return blockno % NBUCKET;
     80002ea4:	41f5579b          	sraiw	a5,a0,0x1f
     80002ea8:	01b7d79b          	srliw	a5,a5,0x1b
     80002eac:	9d3d                	addw	a0,a0,a5
     80002eae:	897d                	andi	a0,a0,31
+}
     80002eb0:	9d1d                	subw	a0,a0,a5
     80002eb2:	6422                	ld	s0,8(sp)
     80002eb4:	0141                	addi	sp,sp,16
     80002eb6:	8082                	ret
 
 0000000080002eb8 <binit>:
+
+
+void binit(void)
+{
     80002eb8:	711d                	addi	sp,sp,-96
     80002eba:	ec86                	sd	ra,88(sp)
     80002ebc:	e8a2                	sd	s0,80(sp)
@@ -5431,23 +5325,36 @@ devintr()
     80002ecc:	e862                	sd	s8,16(sp)
     80002ece:	e466                	sd	s9,8(sp)
     80002ed0:	1080                	addi	s0,sp,96
+  struct buf *b;
+ 
+  initlock(&bcache.lock, "bcache");
     80002ed2:	00006597          	auipc	a1,0x6
     80002ed6:	a7e58593          	addi	a1,a1,-1410 # 80008950 <etext+0x950>
     80002eda:	00037517          	auipc	a0,0x37
     80002ede:	dee50513          	addi	a0,a0,-530 # 80039cc8 <bcache>
     80002ee2:	f29fd0ef          	jal	80000e0a <initlock>
+ 
+  // 哈希桶和哈希桶锁初始化
+  for (int i = 0; i < NBUCKET; i++)
     80002ee6:	00048917          	auipc	s2,0x48
     80002eea:	b4a90913          	addi	s2,s2,-1206 # 8004aa30 <bcache+0x10d68>
     80002eee:	0003f497          	auipc	s1,0x3f
     80002ef2:	04248493          	addi	s1,s1,66 # 80041f30 <bcache+0x8268>
     80002ef6:	8a4a                	mv	s4,s2
+  {
+    // snprintf(name, 20, "bcache.bucket.%d", i);
+    // printf("name:%s\n",);
+    initlock(&bcache.hash_lock[i], "bcache.bucket");
     80002ef8:	00006997          	auipc	s3,0x6
     80002efc:	a6098993          	addi	s3,s3,-1440 # 80008958 <etext+0x958>
     80002f00:	85ce                	mv	a1,s3
     80002f02:	854a                	mv	a0,s2
     80002f04:	f07fd0ef          	jal	80000e0a <initlock>
+    bcache.head[i].prev = &bcache.head[i];
     80002f08:	e4a4                	sd	s1,72(s1)
+    bcache.head[i].next = &bcache.head[i];
     80002f0a:	e8a4                	sd	s1,80(s1)
+  for (int i = 0; i < NBUCKET; i++)
     80002f0c:	0961                	addi	s2,s2,24
     80002f0e:	45848493          	addi	s1,s1,1112
     80002f12:	ff4497e3          	bne	s1,s4,80002f00 <binit+0x48>
@@ -5458,37 +5365,55 @@ devintr()
     80002f24:	00037a97          	auipc	s5,0x37
     80002f28:	da4a8a93          	addi	s5,s5,-604 # 80039cc8 <bcache>
     80002f2c:	9abe                	add	s5,s5,a5
+  for (int i = 0; i < NBUF; i++)
+  {
+    b = &bcache.buf[i];
+    // printf("blockno:%d\n",b->blockno);
+    hash_num = HASHNUM(b->blockno);
+    b->next = bcache.head[hash_num].next;
     80002f2e:	00037997          	auipc	s3,0x37
     80002f32:	d9a98993          	addi	s3,s3,-614 # 80039cc8 <bcache>
     80002f36:	45800c13          	li	s8,1112
     80002f3a:	6ba1                	lui	s7,0x8
+    b->prev = &bcache.head[hash_num];
     80002f3c:	6a21                	lui	s4,0x8
     80002f3e:	268a0a13          	addi	s4,s4,616 # 8268 <_entry-0x7fff7d98>
+    initsleeplock(&b->lock, "buffer");
     80002f42:	00006b17          	auipc	s6,0x6
     80002f46:	a26b0b13          	addi	s6,s6,-1498 # 80008968 <etext+0x968>
+    b = &bcache.buf[i];
     80002f4a:	ff048913          	addi	s2,s1,-16
+  return blockno % NBUCKET;
     80002f4e:	ffc4a783          	lw	a5,-4(s1)
     80002f52:	41f7d71b          	sraiw	a4,a5,0x1f
     80002f56:	01b7571b          	srliw	a4,a4,0x1b
     80002f5a:	9fb9                	addw	a5,a5,a4
     80002f5c:	8bfd                	andi	a5,a5,31
     80002f5e:	9f99                	subw	a5,a5,a4
+    b->next = bcache.head[hash_num].next;
     80002f60:	038787b3          	mul	a5,a5,s8
     80002f64:	00f98cb3          	add	s9,s3,a5
     80002f68:	9cde                	add	s9,s9,s7
     80002f6a:	2b8cb703          	ld	a4,696(s9)
     80002f6e:	e0b8                	sd	a4,64(s1)
+    b->prev = &bcache.head[hash_num];
     80002f70:	97d2                	add	a5,a5,s4
     80002f72:	97ce                	add	a5,a5,s3
     80002f74:	fc9c                	sd	a5,56(s1)
+    initsleeplock(&b->lock, "buffer");
     80002f76:	85da                	mv	a1,s6
     80002f78:	8526                	mv	a0,s1
     80002f7a:	466010ef          	jal	800043e0 <initsleeplock>
+    bcache.head[hash_num].next->prev = b;
     80002f7e:	2b8cb783          	ld	a5,696(s9)
     80002f82:	0527b423          	sd	s2,72(a5)
+    bcache.head[hash_num].next = b;
     80002f86:	2b2cbc23          	sd	s2,696(s9)
+  for (int i = 0; i < NBUF; i++)
     80002f8a:	45848493          	addi	s1,s1,1112
     80002f8e:	fb549ee3          	bne	s1,s5,80002f4a <binit+0x92>
+  }
+}
     80002f92:	60e6                	ld	ra,88(sp)
     80002f94:	6446                	ld	s0,80(sp)
     80002f96:	64a6                	ld	s1,72(sp)
@@ -5504,6 +5429,12 @@ devintr()
     80002faa:	8082                	ret
 
 0000000080002fac <bread>:
+
+
+// Return a locked buf with the contents of the indicated block.
+struct buf*
+bread(uint dev, uint blockno)
+{
     80002fac:	711d                	addi	sp,sp,-96
     80002fae:	ec86                	sd	ra,88(sp)
     80002fb0:	e8a2                	sd	s0,80(sp)
@@ -5517,11 +5448,13 @@ devintr()
     80002fc0:	1080                	addi	s0,sp,96
     80002fc2:	89aa                	mv	s3,a0
     80002fc4:	8a2e                	mv	s4,a1
+  return blockno % NBUCKET;
     80002fc6:	41f5d79b          	sraiw	a5,a1,0x1f
     80002fca:	01b7d79b          	srliw	a5,a5,0x1b
     80002fce:	00b78b3b          	addw	s6,a5,a1
     80002fd2:	01fb7b13          	andi	s6,s6,31
     80002fd6:	40fb0b3b          	subw	s6,s6,a5
+  acquire(&bcache.hash_lock[hash_num]);
     80002fda:	001b1a93          	slli	s5,s6,0x1
     80002fde:	9ada                	add	s5,s5,s6
     80002fe0:	0a8e                	slli	s5,s5,0x3
@@ -5533,6 +5466,7 @@ devintr()
     80002ff2:	9ade                	add	s5,s5,s7
     80002ff4:	8556                	mv	a0,s5
     80002ff6:	e95fd0ef          	jal	80000e8a <acquire>
+  for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next)
     80002ffa:	45800913          	li	s2,1112
     80002ffe:	032b0933          	mul	s2,s6,s2
     80003002:	012b8733          	add	a4,s7,s2
@@ -5544,13 +5478,17 @@ devintr()
     80003014:	993e                	add	s2,s2,a5
     80003016:	995e                	add	s2,s2,s7
     80003018:	09249a63          	bne	s1,s2,800030ac <bread+0x100>
+  release(&bcache.hash_lock[hash_num]);
     8000301c:	8556                	mv	a0,s5
     8000301e:	f05fd0ef          	jal	80000f22 <release>
+  acquire(&bcache.lock);
     80003022:	00037517          	auipc	a0,0x37
     80003026:	ca650513          	addi	a0,a0,-858 # 80039cc8 <bcache>
     8000302a:	e61fd0ef          	jal	80000e8a <acquire>
+  acquire(&bcache.hash_lock[hash_num]);
     8000302e:	8556                	mv	a0,s5
     80003030:	e5bfd0ef          	jal	80000e8a <acquire>
+  for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next)
     80003034:	45800793          	li	a5,1112
     80003038:	02fb07b3          	mul	a5,s6,a5
     8000303c:	00037717          	auipc	a4,0x37
@@ -5562,72 +5500,101 @@ devintr()
     8000304e:	09249363          	bne	s1,s2,800030d4 <bread+0x128>
     80003052:	e862                	sd	s8,16(sp)
     80003054:	e466                	sd	s9,8(sp)
+  release(&bcache.hash_lock[hash_num]);
     80003056:	8556                	mv	a0,s5
     80003058:	ecbfd0ef          	jal	80000f22 <release>
+  for (int i = 0; i < NBUCKET; i++)
     8000305c:	00048c17          	auipc	s8,0x48
     80003060:	9d4c0c13          	addi	s8,s8,-1580 # 8004aa30 <bcache+0x10d68>
     80003064:	0003fa97          	auipc	s5,0x3f
     80003068:	ecca8a93          	addi	s5,s5,-308 # 80041f30 <bcache+0x8268>
     8000306c:	8ce2                	mv	s9,s8
+    acquire(&bcache.hash_lock[i]);
     8000306e:	8be2                	mv	s7,s8
     80003070:	8562                	mv	a0,s8
     80003072:	e19fd0ef          	jal	80000e8a <acquire>
+    for (b = bcache.head[i].prev; b != &bcache.head[i]; b = b->prev)
     80003076:	8756                	mv	a4,s5
     80003078:	048ab483          	ld	s1,72(s5)
     8000307c:	01548763          	beq	s1,s5,8000308a <bread+0xde>
+      if (b->refcnt==0)
     80003080:	40bc                	lw	a5,64(s1)
     80003082:	c3c1                	beqz	a5,80003102 <bread+0x156>
+    for (b = bcache.head[i].prev; b != &bcache.head[i]; b = b->prev)
     80003084:	64a4                	ld	s1,72(s1)
     80003086:	fee49de3          	bne	s1,a4,80003080 <bread+0xd4>
+    release(&bcache.hash_lock[i]);
     8000308a:	855e                	mv	a0,s7
     8000308c:	e97fd0ef          	jal	80000f22 <release>
+  for (int i = 0; i < NBUCKET; i++)
     80003090:	0c61                	addi	s8,s8,24
     80003092:	458a8a93          	addi	s5,s5,1112
     80003096:	fd9a9ce3          	bne	s5,s9,8000306e <bread+0xc2>
+  panic("bget: no buffers");
     8000309a:	00006517          	auipc	a0,0x6
     8000309e:	8d650513          	addi	a0,a0,-1834 # 80008970 <etext+0x970>
     800030a2:	ef2fd0ef          	jal	80000794 <panic>
+  for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next)
     800030a6:	68a4                	ld	s1,80(s1)
     800030a8:	f7248ae3          	beq	s1,s2,8000301c <bread+0x70>
+    if (b->dev == dev && b->blockno == blockno)
     800030ac:	449c                	lw	a5,8(s1)
     800030ae:	ff379ce3          	bne	a5,s3,800030a6 <bread+0xfa>
     800030b2:	44dc                	lw	a5,12(s1)
     800030b4:	ff4799e3          	bne	a5,s4,800030a6 <bread+0xfa>
+      b->refcnt++;
     800030b8:	40bc                	lw	a5,64(s1)
     800030ba:	2785                	addiw	a5,a5,1
     800030bc:	c0bc                	sw	a5,64(s1)
+      release(&bcache.hash_lock[hash_num]);
     800030be:	8556                	mv	a0,s5
     800030c0:	e63fd0ef          	jal	80000f22 <release>
+      acquiresleep(&b->lock);
     800030c4:	01048513          	addi	a0,s1,16
     800030c8:	34e010ef          	jal	80004416 <acquiresleep>
+      return b;
     800030cc:	a849                	j	8000315e <bread+0x1b2>
+  for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next)
     800030ce:	68a4                	ld	s1,80(s1)
     800030d0:	f92481e3          	beq	s1,s2,80003052 <bread+0xa6>
+    if (b->dev == dev && b->blockno == blockno)
     800030d4:	449c                	lw	a5,8(s1)
     800030d6:	ff379ce3          	bne	a5,s3,800030ce <bread+0x122>
     800030da:	44dc                	lw	a5,12(s1)
     800030dc:	ff4799e3          	bne	a5,s4,800030ce <bread+0x122>
+      b->refcnt++;
     800030e0:	40bc                	lw	a5,64(s1)
     800030e2:	2785                	addiw	a5,a5,1
     800030e4:	c0bc                	sw	a5,64(s1)
+      release(&bcache.lock);
     800030e6:	00037517          	auipc	a0,0x37
     800030ea:	be250513          	addi	a0,a0,-1054 # 80039cc8 <bcache>
     800030ee:	e35fd0ef          	jal	80000f22 <release>
+      release(&bcache.hash_lock[hash_num]);
     800030f2:	8556                	mv	a0,s5
     800030f4:	e2ffd0ef          	jal	80000f22 <release>
+      acquiresleep(&b->lock);
     800030f8:	01048513          	addi	a0,s1,16
     800030fc:	31a010ef          	jal	80004416 <acquiresleep>
+      return b;
     80003100:	a8b9                	j	8000315e <bread+0x1b2>
+        b->dev=dev;
     80003102:	0134a423          	sw	s3,8(s1)
+        b->blockno=blockno;
     80003106:	0144a623          	sw	s4,12(s1)
+        b->valid=0;
     8000310a:	0004a023          	sw	zero,0(s1)
+        b->refcnt=1;
     8000310e:	4785                	li	a5,1
     80003110:	c0bc                	sw	a5,64(s1)
+        b->prev->next=b->next;
     80003112:	64b8                	ld	a4,72(s1)
     80003114:	68bc                	ld	a5,80(s1)
     80003116:	eb3c                	sd	a5,80(a4)
+        b->next->prev=b->prev;
     80003118:	64b8                	ld	a4,72(s1)
     8000311a:	e7b8                	sd	a4,72(a5)
+        b->next=bcache.head[hash_num].next;
     8000311c:	00037997          	auipc	s3,0x37
     80003120:	bac98993          	addi	s3,s3,-1108 # 80039cc8 <bcache>
     80003124:	45800793          	li	a5,1112
@@ -5637,20 +5604,36 @@ devintr()
     80003130:	97da                	add	a5,a5,s6
     80003132:	2b87b703          	ld	a4,696(a5) # 82b8 <_entry-0x7fff7d48>
     80003136:	e8b8                	sd	a4,80(s1)
+        b->prev=&bcache.head[hash_num];
     80003138:	0524b423          	sd	s2,72(s1)
+        bcache.head[hash_num].next->prev=b;
     8000313c:	2b87b703          	ld	a4,696(a5)
     80003140:	e724                	sd	s1,72(a4)
+        bcache.head[hash_num].next=b;
     80003142:	2a97bc23          	sd	s1,696(a5)
+        release(&bcache.hash_lock[i]);
     80003146:	855e                	mv	a0,s7
     80003148:	ddbfd0ef          	jal	80000f22 <release>
+        release(&bcache.lock);
     8000314c:	854e                	mv	a0,s3
     8000314e:	dd5fd0ef          	jal	80000f22 <release>
+        acquiresleep(&b->lock);
     80003152:	01048513          	addi	a0,s1,16
     80003156:	2c0010ef          	jal	80004416 <acquiresleep>
+        return b;
     8000315a:	6c42                	ld	s8,16(sp)
     8000315c:	6ca2                	ld	s9,8(sp)
+  struct buf *b;
+
+  b = bget(dev, blockno);
+  if(!b->valid) {
     8000315e:	409c                	lw	a5,0(s1)
     80003160:	cf89                	beqz	a5,8000317a <bread+0x1ce>
+    virtio_disk_rw(b, 0);
+    b->valid = 1;
+  }
+  return b;
+}
     80003162:	8526                	mv	a0,s1
     80003164:	60e6                	ld	ra,88(sp)
     80003166:	6446                	ld	s0,80(sp)
@@ -5663,36 +5646,55 @@ devintr()
     80003174:	6be2                	ld	s7,24(sp)
     80003176:	6125                	addi	sp,sp,96
     80003178:	8082                	ret
+    virtio_disk_rw(b, 0);
     8000317a:	4581                	li	a1,0
     8000317c:	8526                	mv	a0,s1
     8000317e:	453020ef          	jal	80005dd0 <virtio_disk_rw>
+    b->valid = 1;
     80003182:	4785                	li	a5,1
     80003184:	c09c                	sw	a5,0(s1)
+  return b;
     80003186:	bff1                	j	80003162 <bread+0x1b6>
 
 0000000080003188 <bwrite>:
+
+// Write b's contents to disk.  Must be locked.
+void
+bwrite(struct buf *b)
+{
     80003188:	1101                	addi	sp,sp,-32
     8000318a:	ec06                	sd	ra,24(sp)
     8000318c:	e822                	sd	s0,16(sp)
     8000318e:	e426                	sd	s1,8(sp)
     80003190:	1000                	addi	s0,sp,32
     80003192:	84aa                	mv	s1,a0
+  if(!holdingsleep(&b->lock))
     80003194:	0541                	addi	a0,a0,16
     80003196:	2fe010ef          	jal	80004494 <holdingsleep>
     8000319a:	c911                	beqz	a0,800031ae <bwrite+0x26>
+    panic("bwrite");
+  virtio_disk_rw(b, 1);
     8000319c:	4585                	li	a1,1
     8000319e:	8526                	mv	a0,s1
     800031a0:	431020ef          	jal	80005dd0 <virtio_disk_rw>
+}
     800031a4:	60e2                	ld	ra,24(sp)
     800031a6:	6442                	ld	s0,16(sp)
     800031a8:	64a2                	ld	s1,8(sp)
     800031aa:	6105                	addi	sp,sp,32
     800031ac:	8082                	ret
+    panic("bwrite");
     800031ae:	00005517          	auipc	a0,0x5
     800031b2:	7da50513          	addi	a0,a0,2010 # 80008988 <etext+0x988>
     800031b6:	ddefd0ef          	jal	80000794 <panic>
 
 00000000800031ba <brelse>:
+// Release a locked buffer.
+// Move to the head of the most-recently-used list.
+// buf.c
+
+void brelse(struct buf *b)
+{
     800031ba:	1101                	addi	sp,sp,-32
     800031bc:	ec06                	sd	ra,24(sp)
     800031be:	e822                	sd	s0,16(sp)
@@ -5700,38 +5702,63 @@ devintr()
     800031c2:	e04a                	sd	s2,0(sp)
     800031c4:	1000                	addi	s0,sp,32
     800031c6:	84aa                	mv	s1,a0
+  if (!holdingsleep(&b->lock))
     800031c8:	01050913          	addi	s2,a0,16
     800031cc:	854a                	mv	a0,s2
     800031ce:	2c6010ef          	jal	80004494 <holdingsleep>
     800031d2:	c115                	beqz	a0,800031f6 <brelse+0x3c>
+    panic("brelse");
+ 
+  releasesleep(&b->lock);
     800031d4:	854a                	mv	a0,s2
     800031d6:	286010ef          	jal	8000445c <releasesleep>
+ 
+  // acquire(&bcache.lock);
+  
+  int hash_num = HASHNUM(b->blockno);
     800031da:	44dc                	lw	a5,12(s1)
+  // acquire(&bcache.hash_lock[hash_num]);
+  if (b->refcnt > 0)
     800031dc:	40b8                	lw	a4,64(s1)
     800031de:	c315                	beqz	a4,80003202 <brelse+0x48>
+  {
+    b->refcnt--;
     800031e0:	377d                	addiw	a4,a4,-1
     800031e2:	0007069b          	sext.w	a3,a4
     800031e6:	c0b8                	sw	a4,64(s1)
+  }
+  if (b->refcnt == 0)
     800031e8:	ce89                	beqz	a3,80003202 <brelse+0x48>
+    b->next = bcache.head[hash_num].next;
+    b->prev = &bcache.head[hash_num];
+    bcache.head[hash_num].next->prev = b;
+    bcache.head[hash_num].next = b;
+  }
+}
     800031ea:	60e2                	ld	ra,24(sp)
     800031ec:	6442                	ld	s0,16(sp)
     800031ee:	64a2                	ld	s1,8(sp)
     800031f0:	6902                	ld	s2,0(sp)
     800031f2:	6105                	addi	sp,sp,32
     800031f4:	8082                	ret
+    panic("brelse");
     800031f6:	00005517          	auipc	a0,0x5
     800031fa:	79a50513          	addi	a0,a0,1946 # 80008990 <etext+0x990>
     800031fe:	d96fd0ef          	jal	80000794 <panic>
+  return blockno % NBUCKET;
     80003202:	41f7d71b          	sraiw	a4,a5,0x1f
     80003206:	01b7571b          	srliw	a4,a4,0x1b
     8000320a:	9fb9                	addw	a5,a5,a4
     8000320c:	8bfd                	andi	a5,a5,31
     8000320e:	9f99                	subw	a5,a5,a4
+    b->next->prev = b->prev;
     80003210:	68b4                	ld	a3,80(s1)
     80003212:	64b8                	ld	a4,72(s1)
     80003214:	e6b8                	sd	a4,72(a3)
+    b->prev->next = b->next;
     80003216:	68b4                	ld	a3,80(s1)
     80003218:	eb34                	sd	a3,80(a4)
+    b->next = bcache.head[hash_num].next;
     8000321a:	00037617          	auipc	a2,0x37
     8000321e:	aae60613          	addi	a2,a2,-1362 # 80039cc8 <bcache>
     80003222:	45800713          	li	a4,1112
@@ -5741,17 +5768,24 @@ devintr()
     80003230:	9736                	add	a4,a4,a3
     80003232:	2b873683          	ld	a3,696(a4) # 82b8 <_entry-0x7fff7d48>
     80003236:	e8b4                	sd	a3,80(s1)
+    b->prev = &bcache.head[hash_num];
     80003238:	66a1                	lui	a3,0x8
     8000323a:	26868693          	addi	a3,a3,616 # 8268 <_entry-0x7fff7d98>
     8000323e:	97b6                	add	a5,a5,a3
     80003240:	97b2                	add	a5,a5,a2
     80003242:	e4bc                	sd	a5,72(s1)
+    bcache.head[hash_num].next->prev = b;
     80003244:	2b873783          	ld	a5,696(a4)
     80003248:	e7a4                	sd	s1,72(a5)
+    bcache.head[hash_num].next = b;
     8000324a:	2a973c23          	sd	s1,696(a4)
+}
     8000324e:	bf71                	j	800031ea <brelse+0x30>
 
 0000000080003250 <bpin>:
+
+void bpin(struct buf *b)
+{
     80003250:	1101                	addi	sp,sp,-32
     80003252:	ec06                	sd	ra,24(sp)
     80003254:	e822                	sd	s0,16(sp)
@@ -5759,11 +5793,14 @@ devintr()
     80003258:	e04a                	sd	s2,0(sp)
     8000325a:	1000                	addi	s0,sp,32
     8000325c:	892a                	mv	s2,a0
+  return blockno % NBUCKET;
     8000325e:	455c                	lw	a5,12(a0)
     80003260:	41f7d71b          	sraiw	a4,a5,0x1f
     80003264:	01b7571b          	srliw	a4,a4,0x1b
     80003268:	9fb9                	addw	a5,a5,a4
     8000326a:	8bfd                	andi	a5,a5,31
+  int hash_num=HASHNUM(b->blockno);
+  acquire(&bcache.hash_lock[hash_num]);
     8000326c:	9f99                	subw	a5,a5,a4
     8000326e:	00179493          	slli	s1,a5,0x1
     80003272:	94be                	add	s1,s1,a5
@@ -5776,11 +5813,17 @@ devintr()
     80003286:	94be                	add	s1,s1,a5
     80003288:	8526                	mv	a0,s1
     8000328a:	c01fd0ef          	jal	80000e8a <acquire>
+  b->refcnt++;
     8000328e:	04092783          	lw	a5,64(s2)
     80003292:	2785                	addiw	a5,a5,1
     80003294:	04f92023          	sw	a5,64(s2)
+  release(&bcache.hash_lock[hash_num]);
     80003298:	8526                	mv	a0,s1
     8000329a:	c89fd0ef          	jal	80000f22 <release>
+  // acquire(&bcache.lock);
+  // b->refcnt++;
+  // release(&bcache.lock);
+}
     8000329e:	60e2                	ld	ra,24(sp)
     800032a0:	6442                	ld	s0,16(sp)
     800032a2:	64a2                	ld	s1,8(sp)
@@ -5789,6 +5832,9 @@ devintr()
     800032a8:	8082                	ret
 
 00000000800032aa <bunpin>:
+ 
+void bunpin(struct buf *b)
+{
     800032aa:	1101                	addi	sp,sp,-32
     800032ac:	ec06                	sd	ra,24(sp)
     800032ae:	e822                	sd	s0,16(sp)
@@ -5796,11 +5842,14 @@ devintr()
     800032b2:	e04a                	sd	s2,0(sp)
     800032b4:	1000                	addi	s0,sp,32
     800032b6:	892a                	mv	s2,a0
+  return blockno % NBUCKET;
     800032b8:	455c                	lw	a5,12(a0)
     800032ba:	41f7d71b          	sraiw	a4,a5,0x1f
     800032be:	01b7571b          	srliw	a4,a4,0x1b
     800032c2:	9fb9                	addw	a5,a5,a4
     800032c4:	8bfd                	andi	a5,a5,31
+  int hash_num=HASHNUM(b->blockno);
+  acquire(&bcache.hash_lock[hash_num]);
     800032c6:	9f99                	subw	a5,a5,a4
     800032c8:	00179493          	slli	s1,a5,0x1
     800032cc:	94be                	add	s1,s1,a5
@@ -5813,11 +5862,17 @@ devintr()
     800032e0:	94be                	add	s1,s1,a5
     800032e2:	8526                	mv	a0,s1
     800032e4:	ba7fd0ef          	jal	80000e8a <acquire>
+  b->refcnt--;
     800032e8:	04092783          	lw	a5,64(s2)
     800032ec:	37fd                	addiw	a5,a5,-1
     800032ee:	04f92023          	sw	a5,64(s2)
+  release(&bcache.hash_lock[hash_num]);
     800032f2:	8526                	mv	a0,s1
     800032f4:	c2ffd0ef          	jal	80000f22 <release>
+  // acquire(&bcache.lock);
+  // b->refcnt++;
+  // release(&bcache.lock);
+}
     800032f8:	60e2                	ld	ra,24(sp)
     800032fa:	6442                	ld	s0,16(sp)
     800032fc:	64a2                	ld	s1,8(sp)
@@ -5826,6 +5881,12 @@ devintr()
     80003302:	8082                	ret
 
 0000000080003304 <bfree>:
+}
+
+// Free a disk block.
+static void
+bfree(int dev, uint b)
+{
     80003304:	1101                	addi	sp,sp,-32
     80003306:	ec06                	sd	ra,24(sp)
     80003308:	e822                	sd	s0,16(sp)
@@ -5833,14 +5894,21 @@ devintr()
     8000330c:	e04a                	sd	s2,0(sp)
     8000330e:	1000                	addi	s0,sp,32
     80003310:	84ae                	mv	s1,a1
+  struct buf *bp;
+  int bi, m;
+
+  bp = bread(dev, BBLOCK(b, sb));
     80003312:	00d5d59b          	srliw	a1,a1,0xd
     80003316:	00048797          	auipc	a5,0x48
     8000331a:	a367a783          	lw	a5,-1482(a5) # 8004ad4c <sb+0x1c>
     8000331e:	9dbd                	addw	a1,a1,a5
     80003320:	c8dff0ef          	jal	80002fac <bread>
+  bi = b % BPB;
+  m = 1 << (bi % 8);
     80003324:	0074f713          	andi	a4,s1,7
     80003328:	4785                	li	a5,1
     8000332a:	00e797bb          	sllw	a5,a5,a4
+  if((bp->data[bi/8] & m) == 0)
     8000332e:	14ce                	slli	s1,s1,0x33
     80003330:	90d9                	srli	s1,s1,0x36
     80003332:	00950733          	add	a4,a0,s1
@@ -5848,29 +5916,37 @@ devintr()
     8000333a:	00e7f6b3          	and	a3,a5,a4
     8000333e:	c29d                	beqz	a3,80003364 <bfree+0x60>
     80003340:	892a                	mv	s2,a0
+    panic("freeing free block");
+  bp->data[bi/8] &= ~m;
     80003342:	94aa                	add	s1,s1,a0
     80003344:	fff7c793          	not	a5,a5
     80003348:	8f7d                	and	a4,a4,a5
     8000334a:	04e48c23          	sb	a4,88(s1)
+  log_write(bp);
     8000334e:	7c3000ef          	jal	80004310 <log_write>
+  brelse(bp);
     80003352:	854a                	mv	a0,s2
     80003354:	e67ff0ef          	jal	800031ba <brelse>
+}
     80003358:	60e2                	ld	ra,24(sp)
     8000335a:	6442                	ld	s0,16(sp)
     8000335c:	64a2                	ld	s1,8(sp)
     8000335e:	6902                	ld	s2,0(sp)
     80003360:	6105                	addi	sp,sp,32
     80003362:	8082                	ret
+    panic("freeing free block");
     80003364:	00005517          	auipc	a0,0x5
     80003368:	63450513          	addi	a0,a0,1588 # 80008998 <etext+0x998>
     8000336c:	c28fd0ef          	jal	80000794 <panic>
 
 0000000080003370 <balloc>:
+{
     80003370:	711d                	addi	sp,sp,-96
     80003372:	ec86                	sd	ra,88(sp)
     80003374:	e8a2                	sd	s0,80(sp)
     80003376:	e4a6                	sd	s1,72(sp)
     80003378:	1080                	addi	s0,sp,96
+  for(b = 0; b < sb.size; b += BPB){
     8000337a:	00048797          	auipc	a5,0x48
     8000337e:	9ba7a783          	lw	a5,-1606(a5) # 8004ad34 <sb+0x4>
     80003382:	0e078f63          	beqz	a5,80003480 <balloc+0x110>
@@ -5884,32 +5960,45 @@ devintr()
     80003394:	e466                	sd	s9,8(sp)
     80003396:	8baa                	mv	s7,a0
     80003398:	4a81                	li	s5,0
+    bp = bread(dev, BBLOCK(b, sb));
     8000339a:	00048b17          	auipc	s6,0x48
     8000339e:	996b0b13          	addi	s6,s6,-1642 # 8004ad30 <sb>
+    for(bi = 0; bi < BPB && b + bi < sb.size; bi++){
     800033a2:	4c01                	li	s8,0
+      m = 1 << (bi % 8);
     800033a4:	4985                	li	s3,1
+    for(bi = 0; bi < BPB && b + bi < sb.size; bi++){
     800033a6:	6a09                	lui	s4,0x2
+  for(b = 0; b < sb.size; b += BPB){
     800033a8:	6c89                	lui	s9,0x2
     800033aa:	a0b5                	j	80003416 <balloc+0xa6>
+        bp->data[bi/8] |= m;  // Mark block in use.
     800033ac:	97ca                	add	a5,a5,s2
     800033ae:	8e55                	or	a2,a2,a3
     800033b0:	04c78c23          	sb	a2,88(a5)
+        log_write(bp);
     800033b4:	854a                	mv	a0,s2
     800033b6:	75b000ef          	jal	80004310 <log_write>
+        brelse(bp);
     800033ba:	854a                	mv	a0,s2
     800033bc:	dffff0ef          	jal	800031ba <brelse>
+  bp = bread(dev, bno);
     800033c0:	85a6                	mv	a1,s1
     800033c2:	855e                	mv	a0,s7
     800033c4:	be9ff0ef          	jal	80002fac <bread>
     800033c8:	892a                	mv	s2,a0
+  memset(bp->data, 0, BSIZE);
     800033ca:	40000613          	li	a2,1024
     800033ce:	4581                	li	a1,0
     800033d0:	05850513          	addi	a0,a0,88
     800033d4:	b8bfd0ef          	jal	80000f5e <memset>
+  log_write(bp);
     800033d8:	854a                	mv	a0,s2
     800033da:	737000ef          	jal	80004310 <log_write>
+  brelse(bp);
     800033de:	854a                	mv	a0,s2
     800033e0:	ddbff0ef          	jal	800031ba <brelse>
+}
     800033e4:	6906                	ld	s2,64(sp)
     800033e6:	79e2                	ld	s3,56(sp)
     800033e8:	7a42                	ld	s4,48(sp)
@@ -5918,18 +6007,22 @@ devintr()
     800033ee:	6be2                	ld	s7,24(sp)
     800033f0:	6c42                	ld	s8,16(sp)
     800033f2:	6ca2                	ld	s9,8(sp)
+}
     800033f4:	8526                	mv	a0,s1
     800033f6:	60e6                	ld	ra,88(sp)
     800033f8:	6446                	ld	s0,80(sp)
     800033fa:	64a6                	ld	s1,72(sp)
     800033fc:	6125                	addi	sp,sp,96
     800033fe:	8082                	ret
+    brelse(bp);
     80003400:	854a                	mv	a0,s2
     80003402:	db9ff0ef          	jal	800031ba <brelse>
+  for(b = 0; b < sb.size; b += BPB){
     80003406:	015c87bb          	addw	a5,s9,s5
     8000340a:	00078a9b          	sext.w	s5,a5
     8000340e:	004b2703          	lw	a4,4(s6)
     80003412:	04eaff63          	bgeu	s5,a4,80003470 <balloc+0x100>
+    bp = bread(dev, BBLOCK(b, sb));
     80003416:	41fad79b          	sraiw	a5,s5,0x1f
     8000341a:	0137d79b          	srliw	a5,a5,0x13
     8000341e:	015787bb          	addw	a5,a5,s5
@@ -5939,12 +6032,15 @@ devintr()
     8000342c:	855e                	mv	a0,s7
     8000342e:	b7fff0ef          	jal	80002fac <bread>
     80003432:	892a                	mv	s2,a0
+    for(bi = 0; bi < BPB && b + bi < sb.size; bi++){
     80003434:	004b2503          	lw	a0,4(s6)
     80003438:	000a849b          	sext.w	s1,s5
     8000343c:	8762                	mv	a4,s8
     8000343e:	fca4f1e3          	bgeu	s1,a0,80003400 <balloc+0x90>
+      m = 1 << (bi % 8);
     80003442:	00777693          	andi	a3,a4,7
     80003446:	00d996bb          	sllw	a3,s3,a3
+      if((bp->data[bi/8] & m) == 0){  // Is block free?
     8000344a:	41f7579b          	sraiw	a5,a4,0x1f
     8000344e:	01d7d79b          	srliw	a5,a5,0x1d
     80003452:	9fb9                	addw	a5,a5,a4
@@ -5953,6 +6049,7 @@ devintr()
     8000345c:	05864603          	lbu	a2,88(a2)
     80003460:	00c6f5b3          	and	a1,a3,a2
     80003464:	d5a1                	beqz	a1,800033ac <balloc+0x3c>
+    for(bi = 0; bi < BPB && b + bi < sb.size; bi++){
     80003466:	2705                	addiw	a4,a4,1
     80003468:	2485                	addiw	s1,s1,1
     8000346a:	fd471ae3          	bne	a4,s4,8000343e <balloc+0xce>
@@ -5965,13 +6062,21 @@ devintr()
     8000347a:	6be2                	ld	s7,24(sp)
     8000347c:	6c42                	ld	s8,16(sp)
     8000347e:	6ca2                	ld	s9,8(sp)
+  printf("balloc: out of blocks\n");
     80003480:	00005517          	auipc	a0,0x5
     80003484:	53050513          	addi	a0,a0,1328 # 800089b0 <etext+0x9b0>
     80003488:	83afd0ef          	jal	800004c2 <printf>
+  return 0;
     8000348c:	4481                	li	s1,0
     8000348e:	b79d                	j	800033f4 <balloc+0x84>
 
 0000000080003490 <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)
+{
     80003490:	7139                	addi	sp,sp,-64
     80003492:	fc06                	sd	ra,56(sp)
     80003494:	f822                	sd	s0,48(sp)
@@ -5980,13 +6085,26 @@ devintr()
     8000349a:	ec4e                	sd	s3,24(sp)
     8000349c:	0080                	addi	s0,sp,64
     8000349e:	89aa                	mv	s3,a0
+  uint addr, *a;
+  struct buf *bp;
+  struct buf *bp2;
+  uint *a2;
+
+  if(bn < NDIRECT){
     800034a0:	47a9                	li	a5,10
     800034a2:	02b7ee63          	bltu	a5,a1,800034de <bmap+0x4e>
+    if((addr = ip->addrs[bn]) == 0){
     800034a6:	02059793          	slli	a5,a1,0x20
     800034aa:	01e7d593          	srli	a1,a5,0x1e
     800034ae:	00b504b3          	add	s1,a0,a1
     800034b2:	0504a903          	lw	s2,80(s1)
     800034b6:	00090a63          	beqz	s2,800034ca <bmap+0x3a>
+    brelse(bp2);
+    return addr;
+  }
+
+  panic("bmap: out of range");
+}
     800034ba:	854a                	mv	a0,s2
     800034bc:	70e2                	ld	ra,56(sp)
     800034be:	7442                	ld	s0,48(sp)
@@ -5995,108 +6113,147 @@ devintr()
     800034c4:	69e2                	ld	s3,24(sp)
     800034c6:	6121                	addi	sp,sp,64
     800034c8:	8082                	ret
+      addr = balloc(ip->dev);
     800034ca:	4108                	lw	a0,0(a0)
     800034cc:	ea5ff0ef          	jal	80003370 <balloc>
     800034d0:	0005091b          	sext.w	s2,a0
+      if(addr == 0)
     800034d4:	fe0903e3          	beqz	s2,800034ba <bmap+0x2a>
+      ip->addrs[bn] = addr;
     800034d8:	0524a823          	sw	s2,80(s1)
     800034dc:	bff9                	j	800034ba <bmap+0x2a>
+  bn -= NDIRECT;
     800034de:	ff55849b          	addiw	s1,a1,-11
     800034e2:	0004871b          	sext.w	a4,s1
+  if(bn < NINDIRECT){
     800034e6:	0ff00793          	li	a5,255
     800034ea:	06e7e663          	bltu	a5,a4,80003556 <bmap+0xc6>
+    if((addr = ip->addrs[NDIRECT]) == 0){
     800034ee:	07c52903          	lw	s2,124(a0)
     800034f2:	00091d63          	bnez	s2,8000350c <bmap+0x7c>
+      addr = balloc(ip->dev);
     800034f6:	4108                	lw	a0,0(a0)
     800034f8:	e79ff0ef          	jal	80003370 <balloc>
     800034fc:	0005091b          	sext.w	s2,a0
+      if(addr == 0)
     80003500:	fa090de3          	beqz	s2,800034ba <bmap+0x2a>
     80003504:	e852                	sd	s4,16(sp)
+      ip->addrs[NDIRECT] = addr;
     80003506:	0729ae23          	sw	s2,124(s3)
     8000350a:	a011                	j	8000350e <bmap+0x7e>
     8000350c:	e852                	sd	s4,16(sp)
+    bp = bread(ip->dev, addr);
     8000350e:	85ca                	mv	a1,s2
     80003510:	0009a503          	lw	a0,0(s3)
     80003514:	a99ff0ef          	jal	80002fac <bread>
     80003518:	8a2a                	mv	s4,a0
+    a = (uint*)bp->data;
     8000351a:	05850793          	addi	a5,a0,88
+    if((addr = a[bn]) == 0){
     8000351e:	02049713          	slli	a4,s1,0x20
     80003522:	01e75493          	srli	s1,a4,0x1e
     80003526:	94be                	add	s1,s1,a5
     80003528:	0004a903          	lw	s2,0(s1)
     8000352c:	00090763          	beqz	s2,8000353a <bmap+0xaa>
+    brelse(bp);
     80003530:	8552                	mv	a0,s4
     80003532:	c89ff0ef          	jal	800031ba <brelse>
+    return addr;
     80003536:	6a42                	ld	s4,16(sp)
     80003538:	b749                	j	800034ba <bmap+0x2a>
+      addr = balloc(ip->dev);
     8000353a:	0009a503          	lw	a0,0(s3)
     8000353e:	e33ff0ef          	jal	80003370 <balloc>
     80003542:	0005091b          	sext.w	s2,a0
+      if(addr){
     80003546:	fe0905e3          	beqz	s2,80003530 <bmap+0xa0>
+        a[bn] = addr;
     8000354a:	0124a023          	sw	s2,0(s1)
+        log_write(bp);
     8000354e:	8552                	mv	a0,s4
     80003550:	5c1000ef          	jal	80004310 <log_write>
     80003554:	bff1                	j	80003530 <bmap+0xa0>
     80003556:	e852                	sd	s4,16(sp)
     80003558:	e456                	sd	s5,8(sp)
+  bn -= NINDIRECT;
     8000355a:	ef55859b          	addiw	a1,a1,-267
     8000355e:	0005871b          	sext.w	a4,a1
+  if(bn < NDOUBLE_INDIRECT){
     80003562:	67c1                	lui	a5,0x10
     80003564:	0af77263          	bgeu	a4,a5,80003608 <bmap+0x178>
+    uint bn_level_1 = bn / NINDIRECT;
     80003568:	0085d91b          	srliw	s2,a1,0x8
+    uint bn_level_2 = bn % NINDIRECT;
     8000356c:	0ff5f493          	zext.b	s1,a1
+    if((addr = ip->addrs[NDIRECT+1]) ==0)
     80003570:	08052583          	lw	a1,128(a0)
     80003574:	c9b1                	beqz	a1,800035c8 <bmap+0x138>
+    bp  = bread(ip->dev,addr);
     80003576:	0009a503          	lw	a0,0(s3)
     8000357a:	a33ff0ef          	jal	80002fac <bread>
     8000357e:	8a2a                	mv	s4,a0
+    a = (uint*)bp->data;
     80003580:	05850793          	addi	a5,a0,88
+    if((addr = a[bn_level_1]) ==0){
     80003584:	1902                	slli	s2,s2,0x20
     80003586:	02095913          	srli	s2,s2,0x20
     8000358a:	090a                	slli	s2,s2,0x2
     8000358c:	993e                	add	s2,s2,a5
     8000358e:	00092a83          	lw	s5,0(s2)
     80003592:	040a8363          	beqz	s5,800035d8 <bmap+0x148>
+    brelse(bp);
     80003596:	8552                	mv	a0,s4
     80003598:	c23ff0ef          	jal	800031ba <brelse>
+    bp2 =  bread(ip->dev,addr);
     8000359c:	85d6                	mv	a1,s5
     8000359e:	0009a503          	lw	a0,0(s3)
     800035a2:	a0bff0ef          	jal	80002fac <bread>
     800035a6:	8a2a                	mv	s4,a0
+    a2 = (uint*)bp2->data;
     800035a8:	05850793          	addi	a5,a0,88
+    if((addr = a2[bn_level_2])==0){
     800035ac:	00249593          	slli	a1,s1,0x2
     800035b0:	00b784b3          	add	s1,a5,a1
     800035b4:	0004a903          	lw	s2,0(s1)
     800035b8:	02090c63          	beqz	s2,800035f0 <bmap+0x160>
+    brelse(bp2);
     800035bc:	8552                	mv	a0,s4
     800035be:	bfdff0ef          	jal	800031ba <brelse>
+    return addr;
     800035c2:	6a42                	ld	s4,16(sp)
     800035c4:	6aa2                	ld	s5,8(sp)
     800035c6:	bdd5                	j	800034ba <bmap+0x2a>
+      ip->addrs[NDIRECT +1] = addr = balloc(ip->dev);
     800035c8:	4108                	lw	a0,0(a0)
     800035ca:	da7ff0ef          	jal	80003370 <balloc>
     800035ce:	0005059b          	sext.w	a1,a0
     800035d2:	08b9a023          	sw	a1,128(s3)
     800035d6:	b745                	j	80003576 <bmap+0xe6>
+      a[bn_level_1] = addr = balloc(ip->dev);
     800035d8:	0009a503          	lw	a0,0(s3)
     800035dc:	d95ff0ef          	jal	80003370 <balloc>
     800035e0:	00050a9b          	sext.w	s5,a0
     800035e4:	01592023          	sw	s5,0(s2)
+      log_write(bp);
     800035e8:	8552                	mv	a0,s4
     800035ea:	527000ef          	jal	80004310 <log_write>
     800035ee:	b765                	j	80003596 <bmap+0x106>
+      a2[bn_level_2] = addr = balloc(ip->dev);
     800035f0:	0009a503          	lw	a0,0(s3)
     800035f4:	d7dff0ef          	jal	80003370 <balloc>
     800035f8:	0005091b          	sext.w	s2,a0
     800035fc:	0124a023          	sw	s2,0(s1)
+      log_write(bp2);
     80003600:	8552                	mv	a0,s4
     80003602:	50f000ef          	jal	80004310 <log_write>
     80003606:	bf5d                	j	800035bc <bmap+0x12c>
+  panic("bmap: out of range");
     80003608:	00005517          	auipc	a0,0x5
     8000360c:	3c050513          	addi	a0,a0,960 # 800089c8 <etext+0x9c8>
     80003610:	984fd0ef          	jal	80000794 <panic>
 
 0000000080003614 <iget>:
+{
     80003614:	7179                	addi	sp,sp,-48
     80003616:	f406                	sd	ra,40(sp)
     80003618:	f022                	sd	s0,32(sp)
@@ -6107,43 +6264,61 @@ devintr()
     80003622:	1800                	addi	s0,sp,48
     80003624:	89aa                	mv	s3,a0
     80003626:	8a2e                	mv	s4,a1
+  acquire(&itable.lock);
     80003628:	00047517          	auipc	a0,0x47
     8000362c:	72850513          	addi	a0,a0,1832 # 8004ad50 <itable>
     80003630:	85bfd0ef          	jal	80000e8a <acquire>
+  empty = 0;
     80003634:	4901                	li	s2,0
+  for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){
     80003636:	00047497          	auipc	s1,0x47
     8000363a:	73248493          	addi	s1,s1,1842 # 8004ad68 <itable+0x18>
     8000363e:	00049697          	auipc	a3,0x49
     80003642:	1ba68693          	addi	a3,a3,442 # 8004c7f8 <log>
     80003646:	a039                	j	80003654 <iget+0x40>
+    if(empty == 0 && ip->ref == 0)    // Remember empty slot.
     80003648:	02090963          	beqz	s2,8000367a <iget+0x66>
+  for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){
     8000364c:	08848493          	addi	s1,s1,136
     80003650:	02d48863          	beq	s1,a3,80003680 <iget+0x6c>
+    if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){
     80003654:	449c                	lw	a5,8(s1)
     80003656:	fef059e3          	blez	a5,80003648 <iget+0x34>
     8000365a:	4098                	lw	a4,0(s1)
     8000365c:	ff3716e3          	bne	a4,s3,80003648 <iget+0x34>
     80003660:	40d8                	lw	a4,4(s1)
     80003662:	ff4713e3          	bne	a4,s4,80003648 <iget+0x34>
+      ip->ref++;
     80003666:	2785                	addiw	a5,a5,1 # 10001 <_entry-0x7ffeffff>
     80003668:	c49c                	sw	a5,8(s1)
+      release(&itable.lock);
     8000366a:	00047517          	auipc	a0,0x47
     8000366e:	6e650513          	addi	a0,a0,1766 # 8004ad50 <itable>
     80003672:	8b1fd0ef          	jal	80000f22 <release>
+      return ip;
     80003676:	8926                	mv	s2,s1
     80003678:	a02d                	j	800036a2 <iget+0x8e>
+    if(empty == 0 && ip->ref == 0)    // Remember empty slot.
     8000367a:	fbe9                	bnez	a5,8000364c <iget+0x38>
+      empty = ip;
     8000367c:	8926                	mv	s2,s1
     8000367e:	b7f9                	j	8000364c <iget+0x38>
+  if(empty == 0)
     80003680:	02090a63          	beqz	s2,800036b4 <iget+0xa0>
+  ip->dev = dev;
     80003684:	01392023          	sw	s3,0(s2)
+  ip->inum = inum;
     80003688:	01492223          	sw	s4,4(s2)
+  ip->ref = 1;
     8000368c:	4785                	li	a5,1
     8000368e:	00f92423          	sw	a5,8(s2)
+  ip->valid = 0;
     80003692:	04092023          	sw	zero,64(s2)
+  release(&itable.lock);
     80003696:	00047517          	auipc	a0,0x47
     8000369a:	6ba50513          	addi	a0,a0,1722 # 8004ad50 <itable>
     8000369e:	885fd0ef          	jal	80000f22 <release>
+}
     800036a2:	854a                	mv	a0,s2
     800036a4:	70a2                	ld	ra,40(sp)
     800036a6:	7402                	ld	s0,32(sp)
@@ -6153,11 +6328,13 @@ devintr()
     800036ae:	6a02                	ld	s4,0(sp)
     800036b0:	6145                	addi	sp,sp,48
     800036b2:	8082                	ret
+    panic("iget: no inodes");
     800036b4:	00005517          	auipc	a0,0x5
     800036b8:	32c50513          	addi	a0,a0,812 # 800089e0 <etext+0x9e0>
     800036bc:	8d8fd0ef          	jal	80000794 <panic>
 
 00000000800036c0 <fsinit>:
+fsinit(int dev) {
     800036c0:	7179                	addi	sp,sp,-48
     800036c2:	f406                	sd	ra,40(sp)
     800036c4:	f022                	sd	s0,32(sp)
@@ -6166,25 +6343,31 @@ devintr()
     800036ca:	e44e                	sd	s3,8(sp)
     800036cc:	1800                	addi	s0,sp,48
     800036ce:	892a                	mv	s2,a0
+  bp = bread(dev, 1);
     800036d0:	4585                	li	a1,1
     800036d2:	8dbff0ef          	jal	80002fac <bread>
     800036d6:	84aa                	mv	s1,a0
+  memmove(sb, bp->data, sizeof(*sb));
     800036d8:	00047997          	auipc	s3,0x47
     800036dc:	65898993          	addi	s3,s3,1624 # 8004ad30 <sb>
     800036e0:	02000613          	li	a2,32
     800036e4:	05850593          	addi	a1,a0,88
     800036e8:	854e                	mv	a0,s3
     800036ea:	8d1fd0ef          	jal	80000fba <memmove>
+  brelse(bp);
     800036ee:	8526                	mv	a0,s1
     800036f0:	acbff0ef          	jal	800031ba <brelse>
+  if(sb.magic != FSMAGIC)
     800036f4:	0009a703          	lw	a4,0(s3)
     800036f8:	102037b7          	lui	a5,0x10203
     800036fc:	04078793          	addi	a5,a5,64 # 10203040 <_entry-0x6fdfcfc0>
     80003700:	02f71063          	bne	a4,a5,80003720 <fsinit+0x60>
+  initlog(dev, &sb);
     80003704:	00047597          	auipc	a1,0x47
     80003708:	62c58593          	addi	a1,a1,1580 # 8004ad30 <sb>
     8000370c:	854a                	mv	a0,s2
     8000370e:	1fb000ef          	jal	80004108 <initlog>
+}
     80003712:	70a2                	ld	ra,40(sp)
     80003714:	7402                	ld	s0,32(sp)
     80003716:	64e2                	ld	s1,24(sp)
@@ -6192,11 +6375,13 @@ devintr()
     8000371a:	69a2                	ld	s3,8(sp)
     8000371c:	6145                	addi	sp,sp,48
     8000371e:	8082                	ret
+    panic("invalid file system");
     80003720:	00005517          	auipc	a0,0x5
     80003724:	2d050513          	addi	a0,a0,720 # 800089f0 <etext+0x9f0>
     80003728:	86cfd0ef          	jal	80000794 <panic>
 
 000000008000372c <iinit>:
+{
     8000372c:	7179                	addi	sp,sp,-48
     8000372e:	f406                	sd	ra,40(sp)
     80003730:	f022                	sd	s0,32(sp)
@@ -6204,22 +6389,27 @@ devintr()
     80003734:	e84a                	sd	s2,16(sp)
     80003736:	e44e                	sd	s3,8(sp)
     80003738:	1800                	addi	s0,sp,48
+  initlock(&itable.lock, "itable");
     8000373a:	00005597          	auipc	a1,0x5
     8000373e:	2ce58593          	addi	a1,a1,718 # 80008a08 <etext+0xa08>
     80003742:	00047517          	auipc	a0,0x47
     80003746:	60e50513          	addi	a0,a0,1550 # 8004ad50 <itable>
     8000374a:	ec0fd0ef          	jal	80000e0a <initlock>
+  for(i = 0; i < NINODE; i++) {
     8000374e:	00047497          	auipc	s1,0x47
     80003752:	62a48493          	addi	s1,s1,1578 # 8004ad78 <itable+0x28>
     80003756:	00049997          	auipc	s3,0x49
     8000375a:	0b298993          	addi	s3,s3,178 # 8004c808 <log+0x10>
+    initsleeplock(&itable.inode[i].lock, "inode");
     8000375e:	00005917          	auipc	s2,0x5
     80003762:	2b290913          	addi	s2,s2,690 # 80008a10 <etext+0xa10>
     80003766:	85ca                	mv	a1,s2
     80003768:	8526                	mv	a0,s1
     8000376a:	477000ef          	jal	800043e0 <initsleeplock>
+  for(i = 0; i < NINODE; i++) {
     8000376e:	08848493          	addi	s1,s1,136
     80003772:	ff349ae3          	bne	s1,s3,80003766 <iinit+0x3a>
+}
     80003776:	70a2                	ld	ra,40(sp)
     80003778:	7402                	ld	s0,32(sp)
     8000377a:	64e2                	ld	s1,24(sp)
@@ -6229,10 +6419,12 @@ devintr()
     80003782:	8082                	ret
 
 0000000080003784 <ialloc>:
+{
     80003784:	7139                	addi	sp,sp,-64
     80003786:	fc06                	sd	ra,56(sp)
     80003788:	f822                	sd	s0,48(sp)
     8000378a:	0080                	addi	s0,sp,64
+  for(inum = 1; inum < sb.ninodes; inum++){
     8000378c:	00047717          	auipc	a4,0x47
     80003790:	5b072703          	lw	a4,1456(a4) # 8004ad3c <sb+0xc>
     80003794:	4785                	li	a5,1
@@ -6246,6 +6438,7 @@ devintr()
     800037a6:	8aaa                	mv	s5,a0
     800037a8:	8b2e                	mv	s6,a1
     800037aa:	4905                	li	s2,1
+    bp = bread(dev, IBLOCK(inum, sb));
     800037ac:	00047a17          	auipc	s4,0x47
     800037b0:	584a0a13          	addi	s4,s4,1412 # 8004ad30 <sb>
     800037b4:	00495593          	srli	a1,s2,0x4
@@ -6254,13 +6447,17 @@ devintr()
     800037be:	8556                	mv	a0,s5
     800037c0:	fecff0ef          	jal	80002fac <bread>
     800037c4:	84aa                	mv	s1,a0
+    dip = (struct dinode*)bp->data + inum%IPB;
     800037c6:	05850993          	addi	s3,a0,88
     800037ca:	00f97793          	andi	a5,s2,15
     800037ce:	079a                	slli	a5,a5,0x6
     800037d0:	99be                	add	s3,s3,a5
+    if(dip->type == 0){  // a free inode
     800037d2:	00099783          	lh	a5,0(s3)
     800037d6:	cb9d                	beqz	a5,8000380c <ialloc+0x88>
+    brelse(bp);
     800037d8:	9e3ff0ef          	jal	800031ba <brelse>
+  for(inum = 1; inum < sb.ninodes; inum++){
     800037dc:	0905                	addi	s2,s2,1
     800037de:	00ca2703          	lw	a4,12(s4)
     800037e2:	0009079b          	sext.w	a5,s2
@@ -6271,23 +6468,31 @@ devintr()
     800037f0:	6a42                	ld	s4,16(sp)
     800037f2:	6aa2                	ld	s5,8(sp)
     800037f4:	6b02                	ld	s6,0(sp)
+  printf("ialloc: no inodes\n");
     800037f6:	00005517          	auipc	a0,0x5
     800037fa:	22250513          	addi	a0,a0,546 # 80008a18 <etext+0xa18>
     800037fe:	cc5fc0ef          	jal	800004c2 <printf>
+  return 0;
     80003802:	4501                	li	a0,0
+}
     80003804:	70e2                	ld	ra,56(sp)
     80003806:	7442                	ld	s0,48(sp)
     80003808:	6121                	addi	sp,sp,64
     8000380a:	8082                	ret
+      memset(dip, 0, sizeof(*dip));
     8000380c:	04000613          	li	a2,64
     80003810:	4581                	li	a1,0
     80003812:	854e                	mv	a0,s3
     80003814:	f4afd0ef          	jal	80000f5e <memset>
+      dip->type = type;
     80003818:	01699023          	sh	s6,0(s3)
+      log_write(bp);   // mark it allocated on the disk
     8000381c:	8526                	mv	a0,s1
     8000381e:	2f3000ef          	jal	80004310 <log_write>
+      brelse(bp);
     80003822:	8526                	mv	a0,s1
     80003824:	997ff0ef          	jal	800031ba <brelse>
+      return iget(dev, inum);
     80003828:	0009059b          	sext.w	a1,s2
     8000382c:	8556                	mv	a0,s5
     8000382e:	de7ff0ef          	jal	80003614 <iget>
@@ -6300,6 +6505,7 @@ devintr()
     8000383e:	b7d9                	j	80003804 <ialloc+0x80>
 
 0000000080003840 <iupdate>:
+{
     80003840:	1101                	addi	sp,sp,-32
     80003842:	ec06                	sd	ra,24(sp)
     80003844:	e822                	sd	s0,16(sp)
@@ -6307,6 +6513,7 @@ devintr()
     80003848:	e04a                	sd	s2,0(sp)
     8000384a:	1000                	addi	s0,sp,32
     8000384c:	84aa                	mv	s1,a0
+  bp = bread(ip->dev, IBLOCK(ip->inum, sb));
     8000384e:	415c                	lw	a5,4(a0)
     80003850:	0047d79b          	srliw	a5,a5,0x4
     80003854:	00047597          	auipc	a1,0x47
@@ -6315,29 +6522,39 @@ devintr()
     8000385e:	4108                	lw	a0,0(a0)
     80003860:	f4cff0ef          	jal	80002fac <bread>
     80003864:	892a                	mv	s2,a0
+  dip = (struct dinode*)bp->data + ip->inum%IPB;
     80003866:	05850793          	addi	a5,a0,88
     8000386a:	40d8                	lw	a4,4(s1)
     8000386c:	8b3d                	andi	a4,a4,15
     8000386e:	071a                	slli	a4,a4,0x6
     80003870:	97ba                	add	a5,a5,a4
+  dip->type = ip->type;
     80003872:	04449703          	lh	a4,68(s1)
     80003876:	00e79023          	sh	a4,0(a5)
+  dip->major = ip->major;
     8000387a:	04649703          	lh	a4,70(s1)
     8000387e:	00e79123          	sh	a4,2(a5)
+  dip->minor = ip->minor;
     80003882:	04849703          	lh	a4,72(s1)
     80003886:	00e79223          	sh	a4,4(a5)
+  dip->nlink = ip->nlink;
     8000388a:	04a49703          	lh	a4,74(s1)
     8000388e:	00e79323          	sh	a4,6(a5)
+  dip->size = ip->size;
     80003892:	44f8                	lw	a4,76(s1)
     80003894:	c798                	sw	a4,8(a5)
+  memmove(dip->addrs, ip->addrs, sizeof(ip->addrs));
     80003896:	03400613          	li	a2,52
     8000389a:	05048593          	addi	a1,s1,80
     8000389e:	00c78513          	addi	a0,a5,12
     800038a2:	f18fd0ef          	jal	80000fba <memmove>
+  log_write(bp);
     800038a6:	854a                	mv	a0,s2
     800038a8:	269000ef          	jal	80004310 <log_write>
+  brelse(bp);
     800038ac:	854a                	mv	a0,s2
     800038ae:	90dff0ef          	jal	800031ba <brelse>
+}
     800038b2:	60e2                	ld	ra,24(sp)
     800038b4:	6442                	ld	s0,16(sp)
     800038b6:	64a2                	ld	s1,8(sp)
@@ -6346,21 +6563,26 @@ devintr()
     800038bc:	8082                	ret
 
 00000000800038be <idup>:
+{
     800038be:	1101                	addi	sp,sp,-32
     800038c0:	ec06                	sd	ra,24(sp)
     800038c2:	e822                	sd	s0,16(sp)
     800038c4:	e426                	sd	s1,8(sp)
     800038c6:	1000                	addi	s0,sp,32
     800038c8:	84aa                	mv	s1,a0
+  acquire(&itable.lock);
     800038ca:	00047517          	auipc	a0,0x47
     800038ce:	48650513          	addi	a0,a0,1158 # 8004ad50 <itable>
     800038d2:	db8fd0ef          	jal	80000e8a <acquire>
+  ip->ref++;
     800038d6:	449c                	lw	a5,8(s1)
     800038d8:	2785                	addiw	a5,a5,1
     800038da:	c49c                	sw	a5,8(s1)
+  release(&itable.lock);
     800038dc:	00047517          	auipc	a0,0x47
     800038e0:	47450513          	addi	a0,a0,1140 # 8004ad50 <itable>
     800038e4:	e3efd0ef          	jal	80000f22 <release>
+}
     800038e8:	8526                	mv	a0,s1
     800038ea:	60e2                	ld	ra,24(sp)
     800038ec:	6442                	ld	s0,16(sp)
@@ -6369,29 +6591,36 @@ devintr()
     800038f2:	8082                	ret
 
 00000000800038f4 <ilock>:
+{
     800038f4:	1101                	addi	sp,sp,-32
     800038f6:	ec06                	sd	ra,24(sp)
     800038f8:	e822                	sd	s0,16(sp)
     800038fa:	e426                	sd	s1,8(sp)
     800038fc:	1000                	addi	s0,sp,32
+  if(ip == 0 || ip->ref < 1)
     800038fe:	cd19                	beqz	a0,8000391c <ilock+0x28>
     80003900:	84aa                	mv	s1,a0
     80003902:	451c                	lw	a5,8(a0)
     80003904:	00f05c63          	blez	a5,8000391c <ilock+0x28>
+  acquiresleep(&ip->lock);
     80003908:	0541                	addi	a0,a0,16
     8000390a:	30d000ef          	jal	80004416 <acquiresleep>
+  if(ip->valid == 0){
     8000390e:	40bc                	lw	a5,64(s1)
     80003910:	cf89                	beqz	a5,8000392a <ilock+0x36>
+}
     80003912:	60e2                	ld	ra,24(sp)
     80003914:	6442                	ld	s0,16(sp)
     80003916:	64a2                	ld	s1,8(sp)
     80003918:	6105                	addi	sp,sp,32
     8000391a:	8082                	ret
     8000391c:	e04a                	sd	s2,0(sp)
+    panic("ilock");
     8000391e:	00005517          	auipc	a0,0x5
     80003922:	11250513          	addi	a0,a0,274 # 80008a30 <etext+0xa30>
     80003926:	e6ffc0ef          	jal	80000794 <panic>
     8000392a:	e04a                	sd	s2,0(sp)
+    bp = bread(ip->dev, IBLOCK(ip->inum, sb));
     8000392c:	40dc                	lw	a5,4(s1)
     8000392e:	0047d79b          	srliw	a5,a5,0x4
     80003932:	00047597          	auipc	a1,0x47
@@ -6400,44 +6629,57 @@ devintr()
     8000393c:	4088                	lw	a0,0(s1)
     8000393e:	e6eff0ef          	jal	80002fac <bread>
     80003942:	892a                	mv	s2,a0
+    dip = (struct dinode*)bp->data + ip->inum%IPB;
     80003944:	05850593          	addi	a1,a0,88
     80003948:	40dc                	lw	a5,4(s1)
     8000394a:	8bbd                	andi	a5,a5,15
     8000394c:	079a                	slli	a5,a5,0x6
     8000394e:	95be                	add	a1,a1,a5
+    ip->type = dip->type;
     80003950:	00059783          	lh	a5,0(a1)
     80003954:	04f49223          	sh	a5,68(s1)
+    ip->major = dip->major;
     80003958:	00259783          	lh	a5,2(a1)
     8000395c:	04f49323          	sh	a5,70(s1)
+    ip->minor = dip->minor;
     80003960:	00459783          	lh	a5,4(a1)
     80003964:	04f49423          	sh	a5,72(s1)
+    ip->nlink = dip->nlink;
     80003968:	00659783          	lh	a5,6(a1)
     8000396c:	04f49523          	sh	a5,74(s1)
+    ip->size = dip->size;
     80003970:	459c                	lw	a5,8(a1)
     80003972:	c4fc                	sw	a5,76(s1)
+    memmove(ip->addrs, dip->addrs, sizeof(ip->addrs));
     80003974:	03400613          	li	a2,52
     80003978:	05b1                	addi	a1,a1,12
     8000397a:	05048513          	addi	a0,s1,80
     8000397e:	e3cfd0ef          	jal	80000fba <memmove>
+    brelse(bp);
     80003982:	854a                	mv	a0,s2
     80003984:	837ff0ef          	jal	800031ba <brelse>
+    ip->valid = 1;
     80003988:	4785                	li	a5,1
     8000398a:	c0bc                	sw	a5,64(s1)
+    if(ip->type == 0)
     8000398c:	04449783          	lh	a5,68(s1)
     80003990:	c399                	beqz	a5,80003996 <ilock+0xa2>
     80003992:	6902                	ld	s2,0(sp)
     80003994:	bfbd                	j	80003912 <ilock+0x1e>
+      panic("ilock: no type");
     80003996:	00005517          	auipc	a0,0x5
     8000399a:	0a250513          	addi	a0,a0,162 # 80008a38 <etext+0xa38>
     8000399e:	df7fc0ef          	jal	80000794 <panic>
 
 00000000800039a2 <iunlock>:
+{
     800039a2:	1101                	addi	sp,sp,-32
     800039a4:	ec06                	sd	ra,24(sp)
     800039a6:	e822                	sd	s0,16(sp)
     800039a8:	e426                	sd	s1,8(sp)
     800039aa:	e04a                	sd	s2,0(sp)
     800039ac:	1000                	addi	s0,sp,32
+  if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1)
     800039ae:	c505                	beqz	a0,800039d6 <iunlock+0x34>
     800039b0:	84aa                	mv	s1,a0
     800039b2:	01050913          	addi	s2,a0,16
@@ -6446,19 +6688,28 @@ devintr()
     800039bc:	cd09                	beqz	a0,800039d6 <iunlock+0x34>
     800039be:	449c                	lw	a5,8(s1)
     800039c0:	00f05b63          	blez	a5,800039d6 <iunlock+0x34>
+  releasesleep(&ip->lock);
     800039c4:	854a                	mv	a0,s2
     800039c6:	297000ef          	jal	8000445c <releasesleep>
+}
     800039ca:	60e2                	ld	ra,24(sp)
     800039cc:	6442                	ld	s0,16(sp)
     800039ce:	64a2                	ld	s1,8(sp)
     800039d0:	6902                	ld	s2,0(sp)
     800039d2:	6105                	addi	sp,sp,32
     800039d4:	8082                	ret
+    panic("iunlock");
     800039d6:	00005517          	auipc	a0,0x5
     800039da:	07250513          	addi	a0,a0,114 # 80008a48 <etext+0xa48>
     800039de:	db7fc0ef          	jal	80000794 <panic>
 
 00000000800039e2 <itrunc>:
+
+// Truncate inode (discard contents).
+// Caller must hold ip->lock.
+void
+itrunc(struct inode *ip)
+{
     800039e2:	7179                	addi	sp,sp,-48
     800039e4:	f406                	sd	ra,40(sp)
     800039e6:	f022                	sd	s0,32(sp)
@@ -6467,22 +6718,42 @@ devintr()
     800039ec:	e44e                	sd	s3,8(sp)
     800039ee:	1800                	addi	s0,sp,48
     800039f0:	89aa                	mv	s3,a0
+  int i, j;
+  struct buf *bp;
+  uint *a;
+
+  for(i = 0; i < NDIRECT; i++){
     800039f2:	05050493          	addi	s1,a0,80
     800039f6:	07c50913          	addi	s2,a0,124
     800039fa:	a021                	j	80003a02 <itrunc+0x20>
     800039fc:	0491                	addi	s1,s1,4
     800039fe:	01248b63          	beq	s1,s2,80003a14 <itrunc+0x32>
+    if(ip->addrs[i]){
     80003a02:	408c                	lw	a1,0(s1)
     80003a04:	dde5                	beqz	a1,800039fc <itrunc+0x1a>
+      bfree(ip->dev, ip->addrs[i]);
     80003a06:	0009a503          	lw	a0,0(s3)
     80003a0a:	8fbff0ef          	jal	80003304 <bfree>
+      ip->addrs[i] = 0;
     80003a0e:	0004a023          	sw	zero,0(s1)
     80003a12:	b7ed                	j	800039fc <itrunc+0x1a>
+    }
+  }
+
+  if(ip->addrs[NDIRECT]){
     80003a14:	07c9a583          	lw	a1,124(s3)
     80003a18:	ed89                	bnez	a1,80003a32 <itrunc+0x50>
+    brelse(bp);
+    bfree(ip->dev, ip->addrs[NDIRECT]);
+    ip->addrs[NDIRECT] = 0;
+  }
+
+  ip->size = 0;
     80003a1a:	0409a623          	sw	zero,76(s3)
+  iupdate(ip);
     80003a1e:	854e                	mv	a0,s3
     80003a20:	e21ff0ef          	jal	80003840 <iupdate>
+}
     80003a24:	70a2                	ld	ra,40(sp)
     80003a26:	7402                	ld	s0,32(sp)
     80003a28:	64e2                	ld	s1,24(sp)
@@ -6491,71 +6762,93 @@ devintr()
     80003a2e:	6145                	addi	sp,sp,48
     80003a30:	8082                	ret
     80003a32:	e052                	sd	s4,0(sp)
+    bp = bread(ip->dev, ip->addrs[NDIRECT]);
     80003a34:	0009a503          	lw	a0,0(s3)
     80003a38:	d74ff0ef          	jal	80002fac <bread>
     80003a3c:	8a2a                	mv	s4,a0
+    for(j = 0; j < NINDIRECT; j++){
     80003a3e:	05850493          	addi	s1,a0,88
     80003a42:	45850913          	addi	s2,a0,1112
     80003a46:	a021                	j	80003a4e <itrunc+0x6c>
     80003a48:	0491                	addi	s1,s1,4
     80003a4a:	01248963          	beq	s1,s2,80003a5c <itrunc+0x7a>
+      if(a[j])
     80003a4e:	408c                	lw	a1,0(s1)
     80003a50:	dde5                	beqz	a1,80003a48 <itrunc+0x66>
+        bfree(ip->dev, a[j]);
     80003a52:	0009a503          	lw	a0,0(s3)
     80003a56:	8afff0ef          	jal	80003304 <bfree>
     80003a5a:	b7fd                	j	80003a48 <itrunc+0x66>
+    brelse(bp);
     80003a5c:	8552                	mv	a0,s4
     80003a5e:	f5cff0ef          	jal	800031ba <brelse>
+    bfree(ip->dev, ip->addrs[NDIRECT]);
     80003a62:	07c9a583          	lw	a1,124(s3)
     80003a66:	0009a503          	lw	a0,0(s3)
     80003a6a:	89bff0ef          	jal	80003304 <bfree>
+    ip->addrs[NDIRECT] = 0;
     80003a6e:	0609ae23          	sw	zero,124(s3)
     80003a72:	6a02                	ld	s4,0(sp)
     80003a74:	b75d                	j	80003a1a <itrunc+0x38>
 
 0000000080003a76 <iput>:
+{
     80003a76:	1101                	addi	sp,sp,-32
     80003a78:	ec06                	sd	ra,24(sp)
     80003a7a:	e822                	sd	s0,16(sp)
     80003a7c:	e426                	sd	s1,8(sp)
     80003a7e:	1000                	addi	s0,sp,32
     80003a80:	84aa                	mv	s1,a0
+  acquire(&itable.lock);
     80003a82:	00047517          	auipc	a0,0x47
     80003a86:	2ce50513          	addi	a0,a0,718 # 8004ad50 <itable>
     80003a8a:	c00fd0ef          	jal	80000e8a <acquire>
+  if(ip->ref == 1 && ip->valid && ip->nlink == 0){
     80003a8e:	4498                	lw	a4,8(s1)
     80003a90:	4785                	li	a5,1
     80003a92:	02f70063          	beq	a4,a5,80003ab2 <iput+0x3c>
+  ip->ref--;
     80003a96:	449c                	lw	a5,8(s1)
     80003a98:	37fd                	addiw	a5,a5,-1
     80003a9a:	c49c                	sw	a5,8(s1)
+  release(&itable.lock);
     80003a9c:	00047517          	auipc	a0,0x47
     80003aa0:	2b450513          	addi	a0,a0,692 # 8004ad50 <itable>
     80003aa4:	c7efd0ef          	jal	80000f22 <release>
+}
     80003aa8:	60e2                	ld	ra,24(sp)
     80003aaa:	6442                	ld	s0,16(sp)
     80003aac:	64a2                	ld	s1,8(sp)
     80003aae:	6105                	addi	sp,sp,32
     80003ab0:	8082                	ret
+  if(ip->ref == 1 && ip->valid && ip->nlink == 0){
     80003ab2:	40bc                	lw	a5,64(s1)
     80003ab4:	d3ed                	beqz	a5,80003a96 <iput+0x20>
     80003ab6:	04a49783          	lh	a5,74(s1)
     80003aba:	fff1                	bnez	a5,80003a96 <iput+0x20>
     80003abc:	e04a                	sd	s2,0(sp)
+    acquiresleep(&ip->lock);
     80003abe:	01048913          	addi	s2,s1,16
     80003ac2:	854a                	mv	a0,s2
     80003ac4:	153000ef          	jal	80004416 <acquiresleep>
+    release(&itable.lock);
     80003ac8:	00047517          	auipc	a0,0x47
     80003acc:	28850513          	addi	a0,a0,648 # 8004ad50 <itable>
     80003ad0:	c52fd0ef          	jal	80000f22 <release>
+    itrunc(ip);
     80003ad4:	8526                	mv	a0,s1
     80003ad6:	f0dff0ef          	jal	800039e2 <itrunc>
+    ip->type = 0;
     80003ada:	04049223          	sh	zero,68(s1)
+    iupdate(ip);
     80003ade:	8526                	mv	a0,s1
     80003ae0:	d61ff0ef          	jal	80003840 <iupdate>
+    ip->valid = 0;
     80003ae4:	0404a023          	sw	zero,64(s1)
+    releasesleep(&ip->lock);
     80003ae8:	854a                	mv	a0,s2
     80003aea:	173000ef          	jal	8000445c <releasesleep>
+    acquire(&itable.lock);
     80003aee:	00047517          	auipc	a0,0x47
     80003af2:	26250513          	addi	a0,a0,610 # 8004ad50 <itable>
     80003af6:	b94fd0ef          	jal	80000e8a <acquire>
@@ -6563,15 +6856,19 @@ devintr()
     80003afc:	bf69                	j	80003a96 <iput+0x20>
 
 0000000080003afe <iunlockput>:
+{
     80003afe:	1101                	addi	sp,sp,-32
     80003b00:	ec06                	sd	ra,24(sp)
     80003b02:	e822                	sd	s0,16(sp)
     80003b04:	e426                	sd	s1,8(sp)
     80003b06:	1000                	addi	s0,sp,32
     80003b08:	84aa                	mv	s1,a0
+  iunlock(ip);
     80003b0a:	e99ff0ef          	jal	800039a2 <iunlock>
+  iput(ip);
     80003b0e:	8526                	mv	a0,s1
     80003b10:	f67ff0ef          	jal	80003a76 <iput>
+}
     80003b14:	60e2                	ld	ra,24(sp)
     80003b16:	6442                	ld	s0,16(sp)
     80003b18:	64a2                	ld	s1,8(sp)
@@ -6579,26 +6876,45 @@ devintr()
     80003b1c:	8082                	ret
 
 0000000080003b1e <stati>:
+
+// Copy stat information from inode.
+// Caller must hold ip->lock.
+void
+stati(struct inode *ip, struct stat *st)
+{
     80003b1e:	1141                	addi	sp,sp,-16
     80003b20:	e422                	sd	s0,8(sp)
     80003b22:	0800                	addi	s0,sp,16
+  st->dev = ip->dev;
     80003b24:	411c                	lw	a5,0(a0)
     80003b26:	c19c                	sw	a5,0(a1)
+  st->ino = ip->inum;
     80003b28:	415c                	lw	a5,4(a0)
     80003b2a:	c1dc                	sw	a5,4(a1)
+  st->type = ip->type;
     80003b2c:	04451783          	lh	a5,68(a0)
     80003b30:	00f59423          	sh	a5,8(a1)
+  st->nlink = ip->nlink;
     80003b34:	04a51783          	lh	a5,74(a0)
     80003b38:	00f59523          	sh	a5,10(a1)
+  st->size = ip->size;
     80003b3c:	04c56783          	lwu	a5,76(a0)
     80003b40:	e99c                	sd	a5,16(a1)
+}
     80003b42:	6422                	ld	s0,8(sp)
     80003b44:	0141                	addi	sp,sp,16
     80003b46:	8082                	ret
 
 0000000080003b48 <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)
     80003b48:	457c                	lw	a5,76(a0)
     80003b4a:	0ed7eb63          	bltu	a5,a3,80003c40 <readi+0xf8>
+{
     80003b4e:	7159                	addi	sp,sp,-112
     80003b50:	f486                	sd	ra,104(sp)
     80003b52:	f0a2                	sd	s0,96(sp)
@@ -6613,12 +6929,19 @@ devintr()
     80003b64:	8a32                	mv	s4,a2
     80003b66:	84b6                	mv	s1,a3
     80003b68:	8aba                	mv	s5,a4
+  if(off > ip->size || off + n < off)
     80003b6a:	9f35                	addw	a4,a4,a3
+    return 0;
     80003b6c:	4501                	li	a0,0
+  if(off > ip->size || off + n < off)
     80003b6e:	0cd76063          	bltu	a4,a3,80003c2e <readi+0xe6>
     80003b72:	e4ce                	sd	s3,72(sp)
+  if(off + n > ip->size)
     80003b74:	00e7f463          	bgeu	a5,a4,80003b7c <readi+0x34>
+    n = ip->size - off;
     80003b78:	40d78abb          	subw	s5,a5,a3
+
+  for(tot=0; tot<n; tot+=m, off+=m, dst+=m){
     80003b7c:	080a8f63          	beqz	s5,80003c1a <readi+0xd2>
     80003b80:	e8ca                	sd	s2,80(sp)
     80003b82:	f062                	sd	s8,32(sp)
@@ -6626,7 +6949,13 @@ devintr()
     80003b86:	e86a                	sd	s10,16(sp)
     80003b88:	e46e                	sd	s11,8(sp)
     80003b8a:	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);
     80003b8c:	40000c93          	li	s9,1024
+    if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) {
     80003b90:	5c7d                	li	s8,-1
     80003b92:	a80d                	j	80003bc4 <readi+0x7c>
     80003b94:	020d1d93          	slli	s11,s10,0x20
@@ -6638,20 +6967,30 @@ devintr()
     80003ba6:	855e                	mv	a0,s7
     80003ba8:	ac1fe0ef          	jal	80002668 <either_copyout>
     80003bac:	05850763          	beq	a0,s8,80003bfa <readi+0xb2>
+      brelse(bp);
+      tot = -1;
+      break;
+    }
+    brelse(bp);
     80003bb0:	854a                	mv	a0,s2
     80003bb2:	e08ff0ef          	jal	800031ba <brelse>
+  for(tot=0; tot<n; tot+=m, off+=m, dst+=m){
     80003bb6:	013d09bb          	addw	s3,s10,s3
     80003bba:	009d04bb          	addw	s1,s10,s1
     80003bbe:	9a6e                	add	s4,s4,s11
     80003bc0:	0559f763          	bgeu	s3,s5,80003c0e <readi+0xc6>
+    uint addr = bmap(ip, off/BSIZE);
     80003bc4:	00a4d59b          	srliw	a1,s1,0xa
     80003bc8:	855a                	mv	a0,s6
     80003bca:	8c7ff0ef          	jal	80003490 <bmap>
     80003bce:	0005059b          	sext.w	a1,a0
+    if(addr == 0)
     80003bd2:	c5b1                	beqz	a1,80003c1e <readi+0xd6>
+    bp = bread(ip->dev, addr);
     80003bd4:	000b2503          	lw	a0,0(s6)
     80003bd8:	bd4ff0ef          	jal	80002fac <bread>
     80003bdc:	892a                	mv	s2,a0
+    m = min(n - tot, BSIZE - off%BSIZE);
     80003bde:	3ff4f713          	andi	a4,s1,1023
     80003be2:	40ec87bb          	subw	a5,s9,a4
     80003be6:	413a86bb          	subw	a3,s5,s3
@@ -6661,9 +7000,12 @@ devintr()
     80003bf2:	faf671e3          	bgeu	a2,a5,80003b94 <readi+0x4c>
     80003bf6:	8d36                	mv	s10,a3
     80003bf8:	bf71                	j	80003b94 <readi+0x4c>
+      brelse(bp);
     80003bfa:	854a                	mv	a0,s2
     80003bfc:	dbeff0ef          	jal	800031ba <brelse>
+      tot = -1;
     80003c00:	59fd                	li	s3,-1
+      break;
     80003c02:	6946                	ld	s2,80(sp)
     80003c04:	7c02                	ld	s8,32(sp)
     80003c06:	6ce2                	ld	s9,24(sp)
@@ -6676,6 +7018,7 @@ devintr()
     80003c14:	6d42                	ld	s10,16(sp)
     80003c16:	6da2                	ld	s11,8(sp)
     80003c18:	a801                	j	80003c28 <readi+0xe0>
+  for(tot=0; tot<n; tot+=m, off+=m, dst+=m){
     80003c1a:	89d6                	mv	s3,s5
     80003c1c:	a031                	j	80003c28 <readi+0xe0>
     80003c1e:	6946                	ld	s2,80(sp)
@@ -6683,8 +7026,11 @@ devintr()
     80003c22:	6ce2                	ld	s9,24(sp)
     80003c24:	6d42                	ld	s10,16(sp)
     80003c26:	6da2                	ld	s11,8(sp)
+  }
+  return tot;
     80003c28:	0009851b          	sext.w	a0,s3
     80003c2c:	69a6                	ld	s3,72(sp)
+}
     80003c2e:	70a6                	ld	ra,104(sp)
     80003c30:	7406                	ld	s0,96(sp)
     80003c32:	64e6                	ld	s1,88(sp)
@@ -6694,12 +7040,21 @@ devintr()
     80003c3a:	7ba2                	ld	s7,40(sp)
     80003c3c:	6165                	addi	sp,sp,112
     80003c3e:	8082                	ret
+    return 0;
     80003c40:	4501                	li	a0,0
+}
     80003c42:	8082                	ret
 
 0000000080003c44 <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)
     80003c44:	457c                	lw	a5,76(a0)
     80003c46:	10d7e163          	bltu	a5,a3,80003d48 <writei+0x104>
+{
     80003c4a:	7159                	addi	sp,sp,-112
     80003c4c:	f486                	sd	ra,104(sp)
     80003c4e:	f0a2                	sd	s0,96(sp)
@@ -6714,12 +7069,18 @@ devintr()
     80003c60:	8a32                	mv	s4,a2
     80003c62:	8936                	mv	s2,a3
     80003c64:	8b3a                	mv	s6,a4
+  if(off > ip->size || off + n < off)
     80003c66:	9f35                	addw	a4,a4,a3
     80003c68:	0ed76263          	bltu	a4,a3,80003d4c <writei+0x108>
+    return -1;
+  if(off + n > MAXFILE*BSIZE)
     80003c6c:	040437b7          	lui	a5,0x4043
     80003c70:	c0078793          	addi	a5,a5,-1024 # 4042c00 <_entry-0x7bfbd400>
     80003c74:	0ce7ee63          	bltu	a5,a4,80003d50 <writei+0x10c>
     80003c78:	e4ce                	sd	s3,72(sp)
+    return -1;
+
+  for(tot=0; tot<n; tot+=m, off+=m, src+=m){
     80003c7a:	0a0b0f63          	beqz	s6,80003d38 <writei+0xf4>
     80003c7e:	eca6                	sd	s1,88(sp)
     80003c80:	f062                	sd	s8,32(sp)
@@ -6727,7 +7088,13 @@ devintr()
     80003c84:	e86a                	sd	s10,16(sp)
     80003c86:	e46e                	sd	s11,8(sp)
     80003c88:	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);
     80003c8a:	40000c93          	li	s9,1024
+    if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) {
     80003c8e:	5c7d                	li	s8,-1
     80003c90:	a825                	j	80003cc8 <writei+0x84>
     80003c92:	020d1d93          	slli	s11,s10,0x20
@@ -6739,22 +7106,32 @@ devintr()
     80003ca4:	953a                	add	a0,a0,a4
     80003ca6:	a0dfe0ef          	jal	800026b2 <either_copyin>
     80003caa:	05850a63          	beq	a0,s8,80003cfe <writei+0xba>
+      brelse(bp);
+      break;
+    }
+    log_write(bp);
     80003cae:	8526                	mv	a0,s1
     80003cb0:	660000ef          	jal	80004310 <log_write>
+    brelse(bp);
     80003cb4:	8526                	mv	a0,s1
     80003cb6:	d04ff0ef          	jal	800031ba <brelse>
+  for(tot=0; tot<n; tot+=m, off+=m, src+=m){
     80003cba:	013d09bb          	addw	s3,s10,s3
     80003cbe:	012d093b          	addw	s2,s10,s2
     80003cc2:	9a6e                	add	s4,s4,s11
     80003cc4:	0569f063          	bgeu	s3,s6,80003d04 <writei+0xc0>
+    uint addr = bmap(ip, off/BSIZE);
     80003cc8:	00a9559b          	srliw	a1,s2,0xa
     80003ccc:	8556                	mv	a0,s5
     80003cce:	fc2ff0ef          	jal	80003490 <bmap>
     80003cd2:	0005059b          	sext.w	a1,a0
+    if(addr == 0)
     80003cd6:	c59d                	beqz	a1,80003d04 <writei+0xc0>
+    bp = bread(ip->dev, addr);
     80003cd8:	000aa503          	lw	a0,0(s5)
     80003cdc:	ad0ff0ef          	jal	80002fac <bread>
     80003ce0:	84aa                	mv	s1,a0
+    m = min(n - tot, BSIZE - off%BSIZE);
     80003ce2:	3ff97713          	andi	a4,s2,1023
     80003ce6:	40ec87bb          	subw	a5,s9,a4
     80003cea:	413b06bb          	subw	a3,s6,s3
@@ -6764,20 +7141,33 @@ devintr()
     80003cf6:	f8f67ee3          	bgeu	a2,a5,80003c92 <writei+0x4e>
     80003cfa:	8d36                	mv	s10,a3
     80003cfc:	bf59                	j	80003c92 <writei+0x4e>
+      brelse(bp);
     80003cfe:	8526                	mv	a0,s1
     80003d00:	cbaff0ef          	jal	800031ba <brelse>
+  }
+
+  if(off > ip->size)
     80003d04:	04caa783          	lw	a5,76(s5)
     80003d08:	0327fa63          	bgeu	a5,s2,80003d3c <writei+0xf8>
+    ip->size = off;
     80003d0c:	052aa623          	sw	s2,76(s5)
     80003d10:	64e6                	ld	s1,88(sp)
     80003d12:	7c02                	ld	s8,32(sp)
     80003d14:	6ce2                	ld	s9,24(sp)
     80003d16:	6d42                	ld	s10,16(sp)
     80003d18:	6da2                	ld	s11,8(sp)
+
+  // 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);
     80003d1a:	8556                	mv	a0,s5
     80003d1c:	b25ff0ef          	jal	80003840 <iupdate>
+
+  return tot;
     80003d20:	0009851b          	sext.w	a0,s3
     80003d24:	69a6                	ld	s3,72(sp)
+}
     80003d26:	70a6                	ld	ra,104(sp)
     80003d28:	7406                	ld	s0,96(sp)
     80003d2a:	6946                	ld	s2,80(sp)
@@ -6787,6 +7177,7 @@ devintr()
     80003d32:	7ba2                	ld	s7,40(sp)
     80003d34:	6165                	addi	sp,sp,112
     80003d36:	8082                	ret
+  for(tot=0; tot<n; tot+=m, off+=m, src+=m){
     80003d38:	89da                	mv	s3,s6
     80003d3a:	b7c5                	j	80003d1a <writei+0xd6>
     80003d3c:	64e6                	ld	s1,88(sp)
@@ -6795,26 +7186,44 @@ devintr()
     80003d42:	6d42                	ld	s10,16(sp)
     80003d44:	6da2                	ld	s11,8(sp)
     80003d46:	bfd1                	j	80003d1a <writei+0xd6>
+    return -1;
     80003d48:	557d                	li	a0,-1
+}
     80003d4a:	8082                	ret
+    return -1;
     80003d4c:	557d                	li	a0,-1
     80003d4e:	bfe1                	j	80003d26 <writei+0xe2>
+    return -1;
     80003d50:	557d                	li	a0,-1
     80003d52:	bfd1                	j	80003d26 <writei+0xe2>
 
 0000000080003d54 <namecmp>:
+
+// Directories
+
+int
+namecmp(const char *s, const char *t)
+{
     80003d54:	1141                	addi	sp,sp,-16
     80003d56:	e406                	sd	ra,8(sp)
     80003d58:	e022                	sd	s0,0(sp)
     80003d5a:	0800                	addi	s0,sp,16
+  return strncmp(s, t, DIRSIZ);
     80003d5c:	4639                	li	a2,14
     80003d5e:	accfd0ef          	jal	8000102a <strncmp>
+}
     80003d62:	60a2                	ld	ra,8(sp)
     80003d64:	6402                	ld	s0,0(sp)
     80003d66:	0141                	addi	sp,sp,16
     80003d68:	8082                	ret
 
 0000000080003d6a <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)
+{
     80003d6a:	7139                	addi	sp,sp,-64
     80003d6c:	fc06                	sd	ra,56(sp)
     80003d6e:	f822                	sd	s0,48(sp)
@@ -6823,26 +7232,44 @@ devintr()
     80003d74:	ec4e                	sd	s3,24(sp)
     80003d76:	e852                	sd	s4,16(sp)
     80003d78:	0080                	addi	s0,sp,64
+  uint off, inum;
+  struct dirent de;
+
+  if(dp->type != T_DIR)
     80003d7a:	04451703          	lh	a4,68(a0)
     80003d7e:	4785                	li	a5,1
     80003d80:	00f71a63          	bne	a4,a5,80003d94 <dirlookup+0x2a>
     80003d84:	892a                	mv	s2,a0
     80003d86:	89ae                	mv	s3,a1
     80003d88:	8a32                	mv	s4,a2
+    panic("dirlookup not DIR");
+
+  for(off = 0; off < dp->size; off += sizeof(de)){
     80003d8a:	457c                	lw	a5,76(a0)
     80003d8c:	4481                	li	s1,0
+      inum = de.inum;
+      return iget(dp->dev, inum);
+    }
+  }
+
+  return 0;
     80003d8e:	4501                	li	a0,0
+  for(off = 0; off < dp->size; off += sizeof(de)){
     80003d90:	e39d                	bnez	a5,80003db6 <dirlookup+0x4c>
     80003d92:	a095                	j	80003df6 <dirlookup+0x8c>
+    panic("dirlookup not DIR");
     80003d94:	00005517          	auipc	a0,0x5
     80003d98:	cbc50513          	addi	a0,a0,-836 # 80008a50 <etext+0xa50>
     80003d9c:	9f9fc0ef          	jal	80000794 <panic>
+      panic("dirlookup read");
     80003da0:	00005517          	auipc	a0,0x5
     80003da4:	cc850513          	addi	a0,a0,-824 # 80008a68 <etext+0xa68>
     80003da8:	9edfc0ef          	jal	80000794 <panic>
+  for(off = 0; off < dp->size; off += sizeof(de)){
     80003dac:	24c1                	addiw	s1,s1,16
     80003dae:	04c92783          	lw	a5,76(s2)
     80003db2:	04f4f163          	bgeu	s1,a5,80003df4 <dirlookup+0x8a>
+    if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de))
     80003db6:	4741                	li	a4,16
     80003db8:	86a6                	mv	a3,s1
     80003dba:	fc040613          	addi	a2,s0,-64
@@ -6851,19 +7278,26 @@ devintr()
     80003dc2:	d87ff0ef          	jal	80003b48 <readi>
     80003dc6:	47c1                	li	a5,16
     80003dc8:	fcf51ce3          	bne	a0,a5,80003da0 <dirlookup+0x36>
+    if(de.inum == 0)
     80003dcc:	fc045783          	lhu	a5,-64(s0)
     80003dd0:	dff1                	beqz	a5,80003dac <dirlookup+0x42>
+    if(namecmp(name, de.name) == 0){
     80003dd2:	fc240593          	addi	a1,s0,-62
     80003dd6:	854e                	mv	a0,s3
     80003dd8:	f7dff0ef          	jal	80003d54 <namecmp>
     80003ddc:	f961                	bnez	a0,80003dac <dirlookup+0x42>
+      if(poff)
     80003dde:	000a0463          	beqz	s4,80003de6 <dirlookup+0x7c>
+        *poff = off;
     80003de2:	009a2023          	sw	s1,0(s4)
+      return iget(dp->dev, inum);
     80003de6:	fc045583          	lhu	a1,-64(s0)
     80003dea:	00092503          	lw	a0,0(s2)
     80003dee:	827ff0ef          	jal	80003614 <iget>
     80003df2:	a011                	j	80003df6 <dirlookup+0x8c>
+  return 0;
     80003df4:	4501                	li	a0,0
+}
     80003df6:	70e2                	ld	ra,56(sp)
     80003df8:	7442                	ld	s0,48(sp)
     80003dfa:	74a2                	ld	s1,40(sp)
@@ -6874,6 +7308,12 @@ devintr()
     80003e04:	8082                	ret
 
 0000000080003e06 <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)
+{
     80003e06:	711d                	addi	sp,sp,-96
     80003e08:	ec86                	sd	ra,88(sp)
     80003e0a:	e8a2                	sd	s0,80(sp)
@@ -6890,25 +7330,46 @@ devintr()
     80003e20:	84aa                	mv	s1,a0
     80003e22:	8b2e                	mv	s6,a1
     80003e24:	8ab2                	mv	s5,a2
+  struct inode *ip, *next;
+
+  if(*path == '/')
     80003e26:	00054703          	lbu	a4,0(a0)
     80003e2a:	02f00793          	li	a5,47
     80003e2e:	00f70e63          	beq	a4,a5,80003e4a <namex+0x44>
+    ip = iget(ROOTDEV, ROOTINO);
+  else
+    ip = idup(myproc()->cwd);
     80003e32:	e8bfd0ef          	jal	80001cbc <myproc>
     80003e36:	15853503          	ld	a0,344(a0)
     80003e3a:	a85ff0ef          	jal	800038be <idup>
     80003e3e:	8a2a                	mv	s4,a0
+  while(*path == '/')
     80003e40:	02f00913          	li	s2,47
+  if(len >= DIRSIZ)
     80003e44:	4c35                	li	s8,13
+
+  while((path = skipelem(path, name)) != 0){
+    ilock(ip);
+    if(ip->type != T_DIR){
     80003e46:	4b85                	li	s7,1
     80003e48:	a871                	j	80003ee4 <namex+0xde>
+    ip = iget(ROOTDEV, ROOTINO);
     80003e4a:	4585                	li	a1,1
     80003e4c:	4505                	li	a0,1
     80003e4e:	fc6ff0ef          	jal	80003614 <iget>
     80003e52:	8a2a                	mv	s4,a0
     80003e54:	b7f5                	j	80003e40 <namex+0x3a>
+      iunlockput(ip);
     80003e56:	8552                	mv	a0,s4
     80003e58:	ca7ff0ef          	jal	80003afe <iunlockput>
+      return 0;
     80003e5c:	4a01                	li	s4,0
+  if(nameiparent){
+    iput(ip);
+    return 0;
+  }
+  return ip;
+}
     80003e5e:	8552                	mv	a0,s4
     80003e60:	60e6                	ld	ra,88(sp)
     80003e62:	6446                	ld	s0,80(sp)
@@ -6923,73 +7384,104 @@ devintr()
     80003e74:	6ca2                	ld	s9,8(sp)
     80003e76:	6125                	addi	sp,sp,96
     80003e78:	8082                	ret
+      iunlock(ip);
     80003e7a:	8552                	mv	a0,s4
     80003e7c:	b27ff0ef          	jal	800039a2 <iunlock>
+      return ip;
     80003e80:	bff9                	j	80003e5e <namex+0x58>
+      iunlockput(ip);
     80003e82:	8552                	mv	a0,s4
     80003e84:	c7bff0ef          	jal	80003afe <iunlockput>
+      return 0;
     80003e88:	8a4e                	mv	s4,s3
     80003e8a:	bfd1                	j	80003e5e <namex+0x58>
+  len = path - s;
     80003e8c:	40998633          	sub	a2,s3,s1
     80003e90:	00060c9b          	sext.w	s9,a2
+  if(len >= DIRSIZ)
     80003e94:	099c5063          	bge	s8,s9,80003f14 <namex+0x10e>
+    memmove(name, s, DIRSIZ);
     80003e98:	4639                	li	a2,14
     80003e9a:	85a6                	mv	a1,s1
     80003e9c:	8556                	mv	a0,s5
     80003e9e:	91cfd0ef          	jal	80000fba <memmove>
     80003ea2:	84ce                	mv	s1,s3
+  while(*path == '/')
     80003ea4:	0004c783          	lbu	a5,0(s1)
     80003ea8:	01279763          	bne	a5,s2,80003eb6 <namex+0xb0>
+    path++;
     80003eac:	0485                	addi	s1,s1,1
+  while(*path == '/')
     80003eae:	0004c783          	lbu	a5,0(s1)
     80003eb2:	ff278de3          	beq	a5,s2,80003eac <namex+0xa6>
+    ilock(ip);
     80003eb6:	8552                	mv	a0,s4
     80003eb8:	a3dff0ef          	jal	800038f4 <ilock>
+    if(ip->type != T_DIR){
     80003ebc:	044a1783          	lh	a5,68(s4)
     80003ec0:	f9779be3          	bne	a5,s7,80003e56 <namex+0x50>
+    if(nameiparent && *path == '\0'){
     80003ec4:	000b0563          	beqz	s6,80003ece <namex+0xc8>
     80003ec8:	0004c783          	lbu	a5,0(s1)
     80003ecc:	d7dd                	beqz	a5,80003e7a <namex+0x74>
+    if((next = dirlookup(ip, name, 0)) == 0){
     80003ece:	4601                	li	a2,0
     80003ed0:	85d6                	mv	a1,s5
     80003ed2:	8552                	mv	a0,s4
     80003ed4:	e97ff0ef          	jal	80003d6a <dirlookup>
     80003ed8:	89aa                	mv	s3,a0
     80003eda:	d545                	beqz	a0,80003e82 <namex+0x7c>
+    iunlockput(ip);
     80003edc:	8552                	mv	a0,s4
     80003ede:	c21ff0ef          	jal	80003afe <iunlockput>
+    ip = next;
     80003ee2:	8a4e                	mv	s4,s3
+  while(*path == '/')
     80003ee4:	0004c783          	lbu	a5,0(s1)
     80003ee8:	01279763          	bne	a5,s2,80003ef6 <namex+0xf0>
+    path++;
     80003eec:	0485                	addi	s1,s1,1
+  while(*path == '/')
     80003eee:	0004c783          	lbu	a5,0(s1)
     80003ef2:	ff278de3          	beq	a5,s2,80003eec <namex+0xe6>
+  if(*path == 0)
     80003ef6:	cb8d                	beqz	a5,80003f28 <namex+0x122>
+  while(*path != '/' && *path != 0)
     80003ef8:	0004c783          	lbu	a5,0(s1)
     80003efc:	89a6                	mv	s3,s1
+  len = path - s;
     80003efe:	4c81                	li	s9,0
     80003f00:	4601                	li	a2,0
+  while(*path != '/' && *path != 0)
     80003f02:	01278963          	beq	a5,s2,80003f14 <namex+0x10e>
     80003f06:	d3d9                	beqz	a5,80003e8c <namex+0x86>
+    path++;
     80003f08:	0985                	addi	s3,s3,1
+  while(*path != '/' && *path != 0)
     80003f0a:	0009c783          	lbu	a5,0(s3)
     80003f0e:	ff279ce3          	bne	a5,s2,80003f06 <namex+0x100>
     80003f12:	bfad                	j	80003e8c <namex+0x86>
+    memmove(name, s, len);
     80003f14:	2601                	sext.w	a2,a2
     80003f16:	85a6                	mv	a1,s1
     80003f18:	8556                	mv	a0,s5
     80003f1a:	8a0fd0ef          	jal	80000fba <memmove>
+    name[len] = 0;
     80003f1e:	9cd6                	add	s9,s9,s5
     80003f20:	000c8023          	sb	zero,0(s9) # 2000 <_entry-0x7fffe000>
     80003f24:	84ce                	mv	s1,s3
     80003f26:	bfbd                	j	80003ea4 <namex+0x9e>
+  if(nameiparent){
     80003f28:	f20b0be3          	beqz	s6,80003e5e <namex+0x58>
+    iput(ip);
     80003f2c:	8552                	mv	a0,s4
     80003f2e:	b49ff0ef          	jal	80003a76 <iput>
+    return 0;
     80003f32:	4a01                	li	s4,0
     80003f34:	b72d                	j	80003e5e <namex+0x58>
 
 0000000080003f36 <dirlink>:
+{
     80003f36:	7139                	addi	sp,sp,-64
     80003f38:	fc06                	sd	ra,56(sp)
     80003f3a:	f822                	sd	s0,48(sp)
@@ -7000,13 +7492,16 @@ devintr()
     80003f44:	892a                	mv	s2,a0
     80003f46:	8a2e                	mv	s4,a1
     80003f48:	89b2                	mv	s3,a2
+  if((ip = dirlookup(dp, name, 0)) != 0){
     80003f4a:	4601                	li	a2,0
     80003f4c:	e1fff0ef          	jal	80003d6a <dirlookup>
     80003f50:	e535                	bnez	a0,80003fbc <dirlink+0x86>
     80003f52:	f426                	sd	s1,40(sp)
+  for(off = 0; off < dp->size; off += sizeof(de)){
     80003f54:	04c92483          	lw	s1,76(s2)
     80003f58:	c48d                	beqz	s1,80003f82 <dirlink+0x4c>
     80003f5a:	4481                	li	s1,0
+    if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de))
     80003f5c:	4741                	li	a4,16
     80003f5e:	86a6                	mv	a3,s1
     80003f60:	fc040613          	addi	a2,s0,-64
@@ -7015,16 +7510,21 @@ devintr()
     80003f68:	be1ff0ef          	jal	80003b48 <readi>
     80003f6c:	47c1                	li	a5,16
     80003f6e:	04f51b63          	bne	a0,a5,80003fc4 <dirlink+0x8e>
+    if(de.inum == 0)
     80003f72:	fc045783          	lhu	a5,-64(s0)
     80003f76:	c791                	beqz	a5,80003f82 <dirlink+0x4c>
+  for(off = 0; off < dp->size; off += sizeof(de)){
     80003f78:	24c1                	addiw	s1,s1,16
     80003f7a:	04c92783          	lw	a5,76(s2)
     80003f7e:	fcf4efe3          	bltu	s1,a5,80003f5c <dirlink+0x26>
+  strncpy(de.name, name, DIRSIZ);
     80003f82:	4639                	li	a2,14
     80003f84:	85d2                	mv	a1,s4
     80003f86:	fc240513          	addi	a0,s0,-62
     80003f8a:	8d6fd0ef          	jal	80001060 <strncpy>
+  de.inum = inum;
     80003f8e:	fd341023          	sh	s3,-64(s0)
+  if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de))
     80003f92:	4741                	li	a4,16
     80003f94:	86a6                	mv	a3,s1
     80003f96:	fc040613          	addi	a2,s0,-64
@@ -7035,6 +7535,7 @@ devintr()
     80003fa4:	00a03533          	snez	a0,a0
     80003fa8:	40a00533          	neg	a0,a0
     80003fac:	74a2                	ld	s1,40(sp)
+}
     80003fae:	70e2                	ld	ra,56(sp)
     80003fb0:	7442                	ld	s0,48(sp)
     80003fb2:	7902                	ld	s2,32(sp)
@@ -7042,69 +7543,102 @@ devintr()
     80003fb6:	6a42                	ld	s4,16(sp)
     80003fb8:	6121                	addi	sp,sp,64
     80003fba:	8082                	ret
+    iput(ip);
     80003fbc:	abbff0ef          	jal	80003a76 <iput>
+    return -1;
     80003fc0:	557d                	li	a0,-1
     80003fc2:	b7f5                	j	80003fae <dirlink+0x78>
+      panic("dirlink read");
     80003fc4:	00005517          	auipc	a0,0x5
     80003fc8:	ab450513          	addi	a0,a0,-1356 # 80008a78 <etext+0xa78>
     80003fcc:	fc8fc0ef          	jal	80000794 <panic>
 
 0000000080003fd0 <namei>:
+
+struct inode*
+namei(char *path)
+{
     80003fd0:	1101                	addi	sp,sp,-32
     80003fd2:	ec06                	sd	ra,24(sp)
     80003fd4:	e822                	sd	s0,16(sp)
     80003fd6:	1000                	addi	s0,sp,32
+  char name[DIRSIZ];
+  return namex(path, 0, name);
     80003fd8:	fe040613          	addi	a2,s0,-32
     80003fdc:	4581                	li	a1,0
     80003fde:	e29ff0ef          	jal	80003e06 <namex>
+}
     80003fe2:	60e2                	ld	ra,24(sp)
     80003fe4:	6442                	ld	s0,16(sp)
     80003fe6:	6105                	addi	sp,sp,32
     80003fe8:	8082                	ret
 
 0000000080003fea <nameiparent>:
+
+struct inode*
+nameiparent(char *path, char *name)
+{
     80003fea:	1141                	addi	sp,sp,-16
     80003fec:	e406                	sd	ra,8(sp)
     80003fee:	e022                	sd	s0,0(sp)
     80003ff0:	0800                	addi	s0,sp,16
     80003ff2:	862e                	mv	a2,a1
+  return namex(path, 1, name);
     80003ff4:	4585                	li	a1,1
     80003ff6:	e11ff0ef          	jal	80003e06 <namex>
+}
     80003ffa:	60a2                	ld	ra,8(sp)
     80003ffc:	6402                	ld	s0,0(sp)
     80003ffe:	0141                	addi	sp,sp,16
     80004000:	8082                	ret
 
 0000000080004002 <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)
+{
     80004002:	1101                	addi	sp,sp,-32
     80004004:	ec06                	sd	ra,24(sp)
     80004006:	e822                	sd	s0,16(sp)
     80004008:	e426                	sd	s1,8(sp)
     8000400a:	e04a                	sd	s2,0(sp)
     8000400c:	1000                	addi	s0,sp,32
+  struct buf *buf = bread(log.dev, log.start);
     8000400e:	00048917          	auipc	s2,0x48
     80004012:	7ea90913          	addi	s2,s2,2026 # 8004c7f8 <log>
     80004016:	01892583          	lw	a1,24(s2)
     8000401a:	02892503          	lw	a0,40(s2)
     8000401e:	f8ffe0ef          	jal	80002fac <bread>
     80004022:	84aa                	mv	s1,a0
+  struct logheader *hb = (struct logheader *) (buf->data);
+  int i;
+  hb->n = log.lh.n;
     80004024:	02c92603          	lw	a2,44(s2)
     80004028:	cd30                	sw	a2,88(a0)
+  for (i = 0; i < log.lh.n; i++) {
     8000402a:	00c05f63          	blez	a2,80004048 <write_head+0x46>
     8000402e:	00048717          	auipc	a4,0x48
     80004032:	7fa70713          	addi	a4,a4,2042 # 8004c828 <log+0x30>
     80004036:	87aa                	mv	a5,a0
     80004038:	060a                	slli	a2,a2,0x2
     8000403a:	962a                	add	a2,a2,a0
+    hb->block[i] = log.lh.block[i];
     8000403c:	4314                	lw	a3,0(a4)
     8000403e:	cff4                	sw	a3,92(a5)
+  for (i = 0; i < log.lh.n; i++) {
     80004040:	0711                	addi	a4,a4,4
     80004042:	0791                	addi	a5,a5,4
     80004044:	fec79ce3          	bne	a5,a2,8000403c <write_head+0x3a>
+  }
+  bwrite(buf);
     80004048:	8526                	mv	a0,s1
     8000404a:	93eff0ef          	jal	80003188 <bwrite>
+  brelse(buf);
     8000404e:	8526                	mv	a0,s1
     80004050:	96aff0ef          	jal	800031ba <brelse>
+}
     80004054:	60e2                	ld	ra,24(sp)
     80004056:	6442                	ld	s0,16(sp)
     80004058:	64a2                	ld	s1,8(sp)
@@ -7113,9 +7647,11 @@ devintr()
     8000405e:	8082                	ret
 
 0000000080004060 <install_trans>:
+  for (tail = 0; tail < log.lh.n; tail++) {
     80004060:	00048797          	auipc	a5,0x48
     80004064:	7c47a783          	lw	a5,1988(a5) # 8004c824 <log+0x2c>
     80004068:	08f05f63          	blez	a5,80004106 <install_trans+0xa6>
+{
     8000406c:	7139                	addi	sp,sp,-64
     8000406e:	fc06                	sd	ra,56(sp)
     80004070:	f822                	sd	s0,48(sp)
@@ -7129,38 +7665,50 @@ devintr()
     80004080:	8b2a                	mv	s6,a0
     80004082:	00048a97          	auipc	s5,0x48
     80004086:	7a6a8a93          	addi	s5,s5,1958 # 8004c828 <log+0x30>
+  for (tail = 0; tail < log.lh.n; tail++) {
     8000408a:	4a01                	li	s4,0
+    struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block
     8000408c:	00048997          	auipc	s3,0x48
     80004090:	76c98993          	addi	s3,s3,1900 # 8004c7f8 <log>
     80004094:	a829                	j	800040ae <install_trans+0x4e>
+    brelse(lbuf);
     80004096:	854a                	mv	a0,s2
     80004098:	922ff0ef          	jal	800031ba <brelse>
+    brelse(dbuf);
     8000409c:	8526                	mv	a0,s1
     8000409e:	91cff0ef          	jal	800031ba <brelse>
+  for (tail = 0; tail < log.lh.n; tail++) {
     800040a2:	2a05                	addiw	s4,s4,1
     800040a4:	0a91                	addi	s5,s5,4
     800040a6:	02c9a783          	lw	a5,44(s3)
     800040aa:	04fa5463          	bge	s4,a5,800040f2 <install_trans+0x92>
+    struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block
     800040ae:	0189a583          	lw	a1,24(s3)
     800040b2:	014585bb          	addw	a1,a1,s4
     800040b6:	2585                	addiw	a1,a1,1
     800040b8:	0289a503          	lw	a0,40(s3)
     800040bc:	ef1fe0ef          	jal	80002fac <bread>
     800040c0:	892a                	mv	s2,a0
+    struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst
     800040c2:	000aa583          	lw	a1,0(s5)
     800040c6:	0289a503          	lw	a0,40(s3)
     800040ca:	ee3fe0ef          	jal	80002fac <bread>
     800040ce:	84aa                	mv	s1,a0
+    memmove(dbuf->data, lbuf->data, BSIZE);  // copy block to dst
     800040d0:	40000613          	li	a2,1024
     800040d4:	05890593          	addi	a1,s2,88
     800040d8:	05850513          	addi	a0,a0,88
     800040dc:	edffc0ef          	jal	80000fba <memmove>
+    bwrite(dbuf);  // write dst to disk
     800040e0:	8526                	mv	a0,s1
     800040e2:	8a6ff0ef          	jal	80003188 <bwrite>
+    if(recovering == 0)
     800040e6:	fa0b18e3          	bnez	s6,80004096 <install_trans+0x36>
+      bunpin(dbuf);
     800040ea:	8526                	mv	a0,s1
     800040ec:	9beff0ef          	jal	800032aa <bunpin>
     800040f0:	b75d                	j	80004096 <install_trans+0x36>
+}
     800040f2:	70e2                	ld	ra,56(sp)
     800040f4:	7442                	ld	s0,48(sp)
     800040f6:	74a2                	ld	s1,40(sp)
@@ -7174,6 +7722,7 @@ devintr()
     80004106:	8082                	ret
 
 0000000080004108 <initlog>:
+{
     80004108:	7179                	addi	sp,sp,-48
     8000410a:	f406                	sd	ra,40(sp)
     8000410c:	f022                	sd	s0,32(sp)
@@ -7183,38 +7732,57 @@ devintr()
     80004114:	1800                	addi	s0,sp,48
     80004116:	892a                	mv	s2,a0
     80004118:	89ae                	mv	s3,a1
+  initlock(&log.lock, "log");
     8000411a:	00048497          	auipc	s1,0x48
     8000411e:	6de48493          	addi	s1,s1,1758 # 8004c7f8 <log>
     80004122:	00005597          	auipc	a1,0x5
     80004126:	96658593          	addi	a1,a1,-1690 # 80008a88 <etext+0xa88>
     8000412a:	8526                	mv	a0,s1
     8000412c:	cdffc0ef          	jal	80000e0a <initlock>
+  log.start = sb->logstart;
     80004130:	0149a583          	lw	a1,20(s3)
     80004134:	cc8c                	sw	a1,24(s1)
+  log.size = sb->nlog;
     80004136:	0109a783          	lw	a5,16(s3)
     8000413a:	ccdc                	sw	a5,28(s1)
+  log.dev = dev;
     8000413c:	0324a423          	sw	s2,40(s1)
+  struct buf *buf = bread(log.dev, log.start);
     80004140:	854a                	mv	a0,s2
     80004142:	e6bfe0ef          	jal	80002fac <bread>
+  log.lh.n = lh->n;
     80004146:	4d30                	lw	a2,88(a0)
     80004148:	d4d0                	sw	a2,44(s1)
+  for (i = 0; i < log.lh.n; i++) {
     8000414a:	00c05f63          	blez	a2,80004168 <initlog+0x60>
     8000414e:	87aa                	mv	a5,a0
     80004150:	00048717          	auipc	a4,0x48
     80004154:	6d870713          	addi	a4,a4,1752 # 8004c828 <log+0x30>
     80004158:	060a                	slli	a2,a2,0x2
     8000415a:	962a                	add	a2,a2,a0
+    log.lh.block[i] = lh->block[i];
     8000415c:	4ff4                	lw	a3,92(a5)
     8000415e:	c314                	sw	a3,0(a4)
+  for (i = 0; i < log.lh.n; i++) {
     80004160:	0791                	addi	a5,a5,4
     80004162:	0711                	addi	a4,a4,4
     80004164:	fec79ce3          	bne	a5,a2,8000415c <initlog+0x54>
+  brelse(buf);
     80004168:	852ff0ef          	jal	800031ba <brelse>
+
+static void
+recover_from_log(void)
+{
+  read_head();
+  install_trans(1); // if committed, copy from log to disk
     8000416c:	4505                	li	a0,1
     8000416e:	ef3ff0ef          	jal	80004060 <install_trans>
+  log.lh.n = 0;
     80004172:	00048797          	auipc	a5,0x48
     80004176:	6a07a923          	sw	zero,1714(a5) # 8004c824 <log+0x2c>
+  write_head(); // clear the log
     8000417a:	e89ff0ef          	jal	80004002 <write_head>
+}
     8000417e:	70a2                	ld	ra,40(sp)
     80004180:	7402                	ld	s0,32(sp)
     80004182:	64e2                	ld	s1,24(sp)
@@ -7224,24 +7792,38 @@ devintr()
     8000418a:	8082                	ret
 
 000000008000418c <begin_op>:
+}
+
+// called at the start of each FS system call.
+void
+begin_op(void)
+{
     8000418c:	1101                	addi	sp,sp,-32
     8000418e:	ec06                	sd	ra,24(sp)
     80004190:	e822                	sd	s0,16(sp)
     80004192:	e426                	sd	s1,8(sp)
     80004194:	e04a                	sd	s2,0(sp)
     80004196:	1000                	addi	s0,sp,32
+  acquire(&log.lock);
     80004198:	00048517          	auipc	a0,0x48
     8000419c:	66050513          	addi	a0,a0,1632 # 8004c7f8 <log>
     800041a0:	cebfc0ef          	jal	80000e8a <acquire>
+  while(1){
+    if(log.committing){
     800041a4:	00048497          	auipc	s1,0x48
     800041a8:	65448493          	addi	s1,s1,1620 # 8004c7f8 <log>
+      sleep(&log, &log.lock);
+    } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){
     800041ac:	4979                	li	s2,30
     800041ae:	a029                	j	800041b8 <begin_op+0x2c>
+      sleep(&log, &log.lock);
     800041b0:	85a6                	mv	a1,s1
     800041b2:	8526                	mv	a0,s1
     800041b4:	958fe0ef          	jal	8000230c <sleep>
+    if(log.committing){
     800041b8:	50dc                	lw	a5,36(s1)
     800041ba:	fbfd                	bnez	a5,800041b0 <begin_op+0x24>
+    } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){
     800041bc:	5098                	lw	a4,32(s1)
     800041be:	2705                	addiw	a4,a4,1
     800041c0:	0027179b          	slliw	a5,a4,0x2
@@ -7250,14 +7832,23 @@ devintr()
     800041ca:	54d4                	lw	a3,44(s1)
     800041cc:	9fb5                	addw	a5,a5,a3
     800041ce:	00f95763          	bge	s2,a5,800041dc <begin_op+0x50>
+      // this op might exhaust log space; wait for commit.
+      sleep(&log, &log.lock);
     800041d2:	85a6                	mv	a1,s1
     800041d4:	8526                	mv	a0,s1
     800041d6:	936fe0ef          	jal	8000230c <sleep>
     800041da:	bff9                	j	800041b8 <begin_op+0x2c>
+    } else {
+      log.outstanding += 1;
     800041dc:	00048517          	auipc	a0,0x48
     800041e0:	61c50513          	addi	a0,a0,1564 # 8004c7f8 <log>
     800041e4:	d118                	sw	a4,32(a0)
+      release(&log.lock);
     800041e6:	d3dfc0ef          	jal	80000f22 <release>
+      break;
+    }
+  }
+}
     800041ea:	60e2                	ld	ra,24(sp)
     800041ec:	6442                	ld	s0,16(sp)
     800041ee:	64a2                	ld	s1,8(sp)
@@ -7266,53 +7857,89 @@ devintr()
     800041f4:	8082                	ret
 
 00000000800041f6 <end_op>:
+
+// called at the end of each FS system call.
+// commits if this was the last outstanding operation.
+void
+end_op(void)
+{
     800041f6:	7139                	addi	sp,sp,-64
     800041f8:	fc06                	sd	ra,56(sp)
     800041fa:	f822                	sd	s0,48(sp)
     800041fc:	f426                	sd	s1,40(sp)
     800041fe:	f04a                	sd	s2,32(sp)
     80004200:	0080                	addi	s0,sp,64
+  int do_commit = 0;
+
+  acquire(&log.lock);
     80004202:	00048497          	auipc	s1,0x48
     80004206:	5f648493          	addi	s1,s1,1526 # 8004c7f8 <log>
     8000420a:	8526                	mv	a0,s1
     8000420c:	c7ffc0ef          	jal	80000e8a <acquire>
+  log.outstanding -= 1;
     80004210:	509c                	lw	a5,32(s1)
     80004212:	37fd                	addiw	a5,a5,-1
     80004214:	0007891b          	sext.w	s2,a5
     80004218:	d09c                	sw	a5,32(s1)
+  if(log.committing)
     8000421a:	50dc                	lw	a5,36(s1)
     8000421c:	ef9d                	bnez	a5,8000425a <end_op+0x64>
+    panic("log.committing");
+  if(log.outstanding == 0){
     8000421e:	04091763          	bnez	s2,8000426c <end_op+0x76>
+    do_commit = 1;
+    log.committing = 1;
     80004222:	00048497          	auipc	s1,0x48
     80004226:	5d648493          	addi	s1,s1,1494 # 8004c7f8 <log>
     8000422a:	4785                	li	a5,1
     8000422c:	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);
     8000422e:	8526                	mv	a0,s1
     80004230:	cf3fc0ef          	jal	80000f22 <release>
+}
+
+static void
+commit()
+{
+  if (log.lh.n > 0) {
     80004234:	54dc                	lw	a5,44(s1)
     80004236:	04f04b63          	bgtz	a5,8000428c <end_op+0x96>
+    acquire(&log.lock);
     8000423a:	00048497          	auipc	s1,0x48
     8000423e:	5be48493          	addi	s1,s1,1470 # 8004c7f8 <log>
     80004242:	8526                	mv	a0,s1
     80004244:	c47fc0ef          	jal	80000e8a <acquire>
+    log.committing = 0;
     80004248:	0204a223          	sw	zero,36(s1)
+    wakeup(&log);
     8000424c:	8526                	mv	a0,s1
     8000424e:	90afe0ef          	jal	80002358 <wakeup>
+    release(&log.lock);
     80004252:	8526                	mv	a0,s1
     80004254:	ccffc0ef          	jal	80000f22 <release>
+}
     80004258:	a025                	j	80004280 <end_op+0x8a>
     8000425a:	ec4e                	sd	s3,24(sp)
     8000425c:	e852                	sd	s4,16(sp)
     8000425e:	e456                	sd	s5,8(sp)
+    panic("log.committing");
     80004260:	00005517          	auipc	a0,0x5
     80004264:	83050513          	addi	a0,a0,-2000 # 80008a90 <etext+0xa90>
     80004268:	d2cfc0ef          	jal	80000794 <panic>
+    wakeup(&log);
     8000426c:	00048497          	auipc	s1,0x48
     80004270:	58c48493          	addi	s1,s1,1420 # 8004c7f8 <log>
     80004274:	8526                	mv	a0,s1
     80004276:	8e2fe0ef          	jal	80002358 <wakeup>
+  release(&log.lock);
     8000427a:	8526                	mv	a0,s1
     8000427c:	ca7fc0ef          	jal	80000f22 <release>
+}
     80004280:	70e2                	ld	ra,56(sp)
     80004282:	7442                	ld	s0,48(sp)
     80004284:	74a2                	ld	s1,40(sp)
@@ -7322,8 +7949,10 @@ devintr()
     8000428c:	ec4e                	sd	s3,24(sp)
     8000428e:	e852                	sd	s4,16(sp)
     80004290:	e456                	sd	s5,8(sp)
+  for (tail = 0; tail < log.lh.n; tail++) {
     80004292:	00048a97          	auipc	s5,0x48
     80004296:	596a8a93          	addi	s5,s5,1430 # 8004c828 <log+0x30>
+    struct buf *to = bread(log.dev, log.start+tail+1); // log block
     8000429a:	00048a17          	auipc	s4,0x48
     8000429e:	55ea0a13          	addi	s4,s4,1374 # 8004c7f8 <log>
     800042a2:	018a2583          	lw	a1,24(s4)
@@ -7332,29 +7961,40 @@ devintr()
     800042ac:	028a2503          	lw	a0,40(s4)
     800042b0:	cfdfe0ef          	jal	80002fac <bread>
     800042b4:	84aa                	mv	s1,a0
+    struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block
     800042b6:	000aa583          	lw	a1,0(s5)
     800042ba:	028a2503          	lw	a0,40(s4)
     800042be:	ceffe0ef          	jal	80002fac <bread>
     800042c2:	89aa                	mv	s3,a0
+    memmove(to->data, from->data, BSIZE);
     800042c4:	40000613          	li	a2,1024
     800042c8:	05850593          	addi	a1,a0,88
     800042cc:	05848513          	addi	a0,s1,88
     800042d0:	cebfc0ef          	jal	80000fba <memmove>
+    bwrite(to);  // write the log
     800042d4:	8526                	mv	a0,s1
     800042d6:	eb3fe0ef          	jal	80003188 <bwrite>
+    brelse(from);
     800042da:	854e                	mv	a0,s3
     800042dc:	edffe0ef          	jal	800031ba <brelse>
+    brelse(to);
     800042e0:	8526                	mv	a0,s1
     800042e2:	ed9fe0ef          	jal	800031ba <brelse>
+  for (tail = 0; tail < log.lh.n; tail++) {
     800042e6:	2905                	addiw	s2,s2,1
     800042e8:	0a91                	addi	s5,s5,4
     800042ea:	02ca2783          	lw	a5,44(s4)
     800042ee:	faf94ae3          	blt	s2,a5,800042a2 <end_op+0xac>
+    write_log();     // Write modified blocks from cache to log
+    write_head();    // Write header to disk -- the real commit
     800042f2:	d11ff0ef          	jal	80004002 <write_head>
+    install_trans(0); // Now install writes to home locations
     800042f6:	4501                	li	a0,0
     800042f8:	d69ff0ef          	jal	80004060 <install_trans>
+    log.lh.n = 0;
     800042fc:	00048797          	auipc	a5,0x48
     80004300:	5207a423          	sw	zero,1320(a5) # 8004c824 <log+0x2c>
+    write_head();    // Erase the transaction from the log
     80004304:	cffff0ef          	jal	80004002 <write_head>
     80004308:	69e2                	ld	s3,24(sp)
     8000430a:	6a42                	ld	s4,16(sp)
@@ -7362,6 +8002,12 @@ devintr()
     8000430e:	b735                	j	8000423a <end_op+0x44>
 
 0000000080004310 <log_write>:
+//   modify bp->data[]
+//   log_write(bp)
+//   brelse(bp)
+void
+log_write(struct buf *b)
+{
     80004310:	1101                	addi	sp,sp,-32
     80004312:	ec06                	sd	ra,24(sp)
     80004314:	e822                	sd	s0,16(sp)
@@ -7369,10 +8015,14 @@ devintr()
     80004318:	e04a                	sd	s2,0(sp)
     8000431a:	1000                	addi	s0,sp,32
     8000431c:	84aa                	mv	s1,a0
+  int i;
+
+  acquire(&log.lock);
     8000431e:	00048917          	auipc	s2,0x48
     80004322:	4da90913          	addi	s2,s2,1242 # 8004c7f8 <log>
     80004326:	854a                	mv	a0,s2
     80004328:	b63fc0ef          	jal	80000e8a <acquire>
+  if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1)
     8000432c:	02c92603          	lw	a2,44(s2)
     80004330:	47f5                	li	a5,29
     80004332:	06c7c363          	blt	a5,a2,80004398 <log_write+0x88>
@@ -7380,20 +8030,32 @@ devintr()
     8000433a:	4de7a783          	lw	a5,1246(a5) # 8004c814 <log+0x1c>
     8000433e:	37fd                	addiw	a5,a5,-1
     80004340:	04f65c63          	bge	a2,a5,80004398 <log_write+0x88>
+    panic("too big a transaction");
+  if (log.outstanding < 1)
     80004344:	00048797          	auipc	a5,0x48
     80004348:	4d47a783          	lw	a5,1236(a5) # 8004c818 <log+0x20>
     8000434c:	04f05c63          	blez	a5,800043a4 <log_write+0x94>
+    panic("log_write outside of trans");
+
+  for (i = 0; i < log.lh.n; i++) {
     80004350:	4781                	li	a5,0
     80004352:	04c05f63          	blez	a2,800043b0 <log_write+0xa0>
+    if (log.lh.block[i] == b->blockno)   // log absorption
     80004356:	44cc                	lw	a1,12(s1)
     80004358:	00048717          	auipc	a4,0x48
     8000435c:	4d070713          	addi	a4,a4,1232 # 8004c828 <log+0x30>
+  for (i = 0; i < log.lh.n; i++) {
     80004360:	4781                	li	a5,0
+    if (log.lh.block[i] == b->blockno)   // log absorption
     80004362:	4314                	lw	a3,0(a4)
     80004364:	04b68663          	beq	a3,a1,800043b0 <log_write+0xa0>
+  for (i = 0; i < log.lh.n; i++) {
     80004368:	2785                	addiw	a5,a5,1
     8000436a:	0711                	addi	a4,a4,4
     8000436c:	fef61be3          	bne	a2,a5,80004362 <log_write+0x52>
+      break;
+  }
+  log.lh.block[i] = b->blockno;
     80004370:	0621                	addi	a2,a2,8
     80004372:	060a                	slli	a2,a2,0x2
     80004374:	00048797          	auipc	a5,0x48
@@ -7401,20 +8063,26 @@ devintr()
     8000437c:	97b2                	add	a5,a5,a2
     8000437e:	44d8                	lw	a4,12(s1)
     80004380:	cb98                	sw	a4,16(a5)
+  if (i == log.lh.n) {  // Add new block to log?
+    bpin(b);
     80004382:	8526                	mv	a0,s1
     80004384:	ecdfe0ef          	jal	80003250 <bpin>
+    log.lh.n++;
     80004388:	00048717          	auipc	a4,0x48
     8000438c:	47070713          	addi	a4,a4,1136 # 8004c7f8 <log>
     80004390:	575c                	lw	a5,44(a4)
     80004392:	2785                	addiw	a5,a5,1
     80004394:	d75c                	sw	a5,44(a4)
     80004396:	a80d                	j	800043c8 <log_write+0xb8>
+    panic("too big a transaction");
     80004398:	00004517          	auipc	a0,0x4
     8000439c:	70850513          	addi	a0,a0,1800 # 80008aa0 <etext+0xaa0>
     800043a0:	bf4fc0ef          	jal	80000794 <panic>
+    panic("log_write outside of trans");
     800043a4:	00004517          	auipc	a0,0x4
     800043a8:	71450513          	addi	a0,a0,1812 # 80008ab8 <etext+0xab8>
     800043ac:	be8fc0ef          	jal	80000794 <panic>
+  log.lh.block[i] = b->blockno;
     800043b0:	00878693          	addi	a3,a5,8
     800043b4:	068a                	slli	a3,a3,0x2
     800043b6:	00048717          	auipc	a4,0x48
@@ -7422,10 +8090,14 @@ devintr()
     800043be:	9736                	add	a4,a4,a3
     800043c0:	44d4                	lw	a3,12(s1)
     800043c2:	cb14                	sw	a3,16(a4)
+  if (i == log.lh.n) {  // Add new block to log?
     800043c4:	faf60fe3          	beq	a2,a5,80004382 <log_write+0x72>
+  }
+  release(&log.lock);
     800043c8:	00048517          	auipc	a0,0x48
     800043cc:	43050513          	addi	a0,a0,1072 # 8004c7f8 <log>
     800043d0:	b53fc0ef          	jal	80000f22 <release>
+}
     800043d4:	60e2                	ld	ra,24(sp)
     800043d6:	6442                	ld	s0,16(sp)
     800043d8:	64a2                	ld	s1,8(sp)
@@ -7545,47 +8217,76 @@ devintr()
     800044dc:	bfd9                	j	800044b2 <holdingsleep+0x1e>
 
 00000000800044de <fileinit>:
+  struct file file[NFILE];
+} ftable;
+
+void
+fileinit(void)
+{
     800044de:	1141                	addi	sp,sp,-16
     800044e0:	e406                	sd	ra,8(sp)
     800044e2:	e022                	sd	s0,0(sp)
     800044e4:	0800                	addi	s0,sp,16
+  initlock(&ftable.lock, "ftable");
     800044e6:	00004597          	auipc	a1,0x4
     800044ea:	60258593          	addi	a1,a1,1538 # 80008ae8 <etext+0xae8>
     800044ee:	00048517          	auipc	a0,0x48
     800044f2:	45250513          	addi	a0,a0,1106 # 8004c940 <ftable>
     800044f6:	915fc0ef          	jal	80000e0a <initlock>
+}
     800044fa:	60a2                	ld	ra,8(sp)
     800044fc:	6402                	ld	s0,0(sp)
     800044fe:	0141                	addi	sp,sp,16
     80004500:	8082                	ret
 
 0000000080004502 <filealloc>:
+
+// Allocate a file structure.
+struct file*
+filealloc(void)
+{
     80004502:	1101                	addi	sp,sp,-32
     80004504:	ec06                	sd	ra,24(sp)
     80004506:	e822                	sd	s0,16(sp)
     80004508:	e426                	sd	s1,8(sp)
     8000450a:	1000                	addi	s0,sp,32
+  struct file *f;
+
+  acquire(&ftable.lock);
     8000450c:	00048517          	auipc	a0,0x48
     80004510:	43450513          	addi	a0,a0,1076 # 8004c940 <ftable>
     80004514:	977fc0ef          	jal	80000e8a <acquire>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
     80004518:	00048497          	auipc	s1,0x48
     8000451c:	44048493          	addi	s1,s1,1088 # 8004c958 <ftable+0x18>
     80004520:	00049717          	auipc	a4,0x49
     80004524:	3d870713          	addi	a4,a4,984 # 8004d8f8 <disk>
+    if(f->ref == 0){
     80004528:	40dc                	lw	a5,4(s1)
     8000452a:	cf89                	beqz	a5,80004544 <filealloc+0x42>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
     8000452c:	02848493          	addi	s1,s1,40
     80004530:	fee49ce3          	bne	s1,a4,80004528 <filealloc+0x26>
+      f->ref = 1;
+      release(&ftable.lock);
+      return f;
+    }
+  }
+  release(&ftable.lock);
     80004534:	00048517          	auipc	a0,0x48
     80004538:	40c50513          	addi	a0,a0,1036 # 8004c940 <ftable>
     8000453c:	9e7fc0ef          	jal	80000f22 <release>
+  return 0;
     80004540:	4481                	li	s1,0
     80004542:	a809                	j	80004554 <filealloc+0x52>
+      f->ref = 1;
     80004544:	4785                	li	a5,1
     80004546:	c0dc                	sw	a5,4(s1)
+      release(&ftable.lock);
     80004548:	00048517          	auipc	a0,0x48
     8000454c:	3f850513          	addi	a0,a0,1016 # 8004c940 <ftable>
     80004550:	9d3fc0ef          	jal	80000f22 <release>
+}
     80004554:	8526                	mv	a0,s1
     80004556:	60e2                	ld	ra,24(sp)
     80004558:	6442                	ld	s0,16(sp)
@@ -7594,44 +8295,68 @@ devintr()
     8000455e:	8082                	ret
 
 0000000080004560 <filedup>:
+
+// Increment ref count for file f.
+struct file*
+filedup(struct file *f)
+{
     80004560:	1101                	addi	sp,sp,-32
     80004562:	ec06                	sd	ra,24(sp)
     80004564:	e822                	sd	s0,16(sp)
     80004566:	e426                	sd	s1,8(sp)
     80004568:	1000                	addi	s0,sp,32
     8000456a:	84aa                	mv	s1,a0
+  acquire(&ftable.lock);
     8000456c:	00048517          	auipc	a0,0x48
     80004570:	3d450513          	addi	a0,a0,980 # 8004c940 <ftable>
     80004574:	917fc0ef          	jal	80000e8a <acquire>
+  if(f->ref < 1)
     80004578:	40dc                	lw	a5,4(s1)
     8000457a:	02f05063          	blez	a5,8000459a <filedup+0x3a>
+    panic("filedup");
+  f->ref++;
     8000457e:	2785                	addiw	a5,a5,1
     80004580:	c0dc                	sw	a5,4(s1)
+  release(&ftable.lock);
     80004582:	00048517          	auipc	a0,0x48
     80004586:	3be50513          	addi	a0,a0,958 # 8004c940 <ftable>
     8000458a:	999fc0ef          	jal	80000f22 <release>
+  return f;
+}
     8000458e:	8526                	mv	a0,s1
     80004590:	60e2                	ld	ra,24(sp)
     80004592:	6442                	ld	s0,16(sp)
     80004594:	64a2                	ld	s1,8(sp)
     80004596:	6105                	addi	sp,sp,32
     80004598:	8082                	ret
+    panic("filedup");
     8000459a:	00004517          	auipc	a0,0x4
     8000459e:	55650513          	addi	a0,a0,1366 # 80008af0 <etext+0xaf0>
     800045a2:	9f2fc0ef          	jal	80000794 <panic>
 
 00000000800045a6 <fileclose>:
+
+// Close file f.  (Decrement ref count, close when reaches 0.)
+void
+fileclose(struct file *f)
+{
     800045a6:	7139                	addi	sp,sp,-64
     800045a8:	fc06                	sd	ra,56(sp)
     800045aa:	f822                	sd	s0,48(sp)
     800045ac:	f426                	sd	s1,40(sp)
     800045ae:	0080                	addi	s0,sp,64
     800045b0:	84aa                	mv	s1,a0
+  struct file ff;
+
+  acquire(&ftable.lock);
     800045b2:	00048517          	auipc	a0,0x48
     800045b6:	38e50513          	addi	a0,a0,910 # 8004c940 <ftable>
     800045ba:	8d1fc0ef          	jal	80000e8a <acquire>
+  if(f->ref < 1)
     800045be:	40dc                	lw	a5,4(s1)
     800045c0:	04f05a63          	blez	a5,80004614 <fileclose+0x6e>
+    panic("fileclose");
+  if(--f->ref > 0){
     800045c4:	37fd                	addiw	a5,a5,-1
     800045c6:	0007871b          	sext.w	a4,a5
     800045ca:	c0dc                	sw	a5,4(s1)
@@ -7640,17 +8365,28 @@ devintr()
     800045d2:	ec4e                	sd	s3,24(sp)
     800045d4:	e852                	sd	s4,16(sp)
     800045d6:	e456                	sd	s5,8(sp)
+    release(&ftable.lock);
+    return;
+  }
+  ff = *f;
     800045d8:	0004a903          	lw	s2,0(s1)
     800045dc:	0094ca83          	lbu	s5,9(s1)
     800045e0:	0104ba03          	ld	s4,16(s1)
     800045e4:	0184b983          	ld	s3,24(s1)
+  f->ref = 0;
     800045e8:	0004a223          	sw	zero,4(s1)
+  f->type = FD_NONE;
     800045ec:	0004a023          	sw	zero,0(s1)
+  release(&ftable.lock);
     800045f0:	00048517          	auipc	a0,0x48
     800045f4:	35050513          	addi	a0,a0,848 # 8004c940 <ftable>
     800045f8:	92bfc0ef          	jal	80000f22 <release>
+
+  if(ff.type == FD_PIPE){
     800045fc:	4785                	li	a5,1
     800045fe:	04f90063          	beq	s2,a5,8000463e <fileclose+0x98>
+    pipeclose(ff.pipe, ff.writable);
+  } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){
     80004602:	3979                	addiw	s2,s2,-2
     80004604:	4785                	li	a5,1
     80004606:	0527f563          	bgeu	a5,s2,80004650 <fileclose+0xaa>
@@ -7663,17 +8399,25 @@ devintr()
     80004616:	ec4e                	sd	s3,24(sp)
     80004618:	e852                	sd	s4,16(sp)
     8000461a:	e456                	sd	s5,8(sp)
+    panic("fileclose");
     8000461c:	00004517          	auipc	a0,0x4
     80004620:	4dc50513          	addi	a0,a0,1244 # 80008af8 <etext+0xaf8>
     80004624:	970fc0ef          	jal	80000794 <panic>
+    release(&ftable.lock);
     80004628:	00048517          	auipc	a0,0x48
     8000462c:	31850513          	addi	a0,a0,792 # 8004c940 <ftable>
     80004630:	8f3fc0ef          	jal	80000f22 <release>
+    begin_op();
+    iput(ff.ip);
+    end_op();
+  }
+}
     80004634:	70e2                	ld	ra,56(sp)
     80004636:	7442                	ld	s0,48(sp)
     80004638:	74a2                	ld	s1,40(sp)
     8000463a:	6121                	addi	sp,sp,64
     8000463c:	8082                	ret
+    pipeclose(ff.pipe, ff.writable);
     8000463e:	85d6                	mv	a1,s5
     80004640:	8552                	mv	a0,s4
     80004642:	336000ef          	jal	80004978 <pipeclose>
@@ -7682,9 +8426,12 @@ devintr()
     8000464a:	6a42                	ld	s4,16(sp)
     8000464c:	6aa2                	ld	s5,8(sp)
     8000464e:	b7dd                	j	80004634 <fileclose+0x8e>
+    begin_op();
     80004650:	b3dff0ef          	jal	8000418c <begin_op>
+    iput(ff.ip);
     80004654:	854e                	mv	a0,s3
     80004656:	c20ff0ef          	jal	80003a76 <iput>
+    end_op();
     8000465a:	b9dff0ef          	jal	800041f6 <end_op>
     8000465e:	7902                	ld	s2,32(sp)
     80004660:	69e2                	ld	s3,24(sp)
@@ -7693,6 +8440,12 @@ devintr()
     80004666:	b7f9                	j	80004634 <fileclose+0x8e>
 
 0000000080004668 <filestat>:
+
+// Get metadata about file f.
+// addr is a user virtual address, pointing to a struct stat.
+int
+filestat(struct file *f, uint64 addr)
+{
     80004668:	715d                	addi	sp,sp,-80
     8000466a:	e486                	sd	ra,72(sp)
     8000466c:	e0a2                	sd	s0,64(sp)
@@ -7701,20 +8454,28 @@ devintr()
     80004672:	0880                	addi	s0,sp,80
     80004674:	84aa                	mv	s1,a0
     80004676:	89ae                	mv	s3,a1
+  struct proc *p = myproc();
     80004678:	e44fd0ef          	jal	80001cbc <myproc>
+  struct stat st;
+  
+  if(f->type == FD_INODE || f->type == FD_DEVICE){
     8000467c:	409c                	lw	a5,0(s1)
     8000467e:	37f9                	addiw	a5,a5,-2
     80004680:	4705                	li	a4,1
     80004682:	04f76063          	bltu	a4,a5,800046c2 <filestat+0x5a>
     80004686:	f84a                	sd	s2,48(sp)
     80004688:	892a                	mv	s2,a0
+    ilock(f->ip);
     8000468a:	6c88                	ld	a0,24(s1)
     8000468c:	a68ff0ef          	jal	800038f4 <ilock>
+    stati(f->ip, &st);
     80004690:	fb840593          	addi	a1,s0,-72
     80004694:	6c88                	ld	a0,24(s1)
     80004696:	c88ff0ef          	jal	80003b1e <stati>
+    iunlock(f->ip);
     8000469a:	6c88                	ld	a0,24(s1)
     8000469c:	b06ff0ef          	jal	800039a2 <iunlock>
+    if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0)
     800046a0:	46e1                	li	a3,24
     800046a2:	fb840613          	addi	a2,s0,-72
     800046a6:	85ce                	mv	a1,s3
@@ -7722,21 +8483,36 @@ devintr()
     800046ac:	a32fd0ef          	jal	800018de <copyout>
     800046b0:	41f5551b          	sraiw	a0,a0,0x1f
     800046b4:	7942                	ld	s2,48(sp)
+      return -1;
+    return 0;
+  }
+  return -1;
+}
     800046b6:	60a6                	ld	ra,72(sp)
     800046b8:	6406                	ld	s0,64(sp)
     800046ba:	74e2                	ld	s1,56(sp)
     800046bc:	79a2                	ld	s3,40(sp)
     800046be:	6161                	addi	sp,sp,80
     800046c0:	8082                	ret
+  return -1;
     800046c2:	557d                	li	a0,-1
     800046c4:	bfcd                	j	800046b6 <filestat+0x4e>
 
 00000000800046c6 <fileread>:
+
+// Read from file f.
+// addr is a user virtual address.
+int
+fileread(struct file *f, uint64 addr, int n)
+{
     800046c6:	7179                	addi	sp,sp,-48
     800046c8:	f406                	sd	ra,40(sp)
     800046ca:	f022                	sd	s0,32(sp)
     800046cc:	e84a                	sd	s2,16(sp)
     800046ce:	1800                	addi	s0,sp,48
+  int r = 0;
+
+  if(f->readable == 0)
     800046d0:	00854783          	lbu	a5,8(a0)
     800046d4:	cfd1                	beqz	a5,80004770 <fileread+0xaa>
     800046d6:	ec26                	sd	s1,24(sp)
@@ -7744,15 +8520,26 @@ devintr()
     800046da:	84aa                	mv	s1,a0
     800046dc:	89ae                	mv	s3,a1
     800046de:	8932                	mv	s2,a2
+    return -1;
+
+  if(f->type == FD_PIPE){
     800046e0:	411c                	lw	a5,0(a0)
     800046e2:	4705                	li	a4,1
     800046e4:	04e78363          	beq	a5,a4,8000472a <fileread+0x64>
+    r = piperead(f->pipe, addr, n);
+  } else if(f->type == FD_DEVICE){
     800046e8:	470d                	li	a4,3
     800046ea:	04e78763          	beq	a5,a4,80004738 <fileread+0x72>
+    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){
     800046ee:	4709                	li	a4,2
     800046f0:	06e79a63          	bne	a5,a4,80004764 <fileread+0x9e>
+    ilock(f->ip);
     800046f4:	6d08                	ld	a0,24(a0)
     800046f6:	9feff0ef          	jal	800038f4 <ilock>
+    if((r = readi(f->ip, 1, addr, f->off, n)) > 0)
     800046fa:	874a                	mv	a4,s2
     800046fc:	5094                	lw	a3,32(s1)
     800046fe:	864e                	mv	a2,s3
@@ -7761,25 +8548,35 @@ devintr()
     80004704:	c44ff0ef          	jal	80003b48 <readi>
     80004708:	892a                	mv	s2,a0
     8000470a:	00a05563          	blez	a0,80004714 <fileread+0x4e>
+      f->off += r;
     8000470e:	509c                	lw	a5,32(s1)
     80004710:	9fa9                	addw	a5,a5,a0
     80004712:	d09c                	sw	a5,32(s1)
+    iunlock(f->ip);
     80004714:	6c88                	ld	a0,24(s1)
     80004716:	a8cff0ef          	jal	800039a2 <iunlock>
     8000471a:	64e2                	ld	s1,24(sp)
     8000471c:	69a2                	ld	s3,8(sp)
+  } else {
+    panic("fileread");
+  }
+
+  return r;
+}
     8000471e:	854a                	mv	a0,s2
     80004720:	70a2                	ld	ra,40(sp)
     80004722:	7402                	ld	s0,32(sp)
     80004724:	6942                	ld	s2,16(sp)
     80004726:	6145                	addi	sp,sp,48
     80004728:	8082                	ret
+    r = piperead(f->pipe, addr, n);
     8000472a:	6908                	ld	a0,16(a0)
     8000472c:	388000ef          	jal	80004ab4 <piperead>
     80004730:	892a                	mv	s2,a0
     80004732:	64e2                	ld	s1,24(sp)
     80004734:	69a2                	ld	s3,8(sp)
     80004736:	b7e5                	j	8000471e <fileread+0x58>
+    if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read)
     80004738:	02451783          	lh	a5,36(a0)
     8000473c:	03079693          	slli	a3,a5,0x30
     80004740:	92c1                	srli	a3,a3,0x30
@@ -7791,17 +8588,21 @@ devintr()
     80004752:	97ba                	add	a5,a5,a4
     80004754:	639c                	ld	a5,0(a5)
     80004756:	c39d                	beqz	a5,8000477c <fileread+0xb6>
+    r = devsw[f->major].read(1, addr, n);
     80004758:	4505                	li	a0,1
     8000475a:	9782                	jalr	a5
     8000475c:	892a                	mv	s2,a0
     8000475e:	64e2                	ld	s1,24(sp)
     80004760:	69a2                	ld	s3,8(sp)
     80004762:	bf75                	j	8000471e <fileread+0x58>
+    panic("fileread");
     80004764:	00004517          	auipc	a0,0x4
     80004768:	3a450513          	addi	a0,a0,932 # 80008b08 <etext+0xb08>
     8000476c:	828fc0ef          	jal	80000794 <panic>
+    return -1;
     80004770:	597d                	li	s2,-1
     80004772:	b775                	j	8000471e <fileread+0x58>
+      return -1;
     80004774:	597d                	li	s2,-1
     80004776:	64e2                	ld	s1,24(sp)
     80004778:	69a2                	ld	s3,8(sp)
@@ -7812,8 +8613,15 @@ devintr()
     80004782:	bf71                	j	8000471e <fileread+0x58>
 
 0000000080004784 <filewrite>:
+int
+filewrite(struct file *f, uint64 addr, int n)
+{
+  int r, ret = 0;
+
+  if(f->writable == 0)
     80004784:	00954783          	lbu	a5,9(a0)
     80004788:	10078b63          	beqz	a5,8000489e <filewrite+0x11a>
+{
     8000478c:	715d                	addi	sp,sp,-80
     8000478e:	e486                	sd	ra,72(sp)
     80004790:	e0a2                	sd	s0,64(sp)
@@ -7824,28 +8632,48 @@ devintr()
     8000479a:	892a                	mv	s2,a0
     8000479c:	8b2e                	mv	s6,a1
     8000479e:	8a32                	mv	s4,a2
+    return -1;
+
+  if(f->type == FD_PIPE){
     800047a0:	411c                	lw	a5,0(a0)
     800047a2:	4705                	li	a4,1
     800047a4:	02e78763          	beq	a5,a4,800047d2 <filewrite+0x4e>
+    ret = pipewrite(f->pipe, addr, n);
+  } else if(f->type == FD_DEVICE){
     800047a8:	470d                	li	a4,3
     800047aa:	02e78863          	beq	a5,a4,800047da <filewrite+0x56>
+    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){
     800047ae:	4709                	li	a4,2
     800047b0:	0ce79c63          	bne	a5,a4,80004888 <filewrite+0x104>
     800047b4:	f44e                	sd	s3,40(sp)
+    // 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){
     800047b6:	0ac05863          	blez	a2,80004866 <filewrite+0xe2>
     800047ba:	fc26                	sd	s1,56(sp)
     800047bc:	ec56                	sd	s5,24(sp)
     800047be:	e45e                	sd	s7,8(sp)
     800047c0:	e062                	sd	s8,0(sp)
+    int i = 0;
     800047c2:	4981                	li	s3,0
+      int n1 = n - i;
+      if(n1 > max)
     800047c4:	6b85                	lui	s7,0x1
     800047c6:	c00b8b93          	addi	s7,s7,-1024 # c00 <_entry-0x7ffff400>
     800047ca:	6c05                	lui	s8,0x1
     800047cc:	c00c0c1b          	addiw	s8,s8,-1024 # c00 <_entry-0x7ffff400>
     800047d0:	a8b5                	j	8000484c <filewrite+0xc8>
+    ret = pipewrite(f->pipe, addr, n);
     800047d2:	6908                	ld	a0,16(a0)
     800047d4:	1fc000ef          	jal	800049d0 <pipewrite>
     800047d8:	a04d                	j	8000487a <filewrite+0xf6>
+    if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write)
     800047da:	02451783          	lh	a5,36(a0)
     800047de:	03079693          	slli	a3,a5,0x30
     800047e2:	92c1                	srli	a3,a3,0x30
@@ -7857,13 +8685,20 @@ devintr()
     800047f4:	97ba                	add	a5,a5,a4
     800047f6:	679c                	ld	a5,8(a5)
     800047f8:	c7dd                	beqz	a5,800048a6 <filewrite+0x122>
+    ret = devsw[f->major].write(1, addr, n);
     800047fa:	4505                	li	a0,1
     800047fc:	9782                	jalr	a5
     800047fe:	a8b5                	j	8000487a <filewrite+0xf6>
+      if(n1 > max)
     80004800:	00048a9b          	sext.w	s5,s1
+        n1 = max;
+
+      begin_op();
     80004804:	989ff0ef          	jal	8000418c <begin_op>
+      ilock(f->ip);
     80004808:	01893503          	ld	a0,24(s2)
     8000480c:	8e8ff0ef          	jal	800038f4 <ilock>
+      if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0)
     80004810:	8756                	mv	a4,s5
     80004812:	02092683          	lw	a3,32(s2)
     80004816:	01698633          	add	a2,s3,s6
@@ -7872,16 +8707,28 @@ devintr()
     80004820:	c24ff0ef          	jal	80003c44 <writei>
     80004824:	84aa                	mv	s1,a0
     80004826:	00a05763          	blez	a0,80004834 <filewrite+0xb0>
+        f->off += r;
     8000482a:	02092783          	lw	a5,32(s2)
     8000482e:	9fa9                	addw	a5,a5,a0
     80004830:	02f92023          	sw	a5,32(s2)
+      iunlock(f->ip);
     80004834:	01893503          	ld	a0,24(s2)
     80004838:	96aff0ef          	jal	800039a2 <iunlock>
+      end_op();
     8000483c:	9bbff0ef          	jal	800041f6 <end_op>
+
+      if(r != n1){
     80004840:	029a9563          	bne	s5,s1,8000486a <filewrite+0xe6>
+        // error from writei
+        break;
+      }
+      i += r;
     80004844:	013489bb          	addw	s3,s1,s3
+    while(i < n){
     80004848:	0149da63          	bge	s3,s4,8000485c <filewrite+0xd8>
+      int n1 = n - i;
     8000484c:	413a04bb          	subw	s1,s4,s3
+      if(n1 > max)
     80004850:	0004879b          	sext.w	a5,s1
     80004854:	fafbd6e3          	bge	s7,a5,80004800 <filewrite+0x7c>
     80004858:	84e2                	mv	s1,s8
@@ -7891,15 +8738,24 @@ devintr()
     80004860:	6ba2                	ld	s7,8(sp)
     80004862:	6c02                	ld	s8,0(sp)
     80004864:	a039                	j	80004872 <filewrite+0xee>
+    int i = 0;
     80004866:	4981                	li	s3,0
     80004868:	a029                	j	80004872 <filewrite+0xee>
     8000486a:	74e2                	ld	s1,56(sp)
     8000486c:	6ae2                	ld	s5,24(sp)
     8000486e:	6ba2                	ld	s7,8(sp)
     80004870:	6c02                	ld	s8,0(sp)
+    }
+    ret = (i == n ? n : -1);
     80004872:	033a1c63          	bne	s4,s3,800048aa <filewrite+0x126>
     80004876:	8552                	mv	a0,s4
     80004878:	79a2                	ld	s3,40(sp)
+  } else {
+    panic("filewrite");
+  }
+
+  return ret;
+}
     8000487a:	60a6                	ld	ra,72(sp)
     8000487c:	6406                	ld	s0,64(sp)
     8000487e:	7942                	ld	s2,48(sp)
@@ -7912,20 +8768,31 @@ devintr()
     8000488c:	ec56                	sd	s5,24(sp)
     8000488e:	e45e                	sd	s7,8(sp)
     80004890:	e062                	sd	s8,0(sp)
+    panic("filewrite");
     80004892:	00004517          	auipc	a0,0x4
     80004896:	28650513          	addi	a0,a0,646 # 80008b18 <etext+0xb18>
     8000489a:	efbfb0ef          	jal	80000794 <panic>
+    return -1;
     8000489e:	557d                	li	a0,-1
+}
     800048a0:	8082                	ret
+      return -1;
     800048a2:	557d                	li	a0,-1
     800048a4:	bfd9                	j	8000487a <filewrite+0xf6>
     800048a6:	557d                	li	a0,-1
     800048a8:	bfc9                	j	8000487a <filewrite+0xf6>
+    ret = (i == n ? n : -1);
     800048aa:	557d                	li	a0,-1
     800048ac:	79a2                	ld	s3,40(sp)
     800048ae:	b7f1                	j	8000487a <filewrite+0xf6>
 
 00000000800048b0 <pipealloc>:
+  int writeopen;  // write fd is still open
+};
+
+int
+pipealloc(struct file **f0, struct file **f1)
+{
     800048b0:	7179                	addi	sp,sp,-48
     800048b2:	f406                	sd	ra,40(sp)
     800048b4:	f022                	sd	s0,32(sp)
@@ -7934,8 +8801,13 @@ devintr()
     800048ba:	1800                	addi	s0,sp,48
     800048bc:	84aa                	mv	s1,a0
     800048be:	8a2e                	mv	s4,a1
+  struct pipe *pi;
+
+  pi = 0;
+  *f0 = *f1 = 0;
     800048c0:	0005b023          	sd	zero,0(a1)
     800048c4:	00053023          	sd	zero,0(a0)
+  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
     800048c8:	c3bff0ef          	jal	80004502 <filealloc>
     800048cc:	e088                	sd	a0,0(s1)
     800048ce:	c549                	beqz	a0,80004958 <pipealloc+0xa8>
@@ -7943,38 +8815,60 @@ devintr()
     800048d4:	00aa3023          	sd	a0,0(s4)
     800048d8:	cd25                	beqz	a0,80004950 <pipealloc+0xa0>
     800048da:	e84a                	sd	s2,16(sp)
+    goto bad;
+  if((pi = (struct pipe*)kalloc()) == 0)
     800048dc:	b6efc0ef          	jal	80000c4a <kalloc>
     800048e0:	892a                	mv	s2,a0
     800048e2:	c12d                	beqz	a0,80004944 <pipealloc+0x94>
     800048e4:	e44e                	sd	s3,8(sp)
+    goto bad;
+  pi->readopen = 1;
     800048e6:	4985                	li	s3,1
     800048e8:	23352023          	sw	s3,544(a0)
+  pi->writeopen = 1;
     800048ec:	23352223          	sw	s3,548(a0)
+  pi->nwrite = 0;
     800048f0:	20052e23          	sw	zero,540(a0)
+  pi->nread = 0;
     800048f4:	20052c23          	sw	zero,536(a0)
+  initlock(&pi->lock, "pipe");
     800048f8:	00004597          	auipc	a1,0x4
     800048fc:	23058593          	addi	a1,a1,560 # 80008b28 <etext+0xb28>
     80004900:	d0afc0ef          	jal	80000e0a <initlock>
+  (*f0)->type = FD_PIPE;
     80004904:	609c                	ld	a5,0(s1)
     80004906:	0137a023          	sw	s3,0(a5)
+  (*f0)->readable = 1;
     8000490a:	609c                	ld	a5,0(s1)
     8000490c:	01378423          	sb	s3,8(a5)
+  (*f0)->writable = 0;
     80004910:	609c                	ld	a5,0(s1)
     80004912:	000784a3          	sb	zero,9(a5)
+  (*f0)->pipe = pi;
     80004916:	609c                	ld	a5,0(s1)
     80004918:	0127b823          	sd	s2,16(a5)
+  (*f1)->type = FD_PIPE;
     8000491c:	000a3783          	ld	a5,0(s4)
     80004920:	0137a023          	sw	s3,0(a5)
+  (*f1)->readable = 0;
     80004924:	000a3783          	ld	a5,0(s4)
     80004928:	00078423          	sb	zero,8(a5)
+  (*f1)->writable = 1;
     8000492c:	000a3783          	ld	a5,0(s4)
     80004930:	013784a3          	sb	s3,9(a5)
+  (*f1)->pipe = pi;
     80004934:	000a3783          	ld	a5,0(s4)
     80004938:	0127b823          	sd	s2,16(a5)
+  return 0;
     8000493c:	4501                	li	a0,0
     8000493e:	6942                	ld	s2,16(sp)
     80004940:	69a2                	ld	s3,8(sp)
     80004942:	a01d                	j	80004968 <pipealloc+0xb8>
+
+ bad:
+  if(pi)
+    kfree((char*)pi);
+  if(*f0)
     80004944:	6088                	ld	a0,0(s1)
     80004946:	c119                	beqz	a0,8000494c <pipealloc+0x9c>
     80004948:	6942                	ld	s2,16(sp)
@@ -7983,23 +8877,36 @@ devintr()
     8000494e:	a029                	j	80004958 <pipealloc+0xa8>
     80004950:	6088                	ld	a0,0(s1)
     80004952:	c10d                	beqz	a0,80004974 <pipealloc+0xc4>
+    fileclose(*f0);
     80004954:	c53ff0ef          	jal	800045a6 <fileclose>
+  if(*f1)
     80004958:	000a3783          	ld	a5,0(s4)
+    fileclose(*f1);
+  return -1;
     8000495c:	557d                	li	a0,-1
+  if(*f1)
     8000495e:	c789                	beqz	a5,80004968 <pipealloc+0xb8>
+    fileclose(*f1);
     80004960:	853e                	mv	a0,a5
     80004962:	c45ff0ef          	jal	800045a6 <fileclose>
+  return -1;
     80004966:	557d                	li	a0,-1
+}
     80004968:	70a2                	ld	ra,40(sp)
     8000496a:	7402                	ld	s0,32(sp)
     8000496c:	64e2                	ld	s1,24(sp)
     8000496e:	6a02                	ld	s4,0(sp)
     80004970:	6145                	addi	sp,sp,48
     80004972:	8082                	ret
+  return -1;
     80004974:	557d                	li	a0,-1
     80004976:	bfcd                	j	80004968 <pipealloc+0xb8>
 
 0000000080004978 <pipeclose>:
+
+void
+pipeclose(struct pipe *pi, int writable)
+{
     80004978:	1101                	addi	sp,sp,-32
     8000497a:	ec06                	sd	ra,24(sp)
     8000497c:	e822                	sd	s0,16(sp)
@@ -8008,32 +8915,54 @@ devintr()
     80004982:	1000                	addi	s0,sp,32
     80004984:	84aa                	mv	s1,a0
     80004986:	892e                	mv	s2,a1
+  acquire(&pi->lock);
     80004988:	d02fc0ef          	jal	80000e8a <acquire>
+  if(writable){
     8000498c:	02090763          	beqz	s2,800049ba <pipeclose+0x42>
+    pi->writeopen = 0;
     80004990:	2204a223          	sw	zero,548(s1)
+    wakeup(&pi->nread);
     80004994:	21848513          	addi	a0,s1,536
     80004998:	9c1fd0ef          	jal	80002358 <wakeup>
+  } else {
+    pi->readopen = 0;
+    wakeup(&pi->nwrite);
+  }
+  if(pi->readopen == 0 && pi->writeopen == 0){
     8000499c:	2204b783          	ld	a5,544(s1)
     800049a0:	e785                	bnez	a5,800049c8 <pipeclose+0x50>
+    release(&pi->lock);
     800049a2:	8526                	mv	a0,s1
     800049a4:	d7efc0ef          	jal	80000f22 <release>
+    kfree((char*)pi);
     800049a8:	8526                	mv	a0,s1
     800049aa:	93cfc0ef          	jal	80000ae6 <kfree>
+  } else
+    release(&pi->lock);
+}
     800049ae:	60e2                	ld	ra,24(sp)
     800049b0:	6442                	ld	s0,16(sp)
     800049b2:	64a2                	ld	s1,8(sp)
     800049b4:	6902                	ld	s2,0(sp)
     800049b6:	6105                	addi	sp,sp,32
     800049b8:	8082                	ret
+    pi->readopen = 0;
     800049ba:	2204a023          	sw	zero,544(s1)
+    wakeup(&pi->nwrite);
     800049be:	21c48513          	addi	a0,s1,540
     800049c2:	997fd0ef          	jal	80002358 <wakeup>
     800049c6:	bfd9                	j	8000499c <pipeclose+0x24>
+    release(&pi->lock);
     800049c8:	8526                	mv	a0,s1
     800049ca:	d58fc0ef          	jal	80000f22 <release>
+}
     800049ce:	b7c5                	j	800049ae <pipeclose+0x36>
 
 00000000800049d0 <pipewrite>:
+
+int
+pipewrite(struct pipe *pi, uint64 addr, int n)
+{
     800049d0:	711d                	addi	sp,sp,-96
     800049d2:	ec86                	sd	ra,88(sp)
     800049d4:	e8a2                	sd	s0,80(sp)
@@ -8046,25 +8975,47 @@ devintr()
     800049e2:	84aa                	mv	s1,a0
     800049e4:	8aae                	mv	s5,a1
     800049e6:	8a32                	mv	s4,a2
+  int i = 0;
+  struct proc *pr = myproc();
     800049e8:	ad4fd0ef          	jal	80001cbc <myproc>
     800049ec:	89aa                	mv	s3,a0
+
+  acquire(&pi->lock);
     800049ee:	8526                	mv	a0,s1
     800049f0:	c9afc0ef          	jal	80000e8a <acquire>
+  while(i < n){
     800049f4:	0b405a63          	blez	s4,80004aa8 <pipewrite+0xd8>
     800049f8:	f05a                	sd	s6,32(sp)
     800049fa:	ec5e                	sd	s7,24(sp)
     800049fc:	e862                	sd	s8,16(sp)
+  int i = 0;
     800049fe:	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)
     80004a00:	5b7d                	li	s6,-1
+      wakeup(&pi->nread);
     80004a02:	21848c13          	addi	s8,s1,536
+      sleep(&pi->nwrite, &pi->lock);
     80004a06:	21c48b93          	addi	s7,s1,540
     80004a0a:	a81d                	j	80004a40 <pipewrite+0x70>
+      release(&pi->lock);
     80004a0c:	8526                	mv	a0,s1
     80004a0e:	d14fc0ef          	jal	80000f22 <release>
+      return -1;
     80004a12:	597d                	li	s2,-1
     80004a14:	7b02                	ld	s6,32(sp)
     80004a16:	6be2                	ld	s7,24(sp)
     80004a18:	6c42                	ld	s8,16(sp)
+  }
+  wakeup(&pi->nread);
+  release(&pi->lock);
+
+  return i;
+}
     80004a1a:	854a                	mv	a0,s2
     80004a1c:	60e6                	ld	ra,88(sp)
     80004a1e:	6446                	ld	s0,80(sp)
@@ -8075,27 +9026,34 @@ devintr()
     80004a28:	7aa2                	ld	s5,40(sp)
     80004a2a:	6125                	addi	sp,sp,96
     80004a2c:	8082                	ret
+      wakeup(&pi->nread);
     80004a2e:	8562                	mv	a0,s8
     80004a30:	929fd0ef          	jal	80002358 <wakeup>
+      sleep(&pi->nwrite, &pi->lock);
     80004a34:	85a6                	mv	a1,s1
     80004a36:	855e                	mv	a0,s7
     80004a38:	8d5fd0ef          	jal	8000230c <sleep>
+  while(i < n){
     80004a3c:	05495b63          	bge	s2,s4,80004a92 <pipewrite+0xc2>
+    if(pi->readopen == 0 || killed(pr)){
     80004a40:	2204a783          	lw	a5,544(s1)
     80004a44:	d7e1                	beqz	a5,80004a0c <pipewrite+0x3c>
     80004a46:	854e                	mv	a0,s3
     80004a48:	afdfd0ef          	jal	80002544 <killed>
     80004a4c:	f161                	bnez	a0,80004a0c <pipewrite+0x3c>
+    if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full
     80004a4e:	2184a783          	lw	a5,536(s1)
     80004a52:	21c4a703          	lw	a4,540(s1)
     80004a56:	2007879b          	addiw	a5,a5,512
     80004a5a:	fcf70ae3          	beq	a4,a5,80004a2e <pipewrite+0x5e>
+      if(copyin(pr->pagetable, &ch, addr + i, 1) == -1)
     80004a5e:	4685                	li	a3,1
     80004a60:	01590633          	add	a2,s2,s5
     80004a64:	faf40593          	addi	a1,s0,-81
     80004a68:	0589b503          	ld	a0,88(s3)
     80004a6c:	f19fc0ef          	jal	80001984 <copyin>
     80004a70:	03650e63          	beq	a0,s6,80004aac <pipewrite+0xdc>
+      pi->data[pi->nwrite++ % PIPESIZE] = ch;
     80004a74:	21c4a783          	lw	a5,540(s1)
     80004a78:	0017871b          	addiw	a4,a5,1
     80004a7c:	20e4ae23          	sw	a4,540(s1)
@@ -8103,16 +9061,21 @@ devintr()
     80004a84:	97a6                	add	a5,a5,s1
     80004a86:	faf44703          	lbu	a4,-81(s0)
     80004a8a:	00e78c23          	sb	a4,24(a5)
+      i++;
     80004a8e:	2905                	addiw	s2,s2,1
     80004a90:	b775                	j	80004a3c <pipewrite+0x6c>
     80004a92:	7b02                	ld	s6,32(sp)
     80004a94:	6be2                	ld	s7,24(sp)
     80004a96:	6c42                	ld	s8,16(sp)
+  wakeup(&pi->nread);
     80004a98:	21848513          	addi	a0,s1,536
     80004a9c:	8bdfd0ef          	jal	80002358 <wakeup>
+  release(&pi->lock);
     80004aa0:	8526                	mv	a0,s1
     80004aa2:	c80fc0ef          	jal	80000f22 <release>
+  return i;
     80004aa6:	bf95                	j	80004a1a <pipewrite+0x4a>
+  int i = 0;
     80004aa8:	4901                	li	s2,0
     80004aaa:	b7fd                	j	80004a98 <pipewrite+0xc8>
     80004aac:	7b02                	ld	s6,32(sp)
@@ -8121,6 +9084,10 @@ devintr()
     80004ab2:	b7dd                	j	80004a98 <pipewrite+0xc8>
 
 0000000080004ab4 <piperead>:
+
+int
+piperead(struct pipe *pi, uint64 addr, int n)
+{
     80004ab4:	715d                	addi	sp,sp,-80
     80004ab6:	e486                	sd	ra,72(sp)
     80004ab8:	e0a2                	sd	s0,64(sp)
@@ -8133,22 +9100,37 @@ devintr()
     80004ac6:	84aa                	mv	s1,a0
     80004ac8:	892e                	mv	s2,a1
     80004aca:	8ab2                	mv	s5,a2
+  int i;
+  struct proc *pr = myproc();
     80004acc:	9f0fd0ef          	jal	80001cbc <myproc>
     80004ad0:	8a2a                	mv	s4,a0
+  char ch;
+
+  acquire(&pi->lock);
     80004ad2:	8526                	mv	a0,s1
     80004ad4:	bb6fc0ef          	jal	80000e8a <acquire>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
     80004ad8:	2184a703          	lw	a4,536(s1)
     80004adc:	21c4a783          	lw	a5,540(s1)
+    if(killed(pr)){
+      release(&pi->lock);
+      return -1;
+    }
+    sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep
     80004ae0:	21848993          	addi	s3,s1,536
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
     80004ae4:	02f71563          	bne	a4,a5,80004b0e <piperead+0x5a>
     80004ae8:	2244a783          	lw	a5,548(s1)
     80004aec:	cb85                	beqz	a5,80004b1c <piperead+0x68>
+    if(killed(pr)){
     80004aee:	8552                	mv	a0,s4
     80004af0:	a55fd0ef          	jal	80002544 <killed>
     80004af4:	ed19                	bnez	a0,80004b12 <piperead+0x5e>
+    sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep
     80004af6:	85a6                	mv	a1,s1
     80004af8:	854e                	mv	a0,s3
     80004afa:	813fd0ef          	jal	8000230c <sleep>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
     80004afe:	2184a703          	lw	a4,536(s1)
     80004b02:	21c4a783          	lw	a5,540(s1)
     80004b06:	fef701e3          	beq	a4,a5,80004ae8 <piperead+0x34>
@@ -8156,38 +9138,57 @@ devintr()
     80004b0c:	a809                	j	80004b1e <piperead+0x6a>
     80004b0e:	e85a                	sd	s6,16(sp)
     80004b10:	a039                	j	80004b1e <piperead+0x6a>
+      release(&pi->lock);
     80004b12:	8526                	mv	a0,s1
     80004b14:	c0efc0ef          	jal	80000f22 <release>
+      return -1;
     80004b18:	59fd                	li	s3,-1
     80004b1a:	a8b1                	j	80004b76 <piperead+0xc2>
     80004b1c:	e85a                	sd	s6,16(sp)
+  }
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
     80004b1e:	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)
     80004b20:	5b7d                	li	s6,-1
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
     80004b22:	05505263          	blez	s5,80004b66 <piperead+0xb2>
+    if(pi->nread == pi->nwrite)
     80004b26:	2184a783          	lw	a5,536(s1)
     80004b2a:	21c4a703          	lw	a4,540(s1)
     80004b2e:	02f70c63          	beq	a4,a5,80004b66 <piperead+0xb2>
+    ch = pi->data[pi->nread++ % PIPESIZE];
     80004b32:	0017871b          	addiw	a4,a5,1
     80004b36:	20e4ac23          	sw	a4,536(s1)
     80004b3a:	1ff7f793          	andi	a5,a5,511
     80004b3e:	97a6                	add	a5,a5,s1
     80004b40:	0187c783          	lbu	a5,24(a5)
     80004b44:	faf40fa3          	sb	a5,-65(s0)
+    if(copyout(pr->pagetable, addr + i, &ch, 1) == -1)
     80004b48:	4685                	li	a3,1
     80004b4a:	fbf40613          	addi	a2,s0,-65
     80004b4e:	85ca                	mv	a1,s2
     80004b50:	058a3503          	ld	a0,88(s4)
     80004b54:	d8bfc0ef          	jal	800018de <copyout>
     80004b58:	01650763          	beq	a0,s6,80004b66 <piperead+0xb2>
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
     80004b5c:	2985                	addiw	s3,s3,1
     80004b5e:	0905                	addi	s2,s2,1
     80004b60:	fd3a93e3          	bne	s5,s3,80004b26 <piperead+0x72>
     80004b64:	89d6                	mv	s3,s5
+      break;
+  }
+  wakeup(&pi->nwrite);  //DOC: piperead-wakeup
     80004b66:	21c48513          	addi	a0,s1,540
     80004b6a:	feefd0ef          	jal	80002358 <wakeup>
+  release(&pi->lock);
     80004b6e:	8526                	mv	a0,s1
     80004b70:	bb2fc0ef          	jal	80000f22 <release>
     80004b74:	6b42                	ld	s6,16(sp)
+  return i;
+}
     80004b76:	854e                	mv	a0,s3
     80004b78:	60a6                	ld	ra,72(sp)
     80004b7a:	6406                	ld	s0,64(sp)
@@ -8200,20 +9201,37 @@ devintr()
     80004b88:	8082                	ret
 
 0000000080004b8a <flags2perm>:
+#include "elf.h"
+
+static int loadseg(pde_t *, uint64, struct inode *, uint, uint);
+
+int flags2perm(int flags)
+{
     80004b8a:	1141                	addi	sp,sp,-16
     80004b8c:	e422                	sd	s0,8(sp)
     80004b8e:	0800                	addi	s0,sp,16
     80004b90:	87aa                	mv	a5,a0
+    int perm = 0;
+    if(flags & 0x1)
     80004b92:	8905                	andi	a0,a0,1
     80004b94:	050e                	slli	a0,a0,0x3
+      perm = PTE_X;
+    if(flags & 0x2)
     80004b96:	8b89                	andi	a5,a5,2
     80004b98:	c399                	beqz	a5,80004b9e <flags2perm+0x14>
+      perm |= PTE_W;
     80004b9a:	00456513          	ori	a0,a0,4
+    return perm;
+}
     80004b9e:	6422                	ld	s0,8(sp)
     80004ba0:	0141                	addi	sp,sp,16
     80004ba2:	8082                	ret
 
 0000000080004ba4 <exec>:
+
+int
+exec(char *path, char **argv)
+{
     80004ba4:	df010113          	addi	sp,sp,-528
     80004ba8:	20113423          	sd	ra,520(sp)
     80004bac:	20813023          	sd	s0,512(sp)
@@ -8223,15 +9241,32 @@ devintr()
     80004bb6:	892a                	mv	s2,a0
     80004bb8:	dea43c23          	sd	a0,-520(s0)
     80004bbc:	e0b43023          	sd	a1,-512(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();
     80004bc0:	8fcfd0ef          	jal	80001cbc <myproc>
     80004bc4:	84aa                	mv	s1,a0
+
+  begin_op();
     80004bc6:	dc6ff0ef          	jal	8000418c <begin_op>
+
+  if((ip = namei(path)) == 0){
     80004bca:	854a                	mv	a0,s2
     80004bcc:	c04ff0ef          	jal	80003fd0 <namei>
     80004bd0:	c931                	beqz	a0,80004c24 <exec+0x80>
     80004bd2:	f3d2                	sd	s4,480(sp)
     80004bd4:	8a2a                	mv	s4,a0
+    end_op();
+    return -1;
+  }
+  ilock(ip);
     80004bd6:	d1ffe0ef          	jal	800038f4 <ilock>
+
+  // Check ELF header
+  if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf))
     80004bda:	04000713          	li	a4,64
     80004bde:	4681                	li	a3,0
     80004be0:	e5040613          	addi	a2,s0,-432
@@ -8240,25 +9275,41 @@ devintr()
     80004be8:	f61fe0ef          	jal	80003b48 <readi>
     80004bec:	04000793          	li	a5,64
     80004bf0:	00f51a63          	bne	a0,a5,80004c04 <exec+0x60>
+    goto bad;
+
+  if(elf.magic != ELF_MAGIC)
     80004bf4:	e5042703          	lw	a4,-432(s0)
     80004bf8:	464c47b7          	lui	a5,0x464c4
     80004bfc:	57f78793          	addi	a5,a5,1407 # 464c457f <_entry-0x39b3ba81>
     80004c00:	02f70663          	beq	a4,a5,80004c2c <exec+0x88>
+
+ bad:
+  if(pagetable)
+    proc_freepagetable(pagetable, sz);
+  if(ip){
+    iunlockput(ip);
     80004c04:	8552                	mv	a0,s4
     80004c06:	ef9fe0ef          	jal	80003afe <iunlockput>
+    end_op();
     80004c0a:	decff0ef          	jal	800041f6 <end_op>
+  }
+  return -1;
     80004c0e:	557d                	li	a0,-1
     80004c10:	7a1e                	ld	s4,480(sp)
+}
     80004c12:	20813083          	ld	ra,520(sp)
     80004c16:	20013403          	ld	s0,512(sp)
     80004c1a:	74fe                	ld	s1,504(sp)
     80004c1c:	795e                	ld	s2,496(sp)
     80004c1e:	21010113          	addi	sp,sp,528
     80004c22:	8082                	ret
+    end_op();
     80004c24:	dd2ff0ef          	jal	800041f6 <end_op>
+    return -1;
     80004c28:	557d                	li	a0,-1
     80004c2a:	b7e5                	j	80004c12 <exec+0x6e>
     80004c2c:	ebda                	sd	s6,464(sp)
+  if((pagetable = proc_pagetable(p)) == 0)
     80004c2e:	8526                	mv	a0,s1
     80004c30:	95cfd0ef          	jal	80001d8c <proc_pagetable>
     80004c34:	8b2a                	mv	s6,a0
@@ -8269,21 +9320,37 @@ devintr()
     80004c40:	e3e2                	sd	s8,448(sp)
     80004c42:	ff66                	sd	s9,440(sp)
     80004c44:	fb6a                	sd	s10,432(sp)
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
     80004c46:	e7042d03          	lw	s10,-400(s0)
     80004c4a:	e8845783          	lhu	a5,-376(s0)
     80004c4e:	12078963          	beqz	a5,80004d80 <exec+0x1dc>
     80004c52:	f76e                	sd	s11,424(sp)
+  uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase;
     80004c54:	4901                	li	s2,0
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
     80004c56:	4d81                	li	s11,0
+    if(ph.vaddr % PGSIZE != 0)
     80004c58:	6c85                	lui	s9,0x1
     80004c5a:	fffc8793          	addi	a5,s9,-1 # fff <_entry-0x7ffff001>
     80004c5e:	def43823          	sd	a5,-528(s0)
+
+  for(i = 0; i < sz; i += PGSIZE){
+    pa = walkaddr(pagetable, va + i);
+    if(pa == 0)
+      panic("loadseg: address should exist");
+    if(sz - i < PGSIZE)
     80004c62:	6a85                	lui	s5,0x1
     80004c64:	a085                	j	80004cc4 <exec+0x120>
+      panic("loadseg: address should exist");
     80004c66:	00004517          	auipc	a0,0x4
     80004c6a:	eca50513          	addi	a0,a0,-310 # 80008b30 <etext+0xb30>
     80004c6e:	b27fb0ef          	jal	80000794 <panic>
+    if(sz - i < PGSIZE)
     80004c72:	2481                	sext.w	s1,s1
+      n = sz - i;
+    else
+      n = PGSIZE;
+    if(readi(ip, 0, (uint64)pa, offset+i, n) != n)
     80004c74:	8726                	mv	a4,s1
     80004c76:	012c06bb          	addw	a3,s8,s2
     80004c7a:	4581                	li	a1,0
@@ -8291,25 +9358,32 @@ devintr()
     80004c7e:	ecbfe0ef          	jal	80003b48 <readi>
     80004c82:	2501                	sext.w	a0,a0
     80004c84:	24a49a63          	bne	s1,a0,80004ed8 <exec+0x334>
+  for(i = 0; i < sz; i += PGSIZE){
     80004c88:	012a893b          	addw	s2,s5,s2
     80004c8c:	03397363          	bgeu	s2,s3,80004cb2 <exec+0x10e>
+    pa = walkaddr(pagetable, va + i);
     80004c90:	02091593          	slli	a1,s2,0x20
     80004c94:	9181                	srli	a1,a1,0x20
     80004c96:	95de                	add	a1,a1,s7
     80004c98:	855a                	mv	a0,s6
     80004c9a:	e3efc0ef          	jal	800012d8 <walkaddr>
     80004c9e:	862a                	mv	a2,a0
+    if(pa == 0)
     80004ca0:	d179                	beqz	a0,80004c66 <exec+0xc2>
+    if(sz - i < PGSIZE)
     80004ca2:	412984bb          	subw	s1,s3,s2
     80004ca6:	0004879b          	sext.w	a5,s1
     80004caa:	fcfcf4e3          	bgeu	s9,a5,80004c72 <exec+0xce>
     80004cae:	84d6                	mv	s1,s5
     80004cb0:	b7c9                	j	80004c72 <exec+0xce>
+    sz = sz1;
     80004cb2:	e0843903          	ld	s2,-504(s0)
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
     80004cb6:	2d85                	addiw	s11,s11,1
     80004cb8:	038d0d1b          	addiw	s10,s10,56
     80004cbc:	e8845783          	lhu	a5,-376(s0)
     80004cc0:	08fdd063          	bge	s11,a5,80004d40 <exec+0x19c>
+    if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
     80004cc4:	2d01                	sext.w	s10,s10
     80004cc6:	03800713          	li	a4,56
     80004cca:	86ea                	mv	a3,s10
@@ -8319,18 +9393,23 @@ devintr()
     80004cd4:	e75fe0ef          	jal	80003b48 <readi>
     80004cd8:	03800793          	li	a5,56
     80004cdc:	1cf51663          	bne	a0,a5,80004ea8 <exec+0x304>
+    if(ph.type != ELF_PROG_LOAD)
     80004ce0:	e1842783          	lw	a5,-488(s0)
     80004ce4:	4705                	li	a4,1
     80004ce6:	fce798e3          	bne	a5,a4,80004cb6 <exec+0x112>
+    if(ph.memsz < ph.filesz)
     80004cea:	e4043483          	ld	s1,-448(s0)
     80004cee:	e3843783          	ld	a5,-456(s0)
     80004cf2:	1af4ef63          	bltu	s1,a5,80004eb0 <exec+0x30c>
+    if(ph.vaddr + ph.memsz < ph.vaddr)
     80004cf6:	e2843783          	ld	a5,-472(s0)
     80004cfa:	94be                	add	s1,s1,a5
     80004cfc:	1af4ee63          	bltu	s1,a5,80004eb8 <exec+0x314>
+    if(ph.vaddr % PGSIZE != 0)
     80004d00:	df043703          	ld	a4,-528(s0)
     80004d04:	8ff9                	and	a5,a5,a4
     80004d06:	1a079d63          	bnez	a5,80004ec0 <exec+0x31c>
+    if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0)
     80004d0a:	e1c42503          	lw	a0,-484(s0)
     80004d0e:	e7dff0ef          	jal	80004b8a <flags2perm>
     80004d12:	86aa                	mv	a3,a0
@@ -8340,26 +9419,35 @@ devintr()
     80004d1a:	9a7fc0ef          	jal	800016c0 <uvmalloc>
     80004d1e:	e0a43423          	sd	a0,-504(s0)
     80004d22:	1a050363          	beqz	a0,80004ec8 <exec+0x324>
+    if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0)
     80004d26:	e2843b83          	ld	s7,-472(s0)
     80004d2a:	e2042c03          	lw	s8,-480(s0)
     80004d2e:	e3842983          	lw	s3,-456(s0)
+  for(i = 0; i < sz; i += PGSIZE){
     80004d32:	00098463          	beqz	s3,80004d3a <exec+0x196>
     80004d36:	4901                	li	s2,0
     80004d38:	bfa1                	j	80004c90 <exec+0xec>
+    sz = sz1;
     80004d3a:	e0843903          	ld	s2,-504(s0)
     80004d3e:	bfa5                	j	80004cb6 <exec+0x112>
     80004d40:	7dba                	ld	s11,424(sp)
+  iunlockput(ip);
     80004d42:	8552                	mv	a0,s4
     80004d44:	dbbfe0ef          	jal	80003afe <iunlockput>
+  end_op();
     80004d48:	caeff0ef          	jal	800041f6 <end_op>
+  p = myproc();
     80004d4c:	f71fc0ef          	jal	80001cbc <myproc>
     80004d50:	8aaa                	mv	s5,a0
+  uint64 oldsz = p->sz;
     80004d52:	05053c83          	ld	s9,80(a0)
+  sz = PGROUNDUP(sz);
     80004d56:	6985                	lui	s3,0x1
     80004d58:	19fd                	addi	s3,s3,-1 # fff <_entry-0x7ffff001>
     80004d5a:	99ca                	add	s3,s3,s2
     80004d5c:	77fd                	lui	a5,0xfffff
     80004d5e:	00f9f9b3          	and	s3,s3,a5
+  if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0)
     80004d62:	4691                	li	a3,4
     80004d64:	6609                	lui	a2,0x2
     80004d66:	964e                	add	a2,a2,s3
@@ -8369,28 +9457,37 @@ devintr()
     80004d70:	892a                	mv	s2,a0
     80004d72:	e0a43423          	sd	a0,-504(s0)
     80004d76:	e519                	bnez	a0,80004d84 <exec+0x1e0>
+  if(pagetable)
     80004d78:	e1343423          	sd	s3,-504(s0)
     80004d7c:	4a01                	li	s4,0
     80004d7e:	aab1                	j	80004eda <exec+0x336>
+  uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase;
     80004d80:	4901                	li	s2,0
     80004d82:	b7c1                	j	80004d42 <exec+0x19e>
+  uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE);
     80004d84:	75f9                	lui	a1,0xffffe
     80004d86:	95aa                	add	a1,a1,a0
     80004d88:	855a                	mv	a0,s6
     80004d8a:	b2bfc0ef          	jal	800018b4 <uvmclear>
+  stackbase = sp - USERSTACK*PGSIZE;
     80004d8e:	7bfd                	lui	s7,0xfffff
     80004d90:	9bca                	add	s7,s7,s2
+  for(argc = 0; argv[argc]; argc++) {
     80004d92:	e0043783          	ld	a5,-512(s0)
     80004d96:	6388                	ld	a0,0(a5)
     80004d98:	cd39                	beqz	a0,80004df6 <exec+0x252>
     80004d9a:	e9040993          	addi	s3,s0,-368
     80004d9e:	f9040c13          	addi	s8,s0,-112
     80004da2:	4481                	li	s1,0
+    sp -= strlen(argv[argc]) + 1;
     80004da4:	b2afc0ef          	jal	800010ce <strlen>
     80004da8:	0015079b          	addiw	a5,a0,1
     80004dac:	40f907b3          	sub	a5,s2,a5
+    sp -= sp % 16; // riscv sp must be 16-byte aligned
     80004db0:	ff07f913          	andi	s2,a5,-16
+    if(sp < stackbase)
     80004db4:	11796e63          	bltu	s2,s7,80004ed0 <exec+0x32c>
+    if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
     80004db8:	e0043d03          	ld	s10,-512(s0)
     80004dbc:	000d3a03          	ld	s4,0(s10)
     80004dc0:	8552                	mv	a0,s4
@@ -8401,62 +9498,88 @@ devintr()
     80004dce:	855a                	mv	a0,s6
     80004dd0:	b0ffc0ef          	jal	800018de <copyout>
     80004dd4:	10054063          	bltz	a0,80004ed4 <exec+0x330>
+    ustack[argc] = sp;
     80004dd8:	0129b023          	sd	s2,0(s3)
+  for(argc = 0; argv[argc]; argc++) {
     80004ddc:	0485                	addi	s1,s1,1
     80004dde:	008d0793          	addi	a5,s10,8
     80004de2:	e0f43023          	sd	a5,-512(s0)
     80004de6:	008d3503          	ld	a0,8(s10)
     80004dea:	c909                	beqz	a0,80004dfc <exec+0x258>
+    if(argc >= MAXARG)
     80004dec:	09a1                	addi	s3,s3,8
     80004dee:	fb899be3          	bne	s3,s8,80004da4 <exec+0x200>
+  ip = 0;
     80004df2:	4a01                	li	s4,0
     80004df4:	a0dd                	j	80004eda <exec+0x336>
+  sp = sz;
     80004df6:	e0843903          	ld	s2,-504(s0)
+  for(argc = 0; argv[argc]; argc++) {
     80004dfa:	4481                	li	s1,0
+  ustack[argc] = 0;
     80004dfc:	00349793          	slli	a5,s1,0x3
     80004e00:	f9078793          	addi	a5,a5,-112 # ffffffffffffef90 <end+0xffffffff7ffb1558>
     80004e04:	97a2                	add	a5,a5,s0
     80004e06:	f007b023          	sd	zero,-256(a5)
+  sp -= (argc+1) * sizeof(uint64);
     80004e0a:	00148693          	addi	a3,s1,1
     80004e0e:	068e                	slli	a3,a3,0x3
     80004e10:	40d90933          	sub	s2,s2,a3
+  sp -= sp % 16;
     80004e14:	ff097913          	andi	s2,s2,-16
+  sz = sz1;
     80004e18:	e0843983          	ld	s3,-504(s0)
+  if(sp < stackbase)
     80004e1c:	f5796ee3          	bltu	s2,s7,80004d78 <exec+0x1d4>
+  if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0)
     80004e20:	e9040613          	addi	a2,s0,-368
     80004e24:	85ca                	mv	a1,s2
     80004e26:	855a                	mv	a0,s6
     80004e28:	ab7fc0ef          	jal	800018de <copyout>
     80004e2c:	0e054263          	bltz	a0,80004f10 <exec+0x36c>
+  p->trapframe->a1 = sp;
     80004e30:	060ab783          	ld	a5,96(s5) # 1060 <_entry-0x7fffefa0>
     80004e34:	0727bc23          	sd	s2,120(a5)
+  for(last=s=path; *s; s++)
     80004e38:	df843783          	ld	a5,-520(s0)
     80004e3c:	0007c703          	lbu	a4,0(a5)
     80004e40:	cf11                	beqz	a4,80004e5c <exec+0x2b8>
     80004e42:	0785                	addi	a5,a5,1
+    if(*s == '/')
     80004e44:	02f00693          	li	a3,47
     80004e48:	a039                	j	80004e56 <exec+0x2b2>
+      last = s+1;
     80004e4a:	def43c23          	sd	a5,-520(s0)
+  for(last=s=path; *s; s++)
     80004e4e:	0785                	addi	a5,a5,1
     80004e50:	fff7c703          	lbu	a4,-1(a5)
     80004e54:	c701                	beqz	a4,80004e5c <exec+0x2b8>
+    if(*s == '/')
     80004e56:	fed71ce3          	bne	a4,a3,80004e4e <exec+0x2aa>
     80004e5a:	bfc5                	j	80004e4a <exec+0x2a6>
+  safestrcpy(p->name, last, sizeof(p->name));
     80004e5c:	4641                	li	a2,16
     80004e5e:	df843583          	ld	a1,-520(s0)
     80004e62:	160a8513          	addi	a0,s5,352
     80004e66:	a36fc0ef          	jal	8000109c <safestrcpy>
+  oldpagetable = p->pagetable;
     80004e6a:	058ab503          	ld	a0,88(s5)
+  p->pagetable = pagetable;
     80004e6e:	056abc23          	sd	s6,88(s5)
+  p->sz = sz;
     80004e72:	e0843783          	ld	a5,-504(s0)
     80004e76:	04fab823          	sd	a5,80(s5)
+  p->trapframe->epc = elf.entry;  // initial program counter = main
     80004e7a:	060ab783          	ld	a5,96(s5)
     80004e7e:	e6843703          	ld	a4,-408(s0)
     80004e82:	ef98                	sd	a4,24(a5)
+  p->trapframe->sp = sp; // initial stack pointer
     80004e84:	060ab783          	ld	a5,96(s5)
     80004e88:	0327b823          	sd	s2,48(a5)
+  proc_freepagetable(oldpagetable, oldsz);
     80004e8c:	85e6                	mv	a1,s9
     80004e8e:	fa5fc0ef          	jal	80001e32 <proc_freepagetable>
+  return argc; // this ends up in a0, the first argument to main(argc, argv)
     80004e92:	0004851b          	sext.w	a0,s1
     80004e96:	79be                	ld	s3,488(sp)
     80004e98:	7a1e                	ld	s4,480(sp)
@@ -8482,15 +9605,20 @@ devintr()
     80004ec8:	e1243423          	sd	s2,-504(s0)
     80004ecc:	7dba                	ld	s11,424(sp)
     80004ece:	a031                	j	80004eda <exec+0x336>
+  ip = 0;
     80004ed0:	4a01                	li	s4,0
     80004ed2:	a021                	j	80004eda <exec+0x336>
     80004ed4:	4a01                	li	s4,0
+  if(pagetable)
     80004ed6:	a011                	j	80004eda <exec+0x336>
     80004ed8:	7dba                	ld	s11,424(sp)
+    proc_freepagetable(pagetable, sz);
     80004eda:	e0843583          	ld	a1,-504(s0)
     80004ede:	855a                	mv	a0,s6
     80004ee0:	f53fc0ef          	jal	80001e32 <proc_freepagetable>
+  return -1;
     80004ee4:	557d                	li	a0,-1
+  if(ip){
     80004ee6:	000a1b63          	bnez	s4,80004efc <exec+0x358>
     80004eea:	79be                	ld	s3,488(sp)
     80004eec:	7a1e                	ld	s4,480(sp)
@@ -8511,6 +9639,7 @@ devintr()
     80004f0a:	b9ed                	j	80004c04 <exec+0x60>
     80004f0c:	6b5e                	ld	s6,464(sp)
     80004f0e:	b9dd                	j	80004c04 <exec+0x60>
+  sz = sz1;
     80004f10:	e0843983          	ld	s3,-504(s0)
     80004f14:	b595                	j	80004d78 <exec+0x1d4>
 
@@ -9612,47 +10741,79 @@ devintr()
 	...
 
 0000000080005ace <plicinit>:
+// the riscv Platform Level Interrupt Controller (PLIC).
+//
+
+void
+plicinit(void)
+{
     80005ace:	1141                	addi	sp,sp,-16
     80005ad0:	e422                	sd	s0,8(sp)
     80005ad2:	0800                	addi	s0,sp,16
+  // set desired IRQ priorities non-zero (otherwise disabled).
+  *(uint32*)(PLIC + UART0_IRQ*4) = 1;
     80005ad4:	0c0007b7          	lui	a5,0xc000
     80005ad8:	4705                	li	a4,1
     80005ada:	d798                	sw	a4,40(a5)
+  *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1;
     80005adc:	0c0007b7          	lui	a5,0xc000
     80005ae0:	c3d8                	sw	a4,4(a5)
+}
     80005ae2:	6422                	ld	s0,8(sp)
     80005ae4:	0141                	addi	sp,sp,16
     80005ae6:	8082                	ret
 
 0000000080005ae8 <plicinithart>:
+
+void
+plicinithart(void)
+{
     80005ae8:	1141                	addi	sp,sp,-16
     80005aea:	e406                	sd	ra,8(sp)
     80005aec:	e022                	sd	s0,0(sp)
     80005aee:	0800                	addi	s0,sp,16
+  int hart = cpuid();
     80005af0:	9a0fc0ef          	jal	80001c90 <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);
     80005af4:	0085171b          	slliw	a4,a0,0x8
     80005af8:	0c0027b7          	lui	a5,0xc002
     80005afc:	97ba                	add	a5,a5,a4
     80005afe:	40200713          	li	a4,1026
     80005b02:	08e7a023          	sw	a4,128(a5) # c002080 <_entry-0x73ffdf80>
+
+  // set this hart's S-mode priority threshold to 0.
+  *(uint32*)PLIC_SPRIORITY(hart) = 0;
     80005b06:	00d5151b          	slliw	a0,a0,0xd
     80005b0a:	0c2017b7          	lui	a5,0xc201
     80005b0e:	97aa                	add	a5,a5,a0
     80005b10:	0007a023          	sw	zero,0(a5) # c201000 <_entry-0x73dff000>
+}
     80005b14:	60a2                	ld	ra,8(sp)
     80005b16:	6402                	ld	s0,0(sp)
     80005b18:	0141                	addi	sp,sp,16
     80005b1a:	8082                	ret
 
 0000000080005b1c <plic_claim>:
+
+// ask the PLIC what interrupt we should serve.
+int
+plic_claim(void)
+{
     80005b1c:	1141                	addi	sp,sp,-16
     80005b1e:	e406                	sd	ra,8(sp)
     80005b20:	e022                	sd	s0,0(sp)
     80005b22:	0800                	addi	s0,sp,16
+  int hart = cpuid();
     80005b24:	96cfc0ef          	jal	80001c90 <cpuid>
+  int irq = *(uint32*)PLIC_SCLAIM(hart);
     80005b28:	00d5151b          	slliw	a0,a0,0xd
     80005b2c:	0c2017b7          	lui	a5,0xc201
     80005b30:	97aa                	add	a5,a5,a0
+  return irq;
+}
     80005b32:	43c8                	lw	a0,4(a5)
     80005b34:	60a2                	ld	ra,8(sp)
     80005b36:	6402                	ld	s0,0(sp)
@@ -9660,17 +10821,25 @@ devintr()
     80005b3a:	8082                	ret
 
 0000000080005b3c <plic_complete>:
+
+// tell the PLIC we've served this IRQ.
+void
+plic_complete(int irq)
+{
     80005b3c:	1101                	addi	sp,sp,-32
     80005b3e:	ec06                	sd	ra,24(sp)
     80005b40:	e822                	sd	s0,16(sp)
     80005b42:	e426                	sd	s1,8(sp)
     80005b44:	1000                	addi	s0,sp,32
     80005b46:	84aa                	mv	s1,a0
+  int hart = cpuid();
     80005b48:	948fc0ef          	jal	80001c90 <cpuid>
+  *(uint32*)PLIC_SCLAIM(hart) = irq;
     80005b4c:	00d5151b          	slliw	a0,a0,0xd
     80005b50:	0c2017b7          	lui	a5,0xc201
     80005b54:	97aa                	add	a5,a5,a0
     80005b56:	c3c4                	sw	s1,4(a5)
+}
     80005b58:	60e2                	ld	ra,24(sp)
     80005b5a:	6442                	ld	s0,16(sp)
     80005b5c:	64a2                	ld	s1,8(sp)
@@ -9678,227 +10847,168 @@ devintr()
     80005b60:	8082                	ret
 
 0000000080005b62 <free_desc>:
-}
-
-// mark a descriptor as free.
-static void
-free_desc(int i)
-{
     80005b62:	1141                	addi	sp,sp,-16
     80005b64:	e406                	sd	ra,8(sp)
     80005b66:	e022                	sd	s0,0(sp)
     80005b68:	0800                	addi	s0,sp,16
-  if(i >= NUM)
     80005b6a:	479d                	li	a5,7
     80005b6c:	04a7ca63          	blt	a5,a0,80005bc0 <free_desc+0x5e>
-    panic("free_desc 1");
-  if(disk.free[i])
     80005b70:	00048797          	auipc	a5,0x48
     80005b74:	d8878793          	addi	a5,a5,-632 # 8004d8f8 <disk>
     80005b78:	97aa                	add	a5,a5,a0
     80005b7a:	0187c783          	lbu	a5,24(a5)
     80005b7e:	e7b9                	bnez	a5,80005bcc <free_desc+0x6a>
-    panic("free_desc 2");
-  disk.desc[i].addr = 0;
     80005b80:	00451693          	slli	a3,a0,0x4
     80005b84:	00048797          	auipc	a5,0x48
     80005b88:	d7478793          	addi	a5,a5,-652 # 8004d8f8 <disk>
     80005b8c:	6398                	ld	a4,0(a5)
     80005b8e:	9736                	add	a4,a4,a3
     80005b90:	00073023          	sd	zero,0(a4)
-  disk.desc[i].len = 0;
     80005b94:	6398                	ld	a4,0(a5)
     80005b96:	9736                	add	a4,a4,a3
     80005b98:	00072423          	sw	zero,8(a4)
-  disk.desc[i].flags = 0;
     80005b9c:	00071623          	sh	zero,12(a4)
-  disk.desc[i].next = 0;
     80005ba0:	00071723          	sh	zero,14(a4)
-  disk.free[i] = 1;
     80005ba4:	97aa                	add	a5,a5,a0
     80005ba6:	4705                	li	a4,1
     80005ba8:	00e78c23          	sb	a4,24(a5)
-  wakeup(&disk.free[0]);
     80005bac:	00048517          	auipc	a0,0x48
     80005bb0:	d6450513          	addi	a0,a0,-668 # 8004d910 <disk+0x18>
     80005bb4:	fa4fc0ef          	jal	80002358 <wakeup>
-}
     80005bb8:	60a2                	ld	ra,8(sp)
     80005bba:	6402                	ld	s0,0(sp)
     80005bbc:	0141                	addi	sp,sp,16
     80005bbe:	8082                	ret
-    panic("free_desc 1");
     80005bc0:	00003517          	auipc	a0,0x3
     80005bc4:	ff050513          	addi	a0,a0,-16 # 80008bb0 <etext+0xbb0>
     80005bc8:	bcdfa0ef          	jal	80000794 <panic>
-    panic("free_desc 2");
     80005bcc:	00003517          	auipc	a0,0x3
     80005bd0:	ff450513          	addi	a0,a0,-12 # 80008bc0 <etext+0xbc0>
     80005bd4:	bc1fa0ef          	jal	80000794 <panic>
 
 0000000080005bd8 <virtio_disk_init>:
-{
     80005bd8:	1101                	addi	sp,sp,-32
     80005bda:	ec06                	sd	ra,24(sp)
     80005bdc:	e822                	sd	s0,16(sp)
     80005bde:	e426                	sd	s1,8(sp)
     80005be0:	e04a                	sd	s2,0(sp)
     80005be2:	1000                	addi	s0,sp,32
-  initlock(&disk.vdisk_lock, "virtio_disk");
     80005be4:	00003597          	auipc	a1,0x3
     80005be8:	fec58593          	addi	a1,a1,-20 # 80008bd0 <etext+0xbd0>
     80005bec:	00048517          	auipc	a0,0x48
     80005bf0:	e3450513          	addi	a0,a0,-460 # 8004da20 <disk+0x128>
     80005bf4:	a16fb0ef          	jal	80000e0a <initlock>
-  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
     80005bf8:	100017b7          	lui	a5,0x10001
     80005bfc:	4398                	lw	a4,0(a5)
     80005bfe:	2701                	sext.w	a4,a4
     80005c00:	747277b7          	lui	a5,0x74727
     80005c04:	97678793          	addi	a5,a5,-1674 # 74726976 <_entry-0xb8d968a>
     80005c08:	18f71063          	bne	a4,a5,80005d88 <virtio_disk_init+0x1b0>
-     *R(VIRTIO_MMIO_VERSION) != 2 ||
     80005c0c:	100017b7          	lui	a5,0x10001
     80005c10:	0791                	addi	a5,a5,4 # 10001004 <_entry-0x6fffeffc>
     80005c12:	439c                	lw	a5,0(a5)
     80005c14:	2781                	sext.w	a5,a5
-  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
     80005c16:	4709                	li	a4,2
     80005c18:	16e79863          	bne	a5,a4,80005d88 <virtio_disk_init+0x1b0>
-     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
     80005c1c:	100017b7          	lui	a5,0x10001
     80005c20:	07a1                	addi	a5,a5,8 # 10001008 <_entry-0x6fffeff8>
     80005c22:	439c                	lw	a5,0(a5)
     80005c24:	2781                	sext.w	a5,a5
-     *R(VIRTIO_MMIO_VERSION) != 2 ||
     80005c26:	16e79163          	bne	a5,a4,80005d88 <virtio_disk_init+0x1b0>
-     *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){
     80005c2a:	100017b7          	lui	a5,0x10001
     80005c2e:	47d8                	lw	a4,12(a5)
     80005c30:	2701                	sext.w	a4,a4
-     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
     80005c32:	554d47b7          	lui	a5,0x554d4
     80005c36:	55178793          	addi	a5,a5,1361 # 554d4551 <_entry-0x2ab2baaf>
     80005c3a:	14f71763          	bne	a4,a5,80005d88 <virtio_disk_init+0x1b0>
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005c3e:	100017b7          	lui	a5,0x10001
     80005c42:	0607a823          	sw	zero,112(a5) # 10001070 <_entry-0x6fffef90>
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005c46:	4705                	li	a4,1
     80005c48:	dbb8                	sw	a4,112(a5)
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005c4a:	470d                	li	a4,3
     80005c4c:	dbb8                	sw	a4,112(a5)
-  uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES);
     80005c4e:	10001737          	lui	a4,0x10001
     80005c52:	4b14                	lw	a3,16(a4)
-  features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC);
     80005c54:	c7ffe737          	lui	a4,0xc7ffe
     80005c58:	75f70713          	addi	a4,a4,1887 # ffffffffc7ffe75f <end+0xffffffff47fb0d27>
-  *R(VIRTIO_MMIO_DRIVER_FEATURES) = features;
     80005c5c:	8ef9                	and	a3,a3,a4
     80005c5e:	10001737          	lui	a4,0x10001
     80005c62:	d314                	sw	a3,32(a4)
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005c64:	472d                	li	a4,11
     80005c66:	dbb8                	sw	a4,112(a5)
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005c68:	07078793          	addi	a5,a5,112
-  status = *R(VIRTIO_MMIO_STATUS);
     80005c6c:	439c                	lw	a5,0(a5)
     80005c6e:	0007891b          	sext.w	s2,a5
-  if(!(status & VIRTIO_CONFIG_S_FEATURES_OK))
     80005c72:	8ba1                	andi	a5,a5,8
     80005c74:	12078063          	beqz	a5,80005d94 <virtio_disk_init+0x1bc>
-  *R(VIRTIO_MMIO_QUEUE_SEL) = 0;
     80005c78:	100017b7          	lui	a5,0x10001
     80005c7c:	0207a823          	sw	zero,48(a5) # 10001030 <_entry-0x6fffefd0>
-  if(*R(VIRTIO_MMIO_QUEUE_READY))
     80005c80:	100017b7          	lui	a5,0x10001
     80005c84:	04478793          	addi	a5,a5,68 # 10001044 <_entry-0x6fffefbc>
     80005c88:	439c                	lw	a5,0(a5)
     80005c8a:	2781                	sext.w	a5,a5
     80005c8c:	10079a63          	bnez	a5,80005da0 <virtio_disk_init+0x1c8>
-  uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX);
     80005c90:	100017b7          	lui	a5,0x10001
     80005c94:	03478793          	addi	a5,a5,52 # 10001034 <_entry-0x6fffefcc>
     80005c98:	439c                	lw	a5,0(a5)
     80005c9a:	2781                	sext.w	a5,a5
-  if(max == 0)
     80005c9c:	10078863          	beqz	a5,80005dac <virtio_disk_init+0x1d4>
-  if(max < NUM)
     80005ca0:	471d                	li	a4,7
     80005ca2:	10f77b63          	bgeu	a4,a5,80005db8 <virtio_disk_init+0x1e0>
-  disk.desc = kalloc();
     80005ca6:	fa5fa0ef          	jal	80000c4a <kalloc>
     80005caa:	00048497          	auipc	s1,0x48
     80005cae:	c4e48493          	addi	s1,s1,-946 # 8004d8f8 <disk>
     80005cb2:	e088                	sd	a0,0(s1)
-  disk.avail = kalloc();
     80005cb4:	f97fa0ef          	jal	80000c4a <kalloc>
     80005cb8:	e488                	sd	a0,8(s1)
-  disk.used = kalloc();
     80005cba:	f91fa0ef          	jal	80000c4a <kalloc>
     80005cbe:	87aa                	mv	a5,a0
     80005cc0:	e888                	sd	a0,16(s1)
-  if(!disk.desc || !disk.avail || !disk.used)
     80005cc2:	6088                	ld	a0,0(s1)
     80005cc4:	10050063          	beqz	a0,80005dc4 <virtio_disk_init+0x1ec>
     80005cc8:	00048717          	auipc	a4,0x48
     80005ccc:	c3873703          	ld	a4,-968(a4) # 8004d900 <disk+0x8>
     80005cd0:	0e070a63          	beqz	a4,80005dc4 <virtio_disk_init+0x1ec>
     80005cd4:	0e078863          	beqz	a5,80005dc4 <virtio_disk_init+0x1ec>
-  memset(disk.desc, 0, PGSIZE);
     80005cd8:	6605                	lui	a2,0x1
     80005cda:	4581                	li	a1,0
     80005cdc:	a82fb0ef          	jal	80000f5e <memset>
-  memset(disk.avail, 0, PGSIZE);
     80005ce0:	00048497          	auipc	s1,0x48
     80005ce4:	c1848493          	addi	s1,s1,-1000 # 8004d8f8 <disk>
     80005ce8:	6605                	lui	a2,0x1
     80005cea:	4581                	li	a1,0
     80005cec:	6488                	ld	a0,8(s1)
     80005cee:	a70fb0ef          	jal	80000f5e <memset>
-  memset(disk.used, 0, PGSIZE);
     80005cf2:	6605                	lui	a2,0x1
     80005cf4:	4581                	li	a1,0
     80005cf6:	6888                	ld	a0,16(s1)
     80005cf8:	a66fb0ef          	jal	80000f5e <memset>
-  *R(VIRTIO_MMIO_QUEUE_NUM) = NUM;
     80005cfc:	100017b7          	lui	a5,0x10001
     80005d00:	4721                	li	a4,8
     80005d02:	df98                	sw	a4,56(a5)
-  *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc;
     80005d04:	4098                	lw	a4,0(s1)
     80005d06:	100017b7          	lui	a5,0x10001
     80005d0a:	08e7a023          	sw	a4,128(a5) # 10001080 <_entry-0x6fffef80>
-  *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32;
     80005d0e:	40d8                	lw	a4,4(s1)
     80005d10:	100017b7          	lui	a5,0x10001
     80005d14:	08e7a223          	sw	a4,132(a5) # 10001084 <_entry-0x6fffef7c>
-  *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail;
     80005d18:	649c                	ld	a5,8(s1)
     80005d1a:	0007869b          	sext.w	a3,a5
     80005d1e:	10001737          	lui	a4,0x10001
     80005d22:	08d72823          	sw	a3,144(a4) # 10001090 <_entry-0x6fffef70>
-  *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32;
     80005d26:	9781                	srai	a5,a5,0x20
     80005d28:	10001737          	lui	a4,0x10001
     80005d2c:	08f72a23          	sw	a5,148(a4) # 10001094 <_entry-0x6fffef6c>
-  *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used;
     80005d30:	689c                	ld	a5,16(s1)
     80005d32:	0007869b          	sext.w	a3,a5
     80005d36:	10001737          	lui	a4,0x10001
     80005d3a:	0ad72023          	sw	a3,160(a4) # 100010a0 <_entry-0x6fffef60>
-  *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32;
     80005d3e:	9781                	srai	a5,a5,0x20
     80005d40:	10001737          	lui	a4,0x10001
     80005d44:	0af72223          	sw	a5,164(a4) # 100010a4 <_entry-0x6fffef5c>
-  *R(VIRTIO_MMIO_QUEUE_READY) = 0x1;
     80005d48:	10001737          	lui	a4,0x10001
     80005d4c:	4785                	li	a5,1
     80005d4e:	c37c                	sw	a5,68(a4)
-    disk.free[i] = 1;
     80005d50:	00f48c23          	sb	a5,24(s1)
     80005d54:	00f48ca3          	sb	a5,25(s1)
     80005d58:	00f48d23          	sb	a5,26(s1)
@@ -9907,50 +11017,35 @@ free_desc(int i)
     80005d64:	00f48ea3          	sb	a5,29(s1)
     80005d68:	00f48f23          	sb	a5,30(s1)
     80005d6c:	00f48fa3          	sb	a5,31(s1)
-  status |= VIRTIO_CONFIG_S_DRIVER_OK;
     80005d70:	00496913          	ori	s2,s2,4
-  *R(VIRTIO_MMIO_STATUS) = status;
     80005d74:	100017b7          	lui	a5,0x10001
     80005d78:	0727a823          	sw	s2,112(a5) # 10001070 <_entry-0x6fffef90>
-}
     80005d7c:	60e2                	ld	ra,24(sp)
     80005d7e:	6442                	ld	s0,16(sp)
     80005d80:	64a2                	ld	s1,8(sp)
     80005d82:	6902                	ld	s2,0(sp)
     80005d84:	6105                	addi	sp,sp,32
     80005d86:	8082                	ret
-    panic("could not find virtio disk");
     80005d88:	00003517          	auipc	a0,0x3
     80005d8c:	e5850513          	addi	a0,a0,-424 # 80008be0 <etext+0xbe0>
     80005d90:	a05fa0ef          	jal	80000794 <panic>
-    panic("virtio disk FEATURES_OK unset");
     80005d94:	00003517          	auipc	a0,0x3
     80005d98:	e6c50513          	addi	a0,a0,-404 # 80008c00 <etext+0xc00>
     80005d9c:	9f9fa0ef          	jal	80000794 <panic>
-    panic("virtio disk should not be ready");
     80005da0:	00003517          	auipc	a0,0x3
     80005da4:	e8050513          	addi	a0,a0,-384 # 80008c20 <etext+0xc20>
     80005da8:	9edfa0ef          	jal	80000794 <panic>
-    panic("virtio disk has no queue 0");
     80005dac:	00003517          	auipc	a0,0x3
     80005db0:	e9450513          	addi	a0,a0,-364 # 80008c40 <etext+0xc40>
     80005db4:	9e1fa0ef          	jal	80000794 <panic>
-    panic("virtio disk max queue too short");
     80005db8:	00003517          	auipc	a0,0x3
     80005dbc:	ea850513          	addi	a0,a0,-344 # 80008c60 <etext+0xc60>
     80005dc0:	9d5fa0ef          	jal	80000794 <panic>
-    panic("virtio disk kalloc");
     80005dc4:	00003517          	auipc	a0,0x3
     80005dc8:	ebc50513          	addi	a0,a0,-324 # 80008c80 <etext+0xc80>
     80005dcc:	9c9fa0ef          	jal	80000794 <panic>
 
 0000000080005dd0 <virtio_disk_rw>:
-  return 0;
-}
-
-void
-virtio_disk_rw(struct buf *b, int write)
-{
     80005dd0:	7159                	addi	sp,sp,-112
     80005dd2:	f486                	sd	ra,104(sp)
     80005dd4:	f0a2                	sd	s0,96(sp)
@@ -9966,91 +11061,55 @@ virtio_disk_rw(struct buf *b, int write)
     80005de8:	1880                	addi	s0,sp,112
     80005dea:	8a2a                	mv	s4,a0
     80005dec:	8bae                	mv	s7,a1
-  uint64 sector = b->blockno * (BSIZE / 512);
     80005dee:	00c52c83          	lw	s9,12(a0)
     80005df2:	001c9c9b          	slliw	s9,s9,0x1
     80005df6:	1c82                	slli	s9,s9,0x20
     80005df8:	020cdc93          	srli	s9,s9,0x20
-
-  acquire(&disk.vdisk_lock);
     80005dfc:	00048517          	auipc	a0,0x48
     80005e00:	c2450513          	addi	a0,a0,-988 # 8004da20 <disk+0x128>
     80005e04:	886fb0ef          	jal	80000e8a <acquire>
-  for(int i = 0; i < 3; i++){
     80005e08:	4981                	li	s3,0
-  for(int i = 0; i < NUM; i++){
     80005e0a:	44a1                	li	s1,8
-      disk.free[i] = 0;
     80005e0c:	00048b17          	auipc	s6,0x48
     80005e10:	aecb0b13          	addi	s6,s6,-1300 # 8004d8f8 <disk>
-  for(int i = 0; i < 3; i++){
     80005e14:	4a8d                	li	s5,3
-  int idx[3];
-  while(1){
-    if(alloc3_desc(idx) == 0) {
-      break;
-    }
-    sleep(&disk.free[0], &disk.vdisk_lock);
     80005e16:	00048c17          	auipc	s8,0x48
     80005e1a:	c0ac0c13          	addi	s8,s8,-1014 # 8004da20 <disk+0x128>
     80005e1e:	a8b9                	j	80005e7c <virtio_disk_rw+0xac>
-      disk.free[i] = 0;
     80005e20:	00fb0733          	add	a4,s6,a5
     80005e24:	00070c23          	sb	zero,24(a4) # 10001018 <_entry-0x6fffefe8>
-    idx[i] = alloc_desc();
     80005e28:	c19c                	sw	a5,0(a1)
-    if(idx[i] < 0){
     80005e2a:	0207c563          	bltz	a5,80005e54 <virtio_disk_rw+0x84>
-  for(int i = 0; i < 3; i++){
     80005e2e:	2905                	addiw	s2,s2,1
     80005e30:	0611                	addi	a2,a2,4 # 1004 <_entry-0x7fffeffc>
     80005e32:	05590963          	beq	s2,s5,80005e84 <virtio_disk_rw+0xb4>
-    idx[i] = alloc_desc();
     80005e36:	85b2                	mv	a1,a2
-  for(int i = 0; i < NUM; i++){
     80005e38:	00048717          	auipc	a4,0x48
     80005e3c:	ac070713          	addi	a4,a4,-1344 # 8004d8f8 <disk>
     80005e40:	87ce                	mv	a5,s3
-    if(disk.free[i]){
     80005e42:	01874683          	lbu	a3,24(a4)
     80005e46:	fee9                	bnez	a3,80005e20 <virtio_disk_rw+0x50>
-  for(int i = 0; i < NUM; i++){
     80005e48:	2785                	addiw	a5,a5,1
     80005e4a:	0705                	addi	a4,a4,1
     80005e4c:	fe979be3          	bne	a5,s1,80005e42 <virtio_disk_rw+0x72>
-    idx[i] = alloc_desc();
     80005e50:	57fd                	li	a5,-1
     80005e52:	c19c                	sw	a5,0(a1)
-      for(int j = 0; j < i; j++)
     80005e54:	01205d63          	blez	s2,80005e6e <virtio_disk_rw+0x9e>
-        free_desc(idx[j]);
     80005e58:	f9042503          	lw	a0,-112(s0)
     80005e5c:	d07ff0ef          	jal	80005b62 <free_desc>
-      for(int j = 0; j < i; j++)
     80005e60:	4785                	li	a5,1
     80005e62:	0127d663          	bge	a5,s2,80005e6e <virtio_disk_rw+0x9e>
-        free_desc(idx[j]);
     80005e66:	f9442503          	lw	a0,-108(s0)
     80005e6a:	cf9ff0ef          	jal	80005b62 <free_desc>
-    sleep(&disk.free[0], &disk.vdisk_lock);
     80005e6e:	85e2                	mv	a1,s8
     80005e70:	00048517          	auipc	a0,0x48
     80005e74:	aa050513          	addi	a0,a0,-1376 # 8004d910 <disk+0x18>
     80005e78:	c94fc0ef          	jal	8000230c <sleep>
-  for(int i = 0; i < 3; i++){
     80005e7c:	f9040613          	addi	a2,s0,-112
     80005e80:	894e                	mv	s2,s3
     80005e82:	bf55                	j	80005e36 <virtio_disk_rw+0x66>
-  }
-
-  // format the three descriptors.
-  // qemu's virtio-blk.c reads them.
-
-  struct virtio_blk_req *buf0 = &disk.ops[idx[0]];
     80005e84:	f9042503          	lw	a0,-112(s0)
     80005e88:	00451693          	slli	a3,a0,0x4
-
-  if(write)
     80005e8c:	00048797          	auipc	a5,0x48
     80005e90:	a6c78793          	addi	a5,a5,-1428 # 8004d8f8 <disk>
     80005e94:	00a50713          	addi	a4,a0,10
@@ -10058,130 +11117,77 @@ virtio_disk_rw(struct buf *b, int write)
     80005e9a:	973e                	add	a4,a4,a5
     80005e9c:	01703633          	snez	a2,s7
     80005ea0:	c710                	sw	a2,8(a4)
-    buf0->type = VIRTIO_BLK_T_OUT; // write the disk
-  else
-    buf0->type = VIRTIO_BLK_T_IN; // read the disk
-  buf0->reserved = 0;
     80005ea2:	00072623          	sw	zero,12(a4)
-  buf0->sector = sector;
     80005ea6:	01973823          	sd	s9,16(a4)
-
-  disk.desc[idx[0]].addr = (uint64) buf0;
     80005eaa:	6398                	ld	a4,0(a5)
     80005eac:	9736                	add	a4,a4,a3
-  struct virtio_blk_req *buf0 = &disk.ops[idx[0]];
     80005eae:	0a868613          	addi	a2,a3,168
     80005eb2:	963e                	add	a2,a2,a5
-  disk.desc[idx[0]].addr = (uint64) buf0;
     80005eb4:	e310                	sd	a2,0(a4)
-  disk.desc[idx[0]].len = sizeof(struct virtio_blk_req);
     80005eb6:	6390                	ld	a2,0(a5)
     80005eb8:	00d605b3          	add	a1,a2,a3
     80005ebc:	4741                	li	a4,16
     80005ebe:	c598                	sw	a4,8(a1)
-  disk.desc[idx[0]].flags = VRING_DESC_F_NEXT;
     80005ec0:	4805                	li	a6,1
     80005ec2:	01059623          	sh	a6,12(a1)
-  disk.desc[idx[0]].next = idx[1];
     80005ec6:	f9442703          	lw	a4,-108(s0)
     80005eca:	00e59723          	sh	a4,14(a1)
-
-  disk.desc[idx[1]].addr = (uint64) b->data;
     80005ece:	0712                	slli	a4,a4,0x4
     80005ed0:	963a                	add	a2,a2,a4
     80005ed2:	058a0593          	addi	a1,s4,88
     80005ed6:	e20c                	sd	a1,0(a2)
-  disk.desc[idx[1]].len = BSIZE;
     80005ed8:	0007b883          	ld	a7,0(a5)
     80005edc:	9746                	add	a4,a4,a7
     80005ede:	40000613          	li	a2,1024
     80005ee2:	c710                	sw	a2,8(a4)
-  if(write)
     80005ee4:	001bb613          	seqz	a2,s7
     80005ee8:	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;
     80005eec:	00166613          	ori	a2,a2,1
     80005ef0:	00c71623          	sh	a2,12(a4)
-  disk.desc[idx[1]].next = idx[2];
     80005ef4:	f9842583          	lw	a1,-104(s0)
     80005ef8:	00b71723          	sh	a1,14(a4)
-
-  disk.info[idx[0]].status = 0xff; // device writes 0 on success
     80005efc:	00250613          	addi	a2,a0,2
     80005f00:	0612                	slli	a2,a2,0x4
     80005f02:	963e                	add	a2,a2,a5
     80005f04:	577d                	li	a4,-1
     80005f06:	00e60823          	sb	a4,16(a2)
-  disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status;
     80005f0a:	0592                	slli	a1,a1,0x4
     80005f0c:	98ae                	add	a7,a7,a1
     80005f0e:	03068713          	addi	a4,a3,48
     80005f12:	973e                	add	a4,a4,a5
     80005f14:	00e8b023          	sd	a4,0(a7)
-  disk.desc[idx[2]].len = 1;
     80005f18:	6398                	ld	a4,0(a5)
     80005f1a:	972e                	add	a4,a4,a1
     80005f1c:	01072423          	sw	a6,8(a4)
-  disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status
     80005f20:	4689                	li	a3,2
     80005f22:	00d71623          	sh	a3,12(a4)
-  disk.desc[idx[2]].next = 0;
     80005f26:	00071723          	sh	zero,14(a4)
-
-  // record struct buf for virtio_disk_intr().
-  b->disk = 1;
     80005f2a:	010a2223          	sw	a6,4(s4)
-  disk.info[idx[0]].b = b;
     80005f2e:	01463423          	sd	s4,8(a2)
-
-  // tell the device the first index in our chain of descriptors.
-  disk.avail->ring[disk.avail->idx % NUM] = idx[0];
     80005f32:	6794                	ld	a3,8(a5)
     80005f34:	0026d703          	lhu	a4,2(a3)
     80005f38:	8b1d                	andi	a4,a4,7
     80005f3a:	0706                	slli	a4,a4,0x1
     80005f3c:	96ba                	add	a3,a3,a4
     80005f3e:	00a69223          	sh	a0,4(a3)
-
-  __sync_synchronize();
     80005f42:	0330000f          	fence	rw,rw
-
-  // tell the device another avail ring entry is available.
-  disk.avail->idx += 1; // not % NUM ...
     80005f46:	6798                	ld	a4,8(a5)
     80005f48:	00275783          	lhu	a5,2(a4)
     80005f4c:	2785                	addiw	a5,a5,1
     80005f4e:	00f71123          	sh	a5,2(a4)
-
-  __sync_synchronize();
     80005f52:	0330000f          	fence	rw,rw
-
-  *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number
     80005f56:	100017b7          	lui	a5,0x10001
     80005f5a:	0407a823          	sw	zero,80(a5) # 10001050 <_entry-0x6fffefb0>
-
-  // Wait for virtio_disk_intr() to say request has finished.
-  while(b->disk == 1) {
     80005f5e:	004a2783          	lw	a5,4(s4)
-    sleep(b, &disk.vdisk_lock);
     80005f62:	00048917          	auipc	s2,0x48
     80005f66:	abe90913          	addi	s2,s2,-1346 # 8004da20 <disk+0x128>
-  while(b->disk == 1) {
     80005f6a:	4485                	li	s1,1
     80005f6c:	01079a63          	bne	a5,a6,80005f80 <virtio_disk_rw+0x1b0>
-    sleep(b, &disk.vdisk_lock);
     80005f70:	85ca                	mv	a1,s2
     80005f72:	8552                	mv	a0,s4
     80005f74:	b98fc0ef          	jal	8000230c <sleep>
-  while(b->disk == 1) {
     80005f78:	004a2783          	lw	a5,4(s4)
     80005f7c:	fe978ae3          	beq	a5,s1,80005f70 <virtio_disk_rw+0x1a0>
-  }
-
-  disk.info[idx[0]].b = 0;
     80005f80:	f9042903          	lw	s2,-112(s0)
     80005f84:	00290713          	addi	a4,s2,2
     80005f88:	0712                	slli	a4,a4,0x4
@@ -10189,28 +11195,20 @@ virtio_disk_rw(struct buf *b, int write)
     80005f8e:	96e78793          	addi	a5,a5,-1682 # 8004d8f8 <disk>
     80005f92:	97ba                	add	a5,a5,a4
     80005f94:	0007b423          	sd	zero,8(a5)
-    int flag = disk.desc[i].flags;
     80005f98:	00048997          	auipc	s3,0x48
     80005f9c:	96098993          	addi	s3,s3,-1696 # 8004d8f8 <disk>
     80005fa0:	00491713          	slli	a4,s2,0x4
     80005fa4:	0009b783          	ld	a5,0(s3)
     80005fa8:	97ba                	add	a5,a5,a4
     80005faa:	00c7d483          	lhu	s1,12(a5)
-    int nxt = disk.desc[i].next;
     80005fae:	854a                	mv	a0,s2
     80005fb0:	00e7d903          	lhu	s2,14(a5)
-    free_desc(i);
     80005fb4:	bafff0ef          	jal	80005b62 <free_desc>
-    if(flag & VRING_DESC_F_NEXT)
     80005fb8:	8885                	andi	s1,s1,1
     80005fba:	f0fd                	bnez	s1,80005fa0 <virtio_disk_rw+0x1d0>
-  free_chain(idx[0]);
-
-  release(&disk.vdisk_lock);
     80005fbc:	00048517          	auipc	a0,0x48
     80005fc0:	a6450513          	addi	a0,a0,-1436 # 8004da20 <disk+0x128>
     80005fc4:	f5ffa0ef          	jal	80000f22 <release>
-}
     80005fc8:	70a6                	ld	ra,104(sp)
     80005fca:	7406                	ld	s0,96(sp)
     80005fcc:	64e6                	ld	s1,88(sp)
@@ -10226,95 +11224,60 @@ virtio_disk_rw(struct buf *b, int write)
     80005fe0:	8082                	ret
 
 0000000080005fe2 <virtio_disk_intr>:
-
-void
-virtio_disk_intr()
-{
     80005fe2:	1101                	addi	sp,sp,-32
     80005fe4:	ec06                	sd	ra,24(sp)
     80005fe6:	e822                	sd	s0,16(sp)
     80005fe8:	e426                	sd	s1,8(sp)
     80005fea:	1000                	addi	s0,sp,32
-  acquire(&disk.vdisk_lock);
     80005fec:	00048497          	auipc	s1,0x48
     80005ff0:	90c48493          	addi	s1,s1,-1780 # 8004d8f8 <disk>
     80005ff4:	00048517          	auipc	a0,0x48
     80005ff8:	a2c50513          	addi	a0,a0,-1492 # 8004da20 <disk+0x128>
     80005ffc:	e8ffa0ef          	jal	80000e8a <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;
     80006000:	100017b7          	lui	a5,0x10001
     80006004:	53b8                	lw	a4,96(a5)
     80006006:	8b0d                	andi	a4,a4,3
     80006008:	100017b7          	lui	a5,0x10001
     8000600c:	d3f8                	sw	a4,100(a5)
-
-  __sync_synchronize();
     8000600e:	0330000f          	fence	rw,rw
-
-  // the device increments disk.used->idx when it
-  // adds an entry to the used ring.
-
-  while(disk.used_idx != disk.used->idx){
     80006012:	689c                	ld	a5,16(s1)
     80006014:	0204d703          	lhu	a4,32(s1)
     80006018:	0027d783          	lhu	a5,2(a5) # 10001002 <_entry-0x6fffeffe>
     8000601c:	04f70663          	beq	a4,a5,80006068 <virtio_disk_intr+0x86>
-    __sync_synchronize();
     80006020:	0330000f          	fence	rw,rw
-    int id = disk.used->ring[disk.used_idx % NUM].id;
     80006024:	6898                	ld	a4,16(s1)
     80006026:	0204d783          	lhu	a5,32(s1)
     8000602a:	8b9d                	andi	a5,a5,7
     8000602c:	078e                	slli	a5,a5,0x3
     8000602e:	97ba                	add	a5,a5,a4
     80006030:	43dc                	lw	a5,4(a5)
-
-    if(disk.info[id].status != 0)
     80006032:	00278713          	addi	a4,a5,2
     80006036:	0712                	slli	a4,a4,0x4
     80006038:	9726                	add	a4,a4,s1
     8000603a:	01074703          	lbu	a4,16(a4)
     8000603e:	e321                	bnez	a4,8000607e <virtio_disk_intr+0x9c>
-      panic("virtio_disk_intr status");
-
-    struct buf *b = disk.info[id].b;
     80006040:	0789                	addi	a5,a5,2
     80006042:	0792                	slli	a5,a5,0x4
     80006044:	97a6                	add	a5,a5,s1
     80006046:	6788                	ld	a0,8(a5)
-    b->disk = 0;   // disk is done with buf
     80006048:	00052223          	sw	zero,4(a0)
-    wakeup(b);
     8000604c:	b0cfc0ef          	jal	80002358 <wakeup>
-
-    disk.used_idx += 1;
     80006050:	0204d783          	lhu	a5,32(s1)
     80006054:	2785                	addiw	a5,a5,1
     80006056:	17c2                	slli	a5,a5,0x30
     80006058:	93c1                	srli	a5,a5,0x30
     8000605a:	02f49023          	sh	a5,32(s1)
-  while(disk.used_idx != disk.used->idx){
     8000605e:	6898                	ld	a4,16(s1)
     80006060:	00275703          	lhu	a4,2(a4)
     80006064:	faf71ee3          	bne	a4,a5,80006020 <virtio_disk_intr+0x3e>
-  }
-
-  release(&disk.vdisk_lock);
     80006068:	00048517          	auipc	a0,0x48
     8000606c:	9b850513          	addi	a0,a0,-1608 # 8004da20 <disk+0x128>
     80006070:	eb3fa0ef          	jal	80000f22 <release>
-}
     80006074:	60e2                	ld	ra,24(sp)
     80006076:	6442                	ld	s0,16(sp)
     80006078:	64a2                	ld	s1,8(sp)
     8000607a:	6105                	addi	sp,sp,32
     8000607c:	8082                	ret
-      panic("virtio_disk_intr status");
     8000607e:	00003517          	auipc	a0,0x3
     80006082:	c1a50513          	addi	a0,a0,-998 # 80008c98 <etext+0xc98>
     80006086:	f0efa0ef          	jal	80000794 <panic>
diff --git a/kernel/log.o b/kernel/log.o
index 907a953e3787b02ff5607944ef8c9ae5ebd59441..35a4593832ca7aa6e9b68fca3d260fe666eb1102 100644
Binary files a/kernel/log.o and b/kernel/log.o differ
diff --git a/kernel/main.o b/kernel/main.o
index 1abf6ee65af36c6ed44eb28857476b05d1658f72..30273c63d199838a508c6b00611c025fa8c2cd1f 100644
Binary files a/kernel/main.o and b/kernel/main.o differ
diff --git a/kernel/pipe.o b/kernel/pipe.o
index 65a2b6ca39d0cee9396fb0aa0dc91dfaa0437537..94279ed34d8e4ab94a15205879ce05c53e0c6a32 100644
Binary files a/kernel/pipe.o and b/kernel/pipe.o differ
diff --git a/kernel/plic.o b/kernel/plic.o
index 7808614a5722d518056f8e81b42bfa05e4cdd1b9..b78a996968d9533d8835c2802eb3d174cdfd38cc 100644
Binary files a/kernel/plic.o and b/kernel/plic.o differ
diff --git a/kernel/printf.o b/kernel/printf.o
index 133965ee9e1f52c5033fab77a127a957dbc36283..0d7e12199e73537348c757dd7cb65c81fdbea9fc 100644
Binary files a/kernel/printf.o and b/kernel/printf.o differ
diff --git a/kernel/trap.o b/kernel/trap.o
index 711658691d077f727a6e6f87ae0791ddb1b2c30e..95667d4882b9e33226cc9c8bf54489220543721f 100644
Binary files a/kernel/trap.o and b/kernel/trap.o differ
diff --git a/mkfs/mkfs b/mkfs/mkfs
old mode 100644
new mode 100755
index 995c490ac9ef85d69c4555ed2bcab0a7c6477437..3a8fc77e7ca70b3d4f4967aa0f93908423b9519b
Binary files a/mkfs/mkfs and b/mkfs/mkfs differ
diff --git a/user/_cat b/user/_cat
old mode 100644
new mode 100755
index ae25f8578b70aa14263772c8bef7c690bceaf714..006551816ef8ef9dfbe1537a6505c5fa8b358e38
Binary files a/user/_cat and b/user/_cat differ
diff --git a/user/_cowtest b/user/_cowtest
old mode 100644
new mode 100755
index 9c51f82326e2ef20148bd5bc709ba489a34aa401..ce2ce4b877808cc6918af7a1def03e4601e7d26b
Binary files a/user/_cowtest and b/user/_cowtest differ
diff --git a/user/_doubletest b/user/_doubletest
old mode 100644
new mode 100755
index 1c3bbacff448198e30de73644dd93133e14c471f..c9c0b638b9406d7857e8e4916bf7352f875e53d7
Binary files a/user/_doubletest and b/user/_doubletest differ
diff --git a/user/_echo b/user/_echo
old mode 100644
new mode 100755
index 58356e699207b10d703eb05e18a5533a318b8ec4..84c58e2094f59feb3bdacbfe7811fe8f69858ec4
Binary files a/user/_echo and b/user/_echo differ
diff --git a/user/_find b/user/_find
old mode 100644
new mode 100755
index c3dc455fa5c69003a84ffd1336029353ac1733a5..c1dbb8f5f96f632bf62ae44bb3bb09a37a7771a1
Binary files a/user/_find and b/user/_find differ
diff --git a/user/_forktest b/user/_forktest
old mode 100644
new mode 100755
index e10977d903aff468a2105efc13af7b7e5571dbd0..8682c53e7d0a71828117cea2db4e4249e697ee66
Binary files a/user/_forktest and b/user/_forktest differ
diff --git a/user/_grep b/user/_grep
old mode 100644
new mode 100755
index 28e69eb3dd947c47188f95a62c0193d9fe588fef..61503477d6ed1716fb516c7059547b7a0705d94f
Binary files a/user/_grep and b/user/_grep differ
diff --git a/user/_grind b/user/_grind
old mode 100644
new mode 100755
index a6549f2543a6f460230682c9d6e8a553abc9d5b1..0fc9b646b639534dff48547eed5d48c1d213c2cd
Binary files a/user/_grind and b/user/_grind differ
diff --git a/user/_init b/user/_init
old mode 100644
new mode 100755
index 447361bcf808fdcddc17de943cc41582e6da3a84..79e48d9cba239a86fdbb775ead1f6eb487ddea23
Binary files a/user/_init and b/user/_init differ
diff --git a/user/_kill b/user/_kill
old mode 100644
new mode 100755
index bafdeba6ac45583623e80fec89a98b0a9b8a5942..1bb39c27a8e981635ab1b68ddd372f09e0486fc9
Binary files a/user/_kill and b/user/_kill differ
diff --git a/user/_ln b/user/_ln
old mode 100644
new mode 100755
index 5002dcbc22a38b3130f73f2b2e4f1dda3c8fb011..89cdc3956c9198d7c359f75f2e9f1ce9851d4ee4
Binary files a/user/_ln and b/user/_ln differ
diff --git a/user/_locktest b/user/_locktest
old mode 100644
new mode 100755
index 66ccf18fd559e9bcc7d7afe253801b47f9362942..51b31c3a0bf8c1eb7c862dd266693b2c0520fe52
Binary files a/user/_locktest and b/user/_locktest differ
diff --git a/user/_ls b/user/_ls
old mode 100644
new mode 100755
index c4fb32981bcf0289b0594c11d65240d583412ac9..121e10d95a93da6bf533ef8ac026fcb5c778e30d
Binary files a/user/_ls and b/user/_ls differ
diff --git a/user/_malloc_test b/user/_malloc_test
old mode 100644
new mode 100755
index 739c13a7dd4683018e1b0ca64046205d0e00d974..5299f25c20c65648e87d67ca8a60a8ca075af1fe
Binary files a/user/_malloc_test and b/user/_malloc_test differ
diff --git a/user/_mkdir b/user/_mkdir
old mode 100644
new mode 100755
index 7d7536cda8aae094d139f42ed9142012e6163109..a65412e1cd13410ad6ac53e0f180c0ecaddc4dac
Binary files a/user/_mkdir and b/user/_mkdir differ
diff --git a/user/_pgtbltest b/user/_pgtbltest
old mode 100644
new mode 100755
index 2ed4b3ab69119c877a9cfac6b7c1f36104957810..41d662255fca44780950642d9b9767ea2a66f7d7
Binary files a/user/_pgtbltest and b/user/_pgtbltest differ
diff --git a/user/_rm b/user/_rm
old mode 100644
new mode 100755
index 3386f0b4d0539bd1fb1ad5392f82915965b91cb4..b4cb43b80acefec053e56d1b0c02fa74e81ee951
Binary files a/user/_rm and b/user/_rm differ
diff --git a/user/_sh b/user/_sh
old mode 100644
new mode 100755
index e511329df61c6794e796343509504f46c1f1aab0..2459d68d4fabf0c4852cab8d141cb0a9b4fa269d
Binary files a/user/_sh and b/user/_sh differ
diff --git a/user/_sleep b/user/_sleep
old mode 100644
new mode 100755
index 66f4f54c675326232ba92de18c4cd028927342be..9f7804ec8cebaeb9c022e4d6d747ba92cd85e385
Binary files a/user/_sleep and b/user/_sleep differ
diff --git a/user/_stressfs b/user/_stressfs
old mode 100644
new mode 100755
index a4f93dff8367f821f01c69bec7b4083542b9bddc..8ab576177e8a33668aa4a612cb749b4968598c9e
Binary files a/user/_stressfs and b/user/_stressfs differ
diff --git a/user/_symlinktest b/user/_symlinktest
old mode 100644
new mode 100755
index ede3b3d59743de4698e236be637092b685b99e96..7a54435ba63d6d2297faffe6270180bf30cdf3d2
Binary files a/user/_symlinktest and b/user/_symlinktest differ
diff --git a/user/_usertests b/user/_usertests
old mode 100644
new mode 100755
index 4def163d2106278c91855870e106281127d4507d..58ea7886bbf49144bea0193253eebfadb45df968
Binary files a/user/_usertests and b/user/_usertests differ
diff --git a/user/_var_test b/user/_var_test
old mode 100644
new mode 100755
index 447da66af08e7e132153f24e478a8e6542cfd8ec..c33428df7cea7f46eb046b11bb812e617063662d
Binary files a/user/_var_test and b/user/_var_test differ
diff --git a/user/_wc b/user/_wc
old mode 100644
new mode 100755
index eeef601972193085f1f07c3b760d33f8b165d652..ce84a577aae2b74c6fc32e5b021844c1d149e3c2
Binary files a/user/_wc and b/user/_wc differ
diff --git a/user/_zombie b/user/_zombie
old mode 100644
new mode 100755
index ae845b80edf0fc7fa2f4dada627d149256a014ae..4a85456f69d97b8f7731acd35191430a52b4a5c0
Binary files a/user/_zombie and b/user/_zombie differ
diff --git a/user/cat.asm b/user/cat.asm
index 0d77192cd23c088342c459f754a47a82878d4d98..70e9bd484e5e1035b5c86925b210e13e71243367 100644
--- a/user/cat.asm
+++ b/user/cat.asm
@@ -568,245 +568,123 @@ memcpy(void *dst, const void *src, uint n)
  34a:	8082                	ret
 
 000000000000034c <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  34c:	4885                	li	a7,1
- ecall
  34e:	00000073          	ecall
- ret
  352:	8082                	ret
 
 0000000000000354 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  354:	4889                	li	a7,2
- ecall
  356:	00000073          	ecall
- ret
  35a:	8082                	ret
 
 000000000000035c <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  35c:	488d                	li	a7,3
- ecall
  35e:	00000073          	ecall
- ret
  362:	8082                	ret
 
 0000000000000364 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  364:	4891                	li	a7,4
- ecall
  366:	00000073          	ecall
- ret
  36a:	8082                	ret
 
 000000000000036c <read>:
-.global read
-read:
- li a7, SYS_read
  36c:	4895                	li	a7,5
- ecall
  36e:	00000073          	ecall
- ret
  372:	8082                	ret
 
 0000000000000374 <write>:
-.global write
-write:
- li a7, SYS_write
  374:	48c1                	li	a7,16
- ecall
  376:	00000073          	ecall
- ret
  37a:	8082                	ret
 
 000000000000037c <close>:
-.global close
-close:
- li a7, SYS_close
  37c:	48d5                	li	a7,21
- ecall
  37e:	00000073          	ecall
- ret
  382:	8082                	ret
 
 0000000000000384 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  384:	4899                	li	a7,6
- ecall
  386:	00000073          	ecall
- ret
  38a:	8082                	ret
 
 000000000000038c <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  38c:	489d                	li	a7,7
- ecall
  38e:	00000073          	ecall
- ret
  392:	8082                	ret
 
 0000000000000394 <open>:
-.global open
-open:
- li a7, SYS_open
  394:	48bd                	li	a7,15
- ecall
  396:	00000073          	ecall
- ret
  39a:	8082                	ret
 
 000000000000039c <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  39c:	48c5                	li	a7,17
- ecall
  39e:	00000073          	ecall
- ret
  3a2:	8082                	ret
 
 00000000000003a4 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  3a4:	48c9                	li	a7,18
- ecall
  3a6:	00000073          	ecall
- ret
  3aa:	8082                	ret
 
 00000000000003ac <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  3ac:	48a1                	li	a7,8
- ecall
  3ae:	00000073          	ecall
- ret
  3b2:	8082                	ret
 
 00000000000003b4 <link>:
-.global link
-link:
- li a7, SYS_link
  3b4:	48cd                	li	a7,19
- ecall
  3b6:	00000073          	ecall
- ret
  3ba:	8082                	ret
 
 00000000000003bc <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  3bc:	48d1                	li	a7,20
- ecall
  3be:	00000073          	ecall
- ret
  3c2:	8082                	ret
 
 00000000000003c4 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  3c4:	48a5                	li	a7,9
- ecall
  3c6:	00000073          	ecall
- ret
  3ca:	8082                	ret
 
 00000000000003cc <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  3cc:	48a9                	li	a7,10
- ecall
  3ce:	00000073          	ecall
- ret
  3d2:	8082                	ret
 
 00000000000003d4 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  3d4:	48ad                	li	a7,11
- ecall
  3d6:	00000073          	ecall
- ret
  3da:	8082                	ret
 
 00000000000003dc <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  3dc:	48b1                	li	a7,12
- ecall
  3de:	00000073          	ecall
- ret
  3e2:	8082                	ret
 
 00000000000003e4 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  3e4:	48b5                	li	a7,13
- ecall
  3e6:	00000073          	ecall
- ret
  3ea:	8082                	ret
 
 00000000000003ec <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  3ec:	48b9                	li	a7,14
- ecall
  3ee:	00000073          	ecall
- ret
  3f2:	8082                	ret
 
 00000000000003f4 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3f4:	48d9                	li	a7,22
- ecall
  3f6:	00000073          	ecall
- ret
  3fa:	8082                	ret
 
 00000000000003fc <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3fc:	48dd                	li	a7,23
- ecall
  3fe:	00000073          	ecall
- ret
  402:	8082                	ret
 
 0000000000000404 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  404:	48e1                	li	a7,24
- ecall
  406:	00000073          	ecall
- ret
  40a:	8082                	ret
 
 000000000000040c <putc>:
@@ -1349,184 +1227,113 @@ printf(const char *fmt, ...)
  7b4:	8082                	ret
 
 00000000000007b6 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  7b6:	1141                	addi	sp,sp,-16
  7b8:	e422                	sd	s0,8(sp)
  7ba:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  7bc:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7c0:	00001797          	auipc	a5,0x1
  7c4:	8407b783          	ld	a5,-1984(a5) # 1000 <freep>
  7c8:	a02d                	j	7f2 <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;
  7ca:	4618                	lw	a4,8(a2)
  7cc:	9f2d                	addw	a4,a4,a1
  7ce:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  7d2:	6398                	ld	a4,0(a5)
  7d4:	6310                	ld	a2,0(a4)
  7d6:	a83d                	j	814 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  7d8:	ff852703          	lw	a4,-8(a0)
  7dc:	9f31                	addw	a4,a4,a2
  7de:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  7e0:	ff053683          	ld	a3,-16(a0)
  7e4:	a091                	j	828 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7e6:	6398                	ld	a4,0(a5)
  7e8:	00e7e463          	bltu	a5,a4,7f0 <free+0x3a>
  7ec:	00e6ea63          	bltu	a3,a4,800 <free+0x4a>
-{
  7f0:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7f2:	fed7fae3          	bgeu	a5,a3,7e6 <free+0x30>
  7f6:	6398                	ld	a4,0(a5)
  7f8:	00e6e463          	bltu	a3,a4,800 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7fc:	fee7eae3          	bltu	a5,a4,7f0 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  800:	ff852583          	lw	a1,-8(a0)
  804:	6390                	ld	a2,0(a5)
  806:	02059813          	slli	a6,a1,0x20
  80a:	01c85713          	srli	a4,a6,0x1c
  80e:	9736                	add	a4,a4,a3
  810:	fae60de3          	beq	a2,a4,7ca <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  814:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  818:	4790                	lw	a2,8(a5)
  81a:	02061593          	slli	a1,a2,0x20
  81e:	01c5d713          	srli	a4,a1,0x1c
  822:	973e                	add	a4,a4,a5
  824:	fae68ae3          	beq	a3,a4,7d8 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  828:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  82a:	00000717          	auipc	a4,0x0
  82e:	7cf73b23          	sd	a5,2006(a4) # 1000 <freep>
-}
  832:	6422                	ld	s0,8(sp)
  834:	0141                	addi	sp,sp,16
  836:	8082                	ret
 
 0000000000000838 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  838:	7139                	addi	sp,sp,-64
  83a:	fc06                	sd	ra,56(sp)
  83c:	f822                	sd	s0,48(sp)
  83e:	f426                	sd	s1,40(sp)
  840:	ec4e                	sd	s3,24(sp)
  842:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  844:	02051493          	slli	s1,a0,0x20
  848:	9081                	srli	s1,s1,0x20
  84a:	04bd                	addi	s1,s1,15
  84c:	8091                	srli	s1,s1,0x4
  84e:	0014899b          	addiw	s3,s1,1
  852:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  854:	00000517          	auipc	a0,0x0
  858:	7ac53503          	ld	a0,1964(a0) # 1000 <freep>
  85c:	c915                	beqz	a0,890 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  85e:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  860:	4798                	lw	a4,8(a5)
  862:	08977a63          	bgeu	a4,s1,8f6 <malloc+0xbe>
  866:	f04a                	sd	s2,32(sp)
  868:	e852                	sd	s4,16(sp)
  86a:	e456                	sd	s5,8(sp)
  86c:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  86e:	8a4e                	mv	s4,s3
  870:	0009871b          	sext.w	a4,s3
  874:	6685                	lui	a3,0x1
  876:	00d77363          	bgeu	a4,a3,87c <malloc+0x44>
  87a:	6a05                	lui	s4,0x1
  87c:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  880:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  884:	00000917          	auipc	s2,0x0
  888:	77c90913          	addi	s2,s2,1916 # 1000 <freep>
-  if(p == (char*)-1)
  88c:	5afd                	li	s5,-1
  88e:	a081                	j	8ce <malloc+0x96>
  890:	f04a                	sd	s2,32(sp)
  892:	e852                	sd	s4,16(sp)
  894:	e456                	sd	s5,8(sp)
  896:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  898:	00001797          	auipc	a5,0x1
  89c:	97878793          	addi	a5,a5,-1672 # 1210 <base>
  8a0:	00000717          	auipc	a4,0x0
  8a4:	76f73023          	sd	a5,1888(a4) # 1000 <freep>
  8a8:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  8aa:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  8ae:	b7c1                	j	86e <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  8b0:	6398                	ld	a4,0(a5)
  8b2:	e118                	sd	a4,0(a0)
  8b4:	a8a9                	j	90e <malloc+0xd6>
-  hp->s.size = nu;
  8b6:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  8ba:	0541                	addi	a0,a0,16
  8bc:	efbff0ef          	jal	7b6 <free>
-  return freep;
  8c0:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  8c4:	c12d                	beqz	a0,926 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8c6:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8c8:	4798                	lw	a4,8(a5)
  8ca:	02977263          	bgeu	a4,s1,8ee <malloc+0xb6>
-    if(p == freep)
  8ce:	00093703          	ld	a4,0(s2)
  8d2:	853e                	mv	a0,a5
  8d4:	fef719e3          	bne	a4,a5,8c6 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  8d8:	8552                	mv	a0,s4
  8da:	b03ff0ef          	jal	3dc <sbrk>
-  if(p == (char*)-1)
  8de:	fd551ce3          	bne	a0,s5,8b6 <malloc+0x7e>
-        return 0;
  8e2:	4501                	li	a0,0
  8e4:	7902                	ld	s2,32(sp)
  8e6:	6a42                	ld	s4,16(sp)
@@ -1537,24 +1344,16 @@ malloc(uint nbytes)
  8f0:	6a42                	ld	s4,16(sp)
  8f2:	6aa2                	ld	s5,8(sp)
  8f4:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  8f6:	fae48de3          	beq	s1,a4,8b0 <malloc+0x78>
-        p->s.size -= nunits;
  8fa:	4137073b          	subw	a4,a4,s3
  8fe:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  900:	02071693          	slli	a3,a4,0x20
  904:	01c6d713          	srli	a4,a3,0x1c
  908:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  90a:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  90e:	00000717          	auipc	a4,0x0
  912:	6ea73923          	sd	a0,1778(a4) # 1000 <freep>
-      return (void*)(p + 1);
  916:	01078513          	addi	a0,a5,16
-  }
-}
  91a:	70e2                	ld	ra,56(sp)
  91c:	7442                	ld	s0,48(sp)
  91e:	74a2                	ld	s1,40(sp)
diff --git a/user/cat.o b/user/cat.o
index 735989bfcaf14da28fd4b4978a18ffa6d293d15d..8041d127bd0336bf60926ee5a43a4df30559fe2f 100644
Binary files a/user/cat.o and b/user/cat.o differ
diff --git a/user/cowtest.asm b/user/cowtest.asm
index 6d7ffa288e0e5bcba1d8724189bf58b76dd9953c..d3540309628f3ec12a1f5ebca5ffee02fefe2c21 100644
--- a/user/cowtest.asm
+++ b/user/cowtest.asm
@@ -539,245 +539,123 @@ memcpy(void *dst, const void *src, uint n)
  304:	8082                	ret
 
 0000000000000306 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  306:	4885                	li	a7,1
- ecall
  308:	00000073          	ecall
- ret
  30c:	8082                	ret
 
 000000000000030e <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  30e:	4889                	li	a7,2
- ecall
  310:	00000073          	ecall
- ret
  314:	8082                	ret
 
 0000000000000316 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  316:	488d                	li	a7,3
- ecall
  318:	00000073          	ecall
- ret
  31c:	8082                	ret
 
 000000000000031e <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  31e:	4891                	li	a7,4
- ecall
  320:	00000073          	ecall
- ret
  324:	8082                	ret
 
 0000000000000326 <read>:
-.global read
-read:
- li a7, SYS_read
  326:	4895                	li	a7,5
- ecall
  328:	00000073          	ecall
- ret
  32c:	8082                	ret
 
 000000000000032e <write>:
-.global write
-write:
- li a7, SYS_write
  32e:	48c1                	li	a7,16
- ecall
  330:	00000073          	ecall
- ret
  334:	8082                	ret
 
 0000000000000336 <close>:
-.global close
-close:
- li a7, SYS_close
  336:	48d5                	li	a7,21
- ecall
  338:	00000073          	ecall
- ret
  33c:	8082                	ret
 
 000000000000033e <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  33e:	4899                	li	a7,6
- ecall
  340:	00000073          	ecall
- ret
  344:	8082                	ret
 
 0000000000000346 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  346:	489d                	li	a7,7
- ecall
  348:	00000073          	ecall
- ret
  34c:	8082                	ret
 
 000000000000034e <open>:
-.global open
-open:
- li a7, SYS_open
  34e:	48bd                	li	a7,15
- ecall
  350:	00000073          	ecall
- ret
  354:	8082                	ret
 
 0000000000000356 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  356:	48c5                	li	a7,17
- ecall
  358:	00000073          	ecall
- ret
  35c:	8082                	ret
 
 000000000000035e <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  35e:	48c9                	li	a7,18
- ecall
  360:	00000073          	ecall
- ret
  364:	8082                	ret
 
 0000000000000366 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  366:	48a1                	li	a7,8
- ecall
  368:	00000073          	ecall
- ret
  36c:	8082                	ret
 
 000000000000036e <link>:
-.global link
-link:
- li a7, SYS_link
  36e:	48cd                	li	a7,19
- ecall
  370:	00000073          	ecall
- ret
  374:	8082                	ret
 
 0000000000000376 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  376:	48d1                	li	a7,20
- ecall
  378:	00000073          	ecall
- ret
  37c:	8082                	ret
 
 000000000000037e <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  37e:	48a5                	li	a7,9
- ecall
  380:	00000073          	ecall
- ret
  384:	8082                	ret
 
 0000000000000386 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  386:	48a9                	li	a7,10
- ecall
  388:	00000073          	ecall
- ret
  38c:	8082                	ret
 
 000000000000038e <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  38e:	48ad                	li	a7,11
- ecall
  390:	00000073          	ecall
- ret
  394:	8082                	ret
 
 0000000000000396 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  396:	48b1                	li	a7,12
- ecall
  398:	00000073          	ecall
- ret
  39c:	8082                	ret
 
 000000000000039e <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  39e:	48b5                	li	a7,13
- ecall
  3a0:	00000073          	ecall
- ret
  3a4:	8082                	ret
 
 00000000000003a6 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  3a6:	48b9                	li	a7,14
- ecall
  3a8:	00000073          	ecall
- ret
  3ac:	8082                	ret
 
 00000000000003ae <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3ae:	48d9                	li	a7,22
- ecall
  3b0:	00000073          	ecall
- ret
  3b4:	8082                	ret
 
 00000000000003b6 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3b6:	48dd                	li	a7,23
- ecall
  3b8:	00000073          	ecall
- ret
  3bc:	8082                	ret
 
 00000000000003be <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  3be:	48e1                	li	a7,24
- ecall
  3c0:	00000073          	ecall
- ret
  3c4:	8082                	ret
 
 00000000000003c6 <putc>:
@@ -1320,184 +1198,113 @@ printf(const char *fmt, ...)
  76e:	8082                	ret
 
 0000000000000770 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  770:	1141                	addi	sp,sp,-16
  772:	e422                	sd	s0,8(sp)
  774:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  776:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  77a:	00001797          	auipc	a5,0x1
  77e:	8867b783          	ld	a5,-1914(a5) # 1000 <freep>
  782:	a02d                	j	7ac <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;
  784:	4618                	lw	a4,8(a2)
  786:	9f2d                	addw	a4,a4,a1
  788:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  78c:	6398                	ld	a4,0(a5)
  78e:	6310                	ld	a2,0(a4)
  790:	a83d                	j	7ce <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  792:	ff852703          	lw	a4,-8(a0)
  796:	9f31                	addw	a4,a4,a2
  798:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  79a:	ff053683          	ld	a3,-16(a0)
  79e:	a091                	j	7e2 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7a0:	6398                	ld	a4,0(a5)
  7a2:	00e7e463          	bltu	a5,a4,7aa <free+0x3a>
  7a6:	00e6ea63          	bltu	a3,a4,7ba <free+0x4a>
-{
  7aa:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7ac:	fed7fae3          	bgeu	a5,a3,7a0 <free+0x30>
  7b0:	6398                	ld	a4,0(a5)
  7b2:	00e6e463          	bltu	a3,a4,7ba <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7b6:	fee7eae3          	bltu	a5,a4,7aa <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  7ba:	ff852583          	lw	a1,-8(a0)
  7be:	6390                	ld	a2,0(a5)
  7c0:	02059813          	slli	a6,a1,0x20
  7c4:	01c85713          	srli	a4,a6,0x1c
  7c8:	9736                	add	a4,a4,a3
  7ca:	fae60de3          	beq	a2,a4,784 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  7ce:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  7d2:	4790                	lw	a2,8(a5)
  7d4:	02061593          	slli	a1,a2,0x20
  7d8:	01c5d713          	srli	a4,a1,0x1c
  7dc:	973e                	add	a4,a4,a5
  7de:	fae68ae3          	beq	a3,a4,792 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7e2:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7e4:	00001717          	auipc	a4,0x1
  7e8:	80f73e23          	sd	a5,-2020(a4) # 1000 <freep>
-}
  7ec:	6422                	ld	s0,8(sp)
  7ee:	0141                	addi	sp,sp,16
  7f0:	8082                	ret
 
 00000000000007f2 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7f2:	7139                	addi	sp,sp,-64
  7f4:	fc06                	sd	ra,56(sp)
  7f6:	f822                	sd	s0,48(sp)
  7f8:	f426                	sd	s1,40(sp)
  7fa:	ec4e                	sd	s3,24(sp)
  7fc:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7fe:	02051493          	slli	s1,a0,0x20
  802:	9081                	srli	s1,s1,0x20
  804:	04bd                	addi	s1,s1,15
  806:	8091                	srli	s1,s1,0x4
  808:	0014899b          	addiw	s3,s1,1
  80c:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  80e:	00000517          	auipc	a0,0x0
  812:	7f253503          	ld	a0,2034(a0) # 1000 <freep>
  816:	c915                	beqz	a0,84a <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  818:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  81a:	4798                	lw	a4,8(a5)
  81c:	08977a63          	bgeu	a4,s1,8b0 <malloc+0xbe>
  820:	f04a                	sd	s2,32(sp)
  822:	e852                	sd	s4,16(sp)
  824:	e456                	sd	s5,8(sp)
  826:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  828:	8a4e                	mv	s4,s3
  82a:	0009871b          	sext.w	a4,s3
  82e:	6685                	lui	a3,0x1
  830:	00d77363          	bgeu	a4,a3,836 <malloc+0x44>
  834:	6a05                	lui	s4,0x1
  836:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  83a:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  83e:	00000917          	auipc	s2,0x0
  842:	7c290913          	addi	s2,s2,1986 # 1000 <freep>
-  if(p == (char*)-1)
  846:	5afd                	li	s5,-1
  848:	a081                	j	888 <malloc+0x96>
  84a:	f04a                	sd	s2,32(sp)
  84c:	e852                	sd	s4,16(sp)
  84e:	e456                	sd	s5,8(sp)
  850:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  852:	00000797          	auipc	a5,0x0
  856:	7be78793          	addi	a5,a5,1982 # 1010 <base>
  85a:	00000717          	auipc	a4,0x0
  85e:	7af73323          	sd	a5,1958(a4) # 1000 <freep>
  862:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  864:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  868:	b7c1                	j	828 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  86a:	6398                	ld	a4,0(a5)
  86c:	e118                	sd	a4,0(a0)
  86e:	a8a9                	j	8c8 <malloc+0xd6>
-  hp->s.size = nu;
  870:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  874:	0541                	addi	a0,a0,16
  876:	efbff0ef          	jal	770 <free>
-  return freep;
  87a:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  87e:	c12d                	beqz	a0,8e0 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  880:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  882:	4798                	lw	a4,8(a5)
  884:	02977263          	bgeu	a4,s1,8a8 <malloc+0xb6>
-    if(p == freep)
  888:	00093703          	ld	a4,0(s2)
  88c:	853e                	mv	a0,a5
  88e:	fef719e3          	bne	a4,a5,880 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  892:	8552                	mv	a0,s4
  894:	b03ff0ef          	jal	396 <sbrk>
-  if(p == (char*)-1)
  898:	fd551ce3          	bne	a0,s5,870 <malloc+0x7e>
-        return 0;
  89c:	4501                	li	a0,0
  89e:	7902                	ld	s2,32(sp)
  8a0:	6a42                	ld	s4,16(sp)
@@ -1508,24 +1315,16 @@ malloc(uint nbytes)
  8aa:	6a42                	ld	s4,16(sp)
  8ac:	6aa2                	ld	s5,8(sp)
  8ae:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  8b0:	fae48de3          	beq	s1,a4,86a <malloc+0x78>
-        p->s.size -= nunits;
  8b4:	4137073b          	subw	a4,a4,s3
  8b8:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  8ba:	02071693          	slli	a3,a4,0x20
  8be:	01c6d713          	srli	a4,a3,0x1c
  8c2:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  8c4:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  8c8:	00000717          	auipc	a4,0x0
  8cc:	72a73c23          	sd	a0,1848(a4) # 1000 <freep>
-      return (void*)(p + 1);
  8d0:	01078513          	addi	a0,a5,16
-  }
-}
  8d4:	70e2                	ld	ra,56(sp)
  8d6:	7442                	ld	s0,48(sp)
  8d8:	74a2                	ld	s1,40(sp)
diff --git a/user/cowtest.o b/user/cowtest.o
index a17443ba5a88004f40a4eb07281ff3d098534385..ea2a5c0c50d6e9289bde48bea568e8033f1e9659 100644
Binary files a/user/cowtest.o and b/user/cowtest.o differ
diff --git a/user/doubletest.asm b/user/doubletest.asm
index ed1b2c9fcc4551251bce24fceee6f301fdd2b76b..b969d47c321420ce169745af2f807c5873b952b0 100644
--- a/user/doubletest.asm
+++ b/user/doubletest.asm
@@ -533,245 +533,123 @@ memcpy(void *dst, const void *src, uint n)
  32e:	8082                	ret
 
 0000000000000330 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  330:	4885                	li	a7,1
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  338:	4889                	li	a7,2
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  340:	488d                	li	a7,3
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  348:	4891                	li	a7,4
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <read>:
-.global read
-read:
- li a7, SYS_read
  350:	4895                	li	a7,5
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <write>:
-.global write
-write:
- li a7, SYS_write
  358:	48c1                	li	a7,16
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <close>:
-.global close
-close:
- li a7, SYS_close
  360:	48d5                	li	a7,21
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  368:	4899                	li	a7,6
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  370:	489d                	li	a7,7
- ecall
  372:	00000073          	ecall
- ret
  376:	8082                	ret
 
 0000000000000378 <open>:
-.global open
-open:
- li a7, SYS_open
  378:	48bd                	li	a7,15
- ecall
  37a:	00000073          	ecall
- ret
  37e:	8082                	ret
 
 0000000000000380 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  380:	48c5                	li	a7,17
- ecall
  382:	00000073          	ecall
- ret
  386:	8082                	ret
 
 0000000000000388 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  388:	48c9                	li	a7,18
- ecall
  38a:	00000073          	ecall
- ret
  38e:	8082                	ret
 
 0000000000000390 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  390:	48a1                	li	a7,8
- ecall
  392:	00000073          	ecall
- ret
  396:	8082                	ret
 
 0000000000000398 <link>:
-.global link
-link:
- li a7, SYS_link
  398:	48cd                	li	a7,19
- ecall
  39a:	00000073          	ecall
- ret
  39e:	8082                	ret
 
 00000000000003a0 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  3a0:	48d1                	li	a7,20
- ecall
  3a2:	00000073          	ecall
- ret
  3a6:	8082                	ret
 
 00000000000003a8 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  3a8:	48a5                	li	a7,9
- ecall
  3aa:	00000073          	ecall
- ret
  3ae:	8082                	ret
 
 00000000000003b0 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  3b0:	48a9                	li	a7,10
- ecall
  3b2:	00000073          	ecall
- ret
  3b6:	8082                	ret
 
 00000000000003b8 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  3b8:	48ad                	li	a7,11
- ecall
  3ba:	00000073          	ecall
- ret
  3be:	8082                	ret
 
 00000000000003c0 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  3c0:	48b1                	li	a7,12
- ecall
  3c2:	00000073          	ecall
- ret
  3c6:	8082                	ret
 
 00000000000003c8 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  3c8:	48b5                	li	a7,13
- ecall
  3ca:	00000073          	ecall
- ret
  3ce:	8082                	ret
 
 00000000000003d0 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  3d0:	48b9                	li	a7,14
- ecall
  3d2:	00000073          	ecall
- ret
  3d6:	8082                	ret
 
 00000000000003d8 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3d8:	48d9                	li	a7,22
- ecall
  3da:	00000073          	ecall
- ret
  3de:	8082                	ret
 
 00000000000003e0 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3e0:	48dd                	li	a7,23
- ecall
  3e2:	00000073          	ecall
- ret
  3e6:	8082                	ret
 
 00000000000003e8 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  3e8:	48e1                	li	a7,24
- ecall
  3ea:	00000073          	ecall
- ret
  3ee:	8082                	ret
 
 00000000000003f0 <putc>:
@@ -1314,184 +1192,113 @@ printf(const char *fmt, ...)
  798:	8082                	ret
 
 000000000000079a <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  79a:	1141                	addi	sp,sp,-16
  79c:	e422                	sd	s0,8(sp)
  79e:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  7a0:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7a4:	00001797          	auipc	a5,0x1
  7a8:	85c7b783          	ld	a5,-1956(a5) # 1000 <freep>
  7ac:	a02d                	j	7d6 <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;
  7ae:	4618                	lw	a4,8(a2)
  7b0:	9f2d                	addw	a4,a4,a1
  7b2:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  7b6:	6398                	ld	a4,0(a5)
  7b8:	6310                	ld	a2,0(a4)
  7ba:	a83d                	j	7f8 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  7bc:	ff852703          	lw	a4,-8(a0)
  7c0:	9f31                	addw	a4,a4,a2
  7c2:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  7c4:	ff053683          	ld	a3,-16(a0)
  7c8:	a091                	j	80c <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7ca:	6398                	ld	a4,0(a5)
  7cc:	00e7e463          	bltu	a5,a4,7d4 <free+0x3a>
  7d0:	00e6ea63          	bltu	a3,a4,7e4 <free+0x4a>
-{
  7d4:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7d6:	fed7fae3          	bgeu	a5,a3,7ca <free+0x30>
  7da:	6398                	ld	a4,0(a5)
  7dc:	00e6e463          	bltu	a3,a4,7e4 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7e0:	fee7eae3          	bltu	a5,a4,7d4 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  7e4:	ff852583          	lw	a1,-8(a0)
  7e8:	6390                	ld	a2,0(a5)
  7ea:	02059813          	slli	a6,a1,0x20
  7ee:	01c85713          	srli	a4,a6,0x1c
  7f2:	9736                	add	a4,a4,a3
  7f4:	fae60de3          	beq	a2,a4,7ae <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  7f8:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  7fc:	4790                	lw	a2,8(a5)
  7fe:	02061593          	slli	a1,a2,0x20
  802:	01c5d713          	srli	a4,a1,0x1c
  806:	973e                	add	a4,a4,a5
  808:	fae68ae3          	beq	a3,a4,7bc <free+0x22>
-    p->s.ptr = bp->s.ptr;
  80c:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  80e:	00000717          	auipc	a4,0x0
  812:	7ef73923          	sd	a5,2034(a4) # 1000 <freep>
-}
  816:	6422                	ld	s0,8(sp)
  818:	0141                	addi	sp,sp,16
  81a:	8082                	ret
 
 000000000000081c <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  81c:	7139                	addi	sp,sp,-64
  81e:	fc06                	sd	ra,56(sp)
  820:	f822                	sd	s0,48(sp)
  822:	f426                	sd	s1,40(sp)
  824:	ec4e                	sd	s3,24(sp)
  826:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  828:	02051493          	slli	s1,a0,0x20
  82c:	9081                	srli	s1,s1,0x20
  82e:	04bd                	addi	s1,s1,15
  830:	8091                	srli	s1,s1,0x4
  832:	0014899b          	addiw	s3,s1,1
  836:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  838:	00000517          	auipc	a0,0x0
  83c:	7c853503          	ld	a0,1992(a0) # 1000 <freep>
  840:	c915                	beqz	a0,874 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  842:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  844:	4798                	lw	a4,8(a5)
  846:	08977a63          	bgeu	a4,s1,8da <malloc+0xbe>
  84a:	f04a                	sd	s2,32(sp)
  84c:	e852                	sd	s4,16(sp)
  84e:	e456                	sd	s5,8(sp)
  850:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  852:	8a4e                	mv	s4,s3
  854:	0009871b          	sext.w	a4,s3
  858:	6685                	lui	a3,0x1
  85a:	00d77363          	bgeu	a4,a3,860 <malloc+0x44>
  85e:	6a05                	lui	s4,0x1
  860:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  864:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  868:	00000917          	auipc	s2,0x0
  86c:	79890913          	addi	s2,s2,1944 # 1000 <freep>
-  if(p == (char*)-1)
  870:	5afd                	li	s5,-1
  872:	a081                	j	8b2 <malloc+0x96>
  874:	f04a                	sd	s2,32(sp)
  876:	e852                	sd	s4,16(sp)
  878:	e456                	sd	s5,8(sp)
  87a:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  87c:	00000797          	auipc	a5,0x0
  880:	79478793          	addi	a5,a5,1940 # 1010 <base>
  884:	00000717          	auipc	a4,0x0
  888:	76f73e23          	sd	a5,1916(a4) # 1000 <freep>
  88c:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  88e:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  892:	b7c1                	j	852 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  894:	6398                	ld	a4,0(a5)
  896:	e118                	sd	a4,0(a0)
  898:	a8a9                	j	8f2 <malloc+0xd6>
-  hp->s.size = nu;
  89a:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  89e:	0541                	addi	a0,a0,16
  8a0:	efbff0ef          	jal	79a <free>
-  return freep;
  8a4:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  8a8:	c12d                	beqz	a0,90a <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8aa:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8ac:	4798                	lw	a4,8(a5)
  8ae:	02977263          	bgeu	a4,s1,8d2 <malloc+0xb6>
-    if(p == freep)
  8b2:	00093703          	ld	a4,0(s2)
  8b6:	853e                	mv	a0,a5
  8b8:	fef719e3          	bne	a4,a5,8aa <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  8bc:	8552                	mv	a0,s4
  8be:	b03ff0ef          	jal	3c0 <sbrk>
-  if(p == (char*)-1)
  8c2:	fd551ce3          	bne	a0,s5,89a <malloc+0x7e>
-        return 0;
  8c6:	4501                	li	a0,0
  8c8:	7902                	ld	s2,32(sp)
  8ca:	6a42                	ld	s4,16(sp)
@@ -1502,24 +1309,16 @@ malloc(uint nbytes)
  8d4:	6a42                	ld	s4,16(sp)
  8d6:	6aa2                	ld	s5,8(sp)
  8d8:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  8da:	fae48de3          	beq	s1,a4,894 <malloc+0x78>
-        p->s.size -= nunits;
  8de:	4137073b          	subw	a4,a4,s3
  8e2:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  8e4:	02071693          	slli	a3,a4,0x20
  8e8:	01c6d713          	srli	a4,a3,0x1c
  8ec:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  8ee:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  8f2:	00000717          	auipc	a4,0x0
  8f6:	70a73723          	sd	a0,1806(a4) # 1000 <freep>
-      return (void*)(p + 1);
  8fa:	01078513          	addi	a0,a5,16
-  }
-}
  8fe:	70e2                	ld	ra,56(sp)
  900:	7442                	ld	s0,48(sp)
  902:	74a2                	ld	s1,40(sp)
diff --git a/user/doubletest.o b/user/doubletest.o
index 8ea7a054ab5a076151aaec8fce482c5362223c61..c2dc1d9bfcd6415224a6bfc9f4073e636df307ae 100644
Binary files a/user/doubletest.o and b/user/doubletest.o differ
diff --git a/user/echo.asm b/user/echo.asm
index 983fdbd80bd16369c3bb0c6d80933e976926d0d5..ff14623c4dcbbcbc6e6eccec66e3517110e09514 100644
--- a/user/echo.asm
+++ b/user/echo.asm
@@ -500,245 +500,123 @@ memcpy(void *dst, const void *src, uint n)
  2da:	8082                	ret
 
 00000000000002dc <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2dc:	4885                	li	a7,1
- ecall
  2de:	00000073          	ecall
- ret
  2e2:	8082                	ret
 
 00000000000002e4 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2e4:	4889                	li	a7,2
- ecall
  2e6:	00000073          	ecall
- ret
  2ea:	8082                	ret
 
 00000000000002ec <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2ec:	488d                	li	a7,3
- ecall
  2ee:	00000073          	ecall
- ret
  2f2:	8082                	ret
 
 00000000000002f4 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2f4:	4891                	li	a7,4
- ecall
  2f6:	00000073          	ecall
- ret
  2fa:	8082                	ret
 
 00000000000002fc <read>:
-.global read
-read:
- li a7, SYS_read
  2fc:	4895                	li	a7,5
- ecall
  2fe:	00000073          	ecall
- ret
  302:	8082                	ret
 
 0000000000000304 <write>:
-.global write
-write:
- li a7, SYS_write
  304:	48c1                	li	a7,16
- ecall
  306:	00000073          	ecall
- ret
  30a:	8082                	ret
 
 000000000000030c <close>:
-.global close
-close:
- li a7, SYS_close
  30c:	48d5                	li	a7,21
- ecall
  30e:	00000073          	ecall
- ret
  312:	8082                	ret
 
 0000000000000314 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  314:	4899                	li	a7,6
- ecall
  316:	00000073          	ecall
- ret
  31a:	8082                	ret
 
 000000000000031c <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  31c:	489d                	li	a7,7
- ecall
  31e:	00000073          	ecall
- ret
  322:	8082                	ret
 
 0000000000000324 <open>:
-.global open
-open:
- li a7, SYS_open
  324:	48bd                	li	a7,15
- ecall
  326:	00000073          	ecall
- ret
  32a:	8082                	ret
 
 000000000000032c <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  32c:	48c5                	li	a7,17
- ecall
  32e:	00000073          	ecall
- ret
  332:	8082                	ret
 
 0000000000000334 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  334:	48c9                	li	a7,18
- ecall
  336:	00000073          	ecall
- ret
  33a:	8082                	ret
 
 000000000000033c <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  33c:	48a1                	li	a7,8
- ecall
  33e:	00000073          	ecall
- ret
  342:	8082                	ret
 
 0000000000000344 <link>:
-.global link
-link:
- li a7, SYS_link
  344:	48cd                	li	a7,19
- ecall
  346:	00000073          	ecall
- ret
  34a:	8082                	ret
 
 000000000000034c <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  34c:	48d1                	li	a7,20
- ecall
  34e:	00000073          	ecall
- ret
  352:	8082                	ret
 
 0000000000000354 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  354:	48a5                	li	a7,9
- ecall
  356:	00000073          	ecall
- ret
  35a:	8082                	ret
 
 000000000000035c <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  35c:	48a9                	li	a7,10
- ecall
  35e:	00000073          	ecall
- ret
  362:	8082                	ret
 
 0000000000000364 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  364:	48ad                	li	a7,11
- ecall
  366:	00000073          	ecall
- ret
  36a:	8082                	ret
 
 000000000000036c <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  36c:	48b1                	li	a7,12
- ecall
  36e:	00000073          	ecall
- ret
  372:	8082                	ret
 
 0000000000000374 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  374:	48b5                	li	a7,13
- ecall
  376:	00000073          	ecall
- ret
  37a:	8082                	ret
 
 000000000000037c <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  37c:	48b9                	li	a7,14
- ecall
  37e:	00000073          	ecall
- ret
  382:	8082                	ret
 
 0000000000000384 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  384:	48d9                	li	a7,22
- ecall
  386:	00000073          	ecall
- ret
  38a:	8082                	ret
 
 000000000000038c <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  38c:	48dd                	li	a7,23
- ecall
  38e:	00000073          	ecall
- ret
  392:	8082                	ret
 
 0000000000000394 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  394:	48e1                	li	a7,24
- ecall
  396:	00000073          	ecall
- ret
  39a:	8082                	ret
 
 000000000000039c <putc>:
@@ -1281,184 +1159,113 @@ printf(const char *fmt, ...)
  744:	8082                	ret
 
 0000000000000746 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  746:	1141                	addi	sp,sp,-16
  748:	e422                	sd	s0,8(sp)
  74a:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  74c:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  750:	00001797          	auipc	a5,0x1
  754:	8b07b783          	ld	a5,-1872(a5) # 1000 <freep>
  758:	a02d                	j	782 <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;
  75a:	4618                	lw	a4,8(a2)
  75c:	9f2d                	addw	a4,a4,a1
  75e:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  762:	6398                	ld	a4,0(a5)
  764:	6310                	ld	a2,0(a4)
  766:	a83d                	j	7a4 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  768:	ff852703          	lw	a4,-8(a0)
  76c:	9f31                	addw	a4,a4,a2
  76e:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  770:	ff053683          	ld	a3,-16(a0)
  774:	a091                	j	7b8 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  776:	6398                	ld	a4,0(a5)
  778:	00e7e463          	bltu	a5,a4,780 <free+0x3a>
  77c:	00e6ea63          	bltu	a3,a4,790 <free+0x4a>
-{
  780:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  782:	fed7fae3          	bgeu	a5,a3,776 <free+0x30>
  786:	6398                	ld	a4,0(a5)
  788:	00e6e463          	bltu	a3,a4,790 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  78c:	fee7eae3          	bltu	a5,a4,780 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  790:	ff852583          	lw	a1,-8(a0)
  794:	6390                	ld	a2,0(a5)
  796:	02059813          	slli	a6,a1,0x20
  79a:	01c85713          	srli	a4,a6,0x1c
  79e:	9736                	add	a4,a4,a3
  7a0:	fae60de3          	beq	a2,a4,75a <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  7a4:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  7a8:	4790                	lw	a2,8(a5)
  7aa:	02061593          	slli	a1,a2,0x20
  7ae:	01c5d713          	srli	a4,a1,0x1c
  7b2:	973e                	add	a4,a4,a5
  7b4:	fae68ae3          	beq	a3,a4,768 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7b8:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7ba:	00001717          	auipc	a4,0x1
  7be:	84f73323          	sd	a5,-1978(a4) # 1000 <freep>
-}
  7c2:	6422                	ld	s0,8(sp)
  7c4:	0141                	addi	sp,sp,16
  7c6:	8082                	ret
 
 00000000000007c8 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7c8:	7139                	addi	sp,sp,-64
  7ca:	fc06                	sd	ra,56(sp)
  7cc:	f822                	sd	s0,48(sp)
  7ce:	f426                	sd	s1,40(sp)
  7d0:	ec4e                	sd	s3,24(sp)
  7d2:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7d4:	02051493          	slli	s1,a0,0x20
  7d8:	9081                	srli	s1,s1,0x20
  7da:	04bd                	addi	s1,s1,15
  7dc:	8091                	srli	s1,s1,0x4
  7de:	0014899b          	addiw	s3,s1,1
  7e2:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7e4:	00001517          	auipc	a0,0x1
  7e8:	81c53503          	ld	a0,-2020(a0) # 1000 <freep>
  7ec:	c915                	beqz	a0,820 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7ee:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7f0:	4798                	lw	a4,8(a5)
  7f2:	08977a63          	bgeu	a4,s1,886 <malloc+0xbe>
  7f6:	f04a                	sd	s2,32(sp)
  7f8:	e852                	sd	s4,16(sp)
  7fa:	e456                	sd	s5,8(sp)
  7fc:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7fe:	8a4e                	mv	s4,s3
  800:	0009871b          	sext.w	a4,s3
  804:	6685                	lui	a3,0x1
  806:	00d77363          	bgeu	a4,a3,80c <malloc+0x44>
  80a:	6a05                	lui	s4,0x1
  80c:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  810:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  814:	00000917          	auipc	s2,0x0
  818:	7ec90913          	addi	s2,s2,2028 # 1000 <freep>
-  if(p == (char*)-1)
  81c:	5afd                	li	s5,-1
  81e:	a081                	j	85e <malloc+0x96>
  820:	f04a                	sd	s2,32(sp)
  822:	e852                	sd	s4,16(sp)
  824:	e456                	sd	s5,8(sp)
  826:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  828:	00000797          	auipc	a5,0x0
  82c:	7e878793          	addi	a5,a5,2024 # 1010 <base>
  830:	00000717          	auipc	a4,0x0
  834:	7cf73823          	sd	a5,2000(a4) # 1000 <freep>
  838:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  83a:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  83e:	b7c1                	j	7fe <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  840:	6398                	ld	a4,0(a5)
  842:	e118                	sd	a4,0(a0)
  844:	a8a9                	j	89e <malloc+0xd6>
-  hp->s.size = nu;
  846:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  84a:	0541                	addi	a0,a0,16
  84c:	efbff0ef          	jal	746 <free>
-  return freep;
  850:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  854:	c12d                	beqz	a0,8b6 <malloc+0xee>
-  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:	02977263          	bgeu	a4,s1,87e <malloc+0xb6>
-    if(p == freep)
  85e:	00093703          	ld	a4,0(s2)
  862:	853e                	mv	a0,a5
  864:	fef719e3          	bne	a4,a5,856 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  868:	8552                	mv	a0,s4
  86a:	b03ff0ef          	jal	36c <sbrk>
-  if(p == (char*)-1)
  86e:	fd551ce3          	bne	a0,s5,846 <malloc+0x7e>
-        return 0;
  872:	4501                	li	a0,0
  874:	7902                	ld	s2,32(sp)
  876:	6a42                	ld	s4,16(sp)
@@ -1469,24 +1276,16 @@ malloc(uint nbytes)
  880:	6a42                	ld	s4,16(sp)
  882:	6aa2                	ld	s5,8(sp)
  884:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  886:	fae48de3          	beq	s1,a4,840 <malloc+0x78>
-        p->s.size -= nunits;
  88a:	4137073b          	subw	a4,a4,s3
  88e:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  890:	02071693          	slli	a3,a4,0x20
  894:	01c6d713          	srli	a4,a3,0x1c
  898:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  89a:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  89e:	00000717          	auipc	a4,0x0
  8a2:	76a73123          	sd	a0,1890(a4) # 1000 <freep>
-      return (void*)(p + 1);
  8a6:	01078513          	addi	a0,a5,16
-  }
-}
  8aa:	70e2                	ld	ra,56(sp)
  8ac:	7442                	ld	s0,48(sp)
  8ae:	74a2                	ld	s1,40(sp)
diff --git a/user/echo.o b/user/echo.o
index b355c6571a49d2cdeeffa6ca2149ce09f8bc89a3..40663700af45c07d6efbf31b3b5c706385df410e 100644
Binary files a/user/echo.o and b/user/echo.o differ
diff --git a/user/find.asm b/user/find.asm
index c915d9f1d88d6c5b3c9d0cacf888bacd9185ce12..2d461a653414520d2ed6c7a72bf7320914f6ad0c 100644
--- a/user/find.asm
+++ b/user/find.asm
@@ -727,245 +727,123 @@ memcpy(void *dst, const void *src, uint n)
  4c0:	8082                	ret
 
 00000000000004c2 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  4c2:	4885                	li	a7,1
- ecall
  4c4:	00000073          	ecall
- ret
  4c8:	8082                	ret
 
 00000000000004ca <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  4ca:	4889                	li	a7,2
- ecall
  4cc:	00000073          	ecall
- ret
  4d0:	8082                	ret
 
 00000000000004d2 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  4d2:	488d                	li	a7,3
- ecall
  4d4:	00000073          	ecall
- ret
  4d8:	8082                	ret
 
 00000000000004da <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  4da:	4891                	li	a7,4
- ecall
  4dc:	00000073          	ecall
- ret
  4e0:	8082                	ret
 
 00000000000004e2 <read>:
-.global read
-read:
- li a7, SYS_read
  4e2:	4895                	li	a7,5
- ecall
  4e4:	00000073          	ecall
- ret
  4e8:	8082                	ret
 
 00000000000004ea <write>:
-.global write
-write:
- li a7, SYS_write
  4ea:	48c1                	li	a7,16
- ecall
  4ec:	00000073          	ecall
- ret
  4f0:	8082                	ret
 
 00000000000004f2 <close>:
-.global close
-close:
- li a7, SYS_close
  4f2:	48d5                	li	a7,21
- ecall
  4f4:	00000073          	ecall
- ret
  4f8:	8082                	ret
 
 00000000000004fa <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  4fa:	4899                	li	a7,6
- ecall
  4fc:	00000073          	ecall
- ret
  500:	8082                	ret
 
 0000000000000502 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  502:	489d                	li	a7,7
- ecall
  504:	00000073          	ecall
- ret
  508:	8082                	ret
 
 000000000000050a <open>:
-.global open
-open:
- li a7, SYS_open
  50a:	48bd                	li	a7,15
- ecall
  50c:	00000073          	ecall
- ret
  510:	8082                	ret
 
 0000000000000512 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  512:	48c5                	li	a7,17
- ecall
  514:	00000073          	ecall
- ret
  518:	8082                	ret
 
 000000000000051a <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  51a:	48c9                	li	a7,18
- ecall
  51c:	00000073          	ecall
- ret
  520:	8082                	ret
 
 0000000000000522 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  522:	48a1                	li	a7,8
- ecall
  524:	00000073          	ecall
- ret
  528:	8082                	ret
 
 000000000000052a <link>:
-.global link
-link:
- li a7, SYS_link
  52a:	48cd                	li	a7,19
- ecall
  52c:	00000073          	ecall
- ret
  530:	8082                	ret
 
 0000000000000532 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  532:	48d1                	li	a7,20
- ecall
  534:	00000073          	ecall
- ret
  538:	8082                	ret
 
 000000000000053a <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  53a:	48a5                	li	a7,9
- ecall
  53c:	00000073          	ecall
- ret
  540:	8082                	ret
 
 0000000000000542 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  542:	48a9                	li	a7,10
- ecall
  544:	00000073          	ecall
- ret
  548:	8082                	ret
 
 000000000000054a <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  54a:	48ad                	li	a7,11
- ecall
  54c:	00000073          	ecall
- ret
  550:	8082                	ret
 
 0000000000000552 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  552:	48b1                	li	a7,12
- ecall
  554:	00000073          	ecall
- ret
  558:	8082                	ret
 
 000000000000055a <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  55a:	48b5                	li	a7,13
- ecall
  55c:	00000073          	ecall
- ret
  560:	8082                	ret
 
 0000000000000562 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  562:	48b9                	li	a7,14
- ecall
  564:	00000073          	ecall
- ret
  568:	8082                	ret
 
 000000000000056a <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  56a:	48d9                	li	a7,22
- ecall
  56c:	00000073          	ecall
- ret
  570:	8082                	ret
 
 0000000000000572 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  572:	48dd                	li	a7,23
- ecall
  574:	00000073          	ecall
- ret
  578:	8082                	ret
 
 000000000000057a <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  57a:	48e1                	li	a7,24
- ecall
  57c:	00000073          	ecall
- ret
  580:	8082                	ret
 
 0000000000000582 <putc>:
@@ -1508,184 +1386,113 @@ printf(const char *fmt, ...)
  92a:	8082                	ret
 
 000000000000092c <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  92c:	1141                	addi	sp,sp,-16
  92e:	e422                	sd	s0,8(sp)
  930:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  932:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  936:	00000797          	auipc	a5,0x0
  93a:	6ca7b783          	ld	a5,1738(a5) # 1000 <freep>
  93e:	a02d                	j	968 <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;
  940:	4618                	lw	a4,8(a2)
  942:	9f2d                	addw	a4,a4,a1
  944:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  948:	6398                	ld	a4,0(a5)
  94a:	6310                	ld	a2,0(a4)
  94c:	a83d                	j	98a <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  94e:	ff852703          	lw	a4,-8(a0)
  952:	9f31                	addw	a4,a4,a2
  954:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  956:	ff053683          	ld	a3,-16(a0)
  95a:	a091                	j	99e <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  95c:	6398                	ld	a4,0(a5)
  95e:	00e7e463          	bltu	a5,a4,966 <free+0x3a>
  962:	00e6ea63          	bltu	a3,a4,976 <free+0x4a>
-{
  966:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  968:	fed7fae3          	bgeu	a5,a3,95c <free+0x30>
  96c:	6398                	ld	a4,0(a5)
  96e:	00e6e463          	bltu	a3,a4,976 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  972:	fee7eae3          	bltu	a5,a4,966 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  976:	ff852583          	lw	a1,-8(a0)
  97a:	6390                	ld	a2,0(a5)
  97c:	02059813          	slli	a6,a1,0x20
  980:	01c85713          	srli	a4,a6,0x1c
  984:	9736                	add	a4,a4,a3
  986:	fae60de3          	beq	a2,a4,940 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  98a:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  98e:	4790                	lw	a2,8(a5)
  990:	02061593          	slli	a1,a2,0x20
  994:	01c5d713          	srli	a4,a1,0x1c
  998:	973e                	add	a4,a4,a5
  99a:	fae68ae3          	beq	a3,a4,94e <free+0x22>
-    p->s.ptr = bp->s.ptr;
  99e:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  9a0:	00000717          	auipc	a4,0x0
  9a4:	66f73023          	sd	a5,1632(a4) # 1000 <freep>
-}
  9a8:	6422                	ld	s0,8(sp)
  9aa:	0141                	addi	sp,sp,16
  9ac:	8082                	ret
 
 00000000000009ae <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  9ae:	7139                	addi	sp,sp,-64
  9b0:	fc06                	sd	ra,56(sp)
  9b2:	f822                	sd	s0,48(sp)
  9b4:	f426                	sd	s1,40(sp)
  9b6:	ec4e                	sd	s3,24(sp)
  9b8:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  9ba:	02051493          	slli	s1,a0,0x20
  9be:	9081                	srli	s1,s1,0x20
  9c0:	04bd                	addi	s1,s1,15
  9c2:	8091                	srli	s1,s1,0x4
  9c4:	0014899b          	addiw	s3,s1,1
  9c8:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  9ca:	00000517          	auipc	a0,0x0
  9ce:	63653503          	ld	a0,1590(a0) # 1000 <freep>
  9d2:	c915                	beqz	a0,a06 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  9d4:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  9d6:	4798                	lw	a4,8(a5)
  9d8:	08977a63          	bgeu	a4,s1,a6c <malloc+0xbe>
  9dc:	f04a                	sd	s2,32(sp)
  9de:	e852                	sd	s4,16(sp)
  9e0:	e456                	sd	s5,8(sp)
  9e2:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  9e4:	8a4e                	mv	s4,s3
  9e6:	0009871b          	sext.w	a4,s3
  9ea:	6685                	lui	a3,0x1
  9ec:	00d77363          	bgeu	a4,a3,9f2 <malloc+0x44>
  9f0:	6a05                	lui	s4,0x1
  9f2:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  9f6:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  9fa:	00000917          	auipc	s2,0x0
  9fe:	60690913          	addi	s2,s2,1542 # 1000 <freep>
-  if(p == (char*)-1)
  a02:	5afd                	li	s5,-1
  a04:	a081                	j	a44 <malloc+0x96>
  a06:	f04a                	sd	s2,32(sp)
  a08:	e852                	sd	s4,16(sp)
  a0a:	e456                	sd	s5,8(sp)
  a0c:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  a0e:	00000797          	auipc	a5,0x0
  a12:	61278793          	addi	a5,a5,1554 # 1020 <base>
  a16:	00000717          	auipc	a4,0x0
  a1a:	5ef73523          	sd	a5,1514(a4) # 1000 <freep>
  a1e:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  a20:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  a24:	b7c1                	j	9e4 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  a26:	6398                	ld	a4,0(a5)
  a28:	e118                	sd	a4,0(a0)
  a2a:	a8a9                	j	a84 <malloc+0xd6>
-  hp->s.size = nu;
  a2c:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  a30:	0541                	addi	a0,a0,16
  a32:	efbff0ef          	jal	92c <free>
-  return freep;
  a36:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  a3a:	c12d                	beqz	a0,a9c <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  a3c:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  a3e:	4798                	lw	a4,8(a5)
  a40:	02977263          	bgeu	a4,s1,a64 <malloc+0xb6>
-    if(p == freep)
  a44:	00093703          	ld	a4,0(s2)
  a48:	853e                	mv	a0,a5
  a4a:	fef719e3          	bne	a4,a5,a3c <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  a4e:	8552                	mv	a0,s4
  a50:	b03ff0ef          	jal	552 <sbrk>
-  if(p == (char*)-1)
  a54:	fd551ce3          	bne	a0,s5,a2c <malloc+0x7e>
-        return 0;
  a58:	4501                	li	a0,0
  a5a:	7902                	ld	s2,32(sp)
  a5c:	6a42                	ld	s4,16(sp)
@@ -1696,24 +1503,16 @@ malloc(uint nbytes)
  a66:	6a42                	ld	s4,16(sp)
  a68:	6aa2                	ld	s5,8(sp)
  a6a:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  a6c:	fae48de3          	beq	s1,a4,a26 <malloc+0x78>
-        p->s.size -= nunits;
  a70:	4137073b          	subw	a4,a4,s3
  a74:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  a76:	02071693          	slli	a3,a4,0x20
  a7a:	01c6d713          	srli	a4,a3,0x1c
  a7e:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  a80:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  a84:	00000717          	auipc	a4,0x0
  a88:	56a73e23          	sd	a0,1404(a4) # 1000 <freep>
-      return (void*)(p + 1);
  a8c:	01078513          	addi	a0,a5,16
-  }
-}
  a90:	70e2                	ld	ra,56(sp)
  a92:	7442                	ld	s0,48(sp)
  a94:	74a2                	ld	s1,40(sp)
diff --git a/user/find.o b/user/find.o
index 4ecc03978cc5ec66acce342ade9f29f0a3b092e2..1643eae7667b802bfd4037011b5d8368c3b1901b 100644
Binary files a/user/find.o and b/user/find.o differ
diff --git a/user/forktest.asm b/user/forktest.asm
index f5222b05944e7dbf52d8f2f0a45f9b3092f349fe..a38b18a5f8e0698e1c6fed0d31d7dafaee46f224 100644
--- a/user/forktest.asm
+++ b/user/forktest.asm
@@ -571,243 +571,121 @@ memcpy(void *dst, const void *src, uint n)
  336:	8082                	ret
 
 0000000000000338 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  338:	4885                	li	a7,1
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  340:	4889                	li	a7,2
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  348:	488d                	li	a7,3
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  350:	4891                	li	a7,4
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <read>:
-.global read
-read:
- li a7, SYS_read
  358:	4895                	li	a7,5
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <write>:
-.global write
-write:
- li a7, SYS_write
  360:	48c1                	li	a7,16
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <close>:
-.global close
-close:
- li a7, SYS_close
  368:	48d5                	li	a7,21
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  370:	4899                	li	a7,6
- ecall
  372:	00000073          	ecall
- ret
  376:	8082                	ret
 
 0000000000000378 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  378:	489d                	li	a7,7
- ecall
  37a:	00000073          	ecall
- ret
  37e:	8082                	ret
 
 0000000000000380 <open>:
-.global open
-open:
- li a7, SYS_open
  380:	48bd                	li	a7,15
- ecall
  382:	00000073          	ecall
- ret
  386:	8082                	ret
 
 0000000000000388 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  388:	48c5                	li	a7,17
- ecall
  38a:	00000073          	ecall
- ret
  38e:	8082                	ret
 
 0000000000000390 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  390:	48c9                	li	a7,18
- ecall
  392:	00000073          	ecall
- ret
  396:	8082                	ret
 
 0000000000000398 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  398:	48a1                	li	a7,8
- ecall
  39a:	00000073          	ecall
- ret
  39e:	8082                	ret
 
 00000000000003a0 <link>:
-.global link
-link:
- li a7, SYS_link
  3a0:	48cd                	li	a7,19
- ecall
  3a2:	00000073          	ecall
- ret
  3a6:	8082                	ret
 
 00000000000003a8 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  3a8:	48d1                	li	a7,20
- ecall
  3aa:	00000073          	ecall
- ret
  3ae:	8082                	ret
 
 00000000000003b0 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  3b0:	48a5                	li	a7,9
- ecall
  3b2:	00000073          	ecall
- ret
  3b6:	8082                	ret
 
 00000000000003b8 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  3b8:	48a9                	li	a7,10
- ecall
  3ba:	00000073          	ecall
- ret
  3be:	8082                	ret
 
 00000000000003c0 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  3c0:	48ad                	li	a7,11
- ecall
  3c2:	00000073          	ecall
- ret
  3c6:	8082                	ret
 
 00000000000003c8 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  3c8:	48b1                	li	a7,12
- ecall
  3ca:	00000073          	ecall
- ret
  3ce:	8082                	ret
 
 00000000000003d0 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  3d0:	48b5                	li	a7,13
- ecall
  3d2:	00000073          	ecall
- ret
  3d6:	8082                	ret
 
 00000000000003d8 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  3d8:	48b9                	li	a7,14
- ecall
  3da:	00000073          	ecall
- ret
  3de:	8082                	ret
 
 00000000000003e0 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3e0:	48d9                	li	a7,22
- ecall
  3e2:	00000073          	ecall
- ret
  3e6:	8082                	ret
 
 00000000000003e8 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3e8:	48dd                	li	a7,23
- ecall
  3ea:	00000073          	ecall
- ret
  3ee:	8082                	ret
 
 00000000000003f0 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  3f0:	48e1                	li	a7,24
- ecall
  3f2:	00000073          	ecall
- ret
  3f6:	8082                	ret
diff --git a/user/forktest.o b/user/forktest.o
index f6f9dc062407fccaef4162ccdcbca0bb7c65241f..89cc5d555221377cf30fc6474cf8af84a2cb44b1 100644
Binary files a/user/forktest.o and b/user/forktest.o differ
diff --git a/user/grep.asm b/user/grep.asm
index 397cb5207da6f3c2e493d47a6f84332c64f6a170..1ba66e77af5cf2aa03cf6a5e872785dbfd74256d 100644
--- a/user/grep.asm
+++ b/user/grep.asm
@@ -742,245 +742,123 @@ memcpy(void *dst, const void *src, uint n)
  4ba:	8082                	ret
 
 00000000000004bc <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  4bc:	4885                	li	a7,1
- ecall
  4be:	00000073          	ecall
- ret
  4c2:	8082                	ret
 
 00000000000004c4 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  4c4:	4889                	li	a7,2
- ecall
  4c6:	00000073          	ecall
- ret
  4ca:	8082                	ret
 
 00000000000004cc <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  4cc:	488d                	li	a7,3
- ecall
  4ce:	00000073          	ecall
- ret
  4d2:	8082                	ret
 
 00000000000004d4 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  4d4:	4891                	li	a7,4
- ecall
  4d6:	00000073          	ecall
- ret
  4da:	8082                	ret
 
 00000000000004dc <read>:
-.global read
-read:
- li a7, SYS_read
  4dc:	4895                	li	a7,5
- ecall
  4de:	00000073          	ecall
- ret
  4e2:	8082                	ret
 
 00000000000004e4 <write>:
-.global write
-write:
- li a7, SYS_write
  4e4:	48c1                	li	a7,16
- ecall
  4e6:	00000073          	ecall
- ret
  4ea:	8082                	ret
 
 00000000000004ec <close>:
-.global close
-close:
- li a7, SYS_close
  4ec:	48d5                	li	a7,21
- ecall
  4ee:	00000073          	ecall
- ret
  4f2:	8082                	ret
 
 00000000000004f4 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  4f4:	4899                	li	a7,6
- ecall
  4f6:	00000073          	ecall
- ret
  4fa:	8082                	ret
 
 00000000000004fc <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  4fc:	489d                	li	a7,7
- ecall
  4fe:	00000073          	ecall
- ret
  502:	8082                	ret
 
 0000000000000504 <open>:
-.global open
-open:
- li a7, SYS_open
  504:	48bd                	li	a7,15
- ecall
  506:	00000073          	ecall
- ret
  50a:	8082                	ret
 
 000000000000050c <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  50c:	48c5                	li	a7,17
- ecall
  50e:	00000073          	ecall
- ret
  512:	8082                	ret
 
 0000000000000514 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  514:	48c9                	li	a7,18
- ecall
  516:	00000073          	ecall
- ret
  51a:	8082                	ret
 
 000000000000051c <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  51c:	48a1                	li	a7,8
- ecall
  51e:	00000073          	ecall
- ret
  522:	8082                	ret
 
 0000000000000524 <link>:
-.global link
-link:
- li a7, SYS_link
  524:	48cd                	li	a7,19
- ecall
  526:	00000073          	ecall
- ret
  52a:	8082                	ret
 
 000000000000052c <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  52c:	48d1                	li	a7,20
- ecall
  52e:	00000073          	ecall
- ret
  532:	8082                	ret
 
 0000000000000534 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  534:	48a5                	li	a7,9
- ecall
  536:	00000073          	ecall
- ret
  53a:	8082                	ret
 
 000000000000053c <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  53c:	48a9                	li	a7,10
- ecall
  53e:	00000073          	ecall
- ret
  542:	8082                	ret
 
 0000000000000544 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  544:	48ad                	li	a7,11
- ecall
  546:	00000073          	ecall
- ret
  54a:	8082                	ret
 
 000000000000054c <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  54c:	48b1                	li	a7,12
- ecall
  54e:	00000073          	ecall
- ret
  552:	8082                	ret
 
 0000000000000554 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  554:	48b5                	li	a7,13
- ecall
  556:	00000073          	ecall
- ret
  55a:	8082                	ret
 
 000000000000055c <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  55c:	48b9                	li	a7,14
- ecall
  55e:	00000073          	ecall
- ret
  562:	8082                	ret
 
 0000000000000564 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  564:	48d9                	li	a7,22
- ecall
  566:	00000073          	ecall
- ret
  56a:	8082                	ret
 
 000000000000056c <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  56c:	48dd                	li	a7,23
- ecall
  56e:	00000073          	ecall
- ret
  572:	8082                	ret
 
 0000000000000574 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  574:	48e1                	li	a7,24
- ecall
  576:	00000073          	ecall
- ret
  57a:	8082                	ret
 
 000000000000057c <putc>:
@@ -1523,184 +1401,113 @@ printf(const char *fmt, ...)
  924:	8082                	ret
 
 0000000000000926 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  926:	1141                	addi	sp,sp,-16
  928:	e422                	sd	s0,8(sp)
  92a:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  92c:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  930:	00000797          	auipc	a5,0x0
  934:	6d07b783          	ld	a5,1744(a5) # 1000 <freep>
  938:	a02d                	j	962 <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;
  93a:	4618                	lw	a4,8(a2)
  93c:	9f2d                	addw	a4,a4,a1
  93e:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  942:	6398                	ld	a4,0(a5)
  944:	6310                	ld	a2,0(a4)
  946:	a83d                	j	984 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  948:	ff852703          	lw	a4,-8(a0)
  94c:	9f31                	addw	a4,a4,a2
  94e:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  950:	ff053683          	ld	a3,-16(a0)
  954:	a091                	j	998 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  956:	6398                	ld	a4,0(a5)
  958:	00e7e463          	bltu	a5,a4,960 <free+0x3a>
  95c:	00e6ea63          	bltu	a3,a4,970 <free+0x4a>
-{
  960:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  962:	fed7fae3          	bgeu	a5,a3,956 <free+0x30>
  966:	6398                	ld	a4,0(a5)
  968:	00e6e463          	bltu	a3,a4,970 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  96c:	fee7eae3          	bltu	a5,a4,960 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  970:	ff852583          	lw	a1,-8(a0)
  974:	6390                	ld	a2,0(a5)
  976:	02059813          	slli	a6,a1,0x20
  97a:	01c85713          	srli	a4,a6,0x1c
  97e:	9736                	add	a4,a4,a3
  980:	fae60de3          	beq	a2,a4,93a <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  984:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  988:	4790                	lw	a2,8(a5)
  98a:	02061593          	slli	a1,a2,0x20
  98e:	01c5d713          	srli	a4,a1,0x1c
  992:	973e                	add	a4,a4,a5
  994:	fae68ae3          	beq	a3,a4,948 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  998:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  99a:	00000717          	auipc	a4,0x0
  99e:	66f73323          	sd	a5,1638(a4) # 1000 <freep>
-}
  9a2:	6422                	ld	s0,8(sp)
  9a4:	0141                	addi	sp,sp,16
  9a6:	8082                	ret
 
 00000000000009a8 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  9a8:	7139                	addi	sp,sp,-64
  9aa:	fc06                	sd	ra,56(sp)
  9ac:	f822                	sd	s0,48(sp)
  9ae:	f426                	sd	s1,40(sp)
  9b0:	ec4e                	sd	s3,24(sp)
  9b2:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  9b4:	02051493          	slli	s1,a0,0x20
  9b8:	9081                	srli	s1,s1,0x20
  9ba:	04bd                	addi	s1,s1,15
  9bc:	8091                	srli	s1,s1,0x4
  9be:	0014899b          	addiw	s3,s1,1
  9c2:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  9c4:	00000517          	auipc	a0,0x0
  9c8:	63c53503          	ld	a0,1596(a0) # 1000 <freep>
  9cc:	c915                	beqz	a0,a00 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  9ce:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  9d0:	4798                	lw	a4,8(a5)
  9d2:	08977a63          	bgeu	a4,s1,a66 <malloc+0xbe>
  9d6:	f04a                	sd	s2,32(sp)
  9d8:	e852                	sd	s4,16(sp)
  9da:	e456                	sd	s5,8(sp)
  9dc:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  9de:	8a4e                	mv	s4,s3
  9e0:	0009871b          	sext.w	a4,s3
  9e4:	6685                	lui	a3,0x1
  9e6:	00d77363          	bgeu	a4,a3,9ec <malloc+0x44>
  9ea:	6a05                	lui	s4,0x1
  9ec:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  9f0:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  9f4:	00000917          	auipc	s2,0x0
  9f8:	60c90913          	addi	s2,s2,1548 # 1000 <freep>
-  if(p == (char*)-1)
  9fc:	5afd                	li	s5,-1
  9fe:	a081                	j	a3e <malloc+0x96>
  a00:	f04a                	sd	s2,32(sp)
  a02:	e852                	sd	s4,16(sp)
  a04:	e456                	sd	s5,8(sp)
  a06:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  a08:	00001797          	auipc	a5,0x1
  a0c:	a0878793          	addi	a5,a5,-1528 # 1410 <base>
  a10:	00000717          	auipc	a4,0x0
  a14:	5ef73823          	sd	a5,1520(a4) # 1000 <freep>
  a18:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  a1a:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  a1e:	b7c1                	j	9de <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  a20:	6398                	ld	a4,0(a5)
  a22:	e118                	sd	a4,0(a0)
  a24:	a8a9                	j	a7e <malloc+0xd6>
-  hp->s.size = nu;
  a26:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  a2a:	0541                	addi	a0,a0,16
  a2c:	efbff0ef          	jal	926 <free>
-  return freep;
  a30:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  a34:	c12d                	beqz	a0,a96 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  a36:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  a38:	4798                	lw	a4,8(a5)
  a3a:	02977263          	bgeu	a4,s1,a5e <malloc+0xb6>
-    if(p == freep)
  a3e:	00093703          	ld	a4,0(s2)
  a42:	853e                	mv	a0,a5
  a44:	fef719e3          	bne	a4,a5,a36 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  a48:	8552                	mv	a0,s4
  a4a:	b03ff0ef          	jal	54c <sbrk>
-  if(p == (char*)-1)
  a4e:	fd551ce3          	bne	a0,s5,a26 <malloc+0x7e>
-        return 0;
  a52:	4501                	li	a0,0
  a54:	7902                	ld	s2,32(sp)
  a56:	6a42                	ld	s4,16(sp)
@@ -1711,24 +1518,16 @@ malloc(uint nbytes)
  a60:	6a42                	ld	s4,16(sp)
  a62:	6aa2                	ld	s5,8(sp)
  a64:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  a66:	fae48de3          	beq	s1,a4,a20 <malloc+0x78>
-        p->s.size -= nunits;
  a6a:	4137073b          	subw	a4,a4,s3
  a6e:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  a70:	02071693          	slli	a3,a4,0x20
  a74:	01c6d713          	srli	a4,a3,0x1c
  a78:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  a7a:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  a7e:	00000717          	auipc	a4,0x0
  a82:	58a73123          	sd	a0,1410(a4) # 1000 <freep>
-      return (void*)(p + 1);
  a86:	01078513          	addi	a0,a5,16
-  }
-}
  a8a:	70e2                	ld	ra,56(sp)
  a8c:	7442                	ld	s0,48(sp)
  a8e:	74a2                	ld	s1,40(sp)
diff --git a/user/grep.o b/user/grep.o
index ef16acbfe9bf9d8e43eb025abe0d23cf2b2ddce4..1904f0168de5e190a0b49bf919fc292a19853c6d 100644
Binary files a/user/grep.o and b/user/grep.o differ
diff --git a/user/grind.asm b/user/grind.asm
index aec88588bbebf7fdcee5c937df7b00dc449f8ce9..589651e64cc9aa783c56e5f79f210089a52a29c1 100644
--- a/user/grind.asm
+++ b/user/grind.asm
@@ -1095,50 +1095,87 @@ main()
      8e2:	b7d5                	j	8c6 <main+0x18>
 
 00000000000008e4 <start>:
+// 
+// wrapper so that it's OK if main() does not call exit().
+//
+void
+start()
+{
      8e4:	1141                	addi	sp,sp,-16
      8e6:	e406                	sd	ra,8(sp)
      8e8:	e022                	sd	s0,0(sp)
      8ea:	0800                	addi	s0,sp,16
+  extern int main();
+  main();
      8ec:	fc3ff0ef          	jal	8ae <main>
+  exit(0);
      8f0:	4501                	li	a0,0
      8f2:	25c000ef          	jal	b4e <exit>
 
 00000000000008f6 <strcpy>:
+}
+
+char*
+strcpy(char *s, const char *t)
+{
      8f6:	1141                	addi	sp,sp,-16
      8f8:	e422                	sd	s0,8(sp)
      8fa:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
      8fc:	87aa                	mv	a5,a0
      8fe:	0585                	addi	a1,a1,1
      900:	0785                	addi	a5,a5,1
      902:	fff5c703          	lbu	a4,-1(a1)
      906:	fee78fa3          	sb	a4,-1(a5)
      90a:	fb75                	bnez	a4,8fe <strcpy+0x8>
+    ;
+  return os;
+}
      90c:	6422                	ld	s0,8(sp)
      90e:	0141                	addi	sp,sp,16
      910:	8082                	ret
 
 0000000000000912 <strcmp>:
+
+int
+strcmp(const char *p, const char *q)
+{
      912:	1141                	addi	sp,sp,-16
      914:	e422                	sd	s0,8(sp)
      916:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
      918:	00054783          	lbu	a5,0(a0)
      91c:	cb91                	beqz	a5,930 <strcmp+0x1e>
      91e:	0005c703          	lbu	a4,0(a1)
      922:	00f71763          	bne	a4,a5,930 <strcmp+0x1e>
+    p++, q++;
      926:	0505                	addi	a0,a0,1
      928:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
      92a:	00054783          	lbu	a5,0(a0)
      92e:	fbe5                	bnez	a5,91e <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
      930:	0005c503          	lbu	a0,0(a1)
+}
      934:	40a7853b          	subw	a0,a5,a0
      938:	6422                	ld	s0,8(sp)
      93a:	0141                	addi	sp,sp,16
      93c:	8082                	ret
 
 000000000000093e <strlen>:
+
+uint
+strlen(const char *s)
+{
      93e:	1141                	addi	sp,sp,-16
      940:	e422                	sd	s0,8(sp)
      942:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
      944:	00054783          	lbu	a5,0(a0)
      948:	cf91                	beqz	a5,964 <strlen+0x26>
      94a:	0505                	addi	a0,a0,1
@@ -1149,46 +1186,77 @@ main()
      956:	ff65                	bnez	a4,94e <strlen+0x10>
      958:	40a6853b          	subw	a0,a3,a0
      95c:	2505                	addiw	a0,a0,1
+    ;
+  return n;
+}
      95e:	6422                	ld	s0,8(sp)
      960:	0141                	addi	sp,sp,16
      962:	8082                	ret
+  for(n = 0; s[n]; n++)
      964:	4501                	li	a0,0
      966:	bfe5                	j	95e <strlen+0x20>
 
 0000000000000968 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
      968:	1141                	addi	sp,sp,-16
      96a:	e422                	sd	s0,8(sp)
      96c:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
      96e:	ca19                	beqz	a2,984 <memset+0x1c>
      970:	87aa                	mv	a5,a0
      972:	1602                	slli	a2,a2,0x20
      974:	9201                	srli	a2,a2,0x20
      976:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
      97a:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
      97e:	0785                	addi	a5,a5,1
      980:	fee79de3          	bne	a5,a4,97a <memset+0x12>
+  }
+  return dst;
+}
      984:	6422                	ld	s0,8(sp)
      986:	0141                	addi	sp,sp,16
      988:	8082                	ret
 
 000000000000098a <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
      98a:	1141                	addi	sp,sp,-16
      98c:	e422                	sd	s0,8(sp)
      98e:	0800                	addi	s0,sp,16
+  for(; *s; s++)
      990:	00054783          	lbu	a5,0(a0)
      994:	cb99                	beqz	a5,9aa <strchr+0x20>
+    if(*s == c)
      996:	00f58763          	beq	a1,a5,9a4 <strchr+0x1a>
+  for(; *s; s++)
      99a:	0505                	addi	a0,a0,1
      99c:	00054783          	lbu	a5,0(a0)
      9a0:	fbfd                	bnez	a5,996 <strchr+0xc>
+      return (char*)s;
+  return 0;
      9a2:	4501                	li	a0,0
+}
      9a4:	6422                	ld	s0,8(sp)
      9a6:	0141                	addi	sp,sp,16
      9a8:	8082                	ret
+  return 0;
      9aa:	4501                	li	a0,0
      9ac:	bfe5                	j	9a4 <strchr+0x1a>
 
 00000000000009ae <gets>:
+
+char*
+gets(char *buf, int max)
+{
      9ae:	711d                	addi	sp,sp,-96
      9b0:	ec86                	sd	ra,88(sp)
      9b2:	e8a2                	sd	s0,80(sp)
@@ -1202,28 +1270,48 @@ main()
      9c2:	1080                	addi	s0,sp,96
      9c4:	8baa                	mv	s7,a0
      9c6:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
      9c8:	892a                	mv	s2,a0
      9ca:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
      9cc:	4aa9                	li	s5,10
      9ce:	4b35                	li	s6,13
+  for(i=0; i+1 < max; ){
      9d0:	89a6                	mv	s3,s1
      9d2:	2485                	addiw	s1,s1,1
      9d4:	0344d663          	bge	s1,s4,a00 <gets+0x52>
+    cc = read(0, &c, 1);
      9d8:	4605                	li	a2,1
      9da:	faf40593          	addi	a1,s0,-81
      9de:	4501                	li	a0,0
      9e0:	186000ef          	jal	b66 <read>
+    if(cc < 1)
      9e4:	00a05e63          	blez	a0,a00 <gets+0x52>
+    buf[i++] = c;
      9e8:	faf44783          	lbu	a5,-81(s0)
      9ec:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
      9f0:	01578763          	beq	a5,s5,9fe <gets+0x50>
      9f4:	0905                	addi	s2,s2,1
      9f6:	fd679de3          	bne	a5,s6,9d0 <gets+0x22>
+    buf[i++] = c;
      9fa:	89a6                	mv	s3,s1
      9fc:	a011                	j	a00 <gets+0x52>
      9fe:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
      a00:	99de                	add	s3,s3,s7
      a02:	00098023          	sb	zero,0(s3)
+  return buf;
+}
      a06:	855e                	mv	a0,s7
      a08:	60e6                	ld	ra,88(sp)
      a0a:	6446                	ld	s0,80(sp)
@@ -1238,123 +1326,200 @@ main()
      a1c:	8082                	ret
 
 0000000000000a1e <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
      a1e:	1101                	addi	sp,sp,-32
      a20:	ec06                	sd	ra,24(sp)
      a22:	e822                	sd	s0,16(sp)
      a24:	e04a                	sd	s2,0(sp)
      a26:	1000                	addi	s0,sp,32
      a28:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
      a2a:	4581                	li	a1,0
      a2c:	162000ef          	jal	b8e <open>
+  if(fd < 0)
      a30:	02054263          	bltz	a0,a54 <stat+0x36>
      a34:	e426                	sd	s1,8(sp)
      a36:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
      a38:	85ca                	mv	a1,s2
      a3a:	16c000ef          	jal	ba6 <fstat>
      a3e:	892a                	mv	s2,a0
+  close(fd);
      a40:	8526                	mv	a0,s1
      a42:	134000ef          	jal	b76 <close>
+  return r;
      a46:	64a2                	ld	s1,8(sp)
+}
      a48:	854a                	mv	a0,s2
      a4a:	60e2                	ld	ra,24(sp)
      a4c:	6442                	ld	s0,16(sp)
      a4e:	6902                	ld	s2,0(sp)
      a50:	6105                	addi	sp,sp,32
      a52:	8082                	ret
+    return -1;
      a54:	597d                	li	s2,-1
      a56:	bfcd                	j	a48 <stat+0x2a>
 
 0000000000000a58 <atoi>:
+
+int
+atoi(const char *s)
+{
      a58:	1141                	addi	sp,sp,-16
      a5a:	e422                	sd	s0,8(sp)
      a5c:	0800                	addi	s0,sp,16
+  int n;
+
+  n = 0;
+  while('0' <= *s && *s <= '9')
      a5e:	00054683          	lbu	a3,0(a0)
      a62:	fd06879b          	addiw	a5,a3,-48
      a66:	0ff7f793          	zext.b	a5,a5
      a6a:	4625                	li	a2,9
      a6c:	02f66863          	bltu	a2,a5,a9c <atoi+0x44>
      a70:	872a                	mv	a4,a0
+  n = 0;
      a72:	4501                	li	a0,0
+    n = n*10 + *s++ - '0';
      a74:	0705                	addi	a4,a4,1
      a76:	0025179b          	slliw	a5,a0,0x2
      a7a:	9fa9                	addw	a5,a5,a0
      a7c:	0017979b          	slliw	a5,a5,0x1
      a80:	9fb5                	addw	a5,a5,a3
      a82:	fd07851b          	addiw	a0,a5,-48
+  while('0' <= *s && *s <= '9')
      a86:	00074683          	lbu	a3,0(a4)
      a8a:	fd06879b          	addiw	a5,a3,-48
      a8e:	0ff7f793          	zext.b	a5,a5
      a92:	fef671e3          	bgeu	a2,a5,a74 <atoi+0x1c>
+  return n;
+}
      a96:	6422                	ld	s0,8(sp)
      a98:	0141                	addi	sp,sp,16
      a9a:	8082                	ret
+  n = 0;
      a9c:	4501                	li	a0,0
      a9e:	bfe5                	j	a96 <atoi+0x3e>
 
 0000000000000aa0 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
      aa0:	1141                	addi	sp,sp,-16
      aa2:	e422                	sd	s0,8(sp)
      aa4:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
      aa6:	02b57463          	bgeu	a0,a1,ace <memmove+0x2e>
+    while(n-- > 0)
      aaa:	00c05f63          	blez	a2,ac8 <memmove+0x28>
      aae:	1602                	slli	a2,a2,0x20
      ab0:	9201                	srli	a2,a2,0x20
      ab2:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
      ab6:	872a                	mv	a4,a0
+      *dst++ = *src++;
      ab8:	0585                	addi	a1,a1,1
      aba:	0705                	addi	a4,a4,1
      abc:	fff5c683          	lbu	a3,-1(a1)
      ac0:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
      ac4:	fef71ae3          	bne	a4,a5,ab8 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
      ac8:	6422                	ld	s0,8(sp)
      aca:	0141                	addi	sp,sp,16
      acc:	8082                	ret
+    dst += n;
      ace:	00c50733          	add	a4,a0,a2
+    src += n;
      ad2:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
      ad4:	fec05ae3          	blez	a2,ac8 <memmove+0x28>
      ad8:	fff6079b          	addiw	a5,a2,-1
      adc:	1782                	slli	a5,a5,0x20
      ade:	9381                	srli	a5,a5,0x20
      ae0:	fff7c793          	not	a5,a5
      ae4:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
      ae6:	15fd                	addi	a1,a1,-1
      ae8:	177d                	addi	a4,a4,-1
      aea:	0005c683          	lbu	a3,0(a1)
      aee:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
      af2:	fee79ae3          	bne	a5,a4,ae6 <memmove+0x46>
      af6:	bfc9                	j	ac8 <memmove+0x28>
 
 0000000000000af8 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
      af8:	1141                	addi	sp,sp,-16
      afa:	e422                	sd	s0,8(sp)
      afc:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
      afe:	ca05                	beqz	a2,b2e <memcmp+0x36>
      b00:	fff6069b          	addiw	a3,a2,-1
      b04:	1682                	slli	a3,a3,0x20
      b06:	9281                	srli	a3,a3,0x20
      b08:	0685                	addi	a3,a3,1
      b0a:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
      b0c:	00054783          	lbu	a5,0(a0)
      b10:	0005c703          	lbu	a4,0(a1)
      b14:	00e79863          	bne	a5,a4,b24 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
      b18:	0505                	addi	a0,a0,1
+    p2++;
      b1a:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
      b1c:	fed518e3          	bne	a0,a3,b0c <memcmp+0x14>
+  }
+  return 0;
      b20:	4501                	li	a0,0
      b22:	a019                	j	b28 <memcmp+0x30>
+      return *p1 - *p2;
      b24:	40e7853b          	subw	a0,a5,a4
+}
      b28:	6422                	ld	s0,8(sp)
      b2a:	0141                	addi	sp,sp,16
      b2c:	8082                	ret
+  return 0;
      b2e:	4501                	li	a0,0
      b30:	bfe5                	j	b28 <memcmp+0x30>
 
 0000000000000b32 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
      b32:	1141                	addi	sp,sp,-16
      b34:	e406                	sd	ra,8(sp)
      b36:	e022                	sd	s0,0(sp)
      b38:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
      b3a:	f67ff0ef          	jal	aa0 <memmove>
+}
      b3e:	60a2                	ld	ra,8(sp)
      b40:	6402                	ld	s0,0(sp)
      b42:	0141                	addi	sp,sp,16
@@ -1481,32 +1646,60 @@ main()
      c04:	8082                	ret
 
 0000000000000c06 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
      c06:	1101                	addi	sp,sp,-32
      c08:	ec06                	sd	ra,24(sp)
      c0a:	e822                	sd	s0,16(sp)
      c0c:	1000                	addi	s0,sp,32
      c0e:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
      c12:	4605                	li	a2,1
      c14:	fef40593          	addi	a1,s0,-17
      c18:	f57ff0ef          	jal	b6e <write>
+}
      c1c:	60e2                	ld	ra,24(sp)
      c1e:	6442                	ld	s0,16(sp)
      c20:	6105                	addi	sp,sp,32
      c22:	8082                	ret
 
 0000000000000c24 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
      c24:	7139                	addi	sp,sp,-64
      c26:	fc06                	sd	ra,56(sp)
      c28:	f822                	sd	s0,48(sp)
      c2a:	f426                	sd	s1,40(sp)
      c2c:	0080                	addi	s0,sp,64
      c2e:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
      c30:	c299                	beqz	a3,c36 <printint+0x12>
      c32:	0805c963          	bltz	a1,cc4 <printint+0xa0>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
      c36:	2581                	sext.w	a1,a1
+  neg = 0;
      c38:	4881                	li	a7,0
      c3a:	fc040693          	addi	a3,s0,-64
+  }
+
+  i = 0;
      c3e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
      c40:	2601                	sext.w	a2,a2
      c42:	00001517          	auipc	a0,0x1
      c46:	85e50513          	addi	a0,a0,-1954 # 14a0 <digits>
@@ -1518,16 +1711,21 @@ main()
      c56:	97aa                	add	a5,a5,a0
      c58:	0007c783          	lbu	a5,0(a5)
      c5c:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
      c60:	0005879b          	sext.w	a5,a1
      c64:	02c5d5bb          	divuw	a1,a1,a2
      c68:	0685                	addi	a3,a3,1
      c6a:	fec7f0e3          	bgeu	a5,a2,c4a <printint+0x26>
+  if(neg)
      c6e:	00088c63          	beqz	a7,c86 <printint+0x62>
+    buf[i++] = '-';
      c72:	fd070793          	addi	a5,a4,-48
      c76:	00878733          	add	a4,a5,s0
      c7a:	02d00793          	li	a5,45
      c7e:	fef70823          	sb	a5,-16(a4)
      c82:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
      c86:	02e05a63          	blez	a4,cba <printint+0x96>
      c8a:	f04a                	sd	s2,32(sp)
      c8c:	ec4e                	sd	s3,24(sp)
@@ -1539,28 +1737,45 @@ main()
      c9e:	1702                	slli	a4,a4,0x20
      ca0:	9301                	srli	a4,a4,0x20
      ca2:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
      ca6:	fff94583          	lbu	a1,-1(s2)
      caa:	8526                	mv	a0,s1
      cac:	f5bff0ef          	jal	c06 <putc>
+  while(--i >= 0)
      cb0:	197d                	addi	s2,s2,-1
      cb2:	ff391ae3          	bne	s2,s3,ca6 <printint+0x82>
      cb6:	7902                	ld	s2,32(sp)
      cb8:	69e2                	ld	s3,24(sp)
+}
      cba:	70e2                	ld	ra,56(sp)
      cbc:	7442                	ld	s0,48(sp)
      cbe:	74a2                	ld	s1,40(sp)
      cc0:	6121                	addi	sp,sp,64
      cc2:	8082                	ret
+    x = -xx;
      cc4:	40b005bb          	negw	a1,a1
+    neg = 1;
      cc8:	4885                	li	a7,1
+    x = -xx;
      cca:	bf85                	j	c3a <printint+0x16>
 
 0000000000000ccc <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
      ccc:	711d                	addi	sp,sp,-96
      cce:	ec86                	sd	ra,88(sp)
      cd0:	e8a2                	sd	s0,80(sp)
      cd2:	e0ca                	sd	s2,64(sp)
      cd4:	1080                	addi	s0,sp,96
+  char *s;
+  int c0, c1, c2, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
      cd6:	0005c903          	lbu	s2,0(a1)
      cda:	26090863          	beqz	s2,f4a <vprintf+0x27e>
      cde:	e4a6                	sd	s1,72(sp)
@@ -1574,51 +1789,110 @@ main()
      cee:	8b2a                	mv	s6,a0
      cf0:	8a2e                	mv	s4,a1
      cf2:	8bb2                	mv	s7,a2
+  state = 0;
      cf4:	4981                	li	s3,0
+  for(i = 0; fmt[i]; i++){
      cf6:	4481                	li	s1,0
      cf8:	4701                	li	a4,0
+      if(c0 == '%'){
+        state = '%';
+      } else {
+        putc(fd, c0);
+      }
+    } else if(state == '%'){
      cfa:	02500a93          	li	s5,37
+      c1 = c2 = 0;
+      if(c0) c1 = fmt[i+1] & 0xff;
+      if(c1) c2 = fmt[i+2] & 0xff;
+      if(c0 == 'd'){
      cfe:	06400c13          	li	s8,100
+        printint(fd, va_arg(ap, int), 10, 1);
+      } else if(c0 == 'l' && c1 == 'd'){
      d02:	06c00c93          	li	s9,108
      d06:	a005                	j	d26 <vprintf+0x5a>
+        putc(fd, c0);
      d08:	85ca                	mv	a1,s2
      d0a:	855a                	mv	a0,s6
      d0c:	efbff0ef          	jal	c06 <putc>
      d10:	a019                	j	d16 <vprintf+0x4a>
+    } else if(state == '%'){
      d12:	03598263          	beq	s3,s5,d36 <vprintf+0x6a>
+  for(i = 0; fmt[i]; i++){
      d16:	2485                	addiw	s1,s1,1
      d18:	8726                	mv	a4,s1
      d1a:	009a07b3          	add	a5,s4,s1
      d1e:	0007c903          	lbu	s2,0(a5)
      d22:	20090c63          	beqz	s2,f3a <vprintf+0x26e>
+    c0 = fmt[i] & 0xff;
      d26:	0009079b          	sext.w	a5,s2
+    if(state == 0){
      d2a:	fe0994e3          	bnez	s3,d12 <vprintf+0x46>
+      if(c0 == '%'){
      d2e:	fd579de3          	bne	a5,s5,d08 <vprintf+0x3c>
+        state = '%';
      d32:	89be                	mv	s3,a5
      d34:	b7cd                	j	d16 <vprintf+0x4a>
+      if(c0) c1 = fmt[i+1] & 0xff;
      d36:	00ea06b3          	add	a3,s4,a4
      d3a:	0016c683          	lbu	a3,1(a3)
+      c1 = c2 = 0;
      d3e:	8636                	mv	a2,a3
+      if(c1) c2 = fmt[i+2] & 0xff;
      d40:	c681                	beqz	a3,d48 <vprintf+0x7c>
      d42:	9752                	add	a4,a4,s4
      d44:	00274603          	lbu	a2,2(a4)
+      if(c0 == 'd'){
      d48:	03878f63          	beq	a5,s8,d86 <vprintf+0xba>
+      } else if(c0 == 'l' && c1 == 'd'){
      d4c:	05978963          	beq	a5,s9,d9e <vprintf+0xd2>
+        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'){
      d50:	07500713          	li	a4,117
      d54:	0ee78363          	beq	a5,a4,e3a <vprintf+0x16e>
+        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'){
      d58:	07800713          	li	a4,120
      d5c:	12e78563          	beq	a5,a4,e86 <vprintf+0x1ba>
+        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'){
      d60:	07000713          	li	a4,112
      d64:	14e78a63          	beq	a5,a4,eb8 <vprintf+0x1ec>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c0 == 's'){
      d68:	07300713          	li	a4,115
      d6c:	18e78a63          	beq	a5,a4,f00 <vprintf+0x234>
+        if((s = va_arg(ap, char*)) == 0)
+          s = "(null)";
+        for(; *s; s++)
+          putc(fd, *s);
+      } else if(c0 == '%'){
      d70:	02500713          	li	a4,37
      d74:	04e79563          	bne	a5,a4,dbe <vprintf+0xf2>
+        putc(fd, '%');
      d78:	02500593          	li	a1,37
      d7c:	855a                	mv	a0,s6
      d7e:	e89ff0ef          	jal	c06 <putc>
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+#endif
+      state = 0;
      d82:	4981                	li	s3,0
      d84:	bf49                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 1);
      d86:	008b8913          	addi	s2,s7,8
      d8a:	4685                	li	a3,1
      d8c:	4629                	li	a2,10
@@ -1626,60 +1900,87 @@ main()
      d92:	855a                	mv	a0,s6
      d94:	e91ff0ef          	jal	c24 <printint>
      d98:	8bca                	mv	s7,s2
+      state = 0;
      d9a:	4981                	li	s3,0
      d9c:	bfad                	j	d16 <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'd'){
      d9e:	06400793          	li	a5,100
      da2:	02f68963          	beq	a3,a5,dd4 <vprintf+0x108>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
      da6:	06c00793          	li	a5,108
      daa:	04f68263          	beq	a3,a5,dee <vprintf+0x122>
+      } else if(c0 == 'l' && c1 == 'u'){
      dae:	07500793          	li	a5,117
      db2:	0af68063          	beq	a3,a5,e52 <vprintf+0x186>
+      } else if(c0 == 'l' && c1 == 'x'){
      db6:	07800793          	li	a5,120
      dba:	0ef68263          	beq	a3,a5,e9e <vprintf+0x1d2>
+        putc(fd, '%');
      dbe:	02500593          	li	a1,37
      dc2:	855a                	mv	a0,s6
      dc4:	e43ff0ef          	jal	c06 <putc>
+        putc(fd, c0);
      dc8:	85ca                	mv	a1,s2
      dca:	855a                	mv	a0,s6
      dcc:	e3bff0ef          	jal	c06 <putc>
+      state = 0;
      dd0:	4981                	li	s3,0
      dd2:	b791                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
      dd4:	008b8913          	addi	s2,s7,8
      dd8:	4685                	li	a3,1
      dda:	4629                	li	a2,10
      ddc:	000ba583          	lw	a1,0(s7)
      de0:	855a                	mv	a0,s6
      de2:	e43ff0ef          	jal	c24 <printint>
+        i += 1;
      de6:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 1);
      de8:	8bca                	mv	s7,s2
+      state = 0;
      dea:	4981                	li	s3,0
+        i += 1;
      dec:	b72d                	j	d16 <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
      dee:	06400793          	li	a5,100
      df2:	02f60763          	beq	a2,a5,e20 <vprintf+0x154>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
      df6:	07500793          	li	a5,117
      dfa:	06f60963          	beq	a2,a5,e6c <vprintf+0x1a0>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
      dfe:	07800793          	li	a5,120
      e02:	faf61ee3          	bne	a2,a5,dbe <vprintf+0xf2>
+        printint(fd, va_arg(ap, uint64), 16, 0);
      e06:	008b8913          	addi	s2,s7,8
      e0a:	4681                	li	a3,0
      e0c:	4641                	li	a2,16
      e0e:	000ba583          	lw	a1,0(s7)
      e12:	855a                	mv	a0,s6
      e14:	e11ff0ef          	jal	c24 <printint>
+        i += 2;
      e18:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 16, 0);
      e1a:	8bca                	mv	s7,s2
+      state = 0;
      e1c:	4981                	li	s3,0
+        i += 2;
      e1e:	bde5                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
      e20:	008b8913          	addi	s2,s7,8
      e24:	4685                	li	a3,1
      e26:	4629                	li	a2,10
      e28:	000ba583          	lw	a1,0(s7)
      e2c:	855a                	mv	a0,s6
      e2e:	df7ff0ef          	jal	c24 <printint>
+        i += 2;
      e32:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 1);
      e34:	8bca                	mv	s7,s2
+      state = 0;
      e36:	4981                	li	s3,0
+        i += 2;
      e38:	bdf9                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 0);
      e3a:	008b8913          	addi	s2,s7,8
      e3e:	4681                	li	a3,0
      e40:	4629                	li	a2,10
@@ -1687,28 +1988,40 @@ main()
      e46:	855a                	mv	a0,s6
      e48:	dddff0ef          	jal	c24 <printint>
      e4c:	8bca                	mv	s7,s2
+      state = 0;
      e4e:	4981                	li	s3,0
      e50:	b5d9                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
      e52:	008b8913          	addi	s2,s7,8
      e56:	4681                	li	a3,0
      e58:	4629                	li	a2,10
      e5a:	000ba583          	lw	a1,0(s7)
      e5e:	855a                	mv	a0,s6
      e60:	dc5ff0ef          	jal	c24 <printint>
+        i += 1;
      e64:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 0);
      e66:	8bca                	mv	s7,s2
+      state = 0;
      e68:	4981                	li	s3,0
+        i += 1;
      e6a:	b575                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
      e6c:	008b8913          	addi	s2,s7,8
      e70:	4681                	li	a3,0
      e72:	4629                	li	a2,10
      e74:	000ba583          	lw	a1,0(s7)
      e78:	855a                	mv	a0,s6
      e7a:	dabff0ef          	jal	c24 <printint>
+        i += 2;
      e7e:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 0);
      e80:	8bca                	mv	s7,s2
+      state = 0;
      e82:	4981                	li	s3,0
+        i += 2;
      e84:	bd49                	j	d16 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 16, 0);
      e86:	008b8913          	addi	s2,s7,8
      e8a:	4681                	li	a3,0
      e8c:	4641                	li	a2,16
@@ -1716,28 +2029,38 @@ main()
      e92:	855a                	mv	a0,s6
      e94:	d91ff0ef          	jal	c24 <printint>
      e98:	8bca                	mv	s7,s2
+      state = 0;
      e9a:	4981                	li	s3,0
      e9c:	bdad                	j	d16 <vprintf+0x4a>
+        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:	d79ff0ef          	jal	c24 <printint>
+        i += 1;
      eb0:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 16, 0);
      eb2:	8bca                	mv	s7,s2
+      state = 0;
      eb4:	4981                	li	s3,0
+        i += 1;
      eb6:	b585                	j	d16 <vprintf+0x4a>
      eb8:	e06a                	sd	s10,0(sp)
+        printptr(fd, va_arg(ap, uint64));
      eba:	008b8d13          	addi	s10,s7,8
      ebe:	000bb983          	ld	s3,0(s7)
+  putc(fd, '0');
      ec2:	03000593          	li	a1,48
      ec6:	855a                	mv	a0,s6
      ec8:	d3fff0ef          	jal	c06 <putc>
+  putc(fd, 'x');
      ecc:	07800593          	li	a1,120
      ed0:	855a                	mv	a0,s6
      ed2:	d35ff0ef          	jal	c06 <putc>
      ed6:	4941                	li	s2,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
      ed8:	00000b97          	auipc	s7,0x0
      edc:	5c8b8b93          	addi	s7,s7,1480 # 14a0 <digits>
      ee0:	03c9d793          	srli	a5,s3,0x3c
@@ -1745,31 +2068,44 @@ main()
      ee6:	0007c583          	lbu	a1,0(a5)
      eea:	855a                	mv	a0,s6
      eec:	d1bff0ef          	jal	c06 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
      ef0:	0992                	slli	s3,s3,0x4
      ef2:	397d                	addiw	s2,s2,-1
      ef4:	fe0916e3          	bnez	s2,ee0 <vprintf+0x214>
+        printptr(fd, va_arg(ap, uint64));
      ef8:	8bea                	mv	s7,s10
+      state = 0;
      efa:	4981                	li	s3,0
      efc:	6d02                	ld	s10,0(sp)
      efe:	bd21                	j	d16 <vprintf+0x4a>
+        if((s = va_arg(ap, char*)) == 0)
      f00:	008b8993          	addi	s3,s7,8
      f04:	000bb903          	ld	s2,0(s7)
      f08:	00090f63          	beqz	s2,f26 <vprintf+0x25a>
+        for(; *s; s++)
      f0c:	00094583          	lbu	a1,0(s2)
      f10:	c195                	beqz	a1,f34 <vprintf+0x268>
+          putc(fd, *s);
      f12:	855a                	mv	a0,s6
      f14:	cf3ff0ef          	jal	c06 <putc>
+        for(; *s; s++)
      f18:	0905                	addi	s2,s2,1
      f1a:	00094583          	lbu	a1,0(s2)
      f1e:	f9f5                	bnez	a1,f12 <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
      f20:	8bce                	mv	s7,s3
+      state = 0;
      f22:	4981                	li	s3,0
      f24:	bbcd                	j	d16 <vprintf+0x4a>
+          s = "(null)";
      f26:	00000917          	auipc	s2,0x0
      f2a:	51290913          	addi	s2,s2,1298 # 1438 <malloc+0x406>
+        for(; *s; s++)
      f2e:	02800593          	li	a1,40
      f32:	b7c5                	j	f12 <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
      f34:	8bce                	mv	s7,s3
+      state = 0;
      f36:	4981                	li	s3,0
      f38:	bbf9                	j	d16 <vprintf+0x4a>
      f3a:	64a6                	ld	s1,72(sp)
@@ -1780,6 +2116,9 @@ main()
      f44:	6be2                	ld	s7,24(sp)
      f46:	6c42                	ld	s8,16(sp)
      f48:	6ca2                	ld	s9,8(sp)
+    }
+  }
+}
      f4a:	60e6                	ld	ra,88(sp)
      f4c:	6446                	ld	s0,80(sp)
      f4e:	6906                	ld	s2,64(sp)
@@ -1787,6 +2126,10 @@ main()
      f52:	8082                	ret
 
 0000000000000f54 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
      f54:	715d                	addi	sp,sp,-80
      f56:	ec06                	sd	ra,24(sp)
      f58:	e822                	sd	s0,16(sp)
@@ -1797,15 +2140,24 @@ main()
      f62:	ec1c                	sd	a5,24(s0)
      f64:	03043023          	sd	a6,32(s0)
      f68:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
      f6c:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
      f70:	8622                	mv	a2,s0
      f72:	d5bff0ef          	jal	ccc <vprintf>
+}
      f76:	60e2                	ld	ra,24(sp)
      f78:	6442                	ld	s0,16(sp)
      f7a:	6161                	addi	sp,sp,80
      f7c:	8082                	ret
 
 0000000000000f7e <printf>:
+
+void
+printf(const char *fmt, ...)
+{
      f7e:	711d                	addi	sp,sp,-96
      f80:	ec06                	sd	ra,24(sp)
      f82:	e822                	sd	s0,16(sp)
@@ -1817,11 +2169,16 @@ main()
      f8e:	f41c                	sd	a5,40(s0)
      f90:	03043823          	sd	a6,48(s0)
      f94:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
      f98:	00840613          	addi	a2,s0,8
      f9c:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
      fa0:	85aa                	mv	a1,a0
      fa2:	4505                	li	a0,1
      fa4:	d29ff0ef          	jal	ccc <vprintf>
+}
      fa8:	60e2                	ld	ra,24(sp)
      faa:	6442                	ld	s0,16(sp)
      fac:	6125                	addi	sp,sp,96
diff --git a/user/grind.o b/user/grind.o
index 08b22a84b9592085eae452e9c15750eb015c7e02..db5afaea5b5e4482fd4847be43d796abe9bf8be3 100644
Binary files a/user/grind.o and b/user/grind.o differ
diff --git a/user/init.asm b/user/init.asm
index a681a1c5182c8be4349bb337b8ebab464ffae28e..cc610976730f1ca48d85bf4134c829298520f0c4 100644
--- a/user/init.asm
+++ b/user/init.asm
@@ -537,245 +537,123 @@ memcpy(void *dst, const void *src, uint n)
  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 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3c6:	48d9                	li	a7,22
- ecall
  3c8:	00000073          	ecall
- ret
  3cc:	8082                	ret
 
 00000000000003ce <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3ce:	48dd                	li	a7,23
- ecall
  3d0:	00000073          	ecall
- ret
  3d4:	8082                	ret
 
 00000000000003d6 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  3d6:	48e1                	li	a7,24
- ecall
  3d8:	00000073          	ecall
- ret
  3dc:	8082                	ret
 
 00000000000003de <putc>:
@@ -1318,184 +1196,113 @@ printf(const char *fmt, ...)
  786:	8082                	ret
 
 0000000000000788 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  788:	1141                	addi	sp,sp,-16
  78a:	e422                	sd	s0,8(sp)
  78c:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  78e:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  792:	00001797          	auipc	a5,0x1
  796:	87e7b783          	ld	a5,-1922(a5) # 1010 <freep>
  79a:	a02d                	j	7c4 <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;
  79c:	4618                	lw	a4,8(a2)
  79e:	9f2d                	addw	a4,a4,a1
  7a0:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  7a4:	6398                	ld	a4,0(a5)
  7a6:	6310                	ld	a2,0(a4)
  7a8:	a83d                	j	7e6 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  7aa:	ff852703          	lw	a4,-8(a0)
  7ae:	9f31                	addw	a4,a4,a2
  7b0:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  7b2:	ff053683          	ld	a3,-16(a0)
  7b6:	a091                	j	7fa <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7b8:	6398                	ld	a4,0(a5)
  7ba:	00e7e463          	bltu	a5,a4,7c2 <free+0x3a>
  7be:	00e6ea63          	bltu	a3,a4,7d2 <free+0x4a>
-{
  7c2:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7c4:	fed7fae3          	bgeu	a5,a3,7b8 <free+0x30>
  7c8:	6398                	ld	a4,0(a5)
  7ca:	00e6e463          	bltu	a3,a4,7d2 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7ce:	fee7eae3          	bltu	a5,a4,7c2 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  7d2:	ff852583          	lw	a1,-8(a0)
  7d6:	6390                	ld	a2,0(a5)
  7d8:	02059813          	slli	a6,a1,0x20
  7dc:	01c85713          	srli	a4,a6,0x1c
  7e0:	9736                	add	a4,a4,a3
  7e2:	fae60de3          	beq	a2,a4,79c <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  7e6:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  7ea:	4790                	lw	a2,8(a5)
  7ec:	02061593          	slli	a1,a2,0x20
  7f0:	01c5d713          	srli	a4,a1,0x1c
  7f4:	973e                	add	a4,a4,a5
  7f6:	fae68ae3          	beq	a3,a4,7aa <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7fa:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7fc:	00001717          	auipc	a4,0x1
  800:	80f73a23          	sd	a5,-2028(a4) # 1010 <freep>
-}
  804:	6422                	ld	s0,8(sp)
  806:	0141                	addi	sp,sp,16
  808:	8082                	ret
 
 000000000000080a <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  80a:	7139                	addi	sp,sp,-64
  80c:	fc06                	sd	ra,56(sp)
  80e:	f822                	sd	s0,48(sp)
  810:	f426                	sd	s1,40(sp)
  812:	ec4e                	sd	s3,24(sp)
  814:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  816:	02051493          	slli	s1,a0,0x20
  81a:	9081                	srli	s1,s1,0x20
  81c:	04bd                	addi	s1,s1,15
  81e:	8091                	srli	s1,s1,0x4
  820:	0014899b          	addiw	s3,s1,1
  824:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  826:	00000517          	auipc	a0,0x0
  82a:	7ea53503          	ld	a0,2026(a0) # 1010 <freep>
  82e:	c915                	beqz	a0,862 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  830:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  832:	4798                	lw	a4,8(a5)
  834:	08977a63          	bgeu	a4,s1,8c8 <malloc+0xbe>
  838:	f04a                	sd	s2,32(sp)
  83a:	e852                	sd	s4,16(sp)
  83c:	e456                	sd	s5,8(sp)
  83e:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  840:	8a4e                	mv	s4,s3
  842:	0009871b          	sext.w	a4,s3
  846:	6685                	lui	a3,0x1
  848:	00d77363          	bgeu	a4,a3,84e <malloc+0x44>
  84c:	6a05                	lui	s4,0x1
  84e:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  852:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  856:	00000917          	auipc	s2,0x0
  85a:	7ba90913          	addi	s2,s2,1978 # 1010 <freep>
-  if(p == (char*)-1)
  85e:	5afd                	li	s5,-1
  860:	a081                	j	8a0 <malloc+0x96>
  862:	f04a                	sd	s2,32(sp)
  864:	e852                	sd	s4,16(sp)
  866:	e456                	sd	s5,8(sp)
  868:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  86a:	00000797          	auipc	a5,0x0
  86e:	7b678793          	addi	a5,a5,1974 # 1020 <base>
  872:	00000717          	auipc	a4,0x0
  876:	78f73f23          	sd	a5,1950(a4) # 1010 <freep>
  87a:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  87c:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  880:	b7c1                	j	840 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  882:	6398                	ld	a4,0(a5)
  884:	e118                	sd	a4,0(a0)
  886:	a8a9                	j	8e0 <malloc+0xd6>
-  hp->s.size = nu;
  888:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  88c:	0541                	addi	a0,a0,16
  88e:	efbff0ef          	jal	788 <free>
-  return freep;
  892:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  896:	c12d                	beqz	a0,8f8 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  898:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  89a:	4798                	lw	a4,8(a5)
  89c:	02977263          	bgeu	a4,s1,8c0 <malloc+0xb6>
-    if(p == freep)
  8a0:	00093703          	ld	a4,0(s2)
  8a4:	853e                	mv	a0,a5
  8a6:	fef719e3          	bne	a4,a5,898 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  8aa:	8552                	mv	a0,s4
  8ac:	b03ff0ef          	jal	3ae <sbrk>
-  if(p == (char*)-1)
  8b0:	fd551ce3          	bne	a0,s5,888 <malloc+0x7e>
-        return 0;
  8b4:	4501                	li	a0,0
  8b6:	7902                	ld	s2,32(sp)
  8b8:	6a42                	ld	s4,16(sp)
@@ -1506,24 +1313,16 @@ malloc(uint nbytes)
  8c2:	6a42                	ld	s4,16(sp)
  8c4:	6aa2                	ld	s5,8(sp)
  8c6:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  8c8:	fae48de3          	beq	s1,a4,882 <malloc+0x78>
-        p->s.size -= nunits;
  8cc:	4137073b          	subw	a4,a4,s3
  8d0:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  8d2:	02071693          	slli	a3,a4,0x20
  8d6:	01c6d713          	srli	a4,a3,0x1c
  8da:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  8dc:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  8e0:	00000717          	auipc	a4,0x0
  8e4:	72a73823          	sd	a0,1840(a4) # 1010 <freep>
-      return (void*)(p + 1);
  8e8:	01078513          	addi	a0,a5,16
-  }
-}
  8ec:	70e2                	ld	ra,56(sp)
  8ee:	7442                	ld	s0,48(sp)
  8f0:	74a2                	ld	s1,40(sp)
diff --git a/user/init.o b/user/init.o
index dd0900f4be953c105f955aad16c3071c93c163c9..d88a403559899aca58f8d6bc67d0571fc7bb80bf 100644
Binary files a/user/init.o and b/user/init.o differ
diff --git a/user/kill.asm b/user/kill.asm
index a51a0107bda024076f07921a98f50a55aa7180f6..0219a1d6dd2a2bb07292b2a176b6ea686badd07b 100644
--- a/user/kill.asm
+++ b/user/kill.asm
@@ -485,245 +485,123 @@ memcpy(void *dst, const void *src, uint n)
  2b4:	8082                	ret
 
 00000000000002b6 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2b6:	4885                	li	a7,1
- ecall
  2b8:	00000073          	ecall
- ret
  2bc:	8082                	ret
 
 00000000000002be <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2be:	4889                	li	a7,2
- ecall
  2c0:	00000073          	ecall
- ret
  2c4:	8082                	ret
 
 00000000000002c6 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2c6:	488d                	li	a7,3
- ecall
  2c8:	00000073          	ecall
- ret
  2cc:	8082                	ret
 
 00000000000002ce <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2ce:	4891                	li	a7,4
- ecall
  2d0:	00000073          	ecall
- ret
  2d4:	8082                	ret
 
 00000000000002d6 <read>:
-.global read
-read:
- li a7, SYS_read
  2d6:	4895                	li	a7,5
- ecall
  2d8:	00000073          	ecall
- ret
  2dc:	8082                	ret
 
 00000000000002de <write>:
-.global write
-write:
- li a7, SYS_write
  2de:	48c1                	li	a7,16
- ecall
  2e0:	00000073          	ecall
- ret
  2e4:	8082                	ret
 
 00000000000002e6 <close>:
-.global close
-close:
- li a7, SYS_close
  2e6:	48d5                	li	a7,21
- ecall
  2e8:	00000073          	ecall
- ret
  2ec:	8082                	ret
 
 00000000000002ee <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  2ee:	4899                	li	a7,6
- ecall
  2f0:	00000073          	ecall
- ret
  2f4:	8082                	ret
 
 00000000000002f6 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  2f6:	489d                	li	a7,7
- ecall
  2f8:	00000073          	ecall
- ret
  2fc:	8082                	ret
 
 00000000000002fe <open>:
-.global open
-open:
- li a7, SYS_open
  2fe:	48bd                	li	a7,15
- ecall
  300:	00000073          	ecall
- ret
  304:	8082                	ret
 
 0000000000000306 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  306:	48c5                	li	a7,17
- ecall
  308:	00000073          	ecall
- ret
  30c:	8082                	ret
 
 000000000000030e <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  30e:	48c9                	li	a7,18
- ecall
  310:	00000073          	ecall
- ret
  314:	8082                	ret
 
 0000000000000316 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  316:	48a1                	li	a7,8
- ecall
  318:	00000073          	ecall
- ret
  31c:	8082                	ret
 
 000000000000031e <link>:
-.global link
-link:
- li a7, SYS_link
  31e:	48cd                	li	a7,19
- ecall
  320:	00000073          	ecall
- ret
  324:	8082                	ret
 
 0000000000000326 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  326:	48d1                	li	a7,20
- ecall
  328:	00000073          	ecall
- ret
  32c:	8082                	ret
 
 000000000000032e <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  32e:	48a5                	li	a7,9
- ecall
  330:	00000073          	ecall
- ret
  334:	8082                	ret
 
 0000000000000336 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  336:	48a9                	li	a7,10
- ecall
  338:	00000073          	ecall
- ret
  33c:	8082                	ret
 
 000000000000033e <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  33e:	48ad                	li	a7,11
- ecall
  340:	00000073          	ecall
- ret
  344:	8082                	ret
 
 0000000000000346 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  346:	48b1                	li	a7,12
- ecall
  348:	00000073          	ecall
- ret
  34c:	8082                	ret
 
 000000000000034e <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  34e:	48b5                	li	a7,13
- ecall
  350:	00000073          	ecall
- ret
  354:	8082                	ret
 
 0000000000000356 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  356:	48b9                	li	a7,14
- ecall
  358:	00000073          	ecall
- ret
  35c:	8082                	ret
 
 000000000000035e <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  35e:	48d9                	li	a7,22
- ecall
  360:	00000073          	ecall
- ret
  364:	8082                	ret
 
 0000000000000366 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  366:	48dd                	li	a7,23
- ecall
  368:	00000073          	ecall
- ret
  36c:	8082                	ret
 
 000000000000036e <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  36e:	48e1                	li	a7,24
- ecall
  370:	00000073          	ecall
- ret
  374:	8082                	ret
 
 0000000000000376 <putc>:
@@ -1266,184 +1144,113 @@ printf(const char *fmt, ...)
  71e:	8082                	ret
 
 0000000000000720 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  720:	1141                	addi	sp,sp,-16
  722:	e422                	sd	s0,8(sp)
  724:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  726:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  72a:	00001797          	auipc	a5,0x1
  72e:	8d67b783          	ld	a5,-1834(a5) # 1000 <freep>
  732:	a02d                	j	75c <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;
  734:	4618                	lw	a4,8(a2)
  736:	9f2d                	addw	a4,a4,a1
  738:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  73c:	6398                	ld	a4,0(a5)
  73e:	6310                	ld	a2,0(a4)
  740:	a83d                	j	77e <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  742:	ff852703          	lw	a4,-8(a0)
  746:	9f31                	addw	a4,a4,a2
  748:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  74a:	ff053683          	ld	a3,-16(a0)
  74e:	a091                	j	792 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  750:	6398                	ld	a4,0(a5)
  752:	00e7e463          	bltu	a5,a4,75a <free+0x3a>
  756:	00e6ea63          	bltu	a3,a4,76a <free+0x4a>
-{
  75a:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  75c:	fed7fae3          	bgeu	a5,a3,750 <free+0x30>
  760:	6398                	ld	a4,0(a5)
  762:	00e6e463          	bltu	a3,a4,76a <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  766:	fee7eae3          	bltu	a5,a4,75a <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  76a:	ff852583          	lw	a1,-8(a0)
  76e:	6390                	ld	a2,0(a5)
  770:	02059813          	slli	a6,a1,0x20
  774:	01c85713          	srli	a4,a6,0x1c
  778:	9736                	add	a4,a4,a3
  77a:	fae60de3          	beq	a2,a4,734 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  77e:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  782:	4790                	lw	a2,8(a5)
  784:	02061593          	slli	a1,a2,0x20
  788:	01c5d713          	srli	a4,a1,0x1c
  78c:	973e                	add	a4,a4,a5
  78e:	fae68ae3          	beq	a3,a4,742 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  792:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  794:	00001717          	auipc	a4,0x1
  798:	86f73623          	sd	a5,-1940(a4) # 1000 <freep>
-}
  79c:	6422                	ld	s0,8(sp)
  79e:	0141                	addi	sp,sp,16
  7a0:	8082                	ret
 
 00000000000007a2 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7a2:	7139                	addi	sp,sp,-64
  7a4:	fc06                	sd	ra,56(sp)
  7a6:	f822                	sd	s0,48(sp)
  7a8:	f426                	sd	s1,40(sp)
  7aa:	ec4e                	sd	s3,24(sp)
  7ac:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7ae:	02051493          	slli	s1,a0,0x20
  7b2:	9081                	srli	s1,s1,0x20
  7b4:	04bd                	addi	s1,s1,15
  7b6:	8091                	srli	s1,s1,0x4
  7b8:	0014899b          	addiw	s3,s1,1
  7bc:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7be:	00001517          	auipc	a0,0x1
  7c2:	84253503          	ld	a0,-1982(a0) # 1000 <freep>
  7c6:	c915                	beqz	a0,7fa <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7c8:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7ca:	4798                	lw	a4,8(a5)
  7cc:	08977a63          	bgeu	a4,s1,860 <malloc+0xbe>
  7d0:	f04a                	sd	s2,32(sp)
  7d2:	e852                	sd	s4,16(sp)
  7d4:	e456                	sd	s5,8(sp)
  7d6:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7d8:	8a4e                	mv	s4,s3
  7da:	0009871b          	sext.w	a4,s3
  7de:	6685                	lui	a3,0x1
  7e0:	00d77363          	bgeu	a4,a3,7e6 <malloc+0x44>
  7e4:	6a05                	lui	s4,0x1
  7e6:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7ea:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  7ee:	00001917          	auipc	s2,0x1
  7f2:	81290913          	addi	s2,s2,-2030 # 1000 <freep>
-  if(p == (char*)-1)
  7f6:	5afd                	li	s5,-1
  7f8:	a081                	j	838 <malloc+0x96>
  7fa:	f04a                	sd	s2,32(sp)
  7fc:	e852                	sd	s4,16(sp)
  7fe:	e456                	sd	s5,8(sp)
  800:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  802:	00001797          	auipc	a5,0x1
  806:	80e78793          	addi	a5,a5,-2034 # 1010 <base>
  80a:	00000717          	auipc	a4,0x0
  80e:	7ef73b23          	sd	a5,2038(a4) # 1000 <freep>
  812:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  814:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  818:	b7c1                	j	7d8 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  81a:	6398                	ld	a4,0(a5)
  81c:	e118                	sd	a4,0(a0)
  81e:	a8a9                	j	878 <malloc+0xd6>
-  hp->s.size = nu;
  820:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  824:	0541                	addi	a0,a0,16
  826:	efbff0ef          	jal	720 <free>
-  return freep;
  82a:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  82e:	c12d                	beqz	a0,890 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  830:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  832:	4798                	lw	a4,8(a5)
  834:	02977263          	bgeu	a4,s1,858 <malloc+0xb6>
-    if(p == freep)
  838:	00093703          	ld	a4,0(s2)
  83c:	853e                	mv	a0,a5
  83e:	fef719e3          	bne	a4,a5,830 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  842:	8552                	mv	a0,s4
  844:	b03ff0ef          	jal	346 <sbrk>
-  if(p == (char*)-1)
  848:	fd551ce3          	bne	a0,s5,820 <malloc+0x7e>
-        return 0;
  84c:	4501                	li	a0,0
  84e:	7902                	ld	s2,32(sp)
  850:	6a42                	ld	s4,16(sp)
@@ -1454,24 +1261,16 @@ malloc(uint nbytes)
  85a:	6a42                	ld	s4,16(sp)
  85c:	6aa2                	ld	s5,8(sp)
  85e:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  860:	fae48de3          	beq	s1,a4,81a <malloc+0x78>
-        p->s.size -= nunits;
  864:	4137073b          	subw	a4,a4,s3
  868:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  86a:	02071693          	slli	a3,a4,0x20
  86e:	01c6d713          	srli	a4,a3,0x1c
  872:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  874:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  878:	00000717          	auipc	a4,0x0
  87c:	78a73423          	sd	a0,1928(a4) # 1000 <freep>
-      return (void*)(p + 1);
  880:	01078513          	addi	a0,a5,16
-  }
-}
  884:	70e2                	ld	ra,56(sp)
  886:	7442                	ld	s0,48(sp)
  888:	74a2                	ld	s1,40(sp)
diff --git a/user/kill.o b/user/kill.o
index 9262438323702de3c6ae36b5763096dd010fb1af..b734a1550e57580c757ccf169c12e1bc05c97dbc 100644
Binary files a/user/kill.o and b/user/kill.o differ
diff --git a/user/ln.asm b/user/ln.asm
index f96ef7a13c13c490c3d9893024cc9852ab28b49f..d4098f3b72fbe06c7955e7a333a6e95353f260d3 100644
--- a/user/ln.asm
+++ b/user/ln.asm
@@ -480,245 +480,123 @@ memcpy(void *dst, const void *src, uint n)
  2ae:	8082                	ret
 
 00000000000002b0 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2b0:	4885                	li	a7,1
- ecall
  2b2:	00000073          	ecall
- ret
  2b6:	8082                	ret
 
 00000000000002b8 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2b8:	4889                	li	a7,2
- ecall
  2ba:	00000073          	ecall
- ret
  2be:	8082                	ret
 
 00000000000002c0 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2c0:	488d                	li	a7,3
- ecall
  2c2:	00000073          	ecall
- ret
  2c6:	8082                	ret
 
 00000000000002c8 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2c8:	4891                	li	a7,4
- ecall
  2ca:	00000073          	ecall
- ret
  2ce:	8082                	ret
 
 00000000000002d0 <read>:
-.global read
-read:
- li a7, SYS_read
  2d0:	4895                	li	a7,5
- ecall
  2d2:	00000073          	ecall
- ret
  2d6:	8082                	ret
 
 00000000000002d8 <write>:
-.global write
-write:
- li a7, SYS_write
  2d8:	48c1                	li	a7,16
- ecall
  2da:	00000073          	ecall
- ret
  2de:	8082                	ret
 
 00000000000002e0 <close>:
-.global close
-close:
- li a7, SYS_close
  2e0:	48d5                	li	a7,21
- ecall
  2e2:	00000073          	ecall
- ret
  2e6:	8082                	ret
 
 00000000000002e8 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  2e8:	4899                	li	a7,6
- ecall
  2ea:	00000073          	ecall
- ret
  2ee:	8082                	ret
 
 00000000000002f0 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  2f0:	489d                	li	a7,7
- ecall
  2f2:	00000073          	ecall
- ret
  2f6:	8082                	ret
 
 00000000000002f8 <open>:
-.global open
-open:
- li a7, SYS_open
  2f8:	48bd                	li	a7,15
- ecall
  2fa:	00000073          	ecall
- ret
  2fe:	8082                	ret
 
 0000000000000300 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  300:	48c5                	li	a7,17
- ecall
  302:	00000073          	ecall
- ret
  306:	8082                	ret
 
 0000000000000308 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  308:	48c9                	li	a7,18
- ecall
  30a:	00000073          	ecall
- ret
  30e:	8082                	ret
 
 0000000000000310 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  310:	48a1                	li	a7,8
- ecall
  312:	00000073          	ecall
- ret
  316:	8082                	ret
 
 0000000000000318 <link>:
-.global link
-link:
- li a7, SYS_link
  318:	48cd                	li	a7,19
- ecall
  31a:	00000073          	ecall
- ret
  31e:	8082                	ret
 
 0000000000000320 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  320:	48d1                	li	a7,20
- ecall
  322:	00000073          	ecall
- ret
  326:	8082                	ret
 
 0000000000000328 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  328:	48a5                	li	a7,9
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  330:	48a9                	li	a7,10
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  338:	48ad                	li	a7,11
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  340:	48b1                	li	a7,12
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  348:	48b5                	li	a7,13
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  350:	48b9                	li	a7,14
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  358:	48d9                	li	a7,22
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  360:	48dd                	li	a7,23
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  368:	48e1                	li	a7,24
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <putc>:
@@ -1261,184 +1139,113 @@ printf(const char *fmt, ...)
  718:	8082                	ret
 
 000000000000071a <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  71a:	1141                	addi	sp,sp,-16
  71c:	e422                	sd	s0,8(sp)
  71e:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  720:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  724:	00001797          	auipc	a5,0x1
  728:	8dc7b783          	ld	a5,-1828(a5) # 1000 <freep>
  72c:	a02d                	j	756 <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;
  72e:	4618                	lw	a4,8(a2)
  730:	9f2d                	addw	a4,a4,a1
  732:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  736:	6398                	ld	a4,0(a5)
  738:	6310                	ld	a2,0(a4)
  73a:	a83d                	j	778 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  73c:	ff852703          	lw	a4,-8(a0)
  740:	9f31                	addw	a4,a4,a2
  742:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  744:	ff053683          	ld	a3,-16(a0)
  748:	a091                	j	78c <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  74a:	6398                	ld	a4,0(a5)
  74c:	00e7e463          	bltu	a5,a4,754 <free+0x3a>
  750:	00e6ea63          	bltu	a3,a4,764 <free+0x4a>
-{
  754:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  756:	fed7fae3          	bgeu	a5,a3,74a <free+0x30>
  75a:	6398                	ld	a4,0(a5)
  75c:	00e6e463          	bltu	a3,a4,764 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  760:	fee7eae3          	bltu	a5,a4,754 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  764:	ff852583          	lw	a1,-8(a0)
  768:	6390                	ld	a2,0(a5)
  76a:	02059813          	slli	a6,a1,0x20
  76e:	01c85713          	srli	a4,a6,0x1c
  772:	9736                	add	a4,a4,a3
  774:	fae60de3          	beq	a2,a4,72e <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  778:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  77c:	4790                	lw	a2,8(a5)
  77e:	02061593          	slli	a1,a2,0x20
  782:	01c5d713          	srli	a4,a1,0x1c
  786:	973e                	add	a4,a4,a5
  788:	fae68ae3          	beq	a3,a4,73c <free+0x22>
-    p->s.ptr = bp->s.ptr;
  78c:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  78e:	00001717          	auipc	a4,0x1
  792:	86f73923          	sd	a5,-1934(a4) # 1000 <freep>
-}
  796:	6422                	ld	s0,8(sp)
  798:	0141                	addi	sp,sp,16
  79a:	8082                	ret
 
 000000000000079c <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  79c:	7139                	addi	sp,sp,-64
  79e:	fc06                	sd	ra,56(sp)
  7a0:	f822                	sd	s0,48(sp)
  7a2:	f426                	sd	s1,40(sp)
  7a4:	ec4e                	sd	s3,24(sp)
  7a6:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7a8:	02051493          	slli	s1,a0,0x20
  7ac:	9081                	srli	s1,s1,0x20
  7ae:	04bd                	addi	s1,s1,15
  7b0:	8091                	srli	s1,s1,0x4
  7b2:	0014899b          	addiw	s3,s1,1
  7b6:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7b8:	00001517          	auipc	a0,0x1
  7bc:	84853503          	ld	a0,-1976(a0) # 1000 <freep>
  7c0:	c915                	beqz	a0,7f4 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7c2:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7c4:	4798                	lw	a4,8(a5)
  7c6:	08977a63          	bgeu	a4,s1,85a <malloc+0xbe>
  7ca:	f04a                	sd	s2,32(sp)
  7cc:	e852                	sd	s4,16(sp)
  7ce:	e456                	sd	s5,8(sp)
  7d0:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7d2:	8a4e                	mv	s4,s3
  7d4:	0009871b          	sext.w	a4,s3
  7d8:	6685                	lui	a3,0x1
  7da:	00d77363          	bgeu	a4,a3,7e0 <malloc+0x44>
  7de:	6a05                	lui	s4,0x1
  7e0:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7e4:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  7e8:	00001917          	auipc	s2,0x1
  7ec:	81890913          	addi	s2,s2,-2024 # 1000 <freep>
-  if(p == (char*)-1)
  7f0:	5afd                	li	s5,-1
  7f2:	a081                	j	832 <malloc+0x96>
  7f4:	f04a                	sd	s2,32(sp)
  7f6:	e852                	sd	s4,16(sp)
  7f8:	e456                	sd	s5,8(sp)
  7fa:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  7fc:	00001797          	auipc	a5,0x1
  800:	81478793          	addi	a5,a5,-2028 # 1010 <base>
  804:	00000717          	auipc	a4,0x0
  808:	7ef73e23          	sd	a5,2044(a4) # 1000 <freep>
  80c:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  80e:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  812:	b7c1                	j	7d2 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  814:	6398                	ld	a4,0(a5)
  816:	e118                	sd	a4,0(a0)
  818:	a8a9                	j	872 <malloc+0xd6>
-  hp->s.size = nu;
  81a:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  81e:	0541                	addi	a0,a0,16
  820:	efbff0ef          	jal	71a <free>
-  return freep;
  824:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  828:	c12d                	beqz	a0,88a <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  82a:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  82c:	4798                	lw	a4,8(a5)
  82e:	02977263          	bgeu	a4,s1,852 <malloc+0xb6>
-    if(p == freep)
  832:	00093703          	ld	a4,0(s2)
  836:	853e                	mv	a0,a5
  838:	fef719e3          	bne	a4,a5,82a <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  83c:	8552                	mv	a0,s4
  83e:	b03ff0ef          	jal	340 <sbrk>
-  if(p == (char*)-1)
  842:	fd551ce3          	bne	a0,s5,81a <malloc+0x7e>
-        return 0;
  846:	4501                	li	a0,0
  848:	7902                	ld	s2,32(sp)
  84a:	6a42                	ld	s4,16(sp)
@@ -1449,24 +1256,16 @@ malloc(uint nbytes)
  854:	6a42                	ld	s4,16(sp)
  856:	6aa2                	ld	s5,8(sp)
  858:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  85a:	fae48de3          	beq	s1,a4,814 <malloc+0x78>
-        p->s.size -= nunits;
  85e:	4137073b          	subw	a4,a4,s3
  862:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  864:	02071693          	slli	a3,a4,0x20
  868:	01c6d713          	srli	a4,a3,0x1c
  86c:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  86e:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  872:	00000717          	auipc	a4,0x0
  876:	78a73723          	sd	a0,1934(a4) # 1000 <freep>
-      return (void*)(p + 1);
  87a:	01078513          	addi	a0,a5,16
-  }
-}
  87e:	70e2                	ld	ra,56(sp)
  880:	7442                	ld	s0,48(sp)
  882:	74a2                	ld	s1,40(sp)
diff --git a/user/ln.o b/user/ln.o
index 4c6fd0708515c19ee1831af975828734e64e5392..32992fb062f3608da9cda9ccfa3e017d394f6ca4 100644
Binary files a/user/ln.o and b/user/ln.o differ
diff --git a/user/locktest.asm b/user/locktest.asm
index 2a68c7a69f85ac43ff0a2baa560cff9d47e08586..7d467fd7eb62524157ceb047963b85960bb4c0d4 100644
--- a/user/locktest.asm
+++ b/user/locktest.asm
@@ -619,245 +619,123 @@ memcpy(void *dst, const void *src, uint n)
  3d8:	8082                	ret
 
 00000000000003da <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  3da:	4885                	li	a7,1
- ecall
  3dc:	00000073          	ecall
- ret
  3e0:	8082                	ret
 
 00000000000003e2 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  3e2:	4889                	li	a7,2
- ecall
  3e4:	00000073          	ecall
- ret
  3e8:	8082                	ret
 
 00000000000003ea <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  3ea:	488d                	li	a7,3
- ecall
  3ec:	00000073          	ecall
- ret
  3f0:	8082                	ret
 
 00000000000003f2 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  3f2:	4891                	li	a7,4
- ecall
  3f4:	00000073          	ecall
- ret
  3f8:	8082                	ret
 
 00000000000003fa <read>:
-.global read
-read:
- li a7, SYS_read
  3fa:	4895                	li	a7,5
- ecall
  3fc:	00000073          	ecall
- ret
  400:	8082                	ret
 
 0000000000000402 <write>:
-.global write
-write:
- li a7, SYS_write
  402:	48c1                	li	a7,16
- ecall
  404:	00000073          	ecall
- ret
  408:	8082                	ret
 
 000000000000040a <close>:
-.global close
-close:
- li a7, SYS_close
  40a:	48d5                	li	a7,21
- ecall
  40c:	00000073          	ecall
- ret
  410:	8082                	ret
 
 0000000000000412 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  412:	4899                	li	a7,6
- ecall
  414:	00000073          	ecall
- ret
  418:	8082                	ret
 
 000000000000041a <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  41a:	489d                	li	a7,7
- ecall
  41c:	00000073          	ecall
- ret
  420:	8082                	ret
 
 0000000000000422 <open>:
-.global open
-open:
- li a7, SYS_open
  422:	48bd                	li	a7,15
- ecall
  424:	00000073          	ecall
- ret
  428:	8082                	ret
 
 000000000000042a <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  42a:	48c5                	li	a7,17
- ecall
  42c:	00000073          	ecall
- ret
  430:	8082                	ret
 
 0000000000000432 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  432:	48c9                	li	a7,18
- ecall
  434:	00000073          	ecall
- ret
  438:	8082                	ret
 
 000000000000043a <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  43a:	48a1                	li	a7,8
- ecall
  43c:	00000073          	ecall
- ret
  440:	8082                	ret
 
 0000000000000442 <link>:
-.global link
-link:
- li a7, SYS_link
  442:	48cd                	li	a7,19
- ecall
  444:	00000073          	ecall
- ret
  448:	8082                	ret
 
 000000000000044a <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  44a:	48d1                	li	a7,20
- ecall
  44c:	00000073          	ecall
- ret
  450:	8082                	ret
 
 0000000000000452 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  452:	48a5                	li	a7,9
- ecall
  454:	00000073          	ecall
- ret
  458:	8082                	ret
 
 000000000000045a <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  45a:	48a9                	li	a7,10
- ecall
  45c:	00000073          	ecall
- ret
  460:	8082                	ret
 
 0000000000000462 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  462:	48ad                	li	a7,11
- ecall
  464:	00000073          	ecall
- ret
  468:	8082                	ret
 
 000000000000046a <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  46a:	48b1                	li	a7,12
- ecall
  46c:	00000073          	ecall
- ret
  470:	8082                	ret
 
 0000000000000472 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  472:	48b5                	li	a7,13
- ecall
  474:	00000073          	ecall
- ret
  478:	8082                	ret
 
 000000000000047a <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  47a:	48b9                	li	a7,14
- ecall
  47c:	00000073          	ecall
- ret
  480:	8082                	ret
 
 0000000000000482 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  482:	48d9                	li	a7,22
- ecall
  484:	00000073          	ecall
- ret
  488:	8082                	ret
 
 000000000000048a <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  48a:	48dd                	li	a7,23
- ecall
  48c:	00000073          	ecall
- ret
  490:	8082                	ret
 
 0000000000000492 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  492:	48e1                	li	a7,24
- ecall
  494:	00000073          	ecall
- ret
  498:	8082                	ret
 
 000000000000049a <putc>:
@@ -1400,184 +1278,113 @@ printf(const char *fmt, ...)
  842:	8082                	ret
 
 0000000000000844 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  844:	1141                	addi	sp,sp,-16
  846:	e422                	sd	s0,8(sp)
  848:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  84a:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  84e:	00000797          	auipc	a5,0x0
  852:	7b27b783          	ld	a5,1970(a5) # 1000 <freep>
  856:	a02d                	j	880 <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;
  858:	4618                	lw	a4,8(a2)
  85a:	9f2d                	addw	a4,a4,a1
  85c:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  860:	6398                	ld	a4,0(a5)
  862:	6310                	ld	a2,0(a4)
  864:	a83d                	j	8a2 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  866:	ff852703          	lw	a4,-8(a0)
  86a:	9f31                	addw	a4,a4,a2
  86c:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  86e:	ff053683          	ld	a3,-16(a0)
  872:	a091                	j	8b6 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  874:	6398                	ld	a4,0(a5)
  876:	00e7e463          	bltu	a5,a4,87e <free+0x3a>
  87a:	00e6ea63          	bltu	a3,a4,88e <free+0x4a>
-{
  87e:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  880:	fed7fae3          	bgeu	a5,a3,874 <free+0x30>
  884:	6398                	ld	a4,0(a5)
  886:	00e6e463          	bltu	a3,a4,88e <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  88a:	fee7eae3          	bltu	a5,a4,87e <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  88e:	ff852583          	lw	a1,-8(a0)
  892:	6390                	ld	a2,0(a5)
  894:	02059813          	slli	a6,a1,0x20
  898:	01c85713          	srli	a4,a6,0x1c
  89c:	9736                	add	a4,a4,a3
  89e:	fae60de3          	beq	a2,a4,858 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  8a2:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  8a6:	4790                	lw	a2,8(a5)
  8a8:	02061593          	slli	a1,a2,0x20
  8ac:	01c5d713          	srli	a4,a1,0x1c
  8b0:	973e                	add	a4,a4,a5
  8b2:	fae68ae3          	beq	a3,a4,866 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  8b6:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  8b8:	00000717          	auipc	a4,0x0
  8bc:	74f73423          	sd	a5,1864(a4) # 1000 <freep>
-}
  8c0:	6422                	ld	s0,8(sp)
  8c2:	0141                	addi	sp,sp,16
  8c4:	8082                	ret
 
 00000000000008c6 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  8c6:	7139                	addi	sp,sp,-64
  8c8:	fc06                	sd	ra,56(sp)
  8ca:	f822                	sd	s0,48(sp)
  8cc:	f426                	sd	s1,40(sp)
  8ce:	ec4e                	sd	s3,24(sp)
  8d0:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  8d2:	02051493          	slli	s1,a0,0x20
  8d6:	9081                	srli	s1,s1,0x20
  8d8:	04bd                	addi	s1,s1,15
  8da:	8091                	srli	s1,s1,0x4
  8dc:	0014899b          	addiw	s3,s1,1
  8e0:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  8e2:	00000517          	auipc	a0,0x0
  8e6:	71e53503          	ld	a0,1822(a0) # 1000 <freep>
  8ea:	c915                	beqz	a0,91e <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8ec:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8ee:	4798                	lw	a4,8(a5)
  8f0:	08977a63          	bgeu	a4,s1,984 <malloc+0xbe>
  8f4:	f04a                	sd	s2,32(sp)
  8f6:	e852                	sd	s4,16(sp)
  8f8:	e456                	sd	s5,8(sp)
  8fa:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  8fc:	8a4e                	mv	s4,s3
  8fe:	0009871b          	sext.w	a4,s3
  902:	6685                	lui	a3,0x1
  904:	00d77363          	bgeu	a4,a3,90a <malloc+0x44>
  908:	6a05                	lui	s4,0x1
  90a:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  90e:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  912:	00000917          	auipc	s2,0x0
  916:	6ee90913          	addi	s2,s2,1774 # 1000 <freep>
-  if(p == (char*)-1)
  91a:	5afd                	li	s5,-1
  91c:	a081                	j	95c <malloc+0x96>
  91e:	f04a                	sd	s2,32(sp)
  920:	e852                	sd	s4,16(sp)
  922:	e456                	sd	s5,8(sp)
  924:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  926:	00000797          	auipc	a5,0x0
  92a:	6ea78793          	addi	a5,a5,1770 # 1010 <base>
  92e:	00000717          	auipc	a4,0x0
  932:	6cf73923          	sd	a5,1746(a4) # 1000 <freep>
  936:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  938:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  93c:	b7c1                	j	8fc <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  93e:	6398                	ld	a4,0(a5)
  940:	e118                	sd	a4,0(a0)
  942:	a8a9                	j	99c <malloc+0xd6>
-  hp->s.size = nu;
  944:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  948:	0541                	addi	a0,a0,16
  94a:	efbff0ef          	jal	844 <free>
-  return freep;
  94e:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  952:	c12d                	beqz	a0,9b4 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  954:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  956:	4798                	lw	a4,8(a5)
  958:	02977263          	bgeu	a4,s1,97c <malloc+0xb6>
-    if(p == freep)
  95c:	00093703          	ld	a4,0(s2)
  960:	853e                	mv	a0,a5
  962:	fef719e3          	bne	a4,a5,954 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  966:	8552                	mv	a0,s4
  968:	b03ff0ef          	jal	46a <sbrk>
-  if(p == (char*)-1)
  96c:	fd551ce3          	bne	a0,s5,944 <malloc+0x7e>
-        return 0;
  970:	4501                	li	a0,0
  972:	7902                	ld	s2,32(sp)
  974:	6a42                	ld	s4,16(sp)
@@ -1588,24 +1395,16 @@ malloc(uint nbytes)
  97e:	6a42                	ld	s4,16(sp)
  980:	6aa2                	ld	s5,8(sp)
  982:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  984:	fae48de3          	beq	s1,a4,93e <malloc+0x78>
-        p->s.size -= nunits;
  988:	4137073b          	subw	a4,a4,s3
  98c:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  98e:	02071693          	slli	a3,a4,0x20
  992:	01c6d713          	srli	a4,a3,0x1c
  996:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  998:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  99c:	00000717          	auipc	a4,0x0
  9a0:	66a73223          	sd	a0,1636(a4) # 1000 <freep>
-      return (void*)(p + 1);
  9a4:	01078513          	addi	a0,a5,16
-  }
-}
  9a8:	70e2                	ld	ra,56(sp)
  9aa:	7442                	ld	s0,48(sp)
  9ac:	74a2                	ld	s1,40(sp)
diff --git a/user/locktest.o b/user/locktest.o
index 48a919e76e1cf46583f4ce089687811c1c606a95..b01fac9f17e90c23735ee064d5d564ac3090a54f 100644
Binary files a/user/locktest.o and b/user/locktest.o differ
diff --git a/user/ls.asm b/user/ls.asm
index 3778a5dd81e113c40ace804f1b172a03c52b1fd5..553c061a6b0614b99eb11e576e8d436612a8a81f 100644
--- a/user/ls.asm
+++ b/user/ls.asm
@@ -730,245 +730,123 @@ memcpy(void *dst, const void *src, uint n)
  4c8:	8082                	ret
 
 00000000000004ca <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  4ca:	4885                	li	a7,1
- ecall
  4cc:	00000073          	ecall
- ret
  4d0:	8082                	ret
 
 00000000000004d2 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  4d2:	4889                	li	a7,2
- ecall
  4d4:	00000073          	ecall
- ret
  4d8:	8082                	ret
 
 00000000000004da <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  4da:	488d                	li	a7,3
- ecall
  4dc:	00000073          	ecall
- ret
  4e0:	8082                	ret
 
 00000000000004e2 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  4e2:	4891                	li	a7,4
- ecall
  4e4:	00000073          	ecall
- ret
  4e8:	8082                	ret
 
 00000000000004ea <read>:
-.global read
-read:
- li a7, SYS_read
  4ea:	4895                	li	a7,5
- ecall
  4ec:	00000073          	ecall
- ret
  4f0:	8082                	ret
 
 00000000000004f2 <write>:
-.global write
-write:
- li a7, SYS_write
  4f2:	48c1                	li	a7,16
- ecall
  4f4:	00000073          	ecall
- ret
  4f8:	8082                	ret
 
 00000000000004fa <close>:
-.global close
-close:
- li a7, SYS_close
  4fa:	48d5                	li	a7,21
- ecall
  4fc:	00000073          	ecall
- ret
  500:	8082                	ret
 
 0000000000000502 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  502:	4899                	li	a7,6
- ecall
  504:	00000073          	ecall
- ret
  508:	8082                	ret
 
 000000000000050a <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  50a:	489d                	li	a7,7
- ecall
  50c:	00000073          	ecall
- ret
  510:	8082                	ret
 
 0000000000000512 <open>:
-.global open
-open:
- li a7, SYS_open
  512:	48bd                	li	a7,15
- ecall
  514:	00000073          	ecall
- ret
  518:	8082                	ret
 
 000000000000051a <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  51a:	48c5                	li	a7,17
- ecall
  51c:	00000073          	ecall
- ret
  520:	8082                	ret
 
 0000000000000522 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  522:	48c9                	li	a7,18
- ecall
  524:	00000073          	ecall
- ret
  528:	8082                	ret
 
 000000000000052a <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  52a:	48a1                	li	a7,8
- ecall
  52c:	00000073          	ecall
- ret
  530:	8082                	ret
 
 0000000000000532 <link>:
-.global link
-link:
- li a7, SYS_link
  532:	48cd                	li	a7,19
- ecall
  534:	00000073          	ecall
- ret
  538:	8082                	ret
 
 000000000000053a <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  53a:	48d1                	li	a7,20
- ecall
  53c:	00000073          	ecall
- ret
  540:	8082                	ret
 
 0000000000000542 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  542:	48a5                	li	a7,9
- ecall
  544:	00000073          	ecall
- ret
  548:	8082                	ret
 
 000000000000054a <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  54a:	48a9                	li	a7,10
- ecall
  54c:	00000073          	ecall
- ret
  550:	8082                	ret
 
 0000000000000552 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  552:	48ad                	li	a7,11
- ecall
  554:	00000073          	ecall
- ret
  558:	8082                	ret
 
 000000000000055a <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  55a:	48b1                	li	a7,12
- ecall
  55c:	00000073          	ecall
- ret
  560:	8082                	ret
 
 0000000000000562 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  562:	48b5                	li	a7,13
- ecall
  564:	00000073          	ecall
- ret
  568:	8082                	ret
 
 000000000000056a <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  56a:	48b9                	li	a7,14
- ecall
  56c:	00000073          	ecall
- ret
  570:	8082                	ret
 
 0000000000000572 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  572:	48d9                	li	a7,22
- ecall
  574:	00000073          	ecall
- ret
  578:	8082                	ret
 
 000000000000057a <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  57a:	48dd                	li	a7,23
- ecall
  57c:	00000073          	ecall
- ret
  580:	8082                	ret
 
 0000000000000582 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  582:	48e1                	li	a7,24
- ecall
  584:	00000073          	ecall
- ret
  588:	8082                	ret
 
 000000000000058a <putc>:
@@ -1511,184 +1389,113 @@ printf(const char *fmt, ...)
  932:	8082                	ret
 
 0000000000000934 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  934:	1141                	addi	sp,sp,-16
  936:	e422                	sd	s0,8(sp)
  938:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  93a:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  93e:	00000797          	auipc	a5,0x0
  942:	6c27b783          	ld	a5,1730(a5) # 1000 <freep>
  946:	a02d                	j	970 <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;
  948:	4618                	lw	a4,8(a2)
  94a:	9f2d                	addw	a4,a4,a1
  94c:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  950:	6398                	ld	a4,0(a5)
  952:	6310                	ld	a2,0(a4)
  954:	a83d                	j	992 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  956:	ff852703          	lw	a4,-8(a0)
  95a:	9f31                	addw	a4,a4,a2
  95c:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  95e:	ff053683          	ld	a3,-16(a0)
  962:	a091                	j	9a6 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  964:	6398                	ld	a4,0(a5)
  966:	00e7e463          	bltu	a5,a4,96e <free+0x3a>
  96a:	00e6ea63          	bltu	a3,a4,97e <free+0x4a>
-{
  96e:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  970:	fed7fae3          	bgeu	a5,a3,964 <free+0x30>
  974:	6398                	ld	a4,0(a5)
  976:	00e6e463          	bltu	a3,a4,97e <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  97a:	fee7eae3          	bltu	a5,a4,96e <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  97e:	ff852583          	lw	a1,-8(a0)
  982:	6390                	ld	a2,0(a5)
  984:	02059813          	slli	a6,a1,0x20
  988:	01c85713          	srli	a4,a6,0x1c
  98c:	9736                	add	a4,a4,a3
  98e:	fae60de3          	beq	a2,a4,948 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  992:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  996:	4790                	lw	a2,8(a5)
  998:	02061593          	slli	a1,a2,0x20
  99c:	01c5d713          	srli	a4,a1,0x1c
  9a0:	973e                	add	a4,a4,a5
  9a2:	fae68ae3          	beq	a3,a4,956 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  9a6:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  9a8:	00000717          	auipc	a4,0x0
  9ac:	64f73c23          	sd	a5,1624(a4) # 1000 <freep>
-}
  9b0:	6422                	ld	s0,8(sp)
  9b2:	0141                	addi	sp,sp,16
  9b4:	8082                	ret
 
 00000000000009b6 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  9b6:	7139                	addi	sp,sp,-64
  9b8:	fc06                	sd	ra,56(sp)
  9ba:	f822                	sd	s0,48(sp)
  9bc:	f426                	sd	s1,40(sp)
  9be:	ec4e                	sd	s3,24(sp)
  9c0:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  9c2:	02051493          	slli	s1,a0,0x20
  9c6:	9081                	srli	s1,s1,0x20
  9c8:	04bd                	addi	s1,s1,15
  9ca:	8091                	srli	s1,s1,0x4
  9cc:	0014899b          	addiw	s3,s1,1
  9d0:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  9d2:	00000517          	auipc	a0,0x0
  9d6:	62e53503          	ld	a0,1582(a0) # 1000 <freep>
  9da:	c915                	beqz	a0,a0e <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  9dc:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  9de:	4798                	lw	a4,8(a5)
  9e0:	08977a63          	bgeu	a4,s1,a74 <malloc+0xbe>
  9e4:	f04a                	sd	s2,32(sp)
  9e6:	e852                	sd	s4,16(sp)
  9e8:	e456                	sd	s5,8(sp)
  9ea:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  9ec:	8a4e                	mv	s4,s3
  9ee:	0009871b          	sext.w	a4,s3
  9f2:	6685                	lui	a3,0x1
  9f4:	00d77363          	bgeu	a4,a3,9fa <malloc+0x44>
  9f8:	6a05                	lui	s4,0x1
  9fa:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  9fe:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  a02:	00000917          	auipc	s2,0x0
  a06:	5fe90913          	addi	s2,s2,1534 # 1000 <freep>
-  if(p == (char*)-1)
  a0a:	5afd                	li	s5,-1
  a0c:	a081                	j	a4c <malloc+0x96>
  a0e:	f04a                	sd	s2,32(sp)
  a10:	e852                	sd	s4,16(sp)
  a12:	e456                	sd	s5,8(sp)
  a14:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  a16:	00000797          	auipc	a5,0x0
  a1a:	60a78793          	addi	a5,a5,1546 # 1020 <base>
  a1e:	00000717          	auipc	a4,0x0
  a22:	5ef73123          	sd	a5,1506(a4) # 1000 <freep>
  a26:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  a28:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  a2c:	b7c1                	j	9ec <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  a2e:	6398                	ld	a4,0(a5)
  a30:	e118                	sd	a4,0(a0)
  a32:	a8a9                	j	a8c <malloc+0xd6>
-  hp->s.size = nu;
  a34:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  a38:	0541                	addi	a0,a0,16
  a3a:	efbff0ef          	jal	934 <free>
-  return freep;
  a3e:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  a42:	c12d                	beqz	a0,aa4 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  a44:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  a46:	4798                	lw	a4,8(a5)
  a48:	02977263          	bgeu	a4,s1,a6c <malloc+0xb6>
-    if(p == freep)
  a4c:	00093703          	ld	a4,0(s2)
  a50:	853e                	mv	a0,a5
  a52:	fef719e3          	bne	a4,a5,a44 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  a56:	8552                	mv	a0,s4
  a58:	b03ff0ef          	jal	55a <sbrk>
-  if(p == (char*)-1)
  a5c:	fd551ce3          	bne	a0,s5,a34 <malloc+0x7e>
-        return 0;
  a60:	4501                	li	a0,0
  a62:	7902                	ld	s2,32(sp)
  a64:	6a42                	ld	s4,16(sp)
@@ -1699,24 +1506,16 @@ malloc(uint nbytes)
  a6e:	6a42                	ld	s4,16(sp)
  a70:	6aa2                	ld	s5,8(sp)
  a72:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  a74:	fae48de3          	beq	s1,a4,a2e <malloc+0x78>
-        p->s.size -= nunits;
  a78:	4137073b          	subw	a4,a4,s3
  a7c:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  a7e:	02071693          	slli	a3,a4,0x20
  a82:	01c6d713          	srli	a4,a3,0x1c
  a86:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  a88:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  a8c:	00000717          	auipc	a4,0x0
  a90:	56a73a23          	sd	a0,1396(a4) # 1000 <freep>
-      return (void*)(p + 1);
  a94:	01078513          	addi	a0,a5,16
-  }
-}
  a98:	70e2                	ld	ra,56(sp)
  a9a:	7442                	ld	s0,48(sp)
  a9c:	74a2                	ld	s1,40(sp)
diff --git a/user/ls.o b/user/ls.o
index e3988c367f336c8713da19ec2961481459f12847..cb462275dd66e19c7b94f600ddb579be9432cc0f 100644
Binary files a/user/ls.o and b/user/ls.o differ
diff --git a/user/malloc_test.asm b/user/malloc_test.asm
index 56dcb13a9b128b0b5a472daf137729dae7e6757e..6cef94ebefeb6007c4d70f1f8f5135701a8c251d 100644
--- a/user/malloc_test.asm
+++ b/user/malloc_test.asm
@@ -478,245 +478,123 @@ memcpy(void *dst, const void *src, uint n)
  2ae:	8082                	ret
 
 00000000000002b0 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2b0:	4885                	li	a7,1
- ecall
  2b2:	00000073          	ecall
- ret
  2b6:	8082                	ret
 
 00000000000002b8 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2b8:	4889                	li	a7,2
- ecall
  2ba:	00000073          	ecall
- ret
  2be:	8082                	ret
 
 00000000000002c0 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2c0:	488d                	li	a7,3
- ecall
  2c2:	00000073          	ecall
- ret
  2c6:	8082                	ret
 
 00000000000002c8 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2c8:	4891                	li	a7,4
- ecall
  2ca:	00000073          	ecall
- ret
  2ce:	8082                	ret
 
 00000000000002d0 <read>:
-.global read
-read:
- li a7, SYS_read
  2d0:	4895                	li	a7,5
- ecall
  2d2:	00000073          	ecall
- ret
  2d6:	8082                	ret
 
 00000000000002d8 <write>:
-.global write
-write:
- li a7, SYS_write
  2d8:	48c1                	li	a7,16
- ecall
  2da:	00000073          	ecall
- ret
  2de:	8082                	ret
 
 00000000000002e0 <close>:
-.global close
-close:
- li a7, SYS_close
  2e0:	48d5                	li	a7,21
- ecall
  2e2:	00000073          	ecall
- ret
  2e6:	8082                	ret
 
 00000000000002e8 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  2e8:	4899                	li	a7,6
- ecall
  2ea:	00000073          	ecall
- ret
  2ee:	8082                	ret
 
 00000000000002f0 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  2f0:	489d                	li	a7,7
- ecall
  2f2:	00000073          	ecall
- ret
  2f6:	8082                	ret
 
 00000000000002f8 <open>:
-.global open
-open:
- li a7, SYS_open
  2f8:	48bd                	li	a7,15
- ecall
  2fa:	00000073          	ecall
- ret
  2fe:	8082                	ret
 
 0000000000000300 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  300:	48c5                	li	a7,17
- ecall
  302:	00000073          	ecall
- ret
  306:	8082                	ret
 
 0000000000000308 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  308:	48c9                	li	a7,18
- ecall
  30a:	00000073          	ecall
- ret
  30e:	8082                	ret
 
 0000000000000310 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  310:	48a1                	li	a7,8
- ecall
  312:	00000073          	ecall
- ret
  316:	8082                	ret
 
 0000000000000318 <link>:
-.global link
-link:
- li a7, SYS_link
  318:	48cd                	li	a7,19
- ecall
  31a:	00000073          	ecall
- ret
  31e:	8082                	ret
 
 0000000000000320 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  320:	48d1                	li	a7,20
- ecall
  322:	00000073          	ecall
- ret
  326:	8082                	ret
 
 0000000000000328 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  328:	48a5                	li	a7,9
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  330:	48a9                	li	a7,10
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  338:	48ad                	li	a7,11
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  340:	48b1                	li	a7,12
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  348:	48b5                	li	a7,13
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  350:	48b9                	li	a7,14
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  358:	48d9                	li	a7,22
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  360:	48dd                	li	a7,23
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  368:	48e1                	li	a7,24
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <putc>:
@@ -1259,184 +1137,113 @@ printf(const char *fmt, ...)
  718:	8082                	ret
 
 000000000000071a <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  71a:	1141                	addi	sp,sp,-16
  71c:	e422                	sd	s0,8(sp)
  71e:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  720:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  724:	00001797          	auipc	a5,0x1
  728:	8dc7b783          	ld	a5,-1828(a5) # 1000 <freep>
  72c:	a02d                	j	756 <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;
  72e:	4618                	lw	a4,8(a2)
  730:	9f2d                	addw	a4,a4,a1
  732:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  736:	6398                	ld	a4,0(a5)
  738:	6310                	ld	a2,0(a4)
  73a:	a83d                	j	778 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  73c:	ff852703          	lw	a4,-8(a0)
  740:	9f31                	addw	a4,a4,a2
  742:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  744:	ff053683          	ld	a3,-16(a0)
  748:	a091                	j	78c <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  74a:	6398                	ld	a4,0(a5)
  74c:	00e7e463          	bltu	a5,a4,754 <free+0x3a>
  750:	00e6ea63          	bltu	a3,a4,764 <free+0x4a>
-{
  754:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  756:	fed7fae3          	bgeu	a5,a3,74a <free+0x30>
  75a:	6398                	ld	a4,0(a5)
  75c:	00e6e463          	bltu	a3,a4,764 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  760:	fee7eae3          	bltu	a5,a4,754 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  764:	ff852583          	lw	a1,-8(a0)
  768:	6390                	ld	a2,0(a5)
  76a:	02059813          	slli	a6,a1,0x20
  76e:	01c85713          	srli	a4,a6,0x1c
  772:	9736                	add	a4,a4,a3
  774:	fae60de3          	beq	a2,a4,72e <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  778:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  77c:	4790                	lw	a2,8(a5)
  77e:	02061593          	slli	a1,a2,0x20
  782:	01c5d713          	srli	a4,a1,0x1c
  786:	973e                	add	a4,a4,a5
  788:	fae68ae3          	beq	a3,a4,73c <free+0x22>
-    p->s.ptr = bp->s.ptr;
  78c:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  78e:	00001717          	auipc	a4,0x1
  792:	86f73923          	sd	a5,-1934(a4) # 1000 <freep>
-}
  796:	6422                	ld	s0,8(sp)
  798:	0141                	addi	sp,sp,16
  79a:	8082                	ret
 
 000000000000079c <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  79c:	7139                	addi	sp,sp,-64
  79e:	fc06                	sd	ra,56(sp)
  7a0:	f822                	sd	s0,48(sp)
  7a2:	f426                	sd	s1,40(sp)
  7a4:	ec4e                	sd	s3,24(sp)
  7a6:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7a8:	02051493          	slli	s1,a0,0x20
  7ac:	9081                	srli	s1,s1,0x20
  7ae:	04bd                	addi	s1,s1,15
  7b0:	8091                	srli	s1,s1,0x4
  7b2:	0014899b          	addiw	s3,s1,1
  7b6:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7b8:	00001517          	auipc	a0,0x1
  7bc:	84853503          	ld	a0,-1976(a0) # 1000 <freep>
  7c0:	c915                	beqz	a0,7f4 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7c2:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7c4:	4798                	lw	a4,8(a5)
  7c6:	08977a63          	bgeu	a4,s1,85a <malloc+0xbe>
  7ca:	f04a                	sd	s2,32(sp)
  7cc:	e852                	sd	s4,16(sp)
  7ce:	e456                	sd	s5,8(sp)
  7d0:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7d2:	8a4e                	mv	s4,s3
  7d4:	0009871b          	sext.w	a4,s3
  7d8:	6685                	lui	a3,0x1
  7da:	00d77363          	bgeu	a4,a3,7e0 <malloc+0x44>
  7de:	6a05                	lui	s4,0x1
  7e0:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7e4:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  7e8:	00001917          	auipc	s2,0x1
  7ec:	81890913          	addi	s2,s2,-2024 # 1000 <freep>
-  if(p == (char*)-1)
  7f0:	5afd                	li	s5,-1
  7f2:	a081                	j	832 <malloc+0x96>
  7f4:	f04a                	sd	s2,32(sp)
  7f6:	e852                	sd	s4,16(sp)
  7f8:	e456                	sd	s5,8(sp)
  7fa:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  7fc:	00001797          	auipc	a5,0x1
  800:	81478793          	addi	a5,a5,-2028 # 1010 <base>
  804:	00000717          	auipc	a4,0x0
  808:	7ef73e23          	sd	a5,2044(a4) # 1000 <freep>
  80c:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  80e:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  812:	b7c1                	j	7d2 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  814:	6398                	ld	a4,0(a5)
  816:	e118                	sd	a4,0(a0)
  818:	a8a9                	j	872 <malloc+0xd6>
-  hp->s.size = nu;
  81a:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  81e:	0541                	addi	a0,a0,16
  820:	efbff0ef          	jal	71a <free>
-  return freep;
  824:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  828:	c12d                	beqz	a0,88a <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  82a:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  82c:	4798                	lw	a4,8(a5)
  82e:	02977263          	bgeu	a4,s1,852 <malloc+0xb6>
-    if(p == freep)
  832:	00093703          	ld	a4,0(s2)
  836:	853e                	mv	a0,a5
  838:	fef719e3          	bne	a4,a5,82a <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  83c:	8552                	mv	a0,s4
  83e:	b03ff0ef          	jal	340 <sbrk>
-  if(p == (char*)-1)
  842:	fd551ce3          	bne	a0,s5,81a <malloc+0x7e>
-        return 0;
  846:	4501                	li	a0,0
  848:	7902                	ld	s2,32(sp)
  84a:	6a42                	ld	s4,16(sp)
@@ -1447,24 +1254,16 @@ malloc(uint nbytes)
  854:	6a42                	ld	s4,16(sp)
  856:	6aa2                	ld	s5,8(sp)
  858:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  85a:	fae48de3          	beq	s1,a4,814 <malloc+0x78>
-        p->s.size -= nunits;
  85e:	4137073b          	subw	a4,a4,s3
  862:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  864:	02071693          	slli	a3,a4,0x20
  868:	01c6d713          	srli	a4,a3,0x1c
  86c:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  86e:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  872:	00000717          	auipc	a4,0x0
  876:	78a73723          	sd	a0,1934(a4) # 1000 <freep>
-      return (void*)(p + 1);
  87a:	01078513          	addi	a0,a5,16
-  }
-}
  87e:	70e2                	ld	ra,56(sp)
  880:	7442                	ld	s0,48(sp)
  882:	74a2                	ld	s1,40(sp)
diff --git a/user/malloc_test.o b/user/malloc_test.o
index 36f4f4ce1c1e7319988da8e949034c84ee590bb8..a5cf2d868ead91cbda63b84659e9a06c35253a37 100644
Binary files a/user/malloc_test.o and b/user/malloc_test.o differ
diff --git a/user/mkdir.asm b/user/mkdir.asm
index 7ce3bfea8a6aff776dd47eaaf4b6138dfb9f1313..7607f646d4b32284fcaec8fffebd0f4c007c36d3 100644
--- a/user/mkdir.asm
+++ b/user/mkdir.asm
@@ -497,245 +497,123 @@ memcpy(void *dst, const void *src, uint n)
  2c6:	8082                	ret
 
 00000000000002c8 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2c8:	4885                	li	a7,1
- ecall
  2ca:	00000073          	ecall
- ret
  2ce:	8082                	ret
 
 00000000000002d0 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2d0:	4889                	li	a7,2
- ecall
  2d2:	00000073          	ecall
- ret
  2d6:	8082                	ret
 
 00000000000002d8 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2d8:	488d                	li	a7,3
- ecall
  2da:	00000073          	ecall
- ret
  2de:	8082                	ret
 
 00000000000002e0 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2e0:	4891                	li	a7,4
- ecall
  2e2:	00000073          	ecall
- ret
  2e6:	8082                	ret
 
 00000000000002e8 <read>:
-.global read
-read:
- li a7, SYS_read
  2e8:	4895                	li	a7,5
- ecall
  2ea:	00000073          	ecall
- ret
  2ee:	8082                	ret
 
 00000000000002f0 <write>:
-.global write
-write:
- li a7, SYS_write
  2f0:	48c1                	li	a7,16
- ecall
  2f2:	00000073          	ecall
- ret
  2f6:	8082                	ret
 
 00000000000002f8 <close>:
-.global close
-close:
- li a7, SYS_close
  2f8:	48d5                	li	a7,21
- ecall
  2fa:	00000073          	ecall
- ret
  2fe:	8082                	ret
 
 0000000000000300 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  300:	4899                	li	a7,6
- ecall
  302:	00000073          	ecall
- ret
  306:	8082                	ret
 
 0000000000000308 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  308:	489d                	li	a7,7
- ecall
  30a:	00000073          	ecall
- ret
  30e:	8082                	ret
 
 0000000000000310 <open>:
-.global open
-open:
- li a7, SYS_open
  310:	48bd                	li	a7,15
- ecall
  312:	00000073          	ecall
- ret
  316:	8082                	ret
 
 0000000000000318 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  318:	48c5                	li	a7,17
- ecall
  31a:	00000073          	ecall
- ret
  31e:	8082                	ret
 
 0000000000000320 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  320:	48c9                	li	a7,18
- ecall
  322:	00000073          	ecall
- ret
  326:	8082                	ret
 
 0000000000000328 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  328:	48a1                	li	a7,8
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <link>:
-.global link
-link:
- li a7, SYS_link
  330:	48cd                	li	a7,19
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  338:	48d1                	li	a7,20
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  340:	48a5                	li	a7,9
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  348:	48a9                	li	a7,10
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  350:	48ad                	li	a7,11
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  358:	48b1                	li	a7,12
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  360:	48b5                	li	a7,13
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  368:	48b9                	li	a7,14
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  370:	48d9                	li	a7,22
- ecall
  372:	00000073          	ecall
- ret
  376:	8082                	ret
 
 0000000000000378 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  378:	48dd                	li	a7,23
- ecall
  37a:	00000073          	ecall
- ret
  37e:	8082                	ret
 
 0000000000000380 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  380:	48e1                	li	a7,24
- ecall
  382:	00000073          	ecall
- ret
  386:	8082                	ret
 
 0000000000000388 <putc>:
@@ -1278,184 +1156,113 @@ printf(const char *fmt, ...)
  730:	8082                	ret
 
 0000000000000732 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  732:	1141                	addi	sp,sp,-16
  734:	e422                	sd	s0,8(sp)
  736:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  738:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  73c:	00001797          	auipc	a5,0x1
  740:	8c47b783          	ld	a5,-1852(a5) # 1000 <freep>
  744:	a02d                	j	76e <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;
  746:	4618                	lw	a4,8(a2)
  748:	9f2d                	addw	a4,a4,a1
  74a:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  74e:	6398                	ld	a4,0(a5)
  750:	6310                	ld	a2,0(a4)
  752:	a83d                	j	790 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  754:	ff852703          	lw	a4,-8(a0)
  758:	9f31                	addw	a4,a4,a2
  75a:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  75c:	ff053683          	ld	a3,-16(a0)
  760:	a091                	j	7a4 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  762:	6398                	ld	a4,0(a5)
  764:	00e7e463          	bltu	a5,a4,76c <free+0x3a>
  768:	00e6ea63          	bltu	a3,a4,77c <free+0x4a>
-{
  76c:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  76e:	fed7fae3          	bgeu	a5,a3,762 <free+0x30>
  772:	6398                	ld	a4,0(a5)
  774:	00e6e463          	bltu	a3,a4,77c <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  778:	fee7eae3          	bltu	a5,a4,76c <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  77c:	ff852583          	lw	a1,-8(a0)
  780:	6390                	ld	a2,0(a5)
  782:	02059813          	slli	a6,a1,0x20
  786:	01c85713          	srli	a4,a6,0x1c
  78a:	9736                	add	a4,a4,a3
  78c:	fae60de3          	beq	a2,a4,746 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  790:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  794:	4790                	lw	a2,8(a5)
  796:	02061593          	slli	a1,a2,0x20
  79a:	01c5d713          	srli	a4,a1,0x1c
  79e:	973e                	add	a4,a4,a5
  7a0:	fae68ae3          	beq	a3,a4,754 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7a4:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7a6:	00001717          	auipc	a4,0x1
  7aa:	84f73d23          	sd	a5,-1958(a4) # 1000 <freep>
-}
  7ae:	6422                	ld	s0,8(sp)
  7b0:	0141                	addi	sp,sp,16
  7b2:	8082                	ret
 
 00000000000007b4 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7b4:	7139                	addi	sp,sp,-64
  7b6:	fc06                	sd	ra,56(sp)
  7b8:	f822                	sd	s0,48(sp)
  7ba:	f426                	sd	s1,40(sp)
  7bc:	ec4e                	sd	s3,24(sp)
  7be:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7c0:	02051493          	slli	s1,a0,0x20
  7c4:	9081                	srli	s1,s1,0x20
  7c6:	04bd                	addi	s1,s1,15
  7c8:	8091                	srli	s1,s1,0x4
  7ca:	0014899b          	addiw	s3,s1,1
  7ce:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7d0:	00001517          	auipc	a0,0x1
  7d4:	83053503          	ld	a0,-2000(a0) # 1000 <freep>
  7d8:	c915                	beqz	a0,80c <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7da:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7dc:	4798                	lw	a4,8(a5)
  7de:	08977a63          	bgeu	a4,s1,872 <malloc+0xbe>
  7e2:	f04a                	sd	s2,32(sp)
  7e4:	e852                	sd	s4,16(sp)
  7e6:	e456                	sd	s5,8(sp)
  7e8:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7ea:	8a4e                	mv	s4,s3
  7ec:	0009871b          	sext.w	a4,s3
  7f0:	6685                	lui	a3,0x1
  7f2:	00d77363          	bgeu	a4,a3,7f8 <malloc+0x44>
  7f6:	6a05                	lui	s4,0x1
  7f8:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7fc:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  800:	00001917          	auipc	s2,0x1
  804:	80090913          	addi	s2,s2,-2048 # 1000 <freep>
-  if(p == (char*)-1)
  808:	5afd                	li	s5,-1
  80a:	a081                	j	84a <malloc+0x96>
  80c:	f04a                	sd	s2,32(sp)
  80e:	e852                	sd	s4,16(sp)
  810:	e456                	sd	s5,8(sp)
  812:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  814:	00000797          	auipc	a5,0x0
  818:	7fc78793          	addi	a5,a5,2044 # 1010 <base>
  81c:	00000717          	auipc	a4,0x0
  820:	7ef73223          	sd	a5,2020(a4) # 1000 <freep>
  824:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  826:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  82a:	b7c1                	j	7ea <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  82c:	6398                	ld	a4,0(a5)
  82e:	e118                	sd	a4,0(a0)
  830:	a8a9                	j	88a <malloc+0xd6>
-  hp->s.size = nu;
  832:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  836:	0541                	addi	a0,a0,16
  838:	efbff0ef          	jal	732 <free>
-  return freep;
  83c:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  840:	c12d                	beqz	a0,8a2 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  842:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  844:	4798                	lw	a4,8(a5)
  846:	02977263          	bgeu	a4,s1,86a <malloc+0xb6>
-    if(p == freep)
  84a:	00093703          	ld	a4,0(s2)
  84e:	853e                	mv	a0,a5
  850:	fef719e3          	bne	a4,a5,842 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  854:	8552                	mv	a0,s4
  856:	b03ff0ef          	jal	358 <sbrk>
-  if(p == (char*)-1)
  85a:	fd551ce3          	bne	a0,s5,832 <malloc+0x7e>
-        return 0;
  85e:	4501                	li	a0,0
  860:	7902                	ld	s2,32(sp)
  862:	6a42                	ld	s4,16(sp)
@@ -1466,24 +1273,16 @@ malloc(uint nbytes)
  86c:	6a42                	ld	s4,16(sp)
  86e:	6aa2                	ld	s5,8(sp)
  870:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  872:	fae48de3          	beq	s1,a4,82c <malloc+0x78>
-        p->s.size -= nunits;
  876:	4137073b          	subw	a4,a4,s3
  87a:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  87c:	02071693          	slli	a3,a4,0x20
  880:	01c6d713          	srli	a4,a3,0x1c
  884:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  886:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  88a:	00000717          	auipc	a4,0x0
  88e:	76a73b23          	sd	a0,1910(a4) # 1000 <freep>
-      return (void*)(p + 1);
  892:	01078513          	addi	a0,a5,16
-  }
-}
  896:	70e2                	ld	ra,56(sp)
  898:	7442                	ld	s0,48(sp)
  89a:	74a2                	ld	s1,40(sp)
diff --git a/user/mkdir.o b/user/mkdir.o
index 8d9ef43e221ddf0ee5ec2f1c8b866420f67d033f..60807cf73b5961d5a31a6b7fecbee20ab3641cad 100644
Binary files a/user/mkdir.o and b/user/mkdir.o differ
diff --git a/user/pgtbltest.asm b/user/pgtbltest.asm
index 6eae89ede0e4eeef33f9cb57ecb457d028fc42be..197b2e9278b7dcd0e65e96c8b4e182c0962ed522 100644
--- a/user/pgtbltest.asm
+++ b/user/pgtbltest.asm
@@ -494,245 +494,123 @@ memcpy(void *dst, const void *src, uint n)
  2b8:	8082                	ret
 
 00000000000002ba <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2ba:	4885                	li	a7,1
- ecall
  2bc:	00000073          	ecall
- ret
  2c0:	8082                	ret
 
 00000000000002c2 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2c2:	4889                	li	a7,2
- ecall
  2c4:	00000073          	ecall
- ret
  2c8:	8082                	ret
 
 00000000000002ca <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2ca:	488d                	li	a7,3
- ecall
  2cc:	00000073          	ecall
- ret
  2d0:	8082                	ret
 
 00000000000002d2 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2d2:	4891                	li	a7,4
- ecall
  2d4:	00000073          	ecall
- ret
  2d8:	8082                	ret
 
 00000000000002da <read>:
-.global read
-read:
- li a7, SYS_read
  2da:	4895                	li	a7,5
- ecall
  2dc:	00000073          	ecall
- ret
  2e0:	8082                	ret
 
 00000000000002e2 <write>:
-.global write
-write:
- li a7, SYS_write
  2e2:	48c1                	li	a7,16
- ecall
  2e4:	00000073          	ecall
- ret
  2e8:	8082                	ret
 
 00000000000002ea <close>:
-.global close
-close:
- li a7, SYS_close
  2ea:	48d5                	li	a7,21
- ecall
  2ec:	00000073          	ecall
- ret
  2f0:	8082                	ret
 
 00000000000002f2 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  2f2:	4899                	li	a7,6
- ecall
  2f4:	00000073          	ecall
- ret
  2f8:	8082                	ret
 
 00000000000002fa <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  2fa:	489d                	li	a7,7
- ecall
  2fc:	00000073          	ecall
- ret
  300:	8082                	ret
 
 0000000000000302 <open>:
-.global open
-open:
- li a7, SYS_open
  302:	48bd                	li	a7,15
- ecall
  304:	00000073          	ecall
- ret
  308:	8082                	ret
 
 000000000000030a <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  30a:	48c5                	li	a7,17
- ecall
  30c:	00000073          	ecall
- ret
  310:	8082                	ret
 
 0000000000000312 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  312:	48c9                	li	a7,18
- ecall
  314:	00000073          	ecall
- ret
  318:	8082                	ret
 
 000000000000031a <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  31a:	48a1                	li	a7,8
- ecall
  31c:	00000073          	ecall
- ret
  320:	8082                	ret
 
 0000000000000322 <link>:
-.global link
-link:
- li a7, SYS_link
  322:	48cd                	li	a7,19
- ecall
  324:	00000073          	ecall
- ret
  328:	8082                	ret
 
 000000000000032a <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  32a:	48d1                	li	a7,20
- ecall
  32c:	00000073          	ecall
- ret
  330:	8082                	ret
 
 0000000000000332 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  332:	48a5                	li	a7,9
- ecall
  334:	00000073          	ecall
- ret
  338:	8082                	ret
 
 000000000000033a <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  33a:	48a9                	li	a7,10
- ecall
  33c:	00000073          	ecall
- ret
  340:	8082                	ret
 
 0000000000000342 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  342:	48ad                	li	a7,11
- ecall
  344:	00000073          	ecall
- ret
  348:	8082                	ret
 
 000000000000034a <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  34a:	48b1                	li	a7,12
- ecall
  34c:	00000073          	ecall
- ret
  350:	8082                	ret
 
 0000000000000352 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  352:	48b5                	li	a7,13
- ecall
  354:	00000073          	ecall
- ret
  358:	8082                	ret
 
 000000000000035a <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  35a:	48b9                	li	a7,14
- ecall
  35c:	00000073          	ecall
- ret
  360:	8082                	ret
 
 0000000000000362 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  362:	48d9                	li	a7,22
- ecall
  364:	00000073          	ecall
- ret
  368:	8082                	ret
 
 000000000000036a <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  36a:	48dd                	li	a7,23
- ecall
  36c:	00000073          	ecall
- ret
  370:	8082                	ret
 
 0000000000000372 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  372:	48e1                	li	a7,24
- ecall
  374:	00000073          	ecall
- ret
  378:	8082                	ret
 
 000000000000037a <putc>:
@@ -1275,184 +1153,113 @@ printf(const char *fmt, ...)
  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:	ec4e                	sd	s3,24(sp)
  7b0:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7b2:	02051493          	slli	s1,a0,0x20
  7b6:	9081                	srli	s1,s1,0x20
  7b8:	04bd                	addi	s1,s1,15
  7ba:	8091                	srli	s1,s1,0x4
  7bc:	0014899b          	addiw	s3,s1,1
  7c0:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7c2:	00001517          	auipc	a0,0x1
  7c6:	83e53503          	ld	a0,-1986(a0) # 1000 <freep>
  7ca:	c915                	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){
  7cc:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7ce:	4798                	lw	a4,8(a5)
  7d0:	08977a63          	bgeu	a4,s1,864 <malloc+0xbe>
  7d4:	f04a                	sd	s2,32(sp)
  7d6:	e852                	sd	s4,16(sp)
  7d8:	e456                	sd	s5,8(sp)
  7da:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  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:	a081                	j	83c <malloc+0x96>
  7fe:	f04a                	sd	s2,32(sp)
  800:	e852                	sd	s4,16(sp)
  802:	e456                	sd	s5,8(sp)
  804:	e05a                	sd	s6,0(sp)
-    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:	b7c1                	j	7dc <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  81e:	6398                	ld	a4,0(a5)
  820:	e118                	sd	a4,0(a0)
  822:	a8a9                	j	87c <malloc+0xd6>
-  hp->s.size = nu;
  824:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  828:	0541                	addi	a0,a0,16
  82a:	efbff0ef          	jal	724 <free>
-  return freep;
  82e:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  832:	c12d                	beqz	a0,894 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  834:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  836:	4798                	lw	a4,8(a5)
  838:	02977263          	bgeu	a4,s1,85c <malloc+0xb6>
-    if(p == freep)
  83c:	00093703          	ld	a4,0(s2)
  840:	853e                	mv	a0,a5
  842:	fef719e3          	bne	a4,a5,834 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  846:	8552                	mv	a0,s4
  848:	b03ff0ef          	jal	34a <sbrk>
-  if(p == (char*)-1)
  84c:	fd551ce3          	bne	a0,s5,824 <malloc+0x7e>
-        return 0;
  850:	4501                	li	a0,0
  852:	7902                	ld	s2,32(sp)
  854:	6a42                	ld	s4,16(sp)
@@ -1463,24 +1270,16 @@ malloc(uint nbytes)
  85e:	6a42                	ld	s4,16(sp)
  860:	6aa2                	ld	s5,8(sp)
  862:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  864:	fae48de3          	beq	s1,a4,81e <malloc+0x78>
-        p->s.size -= nunits;
  868:	4137073b          	subw	a4,a4,s3
  86c:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  86e:	02071693          	slli	a3,a4,0x20
  872:	01c6d713          	srli	a4,a3,0x1c
  876:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  878:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  87c:	00000717          	auipc	a4,0x0
  880:	78a73223          	sd	a0,1924(a4) # 1000 <freep>
-      return (void*)(p + 1);
  884:	01078513          	addi	a0,a5,16
-  }
-}
  888:	70e2                	ld	ra,56(sp)
  88a:	7442                	ld	s0,48(sp)
  88c:	74a2                	ld	s1,40(sp)
diff --git a/user/pgtbltest.o b/user/pgtbltest.o
index fddc030120478156a1b336963c98fd46ff9403c5..eee6645507e7b472bba28a5f728993e32b05d765 100644
Binary files a/user/pgtbltest.o and b/user/pgtbltest.o differ
diff --git a/user/printf.o b/user/printf.o
index 8e8acb3cc7c75085048813233e9c3f0fb1645a17..8e4f660cee32595dfc51931ede73e1a665c69abd 100644
Binary files a/user/printf.o and b/user/printf.o differ
diff --git a/user/rm.asm b/user/rm.asm
index b1257749b3311ee7fcf123ed4a88126443e3ab54..d967b4d116ff22a984888e28cd6659b340a49028 100644
--- a/user/rm.asm
+++ b/user/rm.asm
@@ -497,245 +497,123 @@ memcpy(void *dst, const void *src, uint n)
  2c6:	8082                	ret
 
 00000000000002c8 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2c8:	4885                	li	a7,1
- ecall
  2ca:	00000073          	ecall
- ret
  2ce:	8082                	ret
 
 00000000000002d0 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2d0:	4889                	li	a7,2
- ecall
  2d2:	00000073          	ecall
- ret
  2d6:	8082                	ret
 
 00000000000002d8 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2d8:	488d                	li	a7,3
- ecall
  2da:	00000073          	ecall
- ret
  2de:	8082                	ret
 
 00000000000002e0 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2e0:	4891                	li	a7,4
- ecall
  2e2:	00000073          	ecall
- ret
  2e6:	8082                	ret
 
 00000000000002e8 <read>:
-.global read
-read:
- li a7, SYS_read
  2e8:	4895                	li	a7,5
- ecall
  2ea:	00000073          	ecall
- ret
  2ee:	8082                	ret
 
 00000000000002f0 <write>:
-.global write
-write:
- li a7, SYS_write
  2f0:	48c1                	li	a7,16
- ecall
  2f2:	00000073          	ecall
- ret
  2f6:	8082                	ret
 
 00000000000002f8 <close>:
-.global close
-close:
- li a7, SYS_close
  2f8:	48d5                	li	a7,21
- ecall
  2fa:	00000073          	ecall
- ret
  2fe:	8082                	ret
 
 0000000000000300 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  300:	4899                	li	a7,6
- ecall
  302:	00000073          	ecall
- ret
  306:	8082                	ret
 
 0000000000000308 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  308:	489d                	li	a7,7
- ecall
  30a:	00000073          	ecall
- ret
  30e:	8082                	ret
 
 0000000000000310 <open>:
-.global open
-open:
- li a7, SYS_open
  310:	48bd                	li	a7,15
- ecall
  312:	00000073          	ecall
- ret
  316:	8082                	ret
 
 0000000000000318 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  318:	48c5                	li	a7,17
- ecall
  31a:	00000073          	ecall
- ret
  31e:	8082                	ret
 
 0000000000000320 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  320:	48c9                	li	a7,18
- ecall
  322:	00000073          	ecall
- ret
  326:	8082                	ret
 
 0000000000000328 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  328:	48a1                	li	a7,8
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <link>:
-.global link
-link:
- li a7, SYS_link
  330:	48cd                	li	a7,19
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  338:	48d1                	li	a7,20
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  340:	48a5                	li	a7,9
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  348:	48a9                	li	a7,10
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  350:	48ad                	li	a7,11
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  358:	48b1                	li	a7,12
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  360:	48b5                	li	a7,13
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  368:	48b9                	li	a7,14
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  370:	48d9                	li	a7,22
- ecall
  372:	00000073          	ecall
- ret
  376:	8082                	ret
 
 0000000000000378 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  378:	48dd                	li	a7,23
- ecall
  37a:	00000073          	ecall
- ret
  37e:	8082                	ret
 
 0000000000000380 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  380:	48e1                	li	a7,24
- ecall
  382:	00000073          	ecall
- ret
  386:	8082                	ret
 
 0000000000000388 <putc>:
@@ -1278,184 +1156,113 @@ printf(const char *fmt, ...)
  730:	8082                	ret
 
 0000000000000732 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  732:	1141                	addi	sp,sp,-16
  734:	e422                	sd	s0,8(sp)
  736:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  738:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  73c:	00001797          	auipc	a5,0x1
  740:	8c47b783          	ld	a5,-1852(a5) # 1000 <freep>
  744:	a02d                	j	76e <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;
  746:	4618                	lw	a4,8(a2)
  748:	9f2d                	addw	a4,a4,a1
  74a:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  74e:	6398                	ld	a4,0(a5)
  750:	6310                	ld	a2,0(a4)
  752:	a83d                	j	790 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  754:	ff852703          	lw	a4,-8(a0)
  758:	9f31                	addw	a4,a4,a2
  75a:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  75c:	ff053683          	ld	a3,-16(a0)
  760:	a091                	j	7a4 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  762:	6398                	ld	a4,0(a5)
  764:	00e7e463          	bltu	a5,a4,76c <free+0x3a>
  768:	00e6ea63          	bltu	a3,a4,77c <free+0x4a>
-{
  76c:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  76e:	fed7fae3          	bgeu	a5,a3,762 <free+0x30>
  772:	6398                	ld	a4,0(a5)
  774:	00e6e463          	bltu	a3,a4,77c <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  778:	fee7eae3          	bltu	a5,a4,76c <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  77c:	ff852583          	lw	a1,-8(a0)
  780:	6390                	ld	a2,0(a5)
  782:	02059813          	slli	a6,a1,0x20
  786:	01c85713          	srli	a4,a6,0x1c
  78a:	9736                	add	a4,a4,a3
  78c:	fae60de3          	beq	a2,a4,746 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  790:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  794:	4790                	lw	a2,8(a5)
  796:	02061593          	slli	a1,a2,0x20
  79a:	01c5d713          	srli	a4,a1,0x1c
  79e:	973e                	add	a4,a4,a5
  7a0:	fae68ae3          	beq	a3,a4,754 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7a4:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7a6:	00001717          	auipc	a4,0x1
  7aa:	84f73d23          	sd	a5,-1958(a4) # 1000 <freep>
-}
  7ae:	6422                	ld	s0,8(sp)
  7b0:	0141                	addi	sp,sp,16
  7b2:	8082                	ret
 
 00000000000007b4 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7b4:	7139                	addi	sp,sp,-64
  7b6:	fc06                	sd	ra,56(sp)
  7b8:	f822                	sd	s0,48(sp)
  7ba:	f426                	sd	s1,40(sp)
  7bc:	ec4e                	sd	s3,24(sp)
  7be:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7c0:	02051493          	slli	s1,a0,0x20
  7c4:	9081                	srli	s1,s1,0x20
  7c6:	04bd                	addi	s1,s1,15
  7c8:	8091                	srli	s1,s1,0x4
  7ca:	0014899b          	addiw	s3,s1,1
  7ce:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7d0:	00001517          	auipc	a0,0x1
  7d4:	83053503          	ld	a0,-2000(a0) # 1000 <freep>
  7d8:	c915                	beqz	a0,80c <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7da:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7dc:	4798                	lw	a4,8(a5)
  7de:	08977a63          	bgeu	a4,s1,872 <malloc+0xbe>
  7e2:	f04a                	sd	s2,32(sp)
  7e4:	e852                	sd	s4,16(sp)
  7e6:	e456                	sd	s5,8(sp)
  7e8:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7ea:	8a4e                	mv	s4,s3
  7ec:	0009871b          	sext.w	a4,s3
  7f0:	6685                	lui	a3,0x1
  7f2:	00d77363          	bgeu	a4,a3,7f8 <malloc+0x44>
  7f6:	6a05                	lui	s4,0x1
  7f8:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7fc:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  800:	00001917          	auipc	s2,0x1
  804:	80090913          	addi	s2,s2,-2048 # 1000 <freep>
-  if(p == (char*)-1)
  808:	5afd                	li	s5,-1
  80a:	a081                	j	84a <malloc+0x96>
  80c:	f04a                	sd	s2,32(sp)
  80e:	e852                	sd	s4,16(sp)
  810:	e456                	sd	s5,8(sp)
  812:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  814:	00000797          	auipc	a5,0x0
  818:	7fc78793          	addi	a5,a5,2044 # 1010 <base>
  81c:	00000717          	auipc	a4,0x0
  820:	7ef73223          	sd	a5,2020(a4) # 1000 <freep>
  824:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  826:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  82a:	b7c1                	j	7ea <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  82c:	6398                	ld	a4,0(a5)
  82e:	e118                	sd	a4,0(a0)
  830:	a8a9                	j	88a <malloc+0xd6>
-  hp->s.size = nu;
  832:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  836:	0541                	addi	a0,a0,16
  838:	efbff0ef          	jal	732 <free>
-  return freep;
  83c:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  840:	c12d                	beqz	a0,8a2 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  842:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  844:	4798                	lw	a4,8(a5)
  846:	02977263          	bgeu	a4,s1,86a <malloc+0xb6>
-    if(p == freep)
  84a:	00093703          	ld	a4,0(s2)
  84e:	853e                	mv	a0,a5
  850:	fef719e3          	bne	a4,a5,842 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  854:	8552                	mv	a0,s4
  856:	b03ff0ef          	jal	358 <sbrk>
-  if(p == (char*)-1)
  85a:	fd551ce3          	bne	a0,s5,832 <malloc+0x7e>
-        return 0;
  85e:	4501                	li	a0,0
  860:	7902                	ld	s2,32(sp)
  862:	6a42                	ld	s4,16(sp)
@@ -1466,24 +1273,16 @@ malloc(uint nbytes)
  86c:	6a42                	ld	s4,16(sp)
  86e:	6aa2                	ld	s5,8(sp)
  870:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  872:	fae48de3          	beq	s1,a4,82c <malloc+0x78>
-        p->s.size -= nunits;
  876:	4137073b          	subw	a4,a4,s3
  87a:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  87c:	02071693          	slli	a3,a4,0x20
  880:	01c6d713          	srli	a4,a3,0x1c
  884:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  886:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  88a:	00000717          	auipc	a4,0x0
  88e:	76a73b23          	sd	a0,1910(a4) # 1000 <freep>
-      return (void*)(p + 1);
  892:	01078513          	addi	a0,a5,16
-  }
-}
  896:	70e2                	ld	ra,56(sp)
  898:	7442                	ld	s0,48(sp)
  89a:	74a2                	ld	s1,40(sp)
diff --git a/user/rm.o b/user/rm.o
index edd9337773f95d63c3aced7fd1f806321a379bf1..2bc087b7343d1ec82056d102eec5c9f0bc984ba2 100644
Binary files a/user/rm.o and b/user/rm.o differ
diff --git a/user/sh.asm b/user/sh.asm
index 58bfef36596f26991f0717292a45cf94a07ac7b6..92ec243323b1c7e958e688e49fd173acb3908ff1 100644
--- a/user/sh.asm
+++ b/user/sh.asm
@@ -1753,245 +1753,123 @@ memcpy(void *dst, const void *src, uint n)
      bf2:	8082                	ret
 
 0000000000000bf4 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
      bf4:	4885                	li	a7,1
- ecall
      bf6:	00000073          	ecall
- ret
      bfa:	8082                	ret
 
 0000000000000bfc <exit>:
-.global exit
-exit:
- li a7, SYS_exit
      bfc:	4889                	li	a7,2
- ecall
      bfe:	00000073          	ecall
- ret
      c02:	8082                	ret
 
 0000000000000c04 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
      c04:	488d                	li	a7,3
- ecall
      c06:	00000073          	ecall
- ret
      c0a:	8082                	ret
 
 0000000000000c0c <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
      c0c:	4891                	li	a7,4
- ecall
      c0e:	00000073          	ecall
- ret
      c12:	8082                	ret
 
 0000000000000c14 <read>:
-.global read
-read:
- li a7, SYS_read
      c14:	4895                	li	a7,5
- ecall
      c16:	00000073          	ecall
- ret
      c1a:	8082                	ret
 
 0000000000000c1c <write>:
-.global write
-write:
- li a7, SYS_write
      c1c:	48c1                	li	a7,16
- ecall
      c1e:	00000073          	ecall
- ret
      c22:	8082                	ret
 
 0000000000000c24 <close>:
-.global close
-close:
- li a7, SYS_close
      c24:	48d5                	li	a7,21
- ecall
      c26:	00000073          	ecall
- ret
      c2a:	8082                	ret
 
 0000000000000c2c <kill>:
-.global kill
-kill:
- li a7, SYS_kill
      c2c:	4899                	li	a7,6
- ecall
      c2e:	00000073          	ecall
- ret
      c32:	8082                	ret
 
 0000000000000c34 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
      c34:	489d                	li	a7,7
- ecall
      c36:	00000073          	ecall
- ret
      c3a:	8082                	ret
 
 0000000000000c3c <open>:
-.global open
-open:
- li a7, SYS_open
      c3c:	48bd                	li	a7,15
- ecall
      c3e:	00000073          	ecall
- ret
      c42:	8082                	ret
 
 0000000000000c44 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
      c44:	48c5                	li	a7,17
- ecall
      c46:	00000073          	ecall
- ret
      c4a:	8082                	ret
 
 0000000000000c4c <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
      c4c:	48c9                	li	a7,18
- ecall
      c4e:	00000073          	ecall
- ret
      c52:	8082                	ret
 
 0000000000000c54 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
      c54:	48a1                	li	a7,8
- ecall
      c56:	00000073          	ecall
- ret
      c5a:	8082                	ret
 
 0000000000000c5c <link>:
-.global link
-link:
- li a7, SYS_link
      c5c:	48cd                	li	a7,19
- ecall
      c5e:	00000073          	ecall
- ret
      c62:	8082                	ret
 
 0000000000000c64 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
      c64:	48d1                	li	a7,20
- ecall
      c66:	00000073          	ecall
- ret
      c6a:	8082                	ret
 
 0000000000000c6c <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
      c6c:	48a5                	li	a7,9
- ecall
      c6e:	00000073          	ecall
- ret
      c72:	8082                	ret
 
 0000000000000c74 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
      c74:	48a9                	li	a7,10
- ecall
      c76:	00000073          	ecall
- ret
      c7a:	8082                	ret
 
 0000000000000c7c <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
      c7c:	48ad                	li	a7,11
- ecall
      c7e:	00000073          	ecall
- ret
      c82:	8082                	ret
 
 0000000000000c84 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
      c84:	48b1                	li	a7,12
- ecall
      c86:	00000073          	ecall
- ret
      c8a:	8082                	ret
 
 0000000000000c8c <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
      c8c:	48b5                	li	a7,13
- ecall
      c8e:	00000073          	ecall
- ret
      c92:	8082                	ret
 
 0000000000000c94 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
      c94:	48b9                	li	a7,14
- ecall
      c96:	00000073          	ecall
- ret
      c9a:	8082                	ret
 
 0000000000000c9c <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
      c9c:	48d9                	li	a7,22
- ecall
      c9e:	00000073          	ecall
- ret
      ca2:	8082                	ret
 
 0000000000000ca4 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
      ca4:	48dd                	li	a7,23
- ecall
      ca6:	00000073          	ecall
- ret
      caa:	8082                	ret
 
 0000000000000cac <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
      cac:	48e1                	li	a7,24
- ecall
      cae:	00000073          	ecall
- ret
      cb2:	8082                	ret
 
 0000000000000cb4 <putc>:
@@ -2534,184 +2412,113 @@ printf(const char *fmt, ...)
     105c:	8082                	ret
 
 000000000000105e <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
     105e:	1141                	addi	sp,sp,-16
     1060:	e422                	sd	s0,8(sp)
     1062:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
     1064:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
     1068:	00001797          	auipc	a5,0x1
     106c:	fa87b783          	ld	a5,-88(a5) # 2010 <freep>
     1070:	a02d                	j	109a <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;
     1072:	4618                	lw	a4,8(a2)
     1074:	9f2d                	addw	a4,a4,a1
     1076:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
     107a:	6398                	ld	a4,0(a5)
     107c:	6310                	ld	a2,0(a4)
     107e:	a83d                	j	10bc <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
     1080:	ff852703          	lw	a4,-8(a0)
     1084:	9f31                	addw	a4,a4,a2
     1086:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
     1088:	ff053683          	ld	a3,-16(a0)
     108c:	a091                	j	10d0 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
     108e:	6398                	ld	a4,0(a5)
     1090:	00e7e463          	bltu	a5,a4,1098 <free+0x3a>
     1094:	00e6ea63          	bltu	a3,a4,10a8 <free+0x4a>
-{
     1098:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
     109a:	fed7fae3          	bgeu	a5,a3,108e <free+0x30>
     109e:	6398                	ld	a4,0(a5)
     10a0:	00e6e463          	bltu	a3,a4,10a8 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
     10a4:	fee7eae3          	bltu	a5,a4,1098 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
     10a8:	ff852583          	lw	a1,-8(a0)
     10ac:	6390                	ld	a2,0(a5)
     10ae:	02059813          	slli	a6,a1,0x20
     10b2:	01c85713          	srli	a4,a6,0x1c
     10b6:	9736                	add	a4,a4,a3
     10b8:	fae60de3          	beq	a2,a4,1072 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
     10bc:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
     10c0:	4790                	lw	a2,8(a5)
     10c2:	02061593          	slli	a1,a2,0x20
     10c6:	01c5d713          	srli	a4,a1,0x1c
     10ca:	973e                	add	a4,a4,a5
     10cc:	fae68ae3          	beq	a3,a4,1080 <free+0x22>
-    p->s.ptr = bp->s.ptr;
     10d0:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
     10d2:	00001717          	auipc	a4,0x1
     10d6:	f2f73f23          	sd	a5,-194(a4) # 2010 <freep>
-}
     10da:	6422                	ld	s0,8(sp)
     10dc:	0141                	addi	sp,sp,16
     10de:	8082                	ret
 
 00000000000010e0 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
     10e0:	7139                	addi	sp,sp,-64
     10e2:	fc06                	sd	ra,56(sp)
     10e4:	f822                	sd	s0,48(sp)
     10e6:	f426                	sd	s1,40(sp)
     10e8:	ec4e                	sd	s3,24(sp)
     10ea:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
     10ec:	02051493          	slli	s1,a0,0x20
     10f0:	9081                	srli	s1,s1,0x20
     10f2:	04bd                	addi	s1,s1,15
     10f4:	8091                	srli	s1,s1,0x4
     10f6:	0014899b          	addiw	s3,s1,1
     10fa:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
     10fc:	00001517          	auipc	a0,0x1
     1100:	f1453503          	ld	a0,-236(a0) # 2010 <freep>
     1104:	c915                	beqz	a0,1138 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
     1106:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
     1108:	4798                	lw	a4,8(a5)
     110a:	08977a63          	bgeu	a4,s1,119e <malloc+0xbe>
     110e:	f04a                	sd	s2,32(sp)
     1110:	e852                	sd	s4,16(sp)
     1112:	e456                	sd	s5,8(sp)
     1114:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
     1116:	8a4e                	mv	s4,s3
     1118:	0009871b          	sext.w	a4,s3
     111c:	6685                	lui	a3,0x1
     111e:	00d77363          	bgeu	a4,a3,1124 <malloc+0x44>
     1122:	6a05                	lui	s4,0x1
     1124:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
     1128:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
     112c:	00001917          	auipc	s2,0x1
     1130:	ee490913          	addi	s2,s2,-284 # 2010 <freep>
-  if(p == (char*)-1)
     1134:	5afd                	li	s5,-1
     1136:	a081                	j	1176 <malloc+0x96>
     1138:	f04a                	sd	s2,32(sp)
     113a:	e852                	sd	s4,16(sp)
     113c:	e456                	sd	s5,8(sp)
     113e:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
     1140:	00001797          	auipc	a5,0x1
     1144:	f4878793          	addi	a5,a5,-184 # 2088 <base>
     1148:	00001717          	auipc	a4,0x1
     114c:	ecf73423          	sd	a5,-312(a4) # 2010 <freep>
     1150:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
     1152:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
     1156:	b7c1                	j	1116 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
     1158:	6398                	ld	a4,0(a5)
     115a:	e118                	sd	a4,0(a0)
     115c:	a8a9                	j	11b6 <malloc+0xd6>
-  hp->s.size = nu;
     115e:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
     1162:	0541                	addi	a0,a0,16
     1164:	efbff0ef          	jal	105e <free>
-  return freep;
     1168:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
     116c:	c12d                	beqz	a0,11ce <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
     116e:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
     1170:	4798                	lw	a4,8(a5)
     1172:	02977263          	bgeu	a4,s1,1196 <malloc+0xb6>
-    if(p == freep)
     1176:	00093703          	ld	a4,0(s2)
     117a:	853e                	mv	a0,a5
     117c:	fef719e3          	bne	a4,a5,116e <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
     1180:	8552                	mv	a0,s4
     1182:	b03ff0ef          	jal	c84 <sbrk>
-  if(p == (char*)-1)
     1186:	fd551ce3          	bne	a0,s5,115e <malloc+0x7e>
-        return 0;
     118a:	4501                	li	a0,0
     118c:	7902                	ld	s2,32(sp)
     118e:	6a42                	ld	s4,16(sp)
@@ -2722,24 +2529,16 @@ malloc(uint nbytes)
     1198:	6a42                	ld	s4,16(sp)
     119a:	6aa2                	ld	s5,8(sp)
     119c:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
     119e:	fae48de3          	beq	s1,a4,1158 <malloc+0x78>
-        p->s.size -= nunits;
     11a2:	4137073b          	subw	a4,a4,s3
     11a6:	c798                	sw	a4,8(a5)
-        p += p->s.size;
     11a8:	02071693          	slli	a3,a4,0x20
     11ac:	01c6d713          	srli	a4,a3,0x1c
     11b0:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
     11b2:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
     11b6:	00001717          	auipc	a4,0x1
     11ba:	e4a73d23          	sd	a0,-422(a4) # 2010 <freep>
-      return (void*)(p + 1);
     11be:	01078513          	addi	a0,a5,16
-  }
-}
     11c2:	70e2                	ld	ra,56(sp)
     11c4:	7442                	ld	s0,48(sp)
     11c6:	74a2                	ld	s1,40(sp)
diff --git a/user/sh.o b/user/sh.o
index 5af324585e30bab45ceff66448f540a44ebdd906..d455f83b6ea17335dc222b6ebe1502bef9e52d08 100644
Binary files a/user/sh.o and b/user/sh.o differ
diff --git a/user/sleep.asm b/user/sleep.asm
index 5cc06831bb5cef067b4e03a9868aa921eb3e423e..939657bb5c740f704363e8a0feff6e70d40c6996 100644
--- a/user/sleep.asm
+++ b/user/sleep.asm
@@ -47,50 +47,87 @@ main(int argc, char* argv[])
   42:	bff1                	j	1e <main+0x1e>
 
 0000000000000044 <start>:
+// 
+// wrapper so that it's OK if main() does not call exit().
+//
+void
+start()
+{
   44:	1141                	addi	sp,sp,-16
   46:	e406                	sd	ra,8(sp)
   48:	e022                	sd	s0,0(sp)
   4a:	0800                	addi	s0,sp,16
+  extern int main();
+  main();
   4c:	fb5ff0ef          	jal	0 <main>
+  exit(0);
   50:	4501                	li	a0,0
   52:	25c000ef          	jal	2ae <exit>
 
 0000000000000056 <strcpy>:
+}
+
+char*
+strcpy(char *s, const char *t)
+{
   56:	1141                	addi	sp,sp,-16
   58:	e422                	sd	s0,8(sp)
   5a:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
   5c:	87aa                	mv	a5,a0
   5e:	0585                	addi	a1,a1,1
   60:	0785                	addi	a5,a5,1
   62:	fff5c703          	lbu	a4,-1(a1)
   66:	fee78fa3          	sb	a4,-1(a5)
   6a:	fb75                	bnez	a4,5e <strcpy+0x8>
+    ;
+  return os;
+}
   6c:	6422                	ld	s0,8(sp)
   6e:	0141                	addi	sp,sp,16
   70:	8082                	ret
 
 0000000000000072 <strcmp>:
+
+int
+strcmp(const char *p, const char *q)
+{
   72:	1141                	addi	sp,sp,-16
   74:	e422                	sd	s0,8(sp)
   76:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
   78:	00054783          	lbu	a5,0(a0)
   7c:	cb91                	beqz	a5,90 <strcmp+0x1e>
   7e:	0005c703          	lbu	a4,0(a1)
   82:	00f71763          	bne	a4,a5,90 <strcmp+0x1e>
+    p++, q++;
   86:	0505                	addi	a0,a0,1
   88:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
   8a:	00054783          	lbu	a5,0(a0)
   8e:	fbe5                	bnez	a5,7e <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
   90:	0005c503          	lbu	a0,0(a1)
+}
   94:	40a7853b          	subw	a0,a5,a0
   98:	6422                	ld	s0,8(sp)
   9a:	0141                	addi	sp,sp,16
   9c:	8082                	ret
 
 000000000000009e <strlen>:
+
+uint
+strlen(const char *s)
+{
   9e:	1141                	addi	sp,sp,-16
   a0:	e422                	sd	s0,8(sp)
   a2:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
   a4:	00054783          	lbu	a5,0(a0)
   a8:	cf91                	beqz	a5,c4 <strlen+0x26>
   aa:	0505                	addi	a0,a0,1
@@ -101,46 +138,77 @@ main(int argc, char* argv[])
   b6:	ff65                	bnez	a4,ae <strlen+0x10>
   b8:	40a6853b          	subw	a0,a3,a0
   bc:	2505                	addiw	a0,a0,1
+    ;
+  return n;
+}
   be:	6422                	ld	s0,8(sp)
   c0:	0141                	addi	sp,sp,16
   c2:	8082                	ret
+  for(n = 0; s[n]; n++)
   c4:	4501                	li	a0,0
   c6:	bfe5                	j	be <strlen+0x20>
 
 00000000000000c8 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
   c8:	1141                	addi	sp,sp,-16
   ca:	e422                	sd	s0,8(sp)
   cc:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
   ce:	ca19                	beqz	a2,e4 <memset+0x1c>
   d0:	87aa                	mv	a5,a0
   d2:	1602                	slli	a2,a2,0x20
   d4:	9201                	srli	a2,a2,0x20
   d6:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
   da:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
   de:	0785                	addi	a5,a5,1
   e0:	fee79de3          	bne	a5,a4,da <memset+0x12>
+  }
+  return dst;
+}
   e4:	6422                	ld	s0,8(sp)
   e6:	0141                	addi	sp,sp,16
   e8:	8082                	ret
 
 00000000000000ea <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
   ea:	1141                	addi	sp,sp,-16
   ec:	e422                	sd	s0,8(sp)
   ee:	0800                	addi	s0,sp,16
+  for(; *s; s++)
   f0:	00054783          	lbu	a5,0(a0)
   f4:	cb99                	beqz	a5,10a <strchr+0x20>
+    if(*s == c)
   f6:	00f58763          	beq	a1,a5,104 <strchr+0x1a>
+  for(; *s; s++)
   fa:	0505                	addi	a0,a0,1
   fc:	00054783          	lbu	a5,0(a0)
  100:	fbfd                	bnez	a5,f6 <strchr+0xc>
+      return (char*)s;
+  return 0;
  102:	4501                	li	a0,0
+}
  104:	6422                	ld	s0,8(sp)
  106:	0141                	addi	sp,sp,16
  108:	8082                	ret
+  return 0;
  10a:	4501                	li	a0,0
  10c:	bfe5                	j	104 <strchr+0x1a>
 
 000000000000010e <gets>:
+
+char*
+gets(char *buf, int max)
+{
  10e:	711d                	addi	sp,sp,-96
  110:	ec86                	sd	ra,88(sp)
  112:	e8a2                	sd	s0,80(sp)
@@ -154,28 +222,48 @@ main(int argc, char* argv[])
  122:	1080                	addi	s0,sp,96
  124:	8baa                	mv	s7,a0
  126:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
  128:	892a                	mv	s2,a0
  12a:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
  12c:	4aa9                	li	s5,10
  12e:	4b35                	li	s6,13
+  for(i=0; i+1 < max; ){
  130:	89a6                	mv	s3,s1
  132:	2485                	addiw	s1,s1,1
  134:	0344d663          	bge	s1,s4,160 <gets+0x52>
+    cc = read(0, &c, 1);
  138:	4605                	li	a2,1
  13a:	faf40593          	addi	a1,s0,-81
  13e:	4501                	li	a0,0
  140:	186000ef          	jal	2c6 <read>
+    if(cc < 1)
  144:	00a05e63          	blez	a0,160 <gets+0x52>
+    buf[i++] = c;
  148:	faf44783          	lbu	a5,-81(s0)
  14c:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
  150:	01578763          	beq	a5,s5,15e <gets+0x50>
  154:	0905                	addi	s2,s2,1
  156:	fd679de3          	bne	a5,s6,130 <gets+0x22>
+    buf[i++] = c;
  15a:	89a6                	mv	s3,s1
  15c:	a011                	j	160 <gets+0x52>
  15e:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
  160:	99de                	add	s3,s3,s7
  162:	00098023          	sb	zero,0(s3)
+  return buf;
+}
  166:	855e                	mv	a0,s7
  168:	60e6                	ld	ra,88(sp)
  16a:	6446                	ld	s0,80(sp)
@@ -190,123 +278,200 @@ main(int argc, char* argv[])
  17c:	8082                	ret
 
 000000000000017e <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
  17e:	1101                	addi	sp,sp,-32
  180:	ec06                	sd	ra,24(sp)
  182:	e822                	sd	s0,16(sp)
  184:	e04a                	sd	s2,0(sp)
  186:	1000                	addi	s0,sp,32
  188:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
  18a:	4581                	li	a1,0
  18c:	162000ef          	jal	2ee <open>
+  if(fd < 0)
  190:	02054263          	bltz	a0,1b4 <stat+0x36>
  194:	e426                	sd	s1,8(sp)
  196:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
  198:	85ca                	mv	a1,s2
  19a:	16c000ef          	jal	306 <fstat>
  19e:	892a                	mv	s2,a0
+  close(fd);
  1a0:	8526                	mv	a0,s1
  1a2:	134000ef          	jal	2d6 <close>
+  return r;
  1a6:	64a2                	ld	s1,8(sp)
+}
  1a8:	854a                	mv	a0,s2
  1aa:	60e2                	ld	ra,24(sp)
  1ac:	6442                	ld	s0,16(sp)
  1ae:	6902                	ld	s2,0(sp)
  1b0:	6105                	addi	sp,sp,32
  1b2:	8082                	ret
+    return -1;
  1b4:	597d                	li	s2,-1
  1b6:	bfcd                	j	1a8 <stat+0x2a>
 
 00000000000001b8 <atoi>:
+
+int
+atoi(const char *s)
+{
  1b8:	1141                	addi	sp,sp,-16
  1ba:	e422                	sd	s0,8(sp)
  1bc:	0800                	addi	s0,sp,16
+  int n;
+
+  n = 0;
+  while('0' <= *s && *s <= '9')
  1be:	00054683          	lbu	a3,0(a0)
  1c2:	fd06879b          	addiw	a5,a3,-48
  1c6:	0ff7f793          	zext.b	a5,a5
  1ca:	4625                	li	a2,9
  1cc:	02f66863          	bltu	a2,a5,1fc <atoi+0x44>
  1d0:	872a                	mv	a4,a0
+  n = 0;
  1d2:	4501                	li	a0,0
+    n = n*10 + *s++ - '0';
  1d4:	0705                	addi	a4,a4,1
  1d6:	0025179b          	slliw	a5,a0,0x2
  1da:	9fa9                	addw	a5,a5,a0
  1dc:	0017979b          	slliw	a5,a5,0x1
  1e0:	9fb5                	addw	a5,a5,a3
  1e2:	fd07851b          	addiw	a0,a5,-48
+  while('0' <= *s && *s <= '9')
  1e6:	00074683          	lbu	a3,0(a4)
  1ea:	fd06879b          	addiw	a5,a3,-48
  1ee:	0ff7f793          	zext.b	a5,a5
  1f2:	fef671e3          	bgeu	a2,a5,1d4 <atoi+0x1c>
+  return n;
+}
  1f6:	6422                	ld	s0,8(sp)
  1f8:	0141                	addi	sp,sp,16
  1fa:	8082                	ret
+  n = 0;
  1fc:	4501                	li	a0,0
  1fe:	bfe5                	j	1f6 <atoi+0x3e>
 
 0000000000000200 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
  200:	1141                	addi	sp,sp,-16
  202:	e422                	sd	s0,8(sp)
  204:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
  206:	02b57463          	bgeu	a0,a1,22e <memmove+0x2e>
+    while(n-- > 0)
  20a:	00c05f63          	blez	a2,228 <memmove+0x28>
  20e:	1602                	slli	a2,a2,0x20
  210:	9201                	srli	a2,a2,0x20
  212:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
  216:	872a                	mv	a4,a0
+      *dst++ = *src++;
  218:	0585                	addi	a1,a1,1
  21a:	0705                	addi	a4,a4,1
  21c:	fff5c683          	lbu	a3,-1(a1)
  220:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
  224:	fef71ae3          	bne	a4,a5,218 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
  228:	6422                	ld	s0,8(sp)
  22a:	0141                	addi	sp,sp,16
  22c:	8082                	ret
+    dst += n;
  22e:	00c50733          	add	a4,a0,a2
+    src += n;
  232:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
  234:	fec05ae3          	blez	a2,228 <memmove+0x28>
  238:	fff6079b          	addiw	a5,a2,-1
  23c:	1782                	slli	a5,a5,0x20
  23e:	9381                	srli	a5,a5,0x20
  240:	fff7c793          	not	a5,a5
  244:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
  246:	15fd                	addi	a1,a1,-1
  248:	177d                	addi	a4,a4,-1
  24a:	0005c683          	lbu	a3,0(a1)
  24e:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
  252:	fee79ae3          	bne	a5,a4,246 <memmove+0x46>
  256:	bfc9                	j	228 <memmove+0x28>
 
 0000000000000258 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
  258:	1141                	addi	sp,sp,-16
  25a:	e422                	sd	s0,8(sp)
  25c:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
  25e:	ca05                	beqz	a2,28e <memcmp+0x36>
  260:	fff6069b          	addiw	a3,a2,-1
  264:	1682                	slli	a3,a3,0x20
  266:	9281                	srli	a3,a3,0x20
  268:	0685                	addi	a3,a3,1
  26a:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
  26c:	00054783          	lbu	a5,0(a0)
  270:	0005c703          	lbu	a4,0(a1)
  274:	00e79863          	bne	a5,a4,284 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
  278:	0505                	addi	a0,a0,1
+    p2++;
  27a:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
  27c:	fed518e3          	bne	a0,a3,26c <memcmp+0x14>
+  }
+  return 0;
  280:	4501                	li	a0,0
  282:	a019                	j	288 <memcmp+0x30>
+      return *p1 - *p2;
  284:	40e7853b          	subw	a0,a5,a4
+}
  288:	6422                	ld	s0,8(sp)
  28a:	0141                	addi	sp,sp,16
  28c:	8082                	ret
+  return 0;
  28e:	4501                	li	a0,0
  290:	bfe5                	j	288 <memcmp+0x30>
 
 0000000000000292 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
  292:	1141                	addi	sp,sp,-16
  294:	e406                	sd	ra,8(sp)
  296:	e022                	sd	s0,0(sp)
  298:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
  29a:	f67ff0ef          	jal	200 <memmove>
+}
  29e:	60a2                	ld	ra,8(sp)
  2a0:	6402                	ld	s0,0(sp)
  2a2:	0141                	addi	sp,sp,16
@@ -433,32 +598,60 @@ main(int argc, char* argv[])
  364:	8082                	ret
 
 0000000000000366 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
  366:	1101                	addi	sp,sp,-32
  368:	ec06                	sd	ra,24(sp)
  36a:	e822                	sd	s0,16(sp)
  36c:	1000                	addi	s0,sp,32
  36e:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
  372:	4605                	li	a2,1
  374:	fef40593          	addi	a1,s0,-17
  378:	f57ff0ef          	jal	2ce <write>
+}
  37c:	60e2                	ld	ra,24(sp)
  37e:	6442                	ld	s0,16(sp)
  380:	6105                	addi	sp,sp,32
  382:	8082                	ret
 
 0000000000000384 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
  384:	7139                	addi	sp,sp,-64
  386:	fc06                	sd	ra,56(sp)
  388:	f822                	sd	s0,48(sp)
  38a:	f426                	sd	s1,40(sp)
  38c:	0080                	addi	s0,sp,64
  38e:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
  390:	c299                	beqz	a3,396 <printint+0x12>
  392:	0805c963          	bltz	a1,424 <printint+0xa0>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
  396:	2581                	sext.w	a1,a1
+  neg = 0;
  398:	4881                	li	a7,0
  39a:	fc040693          	addi	a3,s0,-64
+  }
+
+  i = 0;
  39e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
  3a0:	2601                	sext.w	a2,a2
  3a2:	00000517          	auipc	a0,0x0
  3a6:	52e50513          	addi	a0,a0,1326 # 8d0 <digits>
@@ -470,16 +663,21 @@ main(int argc, char* argv[])
  3b6:	97aa                	add	a5,a5,a0
  3b8:	0007c783          	lbu	a5,0(a5)
  3bc:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
  3c0:	0005879b          	sext.w	a5,a1
  3c4:	02c5d5bb          	divuw	a1,a1,a2
  3c8:	0685                	addi	a3,a3,1
  3ca:	fec7f0e3          	bgeu	a5,a2,3aa <printint+0x26>
+  if(neg)
  3ce:	00088c63          	beqz	a7,3e6 <printint+0x62>
+    buf[i++] = '-';
  3d2:	fd070793          	addi	a5,a4,-48
  3d6:	00878733          	add	a4,a5,s0
  3da:	02d00793          	li	a5,45
  3de:	fef70823          	sb	a5,-16(a4)
  3e2:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
  3e6:	02e05a63          	blez	a4,41a <printint+0x96>
  3ea:	f04a                	sd	s2,32(sp)
  3ec:	ec4e                	sd	s3,24(sp)
@@ -491,28 +689,45 @@ main(int argc, char* argv[])
  3fe:	1702                	slli	a4,a4,0x20
  400:	9301                	srli	a4,a4,0x20
  402:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
  406:	fff94583          	lbu	a1,-1(s2)
  40a:	8526                	mv	a0,s1
  40c:	f5bff0ef          	jal	366 <putc>
+  while(--i >= 0)
  410:	197d                	addi	s2,s2,-1
  412:	ff391ae3          	bne	s2,s3,406 <printint+0x82>
  416:	7902                	ld	s2,32(sp)
  418:	69e2                	ld	s3,24(sp)
+}
  41a:	70e2                	ld	ra,56(sp)
  41c:	7442                	ld	s0,48(sp)
  41e:	74a2                	ld	s1,40(sp)
  420:	6121                	addi	sp,sp,64
  422:	8082                	ret
+    x = -xx;
  424:	40b005bb          	negw	a1,a1
+    neg = 1;
  428:	4885                	li	a7,1
+    x = -xx;
  42a:	bf85                	j	39a <printint+0x16>
 
 000000000000042c <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
  42c:	711d                	addi	sp,sp,-96
  42e:	ec86                	sd	ra,88(sp)
  430:	e8a2                	sd	s0,80(sp)
  432:	e0ca                	sd	s2,64(sp)
  434:	1080                	addi	s0,sp,96
+  char *s;
+  int c0, c1, c2, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
  436:	0005c903          	lbu	s2,0(a1)
  43a:	26090863          	beqz	s2,6aa <vprintf+0x27e>
  43e:	e4a6                	sd	s1,72(sp)
@@ -526,51 +741,110 @@ main(int argc, char* argv[])
  44e:	8b2a                	mv	s6,a0
  450:	8a2e                	mv	s4,a1
  452:	8bb2                	mv	s7,a2
+  state = 0;
  454:	4981                	li	s3,0
+  for(i = 0; fmt[i]; i++){
  456:	4481                	li	s1,0
  458:	4701                	li	a4,0
+      if(c0 == '%'){
+        state = '%';
+      } else {
+        putc(fd, c0);
+      }
+    } else if(state == '%'){
  45a:	02500a93          	li	s5,37
+      c1 = c2 = 0;
+      if(c0) c1 = fmt[i+1] & 0xff;
+      if(c1) c2 = fmt[i+2] & 0xff;
+      if(c0 == 'd'){
  45e:	06400c13          	li	s8,100
+        printint(fd, va_arg(ap, int), 10, 1);
+      } else if(c0 == 'l' && c1 == 'd'){
  462:	06c00c93          	li	s9,108
  466:	a005                	j	486 <vprintf+0x5a>
+        putc(fd, c0);
  468:	85ca                	mv	a1,s2
  46a:	855a                	mv	a0,s6
  46c:	efbff0ef          	jal	366 <putc>
  470:	a019                	j	476 <vprintf+0x4a>
+    } else if(state == '%'){
  472:	03598263          	beq	s3,s5,496 <vprintf+0x6a>
+  for(i = 0; fmt[i]; i++){
  476:	2485                	addiw	s1,s1,1
  478:	8726                	mv	a4,s1
  47a:	009a07b3          	add	a5,s4,s1
  47e:	0007c903          	lbu	s2,0(a5)
  482:	20090c63          	beqz	s2,69a <vprintf+0x26e>
+    c0 = fmt[i] & 0xff;
  486:	0009079b          	sext.w	a5,s2
+    if(state == 0){
  48a:	fe0994e3          	bnez	s3,472 <vprintf+0x46>
+      if(c0 == '%'){
  48e:	fd579de3          	bne	a5,s5,468 <vprintf+0x3c>
+        state = '%';
  492:	89be                	mv	s3,a5
  494:	b7cd                	j	476 <vprintf+0x4a>
+      if(c0) c1 = fmt[i+1] & 0xff;
  496:	00ea06b3          	add	a3,s4,a4
  49a:	0016c683          	lbu	a3,1(a3)
+      c1 = c2 = 0;
  49e:	8636                	mv	a2,a3
+      if(c1) c2 = fmt[i+2] & 0xff;
  4a0:	c681                	beqz	a3,4a8 <vprintf+0x7c>
  4a2:	9752                	add	a4,a4,s4
  4a4:	00274603          	lbu	a2,2(a4)
+      if(c0 == 'd'){
  4a8:	03878f63          	beq	a5,s8,4e6 <vprintf+0xba>
+      } else if(c0 == 'l' && c1 == 'd'){
  4ac:	05978963          	beq	a5,s9,4fe <vprintf+0xd2>
+        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'){
  4b0:	07500713          	li	a4,117
  4b4:	0ee78363          	beq	a5,a4,59a <vprintf+0x16e>
+        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'){
  4b8:	07800713          	li	a4,120
  4bc:	12e78563          	beq	a5,a4,5e6 <vprintf+0x1ba>
+        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'){
  4c0:	07000713          	li	a4,112
  4c4:	14e78a63          	beq	a5,a4,618 <vprintf+0x1ec>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c0 == 's'){
  4c8:	07300713          	li	a4,115
  4cc:	18e78a63          	beq	a5,a4,660 <vprintf+0x234>
+        if((s = va_arg(ap, char*)) == 0)
+          s = "(null)";
+        for(; *s; s++)
+          putc(fd, *s);
+      } else if(c0 == '%'){
  4d0:	02500713          	li	a4,37
  4d4:	04e79563          	bne	a5,a4,51e <vprintf+0xf2>
+        putc(fd, '%');
  4d8:	02500593          	li	a1,37
  4dc:	855a                	mv	a0,s6
  4de:	e89ff0ef          	jal	366 <putc>
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+#endif
+      state = 0;
  4e2:	4981                	li	s3,0
  4e4:	bf49                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 1);
  4e6:	008b8913          	addi	s2,s7,8
  4ea:	4685                	li	a3,1
  4ec:	4629                	li	a2,10
@@ -578,60 +852,87 @@ main(int argc, char* argv[])
  4f2:	855a                	mv	a0,s6
  4f4:	e91ff0ef          	jal	384 <printint>
  4f8:	8bca                	mv	s7,s2
+      state = 0;
  4fa:	4981                	li	s3,0
  4fc:	bfad                	j	476 <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'd'){
  4fe:	06400793          	li	a5,100
  502:	02f68963          	beq	a3,a5,534 <vprintf+0x108>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
  506:	06c00793          	li	a5,108
  50a:	04f68263          	beq	a3,a5,54e <vprintf+0x122>
+      } else if(c0 == 'l' && c1 == 'u'){
  50e:	07500793          	li	a5,117
  512:	0af68063          	beq	a3,a5,5b2 <vprintf+0x186>
+      } else if(c0 == 'l' && c1 == 'x'){
  516:	07800793          	li	a5,120
  51a:	0ef68263          	beq	a3,a5,5fe <vprintf+0x1d2>
+        putc(fd, '%');
  51e:	02500593          	li	a1,37
  522:	855a                	mv	a0,s6
  524:	e43ff0ef          	jal	366 <putc>
+        putc(fd, c0);
  528:	85ca                	mv	a1,s2
  52a:	855a                	mv	a0,s6
  52c:	e3bff0ef          	jal	366 <putc>
+      state = 0;
  530:	4981                	li	s3,0
  532:	b791                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
  534:	008b8913          	addi	s2,s7,8
  538:	4685                	li	a3,1
  53a:	4629                	li	a2,10
  53c:	000ba583          	lw	a1,0(s7)
  540:	855a                	mv	a0,s6
  542:	e43ff0ef          	jal	384 <printint>
+        i += 1;
  546:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 1);
  548:	8bca                	mv	s7,s2
+      state = 0;
  54a:	4981                	li	s3,0
+        i += 1;
  54c:	b72d                	j	476 <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
  54e:	06400793          	li	a5,100
  552:	02f60763          	beq	a2,a5,580 <vprintf+0x154>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
  556:	07500793          	li	a5,117
  55a:	06f60963          	beq	a2,a5,5cc <vprintf+0x1a0>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
  55e:	07800793          	li	a5,120
  562:	faf61ee3          	bne	a2,a5,51e <vprintf+0xf2>
+        printint(fd, va_arg(ap, uint64), 16, 0);
  566:	008b8913          	addi	s2,s7,8
  56a:	4681                	li	a3,0
  56c:	4641                	li	a2,16
  56e:	000ba583          	lw	a1,0(s7)
  572:	855a                	mv	a0,s6
  574:	e11ff0ef          	jal	384 <printint>
+        i += 2;
  578:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 16, 0);
  57a:	8bca                	mv	s7,s2
+      state = 0;
  57c:	4981                	li	s3,0
+        i += 2;
  57e:	bde5                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
  580:	008b8913          	addi	s2,s7,8
  584:	4685                	li	a3,1
  586:	4629                	li	a2,10
  588:	000ba583          	lw	a1,0(s7)
  58c:	855a                	mv	a0,s6
  58e:	df7ff0ef          	jal	384 <printint>
+        i += 2;
  592:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 1);
  594:	8bca                	mv	s7,s2
+      state = 0;
  596:	4981                	li	s3,0
+        i += 2;
  598:	bdf9                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 0);
  59a:	008b8913          	addi	s2,s7,8
  59e:	4681                	li	a3,0
  5a0:	4629                	li	a2,10
@@ -639,28 +940,40 @@ main(int argc, char* argv[])
  5a6:	855a                	mv	a0,s6
  5a8:	dddff0ef          	jal	384 <printint>
  5ac:	8bca                	mv	s7,s2
+      state = 0;
  5ae:	4981                	li	s3,0
  5b0:	b5d9                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
  5b2:	008b8913          	addi	s2,s7,8
  5b6:	4681                	li	a3,0
  5b8:	4629                	li	a2,10
  5ba:	000ba583          	lw	a1,0(s7)
  5be:	855a                	mv	a0,s6
  5c0:	dc5ff0ef          	jal	384 <printint>
+        i += 1;
  5c4:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 0);
  5c6:	8bca                	mv	s7,s2
+      state = 0;
  5c8:	4981                	li	s3,0
+        i += 1;
  5ca:	b575                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
  5cc:	008b8913          	addi	s2,s7,8
  5d0:	4681                	li	a3,0
  5d2:	4629                	li	a2,10
  5d4:	000ba583          	lw	a1,0(s7)
  5d8:	855a                	mv	a0,s6
  5da:	dabff0ef          	jal	384 <printint>
+        i += 2;
  5de:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 0);
  5e0:	8bca                	mv	s7,s2
+      state = 0;
  5e2:	4981                	li	s3,0
+        i += 2;
  5e4:	bd49                	j	476 <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 16, 0);
  5e6:	008b8913          	addi	s2,s7,8
  5ea:	4681                	li	a3,0
  5ec:	4641                	li	a2,16
@@ -668,28 +981,38 @@ main(int argc, char* argv[])
  5f2:	855a                	mv	a0,s6
  5f4:	d91ff0ef          	jal	384 <printint>
  5f8:	8bca                	mv	s7,s2
+      state = 0;
  5fa:	4981                	li	s3,0
  5fc:	bdad                	j	476 <vprintf+0x4a>
+        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:	d79ff0ef          	jal	384 <printint>
+        i += 1;
  610:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 16, 0);
  612:	8bca                	mv	s7,s2
+      state = 0;
  614:	4981                	li	s3,0
+        i += 1;
  616:	b585                	j	476 <vprintf+0x4a>
  618:	e06a                	sd	s10,0(sp)
+        printptr(fd, va_arg(ap, uint64));
  61a:	008b8d13          	addi	s10,s7,8
  61e:	000bb983          	ld	s3,0(s7)
+  putc(fd, '0');
  622:	03000593          	li	a1,48
  626:	855a                	mv	a0,s6
  628:	d3fff0ef          	jal	366 <putc>
+  putc(fd, 'x');
  62c:	07800593          	li	a1,120
  630:	855a                	mv	a0,s6
  632:	d35ff0ef          	jal	366 <putc>
  636:	4941                	li	s2,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
  638:	00000b97          	auipc	s7,0x0
  63c:	298b8b93          	addi	s7,s7,664 # 8d0 <digits>
  640:	03c9d793          	srli	a5,s3,0x3c
@@ -697,31 +1020,44 @@ main(int argc, char* argv[])
  646:	0007c583          	lbu	a1,0(a5)
  64a:	855a                	mv	a0,s6
  64c:	d1bff0ef          	jal	366 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
  650:	0992                	slli	s3,s3,0x4
  652:	397d                	addiw	s2,s2,-1
  654:	fe0916e3          	bnez	s2,640 <vprintf+0x214>
+        printptr(fd, va_arg(ap, uint64));
  658:	8bea                	mv	s7,s10
+      state = 0;
  65a:	4981                	li	s3,0
  65c:	6d02                	ld	s10,0(sp)
  65e:	bd21                	j	476 <vprintf+0x4a>
+        if((s = va_arg(ap, char*)) == 0)
  660:	008b8993          	addi	s3,s7,8
  664:	000bb903          	ld	s2,0(s7)
  668:	00090f63          	beqz	s2,686 <vprintf+0x25a>
+        for(; *s; s++)
  66c:	00094583          	lbu	a1,0(s2)
  670:	c195                	beqz	a1,694 <vprintf+0x268>
+          putc(fd, *s);
  672:	855a                	mv	a0,s6
  674:	cf3ff0ef          	jal	366 <putc>
+        for(; *s; s++)
  678:	0905                	addi	s2,s2,1
  67a:	00094583          	lbu	a1,0(s2)
  67e:	f9f5                	bnez	a1,672 <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
  680:	8bce                	mv	s7,s3
+      state = 0;
  682:	4981                	li	s3,0
  684:	bbcd                	j	476 <vprintf+0x4a>
+          s = "(null)";
  686:	00000917          	auipc	s2,0x0
  68a:	24290913          	addi	s2,s2,578 # 8c8 <malloc+0x136>
+        for(; *s; s++)
  68e:	02800593          	li	a1,40
  692:	b7c5                	j	672 <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
  694:	8bce                	mv	s7,s3
+      state = 0;
  696:	4981                	li	s3,0
  698:	bbf9                	j	476 <vprintf+0x4a>
  69a:	64a6                	ld	s1,72(sp)
@@ -732,6 +1068,9 @@ main(int argc, char* argv[])
  6a4:	6be2                	ld	s7,24(sp)
  6a6:	6c42                	ld	s8,16(sp)
  6a8:	6ca2                	ld	s9,8(sp)
+    }
+  }
+}
  6aa:	60e6                	ld	ra,88(sp)
  6ac:	6446                	ld	s0,80(sp)
  6ae:	6906                	ld	s2,64(sp)
@@ -739,6 +1078,10 @@ main(int argc, char* argv[])
  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)
@@ -749,15 +1092,24 @@ main(int argc, char* argv[])
  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:	d5bff0ef          	jal	42c <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)
@@ -769,11 +1121,16 @@ main(int argc, char* argv[])
  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:	d29ff0ef          	jal	42c <vprintf>
+}
  708:	60e2                	ld	ra,24(sp)
  70a:	6442                	ld	s0,16(sp)
  70c:	6125                	addi	sp,sp,96
diff --git a/user/sleep.o b/user/sleep.o
index 8629f59bfe1ea23130ca58a38a38d2a1acf61588..599a73f345219668862b87aabe6dded6d35a107a 100644
Binary files a/user/sleep.o and b/user/sleep.o differ
diff --git a/user/stressfs.asm b/user/stressfs.asm
index a8edba61025ac0f1db20b2ab6c9cfbe8ec7f0d82..7d93b08d510628242ff6f2dc43600b3b28945a69 100644
--- a/user/stressfs.asm
+++ b/user/stressfs.asm
@@ -542,245 +542,123 @@ memcpy(void *dst, const void *src, uint n)
  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 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  3e2:	48d9                	li	a7,22
- ecall
  3e4:	00000073          	ecall
- ret
  3e8:	8082                	ret
 
 00000000000003ea <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  3ea:	48dd                	li	a7,23
- ecall
  3ec:	00000073          	ecall
- ret
  3f0:	8082                	ret
 
 00000000000003f2 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  3f2:	48e1                	li	a7,24
- ecall
  3f4:	00000073          	ecall
- ret
  3f8:	8082                	ret
 
 00000000000003fa <putc>:
@@ -1323,184 +1201,113 @@ printf(const char *fmt, ...)
  7a2:	8082                	ret
 
 00000000000007a4 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  7a4:	1141                	addi	sp,sp,-16
  7a6:	e422                	sd	s0,8(sp)
  7a8:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  7aa:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7ae:	00001797          	auipc	a5,0x1
  7b2:	8527b783          	ld	a5,-1966(a5) # 1000 <freep>
  7b6:	a02d                	j	7e0 <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;
  7b8:	4618                	lw	a4,8(a2)
  7ba:	9f2d                	addw	a4,a4,a1
  7bc:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  7c0:	6398                	ld	a4,0(a5)
  7c2:	6310                	ld	a2,0(a4)
  7c4:	a83d                	j	802 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  7c6:	ff852703          	lw	a4,-8(a0)
  7ca:	9f31                	addw	a4,a4,a2
  7cc:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  7ce:	ff053683          	ld	a3,-16(a0)
  7d2:	a091                	j	816 <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7d4:	6398                	ld	a4,0(a5)
  7d6:	00e7e463          	bltu	a5,a4,7de <free+0x3a>
  7da:	00e6ea63          	bltu	a3,a4,7ee <free+0x4a>
-{
  7de:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  7e0:	fed7fae3          	bgeu	a5,a3,7d4 <free+0x30>
  7e4:	6398                	ld	a4,0(a5)
  7e6:	00e6e463          	bltu	a3,a4,7ee <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  7ea:	fee7eae3          	bltu	a5,a4,7de <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  7ee:	ff852583          	lw	a1,-8(a0)
  7f2:	6390                	ld	a2,0(a5)
  7f4:	02059813          	slli	a6,a1,0x20
  7f8:	01c85713          	srli	a4,a6,0x1c
  7fc:	9736                	add	a4,a4,a3
  7fe:	fae60de3          	beq	a2,a4,7b8 <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  802:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  806:	4790                	lw	a2,8(a5)
  808:	02061593          	slli	a1,a2,0x20
  80c:	01c5d713          	srli	a4,a1,0x1c
  810:	973e                	add	a4,a4,a5
  812:	fae68ae3          	beq	a3,a4,7c6 <free+0x22>
-    p->s.ptr = bp->s.ptr;
  816:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  818:	00000717          	auipc	a4,0x0
  81c:	7ef73423          	sd	a5,2024(a4) # 1000 <freep>
-}
  820:	6422                	ld	s0,8(sp)
  822:	0141                	addi	sp,sp,16
  824:	8082                	ret
 
 0000000000000826 <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  826:	7139                	addi	sp,sp,-64
  828:	fc06                	sd	ra,56(sp)
  82a:	f822                	sd	s0,48(sp)
  82c:	f426                	sd	s1,40(sp)
  82e:	ec4e                	sd	s3,24(sp)
  830:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  832:	02051493          	slli	s1,a0,0x20
  836:	9081                	srli	s1,s1,0x20
  838:	04bd                	addi	s1,s1,15
  83a:	8091                	srli	s1,s1,0x4
  83c:	0014899b          	addiw	s3,s1,1
  840:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  842:	00000517          	auipc	a0,0x0
  846:	7be53503          	ld	a0,1982(a0) # 1000 <freep>
  84a:	c915                	beqz	a0,87e <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  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:	08977a63          	bgeu	a4,s1,8e4 <malloc+0xbe>
  854:	f04a                	sd	s2,32(sp)
  856:	e852                	sd	s4,16(sp)
  858:	e456                	sd	s5,8(sp)
  85a:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  85c:	8a4e                	mv	s4,s3
  85e:	0009871b          	sext.w	a4,s3
  862:	6685                	lui	a3,0x1
  864:	00d77363          	bgeu	a4,a3,86a <malloc+0x44>
  868:	6a05                	lui	s4,0x1
  86a:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  86e:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  872:	00000917          	auipc	s2,0x0
  876:	78e90913          	addi	s2,s2,1934 # 1000 <freep>
-  if(p == (char*)-1)
  87a:	5afd                	li	s5,-1
  87c:	a081                	j	8bc <malloc+0x96>
  87e:	f04a                	sd	s2,32(sp)
  880:	e852                	sd	s4,16(sp)
  882:	e456                	sd	s5,8(sp)
  884:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  886:	00000797          	auipc	a5,0x0
  88a:	78a78793          	addi	a5,a5,1930 # 1010 <base>
  88e:	00000717          	auipc	a4,0x0
  892:	76f73923          	sd	a5,1906(a4) # 1000 <freep>
  896:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  898:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  89c:	b7c1                	j	85c <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  89e:	6398                	ld	a4,0(a5)
  8a0:	e118                	sd	a4,0(a0)
  8a2:	a8a9                	j	8fc <malloc+0xd6>
-  hp->s.size = nu;
  8a4:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  8a8:	0541                	addi	a0,a0,16
  8aa:	efbff0ef          	jal	7a4 <free>
-  return freep;
  8ae:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  8b2:	c12d                	beqz	a0,914 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8b4:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8b6:	4798                	lw	a4,8(a5)
  8b8:	02977263          	bgeu	a4,s1,8dc <malloc+0xb6>
-    if(p == freep)
  8bc:	00093703          	ld	a4,0(s2)
  8c0:	853e                	mv	a0,a5
  8c2:	fef719e3          	bne	a4,a5,8b4 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  8c6:	8552                	mv	a0,s4
  8c8:	b03ff0ef          	jal	3ca <sbrk>
-  if(p == (char*)-1)
  8cc:	fd551ce3          	bne	a0,s5,8a4 <malloc+0x7e>
-        return 0;
  8d0:	4501                	li	a0,0
  8d2:	7902                	ld	s2,32(sp)
  8d4:	6a42                	ld	s4,16(sp)
@@ -1511,24 +1318,16 @@ malloc(uint nbytes)
  8de:	6a42                	ld	s4,16(sp)
  8e0:	6aa2                	ld	s5,8(sp)
  8e2:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  8e4:	fae48de3          	beq	s1,a4,89e <malloc+0x78>
-        p->s.size -= nunits;
  8e8:	4137073b          	subw	a4,a4,s3
  8ec:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  8ee:	02071693          	slli	a3,a4,0x20
  8f2:	01c6d713          	srli	a4,a3,0x1c
  8f6:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  8f8:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  8fc:	00000717          	auipc	a4,0x0
  900:	70a73223          	sd	a0,1796(a4) # 1000 <freep>
-      return (void*)(p + 1);
  904:	01078513          	addi	a0,a5,16
-  }
-}
  908:	70e2                	ld	ra,56(sp)
  90a:	7442                	ld	s0,48(sp)
  90c:	74a2                	ld	s1,40(sp)
diff --git a/user/stressfs.o b/user/stressfs.o
index 83c71a49be7d10828e45caafc9fd024445c7703d..35849ccd8c4a2da52b52333a6245ba26cda7dbbf 100644
Binary files a/user/stressfs.o and b/user/stressfs.o differ
diff --git a/user/symlinktest.asm b/user/symlinktest.asm
index 4594db9d8d1003063676cd9f17580b546dae6809..3cd78cb4bc1066e22117d8bc421b8dbdfcb4285b 100644
--- a/user/symlinktest.asm
+++ b/user/symlinktest.asm
@@ -629,245 +629,123 @@ memcpy(void *dst, const void *src, uint n)
  3dc:	8082                	ret
 
 00000000000003de <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  3de:	4885                	li	a7,1
- ecall
  3e0:	00000073          	ecall
- ret
  3e4:	8082                	ret
 
 00000000000003e6 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  3e6:	4889                	li	a7,2
- ecall
  3e8:	00000073          	ecall
- ret
  3ec:	8082                	ret
 
 00000000000003ee <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  3ee:	488d                	li	a7,3
- ecall
  3f0:	00000073          	ecall
- ret
  3f4:	8082                	ret
 
 00000000000003f6 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  3f6:	4891                	li	a7,4
- ecall
  3f8:	00000073          	ecall
- ret
  3fc:	8082                	ret
 
 00000000000003fe <read>:
-.global read
-read:
- li a7, SYS_read
  3fe:	4895                	li	a7,5
- ecall
  400:	00000073          	ecall
- ret
  404:	8082                	ret
 
 0000000000000406 <write>:
-.global write
-write:
- li a7, SYS_write
  406:	48c1                	li	a7,16
- ecall
  408:	00000073          	ecall
- ret
  40c:	8082                	ret
 
 000000000000040e <close>:
-.global close
-close:
- li a7, SYS_close
  40e:	48d5                	li	a7,21
- ecall
  410:	00000073          	ecall
- ret
  414:	8082                	ret
 
 0000000000000416 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  416:	4899                	li	a7,6
- ecall
  418:	00000073          	ecall
- ret
  41c:	8082                	ret
 
 000000000000041e <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  41e:	489d                	li	a7,7
- ecall
  420:	00000073          	ecall
- ret
  424:	8082                	ret
 
 0000000000000426 <open>:
-.global open
-open:
- li a7, SYS_open
  426:	48bd                	li	a7,15
- ecall
  428:	00000073          	ecall
- ret
  42c:	8082                	ret
 
 000000000000042e <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  42e:	48c5                	li	a7,17
- ecall
  430:	00000073          	ecall
- ret
  434:	8082                	ret
 
 0000000000000436 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  436:	48c9                	li	a7,18
- ecall
  438:	00000073          	ecall
- ret
  43c:	8082                	ret
 
 000000000000043e <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  43e:	48a1                	li	a7,8
- ecall
  440:	00000073          	ecall
- ret
  444:	8082                	ret
 
 0000000000000446 <link>:
-.global link
-link:
- li a7, SYS_link
  446:	48cd                	li	a7,19
- ecall
  448:	00000073          	ecall
- ret
  44c:	8082                	ret
 
 000000000000044e <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  44e:	48d1                	li	a7,20
- ecall
  450:	00000073          	ecall
- ret
  454:	8082                	ret
 
 0000000000000456 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  456:	48a5                	li	a7,9
- ecall
  458:	00000073          	ecall
- ret
  45c:	8082                	ret
 
 000000000000045e <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  45e:	48a9                	li	a7,10
- ecall
  460:	00000073          	ecall
- ret
  464:	8082                	ret
 
 0000000000000466 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  466:	48ad                	li	a7,11
- ecall
  468:	00000073          	ecall
- ret
  46c:	8082                	ret
 
 000000000000046e <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  46e:	48b1                	li	a7,12
- ecall
  470:	00000073          	ecall
- ret
  474:	8082                	ret
 
 0000000000000476 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  476:	48b5                	li	a7,13
- ecall
  478:	00000073          	ecall
- ret
  47c:	8082                	ret
 
 000000000000047e <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  47e:	48b9                	li	a7,14
- ecall
  480:	00000073          	ecall
- ret
  484:	8082                	ret
 
 0000000000000486 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  486:	48d9                	li	a7,22
- ecall
  488:	00000073          	ecall
- ret
  48c:	8082                	ret
 
 000000000000048e <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  48e:	48dd                	li	a7,23
- ecall
  490:	00000073          	ecall
- ret
  494:	8082                	ret
 
 0000000000000496 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  496:	48e1                	li	a7,24
- ecall
  498:	00000073          	ecall
- ret
  49c:	8082                	ret
 
 000000000000049e <putc>:
@@ -1410,184 +1288,113 @@ printf(const char *fmt, ...)
  846:	8082                	ret
 
 0000000000000848 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  848:	1141                	addi	sp,sp,-16
  84a:	e422                	sd	s0,8(sp)
  84c:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  84e:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  852:	00000797          	auipc	a5,0x0
  856:	7ae7b783          	ld	a5,1966(a5) # 1000 <freep>
  85a:	a02d                	j	884 <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;
  85c:	4618                	lw	a4,8(a2)
  85e:	9f2d                	addw	a4,a4,a1
  860:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  864:	6398                	ld	a4,0(a5)
  866:	6310                	ld	a2,0(a4)
  868:	a83d                	j	8a6 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  86a:	ff852703          	lw	a4,-8(a0)
  86e:	9f31                	addw	a4,a4,a2
  870:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  872:	ff053683          	ld	a3,-16(a0)
  876:	a091                	j	8ba <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  878:	6398                	ld	a4,0(a5)
  87a:	00e7e463          	bltu	a5,a4,882 <free+0x3a>
  87e:	00e6ea63          	bltu	a3,a4,892 <free+0x4a>
-{
  882:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  884:	fed7fae3          	bgeu	a5,a3,878 <free+0x30>
  888:	6398                	ld	a4,0(a5)
  88a:	00e6e463          	bltu	a3,a4,892 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  88e:	fee7eae3          	bltu	a5,a4,882 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  892:	ff852583          	lw	a1,-8(a0)
  896:	6390                	ld	a2,0(a5)
  898:	02059813          	slli	a6,a1,0x20
  89c:	01c85713          	srli	a4,a6,0x1c
  8a0:	9736                	add	a4,a4,a3
  8a2:	fae60de3          	beq	a2,a4,85c <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  8a6:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  8aa:	4790                	lw	a2,8(a5)
  8ac:	02061593          	slli	a1,a2,0x20
  8b0:	01c5d713          	srli	a4,a1,0x1c
  8b4:	973e                	add	a4,a4,a5
  8b6:	fae68ae3          	beq	a3,a4,86a <free+0x22>
-    p->s.ptr = bp->s.ptr;
  8ba:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  8bc:	00000717          	auipc	a4,0x0
  8c0:	74f73223          	sd	a5,1860(a4) # 1000 <freep>
-}
  8c4:	6422                	ld	s0,8(sp)
  8c6:	0141                	addi	sp,sp,16
  8c8:	8082                	ret
 
 00000000000008ca <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  8ca:	7139                	addi	sp,sp,-64
  8cc:	fc06                	sd	ra,56(sp)
  8ce:	f822                	sd	s0,48(sp)
  8d0:	f426                	sd	s1,40(sp)
  8d2:	ec4e                	sd	s3,24(sp)
  8d4:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  8d6:	02051493          	slli	s1,a0,0x20
  8da:	9081                	srli	s1,s1,0x20
  8dc:	04bd                	addi	s1,s1,15
  8de:	8091                	srli	s1,s1,0x4
  8e0:	0014899b          	addiw	s3,s1,1
  8e4:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  8e6:	00000517          	auipc	a0,0x0
  8ea:	71a53503          	ld	a0,1818(a0) # 1000 <freep>
  8ee:	c915                	beqz	a0,922 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8f0:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8f2:	4798                	lw	a4,8(a5)
  8f4:	08977a63          	bgeu	a4,s1,988 <malloc+0xbe>
  8f8:	f04a                	sd	s2,32(sp)
  8fa:	e852                	sd	s4,16(sp)
  8fc:	e456                	sd	s5,8(sp)
  8fe:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  900:	8a4e                	mv	s4,s3
  902:	0009871b          	sext.w	a4,s3
  906:	6685                	lui	a3,0x1
  908:	00d77363          	bgeu	a4,a3,90e <malloc+0x44>
  90c:	6a05                	lui	s4,0x1
  90e:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  912:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  916:	00000917          	auipc	s2,0x0
  91a:	6ea90913          	addi	s2,s2,1770 # 1000 <freep>
-  if(p == (char*)-1)
  91e:	5afd                	li	s5,-1
  920:	a081                	j	960 <malloc+0x96>
  922:	f04a                	sd	s2,32(sp)
  924:	e852                	sd	s4,16(sp)
  926:	e456                	sd	s5,8(sp)
  928:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  92a:	00000797          	auipc	a5,0x0
  92e:	6e678793          	addi	a5,a5,1766 # 1010 <base>
  932:	00000717          	auipc	a4,0x0
  936:	6cf73723          	sd	a5,1742(a4) # 1000 <freep>
  93a:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  93c:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  940:	b7c1                	j	900 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  942:	6398                	ld	a4,0(a5)
  944:	e118                	sd	a4,0(a0)
  946:	a8a9                	j	9a0 <malloc+0xd6>
-  hp->s.size = nu;
  948:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  94c:	0541                	addi	a0,a0,16
  94e:	efbff0ef          	jal	848 <free>
-  return freep;
  952:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  956:	c12d                	beqz	a0,9b8 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  958:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  95a:	4798                	lw	a4,8(a5)
  95c:	02977263          	bgeu	a4,s1,980 <malloc+0xb6>
-    if(p == freep)
  960:	00093703          	ld	a4,0(s2)
  964:	853e                	mv	a0,a5
  966:	fef719e3          	bne	a4,a5,958 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  96a:	8552                	mv	a0,s4
  96c:	b03ff0ef          	jal	46e <sbrk>
-  if(p == (char*)-1)
  970:	fd551ce3          	bne	a0,s5,948 <malloc+0x7e>
-        return 0;
  974:	4501                	li	a0,0
  976:	7902                	ld	s2,32(sp)
  978:	6a42                	ld	s4,16(sp)
@@ -1598,24 +1405,16 @@ malloc(uint nbytes)
  982:	6a42                	ld	s4,16(sp)
  984:	6aa2                	ld	s5,8(sp)
  986:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  988:	fae48de3          	beq	s1,a4,942 <malloc+0x78>
-        p->s.size -= nunits;
  98c:	4137073b          	subw	a4,a4,s3
  990:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  992:	02071693          	slli	a3,a4,0x20
  996:	01c6d713          	srli	a4,a3,0x1c
  99a:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  99c:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  9a0:	00000717          	auipc	a4,0x0
  9a4:	66a73023          	sd	a0,1632(a4) # 1000 <freep>
-      return (void*)(p + 1);
  9a8:	01078513          	addi	a0,a5,16
-  }
-}
  9ac:	70e2                	ld	ra,56(sp)
  9ae:	7442                	ld	s0,48(sp)
  9b0:	74a2                	ld	s1,40(sp)
diff --git a/user/symlinktest.o b/user/symlinktest.o
index 460ba0b59d00a96862e505623de09c01ad956786..1c0924ace2d6e9c3c2dd5ec09fa053a7abc3d154 100644
Binary files a/user/symlinktest.o and b/user/symlinktest.o differ
diff --git a/user/ulib.o b/user/ulib.o
index e87fa61b624de0c35758ba4e8eb4d28dccb0a436..1139333bd5cfa03ced760993409b784176d79807 100644
Binary files a/user/ulib.o and b/user/ulib.o differ
diff --git a/user/usertests.asm b/user/usertests.asm
index cfefe418f09dfd5aab42a5ee602e66d74aba00ef..f16f2fb2a78a9082926dee7663d4c0f42cdeea72 100644
--- a/user/usertests.asm
+++ b/user/usertests.asm
@@ -5,12 +5,6 @@ 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)
@@ -18,7 +12,6 @@ copyinstr1(char *s)
        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:	3fa78793          	addi	a5,a5,1018 # 7408 <malloc+0x249e>
       16:	638c                	ld	a1,0(a5)
@@ -31,28 +24,15 @@ copyinstr1(char *s)
       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:	281040ef          	jal	4ac6 <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)
@@ -60,97 +40,72 @@ copyinstr1(char *s)
       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:	00a50513          	addi	a0,a0,10 # 5070 <malloc+0x106>
       6e:	649040ef          	jal	4eb6 <printf>
-      exit(1);
       72:	4505                	li	a0,1
       74:	213040ef          	jal	4a86 <exit>
 
 0000000000000078 <bsstest>:
-void
-bsstest(char *s)
-{
-  int i;
-
-  for(i = 0; i < sizeof(uninit); i++){
       78:	0000a797          	auipc	a5,0xa
       7c:	4f078793          	addi	a5,a5,1264 # a568 <uninit>
       80:	0000d697          	auipc	a3,0xd
       84:	bf868693          	addi	a3,a3,-1032 # cc78 <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:	ff050513          	addi	a0,a0,-16 # 5090 <malloc+0x126>
       a8:	60f040ef          	jal	4eb6 <printf>
-      exit(1);
       ac:	4505                	li	a0,1
       ae:	1d9040ef          	jal	4a86 <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:	fe850513          	addi	a0,a0,-24 # 50a8 <malloc+0x13e>
       c8:	1ff040ef          	jal	4ac6 <open>
-  if(fd < 0){
       cc:	02054263          	bltz	a0,f0 <opentest+0x3e>
-  close(fd);
       d0:	1df040ef          	jal	4aae <close>
-  fd = open("doesnotexist", 0);
       d4:	4581                	li	a1,0
       d6:	00005517          	auipc	a0,0x5
       da:	ff250513          	addi	a0,a0,-14 # 50c8 <malloc+0x15e>
       de:	1e9040ef          	jal	4ac6 <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:	fbe50513          	addi	a0,a0,-66 # 50b0 <malloc+0x146>
       fa:	5bd040ef          	jal	4eb6 <printf>
-    exit(1);
       fe:	4505                	li	a0,1
      100:	187040ef          	jal	4a86 <exit>
-    printf("%s: open doesnotexist succeeded!\n", s);
      104:	85a6                	mv	a1,s1
      106:	00005517          	auipc	a0,0x5
      10a:	fd250513          	addi	a0,a0,-46 # 50d8 <malloc+0x16e>
      10e:	5a9040ef          	jal	4eb6 <printf>
-    exit(1);
      112:	4505                	li	a0,1
      114:	173040ef          	jal	4a86 <exit>
 
 0000000000000118 <truncate2>:
-{
      118:	7179                	addi	sp,sp,-48
      11a:	f406                	sd	ra,40(sp)
      11c:	f022                	sd	s0,32(sp)
@@ -159,47 +114,37 @@ bsstest(char *s)
      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:	fd850513          	addi	a0,a0,-40 # 5100 <malloc+0x196>
      130:	1a7040ef          	jal	4ad6 <unlink>
-  int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY);
      134:	60100593          	li	a1,1537
      138:	00005517          	auipc	a0,0x5
      13c:	fc850513          	addi	a0,a0,-56 # 5100 <malloc+0x196>
      140:	187040ef          	jal	4ac6 <open>
      144:	84aa                	mv	s1,a0
-  write(fd1, "abcd", 4);
      146:	4611                	li	a2,4
      148:	00005597          	auipc	a1,0x5
      14c:	fc858593          	addi	a1,a1,-56 # 5110 <malloc+0x1a6>
      150:	157040ef          	jal	4aa6 <write>
-  int fd2 = open("truncfile", O_TRUNC|O_WRONLY);
      154:	40100593          	li	a1,1025
      158:	00005517          	auipc	a0,0x5
      15c:	fa850513          	addi	a0,a0,-88 # 5100 <malloc+0x196>
      160:	167040ef          	jal	4ac6 <open>
      164:	892a                	mv	s2,a0
-  int n = write(fd1, "x", 1);
      166:	4605                	li	a2,1
      168:	00005597          	auipc	a1,0x5
      16c:	fb058593          	addi	a1,a1,-80 # 5118 <malloc+0x1ae>
      170:	8526                	mv	a0,s1
      172:	135040ef          	jal	4aa6 <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:	f8450513          	addi	a0,a0,-124 # 5100 <malloc+0x196>
      184:	153040ef          	jal	4ad6 <unlink>
-  close(fd1);
      188:	8526                	mv	a0,s1
      18a:	125040ef          	jal	4aae <close>
-  close(fd2);
      18e:	854a                	mv	a0,s2
      190:	11f040ef          	jal	4aae <close>
-}
      194:	70a2                	ld	ra,40(sp)
      196:	7402                	ld	s0,32(sp)
      198:	64e2                	ld	s1,24(sp)
@@ -207,62 +152,45 @@ bsstest(char *s)
      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:	f7a50513          	addi	a0,a0,-134 # 5120 <malloc+0x1b6>
      1ae:	509040ef          	jal	4eb6 <printf>
-    exit(1);
      1b2:	4505                	li	a0,1
      1b4:	0d3040ef          	jal	4a86 <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:	0e3040ef          	jal	4ac6 <open>
-    close(fd);
      1e8:	0c7040ef          	jal	4aae <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:	0c5040ef          	jal	4ad6 <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)
@@ -271,7 +199,6 @@ bsstest(char *s)
      22a:	8082                	ret
 
 000000000000022c <bigwrite>:
-{
      22c:	715d                	addi	sp,sp,-80
      22e:	e486                	sd	ra,72(sp)
      230:	e0a2                	sd	s0,64(sp)
@@ -284,52 +211,37 @@ bsstest(char *s)
      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:	f0450513          	addi	a0,a0,-252 # 5148 <malloc+0x1de>
      24c:	08b040ef          	jal	4ad6 <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:	ef4a8a93          	addi	s5,s5,-268 # 5148 <malloc+0x1de>
-      int cc = write(fd, buf, sz);
      25c:	0000da17          	auipc	s4,0xd
      260:	a1ca0a13          	addi	s4,s4,-1508 # cc78 <buf>
-  for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){
      264:	6b0d                	lui	s6,0x3
      266:	1c9b0b13          	addi	s6,s6,457 # 31c9 <subdir+0x5e7>
-    fd = open("bigwrite", O_CREATE | O_RDWR);
      26a:	20200593          	li	a1,514
      26e:	8556                	mv	a0,s5
      270:	057040ef          	jal	4ac6 <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:	029040ef          	jal	4aa6 <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:	019040ef          	jal	4aa6 <write>
-      if(cc != sz){
      292:	04951263          	bne	a0,s1,2d6 <bigwrite+0xaa>
-    close(fd);
      296:	854a                	mv	a0,s2
      298:	017040ef          	jal	4aae <close>
-    unlink("bigwrite");
      29c:	8556                	mv	a0,s5
      29e:	039040ef          	jal	4ad6 <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)
@@ -341,34 +253,23 @@ bsstest(char *s)
      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:	e9650513          	addi	a0,a0,-362 # 5158 <malloc+0x1ee>
      2ca:	3ed040ef          	jal	4eb6 <printf>
-      exit(1);
      2ce:	4505                	li	a0,1
      2d0:	7b6040ef          	jal	4a86 <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:	e9c50513          	addi	a0,a0,-356 # 5178 <malloc+0x20e>
      2e4:	3d3040ef          	jal	4eb6 <printf>
-        exit(1);
      2e8:	4505                	li	a0,1
      2ea:	79c040ef          	jal	4a86 <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)
@@ -377,105 +278,64 @@ badwrite(char *s)
      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:	e9250513          	addi	a0,a0,-366 # 5190 <malloc+0x226>
      306:	7d0040ef          	jal	4ad6 <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:	e8298993          	addi	s3,s3,-382 # 5190 <malloc+0x226>
-    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:	7a4040ef          	jal	4ac6 <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:	776040ef          	jal	4aa6 <write>
-    close(fd);
      334:	8526                	mv	a0,s1
      336:	778040ef          	jal	4aae <close>
-    unlink("junk");
      33a:	854e                	mv	a0,s3
      33c:	79a040ef          	jal	4ad6 <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:	e4650513          	addi	a0,a0,-442 # 5190 <malloc+0x226>
      352:	774040ef          	jal	4ac6 <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:	dba58593          	addi	a1,a1,-582 # 5118 <malloc+0x1ae>
      366:	740040ef          	jal	4aa6 <write>
      36a:	4785                	li	a5,1
      36c:	02f50d63          	beq	a0,a5,3a6 <badwrite+0xb8>
-    printf("write failed\n");
      370:	00005517          	auipc	a0,0x5
      374:	e4050513          	addi	a0,a0,-448 # 51b0 <malloc+0x246>
      378:	33f040ef          	jal	4eb6 <printf>
-    exit(1);
      37c:	4505                	li	a0,1
      37e:	708040ef          	jal	4a86 <exit>
-      printf("open junk failed\n");
      382:	00005517          	auipc	a0,0x5
      386:	e1650513          	addi	a0,a0,-490 # 5198 <malloc+0x22e>
      38a:	32d040ef          	jal	4eb6 <printf>
-      exit(1);
      38e:	4505                	li	a0,1
      390:	6f6040ef          	jal	4a86 <exit>
-    printf("open junk failed\n");
      394:	00005517          	auipc	a0,0x5
      398:	e0450513          	addi	a0,a0,-508 # 5198 <malloc+0x22e>
      39c:	31b040ef          	jal	4eb6 <printf>
-    exit(1);
      3a0:	4505                	li	a0,1
      3a2:	6e4040ef          	jal	4a86 <exit>
-  }
-  close(fd);
      3a6:	8526                	mv	a0,s1
      3a8:	706040ef          	jal	4aae <close>
-  unlink("junk");
      3ac:	00005517          	auipc	a0,0x5
      3b0:	de450513          	addi	a0,a0,-540 # 5190 <malloc+0x226>
      3b4:	722040ef          	jal	4ad6 <unlink>
-
-  exit(0);
      3b8:	4501                	li	a0,0
      3ba:	6cc040ef          	jal	4a86 <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)
@@ -483,84 +343,51 @@ outofinodes(char *s)
      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:	6cc040ef          	jal	4ad6 <unlink>
-    int fd = open(name, O_CREATE|O_RDWR|O_TRUNC);
      40e:	60200593          	li	a1,1538
      412:	fb040513          	addi	a0,s0,-80
      416:	6b0040ef          	jal	4ac6 <open>
-    if(fd < 0){
      41a:	00054763          	bltz	a0,428 <outofinodes+0x6a>
-      // failure is eventually expected.
-      break;
-    }
-    close(fd);
      41e:	690040ef          	jal	4aae <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:	670040ef          	jal	4ad6 <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)
@@ -570,7 +397,6 @@ outofinodes(char *s)
      47c:	8082                	ret
 
 000000000000047e <copyin>:
-{
      47e:	7159                	addi	sp,sp,-112
      480:	f486                	sd	ra,104(sp)
      482:	f0a2                	sd	s0,96(sp)
@@ -580,7 +406,6 @@ outofinodes(char *s)
      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:	f7878793          	addi	a5,a5,-136 # 7408 <malloc+0x249e>
      498:	638c                	ld	a1,0(a5)
@@ -593,61 +418,43 @@ outofinodes(char *s)
      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:	d02a0a13          	addi	s4,s4,-766 # 51c0 <malloc+0x256>
-    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:	5f6040ef          	jal	4ac6 <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:	5c8040ef          	jal	4aa6 <write>
-    if(n >= 0){
      4e2:	06055a63          	bgez	a0,556 <copyin+0xd8>
-    close(fd);
      4e6:	8526                	mv	a0,s1
      4e8:	5c6040ef          	jal	4aae <close>
-    unlink("copyin1");
      4ec:	8552                	mv	a0,s4
      4ee:	5e8040ef          	jal	4ad6 <unlink>
-    n = write(1, (char*)addr, 8192);
      4f2:	6609                	lui	a2,0x2
      4f4:	85ce                	mv	a1,s3
      4f6:	4505                	li	a0,1
      4f8:	5ae040ef          	jal	4aa6 <write>
-    if(n > 0){
      4fc:	06a04863          	bgtz	a0,56c <copyin+0xee>
-    if(pipe(fds) < 0){
      500:	f9040513          	addi	a0,s0,-112
      504:	592040ef          	jal	4a96 <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:	592040ef          	jal	4aa6 <write>
-    if(n > 0){
      518:	06a04e63          	bgtz	a0,594 <copyin+0x116>
-    close(fds[0]);
      51c:	f9042503          	lw	a0,-112(s0)
      520:	58e040ef          	jal	4aae <close>
-    close(fds[1]);
      524:	f9442503          	lw	a0,-108(s0)
      528:	586040ef          	jal	4aae <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)
@@ -657,50 +464,39 @@ outofinodes(char *s)
      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:	c8450513          	addi	a0,a0,-892 # 51c8 <malloc+0x25e>
      54c:	16b040ef          	jal	4eb6 <printf>
-      exit(1);
      550:	4505                	li	a0,1
      552:	534040ef          	jal	4a86 <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:	c8650513          	addi	a0,a0,-890 # 51e0 <malloc+0x276>
      562:	155040ef          	jal	4eb6 <printf>
-      exit(1);
      566:	4505                	li	a0,1
      568:	51e040ef          	jal	4a86 <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:	ca050513          	addi	a0,a0,-864 # 5210 <malloc+0x2a6>
      578:	13f040ef          	jal	4eb6 <printf>
-      exit(1);
      57c:	4505                	li	a0,1
      57e:	508040ef          	jal	4a86 <exit>
-      printf("pipe() failed\n");
      582:	00005517          	auipc	a0,0x5
      586:	cbe50513          	addi	a0,a0,-834 # 5240 <malloc+0x2d6>
      58a:	12d040ef          	jal	4eb6 <printf>
-      exit(1);
      58e:	4505                	li	a0,1
      590:	4f6040ef          	jal	4a86 <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:	cb850513          	addi	a0,a0,-840 # 5250 <malloc+0x2e6>
      5a0:	117040ef          	jal	4eb6 <printf>
-      exit(1);
      5a4:	4505                	li	a0,1
      5a6:	4e0040ef          	jal	4a86 <exit>
 
 00000000000005aa <copyout>:
-{
      5aa:	7119                	addi	sp,sp,-128
      5ac:	fc86                	sd	ra,120(sp)
      5ae:	f8a2                	sd	s0,112(sp)
@@ -711,7 +507,6 @@ outofinodes(char *s)
      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:	e4a78793          	addi	a5,a5,-438 # 7408 <malloc+0x249e>
      5c6:	7788                	ld	a0,40(a5)
@@ -726,62 +521,44 @@ outofinodes(char *s)
      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:	c8ea0a13          	addi	s4,s4,-882 # 5280 <malloc+0x316>
-    n = write(fds[1], "x", 1);
      5fa:	00005a97          	auipc	s5,0x5
      5fe:	b1ea8a93          	addi	s5,s5,-1250 # 5118 <malloc+0x1ae>
-    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:	4bc040ef          	jal	4ac6 <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:	486040ef          	jal	4a9e <read>
-    if(n > 0){
      61c:	06a04a63          	bgtz	a0,690 <copyout+0xe6>
-    close(fd);
      620:	8526                	mv	a0,s1
      622:	48c040ef          	jal	4aae <close>
-    if(pipe(fds) < 0){
      626:	f8840513          	addi	a0,s0,-120
      62a:	46c040ef          	jal	4a96 <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:	46c040ef          	jal	4aa6 <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:	452040ef          	jal	4a9e <read>
-    if(n > 0){
      650:	06a04d63          	bgtz	a0,6ca <copyout+0x120>
-    close(fds[0]);
      654:	f8842503          	lw	a0,-120(s0)
      658:	456040ef          	jal	4aae <close>
-    close(fds[1]);
      65c:	f8c42503          	lw	a0,-116(s0)
      660:	44e040ef          	jal	4aae <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)
@@ -792,48 +569,37 @@ outofinodes(char *s)
      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:	c0a50513          	addi	a0,a0,-1014 # 5288 <malloc+0x31e>
      686:	031040ef          	jal	4eb6 <printf>
-      exit(1);
      68a:	4505                	li	a0,1
      68c:	3fa040ef          	jal	4a86 <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:	c0c50513          	addi	a0,a0,-1012 # 52a0 <malloc+0x336>
      69c:	01b040ef          	jal	4eb6 <printf>
-      exit(1);
      6a0:	4505                	li	a0,1
      6a2:	3e4040ef          	jal	4a86 <exit>
-      printf("pipe() failed\n");
      6a6:	00005517          	auipc	a0,0x5
      6aa:	b9a50513          	addi	a0,a0,-1126 # 5240 <malloc+0x2d6>
      6ae:	009040ef          	jal	4eb6 <printf>
-      exit(1);
      6b2:	4505                	li	a0,1
      6b4:	3d2040ef          	jal	4a86 <exit>
-      printf("pipe write failed\n");
      6b8:	00005517          	auipc	a0,0x5
      6bc:	c1850513          	addi	a0,a0,-1000 # 52d0 <malloc+0x366>
      6c0:	7f6040ef          	jal	4eb6 <printf>
-      exit(1);
      6c4:	4505                	li	a0,1
      6c6:	3c0040ef          	jal	4a86 <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:	c1a50513          	addi	a0,a0,-998 # 52e8 <malloc+0x37e>
      6d6:	7e0040ef          	jal	4eb6 <printf>
-      exit(1);
      6da:	4505                	li	a0,1
      6dc:	3aa040ef          	jal	4a86 <exit>
 
 00000000000006e0 <truncate1>:
-{
      6e0:	711d                	addi	sp,sp,-96
      6e2:	ec86                	sd	ra,88(sp)
      6e4:	e8a2                	sd	s0,80(sp)
@@ -844,100 +610,77 @@ outofinodes(char *s)
      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:	a0c50513          	addi	a0,a0,-1524 # 5100 <malloc+0x196>
      6fc:	3da040ef          	jal	4ad6 <unlink>
-  int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
      700:	60100593          	li	a1,1537
      704:	00005517          	auipc	a0,0x5
      708:	9fc50513          	addi	a0,a0,-1540 # 5100 <malloc+0x196>
      70c:	3ba040ef          	jal	4ac6 <open>
      710:	84aa                	mv	s1,a0
-  write(fd1, "abcd", 4);
      712:	4611                	li	a2,4
      714:	00005597          	auipc	a1,0x5
      718:	9fc58593          	addi	a1,a1,-1540 # 5110 <malloc+0x1a6>
      71c:	38a040ef          	jal	4aa6 <write>
-  close(fd1);
      720:	8526                	mv	a0,s1
      722:	38c040ef          	jal	4aae <close>
-  int fd2 = open("truncfile", O_RDONLY);
      726:	4581                	li	a1,0
      728:	00005517          	auipc	a0,0x5
      72c:	9d850513          	addi	a0,a0,-1576 # 5100 <malloc+0x196>
      730:	396040ef          	jal	4ac6 <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:	360040ef          	jal	4a9e <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:	9b450513          	addi	a0,a0,-1612 # 5100 <malloc+0x196>
      754:	372040ef          	jal	4ac6 <open>
      758:	89aa                	mv	s3,a0
-  int fd3 = open("truncfile", O_RDONLY);
      75a:	4581                	li	a1,0
      75c:	00005517          	auipc	a0,0x5
      760:	9a450513          	addi	a0,a0,-1628 # 5100 <malloc+0x196>
      764:	362040ef          	jal	4ac6 <open>
      768:	892a                	mv	s2,a0
-  n = read(fd3, buf, sizeof(buf));
      76a:	02000613          	li	a2,32
      76e:	fa040593          	addi	a1,s0,-96
      772:	32c040ef          	jal	4a9e <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:	31a040ef          	jal	4a9e <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:	bea58593          	addi	a1,a1,-1046 # 5378 <malloc+0x40e>
      796:	854e                	mv	a0,s3
      798:	30e040ef          	jal	4aa6 <write>
-  n = read(fd3, buf, sizeof(buf));
      79c:	02000613          	li	a2,32
      7a0:	fa040593          	addi	a1,s0,-96
      7a4:	854a                	mv	a0,s2
      7a6:	2f8040ef          	jal	4a9e <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:	2e4040ef          	jal	4a9e <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:	93c50513          	addi	a0,a0,-1732 # 5100 <malloc+0x196>
      7cc:	30a040ef          	jal	4ad6 <unlink>
-  close(fd1);
      7d0:	854e                	mv	a0,s3
      7d2:	2dc040ef          	jal	4aae <close>
-  close(fd2);
      7d6:	8526                	mv	a0,s1
      7d8:	2d6040ef          	jal	4aae <close>
-  close(fd3);
      7dc:	854a                	mv	a0,s2
      7de:	2d0040ef          	jal	4aae <close>
-}
      7e2:	60e6                	ld	ra,88(sp)
      7e4:	6446                	ld	s0,80(sp)
      7e6:	64a6                	ld	s1,72(sp)
@@ -947,64 +690,51 @@ outofinodes(char *s)
      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:	b2050513          	addi	a0,a0,-1248 # 5318 <malloc+0x3ae>
      800:	6b6040ef          	jal	4eb6 <printf>
-    exit(1);
      804:	4505                	li	a0,1
      806:	280040ef          	jal	4a86 <exit>
-    printf("aaa fd3=%d\n", fd3);
      80a:	85ca                	mv	a1,s2
      80c:	00005517          	auipc	a0,0x5
      810:	b2c50513          	addi	a0,a0,-1236 # 5338 <malloc+0x3ce>
      814:	6a2040ef          	jal	4eb6 <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:	b2c50513          	addi	a0,a0,-1236 # 5348 <malloc+0x3de>
      824:	692040ef          	jal	4eb6 <printf>
-    exit(1);
      828:	4505                	li	a0,1
      82a:	25c040ef          	jal	4a86 <exit>
-    printf("bbb fd2=%d\n", fd2);
      82e:	85a6                	mv	a1,s1
      830:	00005517          	auipc	a0,0x5
      834:	b3850513          	addi	a0,a0,-1224 # 5368 <malloc+0x3fe>
      838:	67e040ef          	jal	4eb6 <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:	b0850513          	addi	a0,a0,-1272 # 5348 <malloc+0x3de>
      848:	66e040ef          	jal	4eb6 <printf>
-    exit(1);
      84c:	4505                	li	a0,1
      84e:	238040ef          	jal	4a86 <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:	b2a50513          	addi	a0,a0,-1238 # 5380 <malloc+0x416>
      85e:	658040ef          	jal	4eb6 <printf>
-    exit(1);
      862:	4505                	li	a0,1
      864:	222040ef          	jal	4a86 <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:	b3450513          	addi	a0,a0,-1228 # 53a0 <malloc+0x436>
      874:	642040ef          	jal	4eb6 <printf>
-    exit(1);
      878:	4505                	li	a0,1
      87a:	20c040ef          	jal	4a86 <exit>
 
 000000000000087e <writetest>:
-{
      87e:	7139                	addi	sp,sp,-64
      880:	fc06                	sd	ra,56(sp)
      882:	f822                	sd	s0,48(sp)
@@ -1016,68 +746,52 @@ outofinodes(char *s)
      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:	b2850513          	addi	a0,a0,-1240 # 53c0 <malloc+0x456>
      8a0:	226040ef          	jal	4ac6 <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:	b3c98993          	addi	s3,s3,-1220 # 53e8 <malloc+0x47e>
-    if(write(fd, "bbbbbbbbbb", SZ) != SZ){
      8b4:	00005a97          	auipc	s5,0x5
      8b8:	b6ca8a93          	addi	s5,s5,-1172 # 5420 <malloc+0x4b6>
-  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:	1e0040ef          	jal	4aa6 <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:	1d0040ef          	jal	4aa6 <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:	1c6040ef          	jal	4aae <close>
-  fd = open("small", O_RDONLY);
      8ec:	4581                	li	a1,0
      8ee:	00005517          	auipc	a0,0x5
      8f2:	ad250513          	addi	a0,a0,-1326 # 53c0 <malloc+0x456>
      8f6:	1d0040ef          	jal	4ac6 <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:	0000c597          	auipc	a1,0xc
      908:	37458593          	addi	a1,a1,884 # cc78 <buf>
      90c:	192040ef          	jal	4a9e <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:	194040ef          	jal	4aae <close>
-  if(unlink("small") < 0){
      91e:	00005517          	auipc	a0,0x5
      922:	aa250513          	addi	a0,a0,-1374 # 53c0 <malloc+0x456>
      926:	1b0040ef          	jal	4ad6 <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)
@@ -1088,59 +802,46 @@ outofinodes(char *s)
      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:	a8450513          	addi	a0,a0,-1404 # 53c8 <malloc+0x45e>
      94c:	56a040ef          	jal	4eb6 <printf>
-    exit(1);
      950:	4505                	li	a0,1
      952:	134040ef          	jal	4a86 <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:	a9e50513          	addi	a0,a0,-1378 # 53f8 <malloc+0x48e>
      962:	554040ef          	jal	4eb6 <printf>
-      exit(1);
      966:	4505                	li	a0,1
      968:	11e040ef          	jal	4a86 <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:	ac050513          	addi	a0,a0,-1344 # 5430 <malloc+0x4c6>
      978:	53e040ef          	jal	4eb6 <printf>
-      exit(1);
      97c:	4505                	li	a0,1
      97e:	108040ef          	jal	4a86 <exit>
-    printf("%s: error: open small failed!\n", s);
      982:	85da                	mv	a1,s6
      984:	00005517          	auipc	a0,0x5
      988:	ad450513          	addi	a0,a0,-1324 # 5458 <malloc+0x4ee>
      98c:	52a040ef          	jal	4eb6 <printf>
-    exit(1);
      990:	4505                	li	a0,1
      992:	0f4040ef          	jal	4a86 <exit>
-    printf("%s: read failed\n", s);
      996:	85da                	mv	a1,s6
      998:	00005517          	auipc	a0,0x5
      99c:	ae050513          	addi	a0,a0,-1312 # 5478 <malloc+0x50e>
      9a0:	516040ef          	jal	4eb6 <printf>
-    exit(1);
      9a4:	4505                	li	a0,1
      9a6:	0e0040ef          	jal	4a86 <exit>
-    printf("%s: unlink small failed\n", s);
      9aa:	85da                	mv	a1,s6
      9ac:	00005517          	auipc	a0,0x5
      9b0:	ae450513          	addi	a0,a0,-1308 # 5490 <malloc+0x526>
      9b4:	502040ef          	jal	4eb6 <printf>
-    exit(1);
      9b8:	4505                	li	a0,1
      9ba:	0cc040ef          	jal	4a86 <exit>
 
 00000000000009be <writebig>:
-{
      9be:	7139                	addi	sp,sp,-64
      9c0:	fc06                	sd	ra,56(sp)
      9c2:	f822                	sd	s0,48(sp)
@@ -1151,105 +852,76 @@ outofinodes(char *s)
      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:	ada50513          	addi	a0,a0,-1318 # 54b0 <malloc+0x546>
      9de:	0e8040ef          	jal	4ac6 <open>
      9e2:	89aa                	mv	s3,a0
-  for(i = 0; i < MAXFILE; i++){
      9e4:	4481                	li	s1,0
-    ((int*)buf)[0] = i;
      9e6:	0000c917          	auipc	s2,0xc
      9ea:	29290913          	addi	s2,s2,658 # cc78 <buf>
-  for(i = 0; i < MAXFILE; i++){
      9ee:	6a41                	lui	s4,0x10
      9f0:	10ba0a13          	addi	s4,s4,267 # 1010b <base+0x493>
-  if(fd < 0){
      9f4:	06054463          	bltz	a0,a5c <writebig+0x9e>
-    ((int*)buf)[0] = i;
      9f8:	00992023          	sw	s1,0(s2)
-    if(write(fd, buf, BSIZE) != BSIZE){
      9fc:	40000613          	li	a2,1024
      a00:	85ca                	mv	a1,s2
      a02:	854e                	mv	a0,s3
      a04:	0a2040ef          	jal	4aa6 <write>
      a08:	40000793          	li	a5,1024
      a0c:	06f51263          	bne	a0,a5,a70 <writebig+0xb2>
-  for(i = 0; i < MAXFILE; i++){
      a10:	2485                	addiw	s1,s1,1
      a12:	ff4493e3          	bne	s1,s4,9f8 <writebig+0x3a>
-  close(fd);
      a16:	854e                	mv	a0,s3
      a18:	096040ef          	jal	4aae <close>
-  fd = open("big", O_RDONLY);
      a1c:	4581                	li	a1,0
      a1e:	00005517          	auipc	a0,0x5
      a22:	a9250513          	addi	a0,a0,-1390 # 54b0 <malloc+0x546>
      a26:	0a0040ef          	jal	4ac6 <open>
      a2a:	89aa                	mv	s3,a0
-  n = 0;
      a2c:	4481                	li	s1,0
-    i = read(fd, buf, BSIZE);
      a2e:	0000c917          	auipc	s2,0xc
      a32:	24a90913          	addi	s2,s2,586 # cc78 <buf>
-  if(fd < 0){
      a36:	04054863          	bltz	a0,a86 <writebig+0xc8>
-    i = read(fd, buf, BSIZE);
      a3a:	40000613          	li	a2,1024
      a3e:	85ca                	mv	a1,s2
      a40:	854e                	mv	a0,s3
      a42:	05c040ef          	jal	4a9e <read>
-    if(i == 0){
      a46:	c931                	beqz	a0,a9a <writebig+0xdc>
-    } else if(i != BSIZE){
      a48:	40000793          	li	a5,1024
      a4c:	08f51b63          	bne	a0,a5,ae2 <writebig+0x124>
-    if(((int*)buf)[0] != n){
      a50:	00092683          	lw	a3,0(s2)
      a54:	0a969263          	bne	a3,s1,af8 <writebig+0x13a>
-    n++;
      a58:	2485                	addiw	s1,s1,1
-    i = read(fd, buf, BSIZE);
      a5a:	b7c5                	j	a3a <writebig+0x7c>
-    printf("%s: error: creat big failed!\n", s);
      a5c:	85d6                	mv	a1,s5
      a5e:	00005517          	auipc	a0,0x5
      a62:	a5a50513          	addi	a0,a0,-1446 # 54b8 <malloc+0x54e>
      a66:	450040ef          	jal	4eb6 <printf>
-    exit(1);
      a6a:	4505                	li	a0,1
      a6c:	01a040ef          	jal	4a86 <exit>
-      printf("%s: error: write big file failed i=%d\n", s, i);
      a70:	8626                	mv	a2,s1
      a72:	85d6                	mv	a1,s5
      a74:	00005517          	auipc	a0,0x5
      a78:	a6450513          	addi	a0,a0,-1436 # 54d8 <malloc+0x56e>
      a7c:	43a040ef          	jal	4eb6 <printf>
-      exit(1);
      a80:	4505                	li	a0,1
      a82:	004040ef          	jal	4a86 <exit>
-    printf("%s: error: open big failed!\n", s);
      a86:	85d6                	mv	a1,s5
      a88:	00005517          	auipc	a0,0x5
      a8c:	a7850513          	addi	a0,a0,-1416 # 5500 <malloc+0x596>
      a90:	426040ef          	jal	4eb6 <printf>
-    exit(1);
      a94:	4505                	li	a0,1
      a96:	7f1030ef          	jal	4a86 <exit>
-      if(n != MAXFILE){
      a9a:	67c1                	lui	a5,0x10
      a9c:	10b78793          	addi	a5,a5,267 # 1010b <base+0x493>
      aa0:	02f49663          	bne	s1,a5,acc <writebig+0x10e>
-  close(fd);
      aa4:	854e                	mv	a0,s3
      aa6:	008040ef          	jal	4aae <close>
-  if(unlink("big") < 0){
      aaa:	00005517          	auipc	a0,0x5
      aae:	a0650513          	addi	a0,a0,-1530 # 54b0 <malloc+0x546>
      ab2:	024040ef          	jal	4ad6 <unlink>
      ab6:	04054c63          	bltz	a0,b0e <writebig+0x150>
-}
      aba:	70e2                	ld	ra,56(sp)
      abc:	7442                	ld	s0,48(sp)
      abe:	74a2                	ld	s1,40(sp)
@@ -1259,44 +931,35 @@ outofinodes(char *s)
      ac6:	6aa2                	ld	s5,8(sp)
      ac8:	6121                	addi	sp,sp,64
      aca:	8082                	ret
-        printf("%s: read only %d blocks from big", s, n);
      acc:	8626                	mv	a2,s1
      ace:	85d6                	mv	a1,s5
      ad0:	00005517          	auipc	a0,0x5
      ad4:	a5050513          	addi	a0,a0,-1456 # 5520 <malloc+0x5b6>
      ad8:	3de040ef          	jal	4eb6 <printf>
-        exit(1);
      adc:	4505                	li	a0,1
      ade:	7a9030ef          	jal	4a86 <exit>
-      printf("%s: read failed %d\n", s, i);
      ae2:	862a                	mv	a2,a0
      ae4:	85d6                	mv	a1,s5
      ae6:	00005517          	auipc	a0,0x5
      aea:	a6250513          	addi	a0,a0,-1438 # 5548 <malloc+0x5de>
      aee:	3c8040ef          	jal	4eb6 <printf>
-      exit(1);
      af2:	4505                	li	a0,1
      af4:	793030ef          	jal	4a86 <exit>
-      printf("%s: read content of block %d is %d\n", s,
      af8:	8626                	mv	a2,s1
      afa:	85d6                	mv	a1,s5
      afc:	00005517          	auipc	a0,0x5
      b00:	a6450513          	addi	a0,a0,-1436 # 5560 <malloc+0x5f6>
      b04:	3b2040ef          	jal	4eb6 <printf>
-      exit(1);
      b08:	4505                	li	a0,1
      b0a:	77d030ef          	jal	4a86 <exit>
-    printf("%s: unlink big failed\n", s);
      b0e:	85d6                	mv	a1,s5
      b10:	00005517          	auipc	a0,0x5
      b14:	a7850513          	addi	a0,a0,-1416 # 5588 <malloc+0x61e>
      b18:	39e040ef          	jal	4eb6 <printf>
-    exit(1);
      b1c:	4505                	li	a0,1
      b1e:	769030ef          	jal	4a86 <exit>
 
 0000000000000b22 <unlinkread>:
-{
      b22:	7179                	addi	sp,sp,-48
      b24:	f406                	sd	ra,40(sp)
      b26:	f022                	sd	s0,32(sp)
@@ -1305,50 +968,39 @@ outofinodes(char *s)
      b2c:	e44e                	sd	s3,8(sp)
      b2e:	1800                	addi	s0,sp,48
      b30:	89aa                	mv	s3,a0
-  fd = open("unlinkread", O_CREATE | O_RDWR);
      b32:	20200593          	li	a1,514
      b36:	00005517          	auipc	a0,0x5
      b3a:	a6a50513          	addi	a0,a0,-1430 # 55a0 <malloc+0x636>
      b3e:	789030ef          	jal	4ac6 <open>
-  if(fd < 0){
      b42:	0a054f63          	bltz	a0,c00 <unlinkread+0xde>
      b46:	84aa                	mv	s1,a0
-  write(fd, "hello", SZ);
      b48:	4615                	li	a2,5
      b4a:	00005597          	auipc	a1,0x5
      b4e:	a8658593          	addi	a1,a1,-1402 # 55d0 <malloc+0x666>
      b52:	755030ef          	jal	4aa6 <write>
-  close(fd);
      b56:	8526                	mv	a0,s1
      b58:	757030ef          	jal	4aae <close>
-  fd = open("unlinkread", O_RDWR);
      b5c:	4589                	li	a1,2
      b5e:	00005517          	auipc	a0,0x5
      b62:	a4250513          	addi	a0,a0,-1470 # 55a0 <malloc+0x636>
      b66:	761030ef          	jal	4ac6 <open>
      b6a:	84aa                	mv	s1,a0
-  if(fd < 0){
      b6c:	0a054463          	bltz	a0,c14 <unlinkread+0xf2>
-  if(unlink("unlinkread") != 0){
      b70:	00005517          	auipc	a0,0x5
      b74:	a3050513          	addi	a0,a0,-1488 # 55a0 <malloc+0x636>
      b78:	75f030ef          	jal	4ad6 <unlink>
      b7c:	e555                	bnez	a0,c28 <unlinkread+0x106>
-  fd1 = open("unlinkread", O_CREATE | O_RDWR);
      b7e:	20200593          	li	a1,514
      b82:	00005517          	auipc	a0,0x5
      b86:	a1e50513          	addi	a0,a0,-1506 # 55a0 <malloc+0x636>
      b8a:	73d030ef          	jal	4ac6 <open>
      b8e:	892a                	mv	s2,a0
-  write(fd1, "yyy", 3);
      b90:	460d                	li	a2,3
      b92:	00005597          	auipc	a1,0x5
      b96:	a8658593          	addi	a1,a1,-1402 # 5618 <malloc+0x6ae>
      b9a:	70d030ef          	jal	4aa6 <write>
-  close(fd1);
      b9e:	854a                	mv	a0,s2
      ba0:	70f030ef          	jal	4aae <close>
-  if(read(fd, buf, sizeof(buf)) != SZ){
      ba4:	660d                	lui	a2,0x3
      ba6:	0000c597          	auipc	a1,0xc
      baa:	0d258593          	addi	a1,a1,210 # cc78 <buf>
@@ -1356,12 +1008,10 @@ outofinodes(char *s)
      bb0:	6ef030ef          	jal	4a9e <read>
      bb4:	4795                	li	a5,5
      bb6:	08f51363          	bne	a0,a5,c3c <unlinkread+0x11a>
-  if(buf[0] != 'h'){
      bba:	0000c717          	auipc	a4,0xc
      bbe:	0be74703          	lbu	a4,190(a4) # cc78 <buf>
      bc2:	06800793          	li	a5,104
      bc6:	08f71563          	bne	a4,a5,c50 <unlinkread+0x12e>
-  if(write(fd, buf, 10) != 10){
      bca:	4629                	li	a2,10
      bcc:	0000c597          	auipc	a1,0xc
      bd0:	0ac58593          	addi	a1,a1,172 # cc78 <buf>
@@ -1369,14 +1019,11 @@ outofinodes(char *s)
      bd6:	6d1030ef          	jal	4aa6 <write>
      bda:	47a9                	li	a5,10
      bdc:	08f51463          	bne	a0,a5,c64 <unlinkread+0x142>
-  close(fd);
      be0:	8526                	mv	a0,s1
      be2:	6cd030ef          	jal	4aae <close>
-  unlink("unlinkread");
      be6:	00005517          	auipc	a0,0x5
      bea:	9ba50513          	addi	a0,a0,-1606 # 55a0 <malloc+0x636>
      bee:	6e9030ef          	jal	4ad6 <unlink>
-}
      bf2:	70a2                	ld	ra,40(sp)
      bf4:	7402                	ld	s0,32(sp)
      bf6:	64e2                	ld	s1,24(sp)
@@ -1384,57 +1031,44 @@ outofinodes(char *s)
      bfa:	69a2                	ld	s3,8(sp)
      bfc:	6145                	addi	sp,sp,48
      bfe:	8082                	ret
-    printf("%s: create unlinkread failed\n", s);
      c00:	85ce                	mv	a1,s3
      c02:	00005517          	auipc	a0,0x5
      c06:	9ae50513          	addi	a0,a0,-1618 # 55b0 <malloc+0x646>
      c0a:	2ac040ef          	jal	4eb6 <printf>
-    exit(1);
      c0e:	4505                	li	a0,1
      c10:	677030ef          	jal	4a86 <exit>
-    printf("%s: open unlinkread failed\n", s);
      c14:	85ce                	mv	a1,s3
      c16:	00005517          	auipc	a0,0x5
      c1a:	9c250513          	addi	a0,a0,-1598 # 55d8 <malloc+0x66e>
      c1e:	298040ef          	jal	4eb6 <printf>
-    exit(1);
      c22:	4505                	li	a0,1
      c24:	663030ef          	jal	4a86 <exit>
-    printf("%s: unlink unlinkread failed\n", s);
      c28:	85ce                	mv	a1,s3
      c2a:	00005517          	auipc	a0,0x5
      c2e:	9ce50513          	addi	a0,a0,-1586 # 55f8 <malloc+0x68e>
      c32:	284040ef          	jal	4eb6 <printf>
-    exit(1);
      c36:	4505                	li	a0,1
      c38:	64f030ef          	jal	4a86 <exit>
-    printf("%s: unlinkread read failed", s);
      c3c:	85ce                	mv	a1,s3
      c3e:	00005517          	auipc	a0,0x5
      c42:	9e250513          	addi	a0,a0,-1566 # 5620 <malloc+0x6b6>
      c46:	270040ef          	jal	4eb6 <printf>
-    exit(1);
      c4a:	4505                	li	a0,1
      c4c:	63b030ef          	jal	4a86 <exit>
-    printf("%s: unlinkread wrong data\n", s);
      c50:	85ce                	mv	a1,s3
      c52:	00005517          	auipc	a0,0x5
      c56:	9ee50513          	addi	a0,a0,-1554 # 5640 <malloc+0x6d6>
      c5a:	25c040ef          	jal	4eb6 <printf>
-    exit(1);
      c5e:	4505                	li	a0,1
      c60:	627030ef          	jal	4a86 <exit>
-    printf("%s: unlinkread write failed\n", s);
      c64:	85ce                	mv	a1,s3
      c66:	00005517          	auipc	a0,0x5
      c6a:	9fa50513          	addi	a0,a0,-1542 # 5660 <malloc+0x6f6>
      c6e:	248040ef          	jal	4eb6 <printf>
-    exit(1);
      c72:	4505                	li	a0,1
      c74:	613030ef          	jal	4a86 <exit>
 
 0000000000000c78 <linktest>:
-{
      c78:	1101                	addi	sp,sp,-32
      c7a:	ec06                	sd	ra,24(sp)
      c7c:	e822                	sd	s0,16(sp)
@@ -1442,173 +1076,136 @@ outofinodes(char *s)
      c80:	e04a                	sd	s2,0(sp)
      c82:	1000                	addi	s0,sp,32
      c84:	892a                	mv	s2,a0
-  unlink("lf1");
      c86:	00005517          	auipc	a0,0x5
      c8a:	9fa50513          	addi	a0,a0,-1542 # 5680 <malloc+0x716>
      c8e:	649030ef          	jal	4ad6 <unlink>
-  unlink("lf2");
      c92:	00005517          	auipc	a0,0x5
      c96:	9f650513          	addi	a0,a0,-1546 # 5688 <malloc+0x71e>
      c9a:	63d030ef          	jal	4ad6 <unlink>
-  fd = open("lf1", O_CREATE|O_RDWR);
      c9e:	20200593          	li	a1,514
      ca2:	00005517          	auipc	a0,0x5
      ca6:	9de50513          	addi	a0,a0,-1570 # 5680 <malloc+0x716>
      caa:	61d030ef          	jal	4ac6 <open>
-  if(fd < 0){
      cae:	0c054f63          	bltz	a0,d8c <linktest+0x114>
      cb2:	84aa                	mv	s1,a0
-  if(write(fd, "hello", SZ) != SZ){
      cb4:	4615                	li	a2,5
      cb6:	00005597          	auipc	a1,0x5
      cba:	91a58593          	addi	a1,a1,-1766 # 55d0 <malloc+0x666>
      cbe:	5e9030ef          	jal	4aa6 <write>
      cc2:	4795                	li	a5,5
      cc4:	0cf51e63          	bne	a0,a5,da0 <linktest+0x128>
-  close(fd);
      cc8:	8526                	mv	a0,s1
      cca:	5e5030ef          	jal	4aae <close>
-  if(link("lf1", "lf2") < 0){
      cce:	00005597          	auipc	a1,0x5
      cd2:	9ba58593          	addi	a1,a1,-1606 # 5688 <malloc+0x71e>
      cd6:	00005517          	auipc	a0,0x5
      cda:	9aa50513          	addi	a0,a0,-1622 # 5680 <malloc+0x716>
      cde:	609030ef          	jal	4ae6 <link>
      ce2:	0c054963          	bltz	a0,db4 <linktest+0x13c>
-  unlink("lf1");
      ce6:	00005517          	auipc	a0,0x5
      cea:	99a50513          	addi	a0,a0,-1638 # 5680 <malloc+0x716>
      cee:	5e9030ef          	jal	4ad6 <unlink>
-  if(open("lf1", 0) >= 0){
      cf2:	4581                	li	a1,0
      cf4:	00005517          	auipc	a0,0x5
      cf8:	98c50513          	addi	a0,a0,-1652 # 5680 <malloc+0x716>
      cfc:	5cb030ef          	jal	4ac6 <open>
      d00:	0c055463          	bgez	a0,dc8 <linktest+0x150>
-  fd = open("lf2", 0);
      d04:	4581                	li	a1,0
      d06:	00005517          	auipc	a0,0x5
      d0a:	98250513          	addi	a0,a0,-1662 # 5688 <malloc+0x71e>
      d0e:	5b9030ef          	jal	4ac6 <open>
      d12:	84aa                	mv	s1,a0
-  if(fd < 0){
      d14:	0c054463          	bltz	a0,ddc <linktest+0x164>
-  if(read(fd, buf, sizeof(buf)) != SZ){
      d18:	660d                	lui	a2,0x3
      d1a:	0000c597          	auipc	a1,0xc
      d1e:	f5e58593          	addi	a1,a1,-162 # cc78 <buf>
      d22:	57d030ef          	jal	4a9e <read>
      d26:	4795                	li	a5,5
      d28:	0cf51463          	bne	a0,a5,df0 <linktest+0x178>
-  close(fd);
      d2c:	8526                	mv	a0,s1
      d2e:	581030ef          	jal	4aae <close>
-  if(link("lf2", "lf2") >= 0){
      d32:	00005597          	auipc	a1,0x5
      d36:	95658593          	addi	a1,a1,-1706 # 5688 <malloc+0x71e>
      d3a:	852e                	mv	a0,a1
      d3c:	5ab030ef          	jal	4ae6 <link>
      d40:	0c055263          	bgez	a0,e04 <linktest+0x18c>
-  unlink("lf2");
      d44:	00005517          	auipc	a0,0x5
      d48:	94450513          	addi	a0,a0,-1724 # 5688 <malloc+0x71e>
      d4c:	58b030ef          	jal	4ad6 <unlink>
-  if(link("lf2", "lf1") >= 0){
      d50:	00005597          	auipc	a1,0x5
      d54:	93058593          	addi	a1,a1,-1744 # 5680 <malloc+0x716>
      d58:	00005517          	auipc	a0,0x5
      d5c:	93050513          	addi	a0,a0,-1744 # 5688 <malloc+0x71e>
      d60:	587030ef          	jal	4ae6 <link>
      d64:	0a055a63          	bgez	a0,e18 <linktest+0x1a0>
-  if(link(".", "lf1") >= 0){
      d68:	00005597          	auipc	a1,0x5
      d6c:	91858593          	addi	a1,a1,-1768 # 5680 <malloc+0x716>
      d70:	00005517          	auipc	a0,0x5
      d74:	a2050513          	addi	a0,a0,-1504 # 5790 <malloc+0x826>
      d78:	56f030ef          	jal	4ae6 <link>
      d7c:	0a055863          	bgez	a0,e2c <linktest+0x1b4>
-}
      d80:	60e2                	ld	ra,24(sp)
      d82:	6442                	ld	s0,16(sp)
      d84:	64a2                	ld	s1,8(sp)
      d86:	6902                	ld	s2,0(sp)
      d88:	6105                	addi	sp,sp,32
      d8a:	8082                	ret
-    printf("%s: create lf1 failed\n", s);
      d8c:	85ca                	mv	a1,s2
      d8e:	00005517          	auipc	a0,0x5
      d92:	90250513          	addi	a0,a0,-1790 # 5690 <malloc+0x726>
      d96:	120040ef          	jal	4eb6 <printf>
-    exit(1);
      d9a:	4505                	li	a0,1
      d9c:	4eb030ef          	jal	4a86 <exit>
-    printf("%s: write lf1 failed\n", s);
      da0:	85ca                	mv	a1,s2
      da2:	00005517          	auipc	a0,0x5
      da6:	90650513          	addi	a0,a0,-1786 # 56a8 <malloc+0x73e>
      daa:	10c040ef          	jal	4eb6 <printf>
-    exit(1);
      dae:	4505                	li	a0,1
      db0:	4d7030ef          	jal	4a86 <exit>
-    printf("%s: link lf1 lf2 failed\n", s);
      db4:	85ca                	mv	a1,s2
      db6:	00005517          	auipc	a0,0x5
      dba:	90a50513          	addi	a0,a0,-1782 # 56c0 <malloc+0x756>
      dbe:	0f8040ef          	jal	4eb6 <printf>
-    exit(1);
      dc2:	4505                	li	a0,1
      dc4:	4c3030ef          	jal	4a86 <exit>
-    printf("%s: unlinked lf1 but it is still there!\n", s);
      dc8:	85ca                	mv	a1,s2
      dca:	00005517          	auipc	a0,0x5
      dce:	91650513          	addi	a0,a0,-1770 # 56e0 <malloc+0x776>
      dd2:	0e4040ef          	jal	4eb6 <printf>
-    exit(1);
      dd6:	4505                	li	a0,1
      dd8:	4af030ef          	jal	4a86 <exit>
-    printf("%s: open lf2 failed\n", s);
      ddc:	85ca                	mv	a1,s2
      dde:	00005517          	auipc	a0,0x5
      de2:	93250513          	addi	a0,a0,-1742 # 5710 <malloc+0x7a6>
      de6:	0d0040ef          	jal	4eb6 <printf>
-    exit(1);
      dea:	4505                	li	a0,1
      dec:	49b030ef          	jal	4a86 <exit>
-    printf("%s: read lf2 failed\n", s);
      df0:	85ca                	mv	a1,s2
      df2:	00005517          	auipc	a0,0x5
      df6:	93650513          	addi	a0,a0,-1738 # 5728 <malloc+0x7be>
      dfa:	0bc040ef          	jal	4eb6 <printf>
-    exit(1);
      dfe:	4505                	li	a0,1
      e00:	487030ef          	jal	4a86 <exit>
-    printf("%s: link lf2 lf2 succeeded! oops\n", s);
      e04:	85ca                	mv	a1,s2
      e06:	00005517          	auipc	a0,0x5
      e0a:	93a50513          	addi	a0,a0,-1734 # 5740 <malloc+0x7d6>
      e0e:	0a8040ef          	jal	4eb6 <printf>
-    exit(1);
      e12:	4505                	li	a0,1
      e14:	473030ef          	jal	4a86 <exit>
-    printf("%s: link non-existent succeeded! oops\n", s);
      e18:	85ca                	mv	a1,s2
      e1a:	00005517          	auipc	a0,0x5
      e1e:	94e50513          	addi	a0,a0,-1714 # 5768 <malloc+0x7fe>
      e22:	094040ef          	jal	4eb6 <printf>
-    exit(1);
      e26:	4505                	li	a0,1
      e28:	45f030ef          	jal	4a86 <exit>
-    printf("%s: link . lf1 succeeded! oops\n", s);
      e2c:	85ca                	mv	a1,s2
      e2e:	00005517          	auipc	a0,0x5
      e32:	96a50513          	addi	a0,a0,-1686 # 5798 <malloc+0x82e>
      e36:	080040ef          	jal	4eb6 <printf>
-    exit(1);
      e3a:	4505                	li	a0,1
      e3c:	44b030ef          	jal	4a86 <exit>
 
 0000000000000e40 <validatetest>:
-{
      e40:	7139                	addi	sp,sp,-64
      e42:	fc06                	sd	ra,56(sp)
      e44:	f822                	sd	s0,48(sp)
@@ -1620,24 +1217,18 @@ outofinodes(char *s)
      e50:	e05a                	sd	s6,0(sp)
      e52:	0080                	addi	s0,sp,64
      e54:	8b2a                	mv	s6,a0
-  for(p = 0; p <= (uint)hi; p += PGSIZE){
      e56:	4481                	li	s1,0
-    if(link("nosuchfile", (char*)p) != -1){
      e58:	00005997          	auipc	s3,0x5
      e5c:	96098993          	addi	s3,s3,-1696 # 57b8 <malloc+0x84e>
      e60:	597d                	li	s2,-1
-  for(p = 0; p <= (uint)hi; p += PGSIZE){
      e62:	6a85                	lui	s5,0x1
      e64:	00114a37          	lui	s4,0x114
-    if(link("nosuchfile", (char*)p) != -1){
      e68:	85a6                	mv	a1,s1
      e6a:	854e                	mv	a0,s3
      e6c:	47b030ef          	jal	4ae6 <link>
      e70:	01251f63          	bne	a0,s2,e8e <validatetest+0x4e>
-  for(p = 0; p <= (uint)hi; p += PGSIZE){
      e74:	94d6                	add	s1,s1,s5
      e76:	ff4499e3          	bne	s1,s4,e68 <validatetest+0x28>
-}
      e7a:	70e2                	ld	ra,56(sp)
      e7c:	7442                	ld	s0,48(sp)
      e7e:	74a2                	ld	s1,40(sp)
@@ -1648,17 +1239,14 @@ outofinodes(char *s)
      e88:	6b02                	ld	s6,0(sp)
      e8a:	6121                	addi	sp,sp,64
      e8c:	8082                	ret
-      printf("%s: link should not succeed\n", s);
      e8e:	85da                	mv	a1,s6
      e90:	00005517          	auipc	a0,0x5
      e94:	93850513          	addi	a0,a0,-1736 # 57c8 <malloc+0x85e>
      e98:	01e040ef          	jal	4eb6 <printf>
-      exit(1);
      e9c:	4505                	li	a0,1
      e9e:	3e9030ef          	jal	4a86 <exit>
 
 0000000000000ea2 <bigdir>:
-{
      ea2:	715d                	addi	sp,sp,-80
      ea4:	e486                	sd	ra,72(sp)
      ea6:	e0a2                	sd	s0,64(sp)
@@ -1670,85 +1258,61 @@ outofinodes(char *s)
      eb2:	e85a                	sd	s6,16(sp)
      eb4:	0880                	addi	s0,sp,80
      eb6:	89aa                	mv	s3,a0
-  unlink("bd");
      eb8:	00005517          	auipc	a0,0x5
      ebc:	93050513          	addi	a0,a0,-1744 # 57e8 <malloc+0x87e>
      ec0:	417030ef          	jal	4ad6 <unlink>
-  fd = open("bd", O_CREATE);
      ec4:	20000593          	li	a1,512
      ec8:	00005517          	auipc	a0,0x5
      ecc:	92050513          	addi	a0,a0,-1760 # 57e8 <malloc+0x87e>
      ed0:	3f7030ef          	jal	4ac6 <open>
-  if(fd < 0){
      ed4:	0c054163          	bltz	a0,f96 <bigdir+0xf4>
-  close(fd);
      ed8:	3d7030ef          	jal	4aae <close>
-  for(i = 0; i < N; i++){
      edc:	4901                	li	s2,0
-    name[0] = 'x';
      ede:	07800a93          	li	s5,120
-    if(link("bd", name) != 0){
      ee2:	00005a17          	auipc	s4,0x5
      ee6:	906a0a13          	addi	s4,s4,-1786 # 57e8 <malloc+0x87e>
-  for(i = 0; i < N; i++){
      eea:	1f400b13          	li	s6,500
-    name[0] = 'x';
      eee:	fb540823          	sb	s5,-80(s0)
-    name[1] = '0' + (i / 64);
      ef2:	41f9571b          	sraiw	a4,s2,0x1f
      ef6:	01a7571b          	srliw	a4,a4,0x1a
      efa:	012707bb          	addw	a5,a4,s2
      efe:	4067d69b          	sraiw	a3,a5,0x6
      f02:	0306869b          	addiw	a3,a3,48
      f06:	fad408a3          	sb	a3,-79(s0)
-    name[2] = '0' + (i % 64);
      f0a:	03f7f793          	andi	a5,a5,63
      f0e:	9f99                	subw	a5,a5,a4
      f10:	0307879b          	addiw	a5,a5,48
      f14:	faf40923          	sb	a5,-78(s0)
-    name[3] = '\0';
      f18:	fa0409a3          	sb	zero,-77(s0)
-    if(link("bd", name) != 0){
      f1c:	fb040593          	addi	a1,s0,-80
      f20:	8552                	mv	a0,s4
      f22:	3c5030ef          	jal	4ae6 <link>
      f26:	84aa                	mv	s1,a0
      f28:	e149                	bnez	a0,faa <bigdir+0x108>
-  for(i = 0; i < N; i++){
      f2a:	2905                	addiw	s2,s2,1
      f2c:	fd6911e3          	bne	s2,s6,eee <bigdir+0x4c>
-  unlink("bd");
      f30:	00005517          	auipc	a0,0x5
      f34:	8b850513          	addi	a0,a0,-1864 # 57e8 <malloc+0x87e>
      f38:	39f030ef          	jal	4ad6 <unlink>
-    name[0] = 'x';
      f3c:	07800913          	li	s2,120
-  for(i = 0; i < N; i++){
      f40:	1f400a13          	li	s4,500
-    name[0] = 'x';
      f44:	fb240823          	sb	s2,-80(s0)
-    name[1] = '0' + (i / 64);
      f48:	41f4d71b          	sraiw	a4,s1,0x1f
      f4c:	01a7571b          	srliw	a4,a4,0x1a
      f50:	009707bb          	addw	a5,a4,s1
      f54:	4067d69b          	sraiw	a3,a5,0x6
      f58:	0306869b          	addiw	a3,a3,48
      f5c:	fad408a3          	sb	a3,-79(s0)
-    name[2] = '0' + (i % 64);
      f60:	03f7f793          	andi	a5,a5,63
      f64:	9f99                	subw	a5,a5,a4
      f66:	0307879b          	addiw	a5,a5,48
      f6a:	faf40923          	sb	a5,-78(s0)
-    name[3] = '\0';
      f6e:	fa0409a3          	sb	zero,-77(s0)
-    if(unlink(name) != 0){
      f72:	fb040513          	addi	a0,s0,-80
      f76:	361030ef          	jal	4ad6 <unlink>
      f7a:	e529                	bnez	a0,fc4 <bigdir+0x122>
-  for(i = 0; i < N; i++){
      f7c:	2485                	addiw	s1,s1,1
      f7e:	fd4493e3          	bne	s1,s4,f44 <bigdir+0xa2>
-}
      f82:	60a6                	ld	ra,72(sp)
      f84:	6406                	ld	s0,64(sp)
      f86:	74e2                	ld	s1,56(sp)
@@ -1759,57 +1323,45 @@ outofinodes(char *s)
      f90:	6b42                	ld	s6,16(sp)
      f92:	6161                	addi	sp,sp,80
      f94:	8082                	ret
-    printf("%s: bigdir create failed\n", s);
      f96:	85ce                	mv	a1,s3
      f98:	00005517          	auipc	a0,0x5
      f9c:	85850513          	addi	a0,a0,-1960 # 57f0 <malloc+0x886>
      fa0:	717030ef          	jal	4eb6 <printf>
-    exit(1);
      fa4:	4505                	li	a0,1
      fa6:	2e1030ef          	jal	4a86 <exit>
-      printf("%s: bigdir i=%d link(bd, %s) failed\n", s, i, name);
      faa:	fb040693          	addi	a3,s0,-80
      fae:	864a                	mv	a2,s2
      fb0:	85ce                	mv	a1,s3
      fb2:	00005517          	auipc	a0,0x5
      fb6:	85e50513          	addi	a0,a0,-1954 # 5810 <malloc+0x8a6>
      fba:	6fd030ef          	jal	4eb6 <printf>
-      exit(1);
      fbe:	4505                	li	a0,1
      fc0:	2c7030ef          	jal	4a86 <exit>
-      printf("%s: bigdir unlink failed", s);
      fc4:	85ce                	mv	a1,s3
      fc6:	00005517          	auipc	a0,0x5
      fca:	87250513          	addi	a0,a0,-1934 # 5838 <malloc+0x8ce>
      fce:	6e9030ef          	jal	4eb6 <printf>
-      exit(1);
      fd2:	4505                	li	a0,1
      fd4:	2b3030ef          	jal	4a86 <exit>
 
 0000000000000fd8 <pgbug>:
-{
      fd8:	7179                	addi	sp,sp,-48
      fda:	f406                	sd	ra,40(sp)
      fdc:	f022                	sd	s0,32(sp)
      fde:	ec26                	sd	s1,24(sp)
      fe0:	1800                	addi	s0,sp,48
-  argv[0] = 0;
      fe2:	fc043c23          	sd	zero,-40(s0)
-  exec(big, argv);
      fe6:	00008497          	auipc	s1,0x8
      fea:	01a48493          	addi	s1,s1,26 # 9000 <big>
      fee:	fd840593          	addi	a1,s0,-40
      ff2:	6088                	ld	a0,0(s1)
      ff4:	2cb030ef          	jal	4abe <exec>
-  pipe(big);
      ff8:	6088                	ld	a0,0(s1)
      ffa:	29d030ef          	jal	4a96 <pipe>
-  exit(0);
      ffe:	4501                	li	a0,0
     1000:	287030ef          	jal	4a86 <exit>
 
 0000000000001004 <badarg>:
-{
     1004:	7139                	addi	sp,sp,-64
     1006:	fc06                	sd	ra,56(sp)
     1008:	f822                	sd	s0,48(sp)
@@ -1819,96 +1371,68 @@ outofinodes(char *s)
     1010:	0080                	addi	s0,sp,64
     1012:	64b1                	lui	s1,0xc
     1014:	35048493          	addi	s1,s1,848 # c350 <uninit+0x1de8>
-    argv[0] = (char*)0xffffffff;
     1018:	597d                	li	s2,-1
     101a:	02095913          	srli	s2,s2,0x20
-    exec("echo", argv);
     101e:	00004997          	auipc	s3,0x4
     1022:	08a98993          	addi	s3,s3,138 # 50a8 <malloc+0x13e>
-    argv[0] = (char*)0xffffffff;
     1026:	fd243023          	sd	s2,-64(s0)
-    argv[1] = 0;
     102a:	fc043423          	sd	zero,-56(s0)
-    exec("echo", argv);
     102e:	fc040593          	addi	a1,s0,-64
     1032:	854e                	mv	a0,s3
     1034:	28b030ef          	jal	4abe <exec>
-  for(int i = 0; i < 50000; i++){
     1038:	34fd                	addiw	s1,s1,-1
     103a:	f4f5                	bnez	s1,1026 <badarg+0x22>
-  exit(0);
     103c:	4501                	li	a0,0
     103e:	249030ef          	jal	4a86 <exit>
 
 0000000000001042 <copyinstr2>:
-{
     1042:	7155                	addi	sp,sp,-208
     1044:	e586                	sd	ra,200(sp)
     1046:	e1a2                	sd	s0,192(sp)
     1048:	0980                	addi	s0,sp,208
-  for(int i = 0; i < MAXPATH; i++)
     104a:	f6840793          	addi	a5,s0,-152
     104e:	fe840693          	addi	a3,s0,-24
-    b[i] = 'x';
     1052:	07800713          	li	a4,120
     1056:	00e78023          	sb	a4,0(a5)
-  for(int i = 0; i < MAXPATH; i++)
     105a:	0785                	addi	a5,a5,1
     105c:	fed79de3          	bne	a5,a3,1056 <copyinstr2+0x14>
-  b[MAXPATH] = '\0';
     1060:	fe040423          	sb	zero,-24(s0)
-  int ret = unlink(b);
     1064:	f6840513          	addi	a0,s0,-152
     1068:	26f030ef          	jal	4ad6 <unlink>
-  if(ret != -1){
     106c:	57fd                	li	a5,-1
     106e:	0cf51263          	bne	a0,a5,1132 <copyinstr2+0xf0>
-  int fd = open(b, O_CREATE | O_WRONLY);
     1072:	20100593          	li	a1,513
     1076:	f6840513          	addi	a0,s0,-152
     107a:	24d030ef          	jal	4ac6 <open>
-  if(fd != -1){
     107e:	57fd                	li	a5,-1
     1080:	0cf51563          	bne	a0,a5,114a <copyinstr2+0x108>
-  ret = link(b, b);
     1084:	f6840593          	addi	a1,s0,-152
     1088:	852e                	mv	a0,a1
     108a:	25d030ef          	jal	4ae6 <link>
-  if(ret != -1){
     108e:	57fd                	li	a5,-1
     1090:	0cf51963          	bne	a0,a5,1162 <copyinstr2+0x120>
-  char *args[] = { "xx", 0 };
     1094:	00006797          	auipc	a5,0x6
     1098:	8f478793          	addi	a5,a5,-1804 # 6988 <malloc+0x1a1e>
     109c:	f4f43c23          	sd	a5,-168(s0)
     10a0:	f6043023          	sd	zero,-160(s0)
-  ret = exec(b, args);
     10a4:	f5840593          	addi	a1,s0,-168
     10a8:	f6840513          	addi	a0,s0,-152
     10ac:	213030ef          	jal	4abe <exec>
-  if(ret != -1){
     10b0:	57fd                	li	a5,-1
     10b2:	0cf51563          	bne	a0,a5,117c <copyinstr2+0x13a>
-  int pid = fork();
     10b6:	1c9030ef          	jal	4a7e <fork>
-  if(pid < 0){
     10ba:	0c054d63          	bltz	a0,1194 <copyinstr2+0x152>
-  if(pid == 0){
     10be:	0e051863          	bnez	a0,11ae <copyinstr2+0x16c>
     10c2:	00008797          	auipc	a5,0x8
     10c6:	49e78793          	addi	a5,a5,1182 # 9560 <big.0>
     10ca:	00009697          	auipc	a3,0x9
     10ce:	49668693          	addi	a3,a3,1174 # a560 <big.0+0x1000>
-      big[i] = 'x';
     10d2:	07800713          	li	a4,120
     10d6:	00e78023          	sb	a4,0(a5)
-    for(int i = 0; i < PGSIZE; i++)
     10da:	0785                	addi	a5,a5,1
     10dc:	fed79de3          	bne	a5,a3,10d6 <copyinstr2+0x94>
-    big[PGSIZE] = '\0';
     10e0:	00009797          	auipc	a5,0x9
     10e4:	48078023          	sb	zero,1152(a5) # a560 <big.0+0x1000>
-    char *args2[] = { big, big, big, 0 };
     10e8:	00006797          	auipc	a5,0x6
     10ec:	32078793          	addi	a5,a5,800 # 7408 <malloc+0x249e>
     10f0:	6fb0                	ld	a2,88(a5)
@@ -1919,184 +1443,140 @@ outofinodes(char *s)
     10fc:	f2d43c23          	sd	a3,-200(s0)
     1100:	f4e43023          	sd	a4,-192(s0)
     1104:	f4f43423          	sd	a5,-184(s0)
-    ret = exec("echo", args2);
     1108:	f3040593          	addi	a1,s0,-208
     110c:	00004517          	auipc	a0,0x4
     1110:	f9c50513          	addi	a0,a0,-100 # 50a8 <malloc+0x13e>
     1114:	1ab030ef          	jal	4abe <exec>
-    if(ret != -1){
     1118:	57fd                	li	a5,-1
     111a:	08f50663          	beq	a0,a5,11a6 <copyinstr2+0x164>
-      printf("exec(echo, BIG) returned %d, not -1\n", fd);
     111e:	55fd                	li	a1,-1
     1120:	00004517          	auipc	a0,0x4
     1124:	7c050513          	addi	a0,a0,1984 # 58e0 <malloc+0x976>
     1128:	58f030ef          	jal	4eb6 <printf>
-      exit(1);
     112c:	4505                	li	a0,1
     112e:	159030ef          	jal	4a86 <exit>
-    printf("unlink(%s) returned %d, not -1\n", b, ret);
     1132:	862a                	mv	a2,a0
     1134:	f6840593          	addi	a1,s0,-152
     1138:	00004517          	auipc	a0,0x4
     113c:	72050513          	addi	a0,a0,1824 # 5858 <malloc+0x8ee>
     1140:	577030ef          	jal	4eb6 <printf>
-    exit(1);
     1144:	4505                	li	a0,1
     1146:	141030ef          	jal	4a86 <exit>
-    printf("open(%s) returned %d, not -1\n", b, fd);
     114a:	862a                	mv	a2,a0
     114c:	f6840593          	addi	a1,s0,-152
     1150:	00004517          	auipc	a0,0x4
     1154:	72850513          	addi	a0,a0,1832 # 5878 <malloc+0x90e>
     1158:	55f030ef          	jal	4eb6 <printf>
-    exit(1);
     115c:	4505                	li	a0,1
     115e:	129030ef          	jal	4a86 <exit>
-    printf("link(%s, %s) returned %d, not -1\n", b, b, ret);
     1162:	86aa                	mv	a3,a0
     1164:	f6840613          	addi	a2,s0,-152
     1168:	85b2                	mv	a1,a2
     116a:	00004517          	auipc	a0,0x4
     116e:	72e50513          	addi	a0,a0,1838 # 5898 <malloc+0x92e>
     1172:	545030ef          	jal	4eb6 <printf>
-    exit(1);
     1176:	4505                	li	a0,1
     1178:	10f030ef          	jal	4a86 <exit>
-    printf("exec(%s) returned %d, not -1\n", b, fd);
     117c:	567d                	li	a2,-1
     117e:	f6840593          	addi	a1,s0,-152
     1182:	00004517          	auipc	a0,0x4
     1186:	73e50513          	addi	a0,a0,1854 # 58c0 <malloc+0x956>
     118a:	52d030ef          	jal	4eb6 <printf>
-    exit(1);
     118e:	4505                	li	a0,1
     1190:	0f7030ef          	jal	4a86 <exit>
-    printf("fork failed\n");
     1194:	00006517          	auipc	a0,0x6
     1198:	d1450513          	addi	a0,a0,-748 # 6ea8 <malloc+0x1f3e>
     119c:	51b030ef          	jal	4eb6 <printf>
-    exit(1);
     11a0:	4505                	li	a0,1
     11a2:	0e5030ef          	jal	4a86 <exit>
-    exit(747); // OK
     11a6:	2eb00513          	li	a0,747
     11aa:	0dd030ef          	jal	4a86 <exit>
-  int st = 0;
     11ae:	f4042a23          	sw	zero,-172(s0)
-  wait(&st);
     11b2:	f5440513          	addi	a0,s0,-172
     11b6:	0d9030ef          	jal	4a8e <wait>
-  if(st != 747){
     11ba:	f5442703          	lw	a4,-172(s0)
     11be:	2eb00793          	li	a5,747
     11c2:	00f71663          	bne	a4,a5,11ce <copyinstr2+0x18c>
-}
     11c6:	60ae                	ld	ra,200(sp)
     11c8:	640e                	ld	s0,192(sp)
     11ca:	6169                	addi	sp,sp,208
     11cc:	8082                	ret
-    printf("exec(echo, BIG) succeeded, should have failed\n");
     11ce:	00004517          	auipc	a0,0x4
     11d2:	73a50513          	addi	a0,a0,1850 # 5908 <malloc+0x99e>
     11d6:	4e1030ef          	jal	4eb6 <printf>
-    exit(1);
     11da:	4505                	li	a0,1
     11dc:	0ab030ef          	jal	4a86 <exit>
 
 00000000000011e0 <truncate3>:
-{
     11e0:	7159                	addi	sp,sp,-112
     11e2:	f486                	sd	ra,104(sp)
     11e4:	f0a2                	sd	s0,96(sp)
     11e6:	e8ca                	sd	s2,80(sp)
     11e8:	1880                	addi	s0,sp,112
     11ea:	892a                	mv	s2,a0
-  close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY));
     11ec:	60100593          	li	a1,1537
     11f0:	00004517          	auipc	a0,0x4
     11f4:	f1050513          	addi	a0,a0,-240 # 5100 <malloc+0x196>
     11f8:	0cf030ef          	jal	4ac6 <open>
     11fc:	0b3030ef          	jal	4aae <close>
-  pid = fork();
     1200:	07f030ef          	jal	4a7e <fork>
-  if(pid < 0){
     1204:	06054663          	bltz	a0,1270 <truncate3+0x90>
-  if(pid == 0){
     1208:	e55d                	bnez	a0,12b6 <truncate3+0xd6>
     120a:	eca6                	sd	s1,88(sp)
     120c:	e4ce                	sd	s3,72(sp)
     120e:	e0d2                	sd	s4,64(sp)
     1210:	fc56                	sd	s5,56(sp)
     1212:	06400993          	li	s3,100
-      int fd = open("truncfile", O_WRONLY);
     1216:	00004a17          	auipc	s4,0x4
     121a:	eeaa0a13          	addi	s4,s4,-278 # 5100 <malloc+0x196>
-      int n = write(fd, "1234567890", 10);
     121e:	00004a97          	auipc	s5,0x4
     1222:	74aa8a93          	addi	s5,s5,1866 # 5968 <malloc+0x9fe>
-      int fd = open("truncfile", O_WRONLY);
     1226:	4585                	li	a1,1
     1228:	8552                	mv	a0,s4
     122a:	09d030ef          	jal	4ac6 <open>
     122e:	84aa                	mv	s1,a0
-      if(fd < 0){
     1230:	04054e63          	bltz	a0,128c <truncate3+0xac>
-      int n = write(fd, "1234567890", 10);
     1234:	4629                	li	a2,10
     1236:	85d6                	mv	a1,s5
     1238:	06f030ef          	jal	4aa6 <write>
-      if(n != 10){
     123c:	47a9                	li	a5,10
     123e:	06f51163          	bne	a0,a5,12a0 <truncate3+0xc0>
-      close(fd);
     1242:	8526                	mv	a0,s1
     1244:	06b030ef          	jal	4aae <close>
-      fd = open("truncfile", O_RDONLY);
     1248:	4581                	li	a1,0
     124a:	8552                	mv	a0,s4
     124c:	07b030ef          	jal	4ac6 <open>
     1250:	84aa                	mv	s1,a0
-      read(fd, buf, sizeof(buf));
     1252:	02000613          	li	a2,32
     1256:	f9840593          	addi	a1,s0,-104
     125a:	045030ef          	jal	4a9e <read>
-      close(fd);
     125e:	8526                	mv	a0,s1
     1260:	04f030ef          	jal	4aae <close>
-    for(int i = 0; i < 100; i++){
     1264:	39fd                	addiw	s3,s3,-1
     1266:	fc0990e3          	bnez	s3,1226 <truncate3+0x46>
-    exit(0);
     126a:	4501                	li	a0,0
     126c:	01b030ef          	jal	4a86 <exit>
     1270:	eca6                	sd	s1,88(sp)
     1272:	e4ce                	sd	s3,72(sp)
     1274:	e0d2                	sd	s4,64(sp)
     1276:	fc56                	sd	s5,56(sp)
-    printf("%s: fork failed\n", s);
     1278:	85ca                	mv	a1,s2
     127a:	00004517          	auipc	a0,0x4
     127e:	6be50513          	addi	a0,a0,1726 # 5938 <malloc+0x9ce>
     1282:	435030ef          	jal	4eb6 <printf>
-    exit(1);
     1286:	4505                	li	a0,1
     1288:	7fe030ef          	jal	4a86 <exit>
-        printf("%s: open failed\n", s);
     128c:	85ca                	mv	a1,s2
     128e:	00004517          	auipc	a0,0x4
     1292:	6c250513          	addi	a0,a0,1730 # 5950 <malloc+0x9e6>
     1296:	421030ef          	jal	4eb6 <printf>
-        exit(1);
     129a:	4505                	li	a0,1
     129c:	7ea030ef          	jal	4a86 <exit>
-        printf("%s: write got %d, expected 10\n", s, n);
     12a0:	862a                	mv	a2,a0
     12a2:	85ca                	mv	a1,s2
     12a4:	00004517          	auipc	a0,0x4
     12a8:	6d450513          	addi	a0,a0,1748 # 5978 <malloc+0xa0e>
     12ac:	40b030ef          	jal	4eb6 <printf>
-        exit(1);
     12b0:	4505                	li	a0,1
     12b2:	7d4030ef          	jal	4a86 <exit>
     12b6:	eca6                	sd	s1,88(sp)
@@ -2104,69 +1584,52 @@ outofinodes(char *s)
     12ba:	e0d2                	sd	s4,64(sp)
     12bc:	fc56                	sd	s5,56(sp)
     12be:	09600993          	li	s3,150
-    int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
     12c2:	00004a17          	auipc	s4,0x4
     12c6:	e3ea0a13          	addi	s4,s4,-450 # 5100 <malloc+0x196>
-    int n = write(fd, "xxx", 3);
     12ca:	00004a97          	auipc	s5,0x4
     12ce:	6cea8a93          	addi	s5,s5,1742 # 5998 <malloc+0xa2e>
-    int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
     12d2:	60100593          	li	a1,1537
     12d6:	8552                	mv	a0,s4
     12d8:	7ee030ef          	jal	4ac6 <open>
     12dc:	84aa                	mv	s1,a0
-    if(fd < 0){
     12de:	02054d63          	bltz	a0,1318 <truncate3+0x138>
-    int n = write(fd, "xxx", 3);
     12e2:	460d                	li	a2,3
     12e4:	85d6                	mv	a1,s5
     12e6:	7c0030ef          	jal	4aa6 <write>
-    if(n != 3){
     12ea:	478d                	li	a5,3
     12ec:	04f51063          	bne	a0,a5,132c <truncate3+0x14c>
-    close(fd);
     12f0:	8526                	mv	a0,s1
     12f2:	7bc030ef          	jal	4aae <close>
-  for(int i = 0; i < 150; i++){
     12f6:	39fd                	addiw	s3,s3,-1
     12f8:	fc099de3          	bnez	s3,12d2 <truncate3+0xf2>
-  wait(&xstatus);
     12fc:	fbc40513          	addi	a0,s0,-68
     1300:	78e030ef          	jal	4a8e <wait>
-  unlink("truncfile");
     1304:	00004517          	auipc	a0,0x4
     1308:	dfc50513          	addi	a0,a0,-516 # 5100 <malloc+0x196>
     130c:	7ca030ef          	jal	4ad6 <unlink>
-  exit(xstatus);
     1310:	fbc42503          	lw	a0,-68(s0)
     1314:	772030ef          	jal	4a86 <exit>
-      printf("%s: open failed\n", s);
     1318:	85ca                	mv	a1,s2
     131a:	00004517          	auipc	a0,0x4
     131e:	63650513          	addi	a0,a0,1590 # 5950 <malloc+0x9e6>
     1322:	395030ef          	jal	4eb6 <printf>
-      exit(1);
     1326:	4505                	li	a0,1
     1328:	75e030ef          	jal	4a86 <exit>
-      printf("%s: write got %d, expected 3\n", s, n);
     132c:	862a                	mv	a2,a0
     132e:	85ca                	mv	a1,s2
     1330:	00004517          	auipc	a0,0x4
     1334:	67050513          	addi	a0,a0,1648 # 59a0 <malloc+0xa36>
     1338:	37f030ef          	jal	4eb6 <printf>
-      exit(1);
     133c:	4505                	li	a0,1
     133e:	748030ef          	jal	4a86 <exit>
 
 0000000000001342 <exectest>:
-{
     1342:	715d                	addi	sp,sp,-80
     1344:	e486                	sd	ra,72(sp)
     1346:	e0a2                	sd	s0,64(sp)
     1348:	f84a                	sd	s2,48(sp)
     134a:	0880                	addi	s0,sp,80
     134c:	892a                	mv	s2,a0
-  char *echoargv[] = { "echo", "OK", 0 };
     134e:	00004797          	auipc	a5,0x4
     1352:	d5a78793          	addi	a5,a5,-678 # 50a8 <malloc+0x13e>
     1356:	fcf43023          	sd	a5,-64(s0)
@@ -2174,169 +1637,127 @@ outofinodes(char *s)
     135e:	66678793          	addi	a5,a5,1638 # 59c0 <malloc+0xa56>
     1362:	fcf43423          	sd	a5,-56(s0)
     1366:	fc043823          	sd	zero,-48(s0)
-  unlink("echo-ok");
     136a:	00004517          	auipc	a0,0x4
     136e:	65e50513          	addi	a0,a0,1630 # 59c8 <malloc+0xa5e>
     1372:	764030ef          	jal	4ad6 <unlink>
-  pid = fork();
     1376:	708030ef          	jal	4a7e <fork>
-  if(pid < 0) {
     137a:	02054f63          	bltz	a0,13b8 <exectest+0x76>
     137e:	fc26                	sd	s1,56(sp)
     1380:	84aa                	mv	s1,a0
-  if(pid == 0) {
     1382:	e935                	bnez	a0,13f6 <exectest+0xb4>
-    close(1);
     1384:	4505                	li	a0,1
     1386:	728030ef          	jal	4aae <close>
-    fd = open("echo-ok", O_CREATE|O_WRONLY);
     138a:	20100593          	li	a1,513
     138e:	00004517          	auipc	a0,0x4
     1392:	63a50513          	addi	a0,a0,1594 # 59c8 <malloc+0xa5e>
     1396:	730030ef          	jal	4ac6 <open>
-    if(fd < 0) {
     139a:	02054a63          	bltz	a0,13ce <exectest+0x8c>
-    if(fd != 1) {
     139e:	4785                	li	a5,1
     13a0:	04f50163          	beq	a0,a5,13e2 <exectest+0xa0>
-      printf("%s: wrong fd\n", s);
     13a4:	85ca                	mv	a1,s2
     13a6:	00004517          	auipc	a0,0x4
     13aa:	64250513          	addi	a0,a0,1602 # 59e8 <malloc+0xa7e>
     13ae:	309030ef          	jal	4eb6 <printf>
-      exit(1);
     13b2:	4505                	li	a0,1
     13b4:	6d2030ef          	jal	4a86 <exit>
     13b8:	fc26                	sd	s1,56(sp)
-     printf("%s: fork failed\n", s);
     13ba:	85ca                	mv	a1,s2
     13bc:	00004517          	auipc	a0,0x4
     13c0:	57c50513          	addi	a0,a0,1404 # 5938 <malloc+0x9ce>
     13c4:	2f3030ef          	jal	4eb6 <printf>
-     exit(1);
     13c8:	4505                	li	a0,1
     13ca:	6bc030ef          	jal	4a86 <exit>
-      printf("%s: create failed\n", s);
     13ce:	85ca                	mv	a1,s2
     13d0:	00004517          	auipc	a0,0x4
     13d4:	60050513          	addi	a0,a0,1536 # 59d0 <malloc+0xa66>
     13d8:	2df030ef          	jal	4eb6 <printf>
-      exit(1);
     13dc:	4505                	li	a0,1
     13de:	6a8030ef          	jal	4a86 <exit>
-    if(exec("echo", echoargv) < 0){
     13e2:	fc040593          	addi	a1,s0,-64
     13e6:	00004517          	auipc	a0,0x4
     13ea:	cc250513          	addi	a0,a0,-830 # 50a8 <malloc+0x13e>
     13ee:	6d0030ef          	jal	4abe <exec>
     13f2:	00054d63          	bltz	a0,140c <exectest+0xca>
-  if (wait(&xstatus) != pid) {
     13f6:	fdc40513          	addi	a0,s0,-36
     13fa:	694030ef          	jal	4a8e <wait>
     13fe:	02951163          	bne	a0,s1,1420 <exectest+0xde>
-  if(xstatus != 0)
     1402:	fdc42503          	lw	a0,-36(s0)
     1406:	c50d                	beqz	a0,1430 <exectest+0xee>
-    exit(xstatus);
     1408:	67e030ef          	jal	4a86 <exit>
-      printf("%s: exec echo failed\n", s);
     140c:	85ca                	mv	a1,s2
     140e:	00004517          	auipc	a0,0x4
     1412:	5ea50513          	addi	a0,a0,1514 # 59f8 <malloc+0xa8e>
     1416:	2a1030ef          	jal	4eb6 <printf>
-      exit(1);
     141a:	4505                	li	a0,1
     141c:	66a030ef          	jal	4a86 <exit>
-    printf("%s: wait failed!\n", s);
     1420:	85ca                	mv	a1,s2
     1422:	00004517          	auipc	a0,0x4
     1426:	5ee50513          	addi	a0,a0,1518 # 5a10 <malloc+0xaa6>
     142a:	28d030ef          	jal	4eb6 <printf>
     142e:	bfd1                	j	1402 <exectest+0xc0>
-  fd = open("echo-ok", O_RDONLY);
     1430:	4581                	li	a1,0
     1432:	00004517          	auipc	a0,0x4
     1436:	59650513          	addi	a0,a0,1430 # 59c8 <malloc+0xa5e>
     143a:	68c030ef          	jal	4ac6 <open>
-  if(fd < 0) {
     143e:	02054463          	bltz	a0,1466 <exectest+0x124>
-  if (read(fd, buf, 2) != 2) {
     1442:	4609                	li	a2,2
     1444:	fb840593          	addi	a1,s0,-72
     1448:	656030ef          	jal	4a9e <read>
     144c:	4789                	li	a5,2
     144e:	02f50663          	beq	a0,a5,147a <exectest+0x138>
-    printf("%s: read failed\n", s);
     1452:	85ca                	mv	a1,s2
     1454:	00004517          	auipc	a0,0x4
     1458:	02450513          	addi	a0,a0,36 # 5478 <malloc+0x50e>
     145c:	25b030ef          	jal	4eb6 <printf>
-    exit(1);
     1460:	4505                	li	a0,1
     1462:	624030ef          	jal	4a86 <exit>
-    printf("%s: open failed\n", s);
     1466:	85ca                	mv	a1,s2
     1468:	00004517          	auipc	a0,0x4
     146c:	4e850513          	addi	a0,a0,1256 # 5950 <malloc+0x9e6>
     1470:	247030ef          	jal	4eb6 <printf>
-    exit(1);
     1474:	4505                	li	a0,1
     1476:	610030ef          	jal	4a86 <exit>
-  unlink("echo-ok");
     147a:	00004517          	auipc	a0,0x4
     147e:	54e50513          	addi	a0,a0,1358 # 59c8 <malloc+0xa5e>
     1482:	654030ef          	jal	4ad6 <unlink>
-  if(buf[0] == 'O' && buf[1] == 'K')
     1486:	fb844703          	lbu	a4,-72(s0)
     148a:	04f00793          	li	a5,79
     148e:	00f71863          	bne	a4,a5,149e <exectest+0x15c>
     1492:	fb944703          	lbu	a4,-71(s0)
     1496:	04b00793          	li	a5,75
     149a:	00f70c63          	beq	a4,a5,14b2 <exectest+0x170>
-    printf("%s: wrong output\n", s);
     149e:	85ca                	mv	a1,s2
     14a0:	00004517          	auipc	a0,0x4
     14a4:	58850513          	addi	a0,a0,1416 # 5a28 <malloc+0xabe>
     14a8:	20f030ef          	jal	4eb6 <printf>
-    exit(1);
     14ac:	4505                	li	a0,1
     14ae:	5d8030ef          	jal	4a86 <exit>
-    exit(0);
     14b2:	4501                	li	a0,0
     14b4:	5d2030ef          	jal	4a86 <exit>
 
 00000000000014b8 <pipe1>:
-{
     14b8:	711d                	addi	sp,sp,-96
     14ba:	ec86                	sd	ra,88(sp)
     14bc:	e8a2                	sd	s0,80(sp)
     14be:	fc4e                	sd	s3,56(sp)
     14c0:	1080                	addi	s0,sp,96
     14c2:	89aa                	mv	s3,a0
-  if(pipe(fds) != 0){
     14c4:	fa840513          	addi	a0,s0,-88
     14c8:	5ce030ef          	jal	4a96 <pipe>
     14cc:	e92d                	bnez	a0,153e <pipe1+0x86>
     14ce:	e4a6                	sd	s1,72(sp)
     14d0:	f852                	sd	s4,48(sp)
     14d2:	84aa                	mv	s1,a0
-  pid = fork();
     14d4:	5aa030ef          	jal	4a7e <fork>
     14d8:	8a2a                	mv	s4,a0
-  if(pid == 0){
     14da:	c151                	beqz	a0,155e <pipe1+0xa6>
-  } else if(pid > 0){
     14dc:	14a05e63          	blez	a0,1638 <pipe1+0x180>
     14e0:	e0ca                	sd	s2,64(sp)
     14e2:	f456                	sd	s5,40(sp)
-    close(fds[1]);
     14e4:	fac42503          	lw	a0,-84(s0)
     14e8:	5c6030ef          	jal	4aae <close>
-    total = 0;
     14ec:	8a26                	mv	s4,s1
-    cc = 1;
     14ee:	4905                	li	s2,1
-    while((n = read(fds[0], buf, cc)) > 0){
     14f0:	0000ba97          	auipc	s5,0xb
     14f4:	788a8a93          	addi	s5,s5,1928 # cc78 <buf>
     14f8:	864a                	mv	a2,s2
@@ -2344,27 +1765,20 @@ outofinodes(char *s)
     14fc:	fa842503          	lw	a0,-88(s0)
     1500:	59e030ef          	jal	4a9e <read>
     1504:	0ea05a63          	blez	a0,15f8 <pipe1+0x140>
-      for(i = 0; i < n; i++){
     1508:	0000b717          	auipc	a4,0xb
     150c:	77070713          	addi	a4,a4,1904 # cc78 <buf>
     1510:	00a4863b          	addw	a2,s1,a0
-        if((buf[i] & 0xff) != (seq++ & 0xff)){
     1514:	00074683          	lbu	a3,0(a4)
     1518:	0ff4f793          	zext.b	a5,s1
     151c:	2485                	addiw	s1,s1,1
     151e:	0af69d63          	bne	a3,a5,15d8 <pipe1+0x120>
-      for(i = 0; i < n; i++){
     1522:	0705                	addi	a4,a4,1
     1524:	fec498e3          	bne	s1,a2,1514 <pipe1+0x5c>
-      total += n;
     1528:	00aa0a3b          	addw	s4,s4,a0
-      cc = cc * 2;
     152c:	0019179b          	slliw	a5,s2,0x1
     1530:	0007891b          	sext.w	s2,a5
-      if(cc > sizeof(buf))
     1534:	670d                	lui	a4,0x3
     1536:	fd2771e3          	bgeu	a4,s2,14f8 <pipe1+0x40>
-        cc = sizeof(buf);
     153a:	690d                	lui	s2,0x3
     153c:	bf75                	j	14f8 <pipe1+0x40>
     153e:	e4a6                	sd	s1,72(sp)
@@ -2373,120 +1787,94 @@ outofinodes(char *s)
     1544:	f456                	sd	s5,40(sp)
     1546:	f05a                	sd	s6,32(sp)
     1548:	ec5e                	sd	s7,24(sp)
-    printf("%s: pipe() failed\n", s);
     154a:	85ce                	mv	a1,s3
     154c:	00004517          	auipc	a0,0x4
     1550:	4f450513          	addi	a0,a0,1268 # 5a40 <malloc+0xad6>
     1554:	163030ef          	jal	4eb6 <printf>
-    exit(1);
     1558:	4505                	li	a0,1
     155a:	52c030ef          	jal	4a86 <exit>
     155e:	e0ca                	sd	s2,64(sp)
     1560:	f456                	sd	s5,40(sp)
     1562:	f05a                	sd	s6,32(sp)
     1564:	ec5e                	sd	s7,24(sp)
-    close(fds[0]);
     1566:	fa842503          	lw	a0,-88(s0)
     156a:	544030ef          	jal	4aae <close>
-    for(n = 0; n < N; n++){
     156e:	0000bb17          	auipc	s6,0xb
     1572:	70ab0b13          	addi	s6,s6,1802 # cc78 <buf>
     1576:	416004bb          	negw	s1,s6
     157a:	0ff4f493          	zext.b	s1,s1
     157e:	409b0913          	addi	s2,s6,1033
-      if(write(fds[1], buf, SZ) != SZ){
     1582:	8bda                	mv	s7,s6
-    for(n = 0; n < N; n++){
     1584:	6a85                	lui	s5,0x1
     1586:	42da8a93          	addi	s5,s5,1069 # 142d <exectest+0xeb>
-{
     158a:	87da                	mv	a5,s6
-        buf[i] = seq++;
     158c:	0097873b          	addw	a4,a5,s1
     1590:	00e78023          	sb	a4,0(a5)
-      for(i = 0; i < SZ; i++)
     1594:	0785                	addi	a5,a5,1
     1596:	ff279be3          	bne	a5,s2,158c <pipe1+0xd4>
     159a:	409a0a1b          	addiw	s4,s4,1033
-      if(write(fds[1], buf, SZ) != SZ){
     159e:	40900613          	li	a2,1033
     15a2:	85de                	mv	a1,s7
     15a4:	fac42503          	lw	a0,-84(s0)
     15a8:	4fe030ef          	jal	4aa6 <write>
     15ac:	40900793          	li	a5,1033
     15b0:	00f51a63          	bne	a0,a5,15c4 <pipe1+0x10c>
-    for(n = 0; n < N; n++){
     15b4:	24a5                	addiw	s1,s1,9
     15b6:	0ff4f493          	zext.b	s1,s1
     15ba:	fd5a18e3          	bne	s4,s5,158a <pipe1+0xd2>
-    exit(0);
     15be:	4501                	li	a0,0
     15c0:	4c6030ef          	jal	4a86 <exit>
-        printf("%s: pipe1 oops 1\n", s);
     15c4:	85ce                	mv	a1,s3
     15c6:	00004517          	auipc	a0,0x4
     15ca:	49250513          	addi	a0,a0,1170 # 5a58 <malloc+0xaee>
     15ce:	0e9030ef          	jal	4eb6 <printf>
-        exit(1);
     15d2:	4505                	li	a0,1
     15d4:	4b2030ef          	jal	4a86 <exit>
-          printf("%s: pipe1 oops 2\n", s);
     15d8:	85ce                	mv	a1,s3
     15da:	00004517          	auipc	a0,0x4
     15de:	49650513          	addi	a0,a0,1174 # 5a70 <malloc+0xb06>
     15e2:	0d5030ef          	jal	4eb6 <printf>
-          return;
     15e6:	64a6                	ld	s1,72(sp)
     15e8:	6906                	ld	s2,64(sp)
     15ea:	7a42                	ld	s4,48(sp)
     15ec:	7aa2                	ld	s5,40(sp)
-}
     15ee:	60e6                	ld	ra,88(sp)
     15f0:	6446                	ld	s0,80(sp)
     15f2:	79e2                	ld	s3,56(sp)
     15f4:	6125                	addi	sp,sp,96
     15f6:	8082                	ret
-    if(total != N * SZ){
     15f8:	6785                	lui	a5,0x1
     15fa:	42d78793          	addi	a5,a5,1069 # 142d <exectest+0xeb>
     15fe:	00fa0f63          	beq	s4,a5,161c <pipe1+0x164>
     1602:	f05a                	sd	s6,32(sp)
     1604:	ec5e                	sd	s7,24(sp)
-      printf("%s: pipe1 oops 3 total %d\n", s, total);
     1606:	8652                	mv	a2,s4
     1608:	85ce                	mv	a1,s3
     160a:	00004517          	auipc	a0,0x4
     160e:	47e50513          	addi	a0,a0,1150 # 5a88 <malloc+0xb1e>
     1612:	0a5030ef          	jal	4eb6 <printf>
-      exit(1);
     1616:	4505                	li	a0,1
     1618:	46e030ef          	jal	4a86 <exit>
     161c:	f05a                	sd	s6,32(sp)
     161e:	ec5e                	sd	s7,24(sp)
-    close(fds[0]);
     1620:	fa842503          	lw	a0,-88(s0)
     1624:	48a030ef          	jal	4aae <close>
-    wait(&xstatus);
     1628:	fa440513          	addi	a0,s0,-92
     162c:	462030ef          	jal	4a8e <wait>
-    exit(xstatus);
     1630:	fa442503          	lw	a0,-92(s0)
     1634:	452030ef          	jal	4a86 <exit>
     1638:	e0ca                	sd	s2,64(sp)
     163a:	f456                	sd	s5,40(sp)
     163c:	f05a                	sd	s6,32(sp)
     163e:	ec5e                	sd	s7,24(sp)
-    printf("%s: fork() failed\n", s);
     1640:	85ce                	mv	a1,s3
     1642:	00004517          	auipc	a0,0x4
     1646:	46650513          	addi	a0,a0,1126 # 5aa8 <malloc+0xb3e>
     164a:	06d030ef          	jal	4eb6 <printf>
-    exit(1);
     164e:	4505                	li	a0,1
     1650:	436030ef          	jal	4a86 <exit>
 
 0000000000001654 <exitwait>:
-{
     1654:	7139                	addi	sp,sp,-64
     1656:	fc06                	sd	ra,56(sp)
     1658:	f822                	sd	s0,48(sp)
@@ -2496,27 +1884,19 @@ outofinodes(char *s)
     1660:	e852                	sd	s4,16(sp)
     1662:	0080                	addi	s0,sp,64
     1664:	8a2a                	mv	s4,a0
-  for(i = 0; i < 100; i++){
     1666:	4901                	li	s2,0
     1668:	06400993          	li	s3,100
-    pid = fork();
     166c:	412030ef          	jal	4a7e <fork>
     1670:	84aa                	mv	s1,a0
-    if(pid < 0){
     1672:	02054863          	bltz	a0,16a2 <exitwait+0x4e>
-    if(pid){
     1676:	c525                	beqz	a0,16de <exitwait+0x8a>
-      if(wait(&xstate) != pid){
     1678:	fcc40513          	addi	a0,s0,-52
     167c:	412030ef          	jal	4a8e <wait>
     1680:	02951b63          	bne	a0,s1,16b6 <exitwait+0x62>
-      if(i != xstate) {
     1684:	fcc42783          	lw	a5,-52(s0)
     1688:	05279163          	bne	a5,s2,16ca <exitwait+0x76>
-  for(i = 0; i < 100; i++){
     168c:	2905                	addiw	s2,s2,1 # 3001 <subdir+0x41f>
     168e:	fd391fe3          	bne	s2,s3,166c <exitwait+0x18>
-}
     1692:	70e2                	ld	ra,56(sp)
     1694:	7442                	ld	s0,48(sp)
     1696:	74a2                	ld	s1,40(sp)
@@ -2525,36 +1905,28 @@ outofinodes(char *s)
     169c:	6a42                	ld	s4,16(sp)
     169e:	6121                	addi	sp,sp,64
     16a0:	8082                	ret
-      printf("%s: fork failed\n", s);
     16a2:	85d2                	mv	a1,s4
     16a4:	00004517          	auipc	a0,0x4
     16a8:	29450513          	addi	a0,a0,660 # 5938 <malloc+0x9ce>
     16ac:	00b030ef          	jal	4eb6 <printf>
-      exit(1);
     16b0:	4505                	li	a0,1
     16b2:	3d4030ef          	jal	4a86 <exit>
-        printf("%s: wait wrong pid\n", s);
     16b6:	85d2                	mv	a1,s4
     16b8:	00004517          	auipc	a0,0x4
     16bc:	40850513          	addi	a0,a0,1032 # 5ac0 <malloc+0xb56>
     16c0:	7f6030ef          	jal	4eb6 <printf>
-        exit(1);
     16c4:	4505                	li	a0,1
     16c6:	3c0030ef          	jal	4a86 <exit>
-        printf("%s: wait wrong exit status\n", s);
     16ca:	85d2                	mv	a1,s4
     16cc:	00004517          	auipc	a0,0x4
     16d0:	40c50513          	addi	a0,a0,1036 # 5ad8 <malloc+0xb6e>
     16d4:	7e2030ef          	jal	4eb6 <printf>
-        exit(1);
     16d8:	4505                	li	a0,1
     16da:	3ac030ef          	jal	4a86 <exit>
-      exit(i);
     16de:	854a                	mv	a0,s2
     16e0:	3a6030ef          	jal	4a86 <exit>
 
 00000000000016e4 <twochildren>:
-{
     16e4:	1101                	addi	sp,sp,-32
     16e6:	ec06                	sd	ra,24(sp)
     16e8:	e822                	sd	s0,16(sp)
@@ -2563,172 +1935,118 @@ outofinodes(char *s)
     16ee:	1000                	addi	s0,sp,32
     16f0:	892a                	mv	s2,a0
     16f2:	3e800493          	li	s1,1000
-    int pid1 = fork();
     16f6:	388030ef          	jal	4a7e <fork>
-    if(pid1 < 0){
     16fa:	02054663          	bltz	a0,1726 <twochildren+0x42>
-    if(pid1 == 0){
     16fe:	cd15                	beqz	a0,173a <twochildren+0x56>
-      int pid2 = fork();
     1700:	37e030ef          	jal	4a7e <fork>
-      if(pid2 < 0){
     1704:	02054d63          	bltz	a0,173e <twochildren+0x5a>
-      if(pid2 == 0){
     1708:	c529                	beqz	a0,1752 <twochildren+0x6e>
-        wait(0);
     170a:	4501                	li	a0,0
     170c:	382030ef          	jal	4a8e <wait>
-        wait(0);
     1710:	4501                	li	a0,0
     1712:	37c030ef          	jal	4a8e <wait>
-  for(int i = 0; i < 1000; i++){
     1716:	34fd                	addiw	s1,s1,-1
     1718:	fcf9                	bnez	s1,16f6 <twochildren+0x12>
-}
     171a:	60e2                	ld	ra,24(sp)
     171c:	6442                	ld	s0,16(sp)
     171e:	64a2                	ld	s1,8(sp)
     1720:	6902                	ld	s2,0(sp)
     1722:	6105                	addi	sp,sp,32
     1724:	8082                	ret
-      printf("%s: fork failed\n", s);
     1726:	85ca                	mv	a1,s2
     1728:	00004517          	auipc	a0,0x4
     172c:	21050513          	addi	a0,a0,528 # 5938 <malloc+0x9ce>
     1730:	786030ef          	jal	4eb6 <printf>
-      exit(1);
     1734:	4505                	li	a0,1
     1736:	350030ef          	jal	4a86 <exit>
-      exit(0);
     173a:	34c030ef          	jal	4a86 <exit>
-        printf("%s: fork failed\n", s);
     173e:	85ca                	mv	a1,s2
     1740:	00004517          	auipc	a0,0x4
     1744:	1f850513          	addi	a0,a0,504 # 5938 <malloc+0x9ce>
     1748:	76e030ef          	jal	4eb6 <printf>
-        exit(1);
     174c:	4505                	li	a0,1
     174e:	338030ef          	jal	4a86 <exit>
-        exit(0);
     1752:	334030ef          	jal	4a86 <exit>
 
 0000000000001756 <forkfork>:
-{
     1756:	7179                	addi	sp,sp,-48
     1758:	f406                	sd	ra,40(sp)
     175a:	f022                	sd	s0,32(sp)
     175c:	ec26                	sd	s1,24(sp)
     175e:	1800                	addi	s0,sp,48
     1760:	84aa                	mv	s1,a0
-    int pid = fork();
     1762:	31c030ef          	jal	4a7e <fork>
-    if(pid < 0){
     1766:	02054b63          	bltz	a0,179c <forkfork+0x46>
-    if(pid == 0){
     176a:	c139                	beqz	a0,17b0 <forkfork+0x5a>
-    int pid = fork();
     176c:	312030ef          	jal	4a7e <fork>
-    if(pid < 0){
     1770:	02054663          	bltz	a0,179c <forkfork+0x46>
-    if(pid == 0){
     1774:	cd15                	beqz	a0,17b0 <forkfork+0x5a>
-    wait(&xstatus);
     1776:	fdc40513          	addi	a0,s0,-36
     177a:	314030ef          	jal	4a8e <wait>
-    if(xstatus != 0) {
     177e:	fdc42783          	lw	a5,-36(s0)
     1782:	ebb9                	bnez	a5,17d8 <forkfork+0x82>
-    wait(&xstatus);
     1784:	fdc40513          	addi	a0,s0,-36
     1788:	306030ef          	jal	4a8e <wait>
-    if(xstatus != 0) {
     178c:	fdc42783          	lw	a5,-36(s0)
     1790:	e7a1                	bnez	a5,17d8 <forkfork+0x82>
-}
     1792:	70a2                	ld	ra,40(sp)
     1794:	7402                	ld	s0,32(sp)
     1796:	64e2                	ld	s1,24(sp)
     1798:	6145                	addi	sp,sp,48
     179a:	8082                	ret
-      printf("%s: fork failed", s);
     179c:	85a6                	mv	a1,s1
     179e:	00004517          	auipc	a0,0x4
     17a2:	35a50513          	addi	a0,a0,858 # 5af8 <malloc+0xb8e>
     17a6:	710030ef          	jal	4eb6 <printf>
-      exit(1);
     17aa:	4505                	li	a0,1
     17ac:	2da030ef          	jal	4a86 <exit>
-{
     17b0:	0c800493          	li	s1,200
-        int pid1 = fork();
     17b4:	2ca030ef          	jal	4a7e <fork>
-        if(pid1 < 0){
     17b8:	00054b63          	bltz	a0,17ce <forkfork+0x78>
-        if(pid1 == 0){
     17bc:	cd01                	beqz	a0,17d4 <forkfork+0x7e>
-        wait(0);
     17be:	4501                	li	a0,0
     17c0:	2ce030ef          	jal	4a8e <wait>
-      for(int j = 0; j < 200; j++){
     17c4:	34fd                	addiw	s1,s1,-1
     17c6:	f4fd                	bnez	s1,17b4 <forkfork+0x5e>
-      exit(0);
     17c8:	4501                	li	a0,0
     17ca:	2bc030ef          	jal	4a86 <exit>
-          exit(1);
     17ce:	4505                	li	a0,1
     17d0:	2b6030ef          	jal	4a86 <exit>
-          exit(0);
     17d4:	2b2030ef          	jal	4a86 <exit>
-      printf("%s: fork in child failed", s);
     17d8:	85a6                	mv	a1,s1
     17da:	00004517          	auipc	a0,0x4
     17de:	32e50513          	addi	a0,a0,814 # 5b08 <malloc+0xb9e>
     17e2:	6d4030ef          	jal	4eb6 <printf>
-      exit(1);
     17e6:	4505                	li	a0,1
     17e8:	29e030ef          	jal	4a86 <exit>
 
 00000000000017ec <reparent2>:
-{
     17ec:	1101                	addi	sp,sp,-32
     17ee:	ec06                	sd	ra,24(sp)
     17f0:	e822                	sd	s0,16(sp)
     17f2:	e426                	sd	s1,8(sp)
     17f4:	1000                	addi	s0,sp,32
     17f6:	32000493          	li	s1,800
-    int pid1 = fork();
     17fa:	284030ef          	jal	4a7e <fork>
-    if(pid1 < 0){
     17fe:	00054b63          	bltz	a0,1814 <reparent2+0x28>
-    if(pid1 == 0){
     1802:	c115                	beqz	a0,1826 <reparent2+0x3a>
-    wait(0);
     1804:	4501                	li	a0,0
     1806:	288030ef          	jal	4a8e <wait>
-  for(int i = 0; i < 800; i++){
     180a:	34fd                	addiw	s1,s1,-1
     180c:	f4fd                	bnez	s1,17fa <reparent2+0xe>
-  exit(0);
     180e:	4501                	li	a0,0
     1810:	276030ef          	jal	4a86 <exit>
-      printf("fork failed\n");
     1814:	00005517          	auipc	a0,0x5
     1818:	69450513          	addi	a0,a0,1684 # 6ea8 <malloc+0x1f3e>
     181c:	69a030ef          	jal	4eb6 <printf>
-      exit(1);
     1820:	4505                	li	a0,1
     1822:	264030ef          	jal	4a86 <exit>
-      fork();
     1826:	258030ef          	jal	4a7e <fork>
-      fork();
     182a:	254030ef          	jal	4a7e <fork>
-      exit(0);
     182e:	4501                	li	a0,0
     1830:	256030ef          	jal	4a86 <exit>
 
 0000000000001834 <createdelete>:
-{
     1834:	7175                	addi	sp,sp,-144
     1836:	e506                	sd	ra,136(sp)
     1838:	e122                	sd	s0,128(sp)
@@ -2743,190 +2061,133 @@ outofinodes(char *s)
     184a:	fc66                	sd	s9,56(sp)
     184c:	0900                	addi	s0,sp,144
     184e:	8caa                	mv	s9,a0
-  for(pi = 0; pi < NCHILD; pi++){
     1850:	4901                	li	s2,0
     1852:	4991                	li	s3,4
-    pid = fork();
     1854:	22a030ef          	jal	4a7e <fork>
     1858:	84aa                	mv	s1,a0
-    if(pid < 0){
     185a:	02054d63          	bltz	a0,1894 <createdelete+0x60>
-    if(pid == 0){
     185e:	c529                	beqz	a0,18a8 <createdelete+0x74>
-  for(pi = 0; pi < NCHILD; pi++){
     1860:	2905                	addiw	s2,s2,1
     1862:	ff3919e3          	bne	s2,s3,1854 <createdelete+0x20>
     1866:	4491                	li	s1,4
-    wait(&xstatus);
     1868:	f7c40513          	addi	a0,s0,-132
     186c:	222030ef          	jal	4a8e <wait>
-    if(xstatus != 0)
     1870:	f7c42903          	lw	s2,-132(s0)
     1874:	0a091e63          	bnez	s2,1930 <createdelete+0xfc>
-  for(pi = 0; pi < NCHILD; pi++){
     1878:	34fd                	addiw	s1,s1,-1
     187a:	f4fd                	bnez	s1,1868 <createdelete+0x34>
-  name[0] = name[1] = name[2] = 0;
     187c:	f8040123          	sb	zero,-126(s0)
     1880:	03000993          	li	s3,48
     1884:	5a7d                	li	s4,-1
     1886:	07000c13          	li	s8,112
-      if((i == 0 || i >= N/2) && fd < 0){
     188a:	4b25                	li	s6,9
-      } else if((i >= 1 && i < N/2) && fd >= 0){
     188c:	4ba1                	li	s7,8
-    for(pi = 0; pi < NCHILD; pi++){
     188e:	07400a93          	li	s5,116
     1892:	aa39                	j	19b0 <createdelete+0x17c>
-      printf("%s: fork failed\n", s);
     1894:	85e6                	mv	a1,s9
     1896:	00004517          	auipc	a0,0x4
     189a:	0a250513          	addi	a0,a0,162 # 5938 <malloc+0x9ce>
     189e:	618030ef          	jal	4eb6 <printf>
-      exit(1);
     18a2:	4505                	li	a0,1
     18a4:	1e2030ef          	jal	4a86 <exit>
-      name[0] = 'p' + pi;
     18a8:	0709091b          	addiw	s2,s2,112
     18ac:	f9240023          	sb	s2,-128(s0)
-      name[2] = '\0';
     18b0:	f8040123          	sb	zero,-126(s0)
-      for(i = 0; i < N; i++){
     18b4:	4951                	li	s2,20
     18b6:	a831                	j	18d2 <createdelete+0x9e>
-          printf("%s: create failed\n", s);
     18b8:	85e6                	mv	a1,s9
     18ba:	00004517          	auipc	a0,0x4
     18be:	11650513          	addi	a0,a0,278 # 59d0 <malloc+0xa66>
     18c2:	5f4030ef          	jal	4eb6 <printf>
-          exit(1);
     18c6:	4505                	li	a0,1
     18c8:	1be030ef          	jal	4a86 <exit>
-      for(i = 0; i < N; i++){
     18cc:	2485                	addiw	s1,s1,1
     18ce:	05248e63          	beq	s1,s2,192a <createdelete+0xf6>
-        name[1] = '0' + i;
     18d2:	0304879b          	addiw	a5,s1,48
     18d6:	f8f400a3          	sb	a5,-127(s0)
-        fd = open(name, O_CREATE | O_RDWR);
     18da:	20200593          	li	a1,514
     18de:	f8040513          	addi	a0,s0,-128
     18e2:	1e4030ef          	jal	4ac6 <open>
-        if(fd < 0){
     18e6:	fc0549e3          	bltz	a0,18b8 <createdelete+0x84>
-        close(fd);
     18ea:	1c4030ef          	jal	4aae <close>
-        if(i > 0 && (i % 2 ) == 0){
     18ee:	10905063          	blez	s1,19ee <createdelete+0x1ba>
     18f2:	0014f793          	andi	a5,s1,1
     18f6:	fbf9                	bnez	a5,18cc <createdelete+0x98>
-          name[1] = '0' + (i / 2);
     18f8:	01f4d79b          	srliw	a5,s1,0x1f
     18fc:	9fa5                	addw	a5,a5,s1
     18fe:	4017d79b          	sraiw	a5,a5,0x1
     1902:	0307879b          	addiw	a5,a5,48
     1906:	f8f400a3          	sb	a5,-127(s0)
-          if(unlink(name) < 0){
     190a:	f8040513          	addi	a0,s0,-128
     190e:	1c8030ef          	jal	4ad6 <unlink>
     1912:	fa055de3          	bgez	a0,18cc <createdelete+0x98>
-            printf("%s: unlink failed\n", s);
     1916:	85e6                	mv	a1,s9
     1918:	00004517          	auipc	a0,0x4
     191c:	21050513          	addi	a0,a0,528 # 5b28 <malloc+0xbbe>
     1920:	596030ef          	jal	4eb6 <printf>
-            exit(1);
     1924:	4505                	li	a0,1
     1926:	160030ef          	jal	4a86 <exit>
-      exit(0);
     192a:	4501                	li	a0,0
     192c:	15a030ef          	jal	4a86 <exit>
-      exit(1);
     1930:	4505                	li	a0,1
     1932:	154030ef          	jal	4a86 <exit>
-        printf("%s: oops createdelete %s didn't exist\n", s, name);
     1936:	f8040613          	addi	a2,s0,-128
     193a:	85e6                	mv	a1,s9
     193c:	00004517          	auipc	a0,0x4
     1940:	20450513          	addi	a0,a0,516 # 5b40 <malloc+0xbd6>
     1944:	572030ef          	jal	4eb6 <printf>
-        exit(1);
     1948:	4505                	li	a0,1
     194a:	13c030ef          	jal	4a86 <exit>
-      } else if((i >= 1 && i < N/2) && fd >= 0){
     194e:	034bfb63          	bgeu	s7,s4,1984 <createdelete+0x150>
-      if(fd >= 0)
     1952:	02055663          	bgez	a0,197e <createdelete+0x14a>
-    for(pi = 0; pi < NCHILD; pi++){
     1956:	2485                	addiw	s1,s1,1
     1958:	0ff4f493          	zext.b	s1,s1
     195c:	05548263          	beq	s1,s5,19a0 <createdelete+0x16c>
-      name[0] = 'p' + pi;
     1960:	f8940023          	sb	s1,-128(s0)
-      name[1] = '0' + i;
     1964:	f93400a3          	sb	s3,-127(s0)
-      fd = open(name, 0);
     1968:	4581                	li	a1,0
     196a:	f8040513          	addi	a0,s0,-128
     196e:	158030ef          	jal	4ac6 <open>
-      if((i == 0 || i >= N/2) && fd < 0){
     1972:	00090463          	beqz	s2,197a <createdelete+0x146>
     1976:	fd2b5ce3          	bge	s6,s2,194e <createdelete+0x11a>
     197a:	fa054ee3          	bltz	a0,1936 <createdelete+0x102>
-        close(fd);
     197e:	130030ef          	jal	4aae <close>
     1982:	bfd1                	j	1956 <createdelete+0x122>
-      } else if((i >= 1 && i < N/2) && fd >= 0){
     1984:	fc0549e3          	bltz	a0,1956 <createdelete+0x122>
-        printf("%s: oops createdelete %s did exist\n", s, name);
     1988:	f8040613          	addi	a2,s0,-128
     198c:	85e6                	mv	a1,s9
     198e:	00004517          	auipc	a0,0x4
     1992:	1da50513          	addi	a0,a0,474 # 5b68 <malloc+0xbfe>
     1996:	520030ef          	jal	4eb6 <printf>
-        exit(1);
     199a:	4505                	li	a0,1
     199c:	0ea030ef          	jal	4a86 <exit>
-  for(i = 0; i < N; i++){
     19a0:	2905                	addiw	s2,s2,1
     19a2:	2a05                	addiw	s4,s4,1
     19a4:	2985                	addiw	s3,s3,1
     19a6:	0ff9f993          	zext.b	s3,s3
     19aa:	47d1                	li	a5,20
     19ac:	02f90863          	beq	s2,a5,19dc <createdelete+0x1a8>
-    for(pi = 0; pi < NCHILD; pi++){
     19b0:	84e2                	mv	s1,s8
     19b2:	b77d                	j	1960 <createdelete+0x12c>
-  for(i = 0; i < N; i++){
     19b4:	2905                	addiw	s2,s2,1
     19b6:	0ff97913          	zext.b	s2,s2
     19ba:	03490c63          	beq	s2,s4,19f2 <createdelete+0x1be>
-  name[0] = name[1] = name[2] = 0;
     19be:	84d6                	mv	s1,s5
-      name[0] = 'p' + pi;
     19c0:	f8940023          	sb	s1,-128(s0)
-      name[1] = '0' + i;
     19c4:	f92400a3          	sb	s2,-127(s0)
-      unlink(name);
     19c8:	f8040513          	addi	a0,s0,-128
     19cc:	10a030ef          	jal	4ad6 <unlink>
-    for(pi = 0; pi < NCHILD; pi++){
     19d0:	2485                	addiw	s1,s1,1
     19d2:	0ff4f493          	zext.b	s1,s1
     19d6:	ff3495e3          	bne	s1,s3,19c0 <createdelete+0x18c>
     19da:	bfe9                	j	19b4 <createdelete+0x180>
     19dc:	03000913          	li	s2,48
-  name[0] = name[1] = name[2] = 0;
     19e0:	07000a93          	li	s5,112
-    for(pi = 0; pi < NCHILD; pi++){
     19e4:	07400993          	li	s3,116
-  for(i = 0; i < N; i++){
     19e8:	04400a13          	li	s4,68
     19ec:	bfc9                	j	19be <createdelete+0x18a>
-      for(i = 0; i < N; i++){
     19ee:	2485                	addiw	s1,s1,1
     19f0:	b5cd                	j	18d2 <createdelete+0x9e>
-}
     19f2:	60aa                	ld	ra,136(sp)
     19f4:	640a                	ld	s0,128(sp)
     19f6:	74e6                	ld	s1,120(sp)
@@ -2942,7 +2203,6 @@ outofinodes(char *s)
     1a0a:	8082                	ret
 
 0000000000001a0c <linkunlink>:
-{
     1a0c:	711d                	addi	sp,sp,-96
     1a0e:	ec86                	sd	ra,88(sp)
     1a10:	e8a2                	sd	s0,80(sp)
@@ -2957,77 +2217,56 @@ outofinodes(char *s)
     1a22:	e466                	sd	s9,8(sp)
     1a24:	1080                	addi	s0,sp,96
     1a26:	84aa                	mv	s1,a0
-  unlink("x");
     1a28:	00003517          	auipc	a0,0x3
     1a2c:	6f050513          	addi	a0,a0,1776 # 5118 <malloc+0x1ae>
     1a30:	0a6030ef          	jal	4ad6 <unlink>
-  pid = fork();
     1a34:	04a030ef          	jal	4a7e <fork>
-  if(pid < 0){
     1a38:	02054b63          	bltz	a0,1a6e <linkunlink+0x62>
     1a3c:	8caa                	mv	s9,a0
-  unsigned int x = (pid ? 1 : 97);
     1a3e:	06100913          	li	s2,97
     1a42:	c111                	beqz	a0,1a46 <linkunlink+0x3a>
     1a44:	4905                	li	s2,1
     1a46:	06400493          	li	s1,100
-    x = x * 1103515245 + 12345;
     1a4a:	41c65a37          	lui	s4,0x41c65
     1a4e:	e6da0a1b          	addiw	s4,s4,-403 # 41c64e6d <base+0x41c551f5>
     1a52:	698d                	lui	s3,0x3
     1a54:	0399899b          	addiw	s3,s3,57 # 3039 <subdir+0x457>
-    if((x % 3) == 0){
     1a58:	4a8d                	li	s5,3
-    } else if((x % 3) == 1){
     1a5a:	4b85                	li	s7,1
-      unlink("x");
     1a5c:	00003b17          	auipc	s6,0x3
     1a60:	6bcb0b13          	addi	s6,s6,1724 # 5118 <malloc+0x1ae>
-      link("cat", "x");
     1a64:	00004c17          	auipc	s8,0x4
     1a68:	12cc0c13          	addi	s8,s8,300 # 5b90 <malloc+0xc26>
     1a6c:	a025                	j	1a94 <linkunlink+0x88>
-    printf("%s: fork failed\n", s);
     1a6e:	85a6                	mv	a1,s1
     1a70:	00004517          	auipc	a0,0x4
     1a74:	ec850513          	addi	a0,a0,-312 # 5938 <malloc+0x9ce>
     1a78:	43e030ef          	jal	4eb6 <printf>
-    exit(1);
     1a7c:	4505                	li	a0,1
     1a7e:	008030ef          	jal	4a86 <exit>
-      close(open("x", O_RDWR | O_CREATE));
     1a82:	20200593          	li	a1,514
     1a86:	855a                	mv	a0,s6
     1a88:	03e030ef          	jal	4ac6 <open>
     1a8c:	022030ef          	jal	4aae <close>
-  for(i = 0; i < 100; i++){
     1a90:	34fd                	addiw	s1,s1,-1
     1a92:	c495                	beqz	s1,1abe <linkunlink+0xb2>
-    x = x * 1103515245 + 12345;
     1a94:	034907bb          	mulw	a5,s2,s4
     1a98:	013787bb          	addw	a5,a5,s3
     1a9c:	0007891b          	sext.w	s2,a5
-    if((x % 3) == 0){
     1aa0:	0357f7bb          	remuw	a5,a5,s5
     1aa4:	2781                	sext.w	a5,a5
     1aa6:	dff1                	beqz	a5,1a82 <linkunlink+0x76>
-    } else if((x % 3) == 1){
     1aa8:	01778663          	beq	a5,s7,1ab4 <linkunlink+0xa8>
-      unlink("x");
     1aac:	855a                	mv	a0,s6
     1aae:	028030ef          	jal	4ad6 <unlink>
     1ab2:	bff9                	j	1a90 <linkunlink+0x84>
-      link("cat", "x");
     1ab4:	85da                	mv	a1,s6
     1ab6:	8562                	mv	a0,s8
     1ab8:	02e030ef          	jal	4ae6 <link>
     1abc:	bfd1                	j	1a90 <linkunlink+0x84>
-  if(pid)
     1abe:	020c8263          	beqz	s9,1ae2 <linkunlink+0xd6>
-    wait(0);
     1ac2:	4501                	li	a0,0
     1ac4:	7cb020ef          	jal	4a8e <wait>
-}
     1ac8:	60e6                	ld	ra,88(sp)
     1aca:	6446                	ld	s0,80(sp)
     1acc:	64a6                	ld	s1,72(sp)
@@ -3041,12 +2280,10 @@ outofinodes(char *s)
     1adc:	6ca2                	ld	s9,8(sp)
     1ade:	6125                	addi	sp,sp,96
     1ae0:	8082                	ret
-    exit(0);
     1ae2:	4501                	li	a0,0
     1ae4:	7a3020ef          	jal	4a86 <exit>
 
 0000000000001ae8 <forktest>:
-{
     1ae8:	7179                	addi	sp,sp,-48
     1aea:	f406                	sd	ra,40(sp)
     1aec:	f022                	sd	s0,32(sp)
@@ -3055,69 +2292,49 @@ outofinodes(char *s)
     1af2:	e44e                	sd	s3,8(sp)
     1af4:	1800                	addi	s0,sp,48
     1af6:	89aa                	mv	s3,a0
-  for(n=0; n<N; n++){
     1af8:	4481                	li	s1,0
     1afa:	3e800913          	li	s2,1000
-    pid = fork();
     1afe:	781020ef          	jal	4a7e <fork>
-    if(pid < 0)
     1b02:	06054063          	bltz	a0,1b62 <forktest+0x7a>
-    if(pid == 0)
     1b06:	cd11                	beqz	a0,1b22 <forktest+0x3a>
-  for(n=0; n<N; n++){
     1b08:	2485                	addiw	s1,s1,1
     1b0a:	ff249ae3          	bne	s1,s2,1afe <forktest+0x16>
-    printf("%s: fork claimed to work 1000 times!\n", s);
     1b0e:	85ce                	mv	a1,s3
     1b10:	00004517          	auipc	a0,0x4
     1b14:	0d050513          	addi	a0,a0,208 # 5be0 <malloc+0xc76>
     1b18:	39e030ef          	jal	4eb6 <printf>
-    exit(1);
     1b1c:	4505                	li	a0,1
     1b1e:	769020ef          	jal	4a86 <exit>
-      exit(0);
     1b22:	765020ef          	jal	4a86 <exit>
-    printf("%s: no fork at all!\n", s);
     1b26:	85ce                	mv	a1,s3
     1b28:	00004517          	auipc	a0,0x4
     1b2c:	07050513          	addi	a0,a0,112 # 5b98 <malloc+0xc2e>
     1b30:	386030ef          	jal	4eb6 <printf>
-    exit(1);
     1b34:	4505                	li	a0,1
     1b36:	751020ef          	jal	4a86 <exit>
-      printf("%s: wait stopped early\n", s);
     1b3a:	85ce                	mv	a1,s3
     1b3c:	00004517          	auipc	a0,0x4
     1b40:	07450513          	addi	a0,a0,116 # 5bb0 <malloc+0xc46>
     1b44:	372030ef          	jal	4eb6 <printf>
-      exit(1);
     1b48:	4505                	li	a0,1
     1b4a:	73d020ef          	jal	4a86 <exit>
-    printf("%s: wait got too many\n", s);
     1b4e:	85ce                	mv	a1,s3
     1b50:	00004517          	auipc	a0,0x4
     1b54:	07850513          	addi	a0,a0,120 # 5bc8 <malloc+0xc5e>
     1b58:	35e030ef          	jal	4eb6 <printf>
-    exit(1);
     1b5c:	4505                	li	a0,1
     1b5e:	729020ef          	jal	4a86 <exit>
-  if (n == 0) {
     1b62:	d0f1                	beqz	s1,1b26 <forktest+0x3e>
-  for(; n > 0; n--){
     1b64:	00905963          	blez	s1,1b76 <forktest+0x8e>
-    if(wait(0) < 0){
     1b68:	4501                	li	a0,0
     1b6a:	725020ef          	jal	4a8e <wait>
     1b6e:	fc0546e3          	bltz	a0,1b3a <forktest+0x52>
-  for(; n > 0; n--){
     1b72:	34fd                	addiw	s1,s1,-1
     1b74:	f8f5                	bnez	s1,1b68 <forktest+0x80>
-  if(wait(0) != -1){
     1b76:	4501                	li	a0,0
     1b78:	717020ef          	jal	4a8e <wait>
     1b7c:	57fd                	li	a5,-1
     1b7e:	fcf518e3          	bne	a0,a5,1b4e <forktest+0x66>
-}
     1b82:	70a2                	ld	ra,40(sp)
     1b84:	7402                	ld	s0,32(sp)
     1b86:	64e2                	ld	s1,24(sp)
@@ -3127,7 +2344,6 @@ outofinodes(char *s)
     1b8e:	8082                	ret
 
 0000000000001b90 <kernmem>:
-{
     1b90:	715d                	addi	sp,sp,-80
     1b92:	e486                	sd	ra,72(sp)
     1b94:	e0a2                	sd	s0,64(sp)
@@ -3138,33 +2354,23 @@ outofinodes(char *s)
     1b9e:	ec56                	sd	s5,24(sp)
     1ba0:	0880                	addi	s0,sp,80
     1ba2:	8aaa                	mv	s5,a0
-  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
     1ba4:	4485                	li	s1,1
     1ba6:	04fe                	slli	s1,s1,0x1f
-    if(xstatus != -1)  // did kernel kill child?
     1ba8:	5a7d                	li	s4,-1
-  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
     1baa:	69b1                	lui	s3,0xc
     1bac:	35098993          	addi	s3,s3,848 # c350 <uninit+0x1de8>
     1bb0:	1003d937          	lui	s2,0x1003d
     1bb4:	090e                	slli	s2,s2,0x3
     1bb6:	48090913          	addi	s2,s2,1152 # 1003d480 <base+0x1002d808>
-    pid = fork();
     1bba:	6c5020ef          	jal	4a7e <fork>
-    if(pid < 0){
     1bbe:	02054763          	bltz	a0,1bec <kernmem+0x5c>
-    if(pid == 0){
     1bc2:	cd1d                	beqz	a0,1c00 <kernmem+0x70>
-    wait(&xstatus);
     1bc4:	fbc40513          	addi	a0,s0,-68
     1bc8:	6c7020ef          	jal	4a8e <wait>
-    if(xstatus != -1)  // did kernel kill child?
     1bcc:	fbc42783          	lw	a5,-68(s0)
     1bd0:	05479563          	bne	a5,s4,1c1a <kernmem+0x8a>
-  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
     1bd4:	94ce                	add	s1,s1,s3
     1bd6:	ff2492e3          	bne	s1,s2,1bba <kernmem+0x2a>
-}
     1bda:	60a6                	ld	ra,72(sp)
     1bdc:	6406                	ld	s0,64(sp)
     1bde:	74e2                	ld	s1,56(sp)
@@ -3174,59 +2380,44 @@ outofinodes(char *s)
     1be6:	6ae2                	ld	s5,24(sp)
     1be8:	6161                	addi	sp,sp,80
     1bea:	8082                	ret
-      printf("%s: fork failed\n", s);
     1bec:	85d6                	mv	a1,s5
     1bee:	00004517          	auipc	a0,0x4
     1bf2:	d4a50513          	addi	a0,a0,-694 # 5938 <malloc+0x9ce>
     1bf6:	2c0030ef          	jal	4eb6 <printf>
-      exit(1);
     1bfa:	4505                	li	a0,1
     1bfc:	68b020ef          	jal	4a86 <exit>
-      printf("%s: oops could read %p = %x\n", s, a, *a);
     1c00:	0004c683          	lbu	a3,0(s1)
     1c04:	8626                	mv	a2,s1
     1c06:	85d6                	mv	a1,s5
     1c08:	00004517          	auipc	a0,0x4
     1c0c:	00050513          	mv	a0,a0
     1c10:	2a6030ef          	jal	4eb6 <printf>
-      exit(1);
     1c14:	4505                	li	a0,1
     1c16:	671020ef          	jal	4a86 <exit>
-      exit(1);
     1c1a:	4505                	li	a0,1
     1c1c:	66b020ef          	jal	4a86 <exit>
 
 0000000000001c20 <MAXVAplus>:
-{
     1c20:	7179                	addi	sp,sp,-48
     1c22:	f406                	sd	ra,40(sp)
     1c24:	f022                	sd	s0,32(sp)
     1c26:	1800                	addi	s0,sp,48
-  volatile uint64 a = MAXVA;
     1c28:	4785                	li	a5,1
     1c2a:	179a                	slli	a5,a5,0x26
     1c2c:	fcf43c23          	sd	a5,-40(s0)
-  for( ; a != 0; a <<= 1){
     1c30:	fd843783          	ld	a5,-40(s0)
     1c34:	cf85                	beqz	a5,1c6c <MAXVAplus+0x4c>
     1c36:	ec26                	sd	s1,24(sp)
     1c38:	e84a                	sd	s2,16(sp)
     1c3a:	892a                	mv	s2,a0
-    if(xstatus != -1)  // did kernel kill child?
     1c3c:	54fd                	li	s1,-1
-    pid = fork();
     1c3e:	641020ef          	jal	4a7e <fork>
-    if(pid < 0){
     1c42:	02054963          	bltz	a0,1c74 <MAXVAplus+0x54>
-    if(pid == 0){
     1c46:	c129                	beqz	a0,1c88 <MAXVAplus+0x68>
-    wait(&xstatus);
     1c48:	fd440513          	addi	a0,s0,-44
     1c4c:	643020ef          	jal	4a8e <wait>
-    if(xstatus != -1)  // did kernel kill child?
     1c50:	fd442783          	lw	a5,-44(s0)
     1c54:	04979c63          	bne	a5,s1,1cac <MAXVAplus+0x8c>
-  for( ; a != 0; a <<= 1){
     1c58:	fd843783          	ld	a5,-40(s0)
     1c5c:	0786                	slli	a5,a5,0x1
     1c5e:	fcf43c23          	sd	a5,-40(s0)
@@ -3234,67 +2425,46 @@ outofinodes(char *s)
     1c66:	ffe1                	bnez	a5,1c3e <MAXVAplus+0x1e>
     1c68:	64e2                	ld	s1,24(sp)
     1c6a:	6942                	ld	s2,16(sp)
-}
     1c6c:	70a2                	ld	ra,40(sp)
     1c6e:	7402                	ld	s0,32(sp)
     1c70:	6145                	addi	sp,sp,48
     1c72:	8082                	ret
-      printf("%s: fork failed\n", s);
     1c74:	85ca                	mv	a1,s2
     1c76:	00004517          	auipc	a0,0x4
     1c7a:	cc250513          	addi	a0,a0,-830 # 5938 <malloc+0x9ce>
     1c7e:	238030ef          	jal	4eb6 <printf>
-      exit(1);
     1c82:	4505                	li	a0,1
     1c84:	603020ef          	jal	4a86 <exit>
-      *(char*)a = 99;
     1c88:	fd843783          	ld	a5,-40(s0)
     1c8c:	06300713          	li	a4,99
     1c90:	00e78023          	sb	a4,0(a5)
-      printf("%s: oops wrote %p\n", s, (void*)a);
     1c94:	fd843603          	ld	a2,-40(s0)
     1c98:	85ca                	mv	a1,s2
     1c9a:	00004517          	auipc	a0,0x4
     1c9e:	f8e50513          	addi	a0,a0,-114 # 5c28 <malloc+0xcbe>
     1ca2:	214030ef          	jal	4eb6 <printf>
-      exit(1);
     1ca6:	4505                	li	a0,1
     1ca8:	5df020ef          	jal	4a86 <exit>
-      exit(1);
     1cac:	4505                	li	a0,1
     1cae:	5d9020ef          	jal	4a86 <exit>
 
 0000000000001cb2 <stacktest>:
-{
     1cb2:	7179                	addi	sp,sp,-48
     1cb4:	f406                	sd	ra,40(sp)
     1cb6:	f022                	sd	s0,32(sp)
     1cb8:	ec26                	sd	s1,24(sp)
     1cba:	1800                	addi	s0,sp,48
     1cbc:	84aa                	mv	s1,a0
-  pid = fork();
     1cbe:	5c1020ef          	jal	4a7e <fork>
-  if(pid == 0) {
     1cc2:	cd11                	beqz	a0,1cde <stacktest+0x2c>
-  } else if(pid < 0){
     1cc4:	02054c63          	bltz	a0,1cfc <stacktest+0x4a>
-  wait(&xstatus);
     1cc8:	fdc40513          	addi	a0,s0,-36
     1ccc:	5c3020ef          	jal	4a8e <wait>
-  if(xstatus == -1)  // kernel killed child?
     1cd0:	fdc42503          	lw	a0,-36(s0)
     1cd4:	57fd                	li	a5,-1
     1cd6:	02f50d63          	beq	a0,a5,1d10 <stacktest+0x5e>
-    exit(xstatus);
     1cda:	5ad020ef          	jal	4a86 <exit>
-
-static inline uint64
-r_sp()
-{
-  uint64 x;
-  asm volatile("mv %0, sp" : "=r" (x) );
     1cde:	870a                	mv	a4,sp
-    printf("%s: stacktest: read below stack %d\n", s, *sp);
     1ce0:	77fd                	lui	a5,0xfffff
     1ce2:	97ba                	add	a5,a5,a4
     1ce4:	0007c603          	lbu	a2,0(a5) # fffffffffffff000 <base+0xfffffffffffef388>
@@ -3302,23 +2472,18 @@ r_sp()
     1cea:	00004517          	auipc	a0,0x4
     1cee:	f5650513          	addi	a0,a0,-170 # 5c40 <malloc+0xcd6>
     1cf2:	1c4030ef          	jal	4eb6 <printf>
-    exit(1);
     1cf6:	4505                	li	a0,1
     1cf8:	58f020ef          	jal	4a86 <exit>
-    printf("%s: fork failed\n", s);
     1cfc:	85a6                	mv	a1,s1
     1cfe:	00004517          	auipc	a0,0x4
     1d02:	c3a50513          	addi	a0,a0,-966 # 5938 <malloc+0x9ce>
     1d06:	1b0030ef          	jal	4eb6 <printf>
-    exit(1);
     1d0a:	4505                	li	a0,1
     1d0c:	57b020ef          	jal	4a86 <exit>
-    exit(0);
     1d10:	4501                	li	a0,0
     1d12:	575020ef          	jal	4a86 <exit>
 
 0000000000001d16 <nowrite>:
-{
     1d16:	7159                	addi	sp,sp,-112
     1d18:	f486                	sd	ra,104(sp)
     1d1a:	f0a2                	sd	s0,96(sp)
@@ -3327,7 +2492,6 @@ r_sp()
     1d20:	e4ce                	sd	s3,72(sp)
     1d22:	1880                	addi	s0,sp,112
     1d24:	89aa                	mv	s3,a0
-  uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000,
     1d26:	00005797          	auipc	a5,0x5
     1d2a:	6e278793          	addi	a5,a5,1762 # 7408 <malloc+0x249e>
     1d2e:	7788                	ld	a0,40(a5)
@@ -3342,57 +2506,41 @@ r_sp()
     1d46:	fad43823          	sd	a3,-80(s0)
     1d4a:	fae43c23          	sd	a4,-72(s0)
     1d4e:	fcf43023          	sd	a5,-64(s0)
-  for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){
     1d52:	4481                	li	s1,0
     1d54:	4919                	li	s2,6
-    pid = fork();
     1d56:	529020ef          	jal	4a7e <fork>
-    if(pid == 0) {
     1d5a:	c105                	beqz	a0,1d7a <nowrite+0x64>
-    } else if(pid < 0){
     1d5c:	04054263          	bltz	a0,1da0 <nowrite+0x8a>
-    wait(&xstatus);
     1d60:	fcc40513          	addi	a0,s0,-52
     1d64:	52b020ef          	jal	4a8e <wait>
-    if(xstatus == 0){
     1d68:	fcc42783          	lw	a5,-52(s0)
     1d6c:	c7a1                	beqz	a5,1db4 <nowrite+0x9e>
-  for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){
     1d6e:	2485                	addiw	s1,s1,1
     1d70:	ff2493e3          	bne	s1,s2,1d56 <nowrite+0x40>
-  exit(0);
     1d74:	4501                	li	a0,0
     1d76:	511020ef          	jal	4a86 <exit>
-      volatile int *addr = (int *) addrs[ai];
     1d7a:	048e                	slli	s1,s1,0x3
     1d7c:	fd048793          	addi	a5,s1,-48
     1d80:	008784b3          	add	s1,a5,s0
     1d84:	fc84b603          	ld	a2,-56(s1)
-      *addr = 10;
     1d88:	47a9                	li	a5,10
     1d8a:	c21c                	sw	a5,0(a2)
-      printf("%s: write to %p did not fail!\n", s, addr);
     1d8c:	85ce                	mv	a1,s3
     1d8e:	00004517          	auipc	a0,0x4
     1d92:	eda50513          	addi	a0,a0,-294 # 5c68 <malloc+0xcfe>
     1d96:	120030ef          	jal	4eb6 <printf>
-      exit(0);
     1d9a:	4501                	li	a0,0
     1d9c:	4eb020ef          	jal	4a86 <exit>
-      printf("%s: fork failed\n", s);
     1da0:	85ce                	mv	a1,s3
     1da2:	00004517          	auipc	a0,0x4
     1da6:	b9650513          	addi	a0,a0,-1130 # 5938 <malloc+0x9ce>
     1daa:	10c030ef          	jal	4eb6 <printf>
-      exit(1);
     1dae:	4505                	li	a0,1
     1db0:	4d7020ef          	jal	4a86 <exit>
-      exit(1);
     1db4:	4505                	li	a0,1
     1db6:	4d1020ef          	jal	4a86 <exit>
 
 0000000000001dba <manywrites>:
-{
     1dba:	711d                	addi	sp,sp,-96
     1dbc:	ec86                	sd	ra,88(sp)
     1dbe:	e8a2                	sd	s0,80(sp)
@@ -3402,420 +2550,311 @@ r_sp()
     1dc6:	f456                	sd	s5,40(sp)
     1dc8:	1080                	addi	s0,sp,96
     1dca:	8aaa                	mv	s5,a0
-  for(int ci = 0; ci < nchildren; ci++){
     1dcc:	4981                	li	s3,0
     1dce:	4911                	li	s2,4
-    int pid = fork();
     1dd0:	4af020ef          	jal	4a7e <fork>
     1dd4:	84aa                	mv	s1,a0
-    if(pid < 0){
     1dd6:	02054963          	bltz	a0,1e08 <manywrites+0x4e>
-    if(pid == 0){
     1dda:	c139                	beqz	a0,1e20 <manywrites+0x66>
-  for(int ci = 0; ci < nchildren; ci++){
     1ddc:	2985                	addiw	s3,s3,1
     1dde:	ff2999e3          	bne	s3,s2,1dd0 <manywrites+0x16>
     1de2:	f852                	sd	s4,48(sp)
     1de4:	f05a                	sd	s6,32(sp)
     1de6:	ec5e                	sd	s7,24(sp)
     1de8:	4491                	li	s1,4
-    int st = 0;
     1dea:	fa042423          	sw	zero,-88(s0)
-    wait(&st);
     1dee:	fa840513          	addi	a0,s0,-88
     1df2:	49d020ef          	jal	4a8e <wait>
-    if(st != 0)
     1df6:	fa842503          	lw	a0,-88(s0)
     1dfa:	0c051863          	bnez	a0,1eca <manywrites+0x110>
-  for(int ci = 0; ci < nchildren; ci++){
     1dfe:	34fd                	addiw	s1,s1,-1
     1e00:	f4ed                	bnez	s1,1dea <manywrites+0x30>
-  exit(0);
     1e02:	4501                	li	a0,0
     1e04:	483020ef          	jal	4a86 <exit>
     1e08:	f852                	sd	s4,48(sp)
     1e0a:	f05a                	sd	s6,32(sp)
     1e0c:	ec5e                	sd	s7,24(sp)
-      printf("fork failed\n");
     1e0e:	00005517          	auipc	a0,0x5
     1e12:	09a50513          	addi	a0,a0,154 # 6ea8 <malloc+0x1f3e>
     1e16:	0a0030ef          	jal	4eb6 <printf>
-      exit(1);
     1e1a:	4505                	li	a0,1
     1e1c:	46b020ef          	jal	4a86 <exit>
     1e20:	f852                	sd	s4,48(sp)
     1e22:	f05a                	sd	s6,32(sp)
     1e24:	ec5e                	sd	s7,24(sp)
-      name[0] = 'b';
     1e26:	06200793          	li	a5,98
     1e2a:	faf40423          	sb	a5,-88(s0)
-      name[1] = 'a' + ci;
     1e2e:	0619879b          	addiw	a5,s3,97
     1e32:	faf404a3          	sb	a5,-87(s0)
-      name[2] = '\0';
     1e36:	fa040523          	sb	zero,-86(s0)
-      unlink(name);
     1e3a:	fa840513          	addi	a0,s0,-88
     1e3e:	499020ef          	jal	4ad6 <unlink>
     1e42:	4bf9                	li	s7,30
-          int cc = write(fd, buf, sz);
     1e44:	0000bb17          	auipc	s6,0xb
     1e48:	e34b0b13          	addi	s6,s6,-460 # cc78 <buf>
-        for(int i = 0; i < ci+1; i++){
     1e4c:	8a26                	mv	s4,s1
     1e4e:	0209c863          	bltz	s3,1e7e <manywrites+0xc4>
-          int fd = open(name, O_CREATE | O_RDWR);
     1e52:	20200593          	li	a1,514
     1e56:	fa840513          	addi	a0,s0,-88
     1e5a:	46d020ef          	jal	4ac6 <open>
     1e5e:	892a                	mv	s2,a0
-          if(fd < 0){
     1e60:	02054d63          	bltz	a0,1e9a <manywrites+0xe0>
-          int cc = write(fd, buf, sz);
     1e64:	660d                	lui	a2,0x3
     1e66:	85da                	mv	a1,s6
     1e68:	43f020ef          	jal	4aa6 <write>
-          if(cc != sz){
     1e6c:	678d                	lui	a5,0x3
     1e6e:	04f51263          	bne	a0,a5,1eb2 <manywrites+0xf8>
-          close(fd);
     1e72:	854a                	mv	a0,s2
     1e74:	43b020ef          	jal	4aae <close>
-        for(int i = 0; i < ci+1; i++){
     1e78:	2a05                	addiw	s4,s4,1
     1e7a:	fd49dce3          	bge	s3,s4,1e52 <manywrites+0x98>
-        unlink(name);
     1e7e:	fa840513          	addi	a0,s0,-88
     1e82:	455020ef          	jal	4ad6 <unlink>
-      for(int iters = 0; iters < howmany; iters++){
     1e86:	3bfd                	addiw	s7,s7,-1
     1e88:	fc0b92e3          	bnez	s7,1e4c <manywrites+0x92>
-      unlink(name);
     1e8c:	fa840513          	addi	a0,s0,-88
     1e90:	447020ef          	jal	4ad6 <unlink>
-      exit(0);
     1e94:	4501                	li	a0,0
     1e96:	3f1020ef          	jal	4a86 <exit>
-            printf("%s: cannot create %s\n", s, name);
     1e9a:	fa840613          	addi	a2,s0,-88
     1e9e:	85d6                	mv	a1,s5
     1ea0:	00004517          	auipc	a0,0x4
     1ea4:	de850513          	addi	a0,a0,-536 # 5c88 <malloc+0xd1e>
     1ea8:	00e030ef          	jal	4eb6 <printf>
-            exit(1);
     1eac:	4505                	li	a0,1
     1eae:	3d9020ef          	jal	4a86 <exit>
-            printf("%s: write(%d) ret %d\n", s, sz, cc);
     1eb2:	86aa                	mv	a3,a0
     1eb4:	660d                	lui	a2,0x3
     1eb6:	85d6                	mv	a1,s5
     1eb8:	00003517          	auipc	a0,0x3
     1ebc:	2c050513          	addi	a0,a0,704 # 5178 <malloc+0x20e>
     1ec0:	7f7020ef          	jal	4eb6 <printf>
-            exit(1);
     1ec4:	4505                	li	a0,1
     1ec6:	3c1020ef          	jal	4a86 <exit>
-      exit(st);
     1eca:	3bd020ef          	jal	4a86 <exit>
 
 0000000000001ece <copyinstr3>:
-{
     1ece:	7179                	addi	sp,sp,-48
     1ed0:	f406                	sd	ra,40(sp)
     1ed2:	f022                	sd	s0,32(sp)
     1ed4:	ec26                	sd	s1,24(sp)
     1ed6:	1800                	addi	s0,sp,48
-  sbrk(8192);
     1ed8:	6509                	lui	a0,0x2
     1eda:	435020ef          	jal	4b0e <sbrk>
-  uint64 top = (uint64) sbrk(0);
     1ede:	4501                	li	a0,0
     1ee0:	42f020ef          	jal	4b0e <sbrk>
-  if((top % PGSIZE) != 0){
     1ee4:	03451793          	slli	a5,a0,0x34
     1ee8:	e7bd                	bnez	a5,1f56 <copyinstr3+0x88>
-  top = (uint64) sbrk(0);
     1eea:	4501                	li	a0,0
     1eec:	423020ef          	jal	4b0e <sbrk>
-  if(top % PGSIZE){
     1ef0:	03451793          	slli	a5,a0,0x34
     1ef4:	ebad                	bnez	a5,1f66 <copyinstr3+0x98>
-  char *b = (char *) (top - 1);
     1ef6:	fff50493          	addi	s1,a0,-1 # 1fff <rwsbrk+0x2d>
-  *b = 'x';
     1efa:	07800793          	li	a5,120
     1efe:	fef50fa3          	sb	a5,-1(a0)
-  int ret = unlink(b);
     1f02:	8526                	mv	a0,s1
     1f04:	3d3020ef          	jal	4ad6 <unlink>
-  if(ret != -1){
     1f08:	57fd                	li	a5,-1
     1f0a:	06f51763          	bne	a0,a5,1f78 <copyinstr3+0xaa>
-  int fd = open(b, O_CREATE | O_WRONLY);
     1f0e:	20100593          	li	a1,513
     1f12:	8526                	mv	a0,s1
     1f14:	3b3020ef          	jal	4ac6 <open>
-  if(fd != -1){
     1f18:	57fd                	li	a5,-1
     1f1a:	06f51a63          	bne	a0,a5,1f8e <copyinstr3+0xc0>
-  ret = link(b, b);
     1f1e:	85a6                	mv	a1,s1
     1f20:	8526                	mv	a0,s1
     1f22:	3c5020ef          	jal	4ae6 <link>
-  if(ret != -1){
     1f26:	57fd                	li	a5,-1
     1f28:	06f51e63          	bne	a0,a5,1fa4 <copyinstr3+0xd6>
-  char *args[] = { "xx", 0 };
     1f2c:	00005797          	auipc	a5,0x5
     1f30:	a5c78793          	addi	a5,a5,-1444 # 6988 <malloc+0x1a1e>
     1f34:	fcf43823          	sd	a5,-48(s0)
     1f38:	fc043c23          	sd	zero,-40(s0)
-  ret = exec(b, args);
     1f3c:	fd040593          	addi	a1,s0,-48
     1f40:	8526                	mv	a0,s1
     1f42:	37d020ef          	jal	4abe <exec>
-  if(ret != -1){
     1f46:	57fd                	li	a5,-1
     1f48:	06f51a63          	bne	a0,a5,1fbc <copyinstr3+0xee>
-}
     1f4c:	70a2                	ld	ra,40(sp)
     1f4e:	7402                	ld	s0,32(sp)
     1f50:	64e2                	ld	s1,24(sp)
     1f52:	6145                	addi	sp,sp,48
     1f54:	8082                	ret
-    sbrk(PGSIZE - (top % PGSIZE));
     1f56:	0347d513          	srli	a0,a5,0x34
     1f5a:	6785                	lui	a5,0x1
     1f5c:	40a7853b          	subw	a0,a5,a0
     1f60:	3af020ef          	jal	4b0e <sbrk>
     1f64:	b759                	j	1eea <copyinstr3+0x1c>
-    printf("oops\n");
     1f66:	00004517          	auipc	a0,0x4
     1f6a:	d3a50513          	addi	a0,a0,-710 # 5ca0 <malloc+0xd36>
     1f6e:	749020ef          	jal	4eb6 <printf>
-    exit(1);
     1f72:	4505                	li	a0,1
     1f74:	313020ef          	jal	4a86 <exit>
-    printf("unlink(%s) returned %d, not -1\n", b, ret);
     1f78:	862a                	mv	a2,a0
     1f7a:	85a6                	mv	a1,s1
     1f7c:	00004517          	auipc	a0,0x4
     1f80:	8dc50513          	addi	a0,a0,-1828 # 5858 <malloc+0x8ee>
     1f84:	733020ef          	jal	4eb6 <printf>
-    exit(1);
     1f88:	4505                	li	a0,1
     1f8a:	2fd020ef          	jal	4a86 <exit>
-    printf("open(%s) returned %d, not -1\n", b, fd);
     1f8e:	862a                	mv	a2,a0
     1f90:	85a6                	mv	a1,s1
     1f92:	00004517          	auipc	a0,0x4
     1f96:	8e650513          	addi	a0,a0,-1818 # 5878 <malloc+0x90e>
     1f9a:	71d020ef          	jal	4eb6 <printf>
-    exit(1);
     1f9e:	4505                	li	a0,1
     1fa0:	2e7020ef          	jal	4a86 <exit>
-    printf("link(%s, %s) returned %d, not -1\n", b, b, ret);
     1fa4:	86aa                	mv	a3,a0
     1fa6:	8626                	mv	a2,s1
     1fa8:	85a6                	mv	a1,s1
     1faa:	00004517          	auipc	a0,0x4
     1fae:	8ee50513          	addi	a0,a0,-1810 # 5898 <malloc+0x92e>
     1fb2:	705020ef          	jal	4eb6 <printf>
-    exit(1);
     1fb6:	4505                	li	a0,1
     1fb8:	2cf020ef          	jal	4a86 <exit>
-    printf("exec(%s) returned %d, not -1\n", b, fd);
     1fbc:	567d                	li	a2,-1
     1fbe:	85a6                	mv	a1,s1
     1fc0:	00004517          	auipc	a0,0x4
     1fc4:	90050513          	addi	a0,a0,-1792 # 58c0 <malloc+0x956>
     1fc8:	6ef020ef          	jal	4eb6 <printf>
-    exit(1);
     1fcc:	4505                	li	a0,1
     1fce:	2b9020ef          	jal	4a86 <exit>
 
 0000000000001fd2 <rwsbrk>:
-{
     1fd2:	1101                	addi	sp,sp,-32
     1fd4:	ec06                	sd	ra,24(sp)
     1fd6:	e822                	sd	s0,16(sp)
     1fd8:	1000                	addi	s0,sp,32
-  uint64 a = (uint64) sbrk(8192);
     1fda:	6509                	lui	a0,0x2
     1fdc:	333020ef          	jal	4b0e <sbrk>
-  if(a == 0xffffffffffffffffLL) {
     1fe0:	57fd                	li	a5,-1
     1fe2:	04f50a63          	beq	a0,a5,2036 <rwsbrk+0x64>
     1fe6:	e426                	sd	s1,8(sp)
     1fe8:	84aa                	mv	s1,a0
-  if ((uint64) sbrk(-8192) ==  0xffffffffffffffffLL) {
     1fea:	7579                	lui	a0,0xffffe
     1fec:	323020ef          	jal	4b0e <sbrk>
     1ff0:	57fd                	li	a5,-1
     1ff2:	04f50d63          	beq	a0,a5,204c <rwsbrk+0x7a>
     1ff6:	e04a                	sd	s2,0(sp)
-  fd = open("rwsbrk", O_CREATE|O_WRONLY);
     1ff8:	20100593          	li	a1,513
     1ffc:	00004517          	auipc	a0,0x4
     2000:	ce450513          	addi	a0,a0,-796 # 5ce0 <malloc+0xd76>
     2004:	2c3020ef          	jal	4ac6 <open>
     2008:	892a                	mv	s2,a0
-  if(fd < 0){
     200a:	04054b63          	bltz	a0,2060 <rwsbrk+0x8e>
-  n = write(fd, (void*)(a+4096), 1024);
     200e:	6785                	lui	a5,0x1
     2010:	94be                	add	s1,s1,a5
     2012:	40000613          	li	a2,1024
     2016:	85a6                	mv	a1,s1
     2018:	28f020ef          	jal	4aa6 <write>
     201c:	862a                	mv	a2,a0
-  if(n >= 0){
     201e:	04054a63          	bltz	a0,2072 <rwsbrk+0xa0>
-    printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+4096, n);
     2022:	85a6                	mv	a1,s1
     2024:	00004517          	auipc	a0,0x4
     2028:	cdc50513          	addi	a0,a0,-804 # 5d00 <malloc+0xd96>
     202c:	68b020ef          	jal	4eb6 <printf>
-    exit(1);
     2030:	4505                	li	a0,1
     2032:	255020ef          	jal	4a86 <exit>
     2036:	e426                	sd	s1,8(sp)
     2038:	e04a                	sd	s2,0(sp)
-    printf("sbrk(rwsbrk) failed\n");
     203a:	00004517          	auipc	a0,0x4
     203e:	c6e50513          	addi	a0,a0,-914 # 5ca8 <malloc+0xd3e>
     2042:	675020ef          	jal	4eb6 <printf>
-    exit(1);
     2046:	4505                	li	a0,1
     2048:	23f020ef          	jal	4a86 <exit>
     204c:	e04a                	sd	s2,0(sp)
-    printf("sbrk(rwsbrk) shrink failed\n");
     204e:	00004517          	auipc	a0,0x4
     2052:	c7250513          	addi	a0,a0,-910 # 5cc0 <malloc+0xd56>
     2056:	661020ef          	jal	4eb6 <printf>
-    exit(1);
     205a:	4505                	li	a0,1
     205c:	22b020ef          	jal	4a86 <exit>
-    printf("open(rwsbrk) failed\n");
     2060:	00004517          	auipc	a0,0x4
     2064:	c8850513          	addi	a0,a0,-888 # 5ce8 <malloc+0xd7e>
     2068:	64f020ef          	jal	4eb6 <printf>
-    exit(1);
     206c:	4505                	li	a0,1
     206e:	219020ef          	jal	4a86 <exit>
-  close(fd);
     2072:	854a                	mv	a0,s2
     2074:	23b020ef          	jal	4aae <close>
-  unlink("rwsbrk");
     2078:	00004517          	auipc	a0,0x4
     207c:	c6850513          	addi	a0,a0,-920 # 5ce0 <malloc+0xd76>
     2080:	257020ef          	jal	4ad6 <unlink>
-  fd = open("README", O_RDONLY);
     2084:	4581                	li	a1,0
     2086:	00003517          	auipc	a0,0x3
     208a:	1fa50513          	addi	a0,a0,506 # 5280 <malloc+0x316>
     208e:	239020ef          	jal	4ac6 <open>
     2092:	892a                	mv	s2,a0
-  if(fd < 0){
     2094:	02054363          	bltz	a0,20ba <rwsbrk+0xe8>
-  n = read(fd, (void*)(a+4096), 10);
     2098:	4629                	li	a2,10
     209a:	85a6                	mv	a1,s1
     209c:	203020ef          	jal	4a9e <read>
     20a0:	862a                	mv	a2,a0
-  if(n >= 0){
     20a2:	02054563          	bltz	a0,20cc <rwsbrk+0xfa>
-    printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+4096, n);
     20a6:	85a6                	mv	a1,s1
     20a8:	00004517          	auipc	a0,0x4
     20ac:	c8850513          	addi	a0,a0,-888 # 5d30 <malloc+0xdc6>
     20b0:	607020ef          	jal	4eb6 <printf>
-    exit(1);
     20b4:	4505                	li	a0,1
     20b6:	1d1020ef          	jal	4a86 <exit>
-    printf("open(rwsbrk) failed\n");
     20ba:	00004517          	auipc	a0,0x4
     20be:	c2e50513          	addi	a0,a0,-978 # 5ce8 <malloc+0xd7e>
     20c2:	5f5020ef          	jal	4eb6 <printf>
-    exit(1);
     20c6:	4505                	li	a0,1
     20c8:	1bf020ef          	jal	4a86 <exit>
-  close(fd);
     20cc:	854a                	mv	a0,s2
     20ce:	1e1020ef          	jal	4aae <close>
-  exit(0);
     20d2:	4501                	li	a0,0
     20d4:	1b3020ef          	jal	4a86 <exit>
 
 00000000000020d8 <sbrkbasic>:
-{
     20d8:	7139                	addi	sp,sp,-64
     20da:	fc06                	sd	ra,56(sp)
     20dc:	f822                	sd	s0,48(sp)
     20de:	ec4e                	sd	s3,24(sp)
     20e0:	0080                	addi	s0,sp,64
     20e2:	89aa                	mv	s3,a0
-  pid = fork();
     20e4:	19b020ef          	jal	4a7e <fork>
-  if(pid < 0){
     20e8:	02054b63          	bltz	a0,211e <sbrkbasic+0x46>
-  if(pid == 0){
     20ec:	e939                	bnez	a0,2142 <sbrkbasic+0x6a>
-    a = sbrk(TOOMUCH);
     20ee:	40000537          	lui	a0,0x40000
     20f2:	21d020ef          	jal	4b0e <sbrk>
-    if(a == (char*)0xffffffffffffffffL){
     20f6:	57fd                	li	a5,-1
     20f8:	02f50f63          	beq	a0,a5,2136 <sbrkbasic+0x5e>
     20fc:	f426                	sd	s1,40(sp)
     20fe:	f04a                	sd	s2,32(sp)
     2100:	e852                	sd	s4,16(sp)
-    for(b = a; b < a+TOOMUCH; b += 4096){
     2102:	400007b7          	lui	a5,0x40000
     2106:	97aa                	add	a5,a5,a0
-      *b = 99;
     2108:	06300693          	li	a3,99
-    for(b = a; b < a+TOOMUCH; b += 4096){
     210c:	6705                	lui	a4,0x1
-      *b = 99;
     210e:	00d50023          	sb	a3,0(a0) # 40000000 <base+0x3fff0388>
-    for(b = a; b < a+TOOMUCH; b += 4096){
     2112:	953a                	add	a0,a0,a4
     2114:	fef51de3          	bne	a0,a5,210e <sbrkbasic+0x36>
-    exit(1);
     2118:	4505                	li	a0,1
     211a:	16d020ef          	jal	4a86 <exit>
     211e:	f426                	sd	s1,40(sp)
     2120:	f04a                	sd	s2,32(sp)
     2122:	e852                	sd	s4,16(sp)
-    printf("fork failed in sbrkbasic\n");
     2124:	00004517          	auipc	a0,0x4
     2128:	c3450513          	addi	a0,a0,-972 # 5d58 <malloc+0xdee>
     212c:	58b020ef          	jal	4eb6 <printf>
-    exit(1);
     2130:	4505                	li	a0,1
     2132:	155020ef          	jal	4a86 <exit>
     2136:	f426                	sd	s1,40(sp)
     2138:	f04a                	sd	s2,32(sp)
     213a:	e852                	sd	s4,16(sp)
-      exit(0);
     213c:	4501                	li	a0,0
     213e:	149020ef          	jal	4a86 <exit>
-  wait(&xstatus);
     2142:	fcc40513          	addi	a0,s0,-52
     2146:	149020ef          	jal	4a8e <wait>
-  if(xstatus == 1){
     214a:	fcc42703          	lw	a4,-52(s0)
     214e:	4785                	li	a5,1
     2150:	00f70e63          	beq	a4,a5,216c <sbrkbasic+0x94>
     2154:	f426                	sd	s1,40(sp)
     2156:	f04a                	sd	s2,32(sp)
     2158:	e852                	sd	s4,16(sp)
-  a = sbrk(0);
     215a:	4501                	li	a0,0
     215c:	1b3020ef          	jal	4b0e <sbrk>
     2160:	84aa                	mv	s1,a0
-  for(i = 0; i < 5000; i++){
     2162:	4901                	li	s2,0
     2164:	6a05                	lui	s4,0x1
     2166:	388a0a13          	addi	s4,s4,904 # 1388 <exectest+0x46>
@@ -3823,51 +2862,36 @@ r_sp()
     216c:	f426                	sd	s1,40(sp)
     216e:	f04a                	sd	s2,32(sp)
     2170:	e852                	sd	s4,16(sp)
-    printf("%s: too much memory allocated!\n", s);
     2172:	85ce                	mv	a1,s3
     2174:	00004517          	auipc	a0,0x4
     2178:	c0450513          	addi	a0,a0,-1020 # 5d78 <malloc+0xe0e>
     217c:	53b020ef          	jal	4eb6 <printf>
-    exit(1);
     2180:	4505                	li	a0,1
     2182:	105020ef          	jal	4a86 <exit>
     2186:	84be                	mv	s1,a5
-    b = sbrk(1);
     2188:	4505                	li	a0,1
     218a:	185020ef          	jal	4b0e <sbrk>
-    if(b != a){
     218e:	04951263          	bne	a0,s1,21d2 <sbrkbasic+0xfa>
-    *b = 1;
     2192:	4785                	li	a5,1
     2194:	00f48023          	sb	a5,0(s1)
-    a = b + 1;
     2198:	00148793          	addi	a5,s1,1
-  for(i = 0; i < 5000; i++){
     219c:	2905                	addiw	s2,s2,1
     219e:	ff4914e3          	bne	s2,s4,2186 <sbrkbasic+0xae>
-  pid = fork();
     21a2:	0dd020ef          	jal	4a7e <fork>
     21a6:	892a                	mv	s2,a0
-  if(pid < 0){
     21a8:	04054263          	bltz	a0,21ec <sbrkbasic+0x114>
-  c = sbrk(1);
     21ac:	4505                	li	a0,1
     21ae:	161020ef          	jal	4b0e <sbrk>
-  c = sbrk(1);
     21b2:	4505                	li	a0,1
     21b4:	15b020ef          	jal	4b0e <sbrk>
-  if(c != a + 1){
     21b8:	0489                	addi	s1,s1,2
     21ba:	04a48363          	beq	s1,a0,2200 <sbrkbasic+0x128>
-    printf("%s: sbrk test failed post-fork\n", s);
     21be:	85ce                	mv	a1,s3
     21c0:	00004517          	auipc	a0,0x4
     21c4:	c1850513          	addi	a0,a0,-1000 # 5dd8 <malloc+0xe6e>
     21c8:	4ef020ef          	jal	4eb6 <printf>
-    exit(1);
     21cc:	4505                	li	a0,1
     21ce:	0b9020ef          	jal	4a86 <exit>
-      printf("%s: sbrk test failed %d %p %p\n", s, i, a, b);
     21d2:	872a                	mv	a4,a0
     21d4:	86a6                	mv	a3,s1
     21d6:	864a                	mv	a2,s2
@@ -3875,31 +2899,23 @@ r_sp()
     21da:	00004517          	auipc	a0,0x4
     21de:	bbe50513          	addi	a0,a0,-1090 # 5d98 <malloc+0xe2e>
     21e2:	4d5020ef          	jal	4eb6 <printf>
-      exit(1);
     21e6:	4505                	li	a0,1
     21e8:	09f020ef          	jal	4a86 <exit>
-    printf("%s: sbrk test fork failed\n", s);
     21ec:	85ce                	mv	a1,s3
     21ee:	00004517          	auipc	a0,0x4
     21f2:	bca50513          	addi	a0,a0,-1078 # 5db8 <malloc+0xe4e>
     21f6:	4c1020ef          	jal	4eb6 <printf>
-    exit(1);
     21fa:	4505                	li	a0,1
     21fc:	08b020ef          	jal	4a86 <exit>
-  if(pid == 0)
     2200:	00091563          	bnez	s2,220a <sbrkbasic+0x132>
-    exit(0);
     2204:	4501                	li	a0,0
     2206:	081020ef          	jal	4a86 <exit>
-  wait(&xstatus);
     220a:	fcc40513          	addi	a0,s0,-52
     220e:	081020ef          	jal	4a8e <wait>
-  exit(xstatus);
     2212:	fcc42503          	lw	a0,-52(s0)
     2216:	071020ef          	jal	4a86 <exit>
 
 000000000000221a <sbrkmuch>:
-{
     221a:	7179                	addi	sp,sp,-48
     221c:	f406                	sd	ra,40(sp)
     221e:	f022                	sd	s0,32(sp)
@@ -3909,88 +2925,64 @@ r_sp()
     2226:	e052                	sd	s4,0(sp)
     2228:	1800                	addi	s0,sp,48
     222a:	89aa                	mv	s3,a0
-  oldbrk = sbrk(0);
     222c:	4501                	li	a0,0
     222e:	0e1020ef          	jal	4b0e <sbrk>
     2232:	892a                	mv	s2,a0
-  a = sbrk(0);
     2234:	4501                	li	a0,0
     2236:	0d9020ef          	jal	4b0e <sbrk>
     223a:	84aa                	mv	s1,a0
-  p = sbrk(amt);
     223c:	06400537          	lui	a0,0x6400
     2240:	9d05                	subw	a0,a0,s1
     2242:	0cd020ef          	jal	4b0e <sbrk>
-  if (p != a) {
     2246:	0aa49463          	bne	s1,a0,22ee <sbrkmuch+0xd4>
-  char *eee = sbrk(0);
     224a:	4501                	li	a0,0
     224c:	0c3020ef          	jal	4b0e <sbrk>
     2250:	87aa                	mv	a5,a0
-  for(char *pp = a; pp < eee; pp += 4096)
     2252:	00a4f963          	bgeu	s1,a0,2264 <sbrkmuch+0x4a>
-    *pp = 1;
     2256:	4685                	li	a3,1
-  for(char *pp = a; pp < eee; pp += 4096)
     2258:	6705                	lui	a4,0x1
-    *pp = 1;
     225a:	00d48023          	sb	a3,0(s1)
-  for(char *pp = a; pp < eee; pp += 4096)
     225e:	94ba                	add	s1,s1,a4
     2260:	fef4ede3          	bltu	s1,a5,225a <sbrkmuch+0x40>
-  *lastaddr = 99;
     2264:	064007b7          	lui	a5,0x6400
     2268:	06300713          	li	a4,99
     226c:	fee78fa3          	sb	a4,-1(a5) # 63fffff <base+0x63f0387>
-  a = sbrk(0);
     2270:	4501                	li	a0,0
     2272:	09d020ef          	jal	4b0e <sbrk>
     2276:	84aa                	mv	s1,a0
-  c = sbrk(-PGSIZE);
     2278:	757d                	lui	a0,0xfffff
     227a:	095020ef          	jal	4b0e <sbrk>
-  if(c == (char*)0xffffffffffffffffL){
     227e:	57fd                	li	a5,-1
     2280:	08f50163          	beq	a0,a5,2302 <sbrkmuch+0xe8>
-  c = sbrk(0);
     2284:	4501                	li	a0,0
     2286:	089020ef          	jal	4b0e <sbrk>
-  if(c != a - PGSIZE){
     228a:	77fd                	lui	a5,0xfffff
     228c:	97a6                	add	a5,a5,s1
     228e:	08f51463          	bne	a0,a5,2316 <sbrkmuch+0xfc>
-  a = sbrk(0);
     2292:	4501                	li	a0,0
     2294:	07b020ef          	jal	4b0e <sbrk>
     2298:	84aa                	mv	s1,a0
-  c = sbrk(PGSIZE);
     229a:	6505                	lui	a0,0x1
     229c:	073020ef          	jal	4b0e <sbrk>
     22a0:	8a2a                	mv	s4,a0
-  if(c != a || sbrk(0) != a + PGSIZE){
     22a2:	08a49663          	bne	s1,a0,232e <sbrkmuch+0x114>
     22a6:	4501                	li	a0,0
     22a8:	067020ef          	jal	4b0e <sbrk>
     22ac:	6785                	lui	a5,0x1
     22ae:	97a6                	add	a5,a5,s1
     22b0:	06f51f63          	bne	a0,a5,232e <sbrkmuch+0x114>
-  if(*lastaddr == 99){
     22b4:	064007b7          	lui	a5,0x6400
     22b8:	fff7c703          	lbu	a4,-1(a5) # 63fffff <base+0x63f0387>
     22bc:	06300793          	li	a5,99
     22c0:	08f70363          	beq	a4,a5,2346 <sbrkmuch+0x12c>
-  a = sbrk(0);
     22c4:	4501                	li	a0,0
     22c6:	049020ef          	jal	4b0e <sbrk>
     22ca:	84aa                	mv	s1,a0
-  c = sbrk(-(sbrk(0) - oldbrk));
     22cc:	4501                	li	a0,0
     22ce:	041020ef          	jal	4b0e <sbrk>
     22d2:	40a9053b          	subw	a0,s2,a0
     22d6:	039020ef          	jal	4b0e <sbrk>
-  if(c != a){
     22da:	08a49063          	bne	s1,a0,235a <sbrkmuch+0x140>
-}
     22de:	70a2                	ld	ra,40(sp)
     22e0:	7402                	ld	s0,32(sp)
     22e2:	64e2                	ld	s1,24(sp)
@@ -3999,63 +2991,50 @@ r_sp()
     22e8:	6a02                	ld	s4,0(sp)
     22ea:	6145                	addi	sp,sp,48
     22ec:	8082                	ret
-    printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s);
     22ee:	85ce                	mv	a1,s3
     22f0:	00004517          	auipc	a0,0x4
     22f4:	b0850513          	addi	a0,a0,-1272 # 5df8 <malloc+0xe8e>
     22f8:	3bf020ef          	jal	4eb6 <printf>
-    exit(1);
     22fc:	4505                	li	a0,1
     22fe:	788020ef          	jal	4a86 <exit>
-    printf("%s: sbrk could not deallocate\n", s);
     2302:	85ce                	mv	a1,s3
     2304:	00004517          	auipc	a0,0x4
     2308:	b3c50513          	addi	a0,a0,-1220 # 5e40 <malloc+0xed6>
     230c:	3ab020ef          	jal	4eb6 <printf>
-    exit(1);
     2310:	4505                	li	a0,1
     2312:	774020ef          	jal	4a86 <exit>
-    printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c);
     2316:	86aa                	mv	a3,a0
     2318:	8626                	mv	a2,s1
     231a:	85ce                	mv	a1,s3
     231c:	00004517          	auipc	a0,0x4
     2320:	b4450513          	addi	a0,a0,-1212 # 5e60 <malloc+0xef6>
     2324:	393020ef          	jal	4eb6 <printf>
-    exit(1);
     2328:	4505                	li	a0,1
     232a:	75c020ef          	jal	4a86 <exit>
-    printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c);
     232e:	86d2                	mv	a3,s4
     2330:	8626                	mv	a2,s1
     2332:	85ce                	mv	a1,s3
     2334:	00004517          	auipc	a0,0x4
     2338:	b6c50513          	addi	a0,a0,-1172 # 5ea0 <malloc+0xf36>
     233c:	37b020ef          	jal	4eb6 <printf>
-    exit(1);
     2340:	4505                	li	a0,1
     2342:	744020ef          	jal	4a86 <exit>
-    printf("%s: sbrk de-allocation didn't really deallocate\n", s);
     2346:	85ce                	mv	a1,s3
     2348:	00004517          	auipc	a0,0x4
     234c:	b8850513          	addi	a0,a0,-1144 # 5ed0 <malloc+0xf66>
     2350:	367020ef          	jal	4eb6 <printf>
-    exit(1);
     2354:	4505                	li	a0,1
     2356:	730020ef          	jal	4a86 <exit>
-    printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c);
     235a:	86aa                	mv	a3,a0
     235c:	8626                	mv	a2,s1
     235e:	85ce                	mv	a1,s3
     2360:	00004517          	auipc	a0,0x4
     2364:	ba850513          	addi	a0,a0,-1112 # 5f08 <malloc+0xf9e>
     2368:	34f020ef          	jal	4eb6 <printf>
-    exit(1);
     236c:	4505                	li	a0,1
     236e:	718020ef          	jal	4a86 <exit>
 
 0000000000002372 <sbrkarg>:
-{
     2372:	7179                	addi	sp,sp,-48
     2374:	f406                	sd	ra,40(sp)
     2376:	f022                	sd	s0,32(sp)
@@ -4064,38 +3043,29 @@ r_sp()
     237c:	e44e                	sd	s3,8(sp)
     237e:	1800                	addi	s0,sp,48
     2380:	89aa                	mv	s3,a0
-  a = sbrk(PGSIZE);
     2382:	6505                	lui	a0,0x1
     2384:	78a020ef          	jal	4b0e <sbrk>
     2388:	892a                	mv	s2,a0
-  fd = open("sbrk", O_CREATE|O_WRONLY);
     238a:	20100593          	li	a1,513
     238e:	00004517          	auipc	a0,0x4
     2392:	ba250513          	addi	a0,a0,-1118 # 5f30 <malloc+0xfc6>
     2396:	730020ef          	jal	4ac6 <open>
     239a:	84aa                	mv	s1,a0
-  unlink("sbrk");
     239c:	00004517          	auipc	a0,0x4
     23a0:	b9450513          	addi	a0,a0,-1132 # 5f30 <malloc+0xfc6>
     23a4:	732020ef          	jal	4ad6 <unlink>
-  if(fd < 0)  {
     23a8:	0204c963          	bltz	s1,23da <sbrkarg+0x68>
-  if ((n = write(fd, a, PGSIZE)) < 0) {
     23ac:	6605                	lui	a2,0x1
     23ae:	85ca                	mv	a1,s2
     23b0:	8526                	mv	a0,s1
     23b2:	6f4020ef          	jal	4aa6 <write>
     23b6:	02054c63          	bltz	a0,23ee <sbrkarg+0x7c>
-  close(fd);
     23ba:	8526                	mv	a0,s1
     23bc:	6f2020ef          	jal	4aae <close>
-  a = sbrk(PGSIZE);
     23c0:	6505                	lui	a0,0x1
     23c2:	74c020ef          	jal	4b0e <sbrk>
-  if(pipe((int *) a) != 0){
     23c6:	6d0020ef          	jal	4a96 <pipe>
     23ca:	ed05                	bnez	a0,2402 <sbrkarg+0x90>
-}
     23cc:	70a2                	ld	ra,40(sp)
     23ce:	7402                	ld	s0,32(sp)
     23d0:	64e2                	ld	s1,24(sp)
@@ -4103,33 +3073,26 @@ r_sp()
     23d4:	69a2                	ld	s3,8(sp)
     23d6:	6145                	addi	sp,sp,48
     23d8:	8082                	ret
-    printf("%s: open sbrk failed\n", s);
     23da:	85ce                	mv	a1,s3
     23dc:	00004517          	auipc	a0,0x4
     23e0:	b5c50513          	addi	a0,a0,-1188 # 5f38 <malloc+0xfce>
     23e4:	2d3020ef          	jal	4eb6 <printf>
-    exit(1);
     23e8:	4505                	li	a0,1
     23ea:	69c020ef          	jal	4a86 <exit>
-    printf("%s: write sbrk failed\n", s);
     23ee:	85ce                	mv	a1,s3
     23f0:	00004517          	auipc	a0,0x4
     23f4:	b6050513          	addi	a0,a0,-1184 # 5f50 <malloc+0xfe6>
     23f8:	2bf020ef          	jal	4eb6 <printf>
-    exit(1);
     23fc:	4505                	li	a0,1
     23fe:	688020ef          	jal	4a86 <exit>
-    printf("%s: pipe() failed\n", s);
     2402:	85ce                	mv	a1,s3
     2404:	00003517          	auipc	a0,0x3
     2408:	63c50513          	addi	a0,a0,1596 # 5a40 <malloc+0xad6>
     240c:	2ab020ef          	jal	4eb6 <printf>
-    exit(1);
     2410:	4505                	li	a0,1
     2412:	674020ef          	jal	4a86 <exit>
 
 0000000000002416 <argptest>:
-{
     2416:	1101                	addi	sp,sp,-32
     2418:	ec06                	sd	ra,24(sp)
     241a:	e822                	sd	s0,16(sp)
@@ -4137,130 +3100,93 @@ r_sp()
     241e:	e04a                	sd	s2,0(sp)
     2420:	1000                	addi	s0,sp,32
     2422:	892a                	mv	s2,a0
-  fd = open("init", O_RDONLY);
     2424:	4581                	li	a1,0
     2426:	00004517          	auipc	a0,0x4
     242a:	b4250513          	addi	a0,a0,-1214 # 5f68 <malloc+0xffe>
     242e:	698020ef          	jal	4ac6 <open>
-  if (fd < 0) {
     2432:	02054563          	bltz	a0,245c <argptest+0x46>
     2436:	84aa                	mv	s1,a0
-  read(fd, sbrk(0) - 1, -1);
     2438:	4501                	li	a0,0
     243a:	6d4020ef          	jal	4b0e <sbrk>
     243e:	567d                	li	a2,-1
     2440:	fff50593          	addi	a1,a0,-1
     2444:	8526                	mv	a0,s1
     2446:	658020ef          	jal	4a9e <read>
-  close(fd);
     244a:	8526                	mv	a0,s1
     244c:	662020ef          	jal	4aae <close>
-}
     2450:	60e2                	ld	ra,24(sp)
     2452:	6442                	ld	s0,16(sp)
     2454:	64a2                	ld	s1,8(sp)
     2456:	6902                	ld	s2,0(sp)
     2458:	6105                	addi	sp,sp,32
     245a:	8082                	ret
-    printf("%s: open failed\n", s);
     245c:	85ca                	mv	a1,s2
     245e:	00003517          	auipc	a0,0x3
     2462:	4f250513          	addi	a0,a0,1266 # 5950 <malloc+0x9e6>
     2466:	251020ef          	jal	4eb6 <printf>
-    exit(1);
     246a:	4505                	li	a0,1
     246c:	61a020ef          	jal	4a86 <exit>
 
 0000000000002470 <sbrkbugs>:
-{
     2470:	1141                	addi	sp,sp,-16
     2472:	e406                	sd	ra,8(sp)
     2474:	e022                	sd	s0,0(sp)
     2476:	0800                	addi	s0,sp,16
-  int pid = fork();
     2478:	606020ef          	jal	4a7e <fork>
-  if(pid < 0){
     247c:	00054c63          	bltz	a0,2494 <sbrkbugs+0x24>
-  if(pid == 0){
     2480:	e11d                	bnez	a0,24a6 <sbrkbugs+0x36>
-    int sz = (uint64) sbrk(0);
     2482:	68c020ef          	jal	4b0e <sbrk>
-    sbrk(-sz);
     2486:	40a0053b          	negw	a0,a0
     248a:	684020ef          	jal	4b0e <sbrk>
-    exit(0);
     248e:	4501                	li	a0,0
     2490:	5f6020ef          	jal	4a86 <exit>
-    printf("fork failed\n");
     2494:	00005517          	auipc	a0,0x5
     2498:	a1450513          	addi	a0,a0,-1516 # 6ea8 <malloc+0x1f3e>
     249c:	21b020ef          	jal	4eb6 <printf>
-    exit(1);
     24a0:	4505                	li	a0,1
     24a2:	5e4020ef          	jal	4a86 <exit>
-  wait(0);
     24a6:	4501                	li	a0,0
     24a8:	5e6020ef          	jal	4a8e <wait>
-  pid = fork();
     24ac:	5d2020ef          	jal	4a7e <fork>
-  if(pid < 0){
     24b0:	00054f63          	bltz	a0,24ce <sbrkbugs+0x5e>
-  if(pid == 0){
     24b4:	e515                	bnez	a0,24e0 <sbrkbugs+0x70>
-    int sz = (uint64) sbrk(0);
     24b6:	658020ef          	jal	4b0e <sbrk>
-    sbrk(-(sz - 3500));
     24ba:	6785                	lui	a5,0x1
     24bc:	dac7879b          	addiw	a5,a5,-596 # dac <linktest+0x134>
     24c0:	40a7853b          	subw	a0,a5,a0
     24c4:	64a020ef          	jal	4b0e <sbrk>
-    exit(0);
     24c8:	4501                	li	a0,0
     24ca:	5bc020ef          	jal	4a86 <exit>
-    printf("fork failed\n");
     24ce:	00005517          	auipc	a0,0x5
     24d2:	9da50513          	addi	a0,a0,-1574 # 6ea8 <malloc+0x1f3e>
     24d6:	1e1020ef          	jal	4eb6 <printf>
-    exit(1);
     24da:	4505                	li	a0,1
     24dc:	5aa020ef          	jal	4a86 <exit>
-  wait(0);
     24e0:	4501                	li	a0,0
     24e2:	5ac020ef          	jal	4a8e <wait>
-  pid = fork();
     24e6:	598020ef          	jal	4a7e <fork>
-  if(pid < 0){
     24ea:	02054263          	bltz	a0,250e <sbrkbugs+0x9e>
-  if(pid == 0){
     24ee:	e90d                	bnez	a0,2520 <sbrkbugs+0xb0>
-    sbrk((10*4096 + 2048) - (uint64)sbrk(0));
     24f0:	61e020ef          	jal	4b0e <sbrk>
     24f4:	67ad                	lui	a5,0xb
     24f6:	8007879b          	addiw	a5,a5,-2048 # a800 <uninit+0x298>
     24fa:	40a7853b          	subw	a0,a5,a0
     24fe:	610020ef          	jal	4b0e <sbrk>
-    sbrk(-10);
     2502:	5559                	li	a0,-10
     2504:	60a020ef          	jal	4b0e <sbrk>
-    exit(0);
     2508:	4501                	li	a0,0
     250a:	57c020ef          	jal	4a86 <exit>
-    printf("fork failed\n");
     250e:	00005517          	auipc	a0,0x5
     2512:	99a50513          	addi	a0,a0,-1638 # 6ea8 <malloc+0x1f3e>
     2516:	1a1020ef          	jal	4eb6 <printf>
-    exit(1);
     251a:	4505                	li	a0,1
     251c:	56a020ef          	jal	4a86 <exit>
-  wait(0);
     2520:	4501                	li	a0,0
     2522:	56c020ef          	jal	4a8e <wait>
-  exit(0);
     2526:	4501                	li	a0,0
     2528:	55e020ef          	jal	4a86 <exit>
 
 000000000000252c <sbrklast>:
-{
     252c:	7179                	addi	sp,sp,-48
     252e:	f406                	sd	ra,40(sp)
     2530:	f022                	sd	s0,32(sp)
@@ -4269,58 +3195,41 @@ r_sp()
     2536:	e44e                	sd	s3,8(sp)
     2538:	e052                	sd	s4,0(sp)
     253a:	1800                	addi	s0,sp,48
-  uint64 top = (uint64) sbrk(0);
     253c:	4501                	li	a0,0
     253e:	5d0020ef          	jal	4b0e <sbrk>
-  if((top % 4096) != 0)
     2542:	03451793          	slli	a5,a0,0x34
     2546:	ebad                	bnez	a5,25b8 <sbrklast+0x8c>
-  sbrk(4096);
     2548:	6505                	lui	a0,0x1
     254a:	5c4020ef          	jal	4b0e <sbrk>
-  sbrk(10);
     254e:	4529                	li	a0,10
     2550:	5be020ef          	jal	4b0e <sbrk>
-  sbrk(-20);
     2554:	5531                	li	a0,-20
     2556:	5b8020ef          	jal	4b0e <sbrk>
-  top = (uint64) sbrk(0);
     255a:	4501                	li	a0,0
     255c:	5b2020ef          	jal	4b0e <sbrk>
     2560:	84aa                	mv	s1,a0
-  char *p = (char *) (top - 64);
     2562:	fc050913          	addi	s2,a0,-64 # fc0 <bigdir+0x11e>
-  p[0] = 'x';
     2566:	07800a13          	li	s4,120
     256a:	fd450023          	sb	s4,-64(a0)
-  p[1] = '\0';
     256e:	fc0500a3          	sb	zero,-63(a0)
-  int fd = open(p, O_RDWR|O_CREATE);
     2572:	20200593          	li	a1,514
     2576:	854a                	mv	a0,s2
     2578:	54e020ef          	jal	4ac6 <open>
     257c:	89aa                	mv	s3,a0
-  write(fd, p, 1);
     257e:	4605                	li	a2,1
     2580:	85ca                	mv	a1,s2
     2582:	524020ef          	jal	4aa6 <write>
-  close(fd);
     2586:	854e                	mv	a0,s3
     2588:	526020ef          	jal	4aae <close>
-  fd = open(p, O_RDWR);
     258c:	4589                	li	a1,2
     258e:	854a                	mv	a0,s2
     2590:	536020ef          	jal	4ac6 <open>
-  p[0] = '\0';
     2594:	fc048023          	sb	zero,-64(s1)
-  read(fd, p, 1);
     2598:	4605                	li	a2,1
     259a:	85ca                	mv	a1,s2
     259c:	502020ef          	jal	4a9e <read>
-  if(p[0] != 'x')
     25a0:	fc04c783          	lbu	a5,-64(s1)
     25a4:	03479263          	bne	a5,s4,25c8 <sbrklast+0x9c>
-}
     25a8:	70a2                	ld	ra,40(sp)
     25aa:	7402                	ld	s0,32(sp)
     25ac:	64e2                	ld	s1,24(sp)
@@ -4329,42 +3238,34 @@ r_sp()
     25b2:	6a02                	ld	s4,0(sp)
     25b4:	6145                	addi	sp,sp,48
     25b6:	8082                	ret
-    sbrk(4096 - (top % 4096));
     25b8:	0347d513          	srli	a0,a5,0x34
     25bc:	6785                	lui	a5,0x1
     25be:	40a7853b          	subw	a0,a5,a0
     25c2:	54c020ef          	jal	4b0e <sbrk>
     25c6:	b749                	j	2548 <sbrklast+0x1c>
-    exit(1);
     25c8:	4505                	li	a0,1
     25ca:	4bc020ef          	jal	4a86 <exit>
 
 00000000000025ce <sbrk8000>:
-{
     25ce:	1141                	addi	sp,sp,-16
     25d0:	e406                	sd	ra,8(sp)
     25d2:	e022                	sd	s0,0(sp)
     25d4:	0800                	addi	s0,sp,16
-  sbrk(0x80000004);
     25d6:	80000537          	lui	a0,0x80000
     25da:	0511                	addi	a0,a0,4 # ffffffff80000004 <base+0xffffffff7fff038c>
     25dc:	532020ef          	jal	4b0e <sbrk>
-  volatile char *top = sbrk(0);
     25e0:	4501                	li	a0,0
     25e2:	52c020ef          	jal	4b0e <sbrk>
-  *(top-1) = *(top-1) + 1;
     25e6:	fff54783          	lbu	a5,-1(a0)
     25ea:	2785                	addiw	a5,a5,1 # 1001 <pgbug+0x29>
     25ec:	0ff7f793          	zext.b	a5,a5
     25f0:	fef50fa3          	sb	a5,-1(a0)
-}
     25f4:	60a2                	ld	ra,8(sp)
     25f6:	6402                	ld	s0,0(sp)
     25f8:	0141                	addi	sp,sp,16
     25fa:	8082                	ret
 
 00000000000025fc <execout>:
-{
     25fc:	715d                	addi	sp,sp,-80
     25fe:	e486                	sd	ra,72(sp)
     2600:	e0a2                	sd	s0,64(sp)
@@ -4373,59 +3274,39 @@ r_sp()
     2606:	f44e                	sd	s3,40(sp)
     2608:	f052                	sd	s4,32(sp)
     260a:	0880                	addi	s0,sp,80
-  for(int avail = 0; avail < 15; avail++){
     260c:	4901                	li	s2,0
     260e:	49bd                	li	s3,15
-    int pid = fork();
     2610:	46e020ef          	jal	4a7e <fork>
     2614:	84aa                	mv	s1,a0
-    if(pid < 0){
     2616:	00054c63          	bltz	a0,262e <execout+0x32>
-    } else if(pid == 0){
     261a:	c11d                	beqz	a0,2640 <execout+0x44>
-      wait((int*)0);
     261c:	4501                	li	a0,0
     261e:	470020ef          	jal	4a8e <wait>
-  for(int avail = 0; avail < 15; avail++){
     2622:	2905                	addiw	s2,s2,1
     2624:	ff3916e3          	bne	s2,s3,2610 <execout+0x14>
-  exit(0);
     2628:	4501                	li	a0,0
     262a:	45c020ef          	jal	4a86 <exit>
-      printf("fork failed\n");
     262e:	00005517          	auipc	a0,0x5
     2632:	87a50513          	addi	a0,a0,-1926 # 6ea8 <malloc+0x1f3e>
     2636:	081020ef          	jal	4eb6 <printf>
-      exit(1);
     263a:	4505                	li	a0,1
     263c:	44a020ef          	jal	4a86 <exit>
-        if(a == 0xffffffffffffffffLL)
     2640:	59fd                	li	s3,-1
-        *(char*)(a + 4096 - 1) = 1;
     2642:	4a05                	li	s4,1
-        uint64 a = (uint64) sbrk(4096);
     2644:	6505                	lui	a0,0x1
     2646:	4c8020ef          	jal	4b0e <sbrk>
-        if(a == 0xffffffffffffffffLL)
     264a:	01350763          	beq	a0,s3,2658 <execout+0x5c>
-        *(char*)(a + 4096 - 1) = 1;
     264e:	6785                	lui	a5,0x1
     2650:	97aa                	add	a5,a5,a0
     2652:	ff478fa3          	sb	s4,-1(a5) # fff <pgbug+0x27>
-      while(1){
     2656:	b7fd                	j	2644 <execout+0x48>
-      for(int i = 0; i < avail; i++)
     2658:	01205863          	blez	s2,2668 <execout+0x6c>
-        sbrk(-4096);
     265c:	757d                	lui	a0,0xfffff
     265e:	4b0020ef          	jal	4b0e <sbrk>
-      for(int i = 0; i < avail; i++)
     2662:	2485                	addiw	s1,s1,1
     2664:	ff249ce3          	bne	s1,s2,265c <execout+0x60>
-      close(1);
     2668:	4505                	li	a0,1
     266a:	444020ef          	jal	4aae <close>
-      char *args[] = { "echo", "x", 0 };
     266e:	00003517          	auipc	a0,0x3
     2672:	a3a50513          	addi	a0,a0,-1478 # 50a8 <malloc+0x13e>
     2676:	faa43c23          	sd	a0,-72(s0)
@@ -4433,140 +3314,107 @@ r_sp()
     267e:	a9e78793          	addi	a5,a5,-1378 # 5118 <malloc+0x1ae>
     2682:	fcf43023          	sd	a5,-64(s0)
     2686:	fc043423          	sd	zero,-56(s0)
-      exec("echo", args);
     268a:	fb840593          	addi	a1,s0,-72
     268e:	430020ef          	jal	4abe <exec>
-      exit(0);
     2692:	4501                	li	a0,0
     2694:	3f2020ef          	jal	4a86 <exit>
 
 0000000000002698 <fourteen>:
-{
     2698:	1101                	addi	sp,sp,-32
     269a:	ec06                	sd	ra,24(sp)
     269c:	e822                	sd	s0,16(sp)
     269e:	e426                	sd	s1,8(sp)
     26a0:	1000                	addi	s0,sp,32
     26a2:	84aa                	mv	s1,a0
-  if(mkdir("12345678901234") != 0){
     26a4:	00004517          	auipc	a0,0x4
     26a8:	a9c50513          	addi	a0,a0,-1380 # 6140 <malloc+0x11d6>
     26ac:	442020ef          	jal	4aee <mkdir>
     26b0:	e555                	bnez	a0,275c <fourteen+0xc4>
-  if(mkdir("12345678901234/123456789012345") != 0){
     26b2:	00004517          	auipc	a0,0x4
     26b6:	8e650513          	addi	a0,a0,-1818 # 5f98 <malloc+0x102e>
     26ba:	434020ef          	jal	4aee <mkdir>
     26be:	e94d                	bnez	a0,2770 <fourteen+0xd8>
-  fd = open("123456789012345/123456789012345/123456789012345", O_CREATE);
     26c0:	20000593          	li	a1,512
     26c4:	00004517          	auipc	a0,0x4
     26c8:	92c50513          	addi	a0,a0,-1748 # 5ff0 <malloc+0x1086>
     26cc:	3fa020ef          	jal	4ac6 <open>
-  if(fd < 0){
     26d0:	0a054a63          	bltz	a0,2784 <fourteen+0xec>
-  close(fd);
     26d4:	3da020ef          	jal	4aae <close>
-  fd = open("12345678901234/12345678901234/12345678901234", 0);
     26d8:	4581                	li	a1,0
     26da:	00004517          	auipc	a0,0x4
     26de:	98e50513          	addi	a0,a0,-1650 # 6068 <malloc+0x10fe>
     26e2:	3e4020ef          	jal	4ac6 <open>
-  if(fd < 0){
     26e6:	0a054963          	bltz	a0,2798 <fourteen+0x100>
-  close(fd);
     26ea:	3c4020ef          	jal	4aae <close>
-  if(mkdir("12345678901234/12345678901234") == 0){
     26ee:	00004517          	auipc	a0,0x4
     26f2:	9ea50513          	addi	a0,a0,-1558 # 60d8 <malloc+0x116e>
     26f6:	3f8020ef          	jal	4aee <mkdir>
     26fa:	c94d                	beqz	a0,27ac <fourteen+0x114>
-  if(mkdir("123456789012345/12345678901234") == 0){
     26fc:	00004517          	auipc	a0,0x4
     2700:	a3450513          	addi	a0,a0,-1484 # 6130 <malloc+0x11c6>
     2704:	3ea020ef          	jal	4aee <mkdir>
     2708:	cd45                	beqz	a0,27c0 <fourteen+0x128>
-  unlink("123456789012345/12345678901234");
     270a:	00004517          	auipc	a0,0x4
     270e:	a2650513          	addi	a0,a0,-1498 # 6130 <malloc+0x11c6>
     2712:	3c4020ef          	jal	4ad6 <unlink>
-  unlink("12345678901234/12345678901234");
     2716:	00004517          	auipc	a0,0x4
     271a:	9c250513          	addi	a0,a0,-1598 # 60d8 <malloc+0x116e>
     271e:	3b8020ef          	jal	4ad6 <unlink>
-  unlink("12345678901234/12345678901234/12345678901234");
     2722:	00004517          	auipc	a0,0x4
     2726:	94650513          	addi	a0,a0,-1722 # 6068 <malloc+0x10fe>
     272a:	3ac020ef          	jal	4ad6 <unlink>
-  unlink("123456789012345/123456789012345/123456789012345");
     272e:	00004517          	auipc	a0,0x4
     2732:	8c250513          	addi	a0,a0,-1854 # 5ff0 <malloc+0x1086>
     2736:	3a0020ef          	jal	4ad6 <unlink>
-  unlink("12345678901234/123456789012345");
     273a:	00004517          	auipc	a0,0x4
     273e:	85e50513          	addi	a0,a0,-1954 # 5f98 <malloc+0x102e>
     2742:	394020ef          	jal	4ad6 <unlink>
-  unlink("12345678901234");
     2746:	00004517          	auipc	a0,0x4
     274a:	9fa50513          	addi	a0,a0,-1542 # 6140 <malloc+0x11d6>
     274e:	388020ef          	jal	4ad6 <unlink>
-}
     2752:	60e2                	ld	ra,24(sp)
     2754:	6442                	ld	s0,16(sp)
     2756:	64a2                	ld	s1,8(sp)
     2758:	6105                	addi	sp,sp,32
     275a:	8082                	ret
-    printf("%s: mkdir 12345678901234 failed\n", s);
     275c:	85a6                	mv	a1,s1
     275e:	00004517          	auipc	a0,0x4
     2762:	81250513          	addi	a0,a0,-2030 # 5f70 <malloc+0x1006>
     2766:	750020ef          	jal	4eb6 <printf>
-    exit(1);
     276a:	4505                	li	a0,1
     276c:	31a020ef          	jal	4a86 <exit>
-    printf("%s: mkdir 12345678901234/123456789012345 failed\n", s);
     2770:	85a6                	mv	a1,s1
     2772:	00004517          	auipc	a0,0x4
     2776:	84650513          	addi	a0,a0,-1978 # 5fb8 <malloc+0x104e>
     277a:	73c020ef          	jal	4eb6 <printf>
-    exit(1);
     277e:	4505                	li	a0,1
     2780:	306020ef          	jal	4a86 <exit>
-    printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s);
     2784:	85a6                	mv	a1,s1
     2786:	00004517          	auipc	a0,0x4
     278a:	89a50513          	addi	a0,a0,-1894 # 6020 <malloc+0x10b6>
     278e:	728020ef          	jal	4eb6 <printf>
-    exit(1);
     2792:	4505                	li	a0,1
     2794:	2f2020ef          	jal	4a86 <exit>
-    printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s);
     2798:	85a6                	mv	a1,s1
     279a:	00004517          	auipc	a0,0x4
     279e:	8fe50513          	addi	a0,a0,-1794 # 6098 <malloc+0x112e>
     27a2:	714020ef          	jal	4eb6 <printf>
-    exit(1);
     27a6:	4505                	li	a0,1
     27a8:	2de020ef          	jal	4a86 <exit>
-    printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s);
     27ac:	85a6                	mv	a1,s1
     27ae:	00004517          	auipc	a0,0x4
     27b2:	94a50513          	addi	a0,a0,-1718 # 60f8 <malloc+0x118e>
     27b6:	700020ef          	jal	4eb6 <printf>
-    exit(1);
     27ba:	4505                	li	a0,1
     27bc:	2ca020ef          	jal	4a86 <exit>
-    printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s);
     27c0:	85a6                	mv	a1,s1
     27c2:	00004517          	auipc	a0,0x4
     27c6:	98e50513          	addi	a0,a0,-1650 # 6150 <malloc+0x11e6>
     27ca:	6ec020ef          	jal	4eb6 <printf>
-    exit(1);
     27ce:	4505                	li	a0,1
     27d0:	2b6020ef          	jal	4a86 <exit>
 
 00000000000027d4 <diskfull>:
-{
     27d4:	b8010113          	addi	sp,sp,-1152
     27d8:	46113c23          	sd	ra,1144(sp)
     27dc:	46813823          	sd	s0,1136(sp)
@@ -4581,140 +3429,94 @@ r_sp()
     2800:	43913423          	sd	s9,1064(sp)
     2804:	48010413          	addi	s0,sp,1152
     2808:	8caa                	mv	s9,a0
-  unlink("diskfulldir");
     280a:	00004517          	auipc	a0,0x4
     280e:	97e50513          	addi	a0,a0,-1666 # 6188 <malloc+0x121e>
     2812:	2c4020ef          	jal	4ad6 <unlink>
     2816:	03000993          	li	s3,48
-    name[0] = 'b';
     281a:	06200b93          	li	s7,98
-    name[1] = 'i';
     281e:	06900b13          	li	s6,105
-    name[2] = 'g';
     2822:	06700a93          	li	s5,103
     2826:	6a41                	lui	s4,0x10
     2828:	10ba0a13          	addi	s4,s4,267 # 1010b <base+0x493>
-  for(fi = 0; done == 0 && '0' + fi < 0177; fi++){
     282c:	07f00c13          	li	s8,127
     2830:	aab9                	j	298e <diskfull+0x1ba>
-      printf("%s: could not create file %s\n", s, name);
     2832:	b8040613          	addi	a2,s0,-1152
     2836:	85e6                	mv	a1,s9
     2838:	00004517          	auipc	a0,0x4
     283c:	96050513          	addi	a0,a0,-1696 # 6198 <malloc+0x122e>
     2840:	676020ef          	jal	4eb6 <printf>
-      break;
     2844:	a039                	j	2852 <diskfull+0x7e>
-        close(fd);
     2846:	854a                	mv	a0,s2
     2848:	266020ef          	jal	4aae <close>
-    close(fd);
     284c:	854a                	mv	a0,s2
     284e:	260020ef          	jal	4aae <close>
-  for(int i = 0; i < nzz; i++){
     2852:	4481                	li	s1,0
-    name[0] = 'z';
     2854:	07a00913          	li	s2,122
-  for(int i = 0; i < nzz; i++){
     2858:	08000993          	li	s3,128
-    name[0] = 'z';
     285c:	bb240023          	sb	s2,-1120(s0)
-    name[1] = 'z';
     2860:	bb2400a3          	sb	s2,-1119(s0)
-    name[2] = '0' + (i / 32);
     2864:	41f4d71b          	sraiw	a4,s1,0x1f
     2868:	01b7571b          	srliw	a4,a4,0x1b
     286c:	009707bb          	addw	a5,a4,s1
     2870:	4057d69b          	sraiw	a3,a5,0x5
     2874:	0306869b          	addiw	a3,a3,48
     2878:	bad40123          	sb	a3,-1118(s0)
-    name[3] = '0' + (i % 32);
     287c:	8bfd                	andi	a5,a5,31
     287e:	9f99                	subw	a5,a5,a4
     2880:	0307879b          	addiw	a5,a5,48
     2884:	baf401a3          	sb	a5,-1117(s0)
-    name[4] = '\0';
     2888:	ba040223          	sb	zero,-1116(s0)
-    unlink(name);
     288c:	ba040513          	addi	a0,s0,-1120
     2890:	246020ef          	jal	4ad6 <unlink>
-    int fd = open(name, O_CREATE|O_RDWR|O_TRUNC);
     2894:	60200593          	li	a1,1538
     2898:	ba040513          	addi	a0,s0,-1120
     289c:	22a020ef          	jal	4ac6 <open>
-    if(fd < 0)
     28a0:	00054763          	bltz	a0,28ae <diskfull+0xda>
-    close(fd);
     28a4:	20a020ef          	jal	4aae <close>
-  for(int i = 0; i < nzz; i++){
     28a8:	2485                	addiw	s1,s1,1
     28aa:	fb3499e3          	bne	s1,s3,285c <diskfull+0x88>
-  if(mkdir("diskfulldir") == 0)
     28ae:	00004517          	auipc	a0,0x4
     28b2:	8da50513          	addi	a0,a0,-1830 # 6188 <malloc+0x121e>
     28b6:	238020ef          	jal	4aee <mkdir>
     28ba:	12050063          	beqz	a0,29da <diskfull+0x206>
-  unlink("diskfulldir");
     28be:	00004517          	auipc	a0,0x4
     28c2:	8ca50513          	addi	a0,a0,-1846 # 6188 <malloc+0x121e>
     28c6:	210020ef          	jal	4ad6 <unlink>
-  for(int i = 0; i < nzz; i++){
     28ca:	4481                	li	s1,0
-    name[0] = 'z';
     28cc:	07a00913          	li	s2,122
-  for(int i = 0; i < nzz; i++){
     28d0:	08000993          	li	s3,128
-    name[0] = 'z';
     28d4:	bb240023          	sb	s2,-1120(s0)
-    name[1] = 'z';
     28d8:	bb2400a3          	sb	s2,-1119(s0)
-    name[2] = '0' + (i / 32);
     28dc:	41f4d71b          	sraiw	a4,s1,0x1f
     28e0:	01b7571b          	srliw	a4,a4,0x1b
     28e4:	009707bb          	addw	a5,a4,s1
     28e8:	4057d69b          	sraiw	a3,a5,0x5
     28ec:	0306869b          	addiw	a3,a3,48
     28f0:	bad40123          	sb	a3,-1118(s0)
-    name[3] = '0' + (i % 32);
     28f4:	8bfd                	andi	a5,a5,31
     28f6:	9f99                	subw	a5,a5,a4
     28f8:	0307879b          	addiw	a5,a5,48
     28fc:	baf401a3          	sb	a5,-1117(s0)
-    name[4] = '\0';
     2900:	ba040223          	sb	zero,-1116(s0)
-    unlink(name);
     2904:	ba040513          	addi	a0,s0,-1120
     2908:	1ce020ef          	jal	4ad6 <unlink>
-  for(int i = 0; i < nzz; i++){
     290c:	2485                	addiw	s1,s1,1
     290e:	fd3493e3          	bne	s1,s3,28d4 <diskfull+0x100>
     2912:	03000493          	li	s1,48
-    name[0] = 'b';
     2916:	06200a93          	li	s5,98
-    name[1] = 'i';
     291a:	06900a13          	li	s4,105
-    name[2] = 'g';
     291e:	06700993          	li	s3,103
-  for(int i = 0; '0' + i < 0177; i++){
     2922:	07f00913          	li	s2,127
-    name[0] = 'b';
     2926:	bb540023          	sb	s5,-1120(s0)
-    name[1] = 'i';
     292a:	bb4400a3          	sb	s4,-1119(s0)
-    name[2] = 'g';
     292e:	bb340123          	sb	s3,-1118(s0)
-    name[3] = '0' + i;
     2932:	ba9401a3          	sb	s1,-1117(s0)
-    name[4] = '\0';
     2936:	ba040223          	sb	zero,-1116(s0)
-    unlink(name);
     293a:	ba040513          	addi	a0,s0,-1120
     293e:	198020ef          	jal	4ad6 <unlink>
-  for(int i = 0; '0' + i < 0177; i++){
     2942:	2485                	addiw	s1,s1,1
     2944:	0ff4f493          	zext.b	s1,s1
     2948:	fd249fe3          	bne	s1,s2,2926 <diskfull+0x152>
-}
     294c:	47813083          	ld	ra,1144(sp)
     2950:	47013403          	ld	s0,1136(sp)
     2954:	46813483          	ld	s1,1128(sp)
@@ -4728,46 +3530,33 @@ r_sp()
     2974:	42813c83          	ld	s9,1064(sp)
     2978:	48010113          	addi	sp,sp,1152
     297c:	8082                	ret
-    close(fd);
     297e:	854a                	mv	a0,s2
     2980:	12e020ef          	jal	4aae <close>
-  for(fi = 0; done == 0 && '0' + fi < 0177; fi++){
     2984:	2985                	addiw	s3,s3,1
     2986:	0ff9f993          	zext.b	s3,s3
     298a:	ed8984e3          	beq	s3,s8,2852 <diskfull+0x7e>
-    name[0] = 'b';
     298e:	b9740023          	sb	s7,-1152(s0)
-    name[1] = 'i';
     2992:	b96400a3          	sb	s6,-1151(s0)
-    name[2] = 'g';
     2996:	b9540123          	sb	s5,-1150(s0)
-    name[3] = '0' + fi;
     299a:	b93401a3          	sb	s3,-1149(s0)
-    name[4] = '\0';
     299e:	b8040223          	sb	zero,-1148(s0)
-    unlink(name);
     29a2:	b8040513          	addi	a0,s0,-1152
     29a6:	130020ef          	jal	4ad6 <unlink>
-    int fd = open(name, O_CREATE|O_RDWR|O_TRUNC);
     29aa:	60200593          	li	a1,1538
     29ae:	b8040513          	addi	a0,s0,-1152
     29b2:	114020ef          	jal	4ac6 <open>
     29b6:	892a                	mv	s2,a0
-    if(fd < 0){
     29b8:	e6054de3          	bltz	a0,2832 <diskfull+0x5e>
     29bc:	84d2                	mv	s1,s4
-      if(write(fd, buf, BSIZE) != BSIZE){
     29be:	40000613          	li	a2,1024
     29c2:	ba040593          	addi	a1,s0,-1120
     29c6:	854a                	mv	a0,s2
     29c8:	0de020ef          	jal	4aa6 <write>
     29cc:	40000793          	li	a5,1024
     29d0:	e6f51be3          	bne	a0,a5,2846 <diskfull+0x72>
-    for(int i = 0; i < MAXFILE; i++){
     29d4:	34fd                	addiw	s1,s1,-1
     29d6:	f4e5                	bnez	s1,29be <diskfull+0x1ea>
     29d8:	b75d                	j	297e <diskfull+0x1aa>
-    printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s);
     29da:	85e6                	mv	a1,s9
     29dc:	00003517          	auipc	a0,0x3
     29e0:	7dc50513          	addi	a0,a0,2012 # 61b8 <malloc+0x124e>
@@ -4775,212 +3564,165 @@ r_sp()
     29e8:	bdd9                	j	28be <diskfull+0xea>
 
 00000000000029ea <iputtest>:
-{
     29ea:	1101                	addi	sp,sp,-32
     29ec:	ec06                	sd	ra,24(sp)
     29ee:	e822                	sd	s0,16(sp)
     29f0:	e426                	sd	s1,8(sp)
     29f2:	1000                	addi	s0,sp,32
     29f4:	84aa                	mv	s1,a0
-  if(mkdir("iputdir") < 0){
     29f6:	00003517          	auipc	a0,0x3
     29fa:	7f250513          	addi	a0,a0,2034 # 61e8 <malloc+0x127e>
     29fe:	0f0020ef          	jal	4aee <mkdir>
     2a02:	02054f63          	bltz	a0,2a40 <iputtest+0x56>
-  if(chdir("iputdir") < 0){
     2a06:	00003517          	auipc	a0,0x3
     2a0a:	7e250513          	addi	a0,a0,2018 # 61e8 <malloc+0x127e>
     2a0e:	0e8020ef          	jal	4af6 <chdir>
     2a12:	04054163          	bltz	a0,2a54 <iputtest+0x6a>
-  if(unlink("../iputdir") < 0){
     2a16:	00004517          	auipc	a0,0x4
     2a1a:	81250513          	addi	a0,a0,-2030 # 6228 <malloc+0x12be>
     2a1e:	0b8020ef          	jal	4ad6 <unlink>
     2a22:	04054363          	bltz	a0,2a68 <iputtest+0x7e>
-  if(chdir("/") < 0){
     2a26:	00004517          	auipc	a0,0x4
     2a2a:	83250513          	addi	a0,a0,-1998 # 6258 <malloc+0x12ee>
     2a2e:	0c8020ef          	jal	4af6 <chdir>
     2a32:	04054563          	bltz	a0,2a7c <iputtest+0x92>
-}
     2a36:	60e2                	ld	ra,24(sp)
     2a38:	6442                	ld	s0,16(sp)
     2a3a:	64a2                	ld	s1,8(sp)
     2a3c:	6105                	addi	sp,sp,32
     2a3e:	8082                	ret
-    printf("%s: mkdir failed\n", s);
     2a40:	85a6                	mv	a1,s1
     2a42:	00003517          	auipc	a0,0x3
     2a46:	7ae50513          	addi	a0,a0,1966 # 61f0 <malloc+0x1286>
     2a4a:	46c020ef          	jal	4eb6 <printf>
-    exit(1);
     2a4e:	4505                	li	a0,1
     2a50:	036020ef          	jal	4a86 <exit>
-    printf("%s: chdir iputdir failed\n", s);
     2a54:	85a6                	mv	a1,s1
     2a56:	00003517          	auipc	a0,0x3
     2a5a:	7b250513          	addi	a0,a0,1970 # 6208 <malloc+0x129e>
     2a5e:	458020ef          	jal	4eb6 <printf>
-    exit(1);
     2a62:	4505                	li	a0,1
     2a64:	022020ef          	jal	4a86 <exit>
-    printf("%s: unlink ../iputdir failed\n", s);
     2a68:	85a6                	mv	a1,s1
     2a6a:	00003517          	auipc	a0,0x3
     2a6e:	7ce50513          	addi	a0,a0,1998 # 6238 <malloc+0x12ce>
     2a72:	444020ef          	jal	4eb6 <printf>
-    exit(1);
     2a76:	4505                	li	a0,1
     2a78:	00e020ef          	jal	4a86 <exit>
-    printf("%s: chdir / failed\n", s);
     2a7c:	85a6                	mv	a1,s1
     2a7e:	00003517          	auipc	a0,0x3
     2a82:	7e250513          	addi	a0,a0,2018 # 6260 <malloc+0x12f6>
     2a86:	430020ef          	jal	4eb6 <printf>
-    exit(1);
     2a8a:	4505                	li	a0,1
     2a8c:	7fb010ef          	jal	4a86 <exit>
 
 0000000000002a90 <exitiputtest>:
-{
     2a90:	7179                	addi	sp,sp,-48
     2a92:	f406                	sd	ra,40(sp)
     2a94:	f022                	sd	s0,32(sp)
     2a96:	ec26                	sd	s1,24(sp)
     2a98:	1800                	addi	s0,sp,48
     2a9a:	84aa                	mv	s1,a0
-  pid = fork();
     2a9c:	7e3010ef          	jal	4a7e <fork>
-  if(pid < 0){
     2aa0:	02054e63          	bltz	a0,2adc <exitiputtest+0x4c>
-  if(pid == 0){
     2aa4:	e541                	bnez	a0,2b2c <exitiputtest+0x9c>
-    if(mkdir("iputdir") < 0){
     2aa6:	00003517          	auipc	a0,0x3
     2aaa:	74250513          	addi	a0,a0,1858 # 61e8 <malloc+0x127e>
     2aae:	040020ef          	jal	4aee <mkdir>
     2ab2:	02054f63          	bltz	a0,2af0 <exitiputtest+0x60>
-    if(chdir("iputdir") < 0){
     2ab6:	00003517          	auipc	a0,0x3
     2aba:	73250513          	addi	a0,a0,1842 # 61e8 <malloc+0x127e>
     2abe:	038020ef          	jal	4af6 <chdir>
     2ac2:	04054163          	bltz	a0,2b04 <exitiputtest+0x74>
-    if(unlink("../iputdir") < 0){
     2ac6:	00003517          	auipc	a0,0x3
     2aca:	76250513          	addi	a0,a0,1890 # 6228 <malloc+0x12be>
     2ace:	008020ef          	jal	4ad6 <unlink>
     2ad2:	04054363          	bltz	a0,2b18 <exitiputtest+0x88>
-    exit(0);
     2ad6:	4501                	li	a0,0
     2ad8:	7af010ef          	jal	4a86 <exit>
-    printf("%s: fork failed\n", s);
     2adc:	85a6                	mv	a1,s1
     2ade:	00003517          	auipc	a0,0x3
     2ae2:	e5a50513          	addi	a0,a0,-422 # 5938 <malloc+0x9ce>
     2ae6:	3d0020ef          	jal	4eb6 <printf>
-    exit(1);
     2aea:	4505                	li	a0,1
     2aec:	79b010ef          	jal	4a86 <exit>
-      printf("%s: mkdir failed\n", s);
     2af0:	85a6                	mv	a1,s1
     2af2:	00003517          	auipc	a0,0x3
     2af6:	6fe50513          	addi	a0,a0,1790 # 61f0 <malloc+0x1286>
     2afa:	3bc020ef          	jal	4eb6 <printf>
-      exit(1);
     2afe:	4505                	li	a0,1
     2b00:	787010ef          	jal	4a86 <exit>
-      printf("%s: child chdir failed\n", s);
     2b04:	85a6                	mv	a1,s1
     2b06:	00003517          	auipc	a0,0x3
     2b0a:	77250513          	addi	a0,a0,1906 # 6278 <malloc+0x130e>
     2b0e:	3a8020ef          	jal	4eb6 <printf>
-      exit(1);
     2b12:	4505                	li	a0,1
     2b14:	773010ef          	jal	4a86 <exit>
-      printf("%s: unlink ../iputdir failed\n", s);
     2b18:	85a6                	mv	a1,s1
     2b1a:	00003517          	auipc	a0,0x3
     2b1e:	71e50513          	addi	a0,a0,1822 # 6238 <malloc+0x12ce>
     2b22:	394020ef          	jal	4eb6 <printf>
-      exit(1);
     2b26:	4505                	li	a0,1
     2b28:	75f010ef          	jal	4a86 <exit>
-  wait(&xstatus);
     2b2c:	fdc40513          	addi	a0,s0,-36
     2b30:	75f010ef          	jal	4a8e <wait>
-  exit(xstatus);
     2b34:	fdc42503          	lw	a0,-36(s0)
     2b38:	74f010ef          	jal	4a86 <exit>
 
 0000000000002b3c <dirtest>:
-{
     2b3c:	1101                	addi	sp,sp,-32
     2b3e:	ec06                	sd	ra,24(sp)
     2b40:	e822                	sd	s0,16(sp)
     2b42:	e426                	sd	s1,8(sp)
     2b44:	1000                	addi	s0,sp,32
     2b46:	84aa                	mv	s1,a0
-  if(mkdir("dir0") < 0){
     2b48:	00003517          	auipc	a0,0x3
     2b4c:	74850513          	addi	a0,a0,1864 # 6290 <malloc+0x1326>
     2b50:	79f010ef          	jal	4aee <mkdir>
     2b54:	02054f63          	bltz	a0,2b92 <dirtest+0x56>
-  if(chdir("dir0") < 0){
     2b58:	00003517          	auipc	a0,0x3
     2b5c:	73850513          	addi	a0,a0,1848 # 6290 <malloc+0x1326>
     2b60:	797010ef          	jal	4af6 <chdir>
     2b64:	04054163          	bltz	a0,2ba6 <dirtest+0x6a>
-  if(chdir("..") < 0){
     2b68:	00003517          	auipc	a0,0x3
     2b6c:	74850513          	addi	a0,a0,1864 # 62b0 <malloc+0x1346>
     2b70:	787010ef          	jal	4af6 <chdir>
     2b74:	04054363          	bltz	a0,2bba <dirtest+0x7e>
-  if(unlink("dir0") < 0){
     2b78:	00003517          	auipc	a0,0x3
     2b7c:	71850513          	addi	a0,a0,1816 # 6290 <malloc+0x1326>
     2b80:	757010ef          	jal	4ad6 <unlink>
     2b84:	04054563          	bltz	a0,2bce <dirtest+0x92>
-}
     2b88:	60e2                	ld	ra,24(sp)
     2b8a:	6442                	ld	s0,16(sp)
     2b8c:	64a2                	ld	s1,8(sp)
     2b8e:	6105                	addi	sp,sp,32
     2b90:	8082                	ret
-    printf("%s: mkdir failed\n", s);
     2b92:	85a6                	mv	a1,s1
     2b94:	00003517          	auipc	a0,0x3
     2b98:	65c50513          	addi	a0,a0,1628 # 61f0 <malloc+0x1286>
     2b9c:	31a020ef          	jal	4eb6 <printf>
-    exit(1);
     2ba0:	4505                	li	a0,1
     2ba2:	6e5010ef          	jal	4a86 <exit>
-    printf("%s: chdir dir0 failed\n", s);
     2ba6:	85a6                	mv	a1,s1
     2ba8:	00003517          	auipc	a0,0x3
     2bac:	6f050513          	addi	a0,a0,1776 # 6298 <malloc+0x132e>
     2bb0:	306020ef          	jal	4eb6 <printf>
-    exit(1);
     2bb4:	4505                	li	a0,1
     2bb6:	6d1010ef          	jal	4a86 <exit>
-    printf("%s: chdir .. failed\n", s);
     2bba:	85a6                	mv	a1,s1
     2bbc:	00003517          	auipc	a0,0x3
     2bc0:	6fc50513          	addi	a0,a0,1788 # 62b8 <malloc+0x134e>
     2bc4:	2f2020ef          	jal	4eb6 <printf>
-    exit(1);
     2bc8:	4505                	li	a0,1
     2bca:	6bd010ef          	jal	4a86 <exit>
-    printf("%s: unlink dir0 failed\n", s);
     2bce:	85a6                	mv	a1,s1
     2bd0:	00003517          	auipc	a0,0x3
     2bd4:	70050513          	addi	a0,a0,1792 # 62d0 <malloc+0x1366>
     2bd8:	2de020ef          	jal	4eb6 <printf>
-    exit(1);
     2bdc:	4505                	li	a0,1
     2bde:	6a9010ef          	jal	4a86 <exit>
 
 0000000000002be2 <subdir>:
-{
     2be2:	1101                	addi	sp,sp,-32
     2be4:	ec06                	sd	ra,24(sp)
     2be6:	e822                	sd	s0,16(sp)
@@ -4988,678 +3730,527 @@ r_sp()
     2bea:	e04a                	sd	s2,0(sp)
     2bec:	1000                	addi	s0,sp,32
     2bee:	892a                	mv	s2,a0
-  unlink("ff");
     2bf0:	00004517          	auipc	a0,0x4
     2bf4:	82850513          	addi	a0,a0,-2008 # 6418 <malloc+0x14ae>
     2bf8:	6df010ef          	jal	4ad6 <unlink>
-  if(mkdir("dd") != 0){
     2bfc:	00003517          	auipc	a0,0x3
     2c00:	6ec50513          	addi	a0,a0,1772 # 62e8 <malloc+0x137e>
     2c04:	6eb010ef          	jal	4aee <mkdir>
     2c08:	2e051263          	bnez	a0,2eec <subdir+0x30a>
-  fd = open("dd/ff", O_CREATE | O_RDWR);
     2c0c:	20200593          	li	a1,514
     2c10:	00003517          	auipc	a0,0x3
     2c14:	6f850513          	addi	a0,a0,1784 # 6308 <malloc+0x139e>
     2c18:	6af010ef          	jal	4ac6 <open>
     2c1c:	84aa                	mv	s1,a0
-  if(fd < 0){
     2c1e:	2e054163          	bltz	a0,2f00 <subdir+0x31e>
-  write(fd, "ff", 2);
     2c22:	4609                	li	a2,2
     2c24:	00003597          	auipc	a1,0x3
     2c28:	7f458593          	addi	a1,a1,2036 # 6418 <malloc+0x14ae>
     2c2c:	67b010ef          	jal	4aa6 <write>
-  close(fd);
     2c30:	8526                	mv	a0,s1
     2c32:	67d010ef          	jal	4aae <close>
-  if(unlink("dd") >= 0){
     2c36:	00003517          	auipc	a0,0x3
     2c3a:	6b250513          	addi	a0,a0,1714 # 62e8 <malloc+0x137e>
     2c3e:	699010ef          	jal	4ad6 <unlink>
     2c42:	2c055963          	bgez	a0,2f14 <subdir+0x332>
-  if(mkdir("/dd/dd") != 0){
     2c46:	00003517          	auipc	a0,0x3
     2c4a:	71a50513          	addi	a0,a0,1818 # 6360 <malloc+0x13f6>
     2c4e:	6a1010ef          	jal	4aee <mkdir>
     2c52:	2c051b63          	bnez	a0,2f28 <subdir+0x346>
-  fd = open("dd/dd/ff", O_CREATE | O_RDWR);
     2c56:	20200593          	li	a1,514
     2c5a:	00003517          	auipc	a0,0x3
     2c5e:	72e50513          	addi	a0,a0,1838 # 6388 <malloc+0x141e>
     2c62:	665010ef          	jal	4ac6 <open>
     2c66:	84aa                	mv	s1,a0
-  if(fd < 0){
     2c68:	2c054a63          	bltz	a0,2f3c <subdir+0x35a>
-  write(fd, "FF", 2);
     2c6c:	4609                	li	a2,2
     2c6e:	00003597          	auipc	a1,0x3
     2c72:	74a58593          	addi	a1,a1,1866 # 63b8 <malloc+0x144e>
     2c76:	631010ef          	jal	4aa6 <write>
-  close(fd);
     2c7a:	8526                	mv	a0,s1
     2c7c:	633010ef          	jal	4aae <close>
-  fd = open("dd/dd/../ff", 0);
     2c80:	4581                	li	a1,0
     2c82:	00003517          	auipc	a0,0x3
     2c86:	73e50513          	addi	a0,a0,1854 # 63c0 <malloc+0x1456>
     2c8a:	63d010ef          	jal	4ac6 <open>
     2c8e:	84aa                	mv	s1,a0
-  if(fd < 0){
     2c90:	2c054063          	bltz	a0,2f50 <subdir+0x36e>
-  cc = read(fd, buf, sizeof(buf));
     2c94:	660d                	lui	a2,0x3
     2c96:	0000a597          	auipc	a1,0xa
     2c9a:	fe258593          	addi	a1,a1,-30 # cc78 <buf>
     2c9e:	601010ef          	jal	4a9e <read>
-  if(cc != 2 || buf[0] != 'f'){
     2ca2:	4789                	li	a5,2
     2ca4:	2cf51063          	bne	a0,a5,2f64 <subdir+0x382>
     2ca8:	0000a717          	auipc	a4,0xa
     2cac:	fd074703          	lbu	a4,-48(a4) # cc78 <buf>
     2cb0:	06600793          	li	a5,102
     2cb4:	2af71863          	bne	a4,a5,2f64 <subdir+0x382>
-  close(fd);
     2cb8:	8526                	mv	a0,s1
     2cba:	5f5010ef          	jal	4aae <close>
-  if(link("dd/dd/ff", "dd/dd/ffff") != 0){
     2cbe:	00003597          	auipc	a1,0x3
     2cc2:	75258593          	addi	a1,a1,1874 # 6410 <malloc+0x14a6>
     2cc6:	00003517          	auipc	a0,0x3
     2cca:	6c250513          	addi	a0,a0,1730 # 6388 <malloc+0x141e>
     2cce:	619010ef          	jal	4ae6 <link>
     2cd2:	2a051363          	bnez	a0,2f78 <subdir+0x396>
-  if(unlink("dd/dd/ff") != 0){
     2cd6:	00003517          	auipc	a0,0x3
     2cda:	6b250513          	addi	a0,a0,1714 # 6388 <malloc+0x141e>
     2cde:	5f9010ef          	jal	4ad6 <unlink>
     2ce2:	2a051563          	bnez	a0,2f8c <subdir+0x3aa>
-  if(open("dd/dd/ff", O_RDONLY) >= 0){
     2ce6:	4581                	li	a1,0
     2ce8:	00003517          	auipc	a0,0x3
     2cec:	6a050513          	addi	a0,a0,1696 # 6388 <malloc+0x141e>
     2cf0:	5d7010ef          	jal	4ac6 <open>
     2cf4:	2a055663          	bgez	a0,2fa0 <subdir+0x3be>
-  if(chdir("dd") != 0){
     2cf8:	00003517          	auipc	a0,0x3
     2cfc:	5f050513          	addi	a0,a0,1520 # 62e8 <malloc+0x137e>
     2d00:	5f7010ef          	jal	4af6 <chdir>
     2d04:	2a051863          	bnez	a0,2fb4 <subdir+0x3d2>
-  if(chdir("dd/../../dd") != 0){
     2d08:	00003517          	auipc	a0,0x3
     2d0c:	7a050513          	addi	a0,a0,1952 # 64a8 <malloc+0x153e>
     2d10:	5e7010ef          	jal	4af6 <chdir>
     2d14:	2a051a63          	bnez	a0,2fc8 <subdir+0x3e6>
-  if(chdir("dd/../../../dd") != 0){
     2d18:	00003517          	auipc	a0,0x3
     2d1c:	7c050513          	addi	a0,a0,1984 # 64d8 <malloc+0x156e>
     2d20:	5d7010ef          	jal	4af6 <chdir>
     2d24:	2a051c63          	bnez	a0,2fdc <subdir+0x3fa>
-  if(chdir("./..") != 0){
     2d28:	00003517          	auipc	a0,0x3
     2d2c:	7e850513          	addi	a0,a0,2024 # 6510 <malloc+0x15a6>
     2d30:	5c7010ef          	jal	4af6 <chdir>
     2d34:	2a051e63          	bnez	a0,2ff0 <subdir+0x40e>
-  fd = open("dd/dd/ffff", 0);
     2d38:	4581                	li	a1,0
     2d3a:	00003517          	auipc	a0,0x3
     2d3e:	6d650513          	addi	a0,a0,1750 # 6410 <malloc+0x14a6>
     2d42:	585010ef          	jal	4ac6 <open>
     2d46:	84aa                	mv	s1,a0
-  if(fd < 0){
     2d48:	2a054e63          	bltz	a0,3004 <subdir+0x422>
-  if(read(fd, buf, sizeof(buf)) != 2){
     2d4c:	660d                	lui	a2,0x3
     2d4e:	0000a597          	auipc	a1,0xa
     2d52:	f2a58593          	addi	a1,a1,-214 # cc78 <buf>
     2d56:	549010ef          	jal	4a9e <read>
     2d5a:	4789                	li	a5,2
     2d5c:	2af51e63          	bne	a0,a5,3018 <subdir+0x436>
-  close(fd);
     2d60:	8526                	mv	a0,s1
     2d62:	54d010ef          	jal	4aae <close>
-  if(open("dd/dd/ff", O_RDONLY) >= 0){
     2d66:	4581                	li	a1,0
     2d68:	00003517          	auipc	a0,0x3
     2d6c:	62050513          	addi	a0,a0,1568 # 6388 <malloc+0x141e>
     2d70:	557010ef          	jal	4ac6 <open>
     2d74:	2a055c63          	bgez	a0,302c <subdir+0x44a>
-  if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){
     2d78:	20200593          	li	a1,514
     2d7c:	00004517          	auipc	a0,0x4
     2d80:	82450513          	addi	a0,a0,-2012 # 65a0 <malloc+0x1636>
     2d84:	543010ef          	jal	4ac6 <open>
     2d88:	2a055c63          	bgez	a0,3040 <subdir+0x45e>
-  if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){
     2d8c:	20200593          	li	a1,514
     2d90:	00004517          	auipc	a0,0x4
     2d94:	84050513          	addi	a0,a0,-1984 # 65d0 <malloc+0x1666>
     2d98:	52f010ef          	jal	4ac6 <open>
     2d9c:	2a055c63          	bgez	a0,3054 <subdir+0x472>
-  if(open("dd", O_CREATE) >= 0){
     2da0:	20000593          	li	a1,512
     2da4:	00003517          	auipc	a0,0x3
     2da8:	54450513          	addi	a0,a0,1348 # 62e8 <malloc+0x137e>
     2dac:	51b010ef          	jal	4ac6 <open>
     2db0:	2a055c63          	bgez	a0,3068 <subdir+0x486>
-  if(open("dd", O_RDWR) >= 0){
     2db4:	4589                	li	a1,2
     2db6:	00003517          	auipc	a0,0x3
     2dba:	53250513          	addi	a0,a0,1330 # 62e8 <malloc+0x137e>
     2dbe:	509010ef          	jal	4ac6 <open>
     2dc2:	2a055d63          	bgez	a0,307c <subdir+0x49a>
-  if(open("dd", O_WRONLY) >= 0){
     2dc6:	4585                	li	a1,1
     2dc8:	00003517          	auipc	a0,0x3
     2dcc:	52050513          	addi	a0,a0,1312 # 62e8 <malloc+0x137e>
     2dd0:	4f7010ef          	jal	4ac6 <open>
     2dd4:	2a055e63          	bgez	a0,3090 <subdir+0x4ae>
-  if(link("dd/ff/ff", "dd/dd/xx") == 0){
     2dd8:	00004597          	auipc	a1,0x4
     2ddc:	88858593          	addi	a1,a1,-1912 # 6660 <malloc+0x16f6>
     2de0:	00003517          	auipc	a0,0x3
     2de4:	7c050513          	addi	a0,a0,1984 # 65a0 <malloc+0x1636>
     2de8:	4ff010ef          	jal	4ae6 <link>
     2dec:	2a050c63          	beqz	a0,30a4 <subdir+0x4c2>
-  if(link("dd/xx/ff", "dd/dd/xx") == 0){
     2df0:	00004597          	auipc	a1,0x4
     2df4:	87058593          	addi	a1,a1,-1936 # 6660 <malloc+0x16f6>
     2df8:	00003517          	auipc	a0,0x3
     2dfc:	7d850513          	addi	a0,a0,2008 # 65d0 <malloc+0x1666>
     2e00:	4e7010ef          	jal	4ae6 <link>
     2e04:	2a050a63          	beqz	a0,30b8 <subdir+0x4d6>
-  if(link("dd/ff", "dd/dd/ffff") == 0){
     2e08:	00003597          	auipc	a1,0x3
     2e0c:	60858593          	addi	a1,a1,1544 # 6410 <malloc+0x14a6>
     2e10:	00003517          	auipc	a0,0x3
     2e14:	4f850513          	addi	a0,a0,1272 # 6308 <malloc+0x139e>
     2e18:	4cf010ef          	jal	4ae6 <link>
     2e1c:	2a050863          	beqz	a0,30cc <subdir+0x4ea>
-  if(mkdir("dd/ff/ff") == 0){
     2e20:	00003517          	auipc	a0,0x3
     2e24:	78050513          	addi	a0,a0,1920 # 65a0 <malloc+0x1636>
     2e28:	4c7010ef          	jal	4aee <mkdir>
     2e2c:	2a050a63          	beqz	a0,30e0 <subdir+0x4fe>
-  if(mkdir("dd/xx/ff") == 0){
     2e30:	00003517          	auipc	a0,0x3
     2e34:	7a050513          	addi	a0,a0,1952 # 65d0 <malloc+0x1666>
     2e38:	4b7010ef          	jal	4aee <mkdir>
     2e3c:	2a050c63          	beqz	a0,30f4 <subdir+0x512>
-  if(mkdir("dd/dd/ffff") == 0){
     2e40:	00003517          	auipc	a0,0x3
     2e44:	5d050513          	addi	a0,a0,1488 # 6410 <malloc+0x14a6>
     2e48:	4a7010ef          	jal	4aee <mkdir>
     2e4c:	2a050e63          	beqz	a0,3108 <subdir+0x526>
-  if(unlink("dd/xx/ff") == 0){
     2e50:	00003517          	auipc	a0,0x3
     2e54:	78050513          	addi	a0,a0,1920 # 65d0 <malloc+0x1666>
     2e58:	47f010ef          	jal	4ad6 <unlink>
     2e5c:	2c050063          	beqz	a0,311c <subdir+0x53a>
-  if(unlink("dd/ff/ff") == 0){
     2e60:	00003517          	auipc	a0,0x3
     2e64:	74050513          	addi	a0,a0,1856 # 65a0 <malloc+0x1636>
     2e68:	46f010ef          	jal	4ad6 <unlink>
     2e6c:	2c050263          	beqz	a0,3130 <subdir+0x54e>
-  if(chdir("dd/ff") == 0){
     2e70:	00003517          	auipc	a0,0x3
     2e74:	49850513          	addi	a0,a0,1176 # 6308 <malloc+0x139e>
     2e78:	47f010ef          	jal	4af6 <chdir>
     2e7c:	2c050463          	beqz	a0,3144 <subdir+0x562>
-  if(chdir("dd/xx") == 0){
     2e80:	00004517          	auipc	a0,0x4
     2e84:	93050513          	addi	a0,a0,-1744 # 67b0 <malloc+0x1846>
     2e88:	46f010ef          	jal	4af6 <chdir>
     2e8c:	2c050663          	beqz	a0,3158 <subdir+0x576>
-  if(unlink("dd/dd/ffff") != 0){
     2e90:	00003517          	auipc	a0,0x3
     2e94:	58050513          	addi	a0,a0,1408 # 6410 <malloc+0x14a6>
     2e98:	43f010ef          	jal	4ad6 <unlink>
     2e9c:	2c051863          	bnez	a0,316c <subdir+0x58a>
-  if(unlink("dd/ff") != 0){
     2ea0:	00003517          	auipc	a0,0x3
     2ea4:	46850513          	addi	a0,a0,1128 # 6308 <malloc+0x139e>
     2ea8:	42f010ef          	jal	4ad6 <unlink>
     2eac:	2c051a63          	bnez	a0,3180 <subdir+0x59e>
-  if(unlink("dd") == 0){
     2eb0:	00003517          	auipc	a0,0x3
     2eb4:	43850513          	addi	a0,a0,1080 # 62e8 <malloc+0x137e>
     2eb8:	41f010ef          	jal	4ad6 <unlink>
     2ebc:	2c050c63          	beqz	a0,3194 <subdir+0x5b2>
-  if(unlink("dd/dd") < 0){
     2ec0:	00004517          	auipc	a0,0x4
     2ec4:	96050513          	addi	a0,a0,-1696 # 6820 <malloc+0x18b6>
     2ec8:	40f010ef          	jal	4ad6 <unlink>
     2ecc:	2c054e63          	bltz	a0,31a8 <subdir+0x5c6>
-  if(unlink("dd") < 0){
     2ed0:	00003517          	auipc	a0,0x3
     2ed4:	41850513          	addi	a0,a0,1048 # 62e8 <malloc+0x137e>
     2ed8:	3ff010ef          	jal	4ad6 <unlink>
     2edc:	2e054063          	bltz	a0,31bc <subdir+0x5da>
-}
     2ee0:	60e2                	ld	ra,24(sp)
     2ee2:	6442                	ld	s0,16(sp)
     2ee4:	64a2                	ld	s1,8(sp)
     2ee6:	6902                	ld	s2,0(sp)
     2ee8:	6105                	addi	sp,sp,32
     2eea:	8082                	ret
-    printf("%s: mkdir dd failed\n", s);
     2eec:	85ca                	mv	a1,s2
     2eee:	00003517          	auipc	a0,0x3
     2ef2:	40250513          	addi	a0,a0,1026 # 62f0 <malloc+0x1386>
     2ef6:	7c1010ef          	jal	4eb6 <printf>
-    exit(1);
     2efa:	4505                	li	a0,1
     2efc:	38b010ef          	jal	4a86 <exit>
-    printf("%s: create dd/ff failed\n", s);
     2f00:	85ca                	mv	a1,s2
     2f02:	00003517          	auipc	a0,0x3
     2f06:	40e50513          	addi	a0,a0,1038 # 6310 <malloc+0x13a6>
     2f0a:	7ad010ef          	jal	4eb6 <printf>
-    exit(1);
     2f0e:	4505                	li	a0,1
     2f10:	377010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd (non-empty dir) succeeded!\n", s);
     2f14:	85ca                	mv	a1,s2
     2f16:	00003517          	auipc	a0,0x3
     2f1a:	41a50513          	addi	a0,a0,1050 # 6330 <malloc+0x13c6>
     2f1e:	799010ef          	jal	4eb6 <printf>
-    exit(1);
     2f22:	4505                	li	a0,1
     2f24:	363010ef          	jal	4a86 <exit>
-    printf("%s: subdir mkdir dd/dd failed\n", s);
     2f28:	85ca                	mv	a1,s2
     2f2a:	00003517          	auipc	a0,0x3
     2f2e:	43e50513          	addi	a0,a0,1086 # 6368 <malloc+0x13fe>
     2f32:	785010ef          	jal	4eb6 <printf>
-    exit(1);
     2f36:	4505                	li	a0,1
     2f38:	34f010ef          	jal	4a86 <exit>
-    printf("%s: create dd/dd/ff failed\n", s);
     2f3c:	85ca                	mv	a1,s2
     2f3e:	00003517          	auipc	a0,0x3
     2f42:	45a50513          	addi	a0,a0,1114 # 6398 <malloc+0x142e>
     2f46:	771010ef          	jal	4eb6 <printf>
-    exit(1);
     2f4a:	4505                	li	a0,1
     2f4c:	33b010ef          	jal	4a86 <exit>
-    printf("%s: open dd/dd/../ff failed\n", s);
     2f50:	85ca                	mv	a1,s2
     2f52:	00003517          	auipc	a0,0x3
     2f56:	47e50513          	addi	a0,a0,1150 # 63d0 <malloc+0x1466>
     2f5a:	75d010ef          	jal	4eb6 <printf>
-    exit(1);
     2f5e:	4505                	li	a0,1
     2f60:	327010ef          	jal	4a86 <exit>
-    printf("%s: dd/dd/../ff wrong content\n", s);
     2f64:	85ca                	mv	a1,s2
     2f66:	00003517          	auipc	a0,0x3
     2f6a:	48a50513          	addi	a0,a0,1162 # 63f0 <malloc+0x1486>
     2f6e:	749010ef          	jal	4eb6 <printf>
-    exit(1);
     2f72:	4505                	li	a0,1
     2f74:	313010ef          	jal	4a86 <exit>
-    printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s);
     2f78:	85ca                	mv	a1,s2
     2f7a:	00003517          	auipc	a0,0x3
     2f7e:	4a650513          	addi	a0,a0,1190 # 6420 <malloc+0x14b6>
     2f82:	735010ef          	jal	4eb6 <printf>
-    exit(1);
     2f86:	4505                	li	a0,1
     2f88:	2ff010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/dd/ff failed\n", s);
     2f8c:	85ca                	mv	a1,s2
     2f8e:	00003517          	auipc	a0,0x3
     2f92:	4ba50513          	addi	a0,a0,1210 # 6448 <malloc+0x14de>
     2f96:	721010ef          	jal	4eb6 <printf>
-    exit(1);
     2f9a:	4505                	li	a0,1
     2f9c:	2eb010ef          	jal	4a86 <exit>
-    printf("%s: open (unlinked) dd/dd/ff succeeded\n", s);
     2fa0:	85ca                	mv	a1,s2
     2fa2:	00003517          	auipc	a0,0x3
     2fa6:	4c650513          	addi	a0,a0,1222 # 6468 <malloc+0x14fe>
     2faa:	70d010ef          	jal	4eb6 <printf>
-    exit(1);
     2fae:	4505                	li	a0,1
     2fb0:	2d7010ef          	jal	4a86 <exit>
-    printf("%s: chdir dd failed\n", s);
     2fb4:	85ca                	mv	a1,s2
     2fb6:	00003517          	auipc	a0,0x3
     2fba:	4da50513          	addi	a0,a0,1242 # 6490 <malloc+0x1526>
     2fbe:	6f9010ef          	jal	4eb6 <printf>
-    exit(1);
     2fc2:	4505                	li	a0,1
     2fc4:	2c3010ef          	jal	4a86 <exit>
-    printf("%s: chdir dd/../../dd failed\n", s);
     2fc8:	85ca                	mv	a1,s2
     2fca:	00003517          	auipc	a0,0x3
     2fce:	4ee50513          	addi	a0,a0,1262 # 64b8 <malloc+0x154e>
     2fd2:	6e5010ef          	jal	4eb6 <printf>
-    exit(1);
     2fd6:	4505                	li	a0,1
     2fd8:	2af010ef          	jal	4a86 <exit>
-    printf("%s: chdir dd/../../../dd failed\n", s);
     2fdc:	85ca                	mv	a1,s2
     2fde:	00003517          	auipc	a0,0x3
     2fe2:	50a50513          	addi	a0,a0,1290 # 64e8 <malloc+0x157e>
     2fe6:	6d1010ef          	jal	4eb6 <printf>
-    exit(1);
     2fea:	4505                	li	a0,1
     2fec:	29b010ef          	jal	4a86 <exit>
-    printf("%s: chdir ./.. failed\n", s);
     2ff0:	85ca                	mv	a1,s2
     2ff2:	00003517          	auipc	a0,0x3
     2ff6:	52650513          	addi	a0,a0,1318 # 6518 <malloc+0x15ae>
     2ffa:	6bd010ef          	jal	4eb6 <printf>
-    exit(1);
     2ffe:	4505                	li	a0,1
     3000:	287010ef          	jal	4a86 <exit>
-    printf("%s: open dd/dd/ffff failed\n", s);
     3004:	85ca                	mv	a1,s2
     3006:	00003517          	auipc	a0,0x3
     300a:	52a50513          	addi	a0,a0,1322 # 6530 <malloc+0x15c6>
     300e:	6a9010ef          	jal	4eb6 <printf>
-    exit(1);
     3012:	4505                	li	a0,1
     3014:	273010ef          	jal	4a86 <exit>
-    printf("%s: read dd/dd/ffff wrong len\n", s);
     3018:	85ca                	mv	a1,s2
     301a:	00003517          	auipc	a0,0x3
     301e:	53650513          	addi	a0,a0,1334 # 6550 <malloc+0x15e6>
     3022:	695010ef          	jal	4eb6 <printf>
-    exit(1);
     3026:	4505                	li	a0,1
     3028:	25f010ef          	jal	4a86 <exit>
-    printf("%s: open (unlinked) dd/dd/ff succeeded!\n", s);
     302c:	85ca                	mv	a1,s2
     302e:	00003517          	auipc	a0,0x3
     3032:	54250513          	addi	a0,a0,1346 # 6570 <malloc+0x1606>
     3036:	681010ef          	jal	4eb6 <printf>
-    exit(1);
     303a:	4505                	li	a0,1
     303c:	24b010ef          	jal	4a86 <exit>
-    printf("%s: create dd/ff/ff succeeded!\n", s);
     3040:	85ca                	mv	a1,s2
     3042:	00003517          	auipc	a0,0x3
     3046:	56e50513          	addi	a0,a0,1390 # 65b0 <malloc+0x1646>
     304a:	66d010ef          	jal	4eb6 <printf>
-    exit(1);
     304e:	4505                	li	a0,1
     3050:	237010ef          	jal	4a86 <exit>
-    printf("%s: create dd/xx/ff succeeded!\n", s);
     3054:	85ca                	mv	a1,s2
     3056:	00003517          	auipc	a0,0x3
     305a:	58a50513          	addi	a0,a0,1418 # 65e0 <malloc+0x1676>
     305e:	659010ef          	jal	4eb6 <printf>
-    exit(1);
     3062:	4505                	li	a0,1
     3064:	223010ef          	jal	4a86 <exit>
-    printf("%s: create dd succeeded!\n", s);
     3068:	85ca                	mv	a1,s2
     306a:	00003517          	auipc	a0,0x3
     306e:	59650513          	addi	a0,a0,1430 # 6600 <malloc+0x1696>
     3072:	645010ef          	jal	4eb6 <printf>
-    exit(1);
     3076:	4505                	li	a0,1
     3078:	20f010ef          	jal	4a86 <exit>
-    printf("%s: open dd rdwr succeeded!\n", s);
     307c:	85ca                	mv	a1,s2
     307e:	00003517          	auipc	a0,0x3
     3082:	5a250513          	addi	a0,a0,1442 # 6620 <malloc+0x16b6>
     3086:	631010ef          	jal	4eb6 <printf>
-    exit(1);
     308a:	4505                	li	a0,1
     308c:	1fb010ef          	jal	4a86 <exit>
-    printf("%s: open dd wronly succeeded!\n", s);
     3090:	85ca                	mv	a1,s2
     3092:	00003517          	auipc	a0,0x3
     3096:	5ae50513          	addi	a0,a0,1454 # 6640 <malloc+0x16d6>
     309a:	61d010ef          	jal	4eb6 <printf>
-    exit(1);
     309e:	4505                	li	a0,1
     30a0:	1e7010ef          	jal	4a86 <exit>
-    printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s);
     30a4:	85ca                	mv	a1,s2
     30a6:	00003517          	auipc	a0,0x3
     30aa:	5ca50513          	addi	a0,a0,1482 # 6670 <malloc+0x1706>
     30ae:	609010ef          	jal	4eb6 <printf>
-    exit(1);
     30b2:	4505                	li	a0,1
     30b4:	1d3010ef          	jal	4a86 <exit>
-    printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s);
     30b8:	85ca                	mv	a1,s2
     30ba:	00003517          	auipc	a0,0x3
     30be:	5de50513          	addi	a0,a0,1502 # 6698 <malloc+0x172e>
     30c2:	5f5010ef          	jal	4eb6 <printf>
-    exit(1);
     30c6:	4505                	li	a0,1
     30c8:	1bf010ef          	jal	4a86 <exit>
-    printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s);
     30cc:	85ca                	mv	a1,s2
     30ce:	00003517          	auipc	a0,0x3
     30d2:	5f250513          	addi	a0,a0,1522 # 66c0 <malloc+0x1756>
     30d6:	5e1010ef          	jal	4eb6 <printf>
-    exit(1);
     30da:	4505                	li	a0,1
     30dc:	1ab010ef          	jal	4a86 <exit>
-    printf("%s: mkdir dd/ff/ff succeeded!\n", s);
     30e0:	85ca                	mv	a1,s2
     30e2:	00003517          	auipc	a0,0x3
     30e6:	60650513          	addi	a0,a0,1542 # 66e8 <malloc+0x177e>
     30ea:	5cd010ef          	jal	4eb6 <printf>
-    exit(1);
     30ee:	4505                	li	a0,1
     30f0:	197010ef          	jal	4a86 <exit>
-    printf("%s: mkdir dd/xx/ff succeeded!\n", s);
     30f4:	85ca                	mv	a1,s2
     30f6:	00003517          	auipc	a0,0x3
     30fa:	61250513          	addi	a0,a0,1554 # 6708 <malloc+0x179e>
     30fe:	5b9010ef          	jal	4eb6 <printf>
-    exit(1);
     3102:	4505                	li	a0,1
     3104:	183010ef          	jal	4a86 <exit>
-    printf("%s: mkdir dd/dd/ffff succeeded!\n", s);
     3108:	85ca                	mv	a1,s2
     310a:	00003517          	auipc	a0,0x3
     310e:	61e50513          	addi	a0,a0,1566 # 6728 <malloc+0x17be>
     3112:	5a5010ef          	jal	4eb6 <printf>
-    exit(1);
     3116:	4505                	li	a0,1
     3118:	16f010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/xx/ff succeeded!\n", s);
     311c:	85ca                	mv	a1,s2
     311e:	00003517          	auipc	a0,0x3
     3122:	63250513          	addi	a0,a0,1586 # 6750 <malloc+0x17e6>
     3126:	591010ef          	jal	4eb6 <printf>
-    exit(1);
     312a:	4505                	li	a0,1
     312c:	15b010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/ff/ff succeeded!\n", s);
     3130:	85ca                	mv	a1,s2
     3132:	00003517          	auipc	a0,0x3
     3136:	63e50513          	addi	a0,a0,1598 # 6770 <malloc+0x1806>
     313a:	57d010ef          	jal	4eb6 <printf>
-    exit(1);
     313e:	4505                	li	a0,1
     3140:	147010ef          	jal	4a86 <exit>
-    printf("%s: chdir dd/ff succeeded!\n", s);
     3144:	85ca                	mv	a1,s2
     3146:	00003517          	auipc	a0,0x3
     314a:	64a50513          	addi	a0,a0,1610 # 6790 <malloc+0x1826>
     314e:	569010ef          	jal	4eb6 <printf>
-    exit(1);
     3152:	4505                	li	a0,1
     3154:	133010ef          	jal	4a86 <exit>
-    printf("%s: chdir dd/xx succeeded!\n", s);
     3158:	85ca                	mv	a1,s2
     315a:	00003517          	auipc	a0,0x3
     315e:	65e50513          	addi	a0,a0,1630 # 67b8 <malloc+0x184e>
     3162:	555010ef          	jal	4eb6 <printf>
-    exit(1);
     3166:	4505                	li	a0,1
     3168:	11f010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/dd/ff failed\n", s);
     316c:	85ca                	mv	a1,s2
     316e:	00003517          	auipc	a0,0x3
     3172:	2da50513          	addi	a0,a0,730 # 6448 <malloc+0x14de>
     3176:	541010ef          	jal	4eb6 <printf>
-    exit(1);
     317a:	4505                	li	a0,1
     317c:	10b010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/ff failed\n", s);
     3180:	85ca                	mv	a1,s2
     3182:	00003517          	auipc	a0,0x3
     3186:	65650513          	addi	a0,a0,1622 # 67d8 <malloc+0x186e>
     318a:	52d010ef          	jal	4eb6 <printf>
-    exit(1);
     318e:	4505                	li	a0,1
     3190:	0f7010ef          	jal	4a86 <exit>
-    printf("%s: unlink non-empty dd succeeded!\n", s);
     3194:	85ca                	mv	a1,s2
     3196:	00003517          	auipc	a0,0x3
     319a:	66250513          	addi	a0,a0,1634 # 67f8 <malloc+0x188e>
     319e:	519010ef          	jal	4eb6 <printf>
-    exit(1);
     31a2:	4505                	li	a0,1
     31a4:	0e3010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd/dd failed\n", s);
     31a8:	85ca                	mv	a1,s2
     31aa:	00003517          	auipc	a0,0x3
     31ae:	67e50513          	addi	a0,a0,1662 # 6828 <malloc+0x18be>
     31b2:	505010ef          	jal	4eb6 <printf>
-    exit(1);
     31b6:	4505                	li	a0,1
     31b8:	0cf010ef          	jal	4a86 <exit>
-    printf("%s: unlink dd failed\n", s);
     31bc:	85ca                	mv	a1,s2
     31be:	00003517          	auipc	a0,0x3
     31c2:	68a50513          	addi	a0,a0,1674 # 6848 <malloc+0x18de>
     31c6:	4f1010ef          	jal	4eb6 <printf>
-    exit(1);
     31ca:	4505                	li	a0,1
     31cc:	0bb010ef          	jal	4a86 <exit>
 
 00000000000031d0 <rmdot>:
-{
     31d0:	1101                	addi	sp,sp,-32
     31d2:	ec06                	sd	ra,24(sp)
     31d4:	e822                	sd	s0,16(sp)
     31d6:	e426                	sd	s1,8(sp)
     31d8:	1000                	addi	s0,sp,32
     31da:	84aa                	mv	s1,a0
-  if(mkdir("dots") != 0){
     31dc:	00003517          	auipc	a0,0x3
     31e0:	68450513          	addi	a0,a0,1668 # 6860 <malloc+0x18f6>
     31e4:	10b010ef          	jal	4aee <mkdir>
     31e8:	e53d                	bnez	a0,3256 <rmdot+0x86>
-  if(chdir("dots") != 0){
     31ea:	00003517          	auipc	a0,0x3
     31ee:	67650513          	addi	a0,a0,1654 # 6860 <malloc+0x18f6>
     31f2:	105010ef          	jal	4af6 <chdir>
     31f6:	e935                	bnez	a0,326a <rmdot+0x9a>
-  if(unlink(".") == 0){
     31f8:	00002517          	auipc	a0,0x2
     31fc:	59850513          	addi	a0,a0,1432 # 5790 <malloc+0x826>
     3200:	0d7010ef          	jal	4ad6 <unlink>
     3204:	cd2d                	beqz	a0,327e <rmdot+0xae>
-  if(unlink("..") == 0){
     3206:	00003517          	auipc	a0,0x3
     320a:	0aa50513          	addi	a0,a0,170 # 62b0 <malloc+0x1346>
     320e:	0c9010ef          	jal	4ad6 <unlink>
     3212:	c141                	beqz	a0,3292 <rmdot+0xc2>
-  if(chdir("/") != 0){
     3214:	00003517          	auipc	a0,0x3
     3218:	04450513          	addi	a0,a0,68 # 6258 <malloc+0x12ee>
     321c:	0db010ef          	jal	4af6 <chdir>
     3220:	e159                	bnez	a0,32a6 <rmdot+0xd6>
-  if(unlink("dots/.") == 0){
     3222:	00003517          	auipc	a0,0x3
     3226:	6a650513          	addi	a0,a0,1702 # 68c8 <malloc+0x195e>
     322a:	0ad010ef          	jal	4ad6 <unlink>
     322e:	c551                	beqz	a0,32ba <rmdot+0xea>
-  if(unlink("dots/..") == 0){
     3230:	00003517          	auipc	a0,0x3
     3234:	6c050513          	addi	a0,a0,1728 # 68f0 <malloc+0x1986>
     3238:	09f010ef          	jal	4ad6 <unlink>
     323c:	c949                	beqz	a0,32ce <rmdot+0xfe>
-  if(unlink("dots") != 0){
     323e:	00003517          	auipc	a0,0x3
     3242:	62250513          	addi	a0,a0,1570 # 6860 <malloc+0x18f6>
     3246:	091010ef          	jal	4ad6 <unlink>
     324a:	ed41                	bnez	a0,32e2 <rmdot+0x112>
-}
     324c:	60e2                	ld	ra,24(sp)
     324e:	6442                	ld	s0,16(sp)
     3250:	64a2                	ld	s1,8(sp)
     3252:	6105                	addi	sp,sp,32
     3254:	8082                	ret
-    printf("%s: mkdir dots failed\n", s);
     3256:	85a6                	mv	a1,s1
     3258:	00003517          	auipc	a0,0x3
     325c:	61050513          	addi	a0,a0,1552 # 6868 <malloc+0x18fe>
     3260:	457010ef          	jal	4eb6 <printf>
-    exit(1);
     3264:	4505                	li	a0,1
     3266:	021010ef          	jal	4a86 <exit>
-    printf("%s: chdir dots failed\n", s);
     326a:	85a6                	mv	a1,s1
     326c:	00003517          	auipc	a0,0x3
     3270:	61450513          	addi	a0,a0,1556 # 6880 <malloc+0x1916>
     3274:	443010ef          	jal	4eb6 <printf>
-    exit(1);
     3278:	4505                	li	a0,1
     327a:	00d010ef          	jal	4a86 <exit>
-    printf("%s: rm . worked!\n", s);
     327e:	85a6                	mv	a1,s1
     3280:	00003517          	auipc	a0,0x3
     3284:	61850513          	addi	a0,a0,1560 # 6898 <malloc+0x192e>
     3288:	42f010ef          	jal	4eb6 <printf>
-    exit(1);
     328c:	4505                	li	a0,1
     328e:	7f8010ef          	jal	4a86 <exit>
-    printf("%s: rm .. worked!\n", s);
     3292:	85a6                	mv	a1,s1
     3294:	00003517          	auipc	a0,0x3
     3298:	61c50513          	addi	a0,a0,1564 # 68b0 <malloc+0x1946>
     329c:	41b010ef          	jal	4eb6 <printf>
-    exit(1);
     32a0:	4505                	li	a0,1
     32a2:	7e4010ef          	jal	4a86 <exit>
-    printf("%s: chdir / failed\n", s);
     32a6:	85a6                	mv	a1,s1
     32a8:	00003517          	auipc	a0,0x3
     32ac:	fb850513          	addi	a0,a0,-72 # 6260 <malloc+0x12f6>
     32b0:	407010ef          	jal	4eb6 <printf>
-    exit(1);
     32b4:	4505                	li	a0,1
     32b6:	7d0010ef          	jal	4a86 <exit>
-    printf("%s: unlink dots/. worked!\n", s);
     32ba:	85a6                	mv	a1,s1
     32bc:	00003517          	auipc	a0,0x3
     32c0:	61450513          	addi	a0,a0,1556 # 68d0 <malloc+0x1966>
     32c4:	3f3010ef          	jal	4eb6 <printf>
-    exit(1);
     32c8:	4505                	li	a0,1
     32ca:	7bc010ef          	jal	4a86 <exit>
-    printf("%s: unlink dots/.. worked!\n", s);
     32ce:	85a6                	mv	a1,s1
     32d0:	00003517          	auipc	a0,0x3
     32d4:	62850513          	addi	a0,a0,1576 # 68f8 <malloc+0x198e>
     32d8:	3df010ef          	jal	4eb6 <printf>
-    exit(1);
     32dc:	4505                	li	a0,1
     32de:	7a8010ef          	jal	4a86 <exit>
-    printf("%s: unlink dots failed!\n", s);
     32e2:	85a6                	mv	a1,s1
     32e4:	00003517          	auipc	a0,0x3
     32e8:	63450513          	addi	a0,a0,1588 # 6918 <malloc+0x19ae>
     32ec:	3cb010ef          	jal	4eb6 <printf>
-    exit(1);
     32f0:	4505                	li	a0,1
     32f2:	794010ef          	jal	4a86 <exit>
 
 00000000000032f6 <dirfile>:
-{
     32f6:	1101                	addi	sp,sp,-32
     32f8:	ec06                	sd	ra,24(sp)
     32fa:	e822                	sd	s0,16(sp)
@@ -5667,168 +4258,129 @@ r_sp()
     32fe:	e04a                	sd	s2,0(sp)
     3300:	1000                	addi	s0,sp,32
     3302:	892a                	mv	s2,a0
-  fd = open("dirfile", O_CREATE);
     3304:	20000593          	li	a1,512
     3308:	00003517          	auipc	a0,0x3
     330c:	63050513          	addi	a0,a0,1584 # 6938 <malloc+0x19ce>
     3310:	7b6010ef          	jal	4ac6 <open>
-  if(fd < 0){
     3314:	0c054563          	bltz	a0,33de <dirfile+0xe8>
-  close(fd);
     3318:	796010ef          	jal	4aae <close>
-  if(chdir("dirfile") == 0){
     331c:	00003517          	auipc	a0,0x3
     3320:	61c50513          	addi	a0,a0,1564 # 6938 <malloc+0x19ce>
     3324:	7d2010ef          	jal	4af6 <chdir>
     3328:	c569                	beqz	a0,33f2 <dirfile+0xfc>
-  fd = open("dirfile/xx", 0);
     332a:	4581                	li	a1,0
     332c:	00003517          	auipc	a0,0x3
     3330:	65450513          	addi	a0,a0,1620 # 6980 <malloc+0x1a16>
     3334:	792010ef          	jal	4ac6 <open>
-  if(fd >= 0){
     3338:	0c055763          	bgez	a0,3406 <dirfile+0x110>
-  fd = open("dirfile/xx", O_CREATE);
     333c:	20000593          	li	a1,512
     3340:	00003517          	auipc	a0,0x3
     3344:	64050513          	addi	a0,a0,1600 # 6980 <malloc+0x1a16>
     3348:	77e010ef          	jal	4ac6 <open>
-  if(fd >= 0){
     334c:	0c055763          	bgez	a0,341a <dirfile+0x124>
-  if(mkdir("dirfile/xx") == 0){
     3350:	00003517          	auipc	a0,0x3
     3354:	63050513          	addi	a0,a0,1584 # 6980 <malloc+0x1a16>
     3358:	796010ef          	jal	4aee <mkdir>
     335c:	0c050963          	beqz	a0,342e <dirfile+0x138>
-  if(unlink("dirfile/xx") == 0){
     3360:	00003517          	auipc	a0,0x3
     3364:	62050513          	addi	a0,a0,1568 # 6980 <malloc+0x1a16>
     3368:	76e010ef          	jal	4ad6 <unlink>
     336c:	0c050b63          	beqz	a0,3442 <dirfile+0x14c>
-  if(link("README", "dirfile/xx") == 0){
     3370:	00003597          	auipc	a1,0x3
     3374:	61058593          	addi	a1,a1,1552 # 6980 <malloc+0x1a16>
     3378:	00002517          	auipc	a0,0x2
     337c:	f0850513          	addi	a0,a0,-248 # 5280 <malloc+0x316>
     3380:	766010ef          	jal	4ae6 <link>
     3384:	0c050963          	beqz	a0,3456 <dirfile+0x160>
-  if(unlink("dirfile") != 0){
     3388:	00003517          	auipc	a0,0x3
     338c:	5b050513          	addi	a0,a0,1456 # 6938 <malloc+0x19ce>
     3390:	746010ef          	jal	4ad6 <unlink>
     3394:	0c051b63          	bnez	a0,346a <dirfile+0x174>
-  fd = open(".", O_RDWR);
     3398:	4589                	li	a1,2
     339a:	00002517          	auipc	a0,0x2
     339e:	3f650513          	addi	a0,a0,1014 # 5790 <malloc+0x826>
     33a2:	724010ef          	jal	4ac6 <open>
-  if(fd >= 0){
     33a6:	0c055c63          	bgez	a0,347e <dirfile+0x188>
-  fd = open(".", 0);
     33aa:	4581                	li	a1,0
     33ac:	00002517          	auipc	a0,0x2
     33b0:	3e450513          	addi	a0,a0,996 # 5790 <malloc+0x826>
     33b4:	712010ef          	jal	4ac6 <open>
     33b8:	84aa                	mv	s1,a0
-  if(write(fd, "x", 1) > 0){
     33ba:	4605                	li	a2,1
     33bc:	00002597          	auipc	a1,0x2
     33c0:	d5c58593          	addi	a1,a1,-676 # 5118 <malloc+0x1ae>
     33c4:	6e2010ef          	jal	4aa6 <write>
     33c8:	0ca04563          	bgtz	a0,3492 <dirfile+0x19c>
-  close(fd);
     33cc:	8526                	mv	a0,s1
     33ce:	6e0010ef          	jal	4aae <close>
-}
     33d2:	60e2                	ld	ra,24(sp)
     33d4:	6442                	ld	s0,16(sp)
     33d6:	64a2                	ld	s1,8(sp)
     33d8:	6902                	ld	s2,0(sp)
     33da:	6105                	addi	sp,sp,32
     33dc:	8082                	ret
-    printf("%s: create dirfile failed\n", s);
     33de:	85ca                	mv	a1,s2
     33e0:	00003517          	auipc	a0,0x3
     33e4:	56050513          	addi	a0,a0,1376 # 6940 <malloc+0x19d6>
     33e8:	2cf010ef          	jal	4eb6 <printf>
-    exit(1);
     33ec:	4505                	li	a0,1
     33ee:	698010ef          	jal	4a86 <exit>
-    printf("%s: chdir dirfile succeeded!\n", s);
     33f2:	85ca                	mv	a1,s2
     33f4:	00003517          	auipc	a0,0x3
     33f8:	56c50513          	addi	a0,a0,1388 # 6960 <malloc+0x19f6>
     33fc:	2bb010ef          	jal	4eb6 <printf>
-    exit(1);
     3400:	4505                	li	a0,1
     3402:	684010ef          	jal	4a86 <exit>
-    printf("%s: create dirfile/xx succeeded!\n", s);
     3406:	85ca                	mv	a1,s2
     3408:	00003517          	auipc	a0,0x3
     340c:	58850513          	addi	a0,a0,1416 # 6990 <malloc+0x1a26>
     3410:	2a7010ef          	jal	4eb6 <printf>
-    exit(1);
     3414:	4505                	li	a0,1
     3416:	670010ef          	jal	4a86 <exit>
-    printf("%s: create dirfile/xx succeeded!\n", s);
     341a:	85ca                	mv	a1,s2
     341c:	00003517          	auipc	a0,0x3
     3420:	57450513          	addi	a0,a0,1396 # 6990 <malloc+0x1a26>
     3424:	293010ef          	jal	4eb6 <printf>
-    exit(1);
     3428:	4505                	li	a0,1
     342a:	65c010ef          	jal	4a86 <exit>
-    printf("%s: mkdir dirfile/xx succeeded!\n", s);
     342e:	85ca                	mv	a1,s2
     3430:	00003517          	auipc	a0,0x3
     3434:	58850513          	addi	a0,a0,1416 # 69b8 <malloc+0x1a4e>
     3438:	27f010ef          	jal	4eb6 <printf>
-    exit(1);
     343c:	4505                	li	a0,1
     343e:	648010ef          	jal	4a86 <exit>
-    printf("%s: unlink dirfile/xx succeeded!\n", s);
     3442:	85ca                	mv	a1,s2
     3444:	00003517          	auipc	a0,0x3
     3448:	59c50513          	addi	a0,a0,1436 # 69e0 <malloc+0x1a76>
     344c:	26b010ef          	jal	4eb6 <printf>
-    exit(1);
     3450:	4505                	li	a0,1
     3452:	634010ef          	jal	4a86 <exit>
-    printf("%s: link to dirfile/xx succeeded!\n", s);
     3456:	85ca                	mv	a1,s2
     3458:	00003517          	auipc	a0,0x3
     345c:	5b050513          	addi	a0,a0,1456 # 6a08 <malloc+0x1a9e>
     3460:	257010ef          	jal	4eb6 <printf>
-    exit(1);
     3464:	4505                	li	a0,1
     3466:	620010ef          	jal	4a86 <exit>
-    printf("%s: unlink dirfile failed!\n", s);
     346a:	85ca                	mv	a1,s2
     346c:	00003517          	auipc	a0,0x3
     3470:	5c450513          	addi	a0,a0,1476 # 6a30 <malloc+0x1ac6>
     3474:	243010ef          	jal	4eb6 <printf>
-    exit(1);
     3478:	4505                	li	a0,1
     347a:	60c010ef          	jal	4a86 <exit>
-    printf("%s: open . for writing succeeded!\n", s);
     347e:	85ca                	mv	a1,s2
     3480:	00003517          	auipc	a0,0x3
     3484:	5d050513          	addi	a0,a0,1488 # 6a50 <malloc+0x1ae6>
     3488:	22f010ef          	jal	4eb6 <printf>
-    exit(1);
     348c:	4505                	li	a0,1
     348e:	5f8010ef          	jal	4a86 <exit>
-    printf("%s: write . succeeded!\n", s);
     3492:	85ca                	mv	a1,s2
     3494:	00003517          	auipc	a0,0x3
     3498:	5e450513          	addi	a0,a0,1508 # 6a78 <malloc+0x1b0e>
     349c:	21b010ef          	jal	4eb6 <printf>
-    exit(1);
     34a0:	4505                	li	a0,1
     34a2:	5e4010ef          	jal	4a86 <exit>
 
 00000000000034a6 <iref>:
-{
     34a6:	7139                	addi	sp,sp,-64
     34a8:	fc06                	sd	ra,56(sp)
     34aa:	f822                	sd	s0,48(sp)
@@ -5841,95 +4393,68 @@ r_sp()
     34b8:	0080                	addi	s0,sp,64
     34ba:	8b2a                	mv	s6,a0
     34bc:	03300913          	li	s2,51
-    if(mkdir("irefd") != 0){
     34c0:	00003a17          	auipc	s4,0x3
     34c4:	5d0a0a13          	addi	s4,s4,1488 # 6a90 <malloc+0x1b26>
-    mkdir("");
     34c8:	00003497          	auipc	s1,0x3
     34cc:	0d048493          	addi	s1,s1,208 # 6598 <malloc+0x162e>
-    link("README", "");
     34d0:	00002a97          	auipc	s5,0x2
     34d4:	db0a8a93          	addi	s5,s5,-592 # 5280 <malloc+0x316>
-    fd = open("xx", O_CREATE);
     34d8:	00003997          	auipc	s3,0x3
     34dc:	4b098993          	addi	s3,s3,1200 # 6988 <malloc+0x1a1e>
     34e0:	a835                	j	351c <iref+0x76>
-      printf("%s: mkdir irefd failed\n", s);
     34e2:	85da                	mv	a1,s6
     34e4:	00003517          	auipc	a0,0x3
     34e8:	5b450513          	addi	a0,a0,1460 # 6a98 <malloc+0x1b2e>
     34ec:	1cb010ef          	jal	4eb6 <printf>
-      exit(1);
     34f0:	4505                	li	a0,1
     34f2:	594010ef          	jal	4a86 <exit>
-      printf("%s: chdir irefd failed\n", s);
     34f6:	85da                	mv	a1,s6
     34f8:	00003517          	auipc	a0,0x3
     34fc:	5b850513          	addi	a0,a0,1464 # 6ab0 <malloc+0x1b46>
     3500:	1b7010ef          	jal	4eb6 <printf>
-      exit(1);
     3504:	4505                	li	a0,1
     3506:	580010ef          	jal	4a86 <exit>
-      close(fd);
     350a:	5a4010ef          	jal	4aae <close>
     350e:	a82d                	j	3548 <iref+0xa2>
-    unlink("xx");
     3510:	854e                	mv	a0,s3
     3512:	5c4010ef          	jal	4ad6 <unlink>
-  for(i = 0; i < NINODE + 1; i++){
     3516:	397d                	addiw	s2,s2,-1
     3518:	04090263          	beqz	s2,355c <iref+0xb6>
-    if(mkdir("irefd") != 0){
     351c:	8552                	mv	a0,s4
     351e:	5d0010ef          	jal	4aee <mkdir>
     3522:	f161                	bnez	a0,34e2 <iref+0x3c>
-    if(chdir("irefd") != 0){
     3524:	8552                	mv	a0,s4
     3526:	5d0010ef          	jal	4af6 <chdir>
     352a:	f571                	bnez	a0,34f6 <iref+0x50>
-    mkdir("");
     352c:	8526                	mv	a0,s1
     352e:	5c0010ef          	jal	4aee <mkdir>
-    link("README", "");
     3532:	85a6                	mv	a1,s1
     3534:	8556                	mv	a0,s5
     3536:	5b0010ef          	jal	4ae6 <link>
-    fd = open("", O_CREATE);
     353a:	20000593          	li	a1,512
     353e:	8526                	mv	a0,s1
     3540:	586010ef          	jal	4ac6 <open>
-    if(fd >= 0)
     3544:	fc0553e3          	bgez	a0,350a <iref+0x64>
-    fd = open("xx", O_CREATE);
     3548:	20000593          	li	a1,512
     354c:	854e                	mv	a0,s3
     354e:	578010ef          	jal	4ac6 <open>
-    if(fd >= 0)
     3552:	fa054fe3          	bltz	a0,3510 <iref+0x6a>
-      close(fd);
     3556:	558010ef          	jal	4aae <close>
     355a:	bf5d                	j	3510 <iref+0x6a>
     355c:	03300493          	li	s1,51
-    chdir("..");
     3560:	00003997          	auipc	s3,0x3
     3564:	d5098993          	addi	s3,s3,-688 # 62b0 <malloc+0x1346>
-    unlink("irefd");
     3568:	00003917          	auipc	s2,0x3
     356c:	52890913          	addi	s2,s2,1320 # 6a90 <malloc+0x1b26>
-    chdir("..");
     3570:	854e                	mv	a0,s3
     3572:	584010ef          	jal	4af6 <chdir>
-    unlink("irefd");
     3576:	854a                	mv	a0,s2
     3578:	55e010ef          	jal	4ad6 <unlink>
-  for(i = 0; i < NINODE + 1; i++){
     357c:	34fd                	addiw	s1,s1,-1
     357e:	f8ed                	bnez	s1,3570 <iref+0xca>
-  chdir("/");
     3580:	00003517          	auipc	a0,0x3
     3584:	cd850513          	addi	a0,a0,-808 # 6258 <malloc+0x12ee>
     3588:	56e010ef          	jal	4af6 <chdir>
-}
     358c:	70e2                	ld	ra,56(sp)
     358e:	7442                	ld	s0,48(sp)
     3590:	74a2                	ld	s1,40(sp)
@@ -5942,152 +4467,114 @@ r_sp()
     359e:	8082                	ret
 
 00000000000035a0 <openiputtest>:
-{
     35a0:	7179                	addi	sp,sp,-48
     35a2:	f406                	sd	ra,40(sp)
     35a4:	f022                	sd	s0,32(sp)
     35a6:	ec26                	sd	s1,24(sp)
     35a8:	1800                	addi	s0,sp,48
     35aa:	84aa                	mv	s1,a0
-  if(mkdir("oidir") < 0){
     35ac:	00003517          	auipc	a0,0x3
     35b0:	51c50513          	addi	a0,a0,1308 # 6ac8 <malloc+0x1b5e>
     35b4:	53a010ef          	jal	4aee <mkdir>
     35b8:	02054a63          	bltz	a0,35ec <openiputtest+0x4c>
-  pid = fork();
     35bc:	4c2010ef          	jal	4a7e <fork>
-  if(pid < 0){
     35c0:	04054063          	bltz	a0,3600 <openiputtest+0x60>
-  if(pid == 0){
     35c4:	e939                	bnez	a0,361a <openiputtest+0x7a>
-    int fd = open("oidir", O_RDWR);
     35c6:	4589                	li	a1,2
     35c8:	00003517          	auipc	a0,0x3
     35cc:	50050513          	addi	a0,a0,1280 # 6ac8 <malloc+0x1b5e>
     35d0:	4f6010ef          	jal	4ac6 <open>
-    if(fd >= 0){
     35d4:	04054063          	bltz	a0,3614 <openiputtest+0x74>
-      printf("%s: open directory for write succeeded\n", s);
     35d8:	85a6                	mv	a1,s1
     35da:	00003517          	auipc	a0,0x3
     35de:	50e50513          	addi	a0,a0,1294 # 6ae8 <malloc+0x1b7e>
     35e2:	0d5010ef          	jal	4eb6 <printf>
-      exit(1);
     35e6:	4505                	li	a0,1
     35e8:	49e010ef          	jal	4a86 <exit>
-    printf("%s: mkdir oidir failed\n", s);
     35ec:	85a6                	mv	a1,s1
     35ee:	00003517          	auipc	a0,0x3
     35f2:	4e250513          	addi	a0,a0,1250 # 6ad0 <malloc+0x1b66>
     35f6:	0c1010ef          	jal	4eb6 <printf>
-    exit(1);
     35fa:	4505                	li	a0,1
     35fc:	48a010ef          	jal	4a86 <exit>
-    printf("%s: fork failed\n", s);
     3600:	85a6                	mv	a1,s1
     3602:	00002517          	auipc	a0,0x2
     3606:	33650513          	addi	a0,a0,822 # 5938 <malloc+0x9ce>
     360a:	0ad010ef          	jal	4eb6 <printf>
-    exit(1);
     360e:	4505                	li	a0,1
     3610:	476010ef          	jal	4a86 <exit>
-    exit(0);
     3614:	4501                	li	a0,0
     3616:	470010ef          	jal	4a86 <exit>
-  sleep(1);
     361a:	4505                	li	a0,1
     361c:	4fa010ef          	jal	4b16 <sleep>
-  if(unlink("oidir") != 0){
     3620:	00003517          	auipc	a0,0x3
     3624:	4a850513          	addi	a0,a0,1192 # 6ac8 <malloc+0x1b5e>
     3628:	4ae010ef          	jal	4ad6 <unlink>
     362c:	c919                	beqz	a0,3642 <openiputtest+0xa2>
-    printf("%s: unlink failed\n", s);
     362e:	85a6                	mv	a1,s1
     3630:	00002517          	auipc	a0,0x2
     3634:	4f850513          	addi	a0,a0,1272 # 5b28 <malloc+0xbbe>
     3638:	07f010ef          	jal	4eb6 <printf>
-    exit(1);
     363c:	4505                	li	a0,1
     363e:	448010ef          	jal	4a86 <exit>
-  wait(&xstatus);
     3642:	fdc40513          	addi	a0,s0,-36
     3646:	448010ef          	jal	4a8e <wait>
-  exit(xstatus);
     364a:	fdc42503          	lw	a0,-36(s0)
     364e:	438010ef          	jal	4a86 <exit>
 
 0000000000003652 <forkforkfork>:
-{
     3652:	1101                	addi	sp,sp,-32
     3654:	ec06                	sd	ra,24(sp)
     3656:	e822                	sd	s0,16(sp)
     3658:	e426                	sd	s1,8(sp)
     365a:	1000                	addi	s0,sp,32
     365c:	84aa                	mv	s1,a0
-  unlink("stopforking");
     365e:	00003517          	auipc	a0,0x3
     3662:	4b250513          	addi	a0,a0,1202 # 6b10 <malloc+0x1ba6>
     3666:	470010ef          	jal	4ad6 <unlink>
-  int pid = fork();
     366a:	414010ef          	jal	4a7e <fork>
-  if(pid < 0){
     366e:	02054b63          	bltz	a0,36a4 <forkforkfork+0x52>
-  if(pid == 0){
     3672:	c139                	beqz	a0,36b8 <forkforkfork+0x66>
-  sleep(20); // two seconds
     3674:	4551                	li	a0,20
     3676:	4a0010ef          	jal	4b16 <sleep>
-  close(open("stopforking", O_CREATE|O_RDWR));
     367a:	20200593          	li	a1,514
     367e:	00003517          	auipc	a0,0x3
     3682:	49250513          	addi	a0,a0,1170 # 6b10 <malloc+0x1ba6>
     3686:	440010ef          	jal	4ac6 <open>
     368a:	424010ef          	jal	4aae <close>
-  wait(0);
     368e:	4501                	li	a0,0
     3690:	3fe010ef          	jal	4a8e <wait>
-  sleep(10); // one second
     3694:	4529                	li	a0,10
     3696:	480010ef          	jal	4b16 <sleep>
-}
     369a:	60e2                	ld	ra,24(sp)
     369c:	6442                	ld	s0,16(sp)
     369e:	64a2                	ld	s1,8(sp)
     36a0:	6105                	addi	sp,sp,32
     36a2:	8082                	ret
-    printf("%s: fork failed", s);
     36a4:	85a6                	mv	a1,s1
     36a6:	00002517          	auipc	a0,0x2
     36aa:	45250513          	addi	a0,a0,1106 # 5af8 <malloc+0xb8e>
     36ae:	009010ef          	jal	4eb6 <printf>
-    exit(1);
     36b2:	4505                	li	a0,1
     36b4:	3d2010ef          	jal	4a86 <exit>
-      int fd = open("stopforking", 0);
     36b8:	00003497          	auipc	s1,0x3
     36bc:	45848493          	addi	s1,s1,1112 # 6b10 <malloc+0x1ba6>
     36c0:	4581                	li	a1,0
     36c2:	8526                	mv	a0,s1
     36c4:	402010ef          	jal	4ac6 <open>
-      if(fd >= 0){
     36c8:	02055163          	bgez	a0,36ea <forkforkfork+0x98>
-      if(fork() < 0){
     36cc:	3b2010ef          	jal	4a7e <fork>
     36d0:	fe0558e3          	bgez	a0,36c0 <forkforkfork+0x6e>
-        close(open("stopforking", O_CREATE|O_RDWR));
     36d4:	20200593          	li	a1,514
     36d8:	00003517          	auipc	a0,0x3
     36dc:	43850513          	addi	a0,a0,1080 # 6b10 <malloc+0x1ba6>
     36e0:	3e6010ef          	jal	4ac6 <open>
     36e4:	3ca010ef          	jal	4aae <close>
     36e8:	bfe1                	j	36c0 <forkforkfork+0x6e>
-        exit(0);
     36ea:	4501                	li	a0,0
     36ec:	39a010ef          	jal	4a86 <exit>
 
 00000000000036f0 <killstatus>:
-{
     36f0:	7139                	addi	sp,sp,-64
     36f2:	fc06                	sd	ra,56(sp)
     36f4:	f822                	sd	s0,48(sp)
@@ -6098,56 +4585,39 @@ r_sp()
     36fe:	0080                	addi	s0,sp,64
     3700:	8a2a                	mv	s4,a0
     3702:	06400913          	li	s2,100
-    if(xst != -1) {
     3706:	59fd                	li	s3,-1
-    int pid1 = fork();
     3708:	376010ef          	jal	4a7e <fork>
     370c:	84aa                	mv	s1,a0
-    if(pid1 < 0){
     370e:	02054763          	bltz	a0,373c <killstatus+0x4c>
-    if(pid1 == 0){
     3712:	cd1d                	beqz	a0,3750 <killstatus+0x60>
-    sleep(1);
     3714:	4505                	li	a0,1
     3716:	400010ef          	jal	4b16 <sleep>
-    kill(pid1);
     371a:	8526                	mv	a0,s1
     371c:	39a010ef          	jal	4ab6 <kill>
-    wait(&xst);
     3720:	fcc40513          	addi	a0,s0,-52
     3724:	36a010ef          	jal	4a8e <wait>
-    if(xst != -1) {
     3728:	fcc42783          	lw	a5,-52(s0)
     372c:	03379563          	bne	a5,s3,3756 <killstatus+0x66>
-  for(int i = 0; i < 100; i++){
     3730:	397d                	addiw	s2,s2,-1
     3732:	fc091be3          	bnez	s2,3708 <killstatus+0x18>
-  exit(0);
     3736:	4501                	li	a0,0
     3738:	34e010ef          	jal	4a86 <exit>
-      printf("%s: fork failed\n", s);
     373c:	85d2                	mv	a1,s4
     373e:	00002517          	auipc	a0,0x2
     3742:	1fa50513          	addi	a0,a0,506 # 5938 <malloc+0x9ce>
     3746:	770010ef          	jal	4eb6 <printf>
-      exit(1);
     374a:	4505                	li	a0,1
     374c:	33a010ef          	jal	4a86 <exit>
-        getpid();
     3750:	3b6010ef          	jal	4b06 <getpid>
-      while(1) {
     3754:	bff5                	j	3750 <killstatus+0x60>
-       printf("%s: status should be -1\n", s);
     3756:	85d2                	mv	a1,s4
     3758:	00003517          	auipc	a0,0x3
     375c:	3c850513          	addi	a0,a0,968 # 6b20 <malloc+0x1bb6>
     3760:	756010ef          	jal	4eb6 <printf>
-       exit(1);
     3764:	4505                	li	a0,1
     3766:	320010ef          	jal	4a86 <exit>
 
 000000000000376a <preempt>:
-{
     376a:	7139                	addi	sp,sp,-64
     376c:	fc06                	sd	ra,56(sp)
     376e:	f822                	sd	s0,48(sp)
@@ -6157,54 +4627,36 @@ r_sp()
     3776:	e852                	sd	s4,16(sp)
     3778:	0080                	addi	s0,sp,64
     377a:	892a                	mv	s2,a0
-  pid1 = fork();
     377c:	302010ef          	jal	4a7e <fork>
-  if(pid1 < 0) {
     3780:	00054563          	bltz	a0,378a <preempt+0x20>
     3784:	84aa                	mv	s1,a0
-  if(pid1 == 0)
     3786:	ed01                	bnez	a0,379e <preempt+0x34>
-    for(;;)
     3788:	a001                	j	3788 <preempt+0x1e>
-    printf("%s: fork failed", s);
     378a:	85ca                	mv	a1,s2
     378c:	00002517          	auipc	a0,0x2
     3790:	36c50513          	addi	a0,a0,876 # 5af8 <malloc+0xb8e>
     3794:	722010ef          	jal	4eb6 <printf>
-    exit(1);
     3798:	4505                	li	a0,1
     379a:	2ec010ef          	jal	4a86 <exit>
-  pid2 = fork();
     379e:	2e0010ef          	jal	4a7e <fork>
     37a2:	89aa                	mv	s3,a0
-  if(pid2 < 0) {
     37a4:	00054463          	bltz	a0,37ac <preempt+0x42>
-  if(pid2 == 0)
     37a8:	ed01                	bnez	a0,37c0 <preempt+0x56>
-    for(;;)
     37aa:	a001                	j	37aa <preempt+0x40>
-    printf("%s: fork failed\n", s);
     37ac:	85ca                	mv	a1,s2
     37ae:	00002517          	auipc	a0,0x2
     37b2:	18a50513          	addi	a0,a0,394 # 5938 <malloc+0x9ce>
     37b6:	700010ef          	jal	4eb6 <printf>
-    exit(1);
     37ba:	4505                	li	a0,1
     37bc:	2ca010ef          	jal	4a86 <exit>
-  pipe(pfds);
     37c0:	fc840513          	addi	a0,s0,-56
     37c4:	2d2010ef          	jal	4a96 <pipe>
-  pid3 = fork();
     37c8:	2b6010ef          	jal	4a7e <fork>
     37cc:	8a2a                	mv	s4,a0
-  if(pid3 < 0) {
     37ce:	02054863          	bltz	a0,37fe <preempt+0x94>
-  if(pid3 == 0){
     37d2:	e921                	bnez	a0,3822 <preempt+0xb8>
-    close(pfds[0]);
     37d4:	fc842503          	lw	a0,-56(s0)
     37d8:	2d6010ef          	jal	4aae <close>
-    if(write(pfds[1], "x", 1) != 1)
     37dc:	4605                	li	a2,1
     37de:	00002597          	auipc	a1,0x2
     37e2:	93a58593          	addi	a1,a1,-1734 # 5118 <malloc+0x1ae>
@@ -6212,29 +4664,22 @@ r_sp()
     37ea:	2bc010ef          	jal	4aa6 <write>
     37ee:	4785                	li	a5,1
     37f0:	02f51163          	bne	a0,a5,3812 <preempt+0xa8>
-    close(pfds[1]);
     37f4:	fcc42503          	lw	a0,-52(s0)
     37f8:	2b6010ef          	jal	4aae <close>
-    for(;;)
     37fc:	a001                	j	37fc <preempt+0x92>
-     printf("%s: fork failed\n", s);
     37fe:	85ca                	mv	a1,s2
     3800:	00002517          	auipc	a0,0x2
     3804:	13850513          	addi	a0,a0,312 # 5938 <malloc+0x9ce>
     3808:	6ae010ef          	jal	4eb6 <printf>
-     exit(1);
     380c:	4505                	li	a0,1
     380e:	278010ef          	jal	4a86 <exit>
-      printf("%s: preempt write error", s);
     3812:	85ca                	mv	a1,s2
     3814:	00003517          	auipc	a0,0x3
     3818:	32c50513          	addi	a0,a0,812 # 6b40 <malloc+0x1bd6>
     381c:	69a010ef          	jal	4eb6 <printf>
     3820:	bfd1                	j	37f4 <preempt+0x8a>
-  close(pfds[1]);
     3822:	fcc42503          	lw	a0,-52(s0)
     3826:	288010ef          	jal	4aae <close>
-  if(read(pfds[0], buf, sizeof(buf)) != 1){
     382a:	660d                	lui	a2,0x3
     382c:	00009597          	auipc	a1,0x9
     3830:	44c58593          	addi	a1,a1,1100 # cc78 <buf>
@@ -6242,12 +4687,10 @@ r_sp()
     3838:	266010ef          	jal	4a9e <read>
     383c:	4785                	li	a5,1
     383e:	02f50163          	beq	a0,a5,3860 <preempt+0xf6>
-    printf("%s: preempt read error", s);
     3842:	85ca                	mv	a1,s2
     3844:	00003517          	auipc	a0,0x3
     3848:	31450513          	addi	a0,a0,788 # 6b58 <malloc+0x1bee>
     384c:	66a010ef          	jal	4eb6 <printf>
-}
     3850:	70e2                	ld	ra,56(sp)
     3852:	7442                	ld	s0,48(sp)
     3854:	74a2                	ld	s1,40(sp)
@@ -6256,39 +4699,29 @@ r_sp()
     385a:	6a42                	ld	s4,16(sp)
     385c:	6121                	addi	sp,sp,64
     385e:	8082                	ret
-  close(pfds[0]);
     3860:	fc842503          	lw	a0,-56(s0)
     3864:	24a010ef          	jal	4aae <close>
-  printf("kill... ");
     3868:	00003517          	auipc	a0,0x3
     386c:	30850513          	addi	a0,a0,776 # 6b70 <malloc+0x1c06>
     3870:	646010ef          	jal	4eb6 <printf>
-  kill(pid1);
     3874:	8526                	mv	a0,s1
     3876:	240010ef          	jal	4ab6 <kill>
-  kill(pid2);
     387a:	854e                	mv	a0,s3
     387c:	23a010ef          	jal	4ab6 <kill>
-  kill(pid3);
     3880:	8552                	mv	a0,s4
     3882:	234010ef          	jal	4ab6 <kill>
-  printf("wait... ");
     3886:	00003517          	auipc	a0,0x3
     388a:	2fa50513          	addi	a0,a0,762 # 6b80 <malloc+0x1c16>
     388e:	628010ef          	jal	4eb6 <printf>
-  wait(0);
     3892:	4501                	li	a0,0
     3894:	1fa010ef          	jal	4a8e <wait>
-  wait(0);
     3898:	4501                	li	a0,0
     389a:	1f4010ef          	jal	4a8e <wait>
-  wait(0);
     389e:	4501                	li	a0,0
     38a0:	1ee010ef          	jal	4a8e <wait>
     38a4:	b775                	j	3850 <preempt+0xe6>
 
 00000000000038a6 <reparent>:
-{
     38a6:	7179                	addi	sp,sp,-48
     38a8:	f406                	sd	ra,40(sp)
     38aa:	f022                	sd	s0,32(sp)
@@ -6298,59 +4731,42 @@ r_sp()
     38b2:	e052                	sd	s4,0(sp)
     38b4:	1800                	addi	s0,sp,48
     38b6:	89aa                	mv	s3,a0
-  int master_pid = getpid();
     38b8:	24e010ef          	jal	4b06 <getpid>
     38bc:	8a2a                	mv	s4,a0
     38be:	0c800913          	li	s2,200
-    int pid = fork();
     38c2:	1bc010ef          	jal	4a7e <fork>
     38c6:	84aa                	mv	s1,a0
-    if(pid < 0){
     38c8:	00054e63          	bltz	a0,38e4 <reparent+0x3e>
-    if(pid){
     38cc:	c121                	beqz	a0,390c <reparent+0x66>
-      if(wait(0) != pid){
     38ce:	4501                	li	a0,0
     38d0:	1be010ef          	jal	4a8e <wait>
     38d4:	02951263          	bne	a0,s1,38f8 <reparent+0x52>
-  for(int i = 0; i < 200; i++){
     38d8:	397d                	addiw	s2,s2,-1
     38da:	fe0914e3          	bnez	s2,38c2 <reparent+0x1c>
-  exit(0);
     38de:	4501                	li	a0,0
     38e0:	1a6010ef          	jal	4a86 <exit>
-      printf("%s: fork failed\n", s);
     38e4:	85ce                	mv	a1,s3
     38e6:	00002517          	auipc	a0,0x2
     38ea:	05250513          	addi	a0,a0,82 # 5938 <malloc+0x9ce>
     38ee:	5c8010ef          	jal	4eb6 <printf>
-      exit(1);
     38f2:	4505                	li	a0,1
     38f4:	192010ef          	jal	4a86 <exit>
-        printf("%s: wait wrong pid\n", s);
     38f8:	85ce                	mv	a1,s3
     38fa:	00002517          	auipc	a0,0x2
     38fe:	1c650513          	addi	a0,a0,454 # 5ac0 <malloc+0xb56>
     3902:	5b4010ef          	jal	4eb6 <printf>
-        exit(1);
     3906:	4505                	li	a0,1
     3908:	17e010ef          	jal	4a86 <exit>
-      int pid2 = fork();
     390c:	172010ef          	jal	4a7e <fork>
-      if(pid2 < 0){
     3910:	00054563          	bltz	a0,391a <reparent+0x74>
-      exit(0);
     3914:	4501                	li	a0,0
     3916:	170010ef          	jal	4a86 <exit>
-        kill(master_pid);
     391a:	8552                	mv	a0,s4
     391c:	19a010ef          	jal	4ab6 <kill>
-        exit(1);
     3920:	4505                	li	a0,1
     3922:	164010ef          	jal	4a86 <exit>
 
 0000000000003926 <sbrkfail>:
-{
     3926:	7119                	addi	sp,sp,-128
     3928:	fc86                	sd	ra,120(sp)
     392a:	f8a2                	sd	s0,112(sp)
@@ -6361,93 +4777,69 @@ r_sp()
     3934:	e4d6                	sd	s5,72(sp)
     3936:	0100                	addi	s0,sp,128
     3938:	8aaa                	mv	s5,a0
-  if(pipe(fds) != 0){
     393a:	fb040513          	addi	a0,s0,-80
     393e:	158010ef          	jal	4a96 <pipe>
     3942:	e901                	bnez	a0,3952 <sbrkfail+0x2c>
     3944:	f8040493          	addi	s1,s0,-128
     3948:	fa840993          	addi	s3,s0,-88
     394c:	8926                	mv	s2,s1
-    if(pids[i] != -1)
     394e:	5a7d                	li	s4,-1
     3950:	a0a1                	j	3998 <sbrkfail+0x72>
-    printf("%s: pipe() failed\n", s);
     3952:	85d6                	mv	a1,s5
     3954:	00002517          	auipc	a0,0x2
     3958:	0ec50513          	addi	a0,a0,236 # 5a40 <malloc+0xad6>
     395c:	55a010ef          	jal	4eb6 <printf>
-    exit(1);
     3960:	4505                	li	a0,1
     3962:	124010ef          	jal	4a86 <exit>
-      sbrk(BIG - (uint64)sbrk(0));
     3966:	1a8010ef          	jal	4b0e <sbrk>
     396a:	064007b7          	lui	a5,0x6400
     396e:	40a7853b          	subw	a0,a5,a0
     3972:	19c010ef          	jal	4b0e <sbrk>
-      write(fds[1], "x", 1);
     3976:	4605                	li	a2,1
     3978:	00001597          	auipc	a1,0x1
     397c:	7a058593          	addi	a1,a1,1952 # 5118 <malloc+0x1ae>
     3980:	fb442503          	lw	a0,-76(s0)
     3984:	122010ef          	jal	4aa6 <write>
-      for(;;) sleep(1000);
     3988:	3e800513          	li	a0,1000
     398c:	18a010ef          	jal	4b16 <sleep>
     3990:	bfe5                	j	3988 <sbrkfail+0x62>
-  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
     3992:	0911                	addi	s2,s2,4
     3994:	03390163          	beq	s2,s3,39b6 <sbrkfail+0x90>
-    if((pids[i] = fork()) == 0){
     3998:	0e6010ef          	jal	4a7e <fork>
     399c:	00a92023          	sw	a0,0(s2)
     39a0:	d179                	beqz	a0,3966 <sbrkfail+0x40>
-    if(pids[i] != -1)
     39a2:	ff4508e3          	beq	a0,s4,3992 <sbrkfail+0x6c>
-      read(fds[0], &scratch, 1);
     39a6:	4605                	li	a2,1
     39a8:	faf40593          	addi	a1,s0,-81
     39ac:	fb042503          	lw	a0,-80(s0)
     39b0:	0ee010ef          	jal	4a9e <read>
     39b4:	bff9                	j	3992 <sbrkfail+0x6c>
-  c = sbrk(PGSIZE);
     39b6:	6505                	lui	a0,0x1
     39b8:	156010ef          	jal	4b0e <sbrk>
     39bc:	8a2a                	mv	s4,a0
-    if(pids[i] == -1)
     39be:	597d                	li	s2,-1
     39c0:	a021                	j	39c8 <sbrkfail+0xa2>
-  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
     39c2:	0491                	addi	s1,s1,4
     39c4:	01348b63          	beq	s1,s3,39da <sbrkfail+0xb4>
-    if(pids[i] == -1)
     39c8:	4088                	lw	a0,0(s1)
     39ca:	ff250ce3          	beq	a0,s2,39c2 <sbrkfail+0x9c>
-    kill(pids[i]);
     39ce:	0e8010ef          	jal	4ab6 <kill>
-    wait(0);
     39d2:	4501                	li	a0,0
     39d4:	0ba010ef          	jal	4a8e <wait>
     39d8:	b7ed                	j	39c2 <sbrkfail+0x9c>
-  if(c == (char*)0xffffffffffffffffL){
     39da:	57fd                	li	a5,-1
     39dc:	02fa0d63          	beq	s4,a5,3a16 <sbrkfail+0xf0>
-  pid = fork();
     39e0:	09e010ef          	jal	4a7e <fork>
     39e4:	84aa                	mv	s1,a0
-  if(pid < 0){
     39e6:	04054263          	bltz	a0,3a2a <sbrkfail+0x104>
-  if(pid == 0){
     39ea:	c931                	beqz	a0,3a3e <sbrkfail+0x118>
-  wait(&xstatus);
     39ec:	fbc40513          	addi	a0,s0,-68
     39f0:	09e010ef          	jal	4a8e <wait>
-  if(xstatus != -1 && xstatus != 2)
     39f4:	fbc42783          	lw	a5,-68(s0)
     39f8:	577d                	li	a4,-1
     39fa:	00e78563          	beq	a5,a4,3a04 <sbrkfail+0xde>
     39fe:	4709                	li	a4,2
     3a00:	06e79d63          	bne	a5,a4,3a7a <sbrkfail+0x154>
-}
     3a04:	70e6                	ld	ra,120(sp)
     3a06:	7446                	ld	s0,112(sp)
     3a08:	74a6                	ld	s1,104(sp)
@@ -6457,55 +4849,42 @@ r_sp()
     3a10:	6aa6                	ld	s5,72(sp)
     3a12:	6109                	addi	sp,sp,128
     3a14:	8082                	ret
-    printf("%s: failed sbrk leaked memory\n", s);
     3a16:	85d6                	mv	a1,s5
     3a18:	00003517          	auipc	a0,0x3
     3a1c:	17850513          	addi	a0,a0,376 # 6b90 <malloc+0x1c26>
     3a20:	496010ef          	jal	4eb6 <printf>
-    exit(1);
     3a24:	4505                	li	a0,1
     3a26:	060010ef          	jal	4a86 <exit>
-    printf("%s: fork failed\n", s);
     3a2a:	85d6                	mv	a1,s5
     3a2c:	00002517          	auipc	a0,0x2
     3a30:	f0c50513          	addi	a0,a0,-244 # 5938 <malloc+0x9ce>
     3a34:	482010ef          	jal	4eb6 <printf>
-    exit(1);
     3a38:	4505                	li	a0,1
     3a3a:	04c010ef          	jal	4a86 <exit>
-    a = sbrk(0);
     3a3e:	4501                	li	a0,0
     3a40:	0ce010ef          	jal	4b0e <sbrk>
     3a44:	892a                	mv	s2,a0
-    sbrk(10*BIG);
     3a46:	3e800537          	lui	a0,0x3e800
     3a4a:	0c4010ef          	jal	4b0e <sbrk>
-    for (i = 0; i < 10*BIG; i += PGSIZE) {
     3a4e:	87ca                	mv	a5,s2
     3a50:	3e800737          	lui	a4,0x3e800
     3a54:	993a                	add	s2,s2,a4
     3a56:	6705                	lui	a4,0x1
-      n += *(a+i);
     3a58:	0007c683          	lbu	a3,0(a5) # 6400000 <base+0x63f0388>
     3a5c:	9cb5                	addw	s1,s1,a3
-    for (i = 0; i < 10*BIG; i += PGSIZE) {
     3a5e:	97ba                	add	a5,a5,a4
     3a60:	fef91ce3          	bne	s2,a5,3a58 <sbrkfail+0x132>
-    printf("%s: allocate a lot of memory succeeded %d\n", s, n);
     3a64:	8626                	mv	a2,s1
     3a66:	85d6                	mv	a1,s5
     3a68:	00003517          	auipc	a0,0x3
     3a6c:	14850513          	addi	a0,a0,328 # 6bb0 <malloc+0x1c46>
     3a70:	446010ef          	jal	4eb6 <printf>
-    exit(1);
     3a74:	4505                	li	a0,1
     3a76:	010010ef          	jal	4a86 <exit>
-    exit(1);
     3a7a:	4505                	li	a0,1
     3a7c:	00a010ef          	jal	4a86 <exit>
 
 0000000000003a80 <mem>:
-{
     3a80:	7139                	addi	sp,sp,-64
     3a82:	fc06                	sd	ra,56(sp)
     3a84:	f822                	sd	s0,48(sp)
@@ -6514,81 +4893,56 @@ r_sp()
     3a8a:	ec4e                	sd	s3,24(sp)
     3a8c:	0080                	addi	s0,sp,64
     3a8e:	89aa                	mv	s3,a0
-  if((pid = fork()) == 0){
     3a90:	7ef000ef          	jal	4a7e <fork>
-    m1 = 0;
     3a94:	4481                	li	s1,0
-    while((m2 = malloc(10001)) != 0){
     3a96:	6909                	lui	s2,0x2
     3a98:	71190913          	addi	s2,s2,1809 # 2711 <fourteen+0x79>
-  if((pid = fork()) == 0){
     3a9c:	cd11                	beqz	a0,3ab8 <mem+0x38>
-    wait(&xstatus);
     3a9e:	fcc40513          	addi	a0,s0,-52
     3aa2:	7ed000ef          	jal	4a8e <wait>
-    if(xstatus == -1){
     3aa6:	fcc42503          	lw	a0,-52(s0)
     3aaa:	57fd                	li	a5,-1
     3aac:	04f50363          	beq	a0,a5,3af2 <mem+0x72>
-    exit(xstatus);
     3ab0:	7d7000ef          	jal	4a86 <exit>
-      *(char**)m2 = m1;
     3ab4:	e104                	sd	s1,0(a0)
-      m1 = m2;
     3ab6:	84aa                	mv	s1,a0
-    while((m2 = malloc(10001)) != 0){
     3ab8:	854a                	mv	a0,s2
     3aba:	4b0010ef          	jal	4f6a <malloc>
     3abe:	f97d                	bnez	a0,3ab4 <mem+0x34>
-    while(m1){
     3ac0:	c491                	beqz	s1,3acc <mem+0x4c>
-      m2 = *(char**)m1;
     3ac2:	8526                	mv	a0,s1
     3ac4:	6084                	ld	s1,0(s1)
-      free(m1);
     3ac6:	422010ef          	jal	4ee8 <free>
-    while(m1){
     3aca:	fce5                	bnez	s1,3ac2 <mem+0x42>
-    m1 = malloc(1024*20);
     3acc:	6515                	lui	a0,0x5
     3ace:	49c010ef          	jal	4f6a <malloc>
-    if(m1 == 0){
     3ad2:	c511                	beqz	a0,3ade <mem+0x5e>
-    free(m1);
     3ad4:	414010ef          	jal	4ee8 <free>
-    exit(0);
     3ad8:	4501                	li	a0,0
     3ada:	7ad000ef          	jal	4a86 <exit>
-      printf("%s: couldn't allocate mem?!!\n", s);
     3ade:	85ce                	mv	a1,s3
     3ae0:	00003517          	auipc	a0,0x3
     3ae4:	10050513          	addi	a0,a0,256 # 6be0 <malloc+0x1c76>
     3ae8:	3ce010ef          	jal	4eb6 <printf>
-      exit(1);
     3aec:	4505                	li	a0,1
     3aee:	799000ef          	jal	4a86 <exit>
-      exit(0);
     3af2:	4501                	li	a0,0
     3af4:	793000ef          	jal	4a86 <exit>
 
 0000000000003af8 <sharedfd>:
-{
     3af8:	7159                	addi	sp,sp,-112
     3afa:	f486                	sd	ra,104(sp)
     3afc:	f0a2                	sd	s0,96(sp)
     3afe:	e0d2                	sd	s4,64(sp)
     3b00:	1880                	addi	s0,sp,112
     3b02:	8a2a                	mv	s4,a0
-  unlink("sharedfd");
     3b04:	00003517          	auipc	a0,0x3
     3b08:	0fc50513          	addi	a0,a0,252 # 6c00 <malloc+0x1c96>
     3b0c:	7cb000ef          	jal	4ad6 <unlink>
-  fd = open("sharedfd", O_CREATE|O_RDWR);
     3b10:	20200593          	li	a1,514
     3b14:	00003517          	auipc	a0,0x3
     3b18:	0ec50513          	addi	a0,a0,236 # 6c00 <malloc+0x1c96>
     3b1c:	7ab000ef          	jal	4ac6 <open>
-  if(fd < 0){
     3b20:	04054863          	bltz	a0,3b70 <sharedfd+0x78>
     3b24:	eca6                	sd	s1,88(sp)
     3b26:	e8ca                	sd	s2,80(sp)
@@ -6597,10 +4951,8 @@ r_sp()
     3b2c:	f85a                	sd	s6,48(sp)
     3b2e:	f45e                	sd	s7,40(sp)
     3b30:	892a                	mv	s2,a0
-  pid = fork();
     3b32:	74d000ef          	jal	4a7e <fork>
     3b36:	89aa                	mv	s3,a0
-  memset(buf, pid==0?'c':'p', sizeof(buf));
     3b38:	07000593          	li	a1,112
     3b3c:	e119                	bnez	a0,3b42 <sharedfd+0x4a>
     3b3e:	06300593          	li	a1,99
@@ -6608,19 +4960,15 @@ r_sp()
     3b44:	fa040513          	addi	a0,s0,-96
     3b48:	559000ef          	jal	48a0 <memset>
     3b4c:	3e800493          	li	s1,1000
-    if(write(fd, buf, sizeof(buf)) != sizeof(buf)){
     3b50:	4629                	li	a2,10
     3b52:	fa040593          	addi	a1,s0,-96
     3b56:	854a                	mv	a0,s2
     3b58:	74f000ef          	jal	4aa6 <write>
     3b5c:	47a9                	li	a5,10
     3b5e:	02f51963          	bne	a0,a5,3b90 <sharedfd+0x98>
-  for(i = 0; i < N; i++){
     3b62:	34fd                	addiw	s1,s1,-1
     3b64:	f4f5                	bnez	s1,3b50 <sharedfd+0x58>
-  if(pid == 0) {
     3b66:	02099f63          	bnez	s3,3ba4 <sharedfd+0xac>
-    exit(0);
     3b6a:	4501                	li	a0,0
     3b6c:	71b000ef          	jal	4a86 <exit>
     3b70:	eca6                	sd	s1,88(sp)
@@ -6629,50 +4977,36 @@ r_sp()
     3b76:	fc56                	sd	s5,56(sp)
     3b78:	f85a                	sd	s6,48(sp)
     3b7a:	f45e                	sd	s7,40(sp)
-    printf("%s: cannot open sharedfd for writing", s);
     3b7c:	85d2                	mv	a1,s4
     3b7e:	00003517          	auipc	a0,0x3
     3b82:	09250513          	addi	a0,a0,146 # 6c10 <malloc+0x1ca6>
     3b86:	330010ef          	jal	4eb6 <printf>
-    exit(1);
     3b8a:	4505                	li	a0,1
     3b8c:	6fb000ef          	jal	4a86 <exit>
-      printf("%s: write sharedfd failed\n", s);
     3b90:	85d2                	mv	a1,s4
     3b92:	00003517          	auipc	a0,0x3
     3b96:	0a650513          	addi	a0,a0,166 # 6c38 <malloc+0x1cce>
     3b9a:	31c010ef          	jal	4eb6 <printf>
-      exit(1);
     3b9e:	4505                	li	a0,1
     3ba0:	6e7000ef          	jal	4a86 <exit>
-    wait(&xstatus);
     3ba4:	f9c40513          	addi	a0,s0,-100
     3ba8:	6e7000ef          	jal	4a8e <wait>
-    if(xstatus != 0)
     3bac:	f9c42983          	lw	s3,-100(s0)
     3bb0:	00098563          	beqz	s3,3bba <sharedfd+0xc2>
-      exit(xstatus);
     3bb4:	854e                	mv	a0,s3
     3bb6:	6d1000ef          	jal	4a86 <exit>
-  close(fd);
     3bba:	854a                	mv	a0,s2
     3bbc:	6f3000ef          	jal	4aae <close>
-  fd = open("sharedfd", 0);
     3bc0:	4581                	li	a1,0
     3bc2:	00003517          	auipc	a0,0x3
     3bc6:	03e50513          	addi	a0,a0,62 # 6c00 <malloc+0x1c96>
     3bca:	6fd000ef          	jal	4ac6 <open>
     3bce:	8baa                	mv	s7,a0
-  nc = np = 0;
     3bd0:	8ace                	mv	s5,s3
-  if(fd < 0){
     3bd2:	02054363          	bltz	a0,3bf8 <sharedfd+0x100>
     3bd6:	faa40913          	addi	s2,s0,-86
-      if(buf[i] == 'c')
     3bda:	06300493          	li	s1,99
-      if(buf[i] == 'p')
     3bde:	07000b13          	li	s6,112
-  while((n = read(fd, buf, sizeof(buf))) > 0){
     3be2:	4629                	li	a2,10
     3be4:	fa040593          	addi	a1,s0,-96
     3be8:	855e                	mv	a0,s7
@@ -6680,55 +5014,41 @@ r_sp()
     3bee:	02a05b63          	blez	a0,3c24 <sharedfd+0x12c>
     3bf2:	fa040793          	addi	a5,s0,-96
     3bf6:	a839                	j	3c14 <sharedfd+0x11c>
-    printf("%s: cannot open sharedfd for reading\n", s);
     3bf8:	85d2                	mv	a1,s4
     3bfa:	00003517          	auipc	a0,0x3
     3bfe:	05e50513          	addi	a0,a0,94 # 6c58 <malloc+0x1cee>
     3c02:	2b4010ef          	jal	4eb6 <printf>
-    exit(1);
     3c06:	4505                	li	a0,1
     3c08:	67f000ef          	jal	4a86 <exit>
-        nc++;
     3c0c:	2985                	addiw	s3,s3,1
-    for(i = 0; i < sizeof(buf); i++){
     3c0e:	0785                	addi	a5,a5,1
     3c10:	fd2789e3          	beq	a5,s2,3be2 <sharedfd+0xea>
-      if(buf[i] == 'c')
     3c14:	0007c703          	lbu	a4,0(a5)
     3c18:	fe970ae3          	beq	a4,s1,3c0c <sharedfd+0x114>
-      if(buf[i] == 'p')
     3c1c:	ff6719e3          	bne	a4,s6,3c0e <sharedfd+0x116>
-        np++;
     3c20:	2a85                	addiw	s5,s5,1
     3c22:	b7f5                	j	3c0e <sharedfd+0x116>
-  close(fd);
     3c24:	855e                	mv	a0,s7
     3c26:	689000ef          	jal	4aae <close>
-  unlink("sharedfd");
     3c2a:	00003517          	auipc	a0,0x3
     3c2e:	fd650513          	addi	a0,a0,-42 # 6c00 <malloc+0x1c96>
     3c32:	6a5000ef          	jal	4ad6 <unlink>
-  if(nc == N*SZ && np == N*SZ){
     3c36:	6789                	lui	a5,0x2
     3c38:	71078793          	addi	a5,a5,1808 # 2710 <fourteen+0x78>
     3c3c:	00f99763          	bne	s3,a5,3c4a <sharedfd+0x152>
     3c40:	6789                	lui	a5,0x2
     3c42:	71078793          	addi	a5,a5,1808 # 2710 <fourteen+0x78>
     3c46:	00fa8c63          	beq	s5,a5,3c5e <sharedfd+0x166>
-    printf("%s: nc/np test fails\n", s);
     3c4a:	85d2                	mv	a1,s4
     3c4c:	00003517          	auipc	a0,0x3
     3c50:	03450513          	addi	a0,a0,52 # 6c80 <malloc+0x1d16>
     3c54:	262010ef          	jal	4eb6 <printf>
-    exit(1);
     3c58:	4505                	li	a0,1
     3c5a:	62d000ef          	jal	4a86 <exit>
-    exit(0);
     3c5e:	4501                	li	a0,0
     3c60:	627000ef          	jal	4a86 <exit>
 
 0000000000003c64 <fourfiles>:
-{
     3c64:	7135                	addi	sp,sp,-160
     3c66:	ed06                	sd	ra,152(sp)
     3c68:	e922                	sd	s0,144(sp)
@@ -6745,7 +5065,6 @@ r_sp()
     3c7e:	fc6e                	sd	s11,56(sp)
     3c80:	1100                	addi	s0,sp,160
     3c82:	8caa                	mv	s9,a0
-  char *names[] = { "f0", "f1", "f2", "f3" };
     3c84:	00003797          	auipc	a5,0x3
     3c88:	01478793          	addi	a5,a5,20 # 6c98 <malloc+0x1d2e>
     3c8c:	f6f43823          	sd	a5,-144(s0)
@@ -6758,71 +5077,50 @@ r_sp()
     3ca8:	00003797          	auipc	a5,0x3
     3cac:	00878793          	addi	a5,a5,8 # 6cb0 <malloc+0x1d46>
     3cb0:	f8f43423          	sd	a5,-120(s0)
-  for(pi = 0; pi < NCHILD; pi++){
     3cb4:	f7040b93          	addi	s7,s0,-144
-  char *names[] = { "f0", "f1", "f2", "f3" };
     3cb8:	895e                	mv	s2,s7
-  for(pi = 0; pi < NCHILD; pi++){
     3cba:	4481                	li	s1,0
     3cbc:	4a11                	li	s4,4
-    fname = names[pi];
     3cbe:	00093983          	ld	s3,0(s2)
-    unlink(fname);
     3cc2:	854e                	mv	a0,s3
     3cc4:	613000ef          	jal	4ad6 <unlink>
-    pid = fork();
     3cc8:	5b7000ef          	jal	4a7e <fork>
-    if(pid < 0){
     3ccc:	02054e63          	bltz	a0,3d08 <fourfiles+0xa4>
-    if(pid == 0){
     3cd0:	c531                	beqz	a0,3d1c <fourfiles+0xb8>
-  for(pi = 0; pi < NCHILD; pi++){
     3cd2:	2485                	addiw	s1,s1,1
     3cd4:	0921                	addi	s2,s2,8
     3cd6:	ff4494e3          	bne	s1,s4,3cbe <fourfiles+0x5a>
     3cda:	4491                	li	s1,4
-    wait(&xstatus);
     3cdc:	f6c40513          	addi	a0,s0,-148
     3ce0:	5af000ef          	jal	4a8e <wait>
-    if(xstatus != 0)
     3ce4:	f6c42a83          	lw	s5,-148(s0)
     3ce8:	0a0a9463          	bnez	s5,3d90 <fourfiles+0x12c>
-  for(pi = 0; pi < NCHILD; pi++){
     3cec:	34fd                	addiw	s1,s1,-1
     3cee:	f4fd                	bnez	s1,3cdc <fourfiles+0x78>
     3cf0:	03000b13          	li	s6,48
-    while((n = read(fd, buf, sizeof(buf))) > 0){
     3cf4:	00009a17          	auipc	s4,0x9
     3cf8:	f84a0a13          	addi	s4,s4,-124 # cc78 <buf>
-    if(total != N*SZ){
     3cfc:	6d05                	lui	s10,0x1
     3cfe:	770d0d13          	addi	s10,s10,1904 # 1770 <forkfork+0x1a>
-  for(i = 0; i < NCHILD; i++){
     3d02:	03400d93          	li	s11,52
     3d06:	a0ed                	j	3df0 <fourfiles+0x18c>
-      printf("%s: fork failed\n", s);
     3d08:	85e6                	mv	a1,s9
     3d0a:	00002517          	auipc	a0,0x2
     3d0e:	c2e50513          	addi	a0,a0,-978 # 5938 <malloc+0x9ce>
     3d12:	1a4010ef          	jal	4eb6 <printf>
-      exit(1);
     3d16:	4505                	li	a0,1
     3d18:	56f000ef          	jal	4a86 <exit>
-      fd = open(fname, O_CREATE | O_RDWR);
     3d1c:	20200593          	li	a1,514
     3d20:	854e                	mv	a0,s3
     3d22:	5a5000ef          	jal	4ac6 <open>
     3d26:	892a                	mv	s2,a0
-      if(fd < 0){
     3d28:	04054163          	bltz	a0,3d6a <fourfiles+0x106>
-      memset(buf, '0'+pi, SZ);
     3d2c:	1f400613          	li	a2,500
     3d30:	0304859b          	addiw	a1,s1,48
     3d34:	00009517          	auipc	a0,0x9
     3d38:	f4450513          	addi	a0,a0,-188 # cc78 <buf>
     3d3c:	365000ef          	jal	48a0 <memset>
     3d40:	44b1                	li	s1,12
-        if((n = write(fd, buf, SZ)) != SZ){
     3d42:	00009997          	auipc	s3,0x9
     3d46:	f3698993          	addi	s3,s3,-202 # cc78 <buf>
     3d4a:	1f400613          	li	a2,500
@@ -6832,41 +5130,30 @@ r_sp()
     3d56:	85aa                	mv	a1,a0
     3d58:	1f400793          	li	a5,500
     3d5c:	02f51163          	bne	a0,a5,3d7e <fourfiles+0x11a>
-      for(i = 0; i < N; i++){
     3d60:	34fd                	addiw	s1,s1,-1
     3d62:	f4e5                	bnez	s1,3d4a <fourfiles+0xe6>
-      exit(0);
     3d64:	4501                	li	a0,0
     3d66:	521000ef          	jal	4a86 <exit>
-        printf("%s: create failed\n", s);
     3d6a:	85e6                	mv	a1,s9
     3d6c:	00002517          	auipc	a0,0x2
     3d70:	c6450513          	addi	a0,a0,-924 # 59d0 <malloc+0xa66>
     3d74:	142010ef          	jal	4eb6 <printf>
-        exit(1);
     3d78:	4505                	li	a0,1
     3d7a:	50d000ef          	jal	4a86 <exit>
-          printf("write failed %d\n", n);
     3d7e:	00003517          	auipc	a0,0x3
     3d82:	f3a50513          	addi	a0,a0,-198 # 6cb8 <malloc+0x1d4e>
     3d86:	130010ef          	jal	4eb6 <printf>
-          exit(1);
     3d8a:	4505                	li	a0,1
     3d8c:	4fb000ef          	jal	4a86 <exit>
-      exit(xstatus);
     3d90:	8556                	mv	a0,s5
     3d92:	4f5000ef          	jal	4a86 <exit>
-          printf("%s: wrong char\n", s);
     3d96:	85e6                	mv	a1,s9
     3d98:	00003517          	auipc	a0,0x3
     3d9c:	f3850513          	addi	a0,a0,-200 # 6cd0 <malloc+0x1d66>
     3da0:	116010ef          	jal	4eb6 <printf>
-          exit(1);
     3da4:	4505                	li	a0,1
     3da6:	4e1000ef          	jal	4a86 <exit>
-      total += n;
     3daa:	00a9093b          	addw	s2,s2,a0
-    while((n = read(fd, buf, sizeof(buf))) > 0){
     3dae:	660d                	lui	a2,0x3
     3db0:	85d2                	mv	a1,s4
     3db2:	854e                	mv	a0,s3
@@ -6875,47 +5162,33 @@ r_sp()
     3dbc:	00009797          	auipc	a5,0x9
     3dc0:	ebc78793          	addi	a5,a5,-324 # cc78 <buf>
     3dc4:	00f506b3          	add	a3,a0,a5
-        if(buf[j] != '0'+i){
     3dc8:	0007c703          	lbu	a4,0(a5)
     3dcc:	fc9715e3          	bne	a4,s1,3d96 <fourfiles+0x132>
-      for(j = 0; j < n; j++){
     3dd0:	0785                	addi	a5,a5,1
     3dd2:	fed79be3          	bne	a5,a3,3dc8 <fourfiles+0x164>
     3dd6:	bfd1                	j	3daa <fourfiles+0x146>
-    close(fd);
     3dd8:	854e                	mv	a0,s3
     3dda:	4d5000ef          	jal	4aae <close>
-    if(total != N*SZ){
     3dde:	03a91463          	bne	s2,s10,3e06 <fourfiles+0x1a2>
-    unlink(fname);
     3de2:	8562                	mv	a0,s8
     3de4:	4f3000ef          	jal	4ad6 <unlink>
-  for(i = 0; i < NCHILD; i++){
     3de8:	0ba1                	addi	s7,s7,8
     3dea:	2b05                	addiw	s6,s6,1
     3dec:	03bb0763          	beq	s6,s11,3e1a <fourfiles+0x1b6>
-    fname = names[i];
     3df0:	000bbc03          	ld	s8,0(s7)
-    fd = open(fname, 0);
     3df4:	4581                	li	a1,0
     3df6:	8562                	mv	a0,s8
     3df8:	4cf000ef          	jal	4ac6 <open>
     3dfc:	89aa                	mv	s3,a0
-    total = 0;
     3dfe:	8956                	mv	s2,s5
-        if(buf[j] != '0'+i){
     3e00:	000b049b          	sext.w	s1,s6
-    while((n = read(fd, buf, sizeof(buf))) > 0){
     3e04:	b76d                	j	3dae <fourfiles+0x14a>
-      printf("wrong length %d\n", total);
     3e06:	85ca                	mv	a1,s2
     3e08:	00003517          	auipc	a0,0x3
     3e0c:	ed850513          	addi	a0,a0,-296 # 6ce0 <malloc+0x1d76>
     3e10:	0a6010ef          	jal	4eb6 <printf>
-      exit(1);
     3e14:	4505                	li	a0,1
     3e16:	471000ef          	jal	4a86 <exit>
-}
     3e1a:	60ea                	ld	ra,152(sp)
     3e1c:	644a                	ld	s0,144(sp)
     3e1e:	64aa                	ld	s1,136(sp)
@@ -6933,7 +5206,6 @@ r_sp()
     3e36:	8082                	ret
 
 0000000000003e38 <concreate>:
-{
     3e38:	7135                	addi	sp,sp,-160
     3e3a:	ed06                	sd	ra,152(sp)
     3e3c:	e922                	sd	s0,144(sp)
@@ -6946,266 +5218,190 @@ r_sp()
     3e4a:	ecde                	sd	s7,88(sp)
     3e4c:	1100                	addi	s0,sp,160
     3e4e:	89aa                	mv	s3,a0
-  file[0] = 'C';
     3e50:	04300793          	li	a5,67
     3e54:	faf40423          	sb	a5,-88(s0)
-  file[2] = '\0';
     3e58:	fa040523          	sb	zero,-86(s0)
-  for(i = 0; i < N; i++){
     3e5c:	4901                	li	s2,0
-    if(pid && (i % 3) == 1){
     3e5e:	4b0d                	li	s6,3
     3e60:	4a85                	li	s5,1
-      link("C0", file);
     3e62:	00003b97          	auipc	s7,0x3
     3e66:	e96b8b93          	addi	s7,s7,-362 # 6cf8 <malloc+0x1d8e>
-  for(i = 0; i < N; i++){
     3e6a:	02800a13          	li	s4,40
     3e6e:	a41d                	j	4094 <concreate+0x25c>
-      link("C0", file);
     3e70:	fa840593          	addi	a1,s0,-88
     3e74:	855e                	mv	a0,s7
     3e76:	471000ef          	jal	4ae6 <link>
-    if(pid == 0) {
     3e7a:	a411                	j	407e <concreate+0x246>
-    } else if(pid == 0 && (i % 5) == 1){
     3e7c:	4795                	li	a5,5
     3e7e:	02f9693b          	remw	s2,s2,a5
     3e82:	4785                	li	a5,1
     3e84:	02f90563          	beq	s2,a5,3eae <concreate+0x76>
-      fd = open(file, O_CREATE | O_RDWR);
     3e88:	20200593          	li	a1,514
     3e8c:	fa840513          	addi	a0,s0,-88
     3e90:	437000ef          	jal	4ac6 <open>
-      if(fd < 0){
     3e94:	1e055063          	bgez	a0,4074 <concreate+0x23c>
-        printf("concreate create %s failed\n", file);
     3e98:	fa840593          	addi	a1,s0,-88
     3e9c:	00003517          	auipc	a0,0x3
     3ea0:	e6450513          	addi	a0,a0,-412 # 6d00 <malloc+0x1d96>
     3ea4:	012010ef          	jal	4eb6 <printf>
-        exit(1);
     3ea8:	4505                	li	a0,1
     3eaa:	3dd000ef          	jal	4a86 <exit>
-      link("C0", file);
     3eae:	fa840593          	addi	a1,s0,-88
     3eb2:	00003517          	auipc	a0,0x3
     3eb6:	e4650513          	addi	a0,a0,-442 # 6cf8 <malloc+0x1d8e>
     3eba:	42d000ef          	jal	4ae6 <link>
-      exit(0);
     3ebe:	4501                	li	a0,0
     3ec0:	3c7000ef          	jal	4a86 <exit>
-        exit(1);
     3ec4:	4505                	li	a0,1
     3ec6:	3c1000ef          	jal	4a86 <exit>
-  memset(fa, 0, sizeof(fa));
     3eca:	02800613          	li	a2,40
     3ece:	4581                	li	a1,0
     3ed0:	f8040513          	addi	a0,s0,-128
     3ed4:	1cd000ef          	jal	48a0 <memset>
-  fd = open(".", 0);
     3ed8:	4581                	li	a1,0
     3eda:	00002517          	auipc	a0,0x2
     3ede:	8b650513          	addi	a0,a0,-1866 # 5790 <malloc+0x826>
     3ee2:	3e5000ef          	jal	4ac6 <open>
     3ee6:	892a                	mv	s2,a0
-  n = 0;
     3ee8:	8aa6                	mv	s5,s1
-    if(de.name[0] == 'C' && de.name[2] == '\0'){
     3eea:	04300a13          	li	s4,67
-      if(i < 0 || i >= sizeof(fa)){
     3eee:	02700b13          	li	s6,39
-      fa[i] = 1;
     3ef2:	4b85                	li	s7,1
-  while(read(fd, &de, sizeof(de)) > 0){
     3ef4:	4641                	li	a2,16
     3ef6:	f7040593          	addi	a1,s0,-144
     3efa:	854a                	mv	a0,s2
     3efc:	3a3000ef          	jal	4a9e <read>
     3f00:	06a05a63          	blez	a0,3f74 <concreate+0x13c>
-    if(de.inum == 0)
     3f04:	f7045783          	lhu	a5,-144(s0)
     3f08:	d7f5                	beqz	a5,3ef4 <concreate+0xbc>
-    if(de.name[0] == 'C' && de.name[2] == '\0'){
     3f0a:	f7244783          	lbu	a5,-142(s0)
     3f0e:	ff4793e3          	bne	a5,s4,3ef4 <concreate+0xbc>
     3f12:	f7444783          	lbu	a5,-140(s0)
     3f16:	fff9                	bnez	a5,3ef4 <concreate+0xbc>
-      i = de.name[1] - '0';
     3f18:	f7344783          	lbu	a5,-141(s0)
     3f1c:	fd07879b          	addiw	a5,a5,-48
     3f20:	0007871b          	sext.w	a4,a5
-      if(i < 0 || i >= sizeof(fa)){
     3f24:	02eb6063          	bltu	s6,a4,3f44 <concreate+0x10c>
-      if(fa[i]){
     3f28:	fb070793          	addi	a5,a4,-80 # fb0 <bigdir+0x10e>
     3f2c:	97a2                	add	a5,a5,s0
     3f2e:	fd07c783          	lbu	a5,-48(a5)
     3f32:	e78d                	bnez	a5,3f5c <concreate+0x124>
-      fa[i] = 1;
     3f34:	fb070793          	addi	a5,a4,-80
     3f38:	00878733          	add	a4,a5,s0
     3f3c:	fd770823          	sb	s7,-48(a4)
-      n++;
     3f40:	2a85                	addiw	s5,s5,1
     3f42:	bf4d                	j	3ef4 <concreate+0xbc>
-        printf("%s: concreate weird file %s\n", s, de.name);
     3f44:	f7240613          	addi	a2,s0,-142
     3f48:	85ce                	mv	a1,s3
     3f4a:	00003517          	auipc	a0,0x3
     3f4e:	dd650513          	addi	a0,a0,-554 # 6d20 <malloc+0x1db6>
     3f52:	765000ef          	jal	4eb6 <printf>
-        exit(1);
     3f56:	4505                	li	a0,1
     3f58:	32f000ef          	jal	4a86 <exit>
-        printf("%s: concreate duplicate file %s\n", s, de.name);
     3f5c:	f7240613          	addi	a2,s0,-142
     3f60:	85ce                	mv	a1,s3
     3f62:	00003517          	auipc	a0,0x3
     3f66:	dde50513          	addi	a0,a0,-546 # 6d40 <malloc+0x1dd6>
     3f6a:	74d000ef          	jal	4eb6 <printf>
-        exit(1);
     3f6e:	4505                	li	a0,1
     3f70:	317000ef          	jal	4a86 <exit>
-  close(fd);
     3f74:	854a                	mv	a0,s2
     3f76:	339000ef          	jal	4aae <close>
-  if(n != N){
     3f7a:	02800793          	li	a5,40
     3f7e:	00fa9763          	bne	s5,a5,3f8c <concreate+0x154>
-    if(((i % 3) == 0 && pid == 0) ||
     3f82:	4a8d                	li	s5,3
     3f84:	4b05                	li	s6,1
-  for(i = 0; i < N; i++){
     3f86:	02800a13          	li	s4,40
     3f8a:	a079                	j	4018 <concreate+0x1e0>
-    printf("%s: concreate not enough files in directory listing\n", s);
     3f8c:	85ce                	mv	a1,s3
     3f8e:	00003517          	auipc	a0,0x3
     3f92:	dda50513          	addi	a0,a0,-550 # 6d68 <malloc+0x1dfe>
     3f96:	721000ef          	jal	4eb6 <printf>
-    exit(1);
     3f9a:	4505                	li	a0,1
     3f9c:	2eb000ef          	jal	4a86 <exit>
-      printf("%s: fork failed\n", s);
     3fa0:	85ce                	mv	a1,s3
     3fa2:	00002517          	auipc	a0,0x2
     3fa6:	99650513          	addi	a0,a0,-1642 # 5938 <malloc+0x9ce>
     3faa:	70d000ef          	jal	4eb6 <printf>
-      exit(1);
     3fae:	4505                	li	a0,1
     3fb0:	2d7000ef          	jal	4a86 <exit>
-      close(open(file, 0));
     3fb4:	4581                	li	a1,0
     3fb6:	fa840513          	addi	a0,s0,-88
     3fba:	30d000ef          	jal	4ac6 <open>
     3fbe:	2f1000ef          	jal	4aae <close>
-      close(open(file, 0));
     3fc2:	4581                	li	a1,0
     3fc4:	fa840513          	addi	a0,s0,-88
     3fc8:	2ff000ef          	jal	4ac6 <open>
     3fcc:	2e3000ef          	jal	4aae <close>
-      close(open(file, 0));
     3fd0:	4581                	li	a1,0
     3fd2:	fa840513          	addi	a0,s0,-88
     3fd6:	2f1000ef          	jal	4ac6 <open>
     3fda:	2d5000ef          	jal	4aae <close>
-      close(open(file, 0));
     3fde:	4581                	li	a1,0
     3fe0:	fa840513          	addi	a0,s0,-88
     3fe4:	2e3000ef          	jal	4ac6 <open>
     3fe8:	2c7000ef          	jal	4aae <close>
-      close(open(file, 0));
     3fec:	4581                	li	a1,0
     3fee:	fa840513          	addi	a0,s0,-88
     3ff2:	2d5000ef          	jal	4ac6 <open>
     3ff6:	2b9000ef          	jal	4aae <close>
-      close(open(file, 0));
     3ffa:	4581                	li	a1,0
     3ffc:	fa840513          	addi	a0,s0,-88
     4000:	2c7000ef          	jal	4ac6 <open>
     4004:	2ab000ef          	jal	4aae <close>
-    if(pid == 0)
     4008:	06090363          	beqz	s2,406e <concreate+0x236>
-      wait(0);
     400c:	4501                	li	a0,0
     400e:	281000ef          	jal	4a8e <wait>
-  for(i = 0; i < N; i++){
     4012:	2485                	addiw	s1,s1,1
     4014:	0b448963          	beq	s1,s4,40c6 <concreate+0x28e>
-    file[1] = '0' + i;
     4018:	0304879b          	addiw	a5,s1,48
     401c:	faf404a3          	sb	a5,-87(s0)
-    pid = fork();
     4020:	25f000ef          	jal	4a7e <fork>
     4024:	892a                	mv	s2,a0
-    if(pid < 0){
     4026:	f6054de3          	bltz	a0,3fa0 <concreate+0x168>
-    if(((i % 3) == 0 && pid == 0) ||
     402a:	0354e73b          	remw	a4,s1,s5
     402e:	00a767b3          	or	a5,a4,a0
     4032:	2781                	sext.w	a5,a5
     4034:	d3c1                	beqz	a5,3fb4 <concreate+0x17c>
     4036:	01671363          	bne	a4,s6,403c <concreate+0x204>
-       ((i % 3) == 1 && pid != 0)){
     403a:	fd2d                	bnez	a0,3fb4 <concreate+0x17c>
-      unlink(file);
     403c:	fa840513          	addi	a0,s0,-88
     4040:	297000ef          	jal	4ad6 <unlink>
-      unlink(file);
     4044:	fa840513          	addi	a0,s0,-88
     4048:	28f000ef          	jal	4ad6 <unlink>
-      unlink(file);
     404c:	fa840513          	addi	a0,s0,-88
     4050:	287000ef          	jal	4ad6 <unlink>
-      unlink(file);
     4054:	fa840513          	addi	a0,s0,-88
     4058:	27f000ef          	jal	4ad6 <unlink>
-      unlink(file);
     405c:	fa840513          	addi	a0,s0,-88
     4060:	277000ef          	jal	4ad6 <unlink>
-      unlink(file);
     4064:	fa840513          	addi	a0,s0,-88
     4068:	26f000ef          	jal	4ad6 <unlink>
     406c:	bf71                	j	4008 <concreate+0x1d0>
-      exit(0);
     406e:	4501                	li	a0,0
     4070:	217000ef          	jal	4a86 <exit>
-      close(fd);
     4074:	23b000ef          	jal	4aae <close>
-    if(pid == 0) {
     4078:	b599                	j	3ebe <concreate+0x86>
-      close(fd);
     407a:	235000ef          	jal	4aae <close>
-      wait(&xstatus);
     407e:	f6c40513          	addi	a0,s0,-148
     4082:	20d000ef          	jal	4a8e <wait>
-      if(xstatus != 0)
     4086:	f6c42483          	lw	s1,-148(s0)
     408a:	e2049de3          	bnez	s1,3ec4 <concreate+0x8c>
-  for(i = 0; i < N; i++){
     408e:	2905                	addiw	s2,s2,1
     4090:	e3490de3          	beq	s2,s4,3eca <concreate+0x92>
-    file[1] = '0' + i;
     4094:	0309079b          	addiw	a5,s2,48
     4098:	faf404a3          	sb	a5,-87(s0)
-    unlink(file);
     409c:	fa840513          	addi	a0,s0,-88
     40a0:	237000ef          	jal	4ad6 <unlink>
-    pid = fork();
     40a4:	1db000ef          	jal	4a7e <fork>
-    if(pid && (i % 3) == 1){
     40a8:	dc050ae3          	beqz	a0,3e7c <concreate+0x44>
     40ac:	036967bb          	remw	a5,s2,s6
     40b0:	dd5780e3          	beq	a5,s5,3e70 <concreate+0x38>
-      fd = open(file, O_CREATE | O_RDWR);
     40b4:	20200593          	li	a1,514
     40b8:	fa840513          	addi	a0,s0,-88
     40bc:	20b000ef          	jal	4ac6 <open>
-      if(fd < 0){
     40c0:	fa055de3          	bgez	a0,407a <concreate+0x242>
     40c4:	bbd1                	j	3e98 <concreate+0x60>
-}
     40c6:	60ea                	ld	ra,152(sp)
     40c8:	644a                	ld	s0,144(sp)
     40ca:	64aa                	ld	s1,136(sp)
@@ -7219,7 +5415,6 @@ r_sp()
     40da:	8082                	ret
 
 00000000000040dc <bigfile>:
-{
     40dc:	7139                	addi	sp,sp,-64
     40de:	fc06                	sd	ra,56(sp)
     40e0:	f822                	sd	s0,48(sp)
@@ -7230,71 +5425,51 @@ r_sp()
     40ea:	e456                	sd	s5,8(sp)
     40ec:	0080                	addi	s0,sp,64
     40ee:	8aaa                	mv	s5,a0
-  unlink("bigfile.dat");
     40f0:	00003517          	auipc	a0,0x3
     40f4:	cb050513          	addi	a0,a0,-848 # 6da0 <malloc+0x1e36>
     40f8:	1df000ef          	jal	4ad6 <unlink>
-  fd = open("bigfile.dat", O_CREATE | O_RDWR);
     40fc:	20200593          	li	a1,514
     4100:	00003517          	auipc	a0,0x3
     4104:	ca050513          	addi	a0,a0,-864 # 6da0 <malloc+0x1e36>
     4108:	1bf000ef          	jal	4ac6 <open>
     410c:	89aa                	mv	s3,a0
-  for(i = 0; i < N; i++){
     410e:	4481                	li	s1,0
-    memset(buf, i, SZ);
     4110:	00009917          	auipc	s2,0x9
     4114:	b6890913          	addi	s2,s2,-1176 # cc78 <buf>
-  for(i = 0; i < N; i++){
     4118:	4a51                	li	s4,20
-  if(fd < 0){
     411a:	08054663          	bltz	a0,41a6 <bigfile+0xca>
-    memset(buf, i, SZ);
     411e:	25800613          	li	a2,600
     4122:	85a6                	mv	a1,s1
     4124:	854a                	mv	a0,s2
     4126:	77a000ef          	jal	48a0 <memset>
-    if(write(fd, buf, SZ) != SZ){
     412a:	25800613          	li	a2,600
     412e:	85ca                	mv	a1,s2
     4130:	854e                	mv	a0,s3
     4132:	175000ef          	jal	4aa6 <write>
     4136:	25800793          	li	a5,600
     413a:	08f51063          	bne	a0,a5,41ba <bigfile+0xde>
-  for(i = 0; i < N; i++){
     413e:	2485                	addiw	s1,s1,1
     4140:	fd449fe3          	bne	s1,s4,411e <bigfile+0x42>
-  close(fd);
     4144:	854e                	mv	a0,s3
     4146:	169000ef          	jal	4aae <close>
-  fd = open("bigfile.dat", 0);
     414a:	4581                	li	a1,0
     414c:	00003517          	auipc	a0,0x3
     4150:	c5450513          	addi	a0,a0,-940 # 6da0 <malloc+0x1e36>
     4154:	173000ef          	jal	4ac6 <open>
     4158:	8a2a                	mv	s4,a0
-  total = 0;
     415a:	4981                	li	s3,0
-  for(i = 0; ; i++){
     415c:	4481                	li	s1,0
-    cc = read(fd, buf, SZ/2);
     415e:	00009917          	auipc	s2,0x9
     4162:	b1a90913          	addi	s2,s2,-1254 # cc78 <buf>
-  if(fd < 0){
     4166:	06054463          	bltz	a0,41ce <bigfile+0xf2>
-    cc = read(fd, buf, SZ/2);
     416a:	12c00613          	li	a2,300
     416e:	85ca                	mv	a1,s2
     4170:	8552                	mv	a0,s4
     4172:	12d000ef          	jal	4a9e <read>
-    if(cc < 0){
     4176:	06054663          	bltz	a0,41e2 <bigfile+0x106>
-    if(cc == 0)
     417a:	c155                	beqz	a0,421e <bigfile+0x142>
-    if(cc != SZ/2){
     417c:	12c00793          	li	a5,300
     4180:	06f51b63          	bne	a0,a5,41f6 <bigfile+0x11a>
-    if(buf[0] != i/2 || buf[SZ/2-1] != i/2){
     4184:	01f4d79b          	srliw	a5,s1,0x1f
     4188:	9fa5                	addw	a5,a5,s1
     418a:	4017d79b          	sraiw	a5,a5,0x1
@@ -7302,72 +5477,53 @@ r_sp()
     4192:	06f71c63          	bne	a4,a5,420a <bigfile+0x12e>
     4196:	12b94703          	lbu	a4,299(s2)
     419a:	06f71863          	bne	a4,a5,420a <bigfile+0x12e>
-    total += cc;
     419e:	12c9899b          	addiw	s3,s3,300
-  for(i = 0; ; i++){
     41a2:	2485                	addiw	s1,s1,1
-    cc = read(fd, buf, SZ/2);
     41a4:	b7d9                	j	416a <bigfile+0x8e>
-    printf("%s: cannot create bigfile", s);
     41a6:	85d6                	mv	a1,s5
     41a8:	00003517          	auipc	a0,0x3
     41ac:	c0850513          	addi	a0,a0,-1016 # 6db0 <malloc+0x1e46>
     41b0:	507000ef          	jal	4eb6 <printf>
-    exit(1);
     41b4:	4505                	li	a0,1
     41b6:	0d1000ef          	jal	4a86 <exit>
-      printf("%s: write bigfile failed\n", s);
     41ba:	85d6                	mv	a1,s5
     41bc:	00003517          	auipc	a0,0x3
     41c0:	c1450513          	addi	a0,a0,-1004 # 6dd0 <malloc+0x1e66>
     41c4:	4f3000ef          	jal	4eb6 <printf>
-      exit(1);
     41c8:	4505                	li	a0,1
     41ca:	0bd000ef          	jal	4a86 <exit>
-    printf("%s: cannot open bigfile\n", s);
     41ce:	85d6                	mv	a1,s5
     41d0:	00003517          	auipc	a0,0x3
     41d4:	c2050513          	addi	a0,a0,-992 # 6df0 <malloc+0x1e86>
     41d8:	4df000ef          	jal	4eb6 <printf>
-    exit(1);
     41dc:	4505                	li	a0,1
     41de:	0a9000ef          	jal	4a86 <exit>
-      printf("%s: read bigfile failed\n", s);
     41e2:	85d6                	mv	a1,s5
     41e4:	00003517          	auipc	a0,0x3
     41e8:	c2c50513          	addi	a0,a0,-980 # 6e10 <malloc+0x1ea6>
     41ec:	4cb000ef          	jal	4eb6 <printf>
-      exit(1);
     41f0:	4505                	li	a0,1
     41f2:	095000ef          	jal	4a86 <exit>
-      printf("%s: short read bigfile\n", s);
     41f6:	85d6                	mv	a1,s5
     41f8:	00003517          	auipc	a0,0x3
     41fc:	c3850513          	addi	a0,a0,-968 # 6e30 <malloc+0x1ec6>
     4200:	4b7000ef          	jal	4eb6 <printf>
-      exit(1);
     4204:	4505                	li	a0,1
     4206:	081000ef          	jal	4a86 <exit>
-      printf("%s: read bigfile wrong data\n", s);
     420a:	85d6                	mv	a1,s5
     420c:	00003517          	auipc	a0,0x3
     4210:	c3c50513          	addi	a0,a0,-964 # 6e48 <malloc+0x1ede>
     4214:	4a3000ef          	jal	4eb6 <printf>
-      exit(1);
     4218:	4505                	li	a0,1
     421a:	06d000ef          	jal	4a86 <exit>
-  close(fd);
     421e:	8552                	mv	a0,s4
     4220:	08f000ef          	jal	4aae <close>
-  if(total != N*SZ){
     4224:	678d                	lui	a5,0x3
     4226:	ee078793          	addi	a5,a5,-288 # 2ee0 <subdir+0x2fe>
     422a:	02f99163          	bne	s3,a5,424c <bigfile+0x170>
-  unlink("bigfile.dat");
     422e:	00003517          	auipc	a0,0x3
     4232:	b7250513          	addi	a0,a0,-1166 # 6da0 <malloc+0x1e36>
     4236:	0a1000ef          	jal	4ad6 <unlink>
-}
     423a:	70e2                	ld	ra,56(sp)
     423c:	7442                	ld	s0,48(sp)
     423e:	74a2                	ld	s1,40(sp)
@@ -7377,111 +5533,82 @@ r_sp()
     4246:	6aa2                	ld	s5,8(sp)
     4248:	6121                	addi	sp,sp,64
     424a:	8082                	ret
-    printf("%s: read bigfile wrong total\n", s);
     424c:	85d6                	mv	a1,s5
     424e:	00003517          	auipc	a0,0x3
     4252:	c1a50513          	addi	a0,a0,-998 # 6e68 <malloc+0x1efe>
     4256:	461000ef          	jal	4eb6 <printf>
-    exit(1);
     425a:	4505                	li	a0,1
     425c:	02b000ef          	jal	4a86 <exit>
 
 0000000000004260 <bigargtest>:
-{
     4260:	7121                	addi	sp,sp,-448
     4262:	ff06                	sd	ra,440(sp)
     4264:	fb22                	sd	s0,432(sp)
     4266:	f726                	sd	s1,424(sp)
     4268:	0380                	addi	s0,sp,448
     426a:	84aa                	mv	s1,a0
-  unlink("bigarg-ok");
     426c:	00003517          	auipc	a0,0x3
     4270:	c1c50513          	addi	a0,a0,-996 # 6e88 <malloc+0x1f1e>
     4274:	063000ef          	jal	4ad6 <unlink>
-  pid = fork();
     4278:	007000ef          	jal	4a7e <fork>
-  if(pid == 0){
     427c:	c915                	beqz	a0,42b0 <bigargtest+0x50>
-  } else if(pid < 0){
     427e:	08054a63          	bltz	a0,4312 <bigargtest+0xb2>
-  wait(&xstatus);
     4282:	fdc40513          	addi	a0,s0,-36
     4286:	009000ef          	jal	4a8e <wait>
-  if(xstatus != 0)
     428a:	fdc42503          	lw	a0,-36(s0)
     428e:	ed41                	bnez	a0,4326 <bigargtest+0xc6>
-  fd = open("bigarg-ok", 0);
     4290:	4581                	li	a1,0
     4292:	00003517          	auipc	a0,0x3
     4296:	bf650513          	addi	a0,a0,-1034 # 6e88 <malloc+0x1f1e>
     429a:	02d000ef          	jal	4ac6 <open>
-  if(fd < 0){
     429e:	08054663          	bltz	a0,432a <bigargtest+0xca>
-  close(fd);
     42a2:	00d000ef          	jal	4aae <close>
-}
     42a6:	70fa                	ld	ra,440(sp)
     42a8:	745a                	ld	s0,432(sp)
     42aa:	74ba                	ld	s1,424(sp)
     42ac:	6139                	addi	sp,sp,448
     42ae:	8082                	ret
-    memset(big, ' ', sizeof(big));
     42b0:	19000613          	li	a2,400
     42b4:	02000593          	li	a1,32
     42b8:	e4840513          	addi	a0,s0,-440
     42bc:	5e4000ef          	jal	48a0 <memset>
-    big[sizeof(big)-1] = '\0';
     42c0:	fc040ba3          	sb	zero,-41(s0)
-    for(i = 0; i < MAXARG-1; i++)
     42c4:	00005797          	auipc	a5,0x5
     42c8:	19c78793          	addi	a5,a5,412 # 9460 <args.1>
     42cc:	00005697          	auipc	a3,0x5
     42d0:	28c68693          	addi	a3,a3,652 # 9558 <args.1+0xf8>
-      args[i] = big;
     42d4:	e4840713          	addi	a4,s0,-440
     42d8:	e398                	sd	a4,0(a5)
-    for(i = 0; i < MAXARG-1; i++)
     42da:	07a1                	addi	a5,a5,8
     42dc:	fed79ee3          	bne	a5,a3,42d8 <bigargtest+0x78>
-    args[MAXARG-1] = 0;
     42e0:	00005597          	auipc	a1,0x5
     42e4:	18058593          	addi	a1,a1,384 # 9460 <args.1>
     42e8:	0e05bc23          	sd	zero,248(a1)
-    exec("echo", args);
     42ec:	00001517          	auipc	a0,0x1
     42f0:	dbc50513          	addi	a0,a0,-580 # 50a8 <malloc+0x13e>
     42f4:	7ca000ef          	jal	4abe <exec>
-    fd = open("bigarg-ok", O_CREATE);
     42f8:	20000593          	li	a1,512
     42fc:	00003517          	auipc	a0,0x3
     4300:	b8c50513          	addi	a0,a0,-1140 # 6e88 <malloc+0x1f1e>
     4304:	7c2000ef          	jal	4ac6 <open>
-    close(fd);
     4308:	7a6000ef          	jal	4aae <close>
-    exit(0);
     430c:	4501                	li	a0,0
     430e:	778000ef          	jal	4a86 <exit>
-    printf("%s: bigargtest: fork failed\n", s);
     4312:	85a6                	mv	a1,s1
     4314:	00003517          	auipc	a0,0x3
     4318:	b8450513          	addi	a0,a0,-1148 # 6e98 <malloc+0x1f2e>
     431c:	39b000ef          	jal	4eb6 <printf>
-    exit(1);
     4320:	4505                	li	a0,1
     4322:	764000ef          	jal	4a86 <exit>
-    exit(xstatus);
     4326:	760000ef          	jal	4a86 <exit>
-    printf("%s: bigarg test failed!\n", s);
     432a:	85a6                	mv	a1,s1
     432c:	00003517          	auipc	a0,0x3
     4330:	b8c50513          	addi	a0,a0,-1140 # 6eb8 <malloc+0x1f4e>
     4334:	383000ef          	jal	4eb6 <printf>
-    exit(1);
     4338:	4505                	li	a0,1
     433a:	74c000ef          	jal	4a86 <exit>
 
 000000000000433e <fsfull>:
-{
     433e:	7135                	addi	sp,sp,-160
     4340:	ed06                	sd	ra,152(sp)
     4342:	e922                	sd	s0,144(sp)
@@ -7496,107 +5623,73 @@ r_sp()
     4354:	e4e6                	sd	s9,72(sp)
     4356:	e0ea                	sd	s10,64(sp)
     4358:	1100                	addi	s0,sp,160
-  printf("fsfull test\n");
     435a:	00003517          	auipc	a0,0x3
     435e:	b7e50513          	addi	a0,a0,-1154 # 6ed8 <malloc+0x1f6e>
     4362:	355000ef          	jal	4eb6 <printf>
-  for(nfiles = 0; ; nfiles++){
     4366:	4481                	li	s1,0
-    name[0] = 'f';
     4368:	06600d13          	li	s10,102
-    name[1] = '0' + nfiles / 1000;
     436c:	3e800c13          	li	s8,1000
-    name[2] = '0' + (nfiles % 1000) / 100;
     4370:	06400b93          	li	s7,100
-    name[3] = '0' + (nfiles % 100) / 10;
     4374:	4b29                	li	s6,10
-    printf("writing %s\n", name);
     4376:	00003c97          	auipc	s9,0x3
     437a:	b72c8c93          	addi	s9,s9,-1166 # 6ee8 <malloc+0x1f7e>
-    name[0] = 'f';
     437e:	f7a40023          	sb	s10,-160(s0)
-    name[1] = '0' + nfiles / 1000;
     4382:	0384c7bb          	divw	a5,s1,s8
     4386:	0307879b          	addiw	a5,a5,48
     438a:	f6f400a3          	sb	a5,-159(s0)
-    name[2] = '0' + (nfiles % 1000) / 100;
     438e:	0384e7bb          	remw	a5,s1,s8
     4392:	0377c7bb          	divw	a5,a5,s7
     4396:	0307879b          	addiw	a5,a5,48
     439a:	f6f40123          	sb	a5,-158(s0)
-    name[3] = '0' + (nfiles % 100) / 10;
     439e:	0374e7bb          	remw	a5,s1,s7
     43a2:	0367c7bb          	divw	a5,a5,s6
     43a6:	0307879b          	addiw	a5,a5,48
     43aa:	f6f401a3          	sb	a5,-157(s0)
-    name[4] = '0' + (nfiles % 10);
     43ae:	0364e7bb          	remw	a5,s1,s6
     43b2:	0307879b          	addiw	a5,a5,48
     43b6:	f6f40223          	sb	a5,-156(s0)
-    name[5] = '\0';
     43ba:	f60402a3          	sb	zero,-155(s0)
-    printf("writing %s\n", name);
     43be:	f6040593          	addi	a1,s0,-160
     43c2:	8566                	mv	a0,s9
     43c4:	2f3000ef          	jal	4eb6 <printf>
-    int fd = open(name, O_CREATE|O_RDWR);
     43c8:	20200593          	li	a1,514
     43cc:	f6040513          	addi	a0,s0,-160
     43d0:	6f6000ef          	jal	4ac6 <open>
     43d4:	892a                	mv	s2,a0
-    if(fd < 0){
     43d6:	08055f63          	bgez	a0,4474 <fsfull+0x136>
-      printf("open %s failed\n", name);
     43da:	f6040593          	addi	a1,s0,-160
     43de:	00003517          	auipc	a0,0x3
     43e2:	b1a50513          	addi	a0,a0,-1254 # 6ef8 <malloc+0x1f8e>
     43e6:	2d1000ef          	jal	4eb6 <printf>
-  while(nfiles >= 0){
     43ea:	0604c163          	bltz	s1,444c <fsfull+0x10e>
-    name[0] = 'f';
     43ee:	06600b13          	li	s6,102
-    name[1] = '0' + nfiles / 1000;
     43f2:	3e800a13          	li	s4,1000
-    name[2] = '0' + (nfiles % 1000) / 100;
     43f6:	06400993          	li	s3,100
-    name[3] = '0' + (nfiles % 100) / 10;
     43fa:	4929                	li	s2,10
-  while(nfiles >= 0){
     43fc:	5afd                	li	s5,-1
-    name[0] = 'f';
     43fe:	f7640023          	sb	s6,-160(s0)
-    name[1] = '0' + nfiles / 1000;
     4402:	0344c7bb          	divw	a5,s1,s4
     4406:	0307879b          	addiw	a5,a5,48
     440a:	f6f400a3          	sb	a5,-159(s0)
-    name[2] = '0' + (nfiles % 1000) / 100;
     440e:	0344e7bb          	remw	a5,s1,s4
     4412:	0337c7bb          	divw	a5,a5,s3
     4416:	0307879b          	addiw	a5,a5,48
     441a:	f6f40123          	sb	a5,-158(s0)
-    name[3] = '0' + (nfiles % 100) / 10;
     441e:	0334e7bb          	remw	a5,s1,s3
     4422:	0327c7bb          	divw	a5,a5,s2
     4426:	0307879b          	addiw	a5,a5,48
     442a:	f6f401a3          	sb	a5,-157(s0)
-    name[4] = '0' + (nfiles % 10);
     442e:	0324e7bb          	remw	a5,s1,s2
     4432:	0307879b          	addiw	a5,a5,48
     4436:	f6f40223          	sb	a5,-156(s0)
-    name[5] = '\0';
     443a:	f60402a3          	sb	zero,-155(s0)
-    unlink(name);
     443e:	f6040513          	addi	a0,s0,-160
     4442:	694000ef          	jal	4ad6 <unlink>
-    nfiles--;
     4446:	34fd                	addiw	s1,s1,-1
-  while(nfiles >= 0){
     4448:	fb549be3          	bne	s1,s5,43fe <fsfull+0xc0>
-  printf("fsfull test finished\n");
     444c:	00003517          	auipc	a0,0x3
     4450:	acc50513          	addi	a0,a0,-1332 # 6f18 <malloc+0x1fae>
     4454:	263000ef          	jal	4eb6 <printf>
-}
     4458:	60ea                	ld	ra,152(sp)
     445a:	644a                	ld	s0,144(sp)
     445c:	64aa                	ld	s1,136(sp)
@@ -7611,45 +5704,28 @@ r_sp()
     446e:	6d06                	ld	s10,64(sp)
     4470:	610d                	addi	sp,sp,160
     4472:	8082                	ret
-    int total = 0;
     4474:	4981                	li	s3,0
-      int cc = write(fd, buf, BSIZE);
     4476:	00009a97          	auipc	s5,0x9
     447a:	802a8a93          	addi	s5,s5,-2046 # cc78 <buf>
-      if(cc < BSIZE)
     447e:	3ff00a13          	li	s4,1023
-      int cc = write(fd, buf, BSIZE);
     4482:	40000613          	li	a2,1024
     4486:	85d6                	mv	a1,s5
     4488:	854a                	mv	a0,s2
     448a:	61c000ef          	jal	4aa6 <write>
-      if(cc < BSIZE)
     448e:	00aa5563          	bge	s4,a0,4498 <fsfull+0x15a>
-      total += cc;
     4492:	00a989bb          	addw	s3,s3,a0
-    while(1){
     4496:	b7f5                	j	4482 <fsfull+0x144>
-    printf("wrote %d bytes\n", total);
     4498:	85ce                	mv	a1,s3
     449a:	00003517          	auipc	a0,0x3
     449e:	a6e50513          	addi	a0,a0,-1426 # 6f08 <malloc+0x1f9e>
     44a2:	215000ef          	jal	4eb6 <printf>
-    close(fd);
     44a6:	854a                	mv	a0,s2
     44a8:	606000ef          	jal	4aae <close>
-    if(total == 0)
     44ac:	f2098fe3          	beqz	s3,43ea <fsfull+0xac>
-  for(nfiles = 0; ; nfiles++){
     44b0:	2485                	addiw	s1,s1,1
     44b2:	b5f1                	j	437e <fsfull+0x40>
 
 00000000000044b4 <run>:
-//
-
-// run each test in its own process. run returns 1 if child's exit()
-// indicates success.
-int
-run(void f(char *), char *s) {
     44b4:	7179                	addi	sp,sp,-48
     44b6:	f406                	sd	ra,40(sp)
     44b8:	f022                	sd	s0,32(sp)
@@ -7658,40 +5734,20 @@ run(void f(char *), char *s) {
     44be:	1800                	addi	s0,sp,48
     44c0:	84aa                	mv	s1,a0
     44c2:	892e                	mv	s2,a1
-  int pid;
-  int xstatus;
-
-  printf("test %s: ", s);
     44c4:	00003517          	auipc	a0,0x3
     44c8:	a6c50513          	addi	a0,a0,-1428 # 6f30 <malloc+0x1fc6>
     44cc:	1eb000ef          	jal	4eb6 <printf>
-  if((pid = fork()) < 0) {
     44d0:	5ae000ef          	jal	4a7e <fork>
     44d4:	02054a63          	bltz	a0,4508 <run+0x54>
-    printf("runtest: fork error\n");
-    exit(1);
-  }
-  if(pid == 0) {
     44d8:	c129                	beqz	a0,451a <run+0x66>
-    f(s);
-    exit(0);
-  } else {
-    wait(&xstatus);
     44da:	fdc40513          	addi	a0,s0,-36
     44de:	5b0000ef          	jal	4a8e <wait>
-    if(xstatus != 0) 
     44e2:	fdc42783          	lw	a5,-36(s0)
     44e6:	cf9d                	beqz	a5,4524 <run+0x70>
-      printf("FAILED\n");
     44e8:	00003517          	auipc	a0,0x3
     44ec:	a7050513          	addi	a0,a0,-1424 # 6f58 <malloc+0x1fee>
     44f0:	1c7000ef          	jal	4eb6 <printf>
-    else
-      printf("OK\n");
-    return xstatus == 0;
     44f4:	fdc42503          	lw	a0,-36(s0)
-  }
-}
     44f8:	00153513          	seqz	a0,a0
     44fc:	70a2                	ld	ra,40(sp)
     44fe:	7402                	ld	s0,32(sp)
@@ -7699,35 +5755,26 @@ run(void f(char *), char *s) {
     4502:	6942                	ld	s2,16(sp)
     4504:	6145                	addi	sp,sp,48
     4506:	8082                	ret
-    printf("runtest: fork error\n");
     4508:	00003517          	auipc	a0,0x3
     450c:	a3850513          	addi	a0,a0,-1480 # 6f40 <malloc+0x1fd6>
     4510:	1a7000ef          	jal	4eb6 <printf>
-    exit(1);
     4514:	4505                	li	a0,1
     4516:	570000ef          	jal	4a86 <exit>
-    f(s);
     451a:	854a                	mv	a0,s2
     451c:	9482                	jalr	s1
-    exit(0);
     451e:	4501                	li	a0,0
     4520:	566000ef          	jal	4a86 <exit>
-      printf("OK\n");
     4524:	00003517          	auipc	a0,0x3
     4528:	a3c50513          	addi	a0,a0,-1476 # 6f60 <malloc+0x1ff6>
     452c:	18b000ef          	jal	4eb6 <printf>
     4530:	b7d1                	j	44f4 <run+0x40>
 
 0000000000004532 <runtests>:
-
-int
-runtests(struct test *tests, char *justone, int continuous) {
     4532:	7139                	addi	sp,sp,-64
     4534:	fc06                	sd	ra,56(sp)
     4536:	f822                	sd	s0,48(sp)
     4538:	f04a                	sd	s2,32(sp)
     453a:	0080                	addi	s0,sp,64
-  for (struct test *t = tests; t->s != 0; t++) {
     453c:	00853903          	ld	s2,8(a0)
     4540:	06090463          	beqz	s2,45a8 <runtests+0x76>
     4544:	f426                	sd	s1,40(sp)
@@ -7737,209 +5784,120 @@ runtests(struct test *tests, char *justone, int continuous) {
     454c:	84aa                	mv	s1,a0
     454e:	89ae                	mv	s3,a1
     4550:	8a32                	mv	s4,a2
-    if((justone == 0) || strcmp(t->s, justone) == 0) {
-      if(!run(t->f, t->s)){
-        if(continuous != 2){
     4552:	4a89                	li	s5,2
     4554:	a031                	j	4560 <runtests+0x2e>
-  for (struct test *t = tests; t->s != 0; t++) {
     4556:	04c1                	addi	s1,s1,16
     4558:	0084b903          	ld	s2,8(s1)
     455c:	02090c63          	beqz	s2,4594 <runtests+0x62>
-    if((justone == 0) || strcmp(t->s, justone) == 0) {
     4560:	00098763          	beqz	s3,456e <runtests+0x3c>
     4564:	85ce                	mv	a1,s3
     4566:	854a                	mv	a0,s2
     4568:	2e2000ef          	jal	484a <strcmp>
     456c:	f56d                	bnez	a0,4556 <runtests+0x24>
-      if(!run(t->f, t->s)){
     456e:	85ca                	mv	a1,s2
     4570:	6088                	ld	a0,0(s1)
     4572:	f43ff0ef          	jal	44b4 <run>
     4576:	f165                	bnez	a0,4556 <runtests+0x24>
-        if(continuous != 2){
     4578:	fd5a0fe3          	beq	s4,s5,4556 <runtests+0x24>
-          printf("SOME TESTS FAILED\n");
     457c:	00003517          	auipc	a0,0x3
     4580:	9ec50513          	addi	a0,a0,-1556 # 6f68 <malloc+0x1ffe>
     4584:	133000ef          	jal	4eb6 <printf>
-          return 1;
     4588:	4505                	li	a0,1
     458a:	74a2                	ld	s1,40(sp)
     458c:	69e2                	ld	s3,24(sp)
     458e:	6a42                	ld	s4,16(sp)
     4590:	6aa2                	ld	s5,8(sp)
     4592:	a031                	j	459e <runtests+0x6c>
-        }
-      }
-    }
-  }
-  return 0;
     4594:	4501                	li	a0,0
     4596:	74a2                	ld	s1,40(sp)
     4598:	69e2                	ld	s3,24(sp)
     459a:	6a42                	ld	s4,16(sp)
     459c:	6aa2                	ld	s5,8(sp)
-}
     459e:	70e2                	ld	ra,56(sp)
     45a0:	7442                	ld	s0,48(sp)
     45a2:	7902                	ld	s2,32(sp)
     45a4:	6121                	addi	sp,sp,64
     45a6:	8082                	ret
-  return 0;
     45a8:	4501                	li	a0,0
     45aa:	bfd5                	j	459e <runtests+0x6c>
 
 00000000000045ac <countfree>:
-// because out of memory with lazy allocation results in the process
-// taking a fault and being killed, fork and report back.
-//
-int
-countfree()
-{
     45ac:	7139                	addi	sp,sp,-64
     45ae:	fc06                	sd	ra,56(sp)
     45b0:	f822                	sd	s0,48(sp)
     45b2:	0080                	addi	s0,sp,64
-  int fds[2];
-
-  if(pipe(fds) < 0){
     45b4:	fc840513          	addi	a0,s0,-56
     45b8:	4de000ef          	jal	4a96 <pipe>
     45bc:	04054e63          	bltz	a0,4618 <countfree+0x6c>
-    printf("pipe() failed in countfree()\n");
-    exit(1);
-  }
-  
-  int pid = fork();
     45c0:	4be000ef          	jal	4a7e <fork>
-
-  if(pid < 0){
     45c4:	06054663          	bltz	a0,4630 <countfree+0x84>
-    printf("fork failed in countfree()\n");
-    exit(1);
-  }
-
-  if(pid == 0){
     45c8:	e159                	bnez	a0,464e <countfree+0xa2>
     45ca:	f426                	sd	s1,40(sp)
     45cc:	f04a                	sd	s2,32(sp)
     45ce:	ec4e                	sd	s3,24(sp)
-    close(fds[0]);
     45d0:	fc842503          	lw	a0,-56(s0)
     45d4:	4da000ef          	jal	4aae <close>
-    
-    while(1){
-      uint64 a = (uint64) sbrk(4096);
-      if(a == 0xffffffffffffffff){
     45d8:	597d                	li	s2,-1
-        break;
-      }
-
-      // modify the memory to make sure it's really allocated.
-      *(char *)(a + 4096 - 1) = 1;
     45da:	4485                	li	s1,1
-
-      // report back one more page.
-      if(write(fds[1], "x", 1) != 1){
     45dc:	00001997          	auipc	s3,0x1
     45e0:	b3c98993          	addi	s3,s3,-1220 # 5118 <malloc+0x1ae>
-      uint64 a = (uint64) sbrk(4096);
     45e4:	6505                	lui	a0,0x1
     45e6:	528000ef          	jal	4b0e <sbrk>
-      if(a == 0xffffffffffffffff){
     45ea:	05250f63          	beq	a0,s2,4648 <countfree+0x9c>
-      *(char *)(a + 4096 - 1) = 1;
     45ee:	6785                	lui	a5,0x1
     45f0:	97aa                	add	a5,a5,a0
     45f2:	fe978fa3          	sb	s1,-1(a5) # fff <pgbug+0x27>
-      if(write(fds[1], "x", 1) != 1){
     45f6:	8626                	mv	a2,s1
     45f8:	85ce                	mv	a1,s3
     45fa:	fcc42503          	lw	a0,-52(s0)
     45fe:	4a8000ef          	jal	4aa6 <write>
     4602:	fe9501e3          	beq	a0,s1,45e4 <countfree+0x38>
-        printf("write() failed in countfree()\n");
     4606:	00003517          	auipc	a0,0x3
     460a:	9ba50513          	addi	a0,a0,-1606 # 6fc0 <malloc+0x2056>
     460e:	0a9000ef          	jal	4eb6 <printf>
-        exit(1);
     4612:	4505                	li	a0,1
     4614:	472000ef          	jal	4a86 <exit>
     4618:	f426                	sd	s1,40(sp)
     461a:	f04a                	sd	s2,32(sp)
     461c:	ec4e                	sd	s3,24(sp)
-    printf("pipe() failed in countfree()\n");
     461e:	00003517          	auipc	a0,0x3
     4622:	96250513          	addi	a0,a0,-1694 # 6f80 <malloc+0x2016>
     4626:	091000ef          	jal	4eb6 <printf>
-    exit(1);
     462a:	4505                	li	a0,1
     462c:	45a000ef          	jal	4a86 <exit>
     4630:	f426                	sd	s1,40(sp)
     4632:	f04a                	sd	s2,32(sp)
     4634:	ec4e                	sd	s3,24(sp)
-    printf("fork failed in countfree()\n");
     4636:	00003517          	auipc	a0,0x3
     463a:	96a50513          	addi	a0,a0,-1686 # 6fa0 <malloc+0x2036>
     463e:	079000ef          	jal	4eb6 <printf>
-    exit(1);
     4642:	4505                	li	a0,1
     4644:	442000ef          	jal	4a86 <exit>
-      }
-    }
-
-    exit(0);
     4648:	4501                	li	a0,0
     464a:	43c000ef          	jal	4a86 <exit>
     464e:	f426                	sd	s1,40(sp)
-  }
-
-  close(fds[1]);
     4650:	fcc42503          	lw	a0,-52(s0)
     4654:	45a000ef          	jal	4aae <close>
-
-  int n = 0;
     4658:	4481                	li	s1,0
-  while(1){
-    char c;
-    int cc = read(fds[0], &c, 1);
     465a:	4605                	li	a2,1
     465c:	fc740593          	addi	a1,s0,-57
     4660:	fc842503          	lw	a0,-56(s0)
     4664:	43a000ef          	jal	4a9e <read>
-    if(cc < 0){
     4668:	00054563          	bltz	a0,4672 <countfree+0xc6>
-      printf("read() failed in countfree()\n");
-      exit(1);
-    }
-    if(cc == 0)
     466c:	cd11                	beqz	a0,4688 <countfree+0xdc>
-      break;
-    n += 1;
     466e:	2485                	addiw	s1,s1,1
-  while(1){
     4670:	b7ed                	j	465a <countfree+0xae>
     4672:	f04a                	sd	s2,32(sp)
     4674:	ec4e                	sd	s3,24(sp)
-      printf("read() failed in countfree()\n");
     4676:	00003517          	auipc	a0,0x3
     467a:	96a50513          	addi	a0,a0,-1686 # 6fe0 <malloc+0x2076>
     467e:	039000ef          	jal	4eb6 <printf>
-      exit(1);
     4682:	4505                	li	a0,1
     4684:	402000ef          	jal	4a86 <exit>
-  }
-
-  close(fds[0]);
     4688:	fc842503          	lw	a0,-56(s0)
     468c:	422000ef          	jal	4aae <close>
-  wait((int*)0);
     4690:	4501                	li	a0,0
     4692:	3fc000ef          	jal	4a8e <wait>
-  
-  return n;
-}
     4696:	8526                	mv	a0,s1
     4698:	74a2                	ld	s1,40(sp)
     469a:	70e2                	ld	ra,56(sp)
@@ -7948,9 +5906,6 @@ countfree()
     46a0:	8082                	ret
 
 00000000000046a2 <drivetests>:
-
-int
-drivetests(int quick, int continuous, char *justone) {
     46a2:	711d                	addi	sp,sp,-96
     46a4:	ec86                	sd	ra,88(sp)
     46a6:	e8a2                	sd	s0,80(sp)
@@ -7968,95 +5923,54 @@ drivetests(int quick, int continuous, char *justone) {
     46be:	8aaa                	mv	s5,a0
     46c0:	892e                	mv	s2,a1
     46c2:	89b2                	mv	s3,a2
-  do {
-    printf("usertests starting\n");
     46c4:	00003b97          	auipc	s7,0x3
     46c8:	93cb8b93          	addi	s7,s7,-1732 # 7000 <malloc+0x2096>
-    int free0 = countfree();
-    int free1 = 0;
-    if (runtests(quicktests, justone, continuous)) {
     46cc:	00005b17          	auipc	s6,0x5
     46d0:	944b0b13          	addi	s6,s6,-1724 # 9010 <quicktests>
-      if(continuous != 2) {
     46d4:	4a09                	li	s4,2
-      }
-    }
-    if(!quick) {
-      if (justone == 0)
-        printf("usertests slow tests starting\n");
-      if (runtests(slowtests, justone, continuous)) {
     46d6:	00005c17          	auipc	s8,0x5
     46da:	d0ac0c13          	addi	s8,s8,-758 # 93e0 <slowtests>
-        printf("usertests slow tests starting\n");
     46de:	00003d17          	auipc	s10,0x3
     46e2:	93ad0d13          	addi	s10,s10,-1734 # 7018 <malloc+0x20ae>
-          return 1;
-        }
-      }
-    }
-    if((free1 = countfree()) < free0) {
-      printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0);
     46e6:	00003c97          	auipc	s9,0x3
     46ea:	952c8c93          	addi	s9,s9,-1710 # 7038 <malloc+0x20ce>
     46ee:	a819                	j	4704 <drivetests+0x62>
-        printf("usertests slow tests starting\n");
     46f0:	856a                	mv	a0,s10
     46f2:	7c4000ef          	jal	4eb6 <printf>
     46f6:	a80d                	j	4728 <drivetests+0x86>
-    if((free1 = countfree()) < free0) {
     46f8:	eb5ff0ef          	jal	45ac <countfree>
     46fc:	04954063          	blt	a0,s1,473c <drivetests+0x9a>
-      if(continuous != 2) {
-        return 1;
-      }
-    }
-  } while(continuous);
     4700:	04090963          	beqz	s2,4752 <drivetests+0xb0>
-    printf("usertests starting\n");
     4704:	855e                	mv	a0,s7
     4706:	7b0000ef          	jal	4eb6 <printf>
-    int free0 = countfree();
     470a:	ea3ff0ef          	jal	45ac <countfree>
     470e:	84aa                	mv	s1,a0
-    if (runtests(quicktests, justone, continuous)) {
     4710:	864a                	mv	a2,s2
     4712:	85ce                	mv	a1,s3
     4714:	855a                	mv	a0,s6
     4716:	e1dff0ef          	jal	4532 <runtests>
     471a:	c119                	beqz	a0,4720 <drivetests+0x7e>
-      if(continuous != 2) {
     471c:	03491963          	bne	s2,s4,474e <drivetests+0xac>
-    if(!quick) {
     4720:	fc0a9ce3          	bnez	s5,46f8 <drivetests+0x56>
-      if (justone == 0)
     4724:	fc0986e3          	beqz	s3,46f0 <drivetests+0x4e>
-      if (runtests(slowtests, justone, continuous)) {
     4728:	864a                	mv	a2,s2
     472a:	85ce                	mv	a1,s3
     472c:	8562                	mv	a0,s8
     472e:	e05ff0ef          	jal	4532 <runtests>
     4732:	d179                	beqz	a0,46f8 <drivetests+0x56>
-        if(continuous != 2) {
     4734:	fd4902e3          	beq	s2,s4,46f8 <drivetests+0x56>
-          return 1;
     4738:	4505                	li	a0,1
     473a:	a829                	j	4754 <drivetests+0xb2>
-      printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0);
     473c:	8626                	mv	a2,s1
     473e:	85aa                	mv	a1,a0
     4740:	8566                	mv	a0,s9
     4742:	774000ef          	jal	4eb6 <printf>
-      if(continuous != 2) {
     4746:	fb490fe3          	beq	s2,s4,4704 <drivetests+0x62>
-        return 1;
     474a:	4505                	li	a0,1
     474c:	a021                	j	4754 <drivetests+0xb2>
-        return 1;
     474e:	4505                	li	a0,1
     4750:	a011                	j	4754 <drivetests+0xb2>
-  return 0;
     4752:	854a                	mv	a0,s2
-}
     4754:	60e6                	ld	ra,88(sp)
     4756:	6446                	ld	s0,80(sp)
     4758:	64a6                	ld	s1,72(sp)
@@ -8073,10 +5987,6 @@ drivetests(int quick, int continuous, char *justone) {
     476e:	8082                	ret
 
 0000000000004770 <main>:
-
-int
-main(int argc, char *argv[])
-{
     4770:	1101                	addi	sp,sp,-32
     4772:	ec06                	sd	ra,24(sp)
     4774:	e822                	sd	s0,16(sp)
@@ -8084,38 +5994,18 @@ main(int argc, char *argv[])
     4778:	e04a                	sd	s2,0(sp)
     477a:	1000                	addi	s0,sp,32
     477c:	84aa                	mv	s1,a0
-  int continuous = 0;
-  int quick = 0;
-  char *justone = 0;
-
-  if(argc == 2 && strcmp(argv[1], "-q") == 0){
     477e:	4789                	li	a5,2
     4780:	00f50f63          	beq	a0,a5,479e <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){
     4784:	4785                	li	a5,1
     4786:	06a7c063          	blt	a5,a0,47e6 <main+0x76>
-  char *justone = 0;
     478a:	4901                	li	s2,0
-  int quick = 0;
     478c:	4501                	li	a0,0
-  int continuous = 0;
     478e:	4581                	li	a1,0
-    printf("Usage: usertests [-c] [-C] [-q] [testname]\n");
-    exit(1);
-  }
-  if (drivetests(quick, continuous, justone)) {
     4790:	864a                	mv	a2,s2
     4792:	f11ff0ef          	jal	46a2 <drivetests>
     4796:	c935                	beqz	a0,480a <main+0x9a>
-    exit(1);
     4798:	4505                	li	a0,1
     479a:	2ec000ef          	jal	4a86 <exit>
-  if(argc == 2 && strcmp(argv[1], "-q") == 0){
     479e:	0085b903          	ld	s2,8(a1)
     47a2:	00003597          	auipc	a1,0x3
     47a6:	8c658593          	addi	a1,a1,-1850 # 7068 <malloc+0x20fe>
@@ -8123,103 +6013,124 @@ main(int argc, char *argv[])
     47ac:	09e000ef          	jal	484a <strcmp>
     47b0:	85aa                	mv	a1,a0
     47b2:	c139                	beqz	a0,47f8 <main+0x88>
-  } else if(argc == 2 && strcmp(argv[1], "-c") == 0){
     47b4:	00003597          	auipc	a1,0x3
     47b8:	8bc58593          	addi	a1,a1,-1860 # 7070 <malloc+0x2106>
     47bc:	854a                	mv	a0,s2
     47be:	08c000ef          	jal	484a <strcmp>
     47c2:	cd15                	beqz	a0,47fe <main+0x8e>
-  } else if(argc == 2 && strcmp(argv[1], "-C") == 0){
     47c4:	00003597          	auipc	a1,0x3
     47c8:	8b458593          	addi	a1,a1,-1868 # 7078 <malloc+0x210e>
     47cc:	854a                	mv	a0,s2
     47ce:	07c000ef          	jal	484a <strcmp>
     47d2:	c90d                	beqz	a0,4804 <main+0x94>
-  } else if(argc == 2 && argv[1][0] != '-'){
     47d4:	00094703          	lbu	a4,0(s2)
     47d8:	02d00793          	li	a5,45
     47dc:	00f70563          	beq	a4,a5,47e6 <main+0x76>
-  int quick = 0;
     47e0:	4501                	li	a0,0
-  int continuous = 0;
     47e2:	4581                	li	a1,0
     47e4:	b775                	j	4790 <main+0x20>
-    printf("Usage: usertests [-c] [-C] [-q] [testname]\n");
     47e6:	00003517          	auipc	a0,0x3
     47ea:	89a50513          	addi	a0,a0,-1894 # 7080 <malloc+0x2116>
     47ee:	6c8000ef          	jal	4eb6 <printf>
-    exit(1);
     47f2:	4505                	li	a0,1
     47f4:	292000ef          	jal	4a86 <exit>
-  char *justone = 0;
     47f8:	4901                	li	s2,0
-    quick = 1;
     47fa:	4505                	li	a0,1
     47fc:	bf51                	j	4790 <main+0x20>
-  char *justone = 0;
     47fe:	4901                	li	s2,0
-    continuous = 1;
     4800:	4585                	li	a1,1
     4802:	b779                	j	4790 <main+0x20>
-    continuous = 2;
     4804:	85a6                	mv	a1,s1
-  char *justone = 0;
     4806:	4901                	li	s2,0
     4808:	b761                	j	4790 <main+0x20>
-  }
-  printf("ALL TESTS PASSED\n");
     480a:	00003517          	auipc	a0,0x3
     480e:	8a650513          	addi	a0,a0,-1882 # 70b0 <malloc+0x2146>
     4812:	6a4000ef          	jal	4eb6 <printf>
-  exit(0);
     4816:	4501                	li	a0,0
     4818:	26e000ef          	jal	4a86 <exit>
 
 000000000000481c <start>:
+// 
+// wrapper so that it's OK if main() does not call exit().
+//
+void
+start()
+{
     481c:	1141                	addi	sp,sp,-16
     481e:	e406                	sd	ra,8(sp)
     4820:	e022                	sd	s0,0(sp)
     4822:	0800                	addi	s0,sp,16
+  extern int main();
+  main();
     4824:	f4dff0ef          	jal	4770 <main>
+  exit(0);
     4828:	4501                	li	a0,0
     482a:	25c000ef          	jal	4a86 <exit>
 
 000000000000482e <strcpy>:
+}
+
+char*
+strcpy(char *s, const char *t)
+{
     482e:	1141                	addi	sp,sp,-16
     4830:	e422                	sd	s0,8(sp)
     4832:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
     4834:	87aa                	mv	a5,a0
     4836:	0585                	addi	a1,a1,1
     4838:	0785                	addi	a5,a5,1
     483a:	fff5c703          	lbu	a4,-1(a1)
     483e:	fee78fa3          	sb	a4,-1(a5)
     4842:	fb75                	bnez	a4,4836 <strcpy+0x8>
+    ;
+  return os;
+}
     4844:	6422                	ld	s0,8(sp)
     4846:	0141                	addi	sp,sp,16
     4848:	8082                	ret
 
 000000000000484a <strcmp>:
+
+int
+strcmp(const char *p, const char *q)
+{
     484a:	1141                	addi	sp,sp,-16
     484c:	e422                	sd	s0,8(sp)
     484e:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
     4850:	00054783          	lbu	a5,0(a0)
     4854:	cb91                	beqz	a5,4868 <strcmp+0x1e>
     4856:	0005c703          	lbu	a4,0(a1)
     485a:	00f71763          	bne	a4,a5,4868 <strcmp+0x1e>
+    p++, q++;
     485e:	0505                	addi	a0,a0,1
     4860:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
     4862:	00054783          	lbu	a5,0(a0)
     4866:	fbe5                	bnez	a5,4856 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
     4868:	0005c503          	lbu	a0,0(a1)
+}
     486c:	40a7853b          	subw	a0,a5,a0
     4870:	6422                	ld	s0,8(sp)
     4872:	0141                	addi	sp,sp,16
     4874:	8082                	ret
 
 0000000000004876 <strlen>:
+
+uint
+strlen(const char *s)
+{
     4876:	1141                	addi	sp,sp,-16
     4878:	e422                	sd	s0,8(sp)
     487a:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
     487c:	00054783          	lbu	a5,0(a0)
     4880:	cf91                	beqz	a5,489c <strlen+0x26>
     4882:	0505                	addi	a0,a0,1
@@ -8230,46 +6141,77 @@ main(int argc, char *argv[])
     488e:	ff65                	bnez	a4,4886 <strlen+0x10>
     4890:	40a6853b          	subw	a0,a3,a0
     4894:	2505                	addiw	a0,a0,1
+    ;
+  return n;
+}
     4896:	6422                	ld	s0,8(sp)
     4898:	0141                	addi	sp,sp,16
     489a:	8082                	ret
+  for(n = 0; s[n]; n++)
     489c:	4501                	li	a0,0
     489e:	bfe5                	j	4896 <strlen+0x20>
 
 00000000000048a0 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
     48a0:	1141                	addi	sp,sp,-16
     48a2:	e422                	sd	s0,8(sp)
     48a4:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
     48a6:	ca19                	beqz	a2,48bc <memset+0x1c>
     48a8:	87aa                	mv	a5,a0
     48aa:	1602                	slli	a2,a2,0x20
     48ac:	9201                	srli	a2,a2,0x20
     48ae:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
     48b2:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
     48b6:	0785                	addi	a5,a5,1
     48b8:	fee79de3          	bne	a5,a4,48b2 <memset+0x12>
+  }
+  return dst;
+}
     48bc:	6422                	ld	s0,8(sp)
     48be:	0141                	addi	sp,sp,16
     48c0:	8082                	ret
 
 00000000000048c2 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
     48c2:	1141                	addi	sp,sp,-16
     48c4:	e422                	sd	s0,8(sp)
     48c6:	0800                	addi	s0,sp,16
+  for(; *s; s++)
     48c8:	00054783          	lbu	a5,0(a0)
     48cc:	cb99                	beqz	a5,48e2 <strchr+0x20>
+    if(*s == c)
     48ce:	00f58763          	beq	a1,a5,48dc <strchr+0x1a>
+  for(; *s; s++)
     48d2:	0505                	addi	a0,a0,1
     48d4:	00054783          	lbu	a5,0(a0)
     48d8:	fbfd                	bnez	a5,48ce <strchr+0xc>
+      return (char*)s;
+  return 0;
     48da:	4501                	li	a0,0
+}
     48dc:	6422                	ld	s0,8(sp)
     48de:	0141                	addi	sp,sp,16
     48e0:	8082                	ret
+  return 0;
     48e2:	4501                	li	a0,0
     48e4:	bfe5                	j	48dc <strchr+0x1a>
 
 00000000000048e6 <gets>:
+
+char*
+gets(char *buf, int max)
+{
     48e6:	711d                	addi	sp,sp,-96
     48e8:	ec86                	sd	ra,88(sp)
     48ea:	e8a2                	sd	s0,80(sp)
@@ -8283,28 +6225,48 @@ main(int argc, char *argv[])
     48fa:	1080                	addi	s0,sp,96
     48fc:	8baa                	mv	s7,a0
     48fe:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
     4900:	892a                	mv	s2,a0
     4902:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
     4904:	4aa9                	li	s5,10
     4906:	4b35                	li	s6,13
+  for(i=0; i+1 < max; ){
     4908:	89a6                	mv	s3,s1
     490a:	2485                	addiw	s1,s1,1
     490c:	0344d663          	bge	s1,s4,4938 <gets+0x52>
+    cc = read(0, &c, 1);
     4910:	4605                	li	a2,1
     4912:	faf40593          	addi	a1,s0,-81
     4916:	4501                	li	a0,0
     4918:	186000ef          	jal	4a9e <read>
+    if(cc < 1)
     491c:	00a05e63          	blez	a0,4938 <gets+0x52>
+    buf[i++] = c;
     4920:	faf44783          	lbu	a5,-81(s0)
     4924:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
     4928:	01578763          	beq	a5,s5,4936 <gets+0x50>
     492c:	0905                	addi	s2,s2,1
     492e:	fd679de3          	bne	a5,s6,4908 <gets+0x22>
+    buf[i++] = c;
     4932:	89a6                	mv	s3,s1
     4934:	a011                	j	4938 <gets+0x52>
     4936:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
     4938:	99de                	add	s3,s3,s7
     493a:	00098023          	sb	zero,0(s3)
+  return buf;
+}
     493e:	855e                	mv	a0,s7
     4940:	60e6                	ld	ra,88(sp)
     4942:	6446                	ld	s0,80(sp)
@@ -8319,123 +6281,200 @@ main(int argc, char *argv[])
     4954:	8082                	ret
 
 0000000000004956 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
     4956:	1101                	addi	sp,sp,-32
     4958:	ec06                	sd	ra,24(sp)
     495a:	e822                	sd	s0,16(sp)
     495c:	e04a                	sd	s2,0(sp)
     495e:	1000                	addi	s0,sp,32
     4960:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
     4962:	4581                	li	a1,0
     4964:	162000ef          	jal	4ac6 <open>
+  if(fd < 0)
     4968:	02054263          	bltz	a0,498c <stat+0x36>
     496c:	e426                	sd	s1,8(sp)
     496e:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
     4970:	85ca                	mv	a1,s2
     4972:	16c000ef          	jal	4ade <fstat>
     4976:	892a                	mv	s2,a0
+  close(fd);
     4978:	8526                	mv	a0,s1
     497a:	134000ef          	jal	4aae <close>
+  return r;
     497e:	64a2                	ld	s1,8(sp)
+}
     4980:	854a                	mv	a0,s2
     4982:	60e2                	ld	ra,24(sp)
     4984:	6442                	ld	s0,16(sp)
     4986:	6902                	ld	s2,0(sp)
     4988:	6105                	addi	sp,sp,32
     498a:	8082                	ret
+    return -1;
     498c:	597d                	li	s2,-1
     498e:	bfcd                	j	4980 <stat+0x2a>
 
 0000000000004990 <atoi>:
+
+int
+atoi(const char *s)
+{
     4990:	1141                	addi	sp,sp,-16
     4992:	e422                	sd	s0,8(sp)
     4994:	0800                	addi	s0,sp,16
+  int n;
+
+  n = 0;
+  while('0' <= *s && *s <= '9')
     4996:	00054683          	lbu	a3,0(a0)
     499a:	fd06879b          	addiw	a5,a3,-48
     499e:	0ff7f793          	zext.b	a5,a5
     49a2:	4625                	li	a2,9
     49a4:	02f66863          	bltu	a2,a5,49d4 <atoi+0x44>
     49a8:	872a                	mv	a4,a0
+  n = 0;
     49aa:	4501                	li	a0,0
+    n = n*10 + *s++ - '0';
     49ac:	0705                	addi	a4,a4,1
     49ae:	0025179b          	slliw	a5,a0,0x2
     49b2:	9fa9                	addw	a5,a5,a0
     49b4:	0017979b          	slliw	a5,a5,0x1
     49b8:	9fb5                	addw	a5,a5,a3
     49ba:	fd07851b          	addiw	a0,a5,-48
+  while('0' <= *s && *s <= '9')
     49be:	00074683          	lbu	a3,0(a4)
     49c2:	fd06879b          	addiw	a5,a3,-48
     49c6:	0ff7f793          	zext.b	a5,a5
     49ca:	fef671e3          	bgeu	a2,a5,49ac <atoi+0x1c>
+  return n;
+}
     49ce:	6422                	ld	s0,8(sp)
     49d0:	0141                	addi	sp,sp,16
     49d2:	8082                	ret
+  n = 0;
     49d4:	4501                	li	a0,0
     49d6:	bfe5                	j	49ce <atoi+0x3e>
 
 00000000000049d8 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
     49d8:	1141                	addi	sp,sp,-16
     49da:	e422                	sd	s0,8(sp)
     49dc:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
     49de:	02b57463          	bgeu	a0,a1,4a06 <memmove+0x2e>
+    while(n-- > 0)
     49e2:	00c05f63          	blez	a2,4a00 <memmove+0x28>
     49e6:	1602                	slli	a2,a2,0x20
     49e8:	9201                	srli	a2,a2,0x20
     49ea:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
     49ee:	872a                	mv	a4,a0
+      *dst++ = *src++;
     49f0:	0585                	addi	a1,a1,1
     49f2:	0705                	addi	a4,a4,1
     49f4:	fff5c683          	lbu	a3,-1(a1)
     49f8:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
     49fc:	fef71ae3          	bne	a4,a5,49f0 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
     4a00:	6422                	ld	s0,8(sp)
     4a02:	0141                	addi	sp,sp,16
     4a04:	8082                	ret
+    dst += n;
     4a06:	00c50733          	add	a4,a0,a2
+    src += n;
     4a0a:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
     4a0c:	fec05ae3          	blez	a2,4a00 <memmove+0x28>
     4a10:	fff6079b          	addiw	a5,a2,-1 # 2fff <subdir+0x41d>
     4a14:	1782                	slli	a5,a5,0x20
     4a16:	9381                	srli	a5,a5,0x20
     4a18:	fff7c793          	not	a5,a5
     4a1c:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
     4a1e:	15fd                	addi	a1,a1,-1
     4a20:	177d                	addi	a4,a4,-1
     4a22:	0005c683          	lbu	a3,0(a1)
     4a26:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
     4a2a:	fee79ae3          	bne	a5,a4,4a1e <memmove+0x46>
     4a2e:	bfc9                	j	4a00 <memmove+0x28>
 
 0000000000004a30 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
     4a30:	1141                	addi	sp,sp,-16
     4a32:	e422                	sd	s0,8(sp)
     4a34:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
     4a36:	ca05                	beqz	a2,4a66 <memcmp+0x36>
     4a38:	fff6069b          	addiw	a3,a2,-1
     4a3c:	1682                	slli	a3,a3,0x20
     4a3e:	9281                	srli	a3,a3,0x20
     4a40:	0685                	addi	a3,a3,1
     4a42:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
     4a44:	00054783          	lbu	a5,0(a0)
     4a48:	0005c703          	lbu	a4,0(a1)
     4a4c:	00e79863          	bne	a5,a4,4a5c <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
     4a50:	0505                	addi	a0,a0,1
+    p2++;
     4a52:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
     4a54:	fed518e3          	bne	a0,a3,4a44 <memcmp+0x14>
+  }
+  return 0;
     4a58:	4501                	li	a0,0
     4a5a:	a019                	j	4a60 <memcmp+0x30>
+      return *p1 - *p2;
     4a5c:	40e7853b          	subw	a0,a5,a4
+}
     4a60:	6422                	ld	s0,8(sp)
     4a62:	0141                	addi	sp,sp,16
     4a64:	8082                	ret
+  return 0;
     4a66:	4501                	li	a0,0
     4a68:	bfe5                	j	4a60 <memcmp+0x30>
 
 0000000000004a6a <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
     4a6a:	1141                	addi	sp,sp,-16
     4a6c:	e406                	sd	ra,8(sp)
     4a6e:	e022                	sd	s0,0(sp)
     4a70:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
     4a72:	f67ff0ef          	jal	49d8 <memmove>
+}
     4a76:	60a2                	ld	ra,8(sp)
     4a78:	6402                	ld	s0,0(sp)
     4a7a:	0141                	addi	sp,sp,16
@@ -8562,32 +6601,60 @@ main(int argc, char *argv[])
     4b3c:	8082                	ret
 
 0000000000004b3e <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
     4b3e:	1101                	addi	sp,sp,-32
     4b40:	ec06                	sd	ra,24(sp)
     4b42:	e822                	sd	s0,16(sp)
     4b44:	1000                	addi	s0,sp,32
     4b46:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
     4b4a:	4605                	li	a2,1
     4b4c:	fef40593          	addi	a1,s0,-17
     4b50:	f57ff0ef          	jal	4aa6 <write>
+}
     4b54:	60e2                	ld	ra,24(sp)
     4b56:	6442                	ld	s0,16(sp)
     4b58:	6105                	addi	sp,sp,32
     4b5a:	8082                	ret
 
 0000000000004b5c <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
     4b5c:	7139                	addi	sp,sp,-64
     4b5e:	fc06                	sd	ra,56(sp)
     4b60:	f822                	sd	s0,48(sp)
     4b62:	f426                	sd	s1,40(sp)
     4b64:	0080                	addi	s0,sp,64
     4b66:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
     4b68:	c299                	beqz	a3,4b6e <printint+0x12>
     4b6a:	0805c963          	bltz	a1,4bfc <printint+0xa0>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
     4b6e:	2581                	sext.w	a1,a1
+  neg = 0;
     4b70:	4881                	li	a7,0
     4b72:	fc040693          	addi	a3,s0,-64
+  }
+
+  i = 0;
     4b76:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
     4b78:	2601                	sext.w	a2,a2
     4b7a:	00003517          	auipc	a0,0x3
     4b7e:	90650513          	addi	a0,a0,-1786 # 7480 <digits>
@@ -8599,16 +6666,21 @@ main(int argc, char *argv[])
     4b8e:	97aa                	add	a5,a5,a0
     4b90:	0007c783          	lbu	a5,0(a5)
     4b94:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
     4b98:	0005879b          	sext.w	a5,a1
     4b9c:	02c5d5bb          	divuw	a1,a1,a2
     4ba0:	0685                	addi	a3,a3,1
     4ba2:	fec7f0e3          	bgeu	a5,a2,4b82 <printint+0x26>
+  if(neg)
     4ba6:	00088c63          	beqz	a7,4bbe <printint+0x62>
+    buf[i++] = '-';
     4baa:	fd070793          	addi	a5,a4,-48
     4bae:	00878733          	add	a4,a5,s0
     4bb2:	02d00793          	li	a5,45
     4bb6:	fef70823          	sb	a5,-16(a4)
     4bba:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
     4bbe:	02e05a63          	blez	a4,4bf2 <printint+0x96>
     4bc2:	f04a                	sd	s2,32(sp)
     4bc4:	ec4e                	sd	s3,24(sp)
@@ -8620,28 +6692,45 @@ main(int argc, char *argv[])
     4bd6:	1702                	slli	a4,a4,0x20
     4bd8:	9301                	srli	a4,a4,0x20
     4bda:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
     4bde:	fff94583          	lbu	a1,-1(s2)
     4be2:	8526                	mv	a0,s1
     4be4:	f5bff0ef          	jal	4b3e <putc>
+  while(--i >= 0)
     4be8:	197d                	addi	s2,s2,-1
     4bea:	ff391ae3          	bne	s2,s3,4bde <printint+0x82>
     4bee:	7902                	ld	s2,32(sp)
     4bf0:	69e2                	ld	s3,24(sp)
+}
     4bf2:	70e2                	ld	ra,56(sp)
     4bf4:	7442                	ld	s0,48(sp)
     4bf6:	74a2                	ld	s1,40(sp)
     4bf8:	6121                	addi	sp,sp,64
     4bfa:	8082                	ret
+    x = -xx;
     4bfc:	40b005bb          	negw	a1,a1
+    neg = 1;
     4c00:	4885                	li	a7,1
+    x = -xx;
     4c02:	bf85                	j	4b72 <printint+0x16>
 
 0000000000004c04 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
     4c04:	711d                	addi	sp,sp,-96
     4c06:	ec86                	sd	ra,88(sp)
     4c08:	e8a2                	sd	s0,80(sp)
     4c0a:	e0ca                	sd	s2,64(sp)
     4c0c:	1080                	addi	s0,sp,96
+  char *s;
+  int c0, c1, c2, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
     4c0e:	0005c903          	lbu	s2,0(a1)
     4c12:	26090863          	beqz	s2,4e82 <vprintf+0x27e>
     4c16:	e4a6                	sd	s1,72(sp)
@@ -8655,51 +6744,110 @@ main(int argc, char *argv[])
     4c26:	8b2a                	mv	s6,a0
     4c28:	8a2e                	mv	s4,a1
     4c2a:	8bb2                	mv	s7,a2
+  state = 0;
     4c2c:	4981                	li	s3,0
+  for(i = 0; fmt[i]; i++){
     4c2e:	4481                	li	s1,0
     4c30:	4701                	li	a4,0
+      if(c0 == '%'){
+        state = '%';
+      } else {
+        putc(fd, c0);
+      }
+    } else if(state == '%'){
     4c32:	02500a93          	li	s5,37
+      c1 = c2 = 0;
+      if(c0) c1 = fmt[i+1] & 0xff;
+      if(c1) c2 = fmt[i+2] & 0xff;
+      if(c0 == 'd'){
     4c36:	06400c13          	li	s8,100
+        printint(fd, va_arg(ap, int), 10, 1);
+      } else if(c0 == 'l' && c1 == 'd'){
     4c3a:	06c00c93          	li	s9,108
     4c3e:	a005                	j	4c5e <vprintf+0x5a>
+        putc(fd, c0);
     4c40:	85ca                	mv	a1,s2
     4c42:	855a                	mv	a0,s6
     4c44:	efbff0ef          	jal	4b3e <putc>
     4c48:	a019                	j	4c4e <vprintf+0x4a>
+    } else if(state == '%'){
     4c4a:	03598263          	beq	s3,s5,4c6e <vprintf+0x6a>
+  for(i = 0; fmt[i]; i++){
     4c4e:	2485                	addiw	s1,s1,1
     4c50:	8726                	mv	a4,s1
     4c52:	009a07b3          	add	a5,s4,s1
     4c56:	0007c903          	lbu	s2,0(a5)
     4c5a:	20090c63          	beqz	s2,4e72 <vprintf+0x26e>
+    c0 = fmt[i] & 0xff;
     4c5e:	0009079b          	sext.w	a5,s2
+    if(state == 0){
     4c62:	fe0994e3          	bnez	s3,4c4a <vprintf+0x46>
+      if(c0 == '%'){
     4c66:	fd579de3          	bne	a5,s5,4c40 <vprintf+0x3c>
+        state = '%';
     4c6a:	89be                	mv	s3,a5
     4c6c:	b7cd                	j	4c4e <vprintf+0x4a>
+      if(c0) c1 = fmt[i+1] & 0xff;
     4c6e:	00ea06b3          	add	a3,s4,a4
     4c72:	0016c683          	lbu	a3,1(a3)
+      c1 = c2 = 0;
     4c76:	8636                	mv	a2,a3
+      if(c1) c2 = fmt[i+2] & 0xff;
     4c78:	c681                	beqz	a3,4c80 <vprintf+0x7c>
     4c7a:	9752                	add	a4,a4,s4
     4c7c:	00274603          	lbu	a2,2(a4)
+      if(c0 == 'd'){
     4c80:	03878f63          	beq	a5,s8,4cbe <vprintf+0xba>
+      } else if(c0 == 'l' && c1 == 'd'){
     4c84:	05978963          	beq	a5,s9,4cd6 <vprintf+0xd2>
+        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'){
     4c88:	07500713          	li	a4,117
     4c8c:	0ee78363          	beq	a5,a4,4d72 <vprintf+0x16e>
+        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'){
     4c90:	07800713          	li	a4,120
     4c94:	12e78563          	beq	a5,a4,4dbe <vprintf+0x1ba>
+        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'){
     4c98:	07000713          	li	a4,112
     4c9c:	14e78a63          	beq	a5,a4,4df0 <vprintf+0x1ec>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c0 == 's'){
     4ca0:	07300713          	li	a4,115
     4ca4:	18e78a63          	beq	a5,a4,4e38 <vprintf+0x234>
+        if((s = va_arg(ap, char*)) == 0)
+          s = "(null)";
+        for(; *s; s++)
+          putc(fd, *s);
+      } else if(c0 == '%'){
     4ca8:	02500713          	li	a4,37
     4cac:	04e79563          	bne	a5,a4,4cf6 <vprintf+0xf2>
+        putc(fd, '%');
     4cb0:	02500593          	li	a1,37
     4cb4:	855a                	mv	a0,s6
     4cb6:	e89ff0ef          	jal	4b3e <putc>
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+#endif
+      state = 0;
     4cba:	4981                	li	s3,0
     4cbc:	bf49                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 1);
     4cbe:	008b8913          	addi	s2,s7,8
     4cc2:	4685                	li	a3,1
     4cc4:	4629                	li	a2,10
@@ -8707,60 +6855,87 @@ main(int argc, char *argv[])
     4cca:	855a                	mv	a0,s6
     4ccc:	e91ff0ef          	jal	4b5c <printint>
     4cd0:	8bca                	mv	s7,s2
+      state = 0;
     4cd2:	4981                	li	s3,0
     4cd4:	bfad                	j	4c4e <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'd'){
     4cd6:	06400793          	li	a5,100
     4cda:	02f68963          	beq	a3,a5,4d0c <vprintf+0x108>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
     4cde:	06c00793          	li	a5,108
     4ce2:	04f68263          	beq	a3,a5,4d26 <vprintf+0x122>
+      } else if(c0 == 'l' && c1 == 'u'){
     4ce6:	07500793          	li	a5,117
     4cea:	0af68063          	beq	a3,a5,4d8a <vprintf+0x186>
+      } else if(c0 == 'l' && c1 == 'x'){
     4cee:	07800793          	li	a5,120
     4cf2:	0ef68263          	beq	a3,a5,4dd6 <vprintf+0x1d2>
+        putc(fd, '%');
     4cf6:	02500593          	li	a1,37
     4cfa:	855a                	mv	a0,s6
     4cfc:	e43ff0ef          	jal	4b3e <putc>
+        putc(fd, c0);
     4d00:	85ca                	mv	a1,s2
     4d02:	855a                	mv	a0,s6
     4d04:	e3bff0ef          	jal	4b3e <putc>
+      state = 0;
     4d08:	4981                	li	s3,0
     4d0a:	b791                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
     4d0c:	008b8913          	addi	s2,s7,8
     4d10:	4685                	li	a3,1
     4d12:	4629                	li	a2,10
     4d14:	000ba583          	lw	a1,0(s7)
     4d18:	855a                	mv	a0,s6
     4d1a:	e43ff0ef          	jal	4b5c <printint>
+        i += 1;
     4d1e:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 1);
     4d20:	8bca                	mv	s7,s2
+      state = 0;
     4d22:	4981                	li	s3,0
+        i += 1;
     4d24:	b72d                	j	4c4e <vprintf+0x4a>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){
     4d26:	06400793          	li	a5,100
     4d2a:	02f60763          	beq	a2,a5,4d58 <vprintf+0x154>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){
     4d2e:	07500793          	li	a5,117
     4d32:	06f60963          	beq	a2,a5,4da4 <vprintf+0x1a0>
+      } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){
     4d36:	07800793          	li	a5,120
     4d3a:	faf61ee3          	bne	a2,a5,4cf6 <vprintf+0xf2>
+        printint(fd, va_arg(ap, uint64), 16, 0);
     4d3e:	008b8913          	addi	s2,s7,8
     4d42:	4681                	li	a3,0
     4d44:	4641                	li	a2,16
     4d46:	000ba583          	lw	a1,0(s7)
     4d4a:	855a                	mv	a0,s6
     4d4c:	e11ff0ef          	jal	4b5c <printint>
+        i += 2;
     4d50:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 16, 0);
     4d52:	8bca                	mv	s7,s2
+      state = 0;
     4d54:	4981                	li	s3,0
+        i += 2;
     4d56:	bde5                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 1);
     4d58:	008b8913          	addi	s2,s7,8
     4d5c:	4685                	li	a3,1
     4d5e:	4629                	li	a2,10
     4d60:	000ba583          	lw	a1,0(s7)
     4d64:	855a                	mv	a0,s6
     4d66:	df7ff0ef          	jal	4b5c <printint>
+        i += 2;
     4d6a:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 1);
     4d6c:	8bca                	mv	s7,s2
+      state = 0;
     4d6e:	4981                	li	s3,0
+        i += 2;
     4d70:	bdf9                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 10, 0);
     4d72:	008b8913          	addi	s2,s7,8
     4d76:	4681                	li	a3,0
     4d78:	4629                	li	a2,10
@@ -8768,28 +6943,40 @@ main(int argc, char *argv[])
     4d7e:	855a                	mv	a0,s6
     4d80:	dddff0ef          	jal	4b5c <printint>
     4d84:	8bca                	mv	s7,s2
+      state = 0;
     4d86:	4981                	li	s3,0
     4d88:	b5d9                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
     4d8a:	008b8913          	addi	s2,s7,8
     4d8e:	4681                	li	a3,0
     4d90:	4629                	li	a2,10
     4d92:	000ba583          	lw	a1,0(s7)
     4d96:	855a                	mv	a0,s6
     4d98:	dc5ff0ef          	jal	4b5c <printint>
+        i += 1;
     4d9c:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 10, 0);
     4d9e:	8bca                	mv	s7,s2
+      state = 0;
     4da0:	4981                	li	s3,0
+        i += 1;
     4da2:	b575                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 10, 0);
     4da4:	008b8913          	addi	s2,s7,8
     4da8:	4681                	li	a3,0
     4daa:	4629                	li	a2,10
     4dac:	000ba583          	lw	a1,0(s7)
     4db0:	855a                	mv	a0,s6
     4db2:	dabff0ef          	jal	4b5c <printint>
+        i += 2;
     4db6:	2489                	addiw	s1,s1,2
+        printint(fd, va_arg(ap, uint64), 10, 0);
     4db8:	8bca                	mv	s7,s2
+      state = 0;
     4dba:	4981                	li	s3,0
+        i += 2;
     4dbc:	bd49                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, int), 16, 0);
     4dbe:	008b8913          	addi	s2,s7,8
     4dc2:	4681                	li	a3,0
     4dc4:	4641                	li	a2,16
@@ -8797,28 +6984,38 @@ main(int argc, char *argv[])
     4dca:	855a                	mv	a0,s6
     4dcc:	d91ff0ef          	jal	4b5c <printint>
     4dd0:	8bca                	mv	s7,s2
+      state = 0;
     4dd2:	4981                	li	s3,0
     4dd4:	bdad                	j	4c4e <vprintf+0x4a>
+        printint(fd, va_arg(ap, uint64), 16, 0);
     4dd6:	008b8913          	addi	s2,s7,8
     4dda:	4681                	li	a3,0
     4ddc:	4641                	li	a2,16
     4dde:	000ba583          	lw	a1,0(s7)
     4de2:	855a                	mv	a0,s6
     4de4:	d79ff0ef          	jal	4b5c <printint>
+        i += 1;
     4de8:	2485                	addiw	s1,s1,1
+        printint(fd, va_arg(ap, uint64), 16, 0);
     4dea:	8bca                	mv	s7,s2
+      state = 0;
     4dec:	4981                	li	s3,0
+        i += 1;
     4dee:	b585                	j	4c4e <vprintf+0x4a>
     4df0:	e06a                	sd	s10,0(sp)
+        printptr(fd, va_arg(ap, uint64));
     4df2:	008b8d13          	addi	s10,s7,8
     4df6:	000bb983          	ld	s3,0(s7)
+  putc(fd, '0');
     4dfa:	03000593          	li	a1,48
     4dfe:	855a                	mv	a0,s6
     4e00:	d3fff0ef          	jal	4b3e <putc>
+  putc(fd, 'x');
     4e04:	07800593          	li	a1,120
     4e08:	855a                	mv	a0,s6
     4e0a:	d35ff0ef          	jal	4b3e <putc>
     4e0e:	4941                	li	s2,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
     4e10:	00002b97          	auipc	s7,0x2
     4e14:	670b8b93          	addi	s7,s7,1648 # 7480 <digits>
     4e18:	03c9d793          	srli	a5,s3,0x3c
@@ -8826,31 +7023,44 @@ main(int argc, char *argv[])
     4e1e:	0007c583          	lbu	a1,0(a5)
     4e22:	855a                	mv	a0,s6
     4e24:	d1bff0ef          	jal	4b3e <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
     4e28:	0992                	slli	s3,s3,0x4
     4e2a:	397d                	addiw	s2,s2,-1
     4e2c:	fe0916e3          	bnez	s2,4e18 <vprintf+0x214>
+        printptr(fd, va_arg(ap, uint64));
     4e30:	8bea                	mv	s7,s10
+      state = 0;
     4e32:	4981                	li	s3,0
     4e34:	6d02                	ld	s10,0(sp)
     4e36:	bd21                	j	4c4e <vprintf+0x4a>
+        if((s = va_arg(ap, char*)) == 0)
     4e38:	008b8993          	addi	s3,s7,8
     4e3c:	000bb903          	ld	s2,0(s7)
     4e40:	00090f63          	beqz	s2,4e5e <vprintf+0x25a>
+        for(; *s; s++)
     4e44:	00094583          	lbu	a1,0(s2)
     4e48:	c195                	beqz	a1,4e6c <vprintf+0x268>
+          putc(fd, *s);
     4e4a:	855a                	mv	a0,s6
     4e4c:	cf3ff0ef          	jal	4b3e <putc>
+        for(; *s; s++)
     4e50:	0905                	addi	s2,s2,1
     4e52:	00094583          	lbu	a1,0(s2)
     4e56:	f9f5                	bnez	a1,4e4a <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
     4e58:	8bce                	mv	s7,s3
+      state = 0;
     4e5a:	4981                	li	s3,0
     4e5c:	bbcd                	j	4c4e <vprintf+0x4a>
+          s = "(null)";
     4e5e:	00002917          	auipc	s2,0x2
     4e62:	5a290913          	addi	s2,s2,1442 # 7400 <malloc+0x2496>
+        for(; *s; s++)
     4e66:	02800593          	li	a1,40
     4e6a:	b7c5                	j	4e4a <vprintf+0x246>
+        if((s = va_arg(ap, char*)) == 0)
     4e6c:	8bce                	mv	s7,s3
+      state = 0;
     4e6e:	4981                	li	s3,0
     4e70:	bbf9                	j	4c4e <vprintf+0x4a>
     4e72:	64a6                	ld	s1,72(sp)
@@ -8861,6 +7071,9 @@ main(int argc, char *argv[])
     4e7c:	6be2                	ld	s7,24(sp)
     4e7e:	6c42                	ld	s8,16(sp)
     4e80:	6ca2                	ld	s9,8(sp)
+    }
+  }
+}
     4e82:	60e6                	ld	ra,88(sp)
     4e84:	6446                	ld	s0,80(sp)
     4e86:	6906                	ld	s2,64(sp)
@@ -8868,6 +7081,10 @@ main(int argc, char *argv[])
     4e8a:	8082                	ret
 
 0000000000004e8c <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
     4e8c:	715d                	addi	sp,sp,-80
     4e8e:	ec06                	sd	ra,24(sp)
     4e90:	e822                	sd	s0,16(sp)
@@ -8878,15 +7095,24 @@ main(int argc, char *argv[])
     4e9a:	ec1c                	sd	a5,24(s0)
     4e9c:	03043023          	sd	a6,32(s0)
     4ea0:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
     4ea4:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
     4ea8:	8622                	mv	a2,s0
     4eaa:	d5bff0ef          	jal	4c04 <vprintf>
+}
     4eae:	60e2                	ld	ra,24(sp)
     4eb0:	6442                	ld	s0,16(sp)
     4eb2:	6161                	addi	sp,sp,80
     4eb4:	8082                	ret
 
 0000000000004eb6 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
     4eb6:	711d                	addi	sp,sp,-96
     4eb8:	ec06                	sd	ra,24(sp)
     4eba:	e822                	sd	s0,16(sp)
@@ -8898,11 +7124,16 @@ main(int argc, char *argv[])
     4ec6:	f41c                	sd	a5,40(s0)
     4ec8:	03043823          	sd	a6,48(s0)
     4ecc:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
     4ed0:	00840613          	addi	a2,s0,8
     4ed4:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
     4ed8:	85aa                	mv	a1,a0
     4eda:	4505                	li	a0,1
     4edc:	d29ff0ef          	jal	4c04 <vprintf>
+}
     4ee0:	60e2                	ld	ra,24(sp)
     4ee2:	6442                	ld	s0,16(sp)
     4ee4:	6125                	addi	sp,sp,96
diff --git a/user/var_test.asm b/user/var_test.asm
index a142e7ddd6b7300ca778e5d94c30e1854f9b7fce..f1d3ce4c69a2bdd39f5b611c0cfe91cd446d79e1 100644
--- a/user/var_test.asm
+++ b/user/var_test.asm
@@ -5,69 +5,41 @@ user/_var_test:     文件格式 elf64-littleriscv
 Disassembly of section .text:
 
 0000000000000000 <main>:
-#include "user.h"
-#include "mytypes.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 value;
-    // 获取共享变量的初始值
-    value = get_shared_var();
    8:	380000ef          	jal	388 <get_shared_var>
    c:	85aa                	mv	a1,a0
-    printf("Initial shared_var: %d\n", value);
    e:	00001517          	auipc	a0,0x1
   12:	8c250513          	addi	a0,a0,-1854 # 8d0 <malloc+0x104>
   16:	702000ef          	jal	718 <printf>
-    // 设置共享变量的新值
-    set_shared_var(42);
   1a:	02a00513          	li	a0,42
   1e:	372000ef          	jal	390 <set_shared_var>
-    printf("Set shared_var to: 42\n");
   22:	00001517          	auipc	a0,0x1
   26:	8c650513          	addi	a0,a0,-1850 # 8e8 <malloc+0x11c>
   2a:	6ee000ef          	jal	718 <printf>
-    // 再次获取共享变量的值
-    value = get_shared_var();
   2e:	35a000ef          	jal	388 <get_shared_var>
   32:	85aa                	mv	a1,a0
-    printf("Updated shared_var: %d\n", value);
   34:	00001517          	auipc	a0,0x1
   38:	8d450513          	addi	a0,a0,-1836 # 908 <malloc+0x13c>
   3c:	6dc000ef          	jal	718 <printf>
-    // 测试多个进程操作共享变量
-    if (fork() == 0) {
   40:	2a0000ef          	jal	2e0 <fork>
   44:	ed11                	bnez	a0,60 <main+0x60>
-        // 子进程
-        set_shared_var(100);
   46:	06400513          	li	a0,100
   4a:	346000ef          	jal	390 <set_shared_var>
-        printf("Child process set shared_var to: 100\n");
   4e:	00001517          	auipc	a0,0x1
   52:	8d250513          	addi	a0,a0,-1838 # 920 <malloc+0x154>
   56:	6c2000ef          	jal	718 <printf>
-        exit(0);
   5a:	4501                	li	a0,0
   5c:	28c000ef          	jal	2e8 <exit>
-    } else {
-        // 父进程
-        wait(0);  // 等待子进程结束
   60:	4501                	li	a0,0
   62:	28e000ef          	jal	2f0 <wait>
-        value = get_shared_var();
   66:	322000ef          	jal	388 <get_shared_var>
   6a:	85aa                	mv	a1,a0
-        printf("After child process, shared_var: %d\n", value);
   6c:	00001517          	auipc	a0,0x1
   70:	8dc50513          	addi	a0,a0,-1828 # 948 <malloc+0x17c>
   74:	6a4000ef          	jal	718 <printf>
-    }
-    exit(0);
   78:	4501                	li	a0,0
   7a:	26e000ef          	jal	2e8 <exit>
 
@@ -503,245 +475,123 @@ memcpy(void *dst, const void *src, uint n)
  2de:	8082                	ret
 
 00000000000002e0 <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  2e0:	4885                	li	a7,1
- ecall
  2e2:	00000073          	ecall
- ret
  2e6:	8082                	ret
 
 00000000000002e8 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  2e8:	4889                	li	a7,2
- ecall
  2ea:	00000073          	ecall
- ret
  2ee:	8082                	ret
 
 00000000000002f0 <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  2f0:	488d                	li	a7,3
- ecall
  2f2:	00000073          	ecall
- ret
  2f6:	8082                	ret
 
 00000000000002f8 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  2f8:	4891                	li	a7,4
- ecall
  2fa:	00000073          	ecall
- ret
  2fe:	8082                	ret
 
 0000000000000300 <read>:
-.global read
-read:
- li a7, SYS_read
  300:	4895                	li	a7,5
- ecall
  302:	00000073          	ecall
- ret
  306:	8082                	ret
 
 0000000000000308 <write>:
-.global write
-write:
- li a7, SYS_write
  308:	48c1                	li	a7,16
- ecall
  30a:	00000073          	ecall
- ret
  30e:	8082                	ret
 
 0000000000000310 <close>:
-.global close
-close:
- li a7, SYS_close
  310:	48d5                	li	a7,21
- ecall
  312:	00000073          	ecall
- ret
  316:	8082                	ret
 
 0000000000000318 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  318:	4899                	li	a7,6
- ecall
  31a:	00000073          	ecall
- ret
  31e:	8082                	ret
 
 0000000000000320 <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  320:	489d                	li	a7,7
- ecall
  322:	00000073          	ecall
- ret
  326:	8082                	ret
 
 0000000000000328 <open>:
-.global open
-open:
- li a7, SYS_open
  328:	48bd                	li	a7,15
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  330:	48c5                	li	a7,17
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  338:	48c9                	li	a7,18
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  340:	48a1                	li	a7,8
- ecall
  342:	00000073          	ecall
- ret
  346:	8082                	ret
 
 0000000000000348 <link>:
-.global link
-link:
- li a7, SYS_link
  348:	48cd                	li	a7,19
- ecall
  34a:	00000073          	ecall
- ret
  34e:	8082                	ret
 
 0000000000000350 <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  350:	48d1                	li	a7,20
- ecall
  352:	00000073          	ecall
- ret
  356:	8082                	ret
 
 0000000000000358 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  358:	48a5                	li	a7,9
- ecall
  35a:	00000073          	ecall
- ret
  35e:	8082                	ret
 
 0000000000000360 <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  360:	48a9                	li	a7,10
- ecall
  362:	00000073          	ecall
- ret
  366:	8082                	ret
 
 0000000000000368 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  368:	48ad                	li	a7,11
- ecall
  36a:	00000073          	ecall
- ret
  36e:	8082                	ret
 
 0000000000000370 <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  370:	48b1                	li	a7,12
- ecall
  372:	00000073          	ecall
- ret
  376:	8082                	ret
 
 0000000000000378 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  378:	48b5                	li	a7,13
- ecall
  37a:	00000073          	ecall
- ret
  37e:	8082                	ret
 
 0000000000000380 <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  380:	48b9                	li	a7,14
- ecall
  382:	00000073          	ecall
- ret
  386:	8082                	ret
 
 0000000000000388 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  388:	48d9                	li	a7,22
- ecall
  38a:	00000073          	ecall
- ret
  38e:	8082                	ret
 
 0000000000000390 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  390:	48dd                	li	a7,23
- ecall
  392:	00000073          	ecall
- ret
  396:	8082                	ret
 
 0000000000000398 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  398:	48e1                	li	a7,24
- ecall
  39a:	00000073          	ecall
- ret
  39e:	8082                	ret
 
 00000000000003a0 <putc>:
@@ -1284,184 +1134,113 @@ printf(const char *fmt, ...)
  748:	8082                	ret
 
 000000000000074a <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  74a:	1141                	addi	sp,sp,-16
  74c:	e422                	sd	s0,8(sp)
  74e:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  750:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  754:	00001797          	auipc	a5,0x1
  758:	8ac7b783          	ld	a5,-1876(a5) # 1000 <freep>
  75c:	a02d                	j	786 <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;
  75e:	4618                	lw	a4,8(a2)
  760:	9f2d                	addw	a4,a4,a1
  762:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  766:	6398                	ld	a4,0(a5)
  768:	6310                	ld	a2,0(a4)
  76a:	a83d                	j	7a8 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  76c:	ff852703          	lw	a4,-8(a0)
  770:	9f31                	addw	a4,a4,a2
  772:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  774:	ff053683          	ld	a3,-16(a0)
  778:	a091                	j	7bc <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  77a:	6398                	ld	a4,0(a5)
  77c:	00e7e463          	bltu	a5,a4,784 <free+0x3a>
  780:	00e6ea63          	bltu	a3,a4,794 <free+0x4a>
-{
  784:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  786:	fed7fae3          	bgeu	a5,a3,77a <free+0x30>
  78a:	6398                	ld	a4,0(a5)
  78c:	00e6e463          	bltu	a3,a4,794 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  790:	fee7eae3          	bltu	a5,a4,784 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  794:	ff852583          	lw	a1,-8(a0)
  798:	6390                	ld	a2,0(a5)
  79a:	02059813          	slli	a6,a1,0x20
  79e:	01c85713          	srli	a4,a6,0x1c
  7a2:	9736                	add	a4,a4,a3
  7a4:	fae60de3          	beq	a2,a4,75e <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  7a8:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  7ac:	4790                	lw	a2,8(a5)
  7ae:	02061593          	slli	a1,a2,0x20
  7b2:	01c5d713          	srli	a4,a1,0x1c
  7b6:	973e                	add	a4,a4,a5
  7b8:	fae68ae3          	beq	a3,a4,76c <free+0x22>
-    p->s.ptr = bp->s.ptr;
  7bc:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  7be:	00001717          	auipc	a4,0x1
  7c2:	84f73123          	sd	a5,-1982(a4) # 1000 <freep>
-}
  7c6:	6422                	ld	s0,8(sp)
  7c8:	0141                	addi	sp,sp,16
  7ca:	8082                	ret
 
 00000000000007cc <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  7cc:	7139                	addi	sp,sp,-64
  7ce:	fc06                	sd	ra,56(sp)
  7d0:	f822                	sd	s0,48(sp)
  7d2:	f426                	sd	s1,40(sp)
  7d4:	ec4e                	sd	s3,24(sp)
  7d6:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  7d8:	02051493          	slli	s1,a0,0x20
  7dc:	9081                	srli	s1,s1,0x20
  7de:	04bd                	addi	s1,s1,15
  7e0:	8091                	srli	s1,s1,0x4
  7e2:	0014899b          	addiw	s3,s1,1
  7e6:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  7e8:	00001517          	auipc	a0,0x1
  7ec:	81853503          	ld	a0,-2024(a0) # 1000 <freep>
  7f0:	c915                	beqz	a0,824 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7f2:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7f4:	4798                	lw	a4,8(a5)
  7f6:	08977a63          	bgeu	a4,s1,88a <malloc+0xbe>
  7fa:	f04a                	sd	s2,32(sp)
  7fc:	e852                	sd	s4,16(sp)
  7fe:	e456                	sd	s5,8(sp)
  800:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  802:	8a4e                	mv	s4,s3
  804:	0009871b          	sext.w	a4,s3
  808:	6685                	lui	a3,0x1
  80a:	00d77363          	bgeu	a4,a3,810 <malloc+0x44>
  80e:	6a05                	lui	s4,0x1
  810:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  814:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  818:	00000917          	auipc	s2,0x0
  81c:	7e890913          	addi	s2,s2,2024 # 1000 <freep>
-  if(p == (char*)-1)
  820:	5afd                	li	s5,-1
  822:	a081                	j	862 <malloc+0x96>
  824:	f04a                	sd	s2,32(sp)
  826:	e852                	sd	s4,16(sp)
  828:	e456                	sd	s5,8(sp)
  82a:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  82c:	00000797          	auipc	a5,0x0
  830:	7e478793          	addi	a5,a5,2020 # 1010 <base>
  834:	00000717          	auipc	a4,0x0
  838:	7cf73623          	sd	a5,1996(a4) # 1000 <freep>
  83c:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  83e:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  842:	b7c1                	j	802 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  844:	6398                	ld	a4,0(a5)
  846:	e118                	sd	a4,0(a0)
  848:	a8a9                	j	8a2 <malloc+0xd6>
-  hp->s.size = nu;
  84a:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  84e:	0541                	addi	a0,a0,16
  850:	efbff0ef          	jal	74a <free>
-  return freep;
  854:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  858:	c12d                	beqz	a0,8ba <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  85a:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  85c:	4798                	lw	a4,8(a5)
  85e:	02977263          	bgeu	a4,s1,882 <malloc+0xb6>
-    if(p == freep)
  862:	00093703          	ld	a4,0(s2)
  866:	853e                	mv	a0,a5
  868:	fef719e3          	bne	a4,a5,85a <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  86c:	8552                	mv	a0,s4
  86e:	b03ff0ef          	jal	370 <sbrk>
-  if(p == (char*)-1)
  872:	fd551ce3          	bne	a0,s5,84a <malloc+0x7e>
-        return 0;
  876:	4501                	li	a0,0
  878:	7902                	ld	s2,32(sp)
  87a:	6a42                	ld	s4,16(sp)
@@ -1472,24 +1251,16 @@ malloc(uint nbytes)
  884:	6a42                	ld	s4,16(sp)
  886:	6aa2                	ld	s5,8(sp)
  888:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  88a:	fae48de3          	beq	s1,a4,844 <malloc+0x78>
-        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
-  }
-}
  8ae:	70e2                	ld	ra,56(sp)
  8b0:	7442                	ld	s0,48(sp)
  8b2:	74a2                	ld	s1,40(sp)
diff --git a/user/wc.asm b/user/wc.asm
index 52a7db57c4c0b8e4ae92bbd5b2827d5c2c2b2ab1..5c4a22252eee849de9fe1365bdffdc2627e7b9d9 100644
--- a/user/wc.asm
+++ b/user/wc.asm
@@ -5,12 +5,6 @@ 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)
@@ -28,75 +22,43 @@ wc(int fd, char *name)
   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:	4901                	li	s2,0
-  l = w = c = 0;
   28:	4d01                	li	s10,0
   2a:	4c81                	li	s9,0
   2c:	4c01                	li	s8,0
-  while((n = read(fd, buf, sizeof(buf))) > 0){
   2e:	00001d97          	auipc	s11,0x1
   32:	fe2d8d93          	addi	s11,s11,-30 # 1010 <buf>
-    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:	978a0a13          	addi	s4,s4,-1672 # 9b0 <malloc+0x106>
-        inword = 0;
   40:	4b81                	li	s7,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:	1bc000ef          	jal	202 <strchr>
   4a:	c919                	beqz	a0,60 <wc+0x60>
-        inword = 0;
   4c:	895e                	mv	s2,s7
-    for(i=0; i<n; i++){
   4e:	0485                	addi	s1,s1,1
   50:	01348d63          	beq	s1,s3,6a <wc+0x6a>
-      if(buf[i] == '\n')
   54:	0004c583          	lbu	a1,0(s1)
   58:	ff5596e3          	bne	a1,s5,44 <wc+0x44>
-        l++;
   5c:	2c05                	addiw	s8,s8,1
   5e:	b7dd                	j	44 <wc+0x44>
-      else if(!inword){
   60:	fe0917e3          	bnez	s2,4e <wc+0x4e>
-        w++;
   64:	2c85                	addiw	s9,s9,1
-        inword = 1;
   66:	4905                	li	s2,1
   68:	b7dd                	j	4e <wc+0x4e>
   6a:	01ab0d3b          	addw	s10,s6,s10
-  while((n = read(fd, buf, sizeof(buf))) > 0){
   6e:	20000613          	li	a2,512
   72:	85ee                	mv	a1,s11
   74:	f8843503          	ld	a0,-120(s0)
   78:	366000ef          	jal	3de <read>
   7c:	8b2a                	mv	s6,a0
   7e:	00a05963          	blez	a0,90 <wc+0x90>
-    for(i=0; i<n; i++){
   82:	00001497          	auipc	s1,0x1
   86:	f8e48493          	addi	s1,s1,-114 # 1010 <buf>
   8a:	009509b3          	add	s3,a0,s1
   8e:	b7d9                	j	54 <wc+0x54>
-      }
-    }
-  }
-  if(n < 0){
   90:	02054c63          	bltz	a0,c8 <wc+0xc8>
-    printf("wc: read error\n");
-    exit(1);
-  }
-  printf("%d %d %d %s\n", l, w, c, name);
   94:	f8043703          	ld	a4,-128(s0)
   98:	86ea                	mv	a3,s10
   9a:	8666                	mv	a2,s9
@@ -104,7 +66,6 @@ wc(int fd, char *name)
   9e:	00001517          	auipc	a0,0x1
   a2:	93250513          	addi	a0,a0,-1742 # 9d0 <malloc+0x126>
   a6:	750000ef          	jal	7f6 <printf>
-}
   aa:	70e6                	ld	ra,120(sp)
   ac:	7446                	ld	s0,112(sp)
   ae:	74a6                	ld	s1,104(sp)
@@ -120,26 +81,17 @@ wc(int fd, char *name)
   c2:	6de2                	ld	s11,24(sp)
   c4:	6109                	addi	sp,sp,128
   c6:	8082                	ret
-    printf("wc: read error\n");
   c8:	00001517          	auipc	a0,0x1
   cc:	8f850513          	addi	a0,a0,-1800 # 9c0 <malloc+0x116>
   d0:	726000ef          	jal	7f6 <printf>
-    exit(1);
   d4:	4505                	li	a0,1
   d6:	2f0000ef          	jal	3c6 <exit>
 
 00000000000000da <main>:
-
-int
-main(int argc, char *argv[])
-{
   da:	7179                	addi	sp,sp,-48
   dc:	f406                	sd	ra,40(sp)
   de:	f022                	sd	s0,32(sp)
   e0:	1800                	addi	s0,sp,48
-  int fd, i;
-
-  if(argc <= 1){
   e2:	4785                	li	a5,1
   e4:	04a7d463          	bge	a5,a0,12c <main+0x52>
   e8:	ec26                	sd	s1,24(sp)
@@ -151,50 +103,32 @@ main(int argc, char *argv[])
   fa:	01d7d993          	srli	s3,a5,0x1d
   fe:	05c1                	addi	a1,a1,16
  100:	99ae                	add	s3,s3,a1
-    wc(0, "");
-    exit(0);
-  }
-
-  for(i = 1; i < argc; i++){
-    if((fd = open(argv[i], O_RDONLY)) < 0){
  102:	4581                	li	a1,0
  104:	00093503          	ld	a0,0(s2)
  108:	2fe000ef          	jal	406 <open>
  10c:	84aa                	mv	s1,a0
  10e:	02054c63          	bltz	a0,146 <main+0x6c>
-      printf("wc: cannot open %s\n", argv[i]);
-      exit(1);
-    }
-    wc(fd, argv[i]);
  112:	00093583          	ld	a1,0(s2)
  116:	eebff0ef          	jal	0 <wc>
-    close(fd);
  11a:	8526                	mv	a0,s1
  11c:	2d2000ef          	jal	3ee <close>
-  for(i = 1; i < argc; i++){
  120:	0921                	addi	s2,s2,8
  122:	ff3910e3          	bne	s2,s3,102 <main+0x28>
-  }
-  exit(0);
  126:	4501                	li	a0,0
  128:	29e000ef          	jal	3c6 <exit>
  12c:	ec26                	sd	s1,24(sp)
  12e:	e84a                	sd	s2,16(sp)
  130:	e44e                	sd	s3,8(sp)
-    wc(0, "");
  132:	00001597          	auipc	a1,0x1
  136:	88658593          	addi	a1,a1,-1914 # 9b8 <malloc+0x10e>
  13a:	4501                	li	a0,0
  13c:	ec5ff0ef          	jal	0 <wc>
-    exit(0);
  140:	4501                	li	a0,0
  142:	284000ef          	jal	3c6 <exit>
-      printf("wc: cannot open %s\n", argv[i]);
  146:	00093583          	ld	a1,0(s2)
  14a:	00001517          	auipc	a0,0x1
  14e:	89650513          	addi	a0,a0,-1898 # 9e0 <malloc+0x136>
  152:	6a4000ef          	jal	7f6 <printf>
-      exit(1);
  156:	4505                	li	a0,1
  158:	26e000ef          	jal	3c6 <exit>
 
@@ -630,245 +564,123 @@ memcpy(void *dst, const void *src, uint n)
  3bc:	8082                	ret
 
 00000000000003be <fork>:
-# generated by usys.pl - do not edit
-#include "kernel/syscall.h"
-.global fork
-fork:
- li a7, SYS_fork
  3be:	4885                	li	a7,1
- ecall
  3c0:	00000073          	ecall
- ret
  3c4:	8082                	ret
 
 00000000000003c6 <exit>:
-.global exit
-exit:
- li a7, SYS_exit
  3c6:	4889                	li	a7,2
- ecall
  3c8:	00000073          	ecall
- ret
  3cc:	8082                	ret
 
 00000000000003ce <wait>:
-.global wait
-wait:
- li a7, SYS_wait
  3ce:	488d                	li	a7,3
- ecall
  3d0:	00000073          	ecall
- ret
  3d4:	8082                	ret
 
 00000000000003d6 <pipe>:
-.global pipe
-pipe:
- li a7, SYS_pipe
  3d6:	4891                	li	a7,4
- ecall
  3d8:	00000073          	ecall
- ret
  3dc:	8082                	ret
 
 00000000000003de <read>:
-.global read
-read:
- li a7, SYS_read
  3de:	4895                	li	a7,5
- ecall
  3e0:	00000073          	ecall
- ret
  3e4:	8082                	ret
 
 00000000000003e6 <write>:
-.global write
-write:
- li a7, SYS_write
  3e6:	48c1                	li	a7,16
- ecall
  3e8:	00000073          	ecall
- ret
  3ec:	8082                	ret
 
 00000000000003ee <close>:
-.global close
-close:
- li a7, SYS_close
  3ee:	48d5                	li	a7,21
- ecall
  3f0:	00000073          	ecall
- ret
  3f4:	8082                	ret
 
 00000000000003f6 <kill>:
-.global kill
-kill:
- li a7, SYS_kill
  3f6:	4899                	li	a7,6
- ecall
  3f8:	00000073          	ecall
- ret
  3fc:	8082                	ret
 
 00000000000003fe <exec>:
-.global exec
-exec:
- li a7, SYS_exec
  3fe:	489d                	li	a7,7
- ecall
  400:	00000073          	ecall
- ret
  404:	8082                	ret
 
 0000000000000406 <open>:
-.global open
-open:
- li a7, SYS_open
  406:	48bd                	li	a7,15
- ecall
  408:	00000073          	ecall
- ret
  40c:	8082                	ret
 
 000000000000040e <mknod>:
-.global mknod
-mknod:
- li a7, SYS_mknod
  40e:	48c5                	li	a7,17
- ecall
  410:	00000073          	ecall
- ret
  414:	8082                	ret
 
 0000000000000416 <unlink>:
-.global unlink
-unlink:
- li a7, SYS_unlink
  416:	48c9                	li	a7,18
- ecall
  418:	00000073          	ecall
- ret
  41c:	8082                	ret
 
 000000000000041e <fstat>:
-.global fstat
-fstat:
- li a7, SYS_fstat
  41e:	48a1                	li	a7,8
- ecall
  420:	00000073          	ecall
- ret
  424:	8082                	ret
 
 0000000000000426 <link>:
-.global link
-link:
- li a7, SYS_link
  426:	48cd                	li	a7,19
- ecall
  428:	00000073          	ecall
- ret
  42c:	8082                	ret
 
 000000000000042e <mkdir>:
-.global mkdir
-mkdir:
- li a7, SYS_mkdir
  42e:	48d1                	li	a7,20
- ecall
  430:	00000073          	ecall
- ret
  434:	8082                	ret
 
 0000000000000436 <chdir>:
-.global chdir
-chdir:
- li a7, SYS_chdir
  436:	48a5                	li	a7,9
- ecall
  438:	00000073          	ecall
- ret
  43c:	8082                	ret
 
 000000000000043e <dup>:
-.global dup
-dup:
- li a7, SYS_dup
  43e:	48a9                	li	a7,10
- ecall
  440:	00000073          	ecall
- ret
  444:	8082                	ret
 
 0000000000000446 <getpid>:
-.global getpid
-getpid:
- li a7, SYS_getpid
  446:	48ad                	li	a7,11
- ecall
  448:	00000073          	ecall
- ret
  44c:	8082                	ret
 
 000000000000044e <sbrk>:
-.global sbrk
-sbrk:
- li a7, SYS_sbrk
  44e:	48b1                	li	a7,12
- ecall
  450:	00000073          	ecall
- ret
  454:	8082                	ret
 
 0000000000000456 <sleep>:
-.global sleep
-sleep:
- li a7, SYS_sleep
  456:	48b5                	li	a7,13
- ecall
  458:	00000073          	ecall
- ret
  45c:	8082                	ret
 
 000000000000045e <uptime>:
-.global uptime
-uptime:
- li a7, SYS_uptime
  45e:	48b9                	li	a7,14
- ecall
  460:	00000073          	ecall
- ret
  464:	8082                	ret
 
 0000000000000466 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  466:	48d9                	li	a7,22
- ecall
  468:	00000073          	ecall
- ret
  46c:	8082                	ret
 
 000000000000046e <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  46e:	48dd                	li	a7,23
- ecall
  470:	00000073          	ecall
- ret
  474:	8082                	ret
 
 0000000000000476 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  476:	48e1                	li	a7,24
- ecall
  478:	00000073          	ecall
- ret
  47c:	8082                	ret
 
 000000000000047e <putc>:
@@ -1411,184 +1223,113 @@ printf(const char *fmt, ...)
  826:	8082                	ret
 
 0000000000000828 <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  828:	1141                	addi	sp,sp,-16
  82a:	e422                	sd	s0,8(sp)
  82c:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  82e:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  832:	00000797          	auipc	a5,0x0
  836:	7ce7b783          	ld	a5,1998(a5) # 1000 <freep>
  83a:	a02d                	j	864 <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;
  83c:	4618                	lw	a4,8(a2)
  83e:	9f2d                	addw	a4,a4,a1
  840:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  844:	6398                	ld	a4,0(a5)
  846:	6310                	ld	a2,0(a4)
  848:	a83d                	j	886 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  84a:	ff852703          	lw	a4,-8(a0)
  84e:	9f31                	addw	a4,a4,a2
  850:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  852:	ff053683          	ld	a3,-16(a0)
  856:	a091                	j	89a <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  858:	6398                	ld	a4,0(a5)
  85a:	00e7e463          	bltu	a5,a4,862 <free+0x3a>
  85e:	00e6ea63          	bltu	a3,a4,872 <free+0x4a>
-{
  862:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  864:	fed7fae3          	bgeu	a5,a3,858 <free+0x30>
  868:	6398                	ld	a4,0(a5)
  86a:	00e6e463          	bltu	a3,a4,872 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  86e:	fee7eae3          	bltu	a5,a4,862 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  872:	ff852583          	lw	a1,-8(a0)
  876:	6390                	ld	a2,0(a5)
  878:	02059813          	slli	a6,a1,0x20
  87c:	01c85713          	srli	a4,a6,0x1c
  880:	9736                	add	a4,a4,a3
  882:	fae60de3          	beq	a2,a4,83c <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  886:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  88a:	4790                	lw	a2,8(a5)
  88c:	02061593          	slli	a1,a2,0x20
  890:	01c5d713          	srli	a4,a1,0x1c
  894:	973e                	add	a4,a4,a5
  896:	fae68ae3          	beq	a3,a4,84a <free+0x22>
-    p->s.ptr = bp->s.ptr;
  89a:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  89c:	00000717          	auipc	a4,0x0
  8a0:	76f73223          	sd	a5,1892(a4) # 1000 <freep>
-}
  8a4:	6422                	ld	s0,8(sp)
  8a6:	0141                	addi	sp,sp,16
  8a8:	8082                	ret
 
 00000000000008aa <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  8aa:	7139                	addi	sp,sp,-64
  8ac:	fc06                	sd	ra,56(sp)
  8ae:	f822                	sd	s0,48(sp)
  8b0:	f426                	sd	s1,40(sp)
  8b2:	ec4e                	sd	s3,24(sp)
  8b4:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  8b6:	02051493          	slli	s1,a0,0x20
  8ba:	9081                	srli	s1,s1,0x20
  8bc:	04bd                	addi	s1,s1,15
  8be:	8091                	srli	s1,s1,0x4
  8c0:	0014899b          	addiw	s3,s1,1
  8c4:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  8c6:	00000517          	auipc	a0,0x0
  8ca:	73a53503          	ld	a0,1850(a0) # 1000 <freep>
  8ce:	c915                	beqz	a0,902 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  8d0:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  8d2:	4798                	lw	a4,8(a5)
  8d4:	08977a63          	bgeu	a4,s1,968 <malloc+0xbe>
  8d8:	f04a                	sd	s2,32(sp)
  8da:	e852                	sd	s4,16(sp)
  8dc:	e456                	sd	s5,8(sp)
  8de:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  8e0:	8a4e                	mv	s4,s3
  8e2:	0009871b          	sext.w	a4,s3
  8e6:	6685                	lui	a3,0x1
  8e8:	00d77363          	bgeu	a4,a3,8ee <malloc+0x44>
  8ec:	6a05                	lui	s4,0x1
  8ee:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  8f2:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  8f6:	00000917          	auipc	s2,0x0
  8fa:	70a90913          	addi	s2,s2,1802 # 1000 <freep>
-  if(p == (char*)-1)
  8fe:	5afd                	li	s5,-1
  900:	a081                	j	940 <malloc+0x96>
  902:	f04a                	sd	s2,32(sp)
  904:	e852                	sd	s4,16(sp)
  906:	e456                	sd	s5,8(sp)
  908:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  90a:	00001797          	auipc	a5,0x1
  90e:	90678793          	addi	a5,a5,-1786 # 1210 <base>
  912:	00000717          	auipc	a4,0x0
  916:	6ef73723          	sd	a5,1774(a4) # 1000 <freep>
  91a:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  91c:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  920:	b7c1                	j	8e0 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  922:	6398                	ld	a4,0(a5)
  924:	e118                	sd	a4,0(a0)
  926:	a8a9                	j	980 <malloc+0xd6>
-  hp->s.size = nu;
  928:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  92c:	0541                	addi	a0,a0,16
  92e:	efbff0ef          	jal	828 <free>
-  return freep;
  932:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  936:	c12d                	beqz	a0,998 <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  938:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  93a:	4798                	lw	a4,8(a5)
  93c:	02977263          	bgeu	a4,s1,960 <malloc+0xb6>
-    if(p == freep)
  940:	00093703          	ld	a4,0(s2)
  944:	853e                	mv	a0,a5
  946:	fef719e3          	bne	a4,a5,938 <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  94a:	8552                	mv	a0,s4
  94c:	b03ff0ef          	jal	44e <sbrk>
-  if(p == (char*)-1)
  950:	fd551ce3          	bne	a0,s5,928 <malloc+0x7e>
-        return 0;
  954:	4501                	li	a0,0
  956:	7902                	ld	s2,32(sp)
  958:	6a42                	ld	s4,16(sp)
@@ -1599,24 +1340,16 @@ malloc(uint nbytes)
  962:	6a42                	ld	s4,16(sp)
  964:	6aa2                	ld	s5,8(sp)
  966:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  968:	fae48de3          	beq	s1,a4,922 <malloc+0x78>
-        p->s.size -= nunits;
  96c:	4137073b          	subw	a4,a4,s3
  970:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  972:	02071693          	slli	a3,a4,0x20
  976:	01c6d713          	srli	a4,a3,0x1c
  97a:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  97c:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  980:	00000717          	auipc	a4,0x0
  984:	68a73023          	sd	a0,1664(a4) # 1000 <freep>
-      return (void*)(p + 1);
  988:	01078513          	addi	a0,a5,16
-  }
-}
  98c:	70e2                	ld	ra,56(sp)
  98e:	7442                	ld	s0,48(sp)
  990:	74a2                	ld	s1,40(sp)
diff --git a/user/zombie.asm b/user/zombie.asm
index e104b17d822e10f6da5d378fe08d654ef0554027..68f6a3a900dabda070f1d9e66884c2ddc241ac60 100644
--- a/user/zombie.asm
+++ b/user/zombie.asm
@@ -5,24 +5,14 @@ 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	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	288 <exit>
-    sleep(5);  // Let child exit before parent.
   16:	4515                	li	a0,5
   18:	300000ef          	jal	318 <sleep>
   1c:	bfd5                	j	10 <main+0x10>
@@ -459,245 +449,123 @@ memcpy(void *dst, const void *src, uint n)
  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 <get_shared_var>:
-.global get_shared_var
-get_shared_var:
- li a7, SYS_get_shared_var
  328:	48d9                	li	a7,22
- ecall
  32a:	00000073          	ecall
- ret
  32e:	8082                	ret
 
 0000000000000330 <set_shared_var>:
-.global set_shared_var
-set_shared_var:
- li a7, SYS_set_shared_var
  330:	48dd                	li	a7,23
- ecall
  332:	00000073          	ecall
- ret
  336:	8082                	ret
 
 0000000000000338 <symlink>:
-.global symlink
-symlink:
- li a7, SYS_symlink
  338:	48e1                	li	a7,24
- ecall
  33a:	00000073          	ecall
- ret
  33e:	8082                	ret
 
 0000000000000340 <putc>:
@@ -1240,184 +1108,113 @@ printf(const char *fmt, ...)
  6e8:	8082                	ret
 
 00000000000006ea <free>:
-static Header base;
-static Header *freep;
-
-void
-free(void *ap)
-{
  6ea:	1141                	addi	sp,sp,-16
  6ec:	e422                	sd	s0,8(sp)
  6ee:	0800                	addi	s0,sp,16
-  Header *bp, *p;
-
-  bp = (Header*)ap - 1;
  6f0:	ff050693          	addi	a3,a0,-16
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  6f4:	00001797          	auipc	a5,0x1
  6f8:	90c7b783          	ld	a5,-1780(a5) # 1000 <freep>
  6fc:	a02d                	j	726 <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;
  6fe:	4618                	lw	a4,8(a2)
  700:	9f2d                	addw	a4,a4,a1
  702:	fee52c23          	sw	a4,-8(a0)
-    bp->s.ptr = p->s.ptr->s.ptr;
  706:	6398                	ld	a4,0(a5)
  708:	6310                	ld	a2,0(a4)
  70a:	a83d                	j	748 <free+0x5e>
-  } else
-    bp->s.ptr = p->s.ptr;
-  if(p + p->s.size == bp){
-    p->s.size += bp->s.size;
  70c:	ff852703          	lw	a4,-8(a0)
  710:	9f31                	addw	a4,a4,a2
  712:	c798                	sw	a4,8(a5)
-    p->s.ptr = bp->s.ptr;
  714:	ff053683          	ld	a3,-16(a0)
  718:	a091                	j	75c <free+0x72>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  71a:	6398                	ld	a4,0(a5)
  71c:	00e7e463          	bltu	a5,a4,724 <free+0x3a>
  720:	00e6ea63          	bltu	a3,a4,734 <free+0x4a>
-{
  724:	87ba                	mv	a5,a4
-  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  726:	fed7fae3          	bgeu	a5,a3,71a <free+0x30>
  72a:	6398                	ld	a4,0(a5)
  72c:	00e6e463          	bltu	a3,a4,734 <free+0x4a>
-    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  730:	fee7eae3          	bltu	a5,a4,724 <free+0x3a>
-  if(bp + bp->s.size == p->s.ptr){
  734:	ff852583          	lw	a1,-8(a0)
  738:	6390                	ld	a2,0(a5)
  73a:	02059813          	slli	a6,a1,0x20
  73e:	01c85713          	srli	a4,a6,0x1c
  742:	9736                	add	a4,a4,a3
  744:	fae60de3          	beq	a2,a4,6fe <free+0x14>
-    bp->s.ptr = p->s.ptr->s.ptr;
  748:	fec53823          	sd	a2,-16(a0)
-  if(p + p->s.size == bp){
  74c:	4790                	lw	a2,8(a5)
  74e:	02061593          	slli	a1,a2,0x20
  752:	01c5d713          	srli	a4,a1,0x1c
  756:	973e                	add	a4,a4,a5
  758:	fae68ae3          	beq	a3,a4,70c <free+0x22>
-    p->s.ptr = bp->s.ptr;
  75c:	e394                	sd	a3,0(a5)
-  } else
-    p->s.ptr = bp;
-  freep = p;
  75e:	00001717          	auipc	a4,0x1
  762:	8af73123          	sd	a5,-1886(a4) # 1000 <freep>
-}
  766:	6422                	ld	s0,8(sp)
  768:	0141                	addi	sp,sp,16
  76a:	8082                	ret
 
 000000000000076c <malloc>:
-  return freep;
-}
-
-void*
-malloc(uint nbytes)
-{
  76c:	7139                	addi	sp,sp,-64
  76e:	fc06                	sd	ra,56(sp)
  770:	f822                	sd	s0,48(sp)
  772:	f426                	sd	s1,40(sp)
  774:	ec4e                	sd	s3,24(sp)
  776:	0080                	addi	s0,sp,64
-  Header *p, *prevp;
-  uint nunits;
-
-  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
  778:	02051493          	slli	s1,a0,0x20
  77c:	9081                	srli	s1,s1,0x20
  77e:	04bd                	addi	s1,s1,15
  780:	8091                	srli	s1,s1,0x4
  782:	0014899b          	addiw	s3,s1,1
  786:	0485                	addi	s1,s1,1
-  if((prevp = freep) == 0){
  788:	00001517          	auipc	a0,0x1
  78c:	87853503          	ld	a0,-1928(a0) # 1000 <freep>
  790:	c915                	beqz	a0,7c4 <malloc+0x58>
-    base.s.ptr = freep = prevp = &base;
-    base.s.size = 0;
-  }
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  792:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  794:	4798                	lw	a4,8(a5)
  796:	08977a63          	bgeu	a4,s1,82a <malloc+0xbe>
  79a:	f04a                	sd	s2,32(sp)
  79c:	e852                	sd	s4,16(sp)
  79e:	e456                	sd	s5,8(sp)
  7a0:	e05a                	sd	s6,0(sp)
-  if(nu < 4096)
  7a2:	8a4e                	mv	s4,s3
  7a4:	0009871b          	sext.w	a4,s3
  7a8:	6685                	lui	a3,0x1
  7aa:	00d77363          	bgeu	a4,a3,7b0 <malloc+0x44>
  7ae:	6a05                	lui	s4,0x1
  7b0:	000a0b1b          	sext.w	s6,s4
-  p = sbrk(nu * sizeof(Header));
  7b4:	004a1a1b          	slliw	s4,s4,0x4
-        p->s.size = nunits;
-      }
-      freep = prevp;
-      return (void*)(p + 1);
-    }
-    if(p == freep)
  7b8:	00001917          	auipc	s2,0x1
  7bc:	84890913          	addi	s2,s2,-1976 # 1000 <freep>
-  if(p == (char*)-1)
  7c0:	5afd                	li	s5,-1
  7c2:	a081                	j	802 <malloc+0x96>
  7c4:	f04a                	sd	s2,32(sp)
  7c6:	e852                	sd	s4,16(sp)
  7c8:	e456                	sd	s5,8(sp)
  7ca:	e05a                	sd	s6,0(sp)
-    base.s.ptr = freep = prevp = &base;
  7cc:	00001797          	auipc	a5,0x1
  7d0:	84478793          	addi	a5,a5,-1980 # 1010 <base>
  7d4:	00001717          	auipc	a4,0x1
  7d8:	82f73623          	sd	a5,-2004(a4) # 1000 <freep>
  7dc:	e39c                	sd	a5,0(a5)
-    base.s.size = 0;
  7de:	0007a423          	sw	zero,8(a5)
-    if(p->s.size >= nunits){
  7e2:	b7c1                	j	7a2 <malloc+0x36>
-        prevp->s.ptr = p->s.ptr;
  7e4:	6398                	ld	a4,0(a5)
  7e6:	e118                	sd	a4,0(a0)
  7e8:	a8a9                	j	842 <malloc+0xd6>
-  hp->s.size = nu;
  7ea:	01652423          	sw	s6,8(a0)
-  free((void*)(hp + 1));
  7ee:	0541                	addi	a0,a0,16
  7f0:	efbff0ef          	jal	6ea <free>
-  return freep;
  7f4:	00093503          	ld	a0,0(s2)
-      if((p = morecore(nunits)) == 0)
  7f8:	c12d                	beqz	a0,85a <malloc+0xee>
-  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
  7fa:	611c                	ld	a5,0(a0)
-    if(p->s.size >= nunits){
  7fc:	4798                	lw	a4,8(a5)
  7fe:	02977263          	bgeu	a4,s1,822 <malloc+0xb6>
-    if(p == freep)
  802:	00093703          	ld	a4,0(s2)
  806:	853e                	mv	a0,a5
  808:	fef719e3          	bne	a4,a5,7fa <malloc+0x8e>
-  p = sbrk(nu * sizeof(Header));
  80c:	8552                	mv	a0,s4
  80e:	b03ff0ef          	jal	310 <sbrk>
-  if(p == (char*)-1)
  812:	fd551ce3          	bne	a0,s5,7ea <malloc+0x7e>
-        return 0;
  816:	4501                	li	a0,0
  818:	7902                	ld	s2,32(sp)
  81a:	6a42                	ld	s4,16(sp)
@@ -1428,24 +1225,16 @@ malloc(uint nbytes)
  824:	6a42                	ld	s4,16(sp)
  826:	6aa2                	ld	s5,8(sp)
  828:	6b02                	ld	s6,0(sp)
-      if(p->s.size == nunits)
  82a:	fae48de3          	beq	s1,a4,7e4 <malloc+0x78>
-        p->s.size -= nunits;
  82e:	4137073b          	subw	a4,a4,s3
  832:	c798                	sw	a4,8(a5)
-        p += p->s.size;
  834:	02071693          	slli	a3,a4,0x20
  838:	01c6d713          	srli	a4,a3,0x1c
  83c:	97ba                	add	a5,a5,a4
-        p->s.size = nunits;
  83e:	0137a423          	sw	s3,8(a5)
-      freep = prevp;
  842:	00000717          	auipc	a4,0x0
  846:	7aa73f23          	sd	a0,1982(a4) # 1000 <freep>
-      return (void*)(p + 1);
  84a:	01078513          	addi	a0,a5,16
-  }
-}
  84e:	70e2                	ld	ra,56(sp)
  850:	7442                	ld	s0,48(sp)
  852:	74a2                	ld	s1,40(sp)