diff --git a/kernel-qemu b/kernel-qemu
new file mode 100755
index 0000000000000000000000000000000000000000..f9b8cbe76f5c7bb7bd9964cb2b89283dd7ce1369
Binary files /dev/null and b/kernel-qemu differ
diff --git a/kernel-qemu.asm b/kernel-qemu.asm
new file mode 100644
index 0000000000000000000000000000000000000000..1815871be39507eb9a4982facb6d0ada269b22b6
--- /dev/null
+++ b/kernel-qemu.asm
@@ -0,0 +1,21481 @@
+
+kernel-qemu:     文件格式 elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000080200000 <_entry>:
+    80200000:	00150293          	addi	t0,a0,1
+    80200004:	02ba                	slli	t0,t0,0xe
+    80200006:	00010117          	auipc	sp,0x10
+    8020000a:	4f213103          	ld	sp,1266(sp) # 802104f8 <_GLOBAL_OFFSET_TABLE_+0x70>
+    8020000e:	9116                	add	sp,sp,t0
+    80200010:	06e010ef          	jal	ra,8020107e <main>
+
+0000000080200014 <loop>:
+    80200014:	a001                	j	80200014 <loop>
+
+0000000080200016 <r_fp>:
+  return x;
+}
+
+static inline uint64
+r_fp()
+{
+    80200016:	1101                	addi	sp,sp,-32
+    80200018:	ec22                	sd	s0,24(sp)
+    8020001a:	1000                	addi	s0,sp,32
+  uint64 x;
+  asm volatile("mv %0, s0" : "=r" (x) );
+    8020001c:	87a2                	mv	a5,s0
+    8020001e:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80200022:	fe843783          	ld	a5,-24(s0)
+}
+    80200026:	853e                	mv	a0,a5
+    80200028:	6462                	ld	s0,24(sp)
+    8020002a:	6105                	addi	sp,sp,32
+    8020002c:	8082                	ret
+
+000000008020002e <printstring>:
+static struct {
+  struct spinlock lock;
+  int locking;
+} pr;
+
+void printstring(const char* s) {
+    8020002e:	1101                	addi	sp,sp,-32
+    80200030:	ec06                	sd	ra,24(sp)
+    80200032:	e822                	sd	s0,16(sp)
+    80200034:	1000                	addi	s0,sp,32
+    80200036:	fea43423          	sd	a0,-24(s0)
+    while (*s)
+    8020003a:	a839                	j	80200058 <printstring+0x2a>
+    {
+        consputc(*s++);
+    8020003c:	fe843783          	ld	a5,-24(s0)
+    80200040:	00178713          	addi	a4,a5,1
+    80200044:	fee43423          	sd	a4,-24(s0)
+    80200048:	0007c783          	lbu	a5,0(a5)
+    8020004c:	2781                	sext.w	a5,a5
+    8020004e:	853e                	mv	a0,a5
+    80200050:	0000a097          	auipc	ra,0xa
+    80200054:	7b0080e7          	jalr	1968(ra) # 8020a800 <consputc>
+    while (*s)
+    80200058:	fe843783          	ld	a5,-24(s0)
+    8020005c:	0007c783          	lbu	a5,0(a5)
+    80200060:	fff1                	bnez	a5,8020003c <printstring+0xe>
+    }
+}
+    80200062:	0001                	nop
+    80200064:	0001                	nop
+    80200066:	60e2                	ld	ra,24(sp)
+    80200068:	6442                	ld	s0,16(sp)
+    8020006a:	6105                	addi	sp,sp,32
+    8020006c:	8082                	ret
+
+000000008020006e <printint>:
+
+static void
+printint(int xx, int base, int sign)
+{
+    8020006e:	7139                	addi	sp,sp,-64
+    80200070:	fc06                	sd	ra,56(sp)
+    80200072:	f822                	sd	s0,48(sp)
+    80200074:	0080                	addi	s0,sp,64
+    80200076:	87aa                	mv	a5,a0
+    80200078:	86ae                	mv	a3,a1
+    8020007a:	8732                	mv	a4,a2
+    8020007c:	fcf42623          	sw	a5,-52(s0)
+    80200080:	87b6                	mv	a5,a3
+    80200082:	fcf42423          	sw	a5,-56(s0)
+    80200086:	87ba                	mv	a5,a4
+    80200088:	fcf42223          	sw	a5,-60(s0)
+  char buf[16];
+  int i;
+  uint x;
+
+  if(sign && (sign = xx < 0))
+    8020008c:	fc442783          	lw	a5,-60(s0)
+    80200090:	2781                	sext.w	a5,a5
+    80200092:	c78d                	beqz	a5,802000bc <printint+0x4e>
+    80200094:	fcc42783          	lw	a5,-52(s0)
+    80200098:	01f7d79b          	srliw	a5,a5,0x1f
+    8020009c:	0ff7f793          	andi	a5,a5,255
+    802000a0:	fcf42223          	sw	a5,-60(s0)
+    802000a4:	fc442783          	lw	a5,-60(s0)
+    802000a8:	2781                	sext.w	a5,a5
+    802000aa:	cb89                	beqz	a5,802000bc <printint+0x4e>
+    x = -xx;
+    802000ac:	fcc42783          	lw	a5,-52(s0)
+    802000b0:	40f007bb          	negw	a5,a5
+    802000b4:	2781                	sext.w	a5,a5
+    802000b6:	fef42423          	sw	a5,-24(s0)
+    802000ba:	a029                	j	802000c4 <printint+0x56>
+  else
+    x = xx;
+    802000bc:	fcc42783          	lw	a5,-52(s0)
+    802000c0:	fef42423          	sw	a5,-24(s0)
+
+  i = 0;
+    802000c4:	fe042623          	sw	zero,-20(s0)
+  do {
+    buf[i++] = digits[x % base];
+    802000c8:	fc842783          	lw	a5,-56(s0)
+    802000cc:	fe842703          	lw	a4,-24(s0)
+    802000d0:	02f777bb          	remuw	a5,a4,a5
+    802000d4:	0007861b          	sext.w	a2,a5
+    802000d8:	fec42783          	lw	a5,-20(s0)
+    802000dc:	0017871b          	addiw	a4,a5,1
+    802000e0:	fee42623          	sw	a4,-20(s0)
+    802000e4:	0000f697          	auipc	a3,0xf
+    802000e8:	f1c68693          	addi	a3,a3,-228 # 8020f000 <digits>
+    802000ec:	02061713          	slli	a4,a2,0x20
+    802000f0:	9301                	srli	a4,a4,0x20
+    802000f2:	9736                	add	a4,a4,a3
+    802000f4:	00074703          	lbu	a4,0(a4)
+    802000f8:	ff040693          	addi	a3,s0,-16
+    802000fc:	97b6                	add	a5,a5,a3
+    802000fe:	fee78423          	sb	a4,-24(a5)
+  } while((x /= base) != 0);
+    80200102:	fc842783          	lw	a5,-56(s0)
+    80200106:	fe842703          	lw	a4,-24(s0)
+    8020010a:	02f757bb          	divuw	a5,a4,a5
+    8020010e:	fef42423          	sw	a5,-24(s0)
+    80200112:	fe842783          	lw	a5,-24(s0)
+    80200116:	2781                	sext.w	a5,a5
+    80200118:	fbc5                	bnez	a5,802000c8 <printint+0x5a>
+
+  if(sign)
+    8020011a:	fc442783          	lw	a5,-60(s0)
+    8020011e:	2781                	sext.w	a5,a5
+    80200120:	cf85                	beqz	a5,80200158 <printint+0xea>
+    buf[i++] = '-';
+    80200122:	fec42783          	lw	a5,-20(s0)
+    80200126:	0017871b          	addiw	a4,a5,1
+    8020012a:	fee42623          	sw	a4,-20(s0)
+    8020012e:	ff040713          	addi	a4,s0,-16
+    80200132:	97ba                	add	a5,a5,a4
+    80200134:	02d00713          	li	a4,45
+    80200138:	fee78423          	sb	a4,-24(a5)
+
+  while(--i >= 0)
+    8020013c:	a831                	j	80200158 <printint+0xea>
+    consputc(buf[i]);
+    8020013e:	fec42783          	lw	a5,-20(s0)
+    80200142:	ff040713          	addi	a4,s0,-16
+    80200146:	97ba                	add	a5,a5,a4
+    80200148:	fe87c783          	lbu	a5,-24(a5)
+    8020014c:	2781                	sext.w	a5,a5
+    8020014e:	853e                	mv	a0,a5
+    80200150:	0000a097          	auipc	ra,0xa
+    80200154:	6b0080e7          	jalr	1712(ra) # 8020a800 <consputc>
+  while(--i >= 0)
+    80200158:	fec42783          	lw	a5,-20(s0)
+    8020015c:	37fd                	addiw	a5,a5,-1
+    8020015e:	fef42623          	sw	a5,-20(s0)
+    80200162:	fec42783          	lw	a5,-20(s0)
+    80200166:	2781                	sext.w	a5,a5
+    80200168:	fc07dbe3          	bgez	a5,8020013e <printint+0xd0>
+}
+    8020016c:	0001                	nop
+    8020016e:	0001                	nop
+    80200170:	70e2                	ld	ra,56(sp)
+    80200172:	7442                	ld	s0,48(sp)
+    80200174:	6121                	addi	sp,sp,64
+    80200176:	8082                	ret
+
+0000000080200178 <printptr>:
+
+
+static void
+printptr(uint64 x)
+{
+    80200178:	7179                	addi	sp,sp,-48
+    8020017a:	f406                	sd	ra,40(sp)
+    8020017c:	f022                	sd	s0,32(sp)
+    8020017e:	1800                	addi	s0,sp,48
+    80200180:	fca43c23          	sd	a0,-40(s0)
+  int i;
+  consputc('0');
+    80200184:	03000513          	li	a0,48
+    80200188:	0000a097          	auipc	ra,0xa
+    8020018c:	678080e7          	jalr	1656(ra) # 8020a800 <consputc>
+  consputc('x');
+    80200190:	07800513          	li	a0,120
+    80200194:	0000a097          	auipc	ra,0xa
+    80200198:	66c080e7          	jalr	1644(ra) # 8020a800 <consputc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    8020019c:	fe042623          	sw	zero,-20(s0)
+    802001a0:	a81d                	j	802001d6 <printptr+0x5e>
+    consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
+    802001a2:	fd843783          	ld	a5,-40(s0)
+    802001a6:	93f1                	srli	a5,a5,0x3c
+    802001a8:	0000f717          	auipc	a4,0xf
+    802001ac:	e5870713          	addi	a4,a4,-424 # 8020f000 <digits>
+    802001b0:	97ba                	add	a5,a5,a4
+    802001b2:	0007c783          	lbu	a5,0(a5)
+    802001b6:	2781                	sext.w	a5,a5
+    802001b8:	853e                	mv	a0,a5
+    802001ba:	0000a097          	auipc	ra,0xa
+    802001be:	646080e7          	jalr	1606(ra) # 8020a800 <consputc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    802001c2:	fec42783          	lw	a5,-20(s0)
+    802001c6:	2785                	addiw	a5,a5,1
+    802001c8:	fef42623          	sw	a5,-20(s0)
+    802001cc:	fd843783          	ld	a5,-40(s0)
+    802001d0:	0792                	slli	a5,a5,0x4
+    802001d2:	fcf43c23          	sd	a5,-40(s0)
+    802001d6:	fec42783          	lw	a5,-20(s0)
+    802001da:	873e                	mv	a4,a5
+    802001dc:	47bd                	li	a5,15
+    802001de:	fce7f2e3          	bgeu	a5,a4,802001a2 <printptr+0x2a>
+}
+    802001e2:	0001                	nop
+    802001e4:	0001                	nop
+    802001e6:	70a2                	ld	ra,40(sp)
+    802001e8:	7402                	ld	s0,32(sp)
+    802001ea:	6145                	addi	sp,sp,48
+    802001ec:	8082                	ret
+
+00000000802001ee <printf>:
+
+// Print to the console. only understands %d, %x, %p, %s.
+void
+printf(char *fmt, ...)
+{
+    802001ee:	7119                	addi	sp,sp,-128
+    802001f0:	fc06                	sd	ra,56(sp)
+    802001f2:	f822                	sd	s0,48(sp)
+    802001f4:	0080                	addi	s0,sp,64
+    802001f6:	fca43423          	sd	a0,-56(s0)
+    802001fa:	e40c                	sd	a1,8(s0)
+    802001fc:	e810                	sd	a2,16(s0)
+    802001fe:	ec14                	sd	a3,24(s0)
+    80200200:	f018                	sd	a4,32(s0)
+    80200202:	f41c                	sd	a5,40(s0)
+    80200204:	03043823          	sd	a6,48(s0)
+    80200208:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+  int i, c;
+  int locking;
+  char *s;
+
+  locking = pr.locking;
+    8020020c:	00019797          	auipc	a5,0x19
+    80200210:	dfc78793          	addi	a5,a5,-516 # 80219008 <pr>
+    80200214:	4f9c                	lw	a5,24(a5)
+    80200216:	fcf42e23          	sw	a5,-36(s0)
+  if(locking)
+    8020021a:	fdc42783          	lw	a5,-36(s0)
+    8020021e:	2781                	sext.w	a5,a5
+    80200220:	cb89                	beqz	a5,80200232 <printf+0x44>
+    acquire(&pr.lock);
+    80200222:	00019517          	auipc	a0,0x19
+    80200226:	de650513          	addi	a0,a0,-538 # 80219008 <pr>
+    8020022a:	00000097          	auipc	ra,0x0
+    8020022e:	7be080e7          	jalr	1982(ra) # 802009e8 <acquire>
+  
+  if (fmt == 0)
+    80200232:	fc843783          	ld	a5,-56(s0)
+    80200236:	eb89                	bnez	a5,80200248 <printf+0x5a>
+    panic("null fmt");
+    80200238:	0000d517          	auipc	a0,0xd
+    8020023c:	dc850513          	addi	a0,a0,-568 # 8020d000 <etext>
+    80200240:	00000097          	auipc	ra,0x0
+    80200244:	204080e7          	jalr	516(ra) # 80200444 <panic>
+
+  va_start(ap, fmt);
+    80200248:	04040793          	addi	a5,s0,64
+    8020024c:	fcf43023          	sd	a5,-64(s0)
+    80200250:	fc043783          	ld	a5,-64(s0)
+    80200254:	fc878793          	addi	a5,a5,-56
+    80200258:	fcf43823          	sd	a5,-48(s0)
+  for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
+    8020025c:	fe042623          	sw	zero,-20(s0)
+    80200260:	a24d                	j	80200402 <printf+0x214>
+    if(c != '%'){
+    80200262:	fd842783          	lw	a5,-40(s0)
+    80200266:	0007871b          	sext.w	a4,a5
+    8020026a:	02500793          	li	a5,37
+    8020026e:	00f70a63          	beq	a4,a5,80200282 <printf+0x94>
+      consputc(c);
+    80200272:	fd842783          	lw	a5,-40(s0)
+    80200276:	853e                	mv	a0,a5
+    80200278:	0000a097          	auipc	ra,0xa
+    8020027c:	588080e7          	jalr	1416(ra) # 8020a800 <consputc>
+      continue;
+    80200280:	aaa5                	j	802003f8 <printf+0x20a>
+    }
+    c = fmt[++i] & 0xff;
+    80200282:	fec42783          	lw	a5,-20(s0)
+    80200286:	2785                	addiw	a5,a5,1
+    80200288:	fef42623          	sw	a5,-20(s0)
+    8020028c:	fec42783          	lw	a5,-20(s0)
+    80200290:	fc843703          	ld	a4,-56(s0)
+    80200294:	97ba                	add	a5,a5,a4
+    80200296:	0007c783          	lbu	a5,0(a5)
+    8020029a:	fcf42c23          	sw	a5,-40(s0)
+    if(c == 0)
+    8020029e:	fd842783          	lw	a5,-40(s0)
+    802002a2:	2781                	sext.w	a5,a5
+    802002a4:	16078e63          	beqz	a5,80200420 <printf+0x232>
+      break;
+    switch(c){
+    802002a8:	fd842783          	lw	a5,-40(s0)
+    802002ac:	0007871b          	sext.w	a4,a5
+    802002b0:	07800793          	li	a5,120
+    802002b4:	08f70963          	beq	a4,a5,80200346 <printf+0x158>
+    802002b8:	fd842783          	lw	a5,-40(s0)
+    802002bc:	0007871b          	sext.w	a4,a5
+    802002c0:	07800793          	li	a5,120
+    802002c4:	10e7cc63          	blt	a5,a4,802003dc <printf+0x1ee>
+    802002c8:	fd842783          	lw	a5,-40(s0)
+    802002cc:	0007871b          	sext.w	a4,a5
+    802002d0:	07300793          	li	a5,115
+    802002d4:	0af70563          	beq	a4,a5,8020037e <printf+0x190>
+    802002d8:	fd842783          	lw	a5,-40(s0)
+    802002dc:	0007871b          	sext.w	a4,a5
+    802002e0:	07300793          	li	a5,115
+    802002e4:	0ee7cc63          	blt	a5,a4,802003dc <printf+0x1ee>
+    802002e8:	fd842783          	lw	a5,-40(s0)
+    802002ec:	0007871b          	sext.w	a4,a5
+    802002f0:	07000793          	li	a5,112
+    802002f4:	06f70863          	beq	a4,a5,80200364 <printf+0x176>
+    802002f8:	fd842783          	lw	a5,-40(s0)
+    802002fc:	0007871b          	sext.w	a4,a5
+    80200300:	07000793          	li	a5,112
+    80200304:	0ce7cc63          	blt	a5,a4,802003dc <printf+0x1ee>
+    80200308:	fd842783          	lw	a5,-40(s0)
+    8020030c:	0007871b          	sext.w	a4,a5
+    80200310:	02500793          	li	a5,37
+    80200314:	0af70d63          	beq	a4,a5,802003ce <printf+0x1e0>
+    80200318:	fd842783          	lw	a5,-40(s0)
+    8020031c:	0007871b          	sext.w	a4,a5
+    80200320:	06400793          	li	a5,100
+    80200324:	0af71c63          	bne	a4,a5,802003dc <printf+0x1ee>
+    case 'd':
+      printint(va_arg(ap, int), 10, 1);
+    80200328:	fd043783          	ld	a5,-48(s0)
+    8020032c:	00878713          	addi	a4,a5,8
+    80200330:	fce43823          	sd	a4,-48(s0)
+    80200334:	439c                	lw	a5,0(a5)
+    80200336:	4605                	li	a2,1
+    80200338:	45a9                	li	a1,10
+    8020033a:	853e                	mv	a0,a5
+    8020033c:	00000097          	auipc	ra,0x0
+    80200340:	d32080e7          	jalr	-718(ra) # 8020006e <printint>
+      break;
+    80200344:	a855                	j	802003f8 <printf+0x20a>
+    case 'x':
+      printint(va_arg(ap, int), 16, 1);
+    80200346:	fd043783          	ld	a5,-48(s0)
+    8020034a:	00878713          	addi	a4,a5,8
+    8020034e:	fce43823          	sd	a4,-48(s0)
+    80200352:	439c                	lw	a5,0(a5)
+    80200354:	4605                	li	a2,1
+    80200356:	45c1                	li	a1,16
+    80200358:	853e                	mv	a0,a5
+    8020035a:	00000097          	auipc	ra,0x0
+    8020035e:	d14080e7          	jalr	-748(ra) # 8020006e <printint>
+      break;
+    80200362:	a859                	j	802003f8 <printf+0x20a>
+    case 'p':
+      printptr(va_arg(ap, uint64));
+    80200364:	fd043783          	ld	a5,-48(s0)
+    80200368:	00878713          	addi	a4,a5,8
+    8020036c:	fce43823          	sd	a4,-48(s0)
+    80200370:	639c                	ld	a5,0(a5)
+    80200372:	853e                	mv	a0,a5
+    80200374:	00000097          	auipc	ra,0x0
+    80200378:	e04080e7          	jalr	-508(ra) # 80200178 <printptr>
+      break;
+    8020037c:	a8b5                	j	802003f8 <printf+0x20a>
+    case 's':
+      if((s = va_arg(ap, char*)) == 0)
+    8020037e:	fd043783          	ld	a5,-48(s0)
+    80200382:	00878713          	addi	a4,a5,8
+    80200386:	fce43823          	sd	a4,-48(s0)
+    8020038a:	639c                	ld	a5,0(a5)
+    8020038c:	fef43023          	sd	a5,-32(s0)
+    80200390:	fe043783          	ld	a5,-32(s0)
+    80200394:	e79d                	bnez	a5,802003c2 <printf+0x1d4>
+        s = "(null)";
+    80200396:	0000d797          	auipc	a5,0xd
+    8020039a:	c7a78793          	addi	a5,a5,-902 # 8020d010 <etext+0x10>
+    8020039e:	fef43023          	sd	a5,-32(s0)
+      for(; *s; s++)
+    802003a2:	a005                	j	802003c2 <printf+0x1d4>
+        consputc(*s);
+    802003a4:	fe043783          	ld	a5,-32(s0)
+    802003a8:	0007c783          	lbu	a5,0(a5)
+    802003ac:	2781                	sext.w	a5,a5
+    802003ae:	853e                	mv	a0,a5
+    802003b0:	0000a097          	auipc	ra,0xa
+    802003b4:	450080e7          	jalr	1104(ra) # 8020a800 <consputc>
+      for(; *s; s++)
+    802003b8:	fe043783          	ld	a5,-32(s0)
+    802003bc:	0785                	addi	a5,a5,1
+    802003be:	fef43023          	sd	a5,-32(s0)
+    802003c2:	fe043783          	ld	a5,-32(s0)
+    802003c6:	0007c783          	lbu	a5,0(a5)
+    802003ca:	ffe9                	bnez	a5,802003a4 <printf+0x1b6>
+      break;
+    802003cc:	a035                	j	802003f8 <printf+0x20a>
+    case '%':
+      consputc('%');
+    802003ce:	02500513          	li	a0,37
+    802003d2:	0000a097          	auipc	ra,0xa
+    802003d6:	42e080e7          	jalr	1070(ra) # 8020a800 <consputc>
+      break;
+    802003da:	a839                	j	802003f8 <printf+0x20a>
+    default:
+      // Print unknown % sequence to draw attention.
+      consputc('%');
+    802003dc:	02500513          	li	a0,37
+    802003e0:	0000a097          	auipc	ra,0xa
+    802003e4:	420080e7          	jalr	1056(ra) # 8020a800 <consputc>
+      consputc(c);
+    802003e8:	fd842783          	lw	a5,-40(s0)
+    802003ec:	853e                	mv	a0,a5
+    802003ee:	0000a097          	auipc	ra,0xa
+    802003f2:	412080e7          	jalr	1042(ra) # 8020a800 <consputc>
+      break;
+    802003f6:	0001                	nop
+  for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
+    802003f8:	fec42783          	lw	a5,-20(s0)
+    802003fc:	2785                	addiw	a5,a5,1
+    802003fe:	fef42623          	sw	a5,-20(s0)
+    80200402:	fec42783          	lw	a5,-20(s0)
+    80200406:	fc843703          	ld	a4,-56(s0)
+    8020040a:	97ba                	add	a5,a5,a4
+    8020040c:	0007c783          	lbu	a5,0(a5)
+    80200410:	fcf42c23          	sw	a5,-40(s0)
+    80200414:	fd842783          	lw	a5,-40(s0)
+    80200418:	2781                	sext.w	a5,a5
+    8020041a:	e40794e3          	bnez	a5,80200262 <printf+0x74>
+    8020041e:	a011                	j	80200422 <printf+0x234>
+      break;
+    80200420:	0001                	nop
+    }
+  }
+  if(locking)
+    80200422:	fdc42783          	lw	a5,-36(s0)
+    80200426:	2781                	sext.w	a5,a5
+    80200428:	cb89                	beqz	a5,8020043a <printf+0x24c>
+    release(&pr.lock);
+    8020042a:	00019517          	auipc	a0,0x19
+    8020042e:	bde50513          	addi	a0,a0,-1058 # 80219008 <pr>
+    80200432:	00000097          	auipc	ra,0x0
+    80200436:	61a080e7          	jalr	1562(ra) # 80200a4c <release>
+}
+    8020043a:	0001                	nop
+    8020043c:	70e2                	ld	ra,56(sp)
+    8020043e:	7442                	ld	s0,48(sp)
+    80200440:	6109                	addi	sp,sp,128
+    80200442:	8082                	ret
+
+0000000080200444 <panic>:
+
+void
+panic(char *s)
+{
+    80200444:	1101                	addi	sp,sp,-32
+    80200446:	ec06                	sd	ra,24(sp)
+    80200448:	e822                	sd	s0,16(sp)
+    8020044a:	1000                	addi	s0,sp,32
+    8020044c:	fea43423          	sd	a0,-24(s0)
+  printf("panic: ");
+    80200450:	0000d517          	auipc	a0,0xd
+    80200454:	bc850513          	addi	a0,a0,-1080 # 8020d018 <etext+0x18>
+    80200458:	00000097          	auipc	ra,0x0
+    8020045c:	d96080e7          	jalr	-618(ra) # 802001ee <printf>
+  printf(s);
+    80200460:	fe843503          	ld	a0,-24(s0)
+    80200464:	00000097          	auipc	ra,0x0
+    80200468:	d8a080e7          	jalr	-630(ra) # 802001ee <printf>
+  printf("\n");
+    8020046c:	0000d517          	auipc	a0,0xd
+    80200470:	bb450513          	addi	a0,a0,-1100 # 8020d020 <etext+0x20>
+    80200474:	00000097          	auipc	ra,0x0
+    80200478:	d7a080e7          	jalr	-646(ra) # 802001ee <printf>
+  backtrace();
+    8020047c:	00000097          	auipc	ra,0x0
+    80200480:	016080e7          	jalr	22(ra) # 80200492 <backtrace>
+  panicked = 1; // freeze uart output from other CPUs
+    80200484:	00019797          	auipc	a5,0x19
+    80200488:	b7c78793          	addi	a5,a5,-1156 # 80219000 <panicked>
+    8020048c:	4705                	li	a4,1
+    8020048e:	c398                	sw	a4,0(a5)
+  for(;;)
+    80200490:	a001                	j	80200490 <panic+0x4c>
+
+0000000080200492 <backtrace>:
+    ;
+}
+
+void backtrace()
+{
+    80200492:	7179                	addi	sp,sp,-48
+    80200494:	f406                	sd	ra,40(sp)
+    80200496:	f022                	sd	s0,32(sp)
+    80200498:	1800                	addi	s0,sp,48
+  uint64 *fp = (uint64 *)r_fp();
+    8020049a:	00000097          	auipc	ra,0x0
+    8020049e:	b7c080e7          	jalr	-1156(ra) # 80200016 <r_fp>
+    802004a2:	87aa                	mv	a5,a0
+    802004a4:	fef43423          	sd	a5,-24(s0)
+  uint64 *bottom = (uint64 *)PGROUNDUP((uint64)fp);
+    802004a8:	fe843703          	ld	a4,-24(s0)
+    802004ac:	6785                	lui	a5,0x1
+    802004ae:	17fd                	addi	a5,a5,-1
+    802004b0:	973e                	add	a4,a4,a5
+    802004b2:	77fd                	lui	a5,0xfffff
+    802004b4:	8ff9                	and	a5,a5,a4
+    802004b6:	fef43023          	sd	a5,-32(s0)
+  printf("backtrace:\n");
+    802004ba:	0000d517          	auipc	a0,0xd
+    802004be:	b6e50513          	addi	a0,a0,-1170 # 8020d028 <etext+0x28>
+    802004c2:	00000097          	auipc	ra,0x0
+    802004c6:	d2c080e7          	jalr	-724(ra) # 802001ee <printf>
+  while (fp < bottom) {
+    802004ca:	a80d                	j	802004fc <backtrace+0x6a>
+    uint64 ra = *(fp - 1);
+    802004cc:	fe843783          	ld	a5,-24(s0)
+    802004d0:	ff87b783          	ld	a5,-8(a5) # ffffffffffffeff8 <kernel_end+0xffffffff7fdd1ff8>
+    802004d4:	fcf43c23          	sd	a5,-40(s0)
+    printf("%p\n", ra - 4);
+    802004d8:	fd843783          	ld	a5,-40(s0)
+    802004dc:	17f1                	addi	a5,a5,-4
+    802004de:	85be                	mv	a1,a5
+    802004e0:	0000d517          	auipc	a0,0xd
+    802004e4:	b5850513          	addi	a0,a0,-1192 # 8020d038 <etext+0x38>
+    802004e8:	00000097          	auipc	ra,0x0
+    802004ec:	d06080e7          	jalr	-762(ra) # 802001ee <printf>
+    fp = (uint64 *)*(fp - 2);
+    802004f0:	fe843783          	ld	a5,-24(s0)
+    802004f4:	17c1                	addi	a5,a5,-16
+    802004f6:	639c                	ld	a5,0(a5)
+    802004f8:	fef43423          	sd	a5,-24(s0)
+  while (fp < bottom) {
+    802004fc:	fe843703          	ld	a4,-24(s0)
+    80200500:	fe043783          	ld	a5,-32(s0)
+    80200504:	fcf764e3          	bltu	a4,a5,802004cc <backtrace+0x3a>
+  }
+}
+    80200508:	0001                	nop
+    8020050a:	0001                	nop
+    8020050c:	70a2                	ld	ra,40(sp)
+    8020050e:	7402                	ld	s0,32(sp)
+    80200510:	6145                	addi	sp,sp,48
+    80200512:	8082                	ret
+
+0000000080200514 <printfinit>:
+
+void
+printfinit(void)
+{
+    80200514:	1141                	addi	sp,sp,-16
+    80200516:	e406                	sd	ra,8(sp)
+    80200518:	e022                	sd	s0,0(sp)
+    8020051a:	0800                	addi	s0,sp,16
+  initlock(&pr.lock, "pr");
+    8020051c:	0000d597          	auipc	a1,0xd
+    80200520:	b2458593          	addi	a1,a1,-1244 # 8020d040 <etext+0x40>
+    80200524:	00019517          	auipc	a0,0x19
+    80200528:	ae450513          	addi	a0,a0,-1308 # 80219008 <pr>
+    8020052c:	00000097          	auipc	ra,0x0
+    80200530:	48c080e7          	jalr	1164(ra) # 802009b8 <initlock>
+  pr.locking = 1;   // changed, used to be 1
+    80200534:	00019797          	auipc	a5,0x19
+    80200538:	ad478793          	addi	a5,a5,-1324 # 80219008 <pr>
+    8020053c:	4705                	li	a4,1
+    8020053e:	cf98                	sw	a4,24(a5)
+}
+    80200540:	0001                	nop
+    80200542:	60a2                	ld	ra,8(sp)
+    80200544:	6402                	ld	s0,0(sp)
+    80200546:	0141                	addi	sp,sp,16
+    80200548:	8082                	ret
+
+000000008020054a <print_logo>:
+
+#ifdef QEMU
+void print_logo() {
+    8020054a:	1141                	addi	sp,sp,-16
+    8020054c:	e406                	sd	ra,8(sp)
+    8020054e:	e022                	sd	s0,0(sp)
+    80200550:	0800                	addi	s0,sp,16
+    printf("  (`-.            (`-.                            .-')       ('-.    _   .-')\n");
+    80200552:	0000d517          	auipc	a0,0xd
+    80200556:	af650513          	addi	a0,a0,-1290 # 8020d048 <etext+0x48>
+    8020055a:	00000097          	auipc	ra,0x0
+    8020055e:	c94080e7          	jalr	-876(ra) # 802001ee <printf>
+    printf(" ( OO ).        _(OO  )_                        .(  OO)    _(  OO)  ( '.( OO )_ \n");
+    80200562:	0000d517          	auipc	a0,0xd
+    80200566:	b3650513          	addi	a0,a0,-1226 # 8020d098 <etext+0x98>
+    8020056a:	00000097          	auipc	ra,0x0
+    8020056e:	c84080e7          	jalr	-892(ra) # 802001ee <printf>
+    printf("(_/.  \\_)-. ,--(_/   ,. \\  ,--.                (_)---\\_)  (,------.  ,--.   ,--.) ,--. ,--.  \n");
+    80200572:	0000d517          	auipc	a0,0xd
+    80200576:	b7e50513          	addi	a0,a0,-1154 # 8020d0f0 <etext+0xf0>
+    8020057a:	00000097          	auipc	ra,0x0
+    8020057e:	c74080e7          	jalr	-908(ra) # 802001ee <printf>
+    printf(" \\  `.'  /  \\   \\   /(__/ /  .'       .-')     '  .-.  '   |  .---'  |   `.'   |  |  | |  |   \n");
+    80200582:	0000d517          	auipc	a0,0xd
+    80200586:	bce50513          	addi	a0,a0,-1074 # 8020d150 <etext+0x150>
+    8020058a:	00000097          	auipc	ra,0x0
+    8020058e:	c64080e7          	jalr	-924(ra) # 802001ee <printf>
+    printf("  \\     /\\   \\   \\ /   / .  / -.    _(  OO)   ,|  | |  |   |  |      |         |  |  | | .-')\n");
+    80200592:	0000d517          	auipc	a0,0xd
+    80200596:	c1e50513          	addi	a0,a0,-994 # 8020d1b0 <etext+0x1b0>
+    8020059a:	00000097          	auipc	ra,0x0
+    8020059e:	c54080e7          	jalr	-940(ra) # 802001ee <printf>
+    printf("   \\   \\ |    \\   '   /, | .-.  '  (,------. (_|  | |  |  (|  '--.   |  |'.'|  |  |  |_|( OO )\n");
+    802005a2:	0000d517          	auipc	a0,0xd
+    802005a6:	c6e50513          	addi	a0,a0,-914 # 8020d210 <etext+0x210>
+    802005aa:	00000097          	auipc	ra,0x0
+    802005ae:	c44080e7          	jalr	-956(ra) # 802001ee <printf>
+    printf("  .'    \\_)    \\     /__)' \\  |  |  '------'   |  | |  |   |  .--'   |  |   |  |  |  | | `-' /\n");
+    802005b2:	0000d517          	auipc	a0,0xd
+    802005b6:	cbe50513          	addi	a0,a0,-834 # 8020d270 <etext+0x270>
+    802005ba:	00000097          	auipc	ra,0x0
+    802005be:	c34080e7          	jalr	-972(ra) # 802001ee <printf>
+    printf(" /  .'.  \\      \\   /    \\  `'  /              '  '-'  '-. |  `---.  |  |   |  | ('  '-'(_.-'\n");
+    802005c2:	0000d517          	auipc	a0,0xd
+    802005c6:	d0e50513          	addi	a0,a0,-754 # 8020d2d0 <etext+0x2d0>
+    802005ca:	00000097          	auipc	ra,0x0
+    802005ce:	c24080e7          	jalr	-988(ra) # 802001ee <printf>
+    printf("'--'   '--'      `-'      `----'                `-----'--' `------'  `--'   `--'   `-----'\n");
+    802005d2:	0000d517          	auipc	a0,0xd
+    802005d6:	d5e50513          	addi	a0,a0,-674 # 8020d330 <etext+0x330>
+    802005da:	00000097          	auipc	ra,0x0
+    802005de:	c14080e7          	jalr	-1004(ra) # 802001ee <printf>
+}
+    802005e2:	0001                	nop
+    802005e4:	60a2                	ld	ra,8(sp)
+    802005e6:	6402                	ld	s0,0(sp)
+    802005e8:	0141                	addi	sp,sp,16
+    802005ea:	8082                	ret
+
+00000000802005ec <kinit>:
+  uint64 npage;
+} kmem;
+
+void
+kinit()
+{
+    802005ec:	1141                	addi	sp,sp,-16
+    802005ee:	e406                	sd	ra,8(sp)
+    802005f0:	e022                	sd	s0,0(sp)
+    802005f2:	0800                	addi	s0,sp,16
+  initlock(&kmem.lock, "kmem");
+    802005f4:	0000d597          	auipc	a1,0xd
+    802005f8:	d9c58593          	addi	a1,a1,-612 # 8020d390 <etext+0x390>
+    802005fc:	00019517          	auipc	a0,0x19
+    80200600:	a2c50513          	addi	a0,a0,-1492 # 80219028 <kmem>
+    80200604:	00000097          	auipc	ra,0x0
+    80200608:	3b4080e7          	jalr	948(ra) # 802009b8 <initlock>
+  kmem.freelist = 0;
+    8020060c:	00019797          	auipc	a5,0x19
+    80200610:	a1c78793          	addi	a5,a5,-1508 # 80219028 <kmem>
+    80200614:	0007bc23          	sd	zero,24(a5)
+  kmem.npage = 0;
+    80200618:	00019797          	auipc	a5,0x19
+    8020061c:	a1078793          	addi	a5,a5,-1520 # 80219028 <kmem>
+    80200620:	0207b023          	sd	zero,32(a5)
+  freerange(kernel_end, (void*)PHYSTOP);
+    80200624:	40300793          	li	a5,1027
+    80200628:	01579593          	slli	a1,a5,0x15
+    8020062c:	00010517          	auipc	a0,0x10
+    80200630:	e9453503          	ld	a0,-364(a0) # 802104c0 <_GLOBAL_OFFSET_TABLE_+0x38>
+    80200634:	00000097          	auipc	ra,0x0
+    80200638:	042080e7          	jalr	66(ra) # 80200676 <freerange>
+  #ifdef DEBUG
+  printf("kernel_end: %p, phystop: %p\n", kernel_end, (void*)PHYSTOP);
+    8020063c:	40300793          	li	a5,1027
+    80200640:	01579613          	slli	a2,a5,0x15
+    80200644:	00010597          	auipc	a1,0x10
+    80200648:	e7c5b583          	ld	a1,-388(a1) # 802104c0 <_GLOBAL_OFFSET_TABLE_+0x38>
+    8020064c:	0000d517          	auipc	a0,0xd
+    80200650:	d4c50513          	addi	a0,a0,-692 # 8020d398 <etext+0x398>
+    80200654:	00000097          	auipc	ra,0x0
+    80200658:	b9a080e7          	jalr	-1126(ra) # 802001ee <printf>
+  printf("kinit\n");
+    8020065c:	0000d517          	auipc	a0,0xd
+    80200660:	d5c50513          	addi	a0,a0,-676 # 8020d3b8 <etext+0x3b8>
+    80200664:	00000097          	auipc	ra,0x0
+    80200668:	b8a080e7          	jalr	-1142(ra) # 802001ee <printf>
+  #endif
+}
+    8020066c:	0001                	nop
+    8020066e:	60a2                	ld	ra,8(sp)
+    80200670:	6402                	ld	s0,0(sp)
+    80200672:	0141                	addi	sp,sp,16
+    80200674:	8082                	ret
+
+0000000080200676 <freerange>:
+
+void
+freerange(void *pa_start, void *pa_end)
+{
+    80200676:	7179                	addi	sp,sp,-48
+    80200678:	f406                	sd	ra,40(sp)
+    8020067a:	f022                	sd	s0,32(sp)
+    8020067c:	1800                	addi	s0,sp,48
+    8020067e:	fca43c23          	sd	a0,-40(s0)
+    80200682:	fcb43823          	sd	a1,-48(s0)
+  char *p;
+  p = (char*)PGROUNDUP((uint64)pa_start);
+    80200686:	fd843703          	ld	a4,-40(s0)
+    8020068a:	6785                	lui	a5,0x1
+    8020068c:	17fd                	addi	a5,a5,-1
+    8020068e:	973e                	add	a4,a4,a5
+    80200690:	77fd                	lui	a5,0xfffff
+    80200692:	8ff9                	and	a5,a5,a4
+    80200694:	fef43423          	sd	a5,-24(s0)
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
+    80200698:	a829                	j	802006b2 <freerange+0x3c>
+    kfree(p);
+    8020069a:	fe843503          	ld	a0,-24(s0)
+    8020069e:	00000097          	auipc	ra,0x0
+    802006a2:	030080e7          	jalr	48(ra) # 802006ce <kfree>
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
+    802006a6:	fe843703          	ld	a4,-24(s0)
+    802006aa:	6785                	lui	a5,0x1
+    802006ac:	97ba                	add	a5,a5,a4
+    802006ae:	fef43423          	sd	a5,-24(s0)
+    802006b2:	fe843703          	ld	a4,-24(s0)
+    802006b6:	6785                	lui	a5,0x1
+    802006b8:	97ba                	add	a5,a5,a4
+    802006ba:	fd043703          	ld	a4,-48(s0)
+    802006be:	fcf77ee3          	bgeu	a4,a5,8020069a <freerange+0x24>
+}
+    802006c2:	0001                	nop
+    802006c4:	0001                	nop
+    802006c6:	70a2                	ld	ra,40(sp)
+    802006c8:	7402                	ld	s0,32(sp)
+    802006ca:	6145                	addi	sp,sp,48
+    802006cc:	8082                	ret
+
+00000000802006ce <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)
+{
+    802006ce:	7179                	addi	sp,sp,-48
+    802006d0:	f406                	sd	ra,40(sp)
+    802006d2:	f022                	sd	s0,32(sp)
+    802006d4:	1800                	addi	s0,sp,48
+    802006d6:	fca43c23          	sd	a0,-40(s0)
+  struct run *r;
+  
+  if(((uint64)pa % PGSIZE) != 0 || (char*)pa < kernel_end || (uint64)pa >= PHYSTOP)
+    802006da:	fd843703          	ld	a4,-40(s0)
+    802006de:	6785                	lui	a5,0x1
+    802006e0:	17fd                	addi	a5,a5,-1
+    802006e2:	8ff9                	and	a5,a5,a4
+    802006e4:	e385                	bnez	a5,80200704 <kfree+0x36>
+    802006e6:	fd843703          	ld	a4,-40(s0)
+    802006ea:	00010797          	auipc	a5,0x10
+    802006ee:	dd67b783          	ld	a5,-554(a5) # 802104c0 <_GLOBAL_OFFSET_TABLE_+0x38>
+    802006f2:	00f76963          	bltu	a4,a5,80200704 <kfree+0x36>
+    802006f6:	fd843703          	ld	a4,-40(s0)
+    802006fa:	40300793          	li	a5,1027
+    802006fe:	07d6                	slli	a5,a5,0x15
+    80200700:	00f76a63          	bltu	a4,a5,80200714 <kfree+0x46>
+    panic("kfree");
+    80200704:	0000d517          	auipc	a0,0xd
+    80200708:	cbc50513          	addi	a0,a0,-836 # 8020d3c0 <etext+0x3c0>
+    8020070c:	00000097          	auipc	ra,0x0
+    80200710:	d38080e7          	jalr	-712(ra) # 80200444 <panic>
+
+  // Fill with junk to catch dangling refs.
+  memset(pa, 1, PGSIZE);
+    80200714:	6605                	lui	a2,0x1
+    80200716:	4585                	li	a1,1
+    80200718:	fd843503          	ld	a0,-40(s0)
+    8020071c:	00000097          	auipc	ra,0x0
+    80200720:	3ca080e7          	jalr	970(ra) # 80200ae6 <memset>
+
+  r = (struct run*)pa;
+    80200724:	fd843783          	ld	a5,-40(s0)
+    80200728:	fef43423          	sd	a5,-24(s0)
+
+  acquire(&kmem.lock);
+    8020072c:	00019517          	auipc	a0,0x19
+    80200730:	8fc50513          	addi	a0,a0,-1796 # 80219028 <kmem>
+    80200734:	00000097          	auipc	ra,0x0
+    80200738:	2b4080e7          	jalr	692(ra) # 802009e8 <acquire>
+  r->next = kmem.freelist;
+    8020073c:	00019797          	auipc	a5,0x19
+    80200740:	8ec78793          	addi	a5,a5,-1812 # 80219028 <kmem>
+    80200744:	6f98                	ld	a4,24(a5)
+    80200746:	fe843783          	ld	a5,-24(s0)
+    8020074a:	e398                	sd	a4,0(a5)
+  kmem.freelist = r;
+    8020074c:	00019797          	auipc	a5,0x19
+    80200750:	8dc78793          	addi	a5,a5,-1828 # 80219028 <kmem>
+    80200754:	fe843703          	ld	a4,-24(s0)
+    80200758:	ef98                	sd	a4,24(a5)
+  kmem.npage++;
+    8020075a:	00019797          	auipc	a5,0x19
+    8020075e:	8ce78793          	addi	a5,a5,-1842 # 80219028 <kmem>
+    80200762:	739c                	ld	a5,32(a5)
+    80200764:	00178713          	addi	a4,a5,1
+    80200768:	00019797          	auipc	a5,0x19
+    8020076c:	8c078793          	addi	a5,a5,-1856 # 80219028 <kmem>
+    80200770:	f398                	sd	a4,32(a5)
+  release(&kmem.lock);
+    80200772:	00019517          	auipc	a0,0x19
+    80200776:	8b650513          	addi	a0,a0,-1866 # 80219028 <kmem>
+    8020077a:	00000097          	auipc	ra,0x0
+    8020077e:	2d2080e7          	jalr	722(ra) # 80200a4c <release>
+}
+    80200782:	0001                	nop
+    80200784:	70a2                	ld	ra,40(sp)
+    80200786:	7402                	ld	s0,32(sp)
+    80200788:	6145                	addi	sp,sp,48
+    8020078a:	8082                	ret
+
+000000008020078c <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)
+{
+    8020078c:	1101                	addi	sp,sp,-32
+    8020078e:	ec06                	sd	ra,24(sp)
+    80200790:	e822                	sd	s0,16(sp)
+    80200792:	1000                	addi	s0,sp,32
+  struct run *r;
+
+  acquire(&kmem.lock);
+    80200794:	00019517          	auipc	a0,0x19
+    80200798:	89450513          	addi	a0,a0,-1900 # 80219028 <kmem>
+    8020079c:	00000097          	auipc	ra,0x0
+    802007a0:	24c080e7          	jalr	588(ra) # 802009e8 <acquire>
+  r = kmem.freelist;
+    802007a4:	00019797          	auipc	a5,0x19
+    802007a8:	88478793          	addi	a5,a5,-1916 # 80219028 <kmem>
+    802007ac:	6f9c                	ld	a5,24(a5)
+    802007ae:	fef43423          	sd	a5,-24(s0)
+  if(r) {
+    802007b2:	fe843783          	ld	a5,-24(s0)
+    802007b6:	c78d                	beqz	a5,802007e0 <kalloc+0x54>
+    kmem.freelist = r->next;
+    802007b8:	fe843783          	ld	a5,-24(s0)
+    802007bc:	6398                	ld	a4,0(a5)
+    802007be:	00019797          	auipc	a5,0x19
+    802007c2:	86a78793          	addi	a5,a5,-1942 # 80219028 <kmem>
+    802007c6:	ef98                	sd	a4,24(a5)
+    kmem.npage--;
+    802007c8:	00019797          	auipc	a5,0x19
+    802007cc:	86078793          	addi	a5,a5,-1952 # 80219028 <kmem>
+    802007d0:	739c                	ld	a5,32(a5)
+    802007d2:	fff78713          	addi	a4,a5,-1
+    802007d6:	00019797          	auipc	a5,0x19
+    802007da:	85278793          	addi	a5,a5,-1966 # 80219028 <kmem>
+    802007de:	f398                	sd	a4,32(a5)
+  }
+  release(&kmem.lock);
+    802007e0:	00019517          	auipc	a0,0x19
+    802007e4:	84850513          	addi	a0,a0,-1976 # 80219028 <kmem>
+    802007e8:	00000097          	auipc	ra,0x0
+    802007ec:	264080e7          	jalr	612(ra) # 80200a4c <release>
+
+  if(r)
+    802007f0:	fe843783          	ld	a5,-24(s0)
+    802007f4:	cb89                	beqz	a5,80200806 <kalloc+0x7a>
+    memset((char*)r, 5, PGSIZE); // fill with junk
+    802007f6:	6605                	lui	a2,0x1
+    802007f8:	4595                	li	a1,5
+    802007fa:	fe843503          	ld	a0,-24(s0)
+    802007fe:	00000097          	auipc	ra,0x0
+    80200802:	2e8080e7          	jalr	744(ra) # 80200ae6 <memset>
+  return (void*)r;
+    80200806:	fe843783          	ld	a5,-24(s0)
+}
+    8020080a:	853e                	mv	a0,a5
+    8020080c:	60e2                	ld	ra,24(sp)
+    8020080e:	6442                	ld	s0,16(sp)
+    80200810:	6105                	addi	sp,sp,32
+    80200812:	8082                	ret
+
+0000000080200814 <freemem_amount>:
+
+uint64
+freemem_amount(void)
+{
+    80200814:	1141                	addi	sp,sp,-16
+    80200816:	e422                	sd	s0,8(sp)
+    80200818:	0800                	addi	s0,sp,16
+  return kmem.npage << PGSHIFT;
+    8020081a:	00019797          	auipc	a5,0x19
+    8020081e:	80e78793          	addi	a5,a5,-2034 # 80219028 <kmem>
+    80200822:	739c                	ld	a5,32(a5)
+    80200824:	07b2                	slli	a5,a5,0xc
+}
+    80200826:	853e                	mv	a0,a5
+    80200828:	6422                	ld	s0,8(sp)
+    8020082a:	0141                	addi	sp,sp,16
+    8020082c:	8082                	ret
+
+000000008020082e <r_sstatus>:
+{
+    8020082e:	1101                	addi	sp,sp,-32
+    80200830:	ec22                	sd	s0,24(sp)
+    80200832:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80200834:	100027f3          	csrr	a5,sstatus
+    80200838:	fef43423          	sd	a5,-24(s0)
+  return x;
+    8020083c:	fe843783          	ld	a5,-24(s0)
+}
+    80200840:	853e                	mv	a0,a5
+    80200842:	6462                	ld	s0,24(sp)
+    80200844:	6105                	addi	sp,sp,32
+    80200846:	8082                	ret
+
+0000000080200848 <w_sstatus>:
+{
+    80200848:	1101                	addi	sp,sp,-32
+    8020084a:	ec22                	sd	s0,24(sp)
+    8020084c:	1000                	addi	s0,sp,32
+    8020084e:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80200852:	fe843783          	ld	a5,-24(s0)
+    80200856:	10079073          	csrw	sstatus,a5
+}
+    8020085a:	0001                	nop
+    8020085c:	6462                	ld	s0,24(sp)
+    8020085e:	6105                	addi	sp,sp,32
+    80200860:	8082                	ret
+
+0000000080200862 <intr_on>:
+{
+    80200862:	1141                	addi	sp,sp,-16
+    80200864:	e406                	sd	ra,8(sp)
+    80200866:	e022                	sd	s0,0(sp)
+    80200868:	0800                	addi	s0,sp,16
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    8020086a:	00000097          	auipc	ra,0x0
+    8020086e:	fc4080e7          	jalr	-60(ra) # 8020082e <r_sstatus>
+    80200872:	87aa                	mv	a5,a0
+    80200874:	0027e793          	ori	a5,a5,2
+    80200878:	853e                	mv	a0,a5
+    8020087a:	00000097          	auipc	ra,0x0
+    8020087e:	fce080e7          	jalr	-50(ra) # 80200848 <w_sstatus>
+}
+    80200882:	0001                	nop
+    80200884:	60a2                	ld	ra,8(sp)
+    80200886:	6402                	ld	s0,0(sp)
+    80200888:	0141                	addi	sp,sp,16
+    8020088a:	8082                	ret
+
+000000008020088c <intr_off>:
+{
+    8020088c:	1141                	addi	sp,sp,-16
+    8020088e:	e406                	sd	ra,8(sp)
+    80200890:	e022                	sd	s0,0(sp)
+    80200892:	0800                	addi	s0,sp,16
+  w_sstatus(r_sstatus() & ~SSTATUS_SIE); //按位取反,将状态寄存器中的中断使能位关闭,从而实现关中断
+    80200894:	00000097          	auipc	ra,0x0
+    80200898:	f9a080e7          	jalr	-102(ra) # 8020082e <r_sstatus>
+    8020089c:	87aa                	mv	a5,a0
+    8020089e:	9bf5                	andi	a5,a5,-3
+    802008a0:	853e                	mv	a0,a5
+    802008a2:	00000097          	auipc	ra,0x0
+    802008a6:	fa6080e7          	jalr	-90(ra) # 80200848 <w_sstatus>
+}
+    802008aa:	0001                	nop
+    802008ac:	60a2                	ld	ra,8(sp)
+    802008ae:	6402                	ld	s0,0(sp)
+    802008b0:	0141                	addi	sp,sp,16
+    802008b2:	8082                	ret
+
+00000000802008b4 <intr_get>:
+{
+    802008b4:	1101                	addi	sp,sp,-32
+    802008b6:	ec06                	sd	ra,24(sp)
+    802008b8:	e822                	sd	s0,16(sp)
+    802008ba:	1000                	addi	s0,sp,32
+  uint64 x = r_sstatus();
+    802008bc:	00000097          	auipc	ra,0x0
+    802008c0:	f72080e7          	jalr	-142(ra) # 8020082e <r_sstatus>
+    802008c4:	fea43423          	sd	a0,-24(s0)
+  return (x & SSTATUS_SIE) != 0;
+    802008c8:	fe843783          	ld	a5,-24(s0)
+    802008cc:	8b89                	andi	a5,a5,2
+    802008ce:	00f037b3          	snez	a5,a5
+    802008d2:	0ff7f793          	andi	a5,a5,255
+    802008d6:	2781                	sext.w	a5,a5
+}
+    802008d8:	853e                	mv	a0,a5
+    802008da:	60e2                	ld	ra,24(sp)
+    802008dc:	6442                	ld	s0,16(sp)
+    802008de:	6105                	addi	sp,sp,32
+    802008e0:	8082                	ret
+
+00000000802008e2 <push_off>:
+// it takes two pop_off()s to undo two push_off()s.  Also, if interrupts
+// are initially off, then push_off, pop_off leaves them off.
+
+void
+push_off(void)
+{
+    802008e2:	1101                	addi	sp,sp,-32
+    802008e4:	ec06                	sd	ra,24(sp)
+    802008e6:	e822                	sd	s0,16(sp)
+    802008e8:	1000                	addi	s0,sp,32
+  int old = intr_get();
+    802008ea:	00000097          	auipc	ra,0x0
+    802008ee:	fca080e7          	jalr	-54(ra) # 802008b4 <intr_get>
+    802008f2:	87aa                	mv	a5,a0
+    802008f4:	fef42623          	sw	a5,-20(s0)
+
+  intr_off();
+    802008f8:	00000097          	auipc	ra,0x0
+    802008fc:	f94080e7          	jalr	-108(ra) # 8020088c <intr_off>
+  //printf("\e[32mpush_off()\e[0m: cpuid(): %d\n", cpuid());
+  if(mycpu()->noff == 0)//判断当前CPU的noff(即用于保存CPU flags的栈的高度)是否为0
+    80200900:	00002097          	auipc	ra,0x2
+    80200904:	028080e7          	jalr	40(ra) # 80202928 <mycpu>
+    80200908:	87aa                	mv	a5,a0
+    8020090a:	5fbc                	lw	a5,120(a5)
+    8020090c:	eb89                	bnez	a5,8020091e <push_off+0x3c>
+    mycpu()->intena = old;//如果是的话就把当前的中断状态保存下来(intena的全称是interrupt enabled),然后将栈的高度(noff)自增
+    8020090e:	00002097          	auipc	ra,0x2
+    80200912:	01a080e7          	jalr	26(ra) # 80202928 <mycpu>
+    80200916:	872a                	mv	a4,a0
+    80200918:	fec42783          	lw	a5,-20(s0)
+    8020091c:	df7c                	sw	a5,124(a4)
+  mycpu()->noff += 1;
+    8020091e:	00002097          	auipc	ra,0x2
+    80200922:	00a080e7          	jalr	10(ra) # 80202928 <mycpu>
+    80200926:	87aa                	mv	a5,a0
+    80200928:	5fb8                	lw	a4,120(a5)
+    8020092a:	2705                	addiw	a4,a4,1
+    8020092c:	2701                	sext.w	a4,a4
+    8020092e:	dfb8                	sw	a4,120(a5)
+}
+    80200930:	0001                	nop
+    80200932:	60e2                	ld	ra,24(sp)
+    80200934:	6442                	ld	s0,16(sp)
+    80200936:	6105                	addi	sp,sp,32
+    80200938:	8082                	ret
+
+000000008020093a <pop_off>:
+
+void
+pop_off(void)
+{
+    8020093a:	1101                	addi	sp,sp,-32
+    8020093c:	ec06                	sd	ra,24(sp)
+    8020093e:	e822                	sd	s0,16(sp)
+    80200940:	1000                	addi	s0,sp,32
+  struct cpu *c = mycpu();
+    80200942:	00002097          	auipc	ra,0x2
+    80200946:	fe6080e7          	jalr	-26(ra) # 80202928 <mycpu>
+    8020094a:	fea43423          	sd	a0,-24(s0)
+
+  //printf("\e[31mpop_off()\e[0m: cpuid(): %d\n", cpuid());
+  if(intr_get())
+    8020094e:	00000097          	auipc	ra,0x0
+    80200952:	f66080e7          	jalr	-154(ra) # 802008b4 <intr_get>
+    80200956:	87aa                	mv	a5,a0
+    80200958:	cb89                	beqz	a5,8020096a <pop_off+0x30>
+    panic("pop_off - interruptible");
+    8020095a:	0000d517          	auipc	a0,0xd
+    8020095e:	a6e50513          	addi	a0,a0,-1426 # 8020d3c8 <etext+0x3c8>
+    80200962:	00000097          	auipc	ra,0x0
+    80200966:	ae2080e7          	jalr	-1310(ra) # 80200444 <panic>
+  if(c->noff < 1) {
+    8020096a:	fe843783          	ld	a5,-24(s0)
+    8020096e:	5fbc                	lw	a5,120(a5)
+    80200970:	00f04a63          	bgtz	a5,80200984 <pop_off+0x4a>
+    //printf("c->noff = %d\n", c->noff);
+    panic("pop_off");
+    80200974:	0000d517          	auipc	a0,0xd
+    80200978:	a6c50513          	addi	a0,a0,-1428 # 8020d3e0 <etext+0x3e0>
+    8020097c:	00000097          	auipc	ra,0x0
+    80200980:	ac8080e7          	jalr	-1336(ra) # 80200444 <panic>
+  }
+  //printf("c->noff: %d\n", c->noff);
+  //printf("c: %x\n", c);
+  c->noff -= 1;
+    80200984:	fe843783          	ld	a5,-24(s0)
+    80200988:	5fbc                	lw	a5,120(a5)
+    8020098a:	37fd                	addiw	a5,a5,-1
+    8020098c:	0007871b          	sext.w	a4,a5
+    80200990:	fe843783          	ld	a5,-24(s0)
+    80200994:	dfb8                	sw	a4,120(a5)
+  if(c->noff == 0 && c->intena)
+    80200996:	fe843783          	ld	a5,-24(s0)
+    8020099a:	5fbc                	lw	a5,120(a5)
+    8020099c:	eb89                	bnez	a5,802009ae <pop_off+0x74>
+    8020099e:	fe843783          	ld	a5,-24(s0)
+    802009a2:	5ffc                	lw	a5,124(a5)
+    802009a4:	c789                	beqz	a5,802009ae <pop_off+0x74>
+    intr_on();
+    802009a6:	00000097          	auipc	ra,0x0
+    802009aa:	ebc080e7          	jalr	-324(ra) # 80200862 <intr_on>
+}
+    802009ae:	0001                	nop
+    802009b0:	60e2                	ld	ra,24(sp)
+    802009b2:	6442                	ld	s0,16(sp)
+    802009b4:	6105                	addi	sp,sp,32
+    802009b6:	8082                	ret
+
+00000000802009b8 <initlock>:
+#include "include/intr.h"
+#include "include/printf.h"
+
+void
+initlock(struct spinlock *lk, char *name)
+{
+    802009b8:	1101                	addi	sp,sp,-32
+    802009ba:	ec22                	sd	s0,24(sp)
+    802009bc:	1000                	addi	s0,sp,32
+    802009be:	fea43423          	sd	a0,-24(s0)
+    802009c2:	feb43023          	sd	a1,-32(s0)
+  lk->name = name;
+    802009c6:	fe843783          	ld	a5,-24(s0)
+    802009ca:	fe043703          	ld	a4,-32(s0)
+    802009ce:	e798                	sd	a4,8(a5)
+  lk->locked = 0;
+    802009d0:	fe843783          	ld	a5,-24(s0)
+    802009d4:	0007a023          	sw	zero,0(a5)
+  lk->cpu = 0;
+    802009d8:	fe843783          	ld	a5,-24(s0)
+    802009dc:	0007b823          	sd	zero,16(a5)
+}
+    802009e0:	0001                	nop
+    802009e2:	6462                	ld	s0,24(sp)
+    802009e4:	6105                	addi	sp,sp,32
+    802009e6:	8082                	ret
+
+00000000802009e8 <acquire>:
+
+// Acquire the lock.
+// Loops (spins) until the lock is acquired.
+void
+acquire(struct spinlock *lk)
+{
+    802009e8:	1101                	addi	sp,sp,-32
+    802009ea:	ec06                	sd	ra,24(sp)
+    802009ec:	e822                	sd	s0,16(sp)
+    802009ee:	1000                	addi	s0,sp,32
+    802009f0:	fea43423          	sd	a0,-24(s0)
+  push_off(); // disable interrupts to avoid deadlock.
+    802009f4:	00000097          	auipc	ra,0x0
+    802009f8:	eee080e7          	jalr	-274(ra) # 802008e2 <push_off>
+  if(holding(lk))
+    802009fc:	fe843503          	ld	a0,-24(s0)
+    80200a00:	00000097          	auipc	ra,0x0
+    80200a04:	0a2080e7          	jalr	162(ra) # 80200aa2 <holding>
+    80200a08:	87aa                	mv	a5,a0
+    80200a0a:	cb89                	beqz	a5,80200a1c <acquire+0x34>
+    panic("acquire");
+    80200a0c:	0000d517          	auipc	a0,0xd
+    80200a10:	9dc50513          	addi	a0,a0,-1572 # 8020d3e8 <etext+0x3e8>
+    80200a14:	00000097          	auipc	ra,0x0
+    80200a18:	a30080e7          	jalr	-1488(ra) # 80200444 <panic>
+
+  // On RISC-V, sync_lock_test_and_set turns into an atomic swap:
+  //   a5 = 1
+  //   s1 = &lk->locked
+  //   amoswap.w.aq a5, a5, (s1)
+  while(__sync_lock_test_and_set(&lk->locked, 1) != 0)
+    80200a1c:	0001                	nop
+    80200a1e:	fe843783          	ld	a5,-24(s0)
+    80200a22:	4705                	li	a4,1
+    80200a24:	0ce7a72f          	amoswap.w.aq	a4,a4,(a5)
+    80200a28:	0007079b          	sext.w	a5,a4
+    80200a2c:	fbed                	bnez	a5,80200a1e <acquire+0x36>
+
+  // Tell the C compiler and the processor to not move loads or stores
+  // past this point, to ensure that the critical section's memory
+  // references happen strictly after the lock is acquired.
+  // On RISC-V, this emits a fence instruction.
+  __sync_synchronize();
+    80200a2e:	0ff0000f          	fence
+
+  // Record info about lock acquisition for holding() and debugging.
+  lk->cpu = mycpu();
+    80200a32:	00002097          	auipc	ra,0x2
+    80200a36:	ef6080e7          	jalr	-266(ra) # 80202928 <mycpu>
+    80200a3a:	872a                	mv	a4,a0
+    80200a3c:	fe843783          	ld	a5,-24(s0)
+    80200a40:	eb98                	sd	a4,16(a5)
+}
+    80200a42:	0001                	nop
+    80200a44:	60e2                	ld	ra,24(sp)
+    80200a46:	6442                	ld	s0,16(sp)
+    80200a48:	6105                	addi	sp,sp,32
+    80200a4a:	8082                	ret
+
+0000000080200a4c <release>:
+
+// Release the lock.
+void
+release(struct spinlock *lk)
+{
+    80200a4c:	1101                	addi	sp,sp,-32
+    80200a4e:	ec06                	sd	ra,24(sp)
+    80200a50:	e822                	sd	s0,16(sp)
+    80200a52:	1000                	addi	s0,sp,32
+    80200a54:	fea43423          	sd	a0,-24(s0)
+  if(!holding(lk))
+    80200a58:	fe843503          	ld	a0,-24(s0)
+    80200a5c:	00000097          	auipc	ra,0x0
+    80200a60:	046080e7          	jalr	70(ra) # 80200aa2 <holding>
+    80200a64:	87aa                	mv	a5,a0
+    80200a66:	eb89                	bnez	a5,80200a78 <release+0x2c>
+    panic("release");
+    80200a68:	0000d517          	auipc	a0,0xd
+    80200a6c:	98850513          	addi	a0,a0,-1656 # 8020d3f0 <etext+0x3f0>
+    80200a70:	00000097          	auipc	ra,0x0
+    80200a74:	9d4080e7          	jalr	-1580(ra) # 80200444 <panic>
+
+  lk->cpu = 0;
+    80200a78:	fe843783          	ld	a5,-24(s0)
+    80200a7c:	0007b823          	sd	zero,16(a5)
+  // past this point, to ensure that all the stores in the critical
+  // section are visible to other CPUs before the lock is released,
+  // and that loads in the critical section occur strictly before
+  // the lock is released.
+  // On RISC-V, this emits a fence instruction.
+  __sync_synchronize();
+    80200a80:	0ff0000f          	fence
+  // implies that an assignment might be implemented with
+  // multiple store instructions.
+  // On RISC-V, sync_lock_release turns into an atomic swap:
+  //   s1 = &lk->locked
+  //   amoswap.w zero, zero, (s1)
+  __sync_lock_release(&lk->locked);
+    80200a84:	fe843783          	ld	a5,-24(s0)
+    80200a88:	0f50000f          	fence	iorw,ow
+    80200a8c:	0807a02f          	amoswap.w	zero,zero,(a5)
+
+  pop_off();
+    80200a90:	00000097          	auipc	ra,0x0
+    80200a94:	eaa080e7          	jalr	-342(ra) # 8020093a <pop_off>
+}
+    80200a98:	0001                	nop
+    80200a9a:	60e2                	ld	ra,24(sp)
+    80200a9c:	6442                	ld	s0,16(sp)
+    80200a9e:	6105                	addi	sp,sp,32
+    80200aa0:	8082                	ret
+
+0000000080200aa2 <holding>:
+
+// Check whether this cpu is holding the lock.
+// Interrupts must be off.
+int
+holding(struct spinlock *lk)
+{
+    80200aa2:	7139                	addi	sp,sp,-64
+    80200aa4:	fc06                	sd	ra,56(sp)
+    80200aa6:	f822                	sd	s0,48(sp)
+    80200aa8:	f426                	sd	s1,40(sp)
+    80200aaa:	0080                	addi	s0,sp,64
+    80200aac:	fca43423          	sd	a0,-56(s0)
+  int r;
+  r = (lk->locked && lk->cpu == mycpu());
+    80200ab0:	fc843783          	ld	a5,-56(s0)
+    80200ab4:	439c                	lw	a5,0(a5)
+    80200ab6:	cf89                	beqz	a5,80200ad0 <holding+0x2e>
+    80200ab8:	fc843783          	ld	a5,-56(s0)
+    80200abc:	6b84                	ld	s1,16(a5)
+    80200abe:	00002097          	auipc	ra,0x2
+    80200ac2:	e6a080e7          	jalr	-406(ra) # 80202928 <mycpu>
+    80200ac6:	87aa                	mv	a5,a0
+    80200ac8:	00f49463          	bne	s1,a5,80200ad0 <holding+0x2e>
+    80200acc:	4785                	li	a5,1
+    80200ace:	a011                	j	80200ad2 <holding+0x30>
+    80200ad0:	4781                	li	a5,0
+    80200ad2:	fcf42e23          	sw	a5,-36(s0)
+  return r;
+    80200ad6:	fdc42783          	lw	a5,-36(s0)
+}
+    80200ada:	853e                	mv	a0,a5
+    80200adc:	70e2                	ld	ra,56(sp)
+    80200ade:	7442                	ld	s0,48(sp)
+    80200ae0:	74a2                	ld	s1,40(sp)
+    80200ae2:	6121                	addi	sp,sp,64
+    80200ae4:	8082                	ret
+
+0000000080200ae6 <memset>:
+#include "include/types.h"
+
+void*
+memset(void *dst, int c, uint n)
+{
+    80200ae6:	7179                	addi	sp,sp,-48
+    80200ae8:	f422                	sd	s0,40(sp)
+    80200aea:	1800                	addi	s0,sp,48
+    80200aec:	fca43c23          	sd	a0,-40(s0)
+    80200af0:	87ae                	mv	a5,a1
+    80200af2:	8732                	mv	a4,a2
+    80200af4:	fcf42a23          	sw	a5,-44(s0)
+    80200af8:	87ba                	mv	a5,a4
+    80200afa:	fcf42823          	sw	a5,-48(s0)
+  char *cdst = (char *) dst;
+    80200afe:	fd843783          	ld	a5,-40(s0)
+    80200b02:	fef43023          	sd	a5,-32(s0)
+  int i;
+  for(i = 0; i < n; i++){
+    80200b06:	fe042623          	sw	zero,-20(s0)
+    80200b0a:	a00d                	j	80200b2c <memset+0x46>
+    cdst[i] = c;
+    80200b0c:	fec42783          	lw	a5,-20(s0)
+    80200b10:	fe043703          	ld	a4,-32(s0)
+    80200b14:	97ba                	add	a5,a5,a4
+    80200b16:	fd442703          	lw	a4,-44(s0)
+    80200b1a:	0ff77713          	andi	a4,a4,255
+    80200b1e:	00e78023          	sb	a4,0(a5)
+  for(i = 0; i < n; i++){
+    80200b22:	fec42783          	lw	a5,-20(s0)
+    80200b26:	2785                	addiw	a5,a5,1
+    80200b28:	fef42623          	sw	a5,-20(s0)
+    80200b2c:	fec42703          	lw	a4,-20(s0)
+    80200b30:	fd042783          	lw	a5,-48(s0)
+    80200b34:	2781                	sext.w	a5,a5
+    80200b36:	fcf76be3          	bltu	a4,a5,80200b0c <memset+0x26>
+  }
+  return dst;
+    80200b3a:	fd843783          	ld	a5,-40(s0)
+}
+    80200b3e:	853e                	mv	a0,a5
+    80200b40:	7422                	ld	s0,40(sp)
+    80200b42:	6145                	addi	sp,sp,48
+    80200b44:	8082                	ret
+
+0000000080200b46 <memcmp>:
+
+int
+memcmp(const void *v1, const void *v2, uint n)
+{
+    80200b46:	7139                	addi	sp,sp,-64
+    80200b48:	fc22                	sd	s0,56(sp)
+    80200b4a:	0080                	addi	s0,sp,64
+    80200b4c:	fca43c23          	sd	a0,-40(s0)
+    80200b50:	fcb43823          	sd	a1,-48(s0)
+    80200b54:	87b2                	mv	a5,a2
+    80200b56:	fcf42623          	sw	a5,-52(s0)
+  const uchar *s1, *s2;
+
+  s1 = v1;
+    80200b5a:	fd843783          	ld	a5,-40(s0)
+    80200b5e:	fef43423          	sd	a5,-24(s0)
+  s2 = v2;
+    80200b62:	fd043783          	ld	a5,-48(s0)
+    80200b66:	fef43023          	sd	a5,-32(s0)
+  while(n-- > 0){
+    80200b6a:	a0a1                	j	80200bb2 <memcmp+0x6c>
+    if(*s1 != *s2)
+    80200b6c:	fe843783          	ld	a5,-24(s0)
+    80200b70:	0007c703          	lbu	a4,0(a5)
+    80200b74:	fe043783          	ld	a5,-32(s0)
+    80200b78:	0007c783          	lbu	a5,0(a5)
+    80200b7c:	02f70163          	beq	a4,a5,80200b9e <memcmp+0x58>
+      return *s1 - *s2;
+    80200b80:	fe843783          	ld	a5,-24(s0)
+    80200b84:	0007c783          	lbu	a5,0(a5)
+    80200b88:	0007871b          	sext.w	a4,a5
+    80200b8c:	fe043783          	ld	a5,-32(s0)
+    80200b90:	0007c783          	lbu	a5,0(a5)
+    80200b94:	2781                	sext.w	a5,a5
+    80200b96:	40f707bb          	subw	a5,a4,a5
+    80200b9a:	2781                	sext.w	a5,a5
+    80200b9c:	a01d                	j	80200bc2 <memcmp+0x7c>
+    s1++, s2++;
+    80200b9e:	fe843783          	ld	a5,-24(s0)
+    80200ba2:	0785                	addi	a5,a5,1
+    80200ba4:	fef43423          	sd	a5,-24(s0)
+    80200ba8:	fe043783          	ld	a5,-32(s0)
+    80200bac:	0785                	addi	a5,a5,1
+    80200bae:	fef43023          	sd	a5,-32(s0)
+  while(n-- > 0){
+    80200bb2:	fcc42783          	lw	a5,-52(s0)
+    80200bb6:	fff7871b          	addiw	a4,a5,-1
+    80200bba:	fce42623          	sw	a4,-52(s0)
+    80200bbe:	f7dd                	bnez	a5,80200b6c <memcmp+0x26>
+  }
+
+  return 0;
+    80200bc0:	4781                	li	a5,0
+}
+    80200bc2:	853e                	mv	a0,a5
+    80200bc4:	7462                	ld	s0,56(sp)
+    80200bc6:	6121                	addi	sp,sp,64
+    80200bc8:	8082                	ret
+
+0000000080200bca <memmove>:
+
+void*
+memmove(void *dst, const void *src, uint n)
+{
+    80200bca:	7139                	addi	sp,sp,-64
+    80200bcc:	fc22                	sd	s0,56(sp)
+    80200bce:	0080                	addi	s0,sp,64
+    80200bd0:	fca43c23          	sd	a0,-40(s0)
+    80200bd4:	fcb43823          	sd	a1,-48(s0)
+    80200bd8:	87b2                	mv	a5,a2
+    80200bda:	fcf42623          	sw	a5,-52(s0)
+  const char *s;
+  char *d;
+
+  s = src;
+    80200bde:	fd043783          	ld	a5,-48(s0)
+    80200be2:	fef43423          	sd	a5,-24(s0)
+  d = dst;
+    80200be6:	fd843783          	ld	a5,-40(s0)
+    80200bea:	fef43023          	sd	a5,-32(s0)
+  if(s < d && s + n > d){
+    80200bee:	fe843703          	ld	a4,-24(s0)
+    80200bf2:	fe043783          	ld	a5,-32(s0)
+    80200bf6:	08f77463          	bgeu	a4,a5,80200c7e <memmove+0xb4>
+    80200bfa:	fcc46783          	lwu	a5,-52(s0)
+    80200bfe:	fe843703          	ld	a4,-24(s0)
+    80200c02:	97ba                	add	a5,a5,a4
+    80200c04:	fe043703          	ld	a4,-32(s0)
+    80200c08:	06f77b63          	bgeu	a4,a5,80200c7e <memmove+0xb4>
+    s += n;
+    80200c0c:	fcc46783          	lwu	a5,-52(s0)
+    80200c10:	fe843703          	ld	a4,-24(s0)
+    80200c14:	97ba                	add	a5,a5,a4
+    80200c16:	fef43423          	sd	a5,-24(s0)
+    d += n;
+    80200c1a:	fcc46783          	lwu	a5,-52(s0)
+    80200c1e:	fe043703          	ld	a4,-32(s0)
+    80200c22:	97ba                	add	a5,a5,a4
+    80200c24:	fef43023          	sd	a5,-32(s0)
+    while(n-- > 0)
+    80200c28:	a01d                	j	80200c4e <memmove+0x84>
+      *--d = *--s;
+    80200c2a:	fe843783          	ld	a5,-24(s0)
+    80200c2e:	17fd                	addi	a5,a5,-1
+    80200c30:	fef43423          	sd	a5,-24(s0)
+    80200c34:	fe043783          	ld	a5,-32(s0)
+    80200c38:	17fd                	addi	a5,a5,-1
+    80200c3a:	fef43023          	sd	a5,-32(s0)
+    80200c3e:	fe843783          	ld	a5,-24(s0)
+    80200c42:	0007c703          	lbu	a4,0(a5)
+    80200c46:	fe043783          	ld	a5,-32(s0)
+    80200c4a:	00e78023          	sb	a4,0(a5)
+    while(n-- > 0)
+    80200c4e:	fcc42783          	lw	a5,-52(s0)
+    80200c52:	fff7871b          	addiw	a4,a5,-1
+    80200c56:	fce42623          	sw	a4,-52(s0)
+    80200c5a:	fbe1                	bnez	a5,80200c2a <memmove+0x60>
+  if(s < d && s + n > d){
+    80200c5c:	a805                	j	80200c8c <memmove+0xc2>
+  } else
+    while(n-- > 0)
+      *d++ = *s++;
+    80200c5e:	fe843703          	ld	a4,-24(s0)
+    80200c62:	00170793          	addi	a5,a4,1
+    80200c66:	fef43423          	sd	a5,-24(s0)
+    80200c6a:	fe043783          	ld	a5,-32(s0)
+    80200c6e:	00178693          	addi	a3,a5,1
+    80200c72:	fed43023          	sd	a3,-32(s0)
+    80200c76:	00074703          	lbu	a4,0(a4)
+    80200c7a:	00e78023          	sb	a4,0(a5)
+    while(n-- > 0)
+    80200c7e:	fcc42783          	lw	a5,-52(s0)
+    80200c82:	fff7871b          	addiw	a4,a5,-1
+    80200c86:	fce42623          	sw	a4,-52(s0)
+    80200c8a:	fbf1                	bnez	a5,80200c5e <memmove+0x94>
+
+  return dst;
+    80200c8c:	fd843783          	ld	a5,-40(s0)
+}
+    80200c90:	853e                	mv	a0,a5
+    80200c92:	7462                	ld	s0,56(sp)
+    80200c94:	6121                	addi	sp,sp,64
+    80200c96:	8082                	ret
+
+0000000080200c98 <memcpy>:
+
+// memcpy exists to placate GCC.  Use memmove.
+void*
+memcpy(void *dst, const void *src, uint n)
+{
+    80200c98:	7179                	addi	sp,sp,-48
+    80200c9a:	f406                	sd	ra,40(sp)
+    80200c9c:	f022                	sd	s0,32(sp)
+    80200c9e:	1800                	addi	s0,sp,48
+    80200ca0:	fea43423          	sd	a0,-24(s0)
+    80200ca4:	feb43023          	sd	a1,-32(s0)
+    80200ca8:	87b2                	mv	a5,a2
+    80200caa:	fcf42e23          	sw	a5,-36(s0)
+  return memmove(dst, src, n);
+    80200cae:	fdc42783          	lw	a5,-36(s0)
+    80200cb2:	863e                	mv	a2,a5
+    80200cb4:	fe043583          	ld	a1,-32(s0)
+    80200cb8:	fe843503          	ld	a0,-24(s0)
+    80200cbc:	00000097          	auipc	ra,0x0
+    80200cc0:	f0e080e7          	jalr	-242(ra) # 80200bca <memmove>
+    80200cc4:	87aa                	mv	a5,a0
+}
+    80200cc6:	853e                	mv	a0,a5
+    80200cc8:	70a2                	ld	ra,40(sp)
+    80200cca:	7402                	ld	s0,32(sp)
+    80200ccc:	6145                	addi	sp,sp,48
+    80200cce:	8082                	ret
+
+0000000080200cd0 <strncmp>:
+
+int
+strncmp(const char *p, const char *q, uint n)
+{
+    80200cd0:	7179                	addi	sp,sp,-48
+    80200cd2:	f422                	sd	s0,40(sp)
+    80200cd4:	1800                	addi	s0,sp,48
+    80200cd6:	fea43423          	sd	a0,-24(s0)
+    80200cda:	feb43023          	sd	a1,-32(s0)
+    80200cde:	87b2                	mv	a5,a2
+    80200ce0:	fcf42e23          	sw	a5,-36(s0)
+  while(n > 0 && *p && *p == *q)
+    80200ce4:	a005                	j	80200d04 <strncmp+0x34>
+    n--, p++, q++;
+    80200ce6:	fdc42783          	lw	a5,-36(s0)
+    80200cea:	37fd                	addiw	a5,a5,-1
+    80200cec:	fcf42e23          	sw	a5,-36(s0)
+    80200cf0:	fe843783          	ld	a5,-24(s0)
+    80200cf4:	0785                	addi	a5,a5,1
+    80200cf6:	fef43423          	sd	a5,-24(s0)
+    80200cfa:	fe043783          	ld	a5,-32(s0)
+    80200cfe:	0785                	addi	a5,a5,1
+    80200d00:	fef43023          	sd	a5,-32(s0)
+  while(n > 0 && *p && *p == *q)
+    80200d04:	fdc42783          	lw	a5,-36(s0)
+    80200d08:	2781                	sext.w	a5,a5
+    80200d0a:	c385                	beqz	a5,80200d2a <strncmp+0x5a>
+    80200d0c:	fe843783          	ld	a5,-24(s0)
+    80200d10:	0007c783          	lbu	a5,0(a5)
+    80200d14:	cb99                	beqz	a5,80200d2a <strncmp+0x5a>
+    80200d16:	fe843783          	ld	a5,-24(s0)
+    80200d1a:	0007c703          	lbu	a4,0(a5)
+    80200d1e:	fe043783          	ld	a5,-32(s0)
+    80200d22:	0007c783          	lbu	a5,0(a5)
+    80200d26:	fcf700e3          	beq	a4,a5,80200ce6 <strncmp+0x16>
+  if(n == 0)
+    80200d2a:	fdc42783          	lw	a5,-36(s0)
+    80200d2e:	2781                	sext.w	a5,a5
+    80200d30:	e399                	bnez	a5,80200d36 <strncmp+0x66>
+    return 0;
+    80200d32:	4781                	li	a5,0
+    80200d34:	a839                	j	80200d52 <strncmp+0x82>
+  return (uchar)*p - (uchar)*q;
+    80200d36:	fe843783          	ld	a5,-24(s0)
+    80200d3a:	0007c783          	lbu	a5,0(a5)
+    80200d3e:	0007871b          	sext.w	a4,a5
+    80200d42:	fe043783          	ld	a5,-32(s0)
+    80200d46:	0007c783          	lbu	a5,0(a5)
+    80200d4a:	2781                	sext.w	a5,a5
+    80200d4c:	40f707bb          	subw	a5,a4,a5
+    80200d50:	2781                	sext.w	a5,a5
+}
+    80200d52:	853e                	mv	a0,a5
+    80200d54:	7422                	ld	s0,40(sp)
+    80200d56:	6145                	addi	sp,sp,48
+    80200d58:	8082                	ret
+
+0000000080200d5a <strncpy>:
+
+char*
+strncpy(char *s, const char *t, int n)
+{
+    80200d5a:	7139                	addi	sp,sp,-64
+    80200d5c:	fc22                	sd	s0,56(sp)
+    80200d5e:	0080                	addi	s0,sp,64
+    80200d60:	fca43c23          	sd	a0,-40(s0)
+    80200d64:	fcb43823          	sd	a1,-48(s0)
+    80200d68:	87b2                	mv	a5,a2
+    80200d6a:	fcf42623          	sw	a5,-52(s0)
+  char *os;
+
+  os = s;
+    80200d6e:	fd843783          	ld	a5,-40(s0)
+    80200d72:	fef43423          	sd	a5,-24(s0)
+  while(n-- > 0 && (*s++ = *t++) != 0)
+    80200d76:	0001                	nop
+    80200d78:	fcc42783          	lw	a5,-52(s0)
+    80200d7c:	fff7871b          	addiw	a4,a5,-1
+    80200d80:	fce42623          	sw	a4,-52(s0)
+    80200d84:	02f05e63          	blez	a5,80200dc0 <strncpy+0x66>
+    80200d88:	fd043703          	ld	a4,-48(s0)
+    80200d8c:	00170793          	addi	a5,a4,1
+    80200d90:	fcf43823          	sd	a5,-48(s0)
+    80200d94:	fd843783          	ld	a5,-40(s0)
+    80200d98:	00178693          	addi	a3,a5,1
+    80200d9c:	fcd43c23          	sd	a3,-40(s0)
+    80200da0:	00074703          	lbu	a4,0(a4)
+    80200da4:	00e78023          	sb	a4,0(a5)
+    80200da8:	0007c783          	lbu	a5,0(a5)
+    80200dac:	f7f1                	bnez	a5,80200d78 <strncpy+0x1e>
+    ;
+  while(n-- > 0)
+    80200dae:	a809                	j	80200dc0 <strncpy+0x66>
+    *s++ = 0;
+    80200db0:	fd843783          	ld	a5,-40(s0)
+    80200db4:	00178713          	addi	a4,a5,1
+    80200db8:	fce43c23          	sd	a4,-40(s0)
+    80200dbc:	00078023          	sb	zero,0(a5)
+  while(n-- > 0)
+    80200dc0:	fcc42783          	lw	a5,-52(s0)
+    80200dc4:	fff7871b          	addiw	a4,a5,-1
+    80200dc8:	fce42623          	sw	a4,-52(s0)
+    80200dcc:	fef042e3          	bgtz	a5,80200db0 <strncpy+0x56>
+  return os;
+    80200dd0:	fe843783          	ld	a5,-24(s0)
+}
+    80200dd4:	853e                	mv	a0,a5
+    80200dd6:	7462                	ld	s0,56(sp)
+    80200dd8:	6121                	addi	sp,sp,64
+    80200dda:	8082                	ret
+
+0000000080200ddc <safestrcpy>:
+
+// Like strncpy but guaranteed to NUL-terminate.
+char*
+safestrcpy(char *s, const char *t, int n)
+{
+    80200ddc:	7139                	addi	sp,sp,-64
+    80200dde:	fc22                	sd	s0,56(sp)
+    80200de0:	0080                	addi	s0,sp,64
+    80200de2:	fca43c23          	sd	a0,-40(s0)
+    80200de6:	fcb43823          	sd	a1,-48(s0)
+    80200dea:	87b2                	mv	a5,a2
+    80200dec:	fcf42623          	sw	a5,-52(s0)
+  char *os;
+
+  os = s;
+    80200df0:	fd843783          	ld	a5,-40(s0)
+    80200df4:	fef43423          	sd	a5,-24(s0)
+  if(n <= 0)
+    80200df8:	fcc42783          	lw	a5,-52(s0)
+    80200dfc:	2781                	sext.w	a5,a5
+    80200dfe:	00f04563          	bgtz	a5,80200e08 <safestrcpy+0x2c>
+    return os;
+    80200e02:	fe843783          	ld	a5,-24(s0)
+    80200e06:	a0a1                	j	80200e4e <safestrcpy+0x72>
+  while(--n > 0 && (*s++ = *t++) != 0)
+    80200e08:	fcc42783          	lw	a5,-52(s0)
+    80200e0c:	37fd                	addiw	a5,a5,-1
+    80200e0e:	fcf42623          	sw	a5,-52(s0)
+    80200e12:	fcc42783          	lw	a5,-52(s0)
+    80200e16:	2781                	sext.w	a5,a5
+    80200e18:	02f05563          	blez	a5,80200e42 <safestrcpy+0x66>
+    80200e1c:	fd043703          	ld	a4,-48(s0)
+    80200e20:	00170793          	addi	a5,a4,1
+    80200e24:	fcf43823          	sd	a5,-48(s0)
+    80200e28:	fd843783          	ld	a5,-40(s0)
+    80200e2c:	00178693          	addi	a3,a5,1
+    80200e30:	fcd43c23          	sd	a3,-40(s0)
+    80200e34:	00074703          	lbu	a4,0(a4)
+    80200e38:	00e78023          	sb	a4,0(a5)
+    80200e3c:	0007c783          	lbu	a5,0(a5)
+    80200e40:	f7e1                	bnez	a5,80200e08 <safestrcpy+0x2c>
+    ;
+  *s = 0;
+    80200e42:	fd843783          	ld	a5,-40(s0)
+    80200e46:	00078023          	sb	zero,0(a5)
+  return os;
+    80200e4a:	fe843783          	ld	a5,-24(s0)
+}
+    80200e4e:	853e                	mv	a0,a5
+    80200e50:	7462                	ld	s0,56(sp)
+    80200e52:	6121                	addi	sp,sp,64
+    80200e54:	8082                	ret
+
+0000000080200e56 <strlen>:
+
+int
+strlen(const char *s)
+{
+    80200e56:	7179                	addi	sp,sp,-48
+    80200e58:	f422                	sd	s0,40(sp)
+    80200e5a:	1800                	addi	s0,sp,48
+    80200e5c:	fca43c23          	sd	a0,-40(s0)
+  int n;
+
+  for(n = 0; s[n]; n++)
+    80200e60:	fe042623          	sw	zero,-20(s0)
+    80200e64:	a031                	j	80200e70 <strlen+0x1a>
+    80200e66:	fec42783          	lw	a5,-20(s0)
+    80200e6a:	2785                	addiw	a5,a5,1
+    80200e6c:	fef42623          	sw	a5,-20(s0)
+    80200e70:	fec42783          	lw	a5,-20(s0)
+    80200e74:	fd843703          	ld	a4,-40(s0)
+    80200e78:	97ba                	add	a5,a5,a4
+    80200e7a:	0007c783          	lbu	a5,0(a5)
+    80200e7e:	f7e5                	bnez	a5,80200e66 <strlen+0x10>
+    ;
+  return n;
+    80200e80:	fec42783          	lw	a5,-20(s0)
+}
+    80200e84:	853e                	mv	a0,a5
+    80200e86:	7422                	ld	s0,40(sp)
+    80200e88:	6145                	addi	sp,sp,48
+    80200e8a:	8082                	ret
+
+0000000080200e8c <wnstr>:
+
+// convert uchar string into wide char string 
+void wnstr(wchar *dst, char const *src, int len) {
+    80200e8c:	7179                	addi	sp,sp,-48
+    80200e8e:	f422                	sd	s0,40(sp)
+    80200e90:	1800                	addi	s0,sp,48
+    80200e92:	fea43423          	sd	a0,-24(s0)
+    80200e96:	feb43023          	sd	a1,-32(s0)
+    80200e9a:	87b2                	mv	a5,a2
+    80200e9c:	fcf42e23          	sw	a5,-36(s0)
+  while (len -- && *src) {
+    80200ea0:	a015                	j	80200ec4 <wnstr+0x38>
+    *(uchar*)dst = *src++;
+    80200ea2:	fe043783          	ld	a5,-32(s0)
+    80200ea6:	00178713          	addi	a4,a5,1
+    80200eaa:	fee43023          	sd	a4,-32(s0)
+    80200eae:	0007c703          	lbu	a4,0(a5)
+    80200eb2:	fe843783          	ld	a5,-24(s0)
+    80200eb6:	00e78023          	sb	a4,0(a5)
+    dst ++;
+    80200eba:	fe843783          	ld	a5,-24(s0)
+    80200ebe:	0789                	addi	a5,a5,2
+    80200ec0:	fef43423          	sd	a5,-24(s0)
+  while (len -- && *src) {
+    80200ec4:	fdc42783          	lw	a5,-36(s0)
+    80200ec8:	fff7871b          	addiw	a4,a5,-1
+    80200ecc:	fce42e23          	sw	a4,-36(s0)
+    80200ed0:	c791                	beqz	a5,80200edc <wnstr+0x50>
+    80200ed2:	fe043783          	ld	a5,-32(s0)
+    80200ed6:	0007c783          	lbu	a5,0(a5)
+    80200eda:	f7e1                	bnez	a5,80200ea2 <wnstr+0x16>
+  }
+
+  *dst = 0;
+    80200edc:	fe843783          	ld	a5,-24(s0)
+    80200ee0:	00079023          	sh	zero,0(a5)
+}
+    80200ee4:	0001                	nop
+    80200ee6:	7422                	ld	s0,40(sp)
+    80200ee8:	6145                	addi	sp,sp,48
+    80200eea:	8082                	ret
+
+0000000080200eec <snstr>:
+
+// convert wide char string into uchar string 
+void snstr(char *dst, wchar const *src, int len) {
+    80200eec:	7179                	addi	sp,sp,-48
+    80200eee:	f422                	sd	s0,40(sp)
+    80200ef0:	1800                	addi	s0,sp,48
+    80200ef2:	fea43423          	sd	a0,-24(s0)
+    80200ef6:	feb43023          	sd	a1,-32(s0)
+    80200efa:	87b2                	mv	a5,a2
+    80200efc:	fcf42e23          	sw	a5,-36(s0)
+  while (len -- && *src) {
+    80200f00:	a025                	j	80200f28 <snstr+0x3c>
+    *dst++ = (uchar)(*src & 0xff);
+    80200f02:	fe043783          	ld	a5,-32(s0)
+    80200f06:	0007d683          	lhu	a3,0(a5)
+    80200f0a:	fe843783          	ld	a5,-24(s0)
+    80200f0e:	00178713          	addi	a4,a5,1
+    80200f12:	fee43423          	sd	a4,-24(s0)
+    80200f16:	0ff6f713          	andi	a4,a3,255
+    80200f1a:	00e78023          	sb	a4,0(a5)
+    src ++;
+    80200f1e:	fe043783          	ld	a5,-32(s0)
+    80200f22:	0789                	addi	a5,a5,2
+    80200f24:	fef43023          	sd	a5,-32(s0)
+  while (len -- && *src) {
+    80200f28:	fdc42783          	lw	a5,-36(s0)
+    80200f2c:	fff7871b          	addiw	a4,a5,-1
+    80200f30:	fce42e23          	sw	a4,-36(s0)
+    80200f34:	cf99                	beqz	a5,80200f52 <snstr+0x66>
+    80200f36:	fe043783          	ld	a5,-32(s0)
+    80200f3a:	0007d783          	lhu	a5,0(a5)
+    80200f3e:	f3f1                	bnez	a5,80200f02 <snstr+0x16>
+  }
+  while(len-- > 0)
+    80200f40:	a809                	j	80200f52 <snstr+0x66>
+    *dst++ = 0;
+    80200f42:	fe843783          	ld	a5,-24(s0)
+    80200f46:	00178713          	addi	a4,a5,1
+    80200f4a:	fee43423          	sd	a4,-24(s0)
+    80200f4e:	00078023          	sb	zero,0(a5)
+  while(len-- > 0)
+    80200f52:	fdc42783          	lw	a5,-36(s0)
+    80200f56:	fff7871b          	addiw	a4,a5,-1
+    80200f5a:	fce42e23          	sw	a4,-36(s0)
+    80200f5e:	fef042e3          	bgtz	a5,80200f42 <snstr+0x56>
+}
+    80200f62:	0001                	nop
+    80200f64:	0001                	nop
+    80200f66:	7422                	ld	s0,40(sp)
+    80200f68:	6145                	addi	sp,sp,48
+    80200f6a:	8082                	ret
+
+0000000080200f6c <wcsncmp>:
+
+int wcsncmp(wchar const *s1, wchar const *s2, int len) {
+    80200f6c:	7139                	addi	sp,sp,-64
+    80200f6e:	fc22                	sd	s0,56(sp)
+    80200f70:	0080                	addi	s0,sp,64
+    80200f72:	fca43c23          	sd	a0,-40(s0)
+    80200f76:	fcb43823          	sd	a1,-48(s0)
+    80200f7a:	87b2                	mv	a5,a2
+    80200f7c:	fcf42623          	sw	a5,-52(s0)
+  int ret = 0;
+    80200f80:	fe042623          	sw	zero,-20(s0)
+
+  while (len-- && *s1) {
+    80200f84:	a825                	j	80200fbc <wcsncmp+0x50>
+    ret = (int)(*s1++ - *s2++);
+    80200f86:	fd843783          	ld	a5,-40(s0)
+    80200f8a:	00278713          	addi	a4,a5,2
+    80200f8e:	fce43c23          	sd	a4,-40(s0)
+    80200f92:	0007d783          	lhu	a5,0(a5)
+    80200f96:	0007871b          	sext.w	a4,a5
+    80200f9a:	fd043783          	ld	a5,-48(s0)
+    80200f9e:	00278693          	addi	a3,a5,2
+    80200fa2:	fcd43823          	sd	a3,-48(s0)
+    80200fa6:	0007d783          	lhu	a5,0(a5)
+    80200faa:	2781                	sext.w	a5,a5
+    80200fac:	40f707bb          	subw	a5,a4,a5
+    80200fb0:	fef42623          	sw	a5,-20(s0)
+    if (ret) break;
+    80200fb4:	fec42783          	lw	a5,-20(s0)
+    80200fb8:	2781                	sext.w	a5,a5
+    80200fba:	ef91                	bnez	a5,80200fd6 <wcsncmp+0x6a>
+  while (len-- && *s1) {
+    80200fbc:	fcc42783          	lw	a5,-52(s0)
+    80200fc0:	fff7871b          	addiw	a4,a5,-1
+    80200fc4:	fce42623          	sw	a4,-52(s0)
+    80200fc8:	cb81                	beqz	a5,80200fd8 <wcsncmp+0x6c>
+    80200fca:	fd843783          	ld	a5,-40(s0)
+    80200fce:	0007d783          	lhu	a5,0(a5)
+    80200fd2:	fbd5                	bnez	a5,80200f86 <wcsncmp+0x1a>
+    80200fd4:	a011                	j	80200fd8 <wcsncmp+0x6c>
+    if (ret) break;
+    80200fd6:	0001                	nop
+  }
+
+  return ret;
+    80200fd8:	fec42783          	lw	a5,-20(s0)
+}
+    80200fdc:	853e                	mv	a0,a5
+    80200fde:	7462                	ld	s0,56(sp)
+    80200fe0:	6121                	addi	sp,sp,64
+    80200fe2:	8082                	ret
+
+0000000080200fe4 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+    80200fe4:	1101                	addi	sp,sp,-32
+    80200fe6:	ec22                	sd	s0,24(sp)
+    80200fe8:	1000                	addi	s0,sp,32
+    80200fea:	fea43423          	sd	a0,-24(s0)
+    80200fee:	87ae                	mv	a5,a1
+    80200ff0:	fef403a3          	sb	a5,-25(s0)
+  for(; *s; s++)
+    80200ff4:	a01d                	j	8020101a <strchr+0x36>
+    if(*s == c)
+    80200ff6:	fe843783          	ld	a5,-24(s0)
+    80200ffa:	0007c703          	lbu	a4,0(a5)
+    80200ffe:	fe744783          	lbu	a5,-25(s0)
+    80201002:	0ff7f793          	andi	a5,a5,255
+    80201006:	00e79563          	bne	a5,a4,80201010 <strchr+0x2c>
+      return (char*)s;
+    8020100a:	fe843783          	ld	a5,-24(s0)
+    8020100e:	a821                	j	80201026 <strchr+0x42>
+  for(; *s; s++)
+    80201010:	fe843783          	ld	a5,-24(s0)
+    80201014:	0785                	addi	a5,a5,1
+    80201016:	fef43423          	sd	a5,-24(s0)
+    8020101a:	fe843783          	ld	a5,-24(s0)
+    8020101e:	0007c783          	lbu	a5,0(a5)
+    80201022:	fbf1                	bnez	a5,80200ff6 <strchr+0x12>
+  return 0;
+    80201024:	4781                	li	a5,0
+    80201026:	853e                	mv	a0,a5
+    80201028:	6462                	ld	s0,24(sp)
+    8020102a:	6105                	addi	sp,sp,32
+    8020102c:	8082                	ret
+
+000000008020102e <sbi_hart_start>:
+#define SBI_CALL_2(eid, fid, arg0, arg1) SBI_CALL(eid, fid, arg0, arg1, 0, 0)
+#define SBI_CALL_3(eid, fid, arg0, arg1, arg2) SBI_CALL(eid, fid, arg0, arg1, arg2, 0)
+#define SBI_CALL_4(eid, fid, arg0, arg1, arg2, arg3) SBI_CALL(eif, fid, arg0, arg1, arg2, arg3)
+
+static inline void sbi_hart_start(unsigned long hartid, unsigned long start_addr, unsigned long opaque)
+{
+    8020102e:	7179                	addi	sp,sp,-48
+    80201030:	f422                	sd	s0,40(sp)
+    80201032:	1800                	addi	s0,sp,48
+    80201034:	fea43423          	sd	a0,-24(s0)
+    80201038:	feb43023          	sd	a1,-32(s0)
+    8020103c:	fcc43c23          	sd	a2,-40(s0)
+	SBI_CALL_3(SBI_HSM_EXTION, SBI_HART_START, hartid, start_addr, opaque);
+    80201040:	fe843503          	ld	a0,-24(s0)
+    80201044:	fe043583          	ld	a1,-32(s0)
+    80201048:	fd843603          	ld	a2,-40(s0)
+    8020104c:	4681                	li	a3,0
+    8020104e:	004857b7          	lui	a5,0x485
+    80201052:	34d78893          	addi	a7,a5,845 # 48534d <_entry-0x7fd7acb3>
+    80201056:	4801                	li	a6,0
+    80201058:	00000073          	ecall
+}
+    8020105c:	0001                	nop
+    8020105e:	7422                	ld	s0,40(sp)
+    80201060:	6145                	addi	sp,sp,48
+    80201062:	8082                	ret
+
+0000000080201064 <inithartid>:
+#include "include/sdcard.h"
+#include "include/fpioa.h"
+#include "include/dmac.h"
+#endif
+
+static inline void inithartid(unsigned long hartid) {
+    80201064:	1101                	addi	sp,sp,-32
+    80201066:	ec22                	sd	s0,24(sp)
+    80201068:	1000                	addi	s0,sp,32
+    8020106a:	fea43423          	sd	a0,-24(s0)
+  asm volatile("mv tp, %0" : : "r" (hartid & 0x1));
+    8020106e:	fe843783          	ld	a5,-24(s0)
+    80201072:	8b85                	andi	a5,a5,1
+    80201074:	823e                	mv	tp,a5
+}
+    80201076:	0001                	nop
+    80201078:	6462                	ld	s0,24(sp)
+    8020107a:	6105                	addi	sp,sp,32
+    8020107c:	8082                	ret
+
+000000008020107e <main>:
+
+extern void _entry(void);
+
+void
+main(unsigned long hartid, unsigned long dtb_pa)
+{
+    8020107e:	7179                	addi	sp,sp,-48
+    80201080:	f406                	sd	ra,40(sp)
+    80201082:	f022                	sd	s0,32(sp)
+    80201084:	1800                	addi	s0,sp,48
+    80201086:	fca43c23          	sd	a0,-40(s0)
+    8020108a:	fcb43823          	sd	a1,-48(s0)
+  inithartid(hartid);
+    8020108e:	fd843503          	ld	a0,-40(s0)
+    80201092:	00000097          	auipc	ra,0x0
+    80201096:	fd2080e7          	jalr	-46(ra) # 80201064 <inithartid>
+  
+  if (hartid == 0) {
+    8020109a:	fd843783          	ld	a5,-40(s0)
+    8020109e:	e7ed                	bnez	a5,80201188 <main+0x10a>
+    consoleinit();
+    802010a0:	0000a097          	auipc	ra,0xa
+    802010a4:	c5e080e7          	jalr	-930(ra) # 8020acfe <consoleinit>
+    printfinit();   // init a lock for printf 
+    802010a8:	fffff097          	auipc	ra,0xfffff
+    802010ac:	46c080e7          	jalr	1132(ra) # 80200514 <printfinit>
+    print_logo();
+    802010b0:	fffff097          	auipc	ra,0xfffff
+    802010b4:	49a080e7          	jalr	1178(ra) # 8020054a <print_logo>
+    #ifdef DEBUG
+    printf("hart %d enter main()...\n", hartid);
+    802010b8:	fd843583          	ld	a1,-40(s0)
+    802010bc:	0000c517          	auipc	a0,0xc
+    802010c0:	33c50513          	addi	a0,a0,828 # 8020d3f8 <etext+0x3f8>
+    802010c4:	fffff097          	auipc	ra,0xfffff
+    802010c8:	12a080e7          	jalr	298(ra) # 802001ee <printf>
+    #endif
+    kinit();         // physical page allocator
+    802010cc:	fffff097          	auipc	ra,0xfffff
+    802010d0:	520080e7          	jalr	1312(ra) # 802005ec <kinit>
+    kvminit();       // create kernel page table
+    802010d4:	00000097          	auipc	ra,0x0
+    802010d8:	14e080e7          	jalr	334(ra) # 80201222 <kvminit>
+    kvminithart();   // turn on paging
+    802010dc:	00000097          	auipc	ra,0x0
+    802010e0:	288080e7          	jalr	648(ra) # 80201364 <kvminithart>
+    timerinit();     // init a lock for timer
+    802010e4:	00007097          	auipc	ra,0x7
+    802010e8:	a68080e7          	jalr	-1432(ra) # 80207b4c <timerinit>
+    trapinithart();  // install kernel trap vector, including interrupt handler
+    802010ec:	00003097          	auipc	ra,0x3
+    802010f0:	d02080e7          	jalr	-766(ra) # 80203dee <trapinithart>
+    procinit();
+    802010f4:	00001097          	auipc	ra,0x1
+    802010f8:	780080e7          	jalr	1920(ra) # 80202874 <procinit>
+    plicinit();
+    802010fc:	00009097          	auipc	ra,0x9
+    80201100:	59e080e7          	jalr	1438(ra) # 8020a69a <plicinit>
+    plicinithart();
+    80201104:	00009097          	auipc	ra,0x9
+    80201108:	5d2080e7          	jalr	1490(ra) # 8020a6d6 <plicinithart>
+    #ifndef QEMU
+    fpioa_pin_init();
+    dmac_init();
+    #endif 
+    disk_init();
+    8020110c:	00007097          	auipc	ra,0x7
+    80201110:	c90080e7          	jalr	-880(ra) # 80207d9c <disk_init>
+    binit();         // buffer cache
+    80201114:	00004097          	auipc	ra,0x4
+    80201118:	f5e080e7          	jalr	-162(ra) # 80205072 <binit>
+    fileinit();      // file table
+    8020111c:	00004097          	auipc	ra,0x4
+    80201120:	542080e7          	jalr	1346(ra) # 8020565e <fileinit>
+    userinit();      // first user process
+    80201124:	00002097          	auipc	ra,0x2
+    80201128:	c30080e7          	jalr	-976(ra) # 80202d54 <userinit>
+    printf("hart 0 init done\n");
+    8020112c:	0000c517          	auipc	a0,0xc
+    80201130:	2ec50513          	addi	a0,a0,748 # 8020d418 <etext+0x418>
+    80201134:	fffff097          	auipc	ra,0xfffff
+    80201138:	0ba080e7          	jalr	186(ra) # 802001ee <printf>
+    
+    for(int i = 1; i < NCPU; i++) {
+    8020113c:	4785                	li	a5,1
+    8020113e:	fef42623          	sw	a5,-20(s0)
+    80201142:	a01d                	j	80201168 <main+0xea>
+      // unsigned long mask = 1 << i;
+      // sbi_send_ipi(&mask);
+      sbi_hart_start(i, (unsigned long)_entry, 0);
+    80201144:	fec42783          	lw	a5,-20(s0)
+    80201148:	0000f717          	auipc	a4,0xf
+    8020114c:	38873703          	ld	a4,904(a4) # 802104d0 <_GLOBAL_OFFSET_TABLE_+0x48>
+    80201150:	4601                	li	a2,0
+    80201152:	85ba                	mv	a1,a4
+    80201154:	853e                	mv	a0,a5
+    80201156:	00000097          	auipc	ra,0x0
+    8020115a:	ed8080e7          	jalr	-296(ra) # 8020102e <sbi_hart_start>
+    for(int i = 1; i < NCPU; i++) {
+    8020115e:	fec42783          	lw	a5,-20(s0)
+    80201162:	2785                	addiw	a5,a5,1
+    80201164:	fef42623          	sw	a5,-20(s0)
+    80201168:	fec42783          	lw	a5,-20(s0)
+    8020116c:	0007871b          	sext.w	a4,a5
+    80201170:	4785                	li	a5,1
+    80201172:	fce7d9e3          	bge	a5,a4,80201144 <main+0xc6>
+    }
+    __sync_synchronize();
+    80201176:	0ff0000f          	fence
+    started = 1;
+    8020117a:	00018797          	auipc	a5,0x18
+    8020117e:	ed678793          	addi	a5,a5,-298 # 80219050 <started>
+    80201182:	4705                	li	a4,1
+    80201184:	c398                	sw	a4,0(a5)
+    80201186:	a0a5                	j	802011ee <main+0x170>
+  }
+  else
+  {
+    // hart 1
+    sbi_hart_start(0, (unsigned long)_entry, 0);
+    80201188:	0000f797          	auipc	a5,0xf
+    8020118c:	3487b783          	ld	a5,840(a5) # 802104d0 <_GLOBAL_OFFSET_TABLE_+0x48>
+    80201190:	4601                	li	a2,0
+    80201192:	85be                	mv	a1,a5
+    80201194:	4501                	li	a0,0
+    80201196:	00000097          	auipc	ra,0x0
+    8020119a:	e98080e7          	jalr	-360(ra) # 8020102e <sbi_hart_start>
+    while (started == 0)
+    8020119e:	0001                	nop
+    802011a0:	00018797          	auipc	a5,0x18
+    802011a4:	eb078793          	addi	a5,a5,-336 # 80219050 <started>
+    802011a8:	439c                	lw	a5,0(a5)
+    802011aa:	2781                	sext.w	a5,a5
+    802011ac:	dbf5                	beqz	a5,802011a0 <main+0x122>
+      ;
+    __sync_synchronize();
+    802011ae:	0ff0000f          	fence
+    #ifdef DEBUG
+    printf("hart %d enter main()...\n", hartid);
+    802011b2:	fd843583          	ld	a1,-40(s0)
+    802011b6:	0000c517          	auipc	a0,0xc
+    802011ba:	24250513          	addi	a0,a0,578 # 8020d3f8 <etext+0x3f8>
+    802011be:	fffff097          	auipc	ra,0xfffff
+    802011c2:	030080e7          	jalr	48(ra) # 802001ee <printf>
+    #endif
+    kvminithart();
+    802011c6:	00000097          	auipc	ra,0x0
+    802011ca:	19e080e7          	jalr	414(ra) # 80201364 <kvminithart>
+    trapinithart();
+    802011ce:	00003097          	auipc	ra,0x3
+    802011d2:	c20080e7          	jalr	-992(ra) # 80203dee <trapinithart>
+    plicinithart();  // ask PLIC for device interrupts
+    802011d6:	00009097          	auipc	ra,0x9
+    802011da:	500080e7          	jalr	1280(ra) # 8020a6d6 <plicinithart>
+    printf("hart 1 init done\n");
+    802011de:	0000c517          	auipc	a0,0xc
+    802011e2:	25250513          	addi	a0,a0,594 # 8020d430 <etext+0x430>
+    802011e6:	fffff097          	auipc	ra,0xfffff
+    802011ea:	008080e7          	jalr	8(ra) # 802001ee <printf>
+  }
+  scheduler();
+    802011ee:	00002097          	auipc	ra,0x2
+    802011f2:	31a080e7          	jalr	794(ra) # 80203508 <scheduler>
+
+00000000802011f6 <w_satp>:
+{
+    802011f6:	1101                	addi	sp,sp,-32
+    802011f8:	ec22                	sd	s0,24(sp)
+    802011fa:	1000                	addi	s0,sp,32
+    802011fc:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw satp, %0" : : "r" (x));
+    80201200:	fe843783          	ld	a5,-24(s0)
+    80201204:	18079073          	csrw	satp,a5
+}
+    80201208:	0001                	nop
+    8020120a:	6462                	ld	s0,24(sp)
+    8020120c:	6105                	addi	sp,sp,32
+    8020120e:	8082                	ret
+
+0000000080201210 <sfence_vma>:
+
+// flush the TLB.
+static inline void
+sfence_vma()
+{
+    80201210:	1141                	addi	sp,sp,-16
+    80201212:	e422                	sd	s0,8(sp)
+    80201214:	0800                	addi	s0,sp,16
+  // the zero, zero means flush all TLB entries.
+  // asm volatile("sfence.vma zero, zero");
+  asm volatile("sfence.vma");
+    80201216:	12000073          	sfence.vma
+}
+    8020121a:	0001                	nop
+    8020121c:	6422                	ld	s0,8(sp)
+    8020121e:	0141                	addi	sp,sp,16
+    80201220:	8082                	ret
+
+0000000080201222 <kvminit>:
+/*
+ * create a direct-map page table for the kernel.
+ */
+void
+kvminit()
+{
+    80201222:	1141                	addi	sp,sp,-16
+    80201224:	e406                	sd	ra,8(sp)
+    80201226:	e022                	sd	s0,0(sp)
+    80201228:	0800                	addi	s0,sp,16
+  kernel_pagetable = (pagetable_t) kalloc();
+    8020122a:	fffff097          	auipc	ra,0xfffff
+    8020122e:	562080e7          	jalr	1378(ra) # 8020078c <kalloc>
+    80201232:	872a                	mv	a4,a0
+    80201234:	00018797          	auipc	a5,0x18
+    80201238:	e2478793          	addi	a5,a5,-476 # 80219058 <kernel_pagetable>
+    8020123c:	e398                	sd	a4,0(a5)
+  // printf("kernel_pagetable: %p\n", kernel_pagetable);
+
+  memset(kernel_pagetable, 0, PGSIZE);
+    8020123e:	00018797          	auipc	a5,0x18
+    80201242:	e1a78793          	addi	a5,a5,-486 # 80219058 <kernel_pagetable>
+    80201246:	639c                	ld	a5,0(a5)
+    80201248:	6605                	lui	a2,0x1
+    8020124a:	4581                	li	a1,0
+    8020124c:	853e                	mv	a0,a5
+    8020124e:	00000097          	auipc	ra,0x0
+    80201252:	898080e7          	jalr	-1896(ra) # 80200ae6 <memset>
+
+  // uart registers
+  kvmmap(UART_V, UART, PGSIZE, PTE_R | PTE_W);
+    80201256:	4699                	li	a3,6
+    80201258:	6605                	lui	a2,0x1
+    8020125a:	100005b7          	lui	a1,0x10000
+    8020125e:	3f100793          	li	a5,1009
+    80201262:	01c79513          	slli	a0,a5,0x1c
+    80201266:	00000097          	auipc	ra,0x0
+    8020126a:	2ae080e7          	jalr	686(ra) # 80201514 <kvmmap>
+  
+  #ifdef QEMU
+  // virtio mmio disk interface
+  kvmmap(VIRTIO0_V, VIRTIO0, PGSIZE, PTE_R | PTE_W);
+    8020126e:	4699                	li	a3,6
+    80201270:	6605                	lui	a2,0x1
+    80201272:	100015b7          	lui	a1,0x10001
+    80201276:	03f107b7          	lui	a5,0x3f10
+    8020127a:	0785                	addi	a5,a5,1
+    8020127c:	00c79513          	slli	a0,a5,0xc
+    80201280:	00000097          	auipc	ra,0x0
+    80201284:	294080e7          	jalr	660(ra) # 80201514 <kvmmap>
+  #endif
+  // CLINT
+  kvmmap(CLINT_V, CLINT, 0x10000, PTE_R | PTE_W);
+    80201288:	4699                	li	a3,6
+    8020128a:	6641                	lui	a2,0x10
+    8020128c:	020005b7          	lui	a1,0x2000
+    80201290:	01f817b7          	lui	a5,0x1f81
+    80201294:	00d79513          	slli	a0,a5,0xd
+    80201298:	00000097          	auipc	ra,0x0
+    8020129c:	27c080e7          	jalr	636(ra) # 80201514 <kvmmap>
+
+  // PLIC
+  kvmmap(PLIC_V, PLIC, 0x4000, PTE_R | PTE_W);
+    802012a0:	4699                	li	a3,6
+    802012a2:	6611                	lui	a2,0x4
+    802012a4:	0c0005b7          	lui	a1,0xc000
+    802012a8:	00fc37b7          	lui	a5,0xfc3
+    802012ac:	00e79513          	slli	a0,a5,0xe
+    802012b0:	00000097          	auipc	ra,0x0
+    802012b4:	264080e7          	jalr	612(ra) # 80201514 <kvmmap>
+  kvmmap(PLIC_V + 0x200000, PLIC + 0x200000, 0x4000, PTE_R | PTE_W);
+    802012b8:	4699                	li	a3,6
+    802012ba:	6611                	lui	a2,0x4
+    802012bc:	0c2005b7          	lui	a1,0xc200
+    802012c0:	1f8617b7          	lui	a5,0x1f861
+    802012c4:	00979513          	slli	a0,a5,0x9
+    802012c8:	00000097          	auipc	ra,0x0
+    802012cc:	24c080e7          	jalr	588(ra) # 80201514 <kvmmap>
+  #endif
+  
+  // map rustsbi
+  // kvmmap(RUSTSBI_BASE, RUSTSBI_BASE, KERNBASE - RUSTSBI_BASE, PTE_R | PTE_X);
+  // map kernel text executable and read-only.
+  kvmmap(KERNBASE, KERNBASE, (uint64)etext - KERNBASE, PTE_R | PTE_X);
+    802012d0:	0000f717          	auipc	a4,0xf
+    802012d4:	1e873703          	ld	a4,488(a4) # 802104b8 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802012d8:	bff00793          	li	a5,-1025
+    802012dc:	07d6                	slli	a5,a5,0x15
+    802012de:	97ba                	add	a5,a5,a4
+    802012e0:	46a9                	li	a3,10
+    802012e2:	863e                	mv	a2,a5
+    802012e4:	40100793          	li	a5,1025
+    802012e8:	01579593          	slli	a1,a5,0x15
+    802012ec:	40100793          	li	a5,1025
+    802012f0:	01579513          	slli	a0,a5,0x15
+    802012f4:	00000097          	auipc	ra,0x0
+    802012f8:	220080e7          	jalr	544(ra) # 80201514 <kvmmap>
+  // map kernel data and the physical RAM we'll make use of.
+  kvmmap((uint64)etext, (uint64)etext, PHYSTOP - (uint64)etext, PTE_R | PTE_W);
+    802012fc:	0000f517          	auipc	a0,0xf
+    80201300:	1bc53503          	ld	a0,444(a0) # 802104b8 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80201304:	0000f597          	auipc	a1,0xf
+    80201308:	1b45b583          	ld	a1,436(a1) # 802104b8 <_GLOBAL_OFFSET_TABLE_+0x30>
+    8020130c:	0000f797          	auipc	a5,0xf
+    80201310:	1ac7b783          	ld	a5,428(a5) # 802104b8 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80201314:	40300713          	li	a4,1027
+    80201318:	0756                	slli	a4,a4,0x15
+    8020131a:	40f707b3          	sub	a5,a4,a5
+    8020131e:	4699                	li	a3,6
+    80201320:	863e                	mv	a2,a5
+    80201322:	00000097          	auipc	ra,0x0
+    80201326:	1f2080e7          	jalr	498(ra) # 80201514 <kvmmap>
+  // map the trampoline for trap entry/exit to
+  // the highest virtual address in the kernel.
+  kvmmap(TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X);
+    8020132a:	0000f797          	auipc	a5,0xf
+    8020132e:	1667b783          	ld	a5,358(a5) # 80210490 <_GLOBAL_OFFSET_TABLE_+0x8>
+    80201332:	46a9                	li	a3,10
+    80201334:	6605                	lui	a2,0x1
+    80201336:	85be                	mv	a1,a5
+    80201338:	040007b7          	lui	a5,0x4000
+    8020133c:	17fd                	addi	a5,a5,-1
+    8020133e:	00c79513          	slli	a0,a5,0xc
+    80201342:	00000097          	auipc	ra,0x0
+    80201346:	1d2080e7          	jalr	466(ra) # 80201514 <kvmmap>
+
+  #ifdef DEBUG
+  printf("kvminit\n");
+    8020134a:	0000c517          	auipc	a0,0xc
+    8020134e:	0fe50513          	addi	a0,a0,254 # 8020d448 <etext+0x448>
+    80201352:	fffff097          	auipc	ra,0xfffff
+    80201356:	e9c080e7          	jalr	-356(ra) # 802001ee <printf>
+  #endif
+}
+    8020135a:	0001                	nop
+    8020135c:	60a2                	ld	ra,8(sp)
+    8020135e:	6402                	ld	s0,0(sp)
+    80201360:	0141                	addi	sp,sp,16
+    80201362:	8082                	ret
+
+0000000080201364 <kvminithart>:
+
+// Switch h/w page table register to the kernel's page table,
+// and enable paging.
+void
+kvminithart()
+{
+    80201364:	1141                	addi	sp,sp,-16
+    80201366:	e406                	sd	ra,8(sp)
+    80201368:	e022                	sd	s0,0(sp)
+    8020136a:	0800                	addi	s0,sp,16
+  w_satp(MAKE_SATP(kernel_pagetable));
+    8020136c:	00018797          	auipc	a5,0x18
+    80201370:	cec78793          	addi	a5,a5,-788 # 80219058 <kernel_pagetable>
+    80201374:	639c                	ld	a5,0(a5)
+    80201376:	00c7d713          	srli	a4,a5,0xc
+    8020137a:	57fd                	li	a5,-1
+    8020137c:	17fe                	slli	a5,a5,0x3f
+    8020137e:	8fd9                	or	a5,a5,a4
+    80201380:	853e                	mv	a0,a5
+    80201382:	00000097          	auipc	ra,0x0
+    80201386:	e74080e7          	jalr	-396(ra) # 802011f6 <w_satp>
+  // reg_info();
+  sfence_vma();
+    8020138a:	00000097          	auipc	ra,0x0
+    8020138e:	e86080e7          	jalr	-378(ra) # 80201210 <sfence_vma>
+  #ifdef DEBUG
+  printf("kvminithart\n");
+    80201392:	0000c517          	auipc	a0,0xc
+    80201396:	0c650513          	addi	a0,a0,198 # 8020d458 <etext+0x458>
+    8020139a:	fffff097          	auipc	ra,0xfffff
+    8020139e:	e54080e7          	jalr	-428(ra) # 802001ee <printf>
+  #endif
+}
+    802013a2:	0001                	nop
+    802013a4:	60a2                	ld	ra,8(sp)
+    802013a6:	6402                	ld	s0,0(sp)
+    802013a8:	0141                	addi	sp,sp,16
+    802013aa:	8082                	ret
+
+00000000802013ac <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)
+{
+    802013ac:	7139                	addi	sp,sp,-64
+    802013ae:	fc06                	sd	ra,56(sp)
+    802013b0:	f822                	sd	s0,48(sp)
+    802013b2:	0080                	addi	s0,sp,64
+    802013b4:	fca43c23          	sd	a0,-40(s0)
+    802013b8:	fcb43823          	sd	a1,-48(s0)
+    802013bc:	87b2                	mv	a5,a2
+    802013be:	fcf42623          	sw	a5,-52(s0)
+  
+  if(va >= MAXVA)
+    802013c2:	fd043703          	ld	a4,-48(s0)
+    802013c6:	57fd                	li	a5,-1
+    802013c8:	83e9                	srli	a5,a5,0x1a
+    802013ca:	00e7fa63          	bgeu	a5,a4,802013de <walk+0x32>
+    panic("walk");
+    802013ce:	0000c517          	auipc	a0,0xc
+    802013d2:	09a50513          	addi	a0,a0,154 # 8020d468 <etext+0x468>
+    802013d6:	fffff097          	auipc	ra,0xfffff
+    802013da:	06e080e7          	jalr	110(ra) # 80200444 <panic>
+
+  for(int level = 2; level > 0; level--) {
+    802013de:	4789                	li	a5,2
+    802013e0:	fef42623          	sw	a5,-20(s0)
+    802013e4:	a849                	j	80201476 <walk+0xca>
+    pte_t *pte = &pagetable[PX(level, va)];
+    802013e6:	fec42703          	lw	a4,-20(s0)
+    802013ea:	87ba                	mv	a5,a4
+    802013ec:	0037979b          	slliw	a5,a5,0x3
+    802013f0:	9fb9                	addw	a5,a5,a4
+    802013f2:	2781                	sext.w	a5,a5
+    802013f4:	27b1                	addiw	a5,a5,12
+    802013f6:	2781                	sext.w	a5,a5
+    802013f8:	873e                	mv	a4,a5
+    802013fa:	fd043783          	ld	a5,-48(s0)
+    802013fe:	00e7d7b3          	srl	a5,a5,a4
+    80201402:	1ff7f793          	andi	a5,a5,511
+    80201406:	078e                	slli	a5,a5,0x3
+    80201408:	fd843703          	ld	a4,-40(s0)
+    8020140c:	97ba                	add	a5,a5,a4
+    8020140e:	fef43023          	sd	a5,-32(s0)
+    if(*pte & PTE_V) {
+    80201412:	fe043783          	ld	a5,-32(s0)
+    80201416:	639c                	ld	a5,0(a5)
+    80201418:	8b85                	andi	a5,a5,1
+    8020141a:	cb89                	beqz	a5,8020142c <walk+0x80>
+      pagetable = (pagetable_t)PTE2PA(*pte);
+    8020141c:	fe043783          	ld	a5,-32(s0)
+    80201420:	639c                	ld	a5,0(a5)
+    80201422:	83a9                	srli	a5,a5,0xa
+    80201424:	07b2                	slli	a5,a5,0xc
+    80201426:	fcf43c23          	sd	a5,-40(s0)
+    8020142a:	a089                	j	8020146c <walk+0xc0>
+    } else {
+      if(!alloc || (pagetable = (pde_t*)kalloc()) == NULL)
+    8020142c:	fcc42783          	lw	a5,-52(s0)
+    80201430:	2781                	sext.w	a5,a5
+    80201432:	cb91                	beqz	a5,80201446 <walk+0x9a>
+    80201434:	fffff097          	auipc	ra,0xfffff
+    80201438:	358080e7          	jalr	856(ra) # 8020078c <kalloc>
+    8020143c:	fca43c23          	sd	a0,-40(s0)
+    80201440:	fd843783          	ld	a5,-40(s0)
+    80201444:	e399                	bnez	a5,8020144a <walk+0x9e>
+        return NULL;
+    80201446:	4781                	li	a5,0
+    80201448:	a0a9                	j	80201492 <walk+0xe6>
+      memset(pagetable, 0, PGSIZE);
+    8020144a:	6605                	lui	a2,0x1
+    8020144c:	4581                	li	a1,0
+    8020144e:	fd843503          	ld	a0,-40(s0)
+    80201452:	fffff097          	auipc	ra,0xfffff
+    80201456:	694080e7          	jalr	1684(ra) # 80200ae6 <memset>
+      *pte = PA2PTE(pagetable) | PTE_V;
+    8020145a:	fd843783          	ld	a5,-40(s0)
+    8020145e:	83b1                	srli	a5,a5,0xc
+    80201460:	07aa                	slli	a5,a5,0xa
+    80201462:	0017e713          	ori	a4,a5,1
+    80201466:	fe043783          	ld	a5,-32(s0)
+    8020146a:	e398                	sd	a4,0(a5)
+  for(int level = 2; level > 0; level--) {
+    8020146c:	fec42783          	lw	a5,-20(s0)
+    80201470:	37fd                	addiw	a5,a5,-1
+    80201472:	fef42623          	sw	a5,-20(s0)
+    80201476:	fec42783          	lw	a5,-20(s0)
+    8020147a:	2781                	sext.w	a5,a5
+    8020147c:	f6f045e3          	bgtz	a5,802013e6 <walk+0x3a>
+    }
+  }
+  return &pagetable[PX(0, va)];
+    80201480:	fd043783          	ld	a5,-48(s0)
+    80201484:	83b1                	srli	a5,a5,0xc
+    80201486:	1ff7f793          	andi	a5,a5,511
+    8020148a:	078e                	slli	a5,a5,0x3
+    8020148c:	fd843703          	ld	a4,-40(s0)
+    80201490:	97ba                	add	a5,a5,a4
+}
+    80201492:	853e                	mv	a0,a5
+    80201494:	70e2                	ld	ra,56(sp)
+    80201496:	7442                	ld	s0,48(sp)
+    80201498:	6121                	addi	sp,sp,64
+    8020149a:	8082                	ret
+
+000000008020149c <walkaddr>:
+// Look up a virtual address, return the physical address,
+// or 0 if not mapped.
+// Can only be used to look up user pages.
+uint64
+walkaddr(pagetable_t pagetable, uint64 va)
+{
+    8020149c:	7179                	addi	sp,sp,-48
+    8020149e:	f406                	sd	ra,40(sp)
+    802014a0:	f022                	sd	s0,32(sp)
+    802014a2:	1800                	addi	s0,sp,48
+    802014a4:	fca43c23          	sd	a0,-40(s0)
+    802014a8:	fcb43823          	sd	a1,-48(s0)
+  pte_t *pte;
+  uint64 pa;
+
+  if(va >= MAXVA)
+    802014ac:	fd043703          	ld	a4,-48(s0)
+    802014b0:	57fd                	li	a5,-1
+    802014b2:	83e9                	srli	a5,a5,0x1a
+    802014b4:	00e7f463          	bgeu	a5,a4,802014bc <walkaddr+0x20>
+    return NULL;
+    802014b8:	4781                	li	a5,0
+    802014ba:	a881                	j	8020150a <walkaddr+0x6e>
+
+  pte = walk(pagetable, va, 0);
+    802014bc:	4601                	li	a2,0
+    802014be:	fd043583          	ld	a1,-48(s0)
+    802014c2:	fd843503          	ld	a0,-40(s0)
+    802014c6:	00000097          	auipc	ra,0x0
+    802014ca:	ee6080e7          	jalr	-282(ra) # 802013ac <walk>
+    802014ce:	fea43423          	sd	a0,-24(s0)
+  if(pte == 0)
+    802014d2:	fe843783          	ld	a5,-24(s0)
+    802014d6:	e399                	bnez	a5,802014dc <walkaddr+0x40>
+    return NULL;
+    802014d8:	4781                	li	a5,0
+    802014da:	a805                	j	8020150a <walkaddr+0x6e>
+  if((*pte & PTE_V) == 0)
+    802014dc:	fe843783          	ld	a5,-24(s0)
+    802014e0:	639c                	ld	a5,0(a5)
+    802014e2:	8b85                	andi	a5,a5,1
+    802014e4:	e399                	bnez	a5,802014ea <walkaddr+0x4e>
+    return NULL;
+    802014e6:	4781                	li	a5,0
+    802014e8:	a00d                	j	8020150a <walkaddr+0x6e>
+  if((*pte & PTE_U) == 0)
+    802014ea:	fe843783          	ld	a5,-24(s0)
+    802014ee:	639c                	ld	a5,0(a5)
+    802014f0:	8bc1                	andi	a5,a5,16
+    802014f2:	e399                	bnez	a5,802014f8 <walkaddr+0x5c>
+    return NULL;
+    802014f4:	4781                	li	a5,0
+    802014f6:	a811                	j	8020150a <walkaddr+0x6e>
+  pa = PTE2PA(*pte);
+    802014f8:	fe843783          	ld	a5,-24(s0)
+    802014fc:	639c                	ld	a5,0(a5)
+    802014fe:	83a9                	srli	a5,a5,0xa
+    80201500:	07b2                	slli	a5,a5,0xc
+    80201502:	fef43023          	sd	a5,-32(s0)
+  return pa;
+    80201506:	fe043783          	ld	a5,-32(s0)
+}
+    8020150a:	853e                	mv	a0,a5
+    8020150c:	70a2                	ld	ra,40(sp)
+    8020150e:	7402                	ld	s0,32(sp)
+    80201510:	6145                	addi	sp,sp,48
+    80201512:	8082                	ret
+
+0000000080201514 <kvmmap>:
+// add a mapping to the kernel page table.
+// only used when booting.
+// does not flush TLB or enable paging.
+void
+kvmmap(uint64 va, uint64 pa, uint64 sz, int perm)
+{
+    80201514:	7179                	addi	sp,sp,-48
+    80201516:	f406                	sd	ra,40(sp)
+    80201518:	f022                	sd	s0,32(sp)
+    8020151a:	1800                	addi	s0,sp,48
+    8020151c:	fea43423          	sd	a0,-24(s0)
+    80201520:	feb43023          	sd	a1,-32(s0)
+    80201524:	fcc43c23          	sd	a2,-40(s0)
+    80201528:	87b6                	mv	a5,a3
+    8020152a:	fcf42a23          	sw	a5,-44(s0)
+  if(mappages(kernel_pagetable, va, sz, pa, perm) != 0)
+    8020152e:	00018797          	auipc	a5,0x18
+    80201532:	b2a78793          	addi	a5,a5,-1238 # 80219058 <kernel_pagetable>
+    80201536:	639c                	ld	a5,0(a5)
+    80201538:	fd442703          	lw	a4,-44(s0)
+    8020153c:	fe043683          	ld	a3,-32(s0)
+    80201540:	fd843603          	ld	a2,-40(s0)
+    80201544:	fe843583          	ld	a1,-24(s0)
+    80201548:	853e                	mv	a0,a5
+    8020154a:	00000097          	auipc	ra,0x0
+    8020154e:	0dc080e7          	jalr	220(ra) # 80201626 <mappages>
+    80201552:	87aa                	mv	a5,a0
+    80201554:	cb89                	beqz	a5,80201566 <kvmmap+0x52>
+    panic("kvmmap");
+    80201556:	0000c517          	auipc	a0,0xc
+    8020155a:	f1a50513          	addi	a0,a0,-230 # 8020d470 <etext+0x470>
+    8020155e:	fffff097          	auipc	ra,0xfffff
+    80201562:	ee6080e7          	jalr	-282(ra) # 80200444 <panic>
+}
+    80201566:	0001                	nop
+    80201568:	70a2                	ld	ra,40(sp)
+    8020156a:	7402                	ld	s0,32(sp)
+    8020156c:	6145                	addi	sp,sp,48
+    8020156e:	8082                	ret
+
+0000000080201570 <kvmpa>:
+// a physical address. only needed for
+// addresses on the stack.
+// assumes va is page aligned.
+uint64
+kvmpa(uint64 va)
+{
+    80201570:	1101                	addi	sp,sp,-32
+    80201572:	ec06                	sd	ra,24(sp)
+    80201574:	e822                	sd	s0,16(sp)
+    80201576:	1000                	addi	s0,sp,32
+    80201578:	fea43423          	sd	a0,-24(s0)
+  return kwalkaddr(kernel_pagetable, va);
+    8020157c:	00018797          	auipc	a5,0x18
+    80201580:	adc78793          	addi	a5,a5,-1316 # 80219058 <kernel_pagetable>
+    80201584:	639c                	ld	a5,0(a5)
+    80201586:	fe843583          	ld	a1,-24(s0)
+    8020158a:	853e                	mv	a0,a5
+    8020158c:	00000097          	auipc	ra,0x0
+    80201590:	014080e7          	jalr	20(ra) # 802015a0 <kwalkaddr>
+    80201594:	87aa                	mv	a5,a0
+}
+    80201596:	853e                	mv	a0,a5
+    80201598:	60e2                	ld	ra,24(sp)
+    8020159a:	6442                	ld	s0,16(sp)
+    8020159c:	6105                	addi	sp,sp,32
+    8020159e:	8082                	ret
+
+00000000802015a0 <kwalkaddr>:
+
+uint64
+kwalkaddr(pagetable_t kpt, uint64 va)
+{
+    802015a0:	7139                	addi	sp,sp,-64
+    802015a2:	fc06                	sd	ra,56(sp)
+    802015a4:	f822                	sd	s0,48(sp)
+    802015a6:	0080                	addi	s0,sp,64
+    802015a8:	fca43423          	sd	a0,-56(s0)
+    802015ac:	fcb43023          	sd	a1,-64(s0)
+  uint64 off = va % PGSIZE;
+    802015b0:	fc043703          	ld	a4,-64(s0)
+    802015b4:	6785                	lui	a5,0x1
+    802015b6:	17fd                	addi	a5,a5,-1
+    802015b8:	8ff9                	and	a5,a5,a4
+    802015ba:	fef43423          	sd	a5,-24(s0)
+  pte_t *pte;
+  uint64 pa;
+  
+  pte = walk(kpt, va, 0);
+    802015be:	4601                	li	a2,0
+    802015c0:	fc043583          	ld	a1,-64(s0)
+    802015c4:	fc843503          	ld	a0,-56(s0)
+    802015c8:	00000097          	auipc	ra,0x0
+    802015cc:	de4080e7          	jalr	-540(ra) # 802013ac <walk>
+    802015d0:	fea43023          	sd	a0,-32(s0)
+  if(pte == 0)
+    802015d4:	fe043783          	ld	a5,-32(s0)
+    802015d8:	eb89                	bnez	a5,802015ea <kwalkaddr+0x4a>
+    panic("kvmpa");
+    802015da:	0000c517          	auipc	a0,0xc
+    802015de:	e9e50513          	addi	a0,a0,-354 # 8020d478 <etext+0x478>
+    802015e2:	fffff097          	auipc	ra,0xfffff
+    802015e6:	e62080e7          	jalr	-414(ra) # 80200444 <panic>
+  if((*pte & PTE_V) == 0)
+    802015ea:	fe043783          	ld	a5,-32(s0)
+    802015ee:	639c                	ld	a5,0(a5)
+    802015f0:	8b85                	andi	a5,a5,1
+    802015f2:	eb89                	bnez	a5,80201604 <kwalkaddr+0x64>
+    panic("kvmpa");
+    802015f4:	0000c517          	auipc	a0,0xc
+    802015f8:	e8450513          	addi	a0,a0,-380 # 8020d478 <etext+0x478>
+    802015fc:	fffff097          	auipc	ra,0xfffff
+    80201600:	e48080e7          	jalr	-440(ra) # 80200444 <panic>
+  pa = PTE2PA(*pte);
+    80201604:	fe043783          	ld	a5,-32(s0)
+    80201608:	639c                	ld	a5,0(a5)
+    8020160a:	83a9                	srli	a5,a5,0xa
+    8020160c:	07b2                	slli	a5,a5,0xc
+    8020160e:	fcf43c23          	sd	a5,-40(s0)
+  return pa+off;
+    80201612:	fd843703          	ld	a4,-40(s0)
+    80201616:	fe843783          	ld	a5,-24(s0)
+    8020161a:	97ba                	add	a5,a5,a4
+}
+    8020161c:	853e                	mv	a0,a5
+    8020161e:	70e2                	ld	ra,56(sp)
+    80201620:	7442                	ld	s0,48(sp)
+    80201622:	6121                	addi	sp,sp,64
+    80201624:	8082                	ret
+
+0000000080201626 <mappages>:
+// physical addresses starting at pa. va and size might not
+// 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)
+{
+    80201626:	711d                	addi	sp,sp,-96
+    80201628:	ec86                	sd	ra,88(sp)
+    8020162a:	e8a2                	sd	s0,80(sp)
+    8020162c:	1080                	addi	s0,sp,96
+    8020162e:	fca43423          	sd	a0,-56(s0)
+    80201632:	fcb43023          	sd	a1,-64(s0)
+    80201636:	fac43c23          	sd	a2,-72(s0)
+    8020163a:	fad43823          	sd	a3,-80(s0)
+    8020163e:	87ba                	mv	a5,a4
+    80201640:	faf42623          	sw	a5,-84(s0)
+  uint64 a, last;
+  pte_t *pte;
+
+  a = PGROUNDDOWN(va);
+    80201644:	fc043703          	ld	a4,-64(s0)
+    80201648:	77fd                	lui	a5,0xfffff
+    8020164a:	8ff9                	and	a5,a5,a4
+    8020164c:	fef43423          	sd	a5,-24(s0)
+  last = PGROUNDDOWN(va + size - 1);
+    80201650:	fc043703          	ld	a4,-64(s0)
+    80201654:	fb843783          	ld	a5,-72(s0)
+    80201658:	97ba                	add	a5,a5,a4
+    8020165a:	fff78713          	addi	a4,a5,-1 # ffffffffffffefff <kernel_end+0xffffffff7fdd1fff>
+    8020165e:	77fd                	lui	a5,0xfffff
+    80201660:	8ff9                	and	a5,a5,a4
+    80201662:	fef43023          	sd	a5,-32(s0)
+  
+  for(;;){
+    if((pte = walk(pagetable, a, 1)) == NULL)
+    80201666:	4605                	li	a2,1
+    80201668:	fe843583          	ld	a1,-24(s0)
+    8020166c:	fc843503          	ld	a0,-56(s0)
+    80201670:	00000097          	auipc	ra,0x0
+    80201674:	d3c080e7          	jalr	-708(ra) # 802013ac <walk>
+    80201678:	fca43c23          	sd	a0,-40(s0)
+    8020167c:	fd843783          	ld	a5,-40(s0)
+    80201680:	e399                	bnez	a5,80201686 <mappages+0x60>
+      return -1;
+    80201682:	57fd                	li	a5,-1
+    80201684:	a085                	j	802016e4 <mappages+0xbe>
+    if(*pte & PTE_V)
+    80201686:	fd843783          	ld	a5,-40(s0)
+    8020168a:	639c                	ld	a5,0(a5)
+    8020168c:	8b85                	andi	a5,a5,1
+    8020168e:	cb89                	beqz	a5,802016a0 <mappages+0x7a>
+      panic("remap");
+    80201690:	0000c517          	auipc	a0,0xc
+    80201694:	df050513          	addi	a0,a0,-528 # 8020d480 <etext+0x480>
+    80201698:	fffff097          	auipc	ra,0xfffff
+    8020169c:	dac080e7          	jalr	-596(ra) # 80200444 <panic>
+    *pte = PA2PTE(pa) | perm | PTE_V;
+    802016a0:	fb043783          	ld	a5,-80(s0)
+    802016a4:	83b1                	srli	a5,a5,0xc
+    802016a6:	00a79713          	slli	a4,a5,0xa
+    802016aa:	fac42783          	lw	a5,-84(s0)
+    802016ae:	8fd9                	or	a5,a5,a4
+    802016b0:	0017e713          	ori	a4,a5,1
+    802016b4:	fd843783          	ld	a5,-40(s0)
+    802016b8:	e398                	sd	a4,0(a5)
+    if(a == last)
+    802016ba:	fe843703          	ld	a4,-24(s0)
+    802016be:	fe043783          	ld	a5,-32(s0)
+    802016c2:	00f70f63          	beq	a4,a5,802016e0 <mappages+0xba>
+      break;
+    a += PGSIZE;
+    802016c6:	fe843703          	ld	a4,-24(s0)
+    802016ca:	6785                	lui	a5,0x1
+    802016cc:	97ba                	add	a5,a5,a4
+    802016ce:	fef43423          	sd	a5,-24(s0)
+    pa += PGSIZE;
+    802016d2:	fb043703          	ld	a4,-80(s0)
+    802016d6:	6785                	lui	a5,0x1
+    802016d8:	97ba                	add	a5,a5,a4
+    802016da:	faf43823          	sd	a5,-80(s0)
+    if((pte = walk(pagetable, a, 1)) == NULL)
+    802016de:	b761                	j	80201666 <mappages+0x40>
+      break;
+    802016e0:	0001                	nop
+  }
+  return 0;
+    802016e2:	4781                	li	a5,0
+}
+    802016e4:	853e                	mv	a0,a5
+    802016e6:	60e6                	ld	ra,88(sp)
+    802016e8:	6446                	ld	s0,80(sp)
+    802016ea:	6125                	addi	sp,sp,96
+    802016ec:	8082                	ret
+
+00000000802016ee <vmunmap>:
+// Remove npages of mappings starting from va. va must be
+// page-aligned. The mappings must exist.
+// Optionally free the physical memory.
+void
+vmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
+{
+    802016ee:	715d                	addi	sp,sp,-80
+    802016f0:	e486                	sd	ra,72(sp)
+    802016f2:	e0a2                	sd	s0,64(sp)
+    802016f4:	0880                	addi	s0,sp,80
+    802016f6:	fca43423          	sd	a0,-56(s0)
+    802016fa:	fcb43023          	sd	a1,-64(s0)
+    802016fe:	fac43c23          	sd	a2,-72(s0)
+    80201702:	87b6                	mv	a5,a3
+    80201704:	faf42a23          	sw	a5,-76(s0)
+  uint64 a;
+  pte_t *pte;
+
+  if((va % PGSIZE) != 0)
+    80201708:	fc043703          	ld	a4,-64(s0)
+    8020170c:	6785                	lui	a5,0x1
+    8020170e:	17fd                	addi	a5,a5,-1
+    80201710:	8ff9                	and	a5,a5,a4
+    80201712:	cb89                	beqz	a5,80201724 <vmunmap+0x36>
+    panic("vmunmap: not aligned");
+    80201714:	0000c517          	auipc	a0,0xc
+    80201718:	d7450513          	addi	a0,a0,-652 # 8020d488 <etext+0x488>
+    8020171c:	fffff097          	auipc	ra,0xfffff
+    80201720:	d28080e7          	jalr	-728(ra) # 80200444 <panic>
+
+  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
+    80201724:	fc043783          	ld	a5,-64(s0)
+    80201728:	fef43423          	sd	a5,-24(s0)
+    8020172c:	a045                	j	802017cc <vmunmap+0xde>
+    if((pte = walk(pagetable, a, 0)) == 0)
+    8020172e:	4601                	li	a2,0
+    80201730:	fe843583          	ld	a1,-24(s0)
+    80201734:	fc843503          	ld	a0,-56(s0)
+    80201738:	00000097          	auipc	ra,0x0
+    8020173c:	c74080e7          	jalr	-908(ra) # 802013ac <walk>
+    80201740:	fea43023          	sd	a0,-32(s0)
+    80201744:	fe043783          	ld	a5,-32(s0)
+    80201748:	eb89                	bnez	a5,8020175a <vmunmap+0x6c>
+      panic("vmunmap: walk");
+    8020174a:	0000c517          	auipc	a0,0xc
+    8020174e:	d5650513          	addi	a0,a0,-682 # 8020d4a0 <etext+0x4a0>
+    80201752:	fffff097          	auipc	ra,0xfffff
+    80201756:	cf2080e7          	jalr	-782(ra) # 80200444 <panic>
+    if((*pte & PTE_V) == 0)
+    8020175a:	fe043783          	ld	a5,-32(s0)
+    8020175e:	639c                	ld	a5,0(a5)
+    80201760:	8b85                	andi	a5,a5,1
+    80201762:	eb89                	bnez	a5,80201774 <vmunmap+0x86>
+      panic("vmunmap: not mapped");
+    80201764:	0000c517          	auipc	a0,0xc
+    80201768:	d4c50513          	addi	a0,a0,-692 # 8020d4b0 <etext+0x4b0>
+    8020176c:	fffff097          	auipc	ra,0xfffff
+    80201770:	cd8080e7          	jalr	-808(ra) # 80200444 <panic>
+    if(PTE_FLAGS(*pte) == PTE_V)
+    80201774:	fe043783          	ld	a5,-32(s0)
+    80201778:	639c                	ld	a5,0(a5)
+    8020177a:	3ff7f713          	andi	a4,a5,1023
+    8020177e:	4785                	li	a5,1
+    80201780:	00f71a63          	bne	a4,a5,80201794 <vmunmap+0xa6>
+      panic("vmunmap: not a leaf");
+    80201784:	0000c517          	auipc	a0,0xc
+    80201788:	d4450513          	addi	a0,a0,-700 # 8020d4c8 <etext+0x4c8>
+    8020178c:	fffff097          	auipc	ra,0xfffff
+    80201790:	cb8080e7          	jalr	-840(ra) # 80200444 <panic>
+    if(do_free){
+    80201794:	fb442783          	lw	a5,-76(s0)
+    80201798:	2781                	sext.w	a5,a5
+    8020179a:	cf99                	beqz	a5,802017b8 <vmunmap+0xca>
+      uint64 pa = PTE2PA(*pte);
+    8020179c:	fe043783          	ld	a5,-32(s0)
+    802017a0:	639c                	ld	a5,0(a5)
+    802017a2:	83a9                	srli	a5,a5,0xa
+    802017a4:	07b2                	slli	a5,a5,0xc
+    802017a6:	fcf43c23          	sd	a5,-40(s0)
+      kfree((void*)pa);
+    802017aa:	fd843783          	ld	a5,-40(s0)
+    802017ae:	853e                	mv	a0,a5
+    802017b0:	fffff097          	auipc	ra,0xfffff
+    802017b4:	f1e080e7          	jalr	-226(ra) # 802006ce <kfree>
+    }
+    *pte = 0;
+    802017b8:	fe043783          	ld	a5,-32(s0)
+    802017bc:	0007b023          	sd	zero,0(a5) # 1000 <_entry-0x801ff000>
+  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
+    802017c0:	fe843703          	ld	a4,-24(s0)
+    802017c4:	6785                	lui	a5,0x1
+    802017c6:	97ba                	add	a5,a5,a4
+    802017c8:	fef43423          	sd	a5,-24(s0)
+    802017cc:	fb843783          	ld	a5,-72(s0)
+    802017d0:	00c79713          	slli	a4,a5,0xc
+    802017d4:	fc043783          	ld	a5,-64(s0)
+    802017d8:	97ba                	add	a5,a5,a4
+    802017da:	fe843703          	ld	a4,-24(s0)
+    802017de:	f4f768e3          	bltu	a4,a5,8020172e <vmunmap+0x40>
+  }
+}
+    802017e2:	0001                	nop
+    802017e4:	0001                	nop
+    802017e6:	60a6                	ld	ra,72(sp)
+    802017e8:	6406                	ld	s0,64(sp)
+    802017ea:	6161                	addi	sp,sp,80
+    802017ec:	8082                	ret
+
+00000000802017ee <uvmcreate>:
+
+// create an empty user page table.
+// returns 0 if out of memory.
+pagetable_t
+uvmcreate()
+{
+    802017ee:	1101                	addi	sp,sp,-32
+    802017f0:	ec06                	sd	ra,24(sp)
+    802017f2:	e822                	sd	s0,16(sp)
+    802017f4:	1000                	addi	s0,sp,32
+  pagetable_t pagetable;
+  pagetable = (pagetable_t) kalloc();
+    802017f6:	fffff097          	auipc	ra,0xfffff
+    802017fa:	f96080e7          	jalr	-106(ra) # 8020078c <kalloc>
+    802017fe:	fea43423          	sd	a0,-24(s0)
+  if(pagetable == NULL)
+    80201802:	fe843783          	ld	a5,-24(s0)
+    80201806:	e399                	bnez	a5,8020180c <uvmcreate+0x1e>
+    return NULL;
+    80201808:	4781                	li	a5,0
+    8020180a:	a819                	j	80201820 <uvmcreate+0x32>
+  memset(pagetable, 0, PGSIZE);
+    8020180c:	6605                	lui	a2,0x1
+    8020180e:	4581                	li	a1,0
+    80201810:	fe843503          	ld	a0,-24(s0)
+    80201814:	fffff097          	auipc	ra,0xfffff
+    80201818:	2d2080e7          	jalr	722(ra) # 80200ae6 <memset>
+  return pagetable;
+    8020181c:	fe843783          	ld	a5,-24(s0)
+}
+    80201820:	853e                	mv	a0,a5
+    80201822:	60e2                	ld	ra,24(sp)
+    80201824:	6442                	ld	s0,16(sp)
+    80201826:	6105                	addi	sp,sp,32
+    80201828:	8082                	ret
+
+000000008020182a <uvminit>:
+// Load the user initcode into address 0 of pagetable,
+// for the very first process.
+// sz must be less than a page.
+void
+uvminit(pagetable_t pagetable, pagetable_t kpagetable, uchar *src, uint sz)
+{
+    8020182a:	7139                	addi	sp,sp,-64
+    8020182c:	fc06                	sd	ra,56(sp)
+    8020182e:	f822                	sd	s0,48(sp)
+    80201830:	0080                	addi	s0,sp,64
+    80201832:	fca43c23          	sd	a0,-40(s0)
+    80201836:	fcb43823          	sd	a1,-48(s0)
+    8020183a:	fcc43423          	sd	a2,-56(s0)
+    8020183e:	87b6                	mv	a5,a3
+    80201840:	fcf42223          	sw	a5,-60(s0)
+  char *mem;
+
+  if(sz >= PGSIZE)
+    80201844:	fc442783          	lw	a5,-60(s0)
+    80201848:	0007871b          	sext.w	a4,a5
+    8020184c:	6785                	lui	a5,0x1
+    8020184e:	00f76a63          	bltu	a4,a5,80201862 <uvminit+0x38>
+    panic("inituvm: more than a page");
+    80201852:	0000c517          	auipc	a0,0xc
+    80201856:	c8e50513          	addi	a0,a0,-882 # 8020d4e0 <etext+0x4e0>
+    8020185a:	fffff097          	auipc	ra,0xfffff
+    8020185e:	bea080e7          	jalr	-1046(ra) # 80200444 <panic>
+  mem = kalloc();
+    80201862:	fffff097          	auipc	ra,0xfffff
+    80201866:	f2a080e7          	jalr	-214(ra) # 8020078c <kalloc>
+    8020186a:	fea43423          	sd	a0,-24(s0)
+  // printf("[uvminit]kalloc: %p\n", mem);
+  memset(mem, 0, PGSIZE);
+    8020186e:	6605                	lui	a2,0x1
+    80201870:	4581                	li	a1,0
+    80201872:	fe843503          	ld	a0,-24(s0)
+    80201876:	fffff097          	auipc	ra,0xfffff
+    8020187a:	270080e7          	jalr	624(ra) # 80200ae6 <memset>
+  mappages(pagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X|PTE_U);
+    8020187e:	fe843783          	ld	a5,-24(s0)
+    80201882:	4779                	li	a4,30
+    80201884:	86be                	mv	a3,a5
+    80201886:	6605                	lui	a2,0x1
+    80201888:	4581                	li	a1,0
+    8020188a:	fd843503          	ld	a0,-40(s0)
+    8020188e:	00000097          	auipc	ra,0x0
+    80201892:	d98080e7          	jalr	-616(ra) # 80201626 <mappages>
+  mappages(kpagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X);
+    80201896:	fe843783          	ld	a5,-24(s0)
+    8020189a:	4739                	li	a4,14
+    8020189c:	86be                	mv	a3,a5
+    8020189e:	6605                	lui	a2,0x1
+    802018a0:	4581                	li	a1,0
+    802018a2:	fd043503          	ld	a0,-48(s0)
+    802018a6:	00000097          	auipc	ra,0x0
+    802018aa:	d80080e7          	jalr	-640(ra) # 80201626 <mappages>
+  memmove(mem, src, sz);
+    802018ae:	fc442783          	lw	a5,-60(s0)
+    802018b2:	863e                	mv	a2,a5
+    802018b4:	fc843583          	ld	a1,-56(s0)
+    802018b8:	fe843503          	ld	a0,-24(s0)
+    802018bc:	fffff097          	auipc	ra,0xfffff
+    802018c0:	30e080e7          	jalr	782(ra) # 80200bca <memmove>
+  // for (int i = 0; i < sz; i ++) {
+  //   printf("[uvminit]mem: %p, %x\n", mem + i, mem[i]);
+  // }
+}
+    802018c4:	0001                	nop
+    802018c6:	70e2                	ld	ra,56(sp)
+    802018c8:	7442                	ld	s0,48(sp)
+    802018ca:	6121                	addi	sp,sp,64
+    802018cc:	8082                	ret
+
+00000000802018ce <uvmalloc>:
+
+// Allocate PTEs and physical memory to grow process from oldsz to
+// newsz, which need not be page aligned.  Returns new size or 0 on error.
+uint64
+uvmalloc(pagetable_t pagetable, pagetable_t kpagetable, uint64 oldsz, uint64 newsz)
+{
+    802018ce:	715d                	addi	sp,sp,-80
+    802018d0:	e486                	sd	ra,72(sp)
+    802018d2:	e0a2                	sd	s0,64(sp)
+    802018d4:	0880                	addi	s0,sp,80
+    802018d6:	fca43423          	sd	a0,-56(s0)
+    802018da:	fcb43023          	sd	a1,-64(s0)
+    802018de:	fac43c23          	sd	a2,-72(s0)
+    802018e2:	fad43823          	sd	a3,-80(s0)
+  char *mem;
+  uint64 a;
+
+  if(newsz < oldsz)
+    802018e6:	fb043703          	ld	a4,-80(s0)
+    802018ea:	fb843783          	ld	a5,-72(s0)
+    802018ee:	00f77563          	bgeu	a4,a5,802018f8 <uvmalloc+0x2a>
+    return oldsz;
+    802018f2:	fb843783          	ld	a5,-72(s0)
+    802018f6:	a21d                	j	80201a1c <uvmalloc+0x14e>
+
+  oldsz = PGROUNDUP(oldsz);
+    802018f8:	fb843703          	ld	a4,-72(s0)
+    802018fc:	6785                	lui	a5,0x1
+    802018fe:	17fd                	addi	a5,a5,-1
+    80201900:	973e                	add	a4,a4,a5
+    80201902:	77fd                	lui	a5,0xfffff
+    80201904:	8ff9                	and	a5,a5,a4
+    80201906:	faf43c23          	sd	a5,-72(s0)
+  for(a = oldsz; a < newsz; a += PGSIZE){
+    8020190a:	fb843783          	ld	a5,-72(s0)
+    8020190e:	fef43423          	sd	a5,-24(s0)
+    80201912:	a8ed                	j	80201a0c <uvmalloc+0x13e>
+    mem = kalloc();
+    80201914:	fffff097          	auipc	ra,0xfffff
+    80201918:	e78080e7          	jalr	-392(ra) # 8020078c <kalloc>
+    8020191c:	fea43023          	sd	a0,-32(s0)
+    if(mem == NULL){
+    80201920:	fe043783          	ld	a5,-32(s0)
+    80201924:	ef99                	bnez	a5,80201942 <uvmalloc+0x74>
+      uvmdealloc(pagetable, kpagetable, a, oldsz);
+    80201926:	fb843683          	ld	a3,-72(s0)
+    8020192a:	fe843603          	ld	a2,-24(s0)
+    8020192e:	fc043583          	ld	a1,-64(s0)
+    80201932:	fc843503          	ld	a0,-56(s0)
+    80201936:	00000097          	auipc	ra,0x0
+    8020193a:	0f0080e7          	jalr	240(ra) # 80201a26 <uvmdealloc>
+      return 0;
+    8020193e:	4781                	li	a5,0
+    80201940:	a8f1                	j	80201a1c <uvmalloc+0x14e>
+    }
+    memset(mem, 0, PGSIZE);
+    80201942:	6605                	lui	a2,0x1
+    80201944:	4581                	li	a1,0
+    80201946:	fe043503          	ld	a0,-32(s0)
+    8020194a:	fffff097          	auipc	ra,0xfffff
+    8020194e:	19c080e7          	jalr	412(ra) # 80200ae6 <memset>
+    if (mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_W|PTE_X|PTE_R|PTE_U) != 0) {
+    80201952:	fe043783          	ld	a5,-32(s0)
+    80201956:	4779                	li	a4,30
+    80201958:	86be                	mv	a3,a5
+    8020195a:	6605                	lui	a2,0x1
+    8020195c:	fe843583          	ld	a1,-24(s0)
+    80201960:	fc843503          	ld	a0,-56(s0)
+    80201964:	00000097          	auipc	ra,0x0
+    80201968:	cc2080e7          	jalr	-830(ra) # 80201626 <mappages>
+    8020196c:	87aa                	mv	a5,a0
+    8020196e:	c78d                	beqz	a5,80201998 <uvmalloc+0xca>
+      kfree(mem);
+    80201970:	fe043503          	ld	a0,-32(s0)
+    80201974:	fffff097          	auipc	ra,0xfffff
+    80201978:	d5a080e7          	jalr	-678(ra) # 802006ce <kfree>
+      uvmdealloc(pagetable, kpagetable, a, oldsz);
+    8020197c:	fb843683          	ld	a3,-72(s0)
+    80201980:	fe843603          	ld	a2,-24(s0)
+    80201984:	fc043583          	ld	a1,-64(s0)
+    80201988:	fc843503          	ld	a0,-56(s0)
+    8020198c:	00000097          	auipc	ra,0x0
+    80201990:	09a080e7          	jalr	154(ra) # 80201a26 <uvmdealloc>
+      return 0;
+    80201994:	4781                	li	a5,0
+    80201996:	a059                	j	80201a1c <uvmalloc+0x14e>
+    }
+    if (mappages(kpagetable, a, PGSIZE, (uint64)mem, PTE_W|PTE_X|PTE_R) != 0){
+    80201998:	fe043783          	ld	a5,-32(s0)
+    8020199c:	4739                	li	a4,14
+    8020199e:	86be                	mv	a3,a5
+    802019a0:	6605                	lui	a2,0x1
+    802019a2:	fe843583          	ld	a1,-24(s0)
+    802019a6:	fc043503          	ld	a0,-64(s0)
+    802019aa:	00000097          	auipc	ra,0x0
+    802019ae:	c7c080e7          	jalr	-900(ra) # 80201626 <mappages>
+    802019b2:	87aa                	mv	a5,a0
+    802019b4:	c7b1                	beqz	a5,80201a00 <uvmalloc+0x132>
+      int npages = (a - oldsz) / PGSIZE;
+    802019b6:	fe843703          	ld	a4,-24(s0)
+    802019ba:	fb843783          	ld	a5,-72(s0)
+    802019be:	40f707b3          	sub	a5,a4,a5
+    802019c2:	83b1                	srli	a5,a5,0xc
+    802019c4:	fcf42e23          	sw	a5,-36(s0)
+      vmunmap(pagetable, oldsz, npages + 1, 1);   // plus the page allocated above.
+    802019c8:	fdc42783          	lw	a5,-36(s0)
+    802019cc:	2785                	addiw	a5,a5,1
+    802019ce:	2781                	sext.w	a5,a5
+    802019d0:	4685                	li	a3,1
+    802019d2:	863e                	mv	a2,a5
+    802019d4:	fb843583          	ld	a1,-72(s0)
+    802019d8:	fc843503          	ld	a0,-56(s0)
+    802019dc:	00000097          	auipc	ra,0x0
+    802019e0:	d12080e7          	jalr	-750(ra) # 802016ee <vmunmap>
+      vmunmap(kpagetable, oldsz, npages, 0);
+    802019e4:	fdc42783          	lw	a5,-36(s0)
+    802019e8:	4681                	li	a3,0
+    802019ea:	863e                	mv	a2,a5
+    802019ec:	fb843583          	ld	a1,-72(s0)
+    802019f0:	fc043503          	ld	a0,-64(s0)
+    802019f4:	00000097          	auipc	ra,0x0
+    802019f8:	cfa080e7          	jalr	-774(ra) # 802016ee <vmunmap>
+      return 0;
+    802019fc:	4781                	li	a5,0
+    802019fe:	a839                	j	80201a1c <uvmalloc+0x14e>
+  for(a = oldsz; a < newsz; a += PGSIZE){
+    80201a00:	fe843703          	ld	a4,-24(s0)
+    80201a04:	6785                	lui	a5,0x1
+    80201a06:	97ba                	add	a5,a5,a4
+    80201a08:	fef43423          	sd	a5,-24(s0)
+    80201a0c:	fe843703          	ld	a4,-24(s0)
+    80201a10:	fb043783          	ld	a5,-80(s0)
+    80201a14:	f0f760e3          	bltu	a4,a5,80201914 <uvmalloc+0x46>
+    }
+  }
+  return newsz;
+    80201a18:	fb043783          	ld	a5,-80(s0)
+}
+    80201a1c:	853e                	mv	a0,a5
+    80201a1e:	60a6                	ld	ra,72(sp)
+    80201a20:	6406                	ld	s0,64(sp)
+    80201a22:	6161                	addi	sp,sp,80
+    80201a24:	8082                	ret
+
+0000000080201a26 <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, pagetable_t kpagetable, uint64 oldsz, uint64 newsz)
+{
+    80201a26:	7139                	addi	sp,sp,-64
+    80201a28:	fc06                	sd	ra,56(sp)
+    80201a2a:	f822                	sd	s0,48(sp)
+    80201a2c:	0080                	addi	s0,sp,64
+    80201a2e:	fca43c23          	sd	a0,-40(s0)
+    80201a32:	fcb43823          	sd	a1,-48(s0)
+    80201a36:	fcc43423          	sd	a2,-56(s0)
+    80201a3a:	fcd43023          	sd	a3,-64(s0)
+  if(newsz >= oldsz)
+    80201a3e:	fc043703          	ld	a4,-64(s0)
+    80201a42:	fc843783          	ld	a5,-56(s0)
+    80201a46:	00f76563          	bltu	a4,a5,80201a50 <uvmdealloc+0x2a>
+    return oldsz;
+    80201a4a:	fc843783          	ld	a5,-56(s0)
+    80201a4e:	a851                	j	80201ae2 <uvmdealloc+0xbc>
+
+  if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){
+    80201a50:	fc043703          	ld	a4,-64(s0)
+    80201a54:	6785                	lui	a5,0x1
+    80201a56:	17fd                	addi	a5,a5,-1
+    80201a58:	973e                	add	a4,a4,a5
+    80201a5a:	77fd                	lui	a5,0xfffff
+    80201a5c:	8f7d                	and	a4,a4,a5
+    80201a5e:	fc843683          	ld	a3,-56(s0)
+    80201a62:	6785                	lui	a5,0x1
+    80201a64:	17fd                	addi	a5,a5,-1
+    80201a66:	96be                	add	a3,a3,a5
+    80201a68:	77fd                	lui	a5,0xfffff
+    80201a6a:	8ff5                	and	a5,a5,a3
+    80201a6c:	06f77963          	bgeu	a4,a5,80201ade <uvmdealloc+0xb8>
+    int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE;
+    80201a70:	fc843703          	ld	a4,-56(s0)
+    80201a74:	6785                	lui	a5,0x1
+    80201a76:	17fd                	addi	a5,a5,-1
+    80201a78:	973e                	add	a4,a4,a5
+    80201a7a:	77fd                	lui	a5,0xfffff
+    80201a7c:	8f7d                	and	a4,a4,a5
+    80201a7e:	fc043683          	ld	a3,-64(s0)
+    80201a82:	6785                	lui	a5,0x1
+    80201a84:	17fd                	addi	a5,a5,-1
+    80201a86:	96be                	add	a3,a3,a5
+    80201a88:	77fd                	lui	a5,0xfffff
+    80201a8a:	8ff5                	and	a5,a5,a3
+    80201a8c:	40f707b3          	sub	a5,a4,a5
+    80201a90:	83b1                	srli	a5,a5,0xc
+    80201a92:	fef42623          	sw	a5,-20(s0)
+    vmunmap(kpagetable, PGROUNDUP(newsz), npages, 0);
+    80201a96:	fc043703          	ld	a4,-64(s0)
+    80201a9a:	6785                	lui	a5,0x1
+    80201a9c:	17fd                	addi	a5,a5,-1
+    80201a9e:	973e                	add	a4,a4,a5
+    80201aa0:	77fd                	lui	a5,0xfffff
+    80201aa2:	8ff9                	and	a5,a5,a4
+    80201aa4:	fec42703          	lw	a4,-20(s0)
+    80201aa8:	4681                	li	a3,0
+    80201aaa:	863a                	mv	a2,a4
+    80201aac:	85be                	mv	a1,a5
+    80201aae:	fd043503          	ld	a0,-48(s0)
+    80201ab2:	00000097          	auipc	ra,0x0
+    80201ab6:	c3c080e7          	jalr	-964(ra) # 802016ee <vmunmap>
+    vmunmap(pagetable, PGROUNDUP(newsz), npages, 1);
+    80201aba:	fc043703          	ld	a4,-64(s0)
+    80201abe:	6785                	lui	a5,0x1
+    80201ac0:	17fd                	addi	a5,a5,-1
+    80201ac2:	973e                	add	a4,a4,a5
+    80201ac4:	77fd                	lui	a5,0xfffff
+    80201ac6:	8ff9                	and	a5,a5,a4
+    80201ac8:	fec42703          	lw	a4,-20(s0)
+    80201acc:	4685                	li	a3,1
+    80201ace:	863a                	mv	a2,a4
+    80201ad0:	85be                	mv	a1,a5
+    80201ad2:	fd843503          	ld	a0,-40(s0)
+    80201ad6:	00000097          	auipc	ra,0x0
+    80201ada:	c18080e7          	jalr	-1000(ra) # 802016ee <vmunmap>
+  }
+
+  return newsz;
+    80201ade:	fc043783          	ld	a5,-64(s0)
+}
+    80201ae2:	853e                	mv	a0,a5
+    80201ae4:	70e2                	ld	ra,56(sp)
+    80201ae6:	7442                	ld	s0,48(sp)
+    80201ae8:	6121                	addi	sp,sp,64
+    80201aea:	8082                	ret
+
+0000000080201aec <freewalk>:
+
+// Recursively free page-table pages.
+// All leaf mappings must already have been removed.
+void
+freewalk(pagetable_t pagetable)
+{
+    80201aec:	7139                	addi	sp,sp,-64
+    80201aee:	fc06                	sd	ra,56(sp)
+    80201af0:	f822                	sd	s0,48(sp)
+    80201af2:	0080                	addi	s0,sp,64
+    80201af4:	fca43423          	sd	a0,-56(s0)
+  // there are 2^9 = 512 PTEs in a page table.
+  for(int i = 0; i < 512; i++){
+    80201af8:	fe042623          	sw	zero,-20(s0)
+    80201afc:	a88d                	j	80201b6e <freewalk+0x82>
+    pte_t pte = pagetable[i];
+    80201afe:	fec42783          	lw	a5,-20(s0)
+    80201b02:	078e                	slli	a5,a5,0x3
+    80201b04:	fc843703          	ld	a4,-56(s0)
+    80201b08:	97ba                	add	a5,a5,a4
+    80201b0a:	639c                	ld	a5,0(a5)
+    80201b0c:	fef43023          	sd	a5,-32(s0)
+    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
+    80201b10:	fe043783          	ld	a5,-32(s0)
+    80201b14:	8b85                	andi	a5,a5,1
+    80201b16:	cb9d                	beqz	a5,80201b4c <freewalk+0x60>
+    80201b18:	fe043783          	ld	a5,-32(s0)
+    80201b1c:	8bb9                	andi	a5,a5,14
+    80201b1e:	e79d                	bnez	a5,80201b4c <freewalk+0x60>
+      // this PTE points to a lower-level page table.
+      uint64 child = PTE2PA(pte);
+    80201b20:	fe043783          	ld	a5,-32(s0)
+    80201b24:	83a9                	srli	a5,a5,0xa
+    80201b26:	07b2                	slli	a5,a5,0xc
+    80201b28:	fcf43c23          	sd	a5,-40(s0)
+      freewalk((pagetable_t)child);
+    80201b2c:	fd843783          	ld	a5,-40(s0)
+    80201b30:	853e                	mv	a0,a5
+    80201b32:	00000097          	auipc	ra,0x0
+    80201b36:	fba080e7          	jalr	-70(ra) # 80201aec <freewalk>
+      pagetable[i] = 0;
+    80201b3a:	fec42783          	lw	a5,-20(s0)
+    80201b3e:	078e                	slli	a5,a5,0x3
+    80201b40:	fc843703          	ld	a4,-56(s0)
+    80201b44:	97ba                	add	a5,a5,a4
+    80201b46:	0007b023          	sd	zero,0(a5) # fffffffffffff000 <kernel_end+0xffffffff7fdd2000>
+    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
+    80201b4a:	a829                	j	80201b64 <freewalk+0x78>
+    } else if(pte & PTE_V){
+    80201b4c:	fe043783          	ld	a5,-32(s0)
+    80201b50:	8b85                	andi	a5,a5,1
+    80201b52:	cb89                	beqz	a5,80201b64 <freewalk+0x78>
+      panic("freewalk: leaf");
+    80201b54:	0000c517          	auipc	a0,0xc
+    80201b58:	9ac50513          	addi	a0,a0,-1620 # 8020d500 <etext+0x500>
+    80201b5c:	fffff097          	auipc	ra,0xfffff
+    80201b60:	8e8080e7          	jalr	-1816(ra) # 80200444 <panic>
+  for(int i = 0; i < 512; i++){
+    80201b64:	fec42783          	lw	a5,-20(s0)
+    80201b68:	2785                	addiw	a5,a5,1
+    80201b6a:	fef42623          	sw	a5,-20(s0)
+    80201b6e:	fec42783          	lw	a5,-20(s0)
+    80201b72:	0007871b          	sext.w	a4,a5
+    80201b76:	1ff00793          	li	a5,511
+    80201b7a:	f8e7d2e3          	bge	a5,a4,80201afe <freewalk+0x12>
+    }
+  }
+  kfree((void*)pagetable);
+    80201b7e:	fc843503          	ld	a0,-56(s0)
+    80201b82:	fffff097          	auipc	ra,0xfffff
+    80201b86:	b4c080e7          	jalr	-1204(ra) # 802006ce <kfree>
+}
+    80201b8a:	0001                	nop
+    80201b8c:	70e2                	ld	ra,56(sp)
+    80201b8e:	7442                	ld	s0,48(sp)
+    80201b90:	6121                	addi	sp,sp,64
+    80201b92:	8082                	ret
+
+0000000080201b94 <uvmfree>:
+
+// Free user memory pages,
+// then free page-table pages.
+void
+uvmfree(pagetable_t pagetable, uint64 sz)
+{
+    80201b94:	1101                	addi	sp,sp,-32
+    80201b96:	ec06                	sd	ra,24(sp)
+    80201b98:	e822                	sd	s0,16(sp)
+    80201b9a:	1000                	addi	s0,sp,32
+    80201b9c:	fea43423          	sd	a0,-24(s0)
+    80201ba0:	feb43023          	sd	a1,-32(s0)
+  if(sz > 0)
+    80201ba4:	fe043783          	ld	a5,-32(s0)
+    80201ba8:	c385                	beqz	a5,80201bc8 <uvmfree+0x34>
+    vmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
+    80201baa:	fe043703          	ld	a4,-32(s0)
+    80201bae:	6785                	lui	a5,0x1
+    80201bb0:	17fd                	addi	a5,a5,-1
+    80201bb2:	97ba                	add	a5,a5,a4
+    80201bb4:	83b1                	srli	a5,a5,0xc
+    80201bb6:	4685                	li	a3,1
+    80201bb8:	863e                	mv	a2,a5
+    80201bba:	4581                	li	a1,0
+    80201bbc:	fe843503          	ld	a0,-24(s0)
+    80201bc0:	00000097          	auipc	ra,0x0
+    80201bc4:	b2e080e7          	jalr	-1234(ra) # 802016ee <vmunmap>
+  freewalk(pagetable);
+    80201bc8:	fe843503          	ld	a0,-24(s0)
+    80201bcc:	00000097          	auipc	ra,0x0
+    80201bd0:	f20080e7          	jalr	-224(ra) # 80201aec <freewalk>
+}
+    80201bd4:	0001                	nop
+    80201bd6:	60e2                	ld	ra,24(sp)
+    80201bd8:	6442                	ld	s0,16(sp)
+    80201bda:	6105                	addi	sp,sp,32
+    80201bdc:	8082                	ret
+
+0000000080201bde <uvmcopy>:
+// physical memory.
+// returns 0 on success, -1 on failure.
+// frees any allocated pages on failure.
+int
+uvmcopy(pagetable_t old, pagetable_t new, pagetable_t knew, uint64 sz)
+{
+    80201bde:	711d                	addi	sp,sp,-96
+    80201be0:	ec86                	sd	ra,88(sp)
+    80201be2:	e8a2                	sd	s0,80(sp)
+    80201be4:	1080                	addi	s0,sp,96
+    80201be6:	faa43c23          	sd	a0,-72(s0)
+    80201bea:	fab43823          	sd	a1,-80(s0)
+    80201bee:	fac43423          	sd	a2,-88(s0)
+    80201bf2:	fad43023          	sd	a3,-96(s0)
+  pte_t *pte;
+  uint64 pa, i = 0, ki = 0;
+    80201bf6:	fe043423          	sd	zero,-24(s0)
+    80201bfa:	fe043023          	sd	zero,-32(s0)
+  uint flags;
+  char *mem;
+
+  while (i < sz){
+    80201bfe:	a8dd                	j	80201cf4 <uvmcopy+0x116>
+    if((pte = walk(old, i, 0)) == NULL)
+    80201c00:	4601                	li	a2,0
+    80201c02:	fe843583          	ld	a1,-24(s0)
+    80201c06:	fb843503          	ld	a0,-72(s0)
+    80201c0a:	fffff097          	auipc	ra,0xfffff
+    80201c0e:	7a2080e7          	jalr	1954(ra) # 802013ac <walk>
+    80201c12:	fca43c23          	sd	a0,-40(s0)
+    80201c16:	fd843783          	ld	a5,-40(s0)
+    80201c1a:	eb89                	bnez	a5,80201c2c <uvmcopy+0x4e>
+      panic("uvmcopy: pte should exist");
+    80201c1c:	0000c517          	auipc	a0,0xc
+    80201c20:	8f450513          	addi	a0,a0,-1804 # 8020d510 <etext+0x510>
+    80201c24:	fffff097          	auipc	ra,0xfffff
+    80201c28:	820080e7          	jalr	-2016(ra) # 80200444 <panic>
+    if((*pte & PTE_V) == 0)
+    80201c2c:	fd843783          	ld	a5,-40(s0)
+    80201c30:	639c                	ld	a5,0(a5)
+    80201c32:	8b85                	andi	a5,a5,1
+    80201c34:	eb89                	bnez	a5,80201c46 <uvmcopy+0x68>
+      panic("uvmcopy: page not present");
+    80201c36:	0000c517          	auipc	a0,0xc
+    80201c3a:	8fa50513          	addi	a0,a0,-1798 # 8020d530 <etext+0x530>
+    80201c3e:	fffff097          	auipc	ra,0xfffff
+    80201c42:	806080e7          	jalr	-2042(ra) # 80200444 <panic>
+    pa = PTE2PA(*pte);
+    80201c46:	fd843783          	ld	a5,-40(s0)
+    80201c4a:	639c                	ld	a5,0(a5)
+    80201c4c:	83a9                	srli	a5,a5,0xa
+    80201c4e:	07b2                	slli	a5,a5,0xc
+    80201c50:	fcf43823          	sd	a5,-48(s0)
+    flags = PTE_FLAGS(*pte);
+    80201c54:	fd843783          	ld	a5,-40(s0)
+    80201c58:	639c                	ld	a5,0(a5)
+    80201c5a:	2781                	sext.w	a5,a5
+    80201c5c:	3ff7f793          	andi	a5,a5,1023
+    80201c60:	fcf42623          	sw	a5,-52(s0)
+    if((mem = kalloc()) == NULL)
+    80201c64:	fffff097          	auipc	ra,0xfffff
+    80201c68:	b28080e7          	jalr	-1240(ra) # 8020078c <kalloc>
+    80201c6c:	fca43023          	sd	a0,-64(s0)
+    80201c70:	fc043783          	ld	a5,-64(s0)
+    80201c74:	cbc1                	beqz	a5,80201d04 <uvmcopy+0x126>
+      goto err;
+    memmove(mem, (char*)pa, PGSIZE);
+    80201c76:	fd043783          	ld	a5,-48(s0)
+    80201c7a:	6605                	lui	a2,0x1
+    80201c7c:	85be                	mv	a1,a5
+    80201c7e:	fc043503          	ld	a0,-64(s0)
+    80201c82:	fffff097          	auipc	ra,0xfffff
+    80201c86:	f48080e7          	jalr	-184(ra) # 80200bca <memmove>
+    if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0) {
+    80201c8a:	fc043783          	ld	a5,-64(s0)
+    80201c8e:	fcc42703          	lw	a4,-52(s0)
+    80201c92:	86be                	mv	a3,a5
+    80201c94:	6605                	lui	a2,0x1
+    80201c96:	fe843583          	ld	a1,-24(s0)
+    80201c9a:	fb043503          	ld	a0,-80(s0)
+    80201c9e:	00000097          	auipc	ra,0x0
+    80201ca2:	988080e7          	jalr	-1656(ra) # 80201626 <mappages>
+    80201ca6:	87aa                	mv	a5,a0
+    80201ca8:	cb81                	beqz	a5,80201cb8 <uvmcopy+0xda>
+      kfree(mem);
+    80201caa:	fc043503          	ld	a0,-64(s0)
+    80201cae:	fffff097          	auipc	ra,0xfffff
+    80201cb2:	a20080e7          	jalr	-1504(ra) # 802006ce <kfree>
+      goto err;
+    80201cb6:	a891                	j	80201d0a <uvmcopy+0x12c>
+    }
+    i += PGSIZE;
+    80201cb8:	fe843703          	ld	a4,-24(s0)
+    80201cbc:	6785                	lui	a5,0x1
+    80201cbe:	97ba                	add	a5,a5,a4
+    80201cc0:	fef43423          	sd	a5,-24(s0)
+    if(mappages(knew, ki, PGSIZE, (uint64)mem, flags & ~PTE_U) != 0){
+    80201cc4:	fc043683          	ld	a3,-64(s0)
+    80201cc8:	fcc42783          	lw	a5,-52(s0)
+    80201ccc:	9bbd                	andi	a5,a5,-17
+    80201cce:	2781                	sext.w	a5,a5
+    80201cd0:	873e                	mv	a4,a5
+    80201cd2:	6605                	lui	a2,0x1
+    80201cd4:	fe043583          	ld	a1,-32(s0)
+    80201cd8:	fa843503          	ld	a0,-88(s0)
+    80201cdc:	00000097          	auipc	ra,0x0
+    80201ce0:	94a080e7          	jalr	-1718(ra) # 80201626 <mappages>
+    80201ce4:	87aa                	mv	a5,a0
+    80201ce6:	e38d                	bnez	a5,80201d08 <uvmcopy+0x12a>
+      goto err;
+    }
+    ki += PGSIZE;
+    80201ce8:	fe043703          	ld	a4,-32(s0)
+    80201cec:	6785                	lui	a5,0x1
+    80201cee:	97ba                	add	a5,a5,a4
+    80201cf0:	fef43023          	sd	a5,-32(s0)
+  while (i < sz){
+    80201cf4:	fe843703          	ld	a4,-24(s0)
+    80201cf8:	fa043783          	ld	a5,-96(s0)
+    80201cfc:	f0f762e3          	bltu	a4,a5,80201c00 <uvmcopy+0x22>
+  }
+  return 0;
+    80201d00:	4781                	li	a5,0
+    80201d02:	a82d                	j	80201d3c <uvmcopy+0x15e>
+      goto err;
+    80201d04:	0001                	nop
+    80201d06:	a011                	j	80201d0a <uvmcopy+0x12c>
+      goto err;
+    80201d08:	0001                	nop
+
+ err:
+  vmunmap(knew, 0, ki / PGSIZE, 0);
+    80201d0a:	fe043783          	ld	a5,-32(s0)
+    80201d0e:	83b1                	srli	a5,a5,0xc
+    80201d10:	4681                	li	a3,0
+    80201d12:	863e                	mv	a2,a5
+    80201d14:	4581                	li	a1,0
+    80201d16:	fa843503          	ld	a0,-88(s0)
+    80201d1a:	00000097          	auipc	ra,0x0
+    80201d1e:	9d4080e7          	jalr	-1580(ra) # 802016ee <vmunmap>
+  vmunmap(new, 0, i / PGSIZE, 1);
+    80201d22:	fe843783          	ld	a5,-24(s0)
+    80201d26:	83b1                	srli	a5,a5,0xc
+    80201d28:	4685                	li	a3,1
+    80201d2a:	863e                	mv	a2,a5
+    80201d2c:	4581                	li	a1,0
+    80201d2e:	fb043503          	ld	a0,-80(s0)
+    80201d32:	00000097          	auipc	ra,0x0
+    80201d36:	9bc080e7          	jalr	-1604(ra) # 802016ee <vmunmap>
+  return -1;
+    80201d3a:	57fd                	li	a5,-1
+}
+    80201d3c:	853e                	mv	a0,a5
+    80201d3e:	60e6                	ld	ra,88(sp)
+    80201d40:	6446                	ld	s0,80(sp)
+    80201d42:	6125                	addi	sp,sp,96
+    80201d44:	8082                	ret
+
+0000000080201d46 <uvmclear>:
+
+// mark a PTE invalid for user access.
+// used by exec for the user stack guard page.
+void
+uvmclear(pagetable_t pagetable, uint64 va)
+{
+    80201d46:	7179                	addi	sp,sp,-48
+    80201d48:	f406                	sd	ra,40(sp)
+    80201d4a:	f022                	sd	s0,32(sp)
+    80201d4c:	1800                	addi	s0,sp,48
+    80201d4e:	fca43c23          	sd	a0,-40(s0)
+    80201d52:	fcb43823          	sd	a1,-48(s0)
+  pte_t *pte;
+  
+  pte = walk(pagetable, va, 0);
+    80201d56:	4601                	li	a2,0
+    80201d58:	fd043583          	ld	a1,-48(s0)
+    80201d5c:	fd843503          	ld	a0,-40(s0)
+    80201d60:	fffff097          	auipc	ra,0xfffff
+    80201d64:	64c080e7          	jalr	1612(ra) # 802013ac <walk>
+    80201d68:	fea43423          	sd	a0,-24(s0)
+  if(pte == NULL)
+    80201d6c:	fe843783          	ld	a5,-24(s0)
+    80201d70:	eb89                	bnez	a5,80201d82 <uvmclear+0x3c>
+    panic("uvmclear");
+    80201d72:	0000b517          	auipc	a0,0xb
+    80201d76:	7de50513          	addi	a0,a0,2014 # 8020d550 <etext+0x550>
+    80201d7a:	ffffe097          	auipc	ra,0xffffe
+    80201d7e:	6ca080e7          	jalr	1738(ra) # 80200444 <panic>
+  *pte &= ~PTE_U;
+    80201d82:	fe843783          	ld	a5,-24(s0)
+    80201d86:	639c                	ld	a5,0(a5)
+    80201d88:	fef7f713          	andi	a4,a5,-17
+    80201d8c:	fe843783          	ld	a5,-24(s0)
+    80201d90:	e398                	sd	a4,0(a5)
+}
+    80201d92:	0001                	nop
+    80201d94:	70a2                	ld	ra,40(sp)
+    80201d96:	7402                	ld	s0,32(sp)
+    80201d98:	6145                	addi	sp,sp,48
+    80201d9a:	8082                	ret
+
+0000000080201d9c <copyout>:
+// Copy from kernel to user.
+// Copy len bytes from src to virtual address dstva in a given page table.
+// Return 0 on success, -1 on error.
+int
+copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
+{
+    80201d9c:	715d                	addi	sp,sp,-80
+    80201d9e:	e486                	sd	ra,72(sp)
+    80201da0:	e0a2                	sd	s0,64(sp)
+    80201da2:	0880                	addi	s0,sp,80
+    80201da4:	fca43423          	sd	a0,-56(s0)
+    80201da8:	fcb43023          	sd	a1,-64(s0)
+    80201dac:	fac43c23          	sd	a2,-72(s0)
+    80201db0:	fad43823          	sd	a3,-80(s0)
+  uint64 n, va0, pa0;
+
+  while(len > 0){
+    80201db4:	a055                	j	80201e58 <copyout+0xbc>
+    va0 = PGROUNDDOWN(dstva);
+    80201db6:	fc043703          	ld	a4,-64(s0)
+    80201dba:	77fd                	lui	a5,0xfffff
+    80201dbc:	8ff9                	and	a5,a5,a4
+    80201dbe:	fef43023          	sd	a5,-32(s0)
+    pa0 = walkaddr(pagetable, va0);
+    80201dc2:	fe043583          	ld	a1,-32(s0)
+    80201dc6:	fc843503          	ld	a0,-56(s0)
+    80201dca:	fffff097          	auipc	ra,0xfffff
+    80201dce:	6d2080e7          	jalr	1746(ra) # 8020149c <walkaddr>
+    80201dd2:	fca43c23          	sd	a0,-40(s0)
+    if(pa0 == NULL)
+    80201dd6:	fd843783          	ld	a5,-40(s0)
+    80201dda:	e399                	bnez	a5,80201de0 <copyout+0x44>
+      return -1;
+    80201ddc:	57fd                	li	a5,-1
+    80201dde:	a049                	j	80201e60 <copyout+0xc4>
+    n = PGSIZE - (dstva - va0);
+    80201de0:	fe043703          	ld	a4,-32(s0)
+    80201de4:	fc043783          	ld	a5,-64(s0)
+    80201de8:	8f1d                	sub	a4,a4,a5
+    80201dea:	6785                	lui	a5,0x1
+    80201dec:	97ba                	add	a5,a5,a4
+    80201dee:	fef43423          	sd	a5,-24(s0)
+    if(n > len)
+    80201df2:	fe843703          	ld	a4,-24(s0)
+    80201df6:	fb043783          	ld	a5,-80(s0)
+    80201dfa:	00e7f663          	bgeu	a5,a4,80201e06 <copyout+0x6a>
+      n = len;
+    80201dfe:	fb043783          	ld	a5,-80(s0)
+    80201e02:	fef43423          	sd	a5,-24(s0)
+    memmove((void *)(pa0 + (dstva - va0)), src, n);
+    80201e06:	fc043703          	ld	a4,-64(s0)
+    80201e0a:	fe043783          	ld	a5,-32(s0)
+    80201e0e:	8f1d                	sub	a4,a4,a5
+    80201e10:	fd843783          	ld	a5,-40(s0)
+    80201e14:	97ba                	add	a5,a5,a4
+    80201e16:	873e                	mv	a4,a5
+    80201e18:	fe843783          	ld	a5,-24(s0)
+    80201e1c:	2781                	sext.w	a5,a5
+    80201e1e:	863e                	mv	a2,a5
+    80201e20:	fb843583          	ld	a1,-72(s0)
+    80201e24:	853a                	mv	a0,a4
+    80201e26:	fffff097          	auipc	ra,0xfffff
+    80201e2a:	da4080e7          	jalr	-604(ra) # 80200bca <memmove>
+
+    len -= n;
+    80201e2e:	fb043703          	ld	a4,-80(s0)
+    80201e32:	fe843783          	ld	a5,-24(s0)
+    80201e36:	40f707b3          	sub	a5,a4,a5
+    80201e3a:	faf43823          	sd	a5,-80(s0)
+    src += n;
+    80201e3e:	fb843703          	ld	a4,-72(s0)
+    80201e42:	fe843783          	ld	a5,-24(s0)
+    80201e46:	97ba                	add	a5,a5,a4
+    80201e48:	faf43c23          	sd	a5,-72(s0)
+    dstva = va0 + PGSIZE;
+    80201e4c:	fe043703          	ld	a4,-32(s0)
+    80201e50:	6785                	lui	a5,0x1
+    80201e52:	97ba                	add	a5,a5,a4
+    80201e54:	fcf43023          	sd	a5,-64(s0)
+  while(len > 0){
+    80201e58:	fb043783          	ld	a5,-80(s0)
+    80201e5c:	ffa9                	bnez	a5,80201db6 <copyout+0x1a>
+  }
+  return 0;
+    80201e5e:	4781                	li	a5,0
+}
+    80201e60:	853e                	mv	a0,a5
+    80201e62:	60a6                	ld	ra,72(sp)
+    80201e64:	6406                	ld	s0,64(sp)
+    80201e66:	6161                	addi	sp,sp,80
+    80201e68:	8082                	ret
+
+0000000080201e6a <copyout2>:
+
+int
+copyout2(uint64 dstva, char *src, uint64 len)
+{
+    80201e6a:	7139                	addi	sp,sp,-64
+    80201e6c:	fc06                	sd	ra,56(sp)
+    80201e6e:	f822                	sd	s0,48(sp)
+    80201e70:	0080                	addi	s0,sp,64
+    80201e72:	fca43c23          	sd	a0,-40(s0)
+    80201e76:	fcb43823          	sd	a1,-48(s0)
+    80201e7a:	fcc43423          	sd	a2,-56(s0)
+  uint64 sz = myproc()->sz;
+    80201e7e:	00001097          	auipc	ra,0x1
+    80201e82:	ae4080e7          	jalr	-1308(ra) # 80202962 <myproc>
+    80201e86:	87aa                	mv	a5,a0
+    80201e88:	67bc                	ld	a5,72(a5)
+    80201e8a:	fef43423          	sd	a5,-24(s0)
+  if (dstva + len > sz || dstva >= sz) {
+    80201e8e:	fd843703          	ld	a4,-40(s0)
+    80201e92:	fc843783          	ld	a5,-56(s0)
+    80201e96:	97ba                	add	a5,a5,a4
+    80201e98:	fe843703          	ld	a4,-24(s0)
+    80201e9c:	00f76863          	bltu	a4,a5,80201eac <copyout2+0x42>
+    80201ea0:	fd843703          	ld	a4,-40(s0)
+    80201ea4:	fe843783          	ld	a5,-24(s0)
+    80201ea8:	00f76463          	bltu	a4,a5,80201eb0 <copyout2+0x46>
+    return -1;
+    80201eac:	57fd                	li	a5,-1
+    80201eae:	a839                	j	80201ecc <copyout2+0x62>
+  }
+  memmove((void *)dstva, src, len);
+    80201eb0:	fd843783          	ld	a5,-40(s0)
+    80201eb4:	fc843703          	ld	a4,-56(s0)
+    80201eb8:	2701                	sext.w	a4,a4
+    80201eba:	863a                	mv	a2,a4
+    80201ebc:	fd043583          	ld	a1,-48(s0)
+    80201ec0:	853e                	mv	a0,a5
+    80201ec2:	fffff097          	auipc	ra,0xfffff
+    80201ec6:	d08080e7          	jalr	-760(ra) # 80200bca <memmove>
+  return 0;
+    80201eca:	4781                	li	a5,0
+}
+    80201ecc:	853e                	mv	a0,a5
+    80201ece:	70e2                	ld	ra,56(sp)
+    80201ed0:	7442                	ld	s0,48(sp)
+    80201ed2:	6121                	addi	sp,sp,64
+    80201ed4:	8082                	ret
+
+0000000080201ed6 <copyin>:
+// Copy from user to kernel.
+// Copy len bytes to dst from virtual address srcva in a given page table.
+// Return 0 on success, -1 on error.
+int
+copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
+{
+    80201ed6:	715d                	addi	sp,sp,-80
+    80201ed8:	e486                	sd	ra,72(sp)
+    80201eda:	e0a2                	sd	s0,64(sp)
+    80201edc:	0880                	addi	s0,sp,80
+    80201ede:	fca43423          	sd	a0,-56(s0)
+    80201ee2:	fcb43023          	sd	a1,-64(s0)
+    80201ee6:	fac43c23          	sd	a2,-72(s0)
+    80201eea:	fad43823          	sd	a3,-80(s0)
+  uint64 n, va0, pa0;
+
+  while(len > 0){
+    80201eee:	a055                	j	80201f92 <copyin+0xbc>
+    va0 = PGROUNDDOWN(srcva);
+    80201ef0:	fb843703          	ld	a4,-72(s0)
+    80201ef4:	77fd                	lui	a5,0xfffff
+    80201ef6:	8ff9                	and	a5,a5,a4
+    80201ef8:	fef43023          	sd	a5,-32(s0)
+    pa0 = walkaddr(pagetable, va0);
+    80201efc:	fe043583          	ld	a1,-32(s0)
+    80201f00:	fc843503          	ld	a0,-56(s0)
+    80201f04:	fffff097          	auipc	ra,0xfffff
+    80201f08:	598080e7          	jalr	1432(ra) # 8020149c <walkaddr>
+    80201f0c:	fca43c23          	sd	a0,-40(s0)
+    if(pa0 == NULL)
+    80201f10:	fd843783          	ld	a5,-40(s0)
+    80201f14:	e399                	bnez	a5,80201f1a <copyin+0x44>
+      return -1;
+    80201f16:	57fd                	li	a5,-1
+    80201f18:	a049                	j	80201f9a <copyin+0xc4>
+    n = PGSIZE - (srcva - va0);
+    80201f1a:	fe043703          	ld	a4,-32(s0)
+    80201f1e:	fb843783          	ld	a5,-72(s0)
+    80201f22:	8f1d                	sub	a4,a4,a5
+    80201f24:	6785                	lui	a5,0x1
+    80201f26:	97ba                	add	a5,a5,a4
+    80201f28:	fef43423          	sd	a5,-24(s0)
+    if(n > len)
+    80201f2c:	fe843703          	ld	a4,-24(s0)
+    80201f30:	fb043783          	ld	a5,-80(s0)
+    80201f34:	00e7f663          	bgeu	a5,a4,80201f40 <copyin+0x6a>
+      n = len;
+    80201f38:	fb043783          	ld	a5,-80(s0)
+    80201f3c:	fef43423          	sd	a5,-24(s0)
+    memmove(dst, (void *)(pa0 + (srcva - va0)), n);
+    80201f40:	fb843703          	ld	a4,-72(s0)
+    80201f44:	fe043783          	ld	a5,-32(s0)
+    80201f48:	8f1d                	sub	a4,a4,a5
+    80201f4a:	fd843783          	ld	a5,-40(s0)
+    80201f4e:	97ba                	add	a5,a5,a4
+    80201f50:	873e                	mv	a4,a5
+    80201f52:	fe843783          	ld	a5,-24(s0)
+    80201f56:	2781                	sext.w	a5,a5
+    80201f58:	863e                	mv	a2,a5
+    80201f5a:	85ba                	mv	a1,a4
+    80201f5c:	fc043503          	ld	a0,-64(s0)
+    80201f60:	fffff097          	auipc	ra,0xfffff
+    80201f64:	c6a080e7          	jalr	-918(ra) # 80200bca <memmove>
+
+    len -= n;
+    80201f68:	fb043703          	ld	a4,-80(s0)
+    80201f6c:	fe843783          	ld	a5,-24(s0)
+    80201f70:	40f707b3          	sub	a5,a4,a5
+    80201f74:	faf43823          	sd	a5,-80(s0)
+    dst += n;
+    80201f78:	fc043703          	ld	a4,-64(s0)
+    80201f7c:	fe843783          	ld	a5,-24(s0)
+    80201f80:	97ba                	add	a5,a5,a4
+    80201f82:	fcf43023          	sd	a5,-64(s0)
+    srcva = va0 + PGSIZE;
+    80201f86:	fe043703          	ld	a4,-32(s0)
+    80201f8a:	6785                	lui	a5,0x1
+    80201f8c:	97ba                	add	a5,a5,a4
+    80201f8e:	faf43c23          	sd	a5,-72(s0)
+  while(len > 0){
+    80201f92:	fb043783          	ld	a5,-80(s0)
+    80201f96:	ffa9                	bnez	a5,80201ef0 <copyin+0x1a>
+  }
+  return 0;
+    80201f98:	4781                	li	a5,0
+}
+    80201f9a:	853e                	mv	a0,a5
+    80201f9c:	60a6                	ld	ra,72(sp)
+    80201f9e:	6406                	ld	s0,64(sp)
+    80201fa0:	6161                	addi	sp,sp,80
+    80201fa2:	8082                	ret
+
+0000000080201fa4 <copyin2>:
+
+int
+copyin2(char *dst, uint64 srcva, uint64 len)
+{
+    80201fa4:	7139                	addi	sp,sp,-64
+    80201fa6:	fc06                	sd	ra,56(sp)
+    80201fa8:	f822                	sd	s0,48(sp)
+    80201faa:	0080                	addi	s0,sp,64
+    80201fac:	fca43c23          	sd	a0,-40(s0)
+    80201fb0:	fcb43823          	sd	a1,-48(s0)
+    80201fb4:	fcc43423          	sd	a2,-56(s0)
+  uint64 sz = myproc()->sz;
+    80201fb8:	00001097          	auipc	ra,0x1
+    80201fbc:	9aa080e7          	jalr	-1622(ra) # 80202962 <myproc>
+    80201fc0:	87aa                	mv	a5,a0
+    80201fc2:	67bc                	ld	a5,72(a5)
+    80201fc4:	fef43423          	sd	a5,-24(s0)
+  if (srcva + len > sz || srcva >= sz) {
+    80201fc8:	fd043703          	ld	a4,-48(s0)
+    80201fcc:	fc843783          	ld	a5,-56(s0)
+    80201fd0:	97ba                	add	a5,a5,a4
+    80201fd2:	fe843703          	ld	a4,-24(s0)
+    80201fd6:	00f76863          	bltu	a4,a5,80201fe6 <copyin2+0x42>
+    80201fda:	fd043703          	ld	a4,-48(s0)
+    80201fde:	fe843783          	ld	a5,-24(s0)
+    80201fe2:	00f76463          	bltu	a4,a5,80201fea <copyin2+0x46>
+    return -1;
+    80201fe6:	57fd                	li	a5,-1
+    80201fe8:	a839                	j	80202006 <copyin2+0x62>
+  }
+  memmove(dst, (void *)srcva, len);
+    80201fea:	fd043783          	ld	a5,-48(s0)
+    80201fee:	fc843703          	ld	a4,-56(s0)
+    80201ff2:	2701                	sext.w	a4,a4
+    80201ff4:	863a                	mv	a2,a4
+    80201ff6:	85be                	mv	a1,a5
+    80201ff8:	fd843503          	ld	a0,-40(s0)
+    80201ffc:	fffff097          	auipc	ra,0xfffff
+    80202000:	bce080e7          	jalr	-1074(ra) # 80200bca <memmove>
+  return 0;
+    80202004:	4781                	li	a5,0
+}
+    80202006:	853e                	mv	a0,a5
+    80202008:	70e2                	ld	ra,56(sp)
+    8020200a:	7442                	ld	s0,48(sp)
+    8020200c:	6121                	addi	sp,sp,64
+    8020200e:	8082                	ret
+
+0000000080202010 <copyinstr>:
+// Copy bytes to dst from virtual address srcva in a given page table,
+// until a '\0', or max.
+// Return 0 on success, -1 on error.
+int
+copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
+{
+    80202010:	711d                	addi	sp,sp,-96
+    80202012:	ec86                	sd	ra,88(sp)
+    80202014:	e8a2                	sd	s0,80(sp)
+    80202016:	1080                	addi	s0,sp,96
+    80202018:	faa43c23          	sd	a0,-72(s0)
+    8020201c:	fab43823          	sd	a1,-80(s0)
+    80202020:	fac43423          	sd	a2,-88(s0)
+    80202024:	fad43023          	sd	a3,-96(s0)
+  uint64 n, va0, pa0;
+  int got_null = 0;
+    80202028:	fe042223          	sw	zero,-28(s0)
+
+  while(got_null == 0 && max > 0){
+    8020202c:	a0f1                	j	802020f8 <copyinstr+0xe8>
+    va0 = PGROUNDDOWN(srcva);
+    8020202e:	fa843703          	ld	a4,-88(s0)
+    80202032:	77fd                	lui	a5,0xfffff
+    80202034:	8ff9                	and	a5,a5,a4
+    80202036:	fcf43823          	sd	a5,-48(s0)
+    pa0 = walkaddr(pagetable, va0);
+    8020203a:	fd043583          	ld	a1,-48(s0)
+    8020203e:	fb843503          	ld	a0,-72(s0)
+    80202042:	fffff097          	auipc	ra,0xfffff
+    80202046:	45a080e7          	jalr	1114(ra) # 8020149c <walkaddr>
+    8020204a:	fca43423          	sd	a0,-56(s0)
+    if(pa0 == NULL)
+    8020204e:	fc843783          	ld	a5,-56(s0)
+    80202052:	e399                	bnez	a5,80202058 <copyinstr+0x48>
+      return -1;
+    80202054:	57fd                	li	a5,-1
+    80202056:	a87d                	j	80202114 <copyinstr+0x104>
+    n = PGSIZE - (srcva - va0);
+    80202058:	fd043703          	ld	a4,-48(s0)
+    8020205c:	fa843783          	ld	a5,-88(s0)
+    80202060:	8f1d                	sub	a4,a4,a5
+    80202062:	6785                	lui	a5,0x1
+    80202064:	97ba                	add	a5,a5,a4
+    80202066:	fef43423          	sd	a5,-24(s0)
+    if(n > max)
+    8020206a:	fe843703          	ld	a4,-24(s0)
+    8020206e:	fa043783          	ld	a5,-96(s0)
+    80202072:	00e7f663          	bgeu	a5,a4,8020207e <copyinstr+0x6e>
+      n = max;
+    80202076:	fa043783          	ld	a5,-96(s0)
+    8020207a:	fef43423          	sd	a5,-24(s0)
+
+    char *p = (char *) (pa0 + (srcva - va0));
+    8020207e:	fa843703          	ld	a4,-88(s0)
+    80202082:	fd043783          	ld	a5,-48(s0)
+    80202086:	8f1d                	sub	a4,a4,a5
+    80202088:	fc843783          	ld	a5,-56(s0)
+    8020208c:	97ba                	add	a5,a5,a4
+    8020208e:	fcf43c23          	sd	a5,-40(s0)
+    while(n > 0){
+    80202092:	a891                	j	802020e6 <copyinstr+0xd6>
+      if(*p == '\0'){
+    80202094:	fd843783          	ld	a5,-40(s0)
+    80202098:	0007c783          	lbu	a5,0(a5) # 1000 <_entry-0x801ff000>
+    8020209c:	eb89                	bnez	a5,802020ae <copyinstr+0x9e>
+        *dst = '\0';
+    8020209e:	fb043783          	ld	a5,-80(s0)
+    802020a2:	00078023          	sb	zero,0(a5)
+        got_null = 1;
+    802020a6:	4785                	li	a5,1
+    802020a8:	fef42223          	sw	a5,-28(s0)
+        break;
+    802020ac:	a081                	j	802020ec <copyinstr+0xdc>
+      } else {
+        *dst = *p;
+    802020ae:	fd843783          	ld	a5,-40(s0)
+    802020b2:	0007c703          	lbu	a4,0(a5)
+    802020b6:	fb043783          	ld	a5,-80(s0)
+    802020ba:	00e78023          	sb	a4,0(a5)
+      }
+      --n;
+    802020be:	fe843783          	ld	a5,-24(s0)
+    802020c2:	17fd                	addi	a5,a5,-1
+    802020c4:	fef43423          	sd	a5,-24(s0)
+      --max;
+    802020c8:	fa043783          	ld	a5,-96(s0)
+    802020cc:	17fd                	addi	a5,a5,-1
+    802020ce:	faf43023          	sd	a5,-96(s0)
+      p++;
+    802020d2:	fd843783          	ld	a5,-40(s0)
+    802020d6:	0785                	addi	a5,a5,1
+    802020d8:	fcf43c23          	sd	a5,-40(s0)
+      dst++;
+    802020dc:	fb043783          	ld	a5,-80(s0)
+    802020e0:	0785                	addi	a5,a5,1
+    802020e2:	faf43823          	sd	a5,-80(s0)
+    while(n > 0){
+    802020e6:	fe843783          	ld	a5,-24(s0)
+    802020ea:	f7cd                	bnez	a5,80202094 <copyinstr+0x84>
+    }
+
+    srcva = va0 + PGSIZE;
+    802020ec:	fd043703          	ld	a4,-48(s0)
+    802020f0:	6785                	lui	a5,0x1
+    802020f2:	97ba                	add	a5,a5,a4
+    802020f4:	faf43423          	sd	a5,-88(s0)
+  while(got_null == 0 && max > 0){
+    802020f8:	fe442783          	lw	a5,-28(s0)
+    802020fc:	2781                	sext.w	a5,a5
+    802020fe:	e781                	bnez	a5,80202106 <copyinstr+0xf6>
+    80202100:	fa043783          	ld	a5,-96(s0)
+    80202104:	f78d                	bnez	a5,8020202e <copyinstr+0x1e>
+  }
+  if(got_null){
+    80202106:	fe442783          	lw	a5,-28(s0)
+    8020210a:	2781                	sext.w	a5,a5
+    8020210c:	c399                	beqz	a5,80202112 <copyinstr+0x102>
+    return 0;
+    8020210e:	4781                	li	a5,0
+    80202110:	a011                	j	80202114 <copyinstr+0x104>
+  } else {
+    return -1;
+    80202112:	57fd                	li	a5,-1
+  }
+}
+    80202114:	853e                	mv	a0,a5
+    80202116:	60e6                	ld	ra,88(sp)
+    80202118:	6446                	ld	s0,80(sp)
+    8020211a:	6125                	addi	sp,sp,96
+    8020211c:	8082                	ret
+
+000000008020211e <copyinstr2>:
+
+int
+copyinstr2(char *dst, uint64 srcva, uint64 max)
+{
+    8020211e:	715d                	addi	sp,sp,-80
+    80202120:	e486                	sd	ra,72(sp)
+    80202122:	e0a2                	sd	s0,64(sp)
+    80202124:	0880                	addi	s0,sp,80
+    80202126:	fca43423          	sd	a0,-56(s0)
+    8020212a:	fcb43023          	sd	a1,-64(s0)
+    8020212e:	fac43c23          	sd	a2,-72(s0)
+  int got_null = 0;
+    80202132:	fe042623          	sw	zero,-20(s0)
+  uint64 sz = myproc()->sz;
+    80202136:	00001097          	auipc	ra,0x1
+    8020213a:	82c080e7          	jalr	-2004(ra) # 80202962 <myproc>
+    8020213e:	87aa                	mv	a5,a0
+    80202140:	67bc                	ld	a5,72(a5)
+    80202142:	fef43023          	sd	a5,-32(s0)
+  while(srcva < sz && max > 0){
+    80202146:	a889                	j	80202198 <copyinstr2+0x7a>
+    char *p = (char *)srcva;
+    80202148:	fc043783          	ld	a5,-64(s0)
+    8020214c:	fcf43c23          	sd	a5,-40(s0)
+    if(*p == '\0'){
+    80202150:	fd843783          	ld	a5,-40(s0)
+    80202154:	0007c783          	lbu	a5,0(a5) # 1000 <_entry-0x801ff000>
+    80202158:	eb89                	bnez	a5,8020216a <copyinstr2+0x4c>
+      *dst = '\0';
+    8020215a:	fc843783          	ld	a5,-56(s0)
+    8020215e:	00078023          	sb	zero,0(a5)
+      got_null = 1;
+    80202162:	4785                	li	a5,1
+    80202164:	fef42623          	sw	a5,-20(s0)
+      break;
+    80202168:	a089                	j	802021aa <copyinstr2+0x8c>
+    } else {
+      *dst = *p;
+    8020216a:	fd843783          	ld	a5,-40(s0)
+    8020216e:	0007c703          	lbu	a4,0(a5)
+    80202172:	fc843783          	ld	a5,-56(s0)
+    80202176:	00e78023          	sb	a4,0(a5)
+    }
+    --max;
+    8020217a:	fb843783          	ld	a5,-72(s0)
+    8020217e:	17fd                	addi	a5,a5,-1
+    80202180:	faf43c23          	sd	a5,-72(s0)
+    srcva++;
+    80202184:	fc043783          	ld	a5,-64(s0)
+    80202188:	0785                	addi	a5,a5,1
+    8020218a:	fcf43023          	sd	a5,-64(s0)
+    dst++;
+    8020218e:	fc843783          	ld	a5,-56(s0)
+    80202192:	0785                	addi	a5,a5,1
+    80202194:	fcf43423          	sd	a5,-56(s0)
+  while(srcva < sz && max > 0){
+    80202198:	fc043703          	ld	a4,-64(s0)
+    8020219c:	fe043783          	ld	a5,-32(s0)
+    802021a0:	00f77563          	bgeu	a4,a5,802021aa <copyinstr2+0x8c>
+    802021a4:	fb843783          	ld	a5,-72(s0)
+    802021a8:	f3c5                	bnez	a5,80202148 <copyinstr2+0x2a>
+  }
+  if(got_null){
+    802021aa:	fec42783          	lw	a5,-20(s0)
+    802021ae:	2781                	sext.w	a5,a5
+    802021b0:	c399                	beqz	a5,802021b6 <copyinstr2+0x98>
+    return 0;
+    802021b2:	4781                	li	a5,0
+    802021b4:	a011                	j	802021b8 <copyinstr2+0x9a>
+  } else {
+    return -1;
+    802021b6:	57fd                	li	a5,-1
+  }
+}
+    802021b8:	853e                	mv	a0,a5
+    802021ba:	60a6                	ld	ra,72(sp)
+    802021bc:	6406                	ld	s0,64(sp)
+    802021be:	6161                	addi	sp,sp,80
+    802021c0:	8082                	ret
+
+00000000802021c2 <proc_kpagetable>:
+
+// initialize kernel pagetable for each process.
+pagetable_t
+proc_kpagetable()
+{
+    802021c2:	1101                	addi	sp,sp,-32
+    802021c4:	ec06                	sd	ra,24(sp)
+    802021c6:	e822                	sd	s0,16(sp)
+    802021c8:	1000                	addi	s0,sp,32
+  pagetable_t kpt = (pagetable_t) kalloc();
+    802021ca:	ffffe097          	auipc	ra,0xffffe
+    802021ce:	5c2080e7          	jalr	1474(ra) # 8020078c <kalloc>
+    802021d2:	fea43423          	sd	a0,-24(s0)
+  if (kpt == NULL)
+    802021d6:	fe843783          	ld	a5,-24(s0)
+    802021da:	e399                	bnez	a5,802021e0 <proc_kpagetable+0x1e>
+    return NULL;
+    802021dc:	4781                	li	a5,0
+    802021de:	a0b5                	j	8020224a <proc_kpagetable+0x88>
+  memmove(kpt, kernel_pagetable, PGSIZE);
+    802021e0:	00017797          	auipc	a5,0x17
+    802021e4:	e7878793          	addi	a5,a5,-392 # 80219058 <kernel_pagetable>
+    802021e8:	639c                	ld	a5,0(a5)
+    802021ea:	6605                	lui	a2,0x1
+    802021ec:	85be                	mv	a1,a5
+    802021ee:	fe843503          	ld	a0,-24(s0)
+    802021f2:	fffff097          	auipc	ra,0xfffff
+    802021f6:	9d8080e7          	jalr	-1576(ra) # 80200bca <memmove>
+
+  // remap stack and trampoline, because they share the same page table of level 1 and 0
+  char *pstack = kalloc();
+    802021fa:	ffffe097          	auipc	ra,0xffffe
+    802021fe:	592080e7          	jalr	1426(ra) # 8020078c <kalloc>
+    80202202:	fea43023          	sd	a0,-32(s0)
+  if(pstack == NULL)
+    80202206:	fe043783          	ld	a5,-32(s0)
+    8020220a:	c78d                	beqz	a5,80202234 <proc_kpagetable+0x72>
+    goto fail;
+  if (mappages(kpt, VKSTACK, PGSIZE, (uint64)pstack, PTE_R | PTE_W) != 0)
+    8020220c:	fe043783          	ld	a5,-32(s0)
+    80202210:	4719                	li	a4,6
+    80202212:	86be                	mv	a3,a5
+    80202214:	6605                	lui	a2,0x1
+    80202216:	0fb00793          	li	a5,251
+    8020221a:	01e79593          	slli	a1,a5,0x1e
+    8020221e:	fe843503          	ld	a0,-24(s0)
+    80202222:	fffff097          	auipc	ra,0xfffff
+    80202226:	404080e7          	jalr	1028(ra) # 80201626 <mappages>
+    8020222a:	87aa                	mv	a5,a0
+    8020222c:	e791                	bnez	a5,80202238 <proc_kpagetable+0x76>
+    goto fail;
+  
+  return kpt;
+    8020222e:	fe843783          	ld	a5,-24(s0)
+    80202232:	a821                	j	8020224a <proc_kpagetable+0x88>
+    goto fail;
+    80202234:	0001                	nop
+    80202236:	a011                	j	8020223a <proc_kpagetable+0x78>
+    goto fail;
+    80202238:	0001                	nop
+
+fail:
+  kvmfree(kpt, 1);
+    8020223a:	4585                	li	a1,1
+    8020223c:	fe843503          	ld	a0,-24(s0)
+    80202240:	00000097          	auipc	ra,0x0
+    80202244:	120080e7          	jalr	288(ra) # 80202360 <kvmfree>
+  return NULL;
+    80202248:	4781                	li	a5,0
+}
+    8020224a:	853e                	mv	a0,a5
+    8020224c:	60e2                	ld	ra,24(sp)
+    8020224e:	6442                	ld	s0,16(sp)
+    80202250:	6105                	addi	sp,sp,32
+    80202252:	8082                	ret
+
+0000000080202254 <kfreewalk>:
+
+// only free page table, not physical pages
+void
+kfreewalk(pagetable_t kpt)
+{
+    80202254:	7179                	addi	sp,sp,-48
+    80202256:	f406                	sd	ra,40(sp)
+    80202258:	f022                	sd	s0,32(sp)
+    8020225a:	1800                	addi	s0,sp,48
+    8020225c:	fca43c23          	sd	a0,-40(s0)
+  for (int i = 0; i < 512; i++) {
+    80202260:	fe042623          	sw	zero,-20(s0)
+    80202264:	a8a9                	j	802022be <kfreewalk+0x6a>
+    pte_t pte = kpt[i];
+    80202266:	fec42783          	lw	a5,-20(s0)
+    8020226a:	078e                	slli	a5,a5,0x3
+    8020226c:	fd843703          	ld	a4,-40(s0)
+    80202270:	97ba                	add	a5,a5,a4
+    80202272:	639c                	ld	a5,0(a5)
+    80202274:	fef43023          	sd	a5,-32(s0)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    80202278:	fe043783          	ld	a5,-32(s0)
+    8020227c:	8b85                	andi	a5,a5,1
+    8020227e:	c79d                	beqz	a5,802022ac <kfreewalk+0x58>
+    80202280:	fe043783          	ld	a5,-32(s0)
+    80202284:	8bb9                	andi	a5,a5,14
+    80202286:	e39d                	bnez	a5,802022ac <kfreewalk+0x58>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    80202288:	fe043783          	ld	a5,-32(s0)
+    8020228c:	83a9                	srli	a5,a5,0xa
+    8020228e:	07b2                	slli	a5,a5,0xc
+    80202290:	853e                	mv	a0,a5
+    80202292:	00000097          	auipc	ra,0x0
+    80202296:	fc2080e7          	jalr	-62(ra) # 80202254 <kfreewalk>
+      kpt[i] = 0;
+    8020229a:	fec42783          	lw	a5,-20(s0)
+    8020229e:	078e                	slli	a5,a5,0x3
+    802022a0:	fd843703          	ld	a4,-40(s0)
+    802022a4:	97ba                	add	a5,a5,a4
+    802022a6:	0007b023          	sd	zero,0(a5)
+    802022aa:	a029                	j	802022b4 <kfreewalk+0x60>
+    } else if (pte & PTE_V) {
+    802022ac:	fe043783          	ld	a5,-32(s0)
+    802022b0:	8b85                	andi	a5,a5,1
+    802022b2:	ef99                	bnez	a5,802022d0 <kfreewalk+0x7c>
+  for (int i = 0; i < 512; i++) {
+    802022b4:	fec42783          	lw	a5,-20(s0)
+    802022b8:	2785                	addiw	a5,a5,1
+    802022ba:	fef42623          	sw	a5,-20(s0)
+    802022be:	fec42783          	lw	a5,-20(s0)
+    802022c2:	0007871b          	sext.w	a4,a5
+    802022c6:	1ff00793          	li	a5,511
+    802022ca:	f8e7dee3          	bge	a5,a4,80202266 <kfreewalk+0x12>
+    802022ce:	a011                	j	802022d2 <kfreewalk+0x7e>
+      break;
+    802022d0:	0001                	nop
+    }
+  }
+  kfree((void *) kpt);
+    802022d2:	fd843503          	ld	a0,-40(s0)
+    802022d6:	ffffe097          	auipc	ra,0xffffe
+    802022da:	3f8080e7          	jalr	1016(ra) # 802006ce <kfree>
+}
+    802022de:	0001                	nop
+    802022e0:	70a2                	ld	ra,40(sp)
+    802022e2:	7402                	ld	s0,32(sp)
+    802022e4:	6145                	addi	sp,sp,48
+    802022e6:	8082                	ret
+
+00000000802022e8 <kvmfreeusr>:
+
+void
+kvmfreeusr(pagetable_t kpt)
+{
+    802022e8:	7179                	addi	sp,sp,-48
+    802022ea:	f406                	sd	ra,40(sp)
+    802022ec:	f022                	sd	s0,32(sp)
+    802022ee:	1800                	addi	s0,sp,48
+    802022f0:	fca43c23          	sd	a0,-40(s0)
+  pte_t pte;
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    802022f4:	fe042623          	sw	zero,-20(s0)
+    802022f8:	a881                	j	80202348 <kvmfreeusr+0x60>
+    pte = kpt[i];
+    802022fa:	fec42783          	lw	a5,-20(s0)
+    802022fe:	078e                	slli	a5,a5,0x3
+    80202300:	fd843703          	ld	a4,-40(s0)
+    80202304:	97ba                	add	a5,a5,a4
+    80202306:	639c                	ld	a5,0(a5)
+    80202308:	fef43023          	sd	a5,-32(s0)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    8020230c:	fe043783          	ld	a5,-32(s0)
+    80202310:	8b85                	andi	a5,a5,1
+    80202312:	c795                	beqz	a5,8020233e <kvmfreeusr+0x56>
+    80202314:	fe043783          	ld	a5,-32(s0)
+    80202318:	8bb9                	andi	a5,a5,14
+    8020231a:	e395                	bnez	a5,8020233e <kvmfreeusr+0x56>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    8020231c:	fe043783          	ld	a5,-32(s0)
+    80202320:	83a9                	srli	a5,a5,0xa
+    80202322:	07b2                	slli	a5,a5,0xc
+    80202324:	853e                	mv	a0,a5
+    80202326:	00000097          	auipc	ra,0x0
+    8020232a:	f2e080e7          	jalr	-210(ra) # 80202254 <kfreewalk>
+      kpt[i] = 0;
+    8020232e:	fec42783          	lw	a5,-20(s0)
+    80202332:	078e                	slli	a5,a5,0x3
+    80202334:	fd843703          	ld	a4,-40(s0)
+    80202338:	97ba                	add	a5,a5,a4
+    8020233a:	0007b023          	sd	zero,0(a5)
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    8020233e:	fec42783          	lw	a5,-20(s0)
+    80202342:	2785                	addiw	a5,a5,1
+    80202344:	fef42623          	sw	a5,-20(s0)
+    80202348:	fec42783          	lw	a5,-20(s0)
+    8020234c:	873e                	mv	a4,a5
+    8020234e:	4785                	li	a5,1
+    80202350:	fae7f5e3          	bgeu	a5,a4,802022fa <kvmfreeusr+0x12>
+    }
+  }
+}
+    80202354:	0001                	nop
+    80202356:	0001                	nop
+    80202358:	70a2                	ld	ra,40(sp)
+    8020235a:	7402                	ld	s0,32(sp)
+    8020235c:	6145                	addi	sp,sp,48
+    8020235e:	8082                	ret
+
+0000000080202360 <kvmfree>:
+
+void
+kvmfree(pagetable_t kpt, int stack_free)
+{
+    80202360:	7179                	addi	sp,sp,-48
+    80202362:	f406                	sd	ra,40(sp)
+    80202364:	f022                	sd	s0,32(sp)
+    80202366:	1800                	addi	s0,sp,48
+    80202368:	fca43c23          	sd	a0,-40(s0)
+    8020236c:	87ae                	mv	a5,a1
+    8020236e:	fcf42a23          	sw	a5,-44(s0)
+  if (stack_free) {
+    80202372:	fd442783          	lw	a5,-44(s0)
+    80202376:	2781                	sext.w	a5,a5
+    80202378:	c7a1                	beqz	a5,802023c0 <kvmfree+0x60>
+    vmunmap(kpt, VKSTACK, 1, 1);
+    8020237a:	4685                	li	a3,1
+    8020237c:	4605                	li	a2,1
+    8020237e:	0fb00793          	li	a5,251
+    80202382:	01e79593          	slli	a1,a5,0x1e
+    80202386:	fd843503          	ld	a0,-40(s0)
+    8020238a:	fffff097          	auipc	ra,0xfffff
+    8020238e:	364080e7          	jalr	868(ra) # 802016ee <vmunmap>
+    pte_t pte = kpt[PX(2, VKSTACK)];
+    80202392:	fd843783          	ld	a5,-40(s0)
+    80202396:	7d87b783          	ld	a5,2008(a5)
+    8020239a:	fef43423          	sd	a5,-24(s0)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    8020239e:	fe843783          	ld	a5,-24(s0)
+    802023a2:	8b85                	andi	a5,a5,1
+    802023a4:	cf91                	beqz	a5,802023c0 <kvmfree+0x60>
+    802023a6:	fe843783          	ld	a5,-24(s0)
+    802023aa:	8bb9                	andi	a5,a5,14
+    802023ac:	eb91                	bnez	a5,802023c0 <kvmfree+0x60>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    802023ae:	fe843783          	ld	a5,-24(s0)
+    802023b2:	83a9                	srli	a5,a5,0xa
+    802023b4:	07b2                	slli	a5,a5,0xc
+    802023b6:	853e                	mv	a0,a5
+    802023b8:	00000097          	auipc	ra,0x0
+    802023bc:	e9c080e7          	jalr	-356(ra) # 80202254 <kfreewalk>
+    }
+  }
+  kvmfreeusr(kpt);
+    802023c0:	fd843503          	ld	a0,-40(s0)
+    802023c4:	00000097          	auipc	ra,0x0
+    802023c8:	f24080e7          	jalr	-220(ra) # 802022e8 <kvmfreeusr>
+  kfree(kpt);
+    802023cc:	fd843503          	ld	a0,-40(s0)
+    802023d0:	ffffe097          	auipc	ra,0xffffe
+    802023d4:	2fe080e7          	jalr	766(ra) # 802006ce <kfree>
+}
+    802023d8:	0001                	nop
+    802023da:	70a2                	ld	ra,40(sp)
+    802023dc:	7402                	ld	s0,32(sp)
+    802023de:	6145                	addi	sp,sp,48
+    802023e0:	8082                	ret
+
+00000000802023e2 <vmprint>:
+
+void vmprint(pagetable_t pagetable)
+{
+    802023e2:	715d                	addi	sp,sp,-80
+    802023e4:	e486                	sd	ra,72(sp)
+    802023e6:	e0a2                	sd	s0,64(sp)
+    802023e8:	0880                	addi	s0,sp,80
+    802023ea:	faa43c23          	sd	a0,-72(s0)
+  const int capacity = 512;
+    802023ee:	20000793          	li	a5,512
+    802023f2:	fcf42a23          	sw	a5,-44(s0)
+  printf("page table %p\n", pagetable);
+    802023f6:	fb843583          	ld	a1,-72(s0)
+    802023fa:	0000b517          	auipc	a0,0xb
+    802023fe:	16650513          	addi	a0,a0,358 # 8020d560 <etext+0x560>
+    80202402:	ffffe097          	auipc	ra,0xffffe
+    80202406:	dec080e7          	jalr	-532(ra) # 802001ee <printf>
+  for (pte_t *pte = (pte_t *) pagetable; pte < pagetable + capacity; pte++) {
+    8020240a:	fb843783          	ld	a5,-72(s0)
+    8020240e:	fef43423          	sd	a5,-24(s0)
+    80202412:	a225                	j	8020253a <vmprint+0x158>
+    if (*pte & PTE_V)
+    80202414:	fe843783          	ld	a5,-24(s0)
+    80202418:	639c                	ld	a5,0(a5)
+    8020241a:	8b85                	andi	a5,a5,1
+    8020241c:	10078a63          	beqz	a5,80202530 <vmprint+0x14e>
+    {
+      pagetable_t pt2 = (pagetable_t) PTE2PA(*pte); 
+    80202420:	fe843783          	ld	a5,-24(s0)
+    80202424:	639c                	ld	a5,0(a5)
+    80202426:	83a9                	srli	a5,a5,0xa
+    80202428:	07b2                	slli	a5,a5,0xc
+    8020242a:	fcf43423          	sd	a5,-56(s0)
+      printf("..%d: pte %p pa %p\n", pte - pagetable, *pte, pt2);
+    8020242e:	fe843703          	ld	a4,-24(s0)
+    80202432:	fb843783          	ld	a5,-72(s0)
+    80202436:	40f707b3          	sub	a5,a4,a5
+    8020243a:	878d                	srai	a5,a5,0x3
+    8020243c:	873e                	mv	a4,a5
+    8020243e:	fe843783          	ld	a5,-24(s0)
+    80202442:	639c                	ld	a5,0(a5)
+    80202444:	fc843683          	ld	a3,-56(s0)
+    80202448:	863e                	mv	a2,a5
+    8020244a:	85ba                	mv	a1,a4
+    8020244c:	0000b517          	auipc	a0,0xb
+    80202450:	12450513          	addi	a0,a0,292 # 8020d570 <etext+0x570>
+    80202454:	ffffe097          	auipc	ra,0xffffe
+    80202458:	d9a080e7          	jalr	-614(ra) # 802001ee <printf>
+
+      for (pte_t *pte2 = (pte_t *) pt2; pte2 < pt2 + capacity; pte2++) {
+    8020245c:	fc843783          	ld	a5,-56(s0)
+    80202460:	fef43023          	sd	a5,-32(s0)
+    80202464:	a865                	j	8020251c <vmprint+0x13a>
+        if (*pte2 & PTE_V)
+    80202466:	fe043783          	ld	a5,-32(s0)
+    8020246a:	639c                	ld	a5,0(a5)
+    8020246c:	8b85                	andi	a5,a5,1
+    8020246e:	c3d5                	beqz	a5,80202512 <vmprint+0x130>
+        {
+          pagetable_t pt3 = (pagetable_t) PTE2PA(*pte2);
+    80202470:	fe043783          	ld	a5,-32(s0)
+    80202474:	639c                	ld	a5,0(a5)
+    80202476:	83a9                	srli	a5,a5,0xa
+    80202478:	07b2                	slli	a5,a5,0xc
+    8020247a:	fcf43023          	sd	a5,-64(s0)
+          printf(".. ..%d: pte %p pa %p\n", pte2 - pt2, *pte2, pt3);
+    8020247e:	fe043703          	ld	a4,-32(s0)
+    80202482:	fc843783          	ld	a5,-56(s0)
+    80202486:	40f707b3          	sub	a5,a4,a5
+    8020248a:	878d                	srai	a5,a5,0x3
+    8020248c:	873e                	mv	a4,a5
+    8020248e:	fe043783          	ld	a5,-32(s0)
+    80202492:	639c                	ld	a5,0(a5)
+    80202494:	fc043683          	ld	a3,-64(s0)
+    80202498:	863e                	mv	a2,a5
+    8020249a:	85ba                	mv	a1,a4
+    8020249c:	0000b517          	auipc	a0,0xb
+    802024a0:	0ec50513          	addi	a0,a0,236 # 8020d588 <etext+0x588>
+    802024a4:	ffffe097          	auipc	ra,0xffffe
+    802024a8:	d4a080e7          	jalr	-694(ra) # 802001ee <printf>
+
+          for (pte_t *pte3 = (pte_t *) pt3; pte3 < pt3 + capacity; pte3++)
+    802024ac:	fc043783          	ld	a5,-64(s0)
+    802024b0:	fcf43c23          	sd	a5,-40(s0)
+    802024b4:	a0a9                	j	802024fe <vmprint+0x11c>
+            if (*pte3 & PTE_V)
+    802024b6:	fd843783          	ld	a5,-40(s0)
+    802024ba:	639c                	ld	a5,0(a5)
+    802024bc:	8b85                	andi	a5,a5,1
+    802024be:	cb9d                	beqz	a5,802024f4 <vmprint+0x112>
+              printf(".. .. ..%d: pte %p pa %p\n", pte3 - pt3, *pte3, PTE2PA(*pte3));
+    802024c0:	fd843703          	ld	a4,-40(s0)
+    802024c4:	fc043783          	ld	a5,-64(s0)
+    802024c8:	40f707b3          	sub	a5,a4,a5
+    802024cc:	878d                	srai	a5,a5,0x3
+    802024ce:	85be                	mv	a1,a5
+    802024d0:	fd843783          	ld	a5,-40(s0)
+    802024d4:	6398                	ld	a4,0(a5)
+    802024d6:	fd843783          	ld	a5,-40(s0)
+    802024da:	639c                	ld	a5,0(a5)
+    802024dc:	83a9                	srli	a5,a5,0xa
+    802024de:	07b2                	slli	a5,a5,0xc
+    802024e0:	86be                	mv	a3,a5
+    802024e2:	863a                	mv	a2,a4
+    802024e4:	0000b517          	auipc	a0,0xb
+    802024e8:	0bc50513          	addi	a0,a0,188 # 8020d5a0 <etext+0x5a0>
+    802024ec:	ffffe097          	auipc	ra,0xffffe
+    802024f0:	d02080e7          	jalr	-766(ra) # 802001ee <printf>
+          for (pte_t *pte3 = (pte_t *) pt3; pte3 < pt3 + capacity; pte3++)
+    802024f4:	fd843783          	ld	a5,-40(s0)
+    802024f8:	07a1                	addi	a5,a5,8
+    802024fa:	fcf43c23          	sd	a5,-40(s0)
+    802024fe:	fd442783          	lw	a5,-44(s0)
+    80202502:	078e                	slli	a5,a5,0x3
+    80202504:	fc043703          	ld	a4,-64(s0)
+    80202508:	97ba                	add	a5,a5,a4
+    8020250a:	fd843703          	ld	a4,-40(s0)
+    8020250e:	faf764e3          	bltu	a4,a5,802024b6 <vmprint+0xd4>
+      for (pte_t *pte2 = (pte_t *) pt2; pte2 < pt2 + capacity; pte2++) {
+    80202512:	fe043783          	ld	a5,-32(s0)
+    80202516:	07a1                	addi	a5,a5,8
+    80202518:	fef43023          	sd	a5,-32(s0)
+    8020251c:	fd442783          	lw	a5,-44(s0)
+    80202520:	078e                	slli	a5,a5,0x3
+    80202522:	fc843703          	ld	a4,-56(s0)
+    80202526:	97ba                	add	a5,a5,a4
+    80202528:	fe043703          	ld	a4,-32(s0)
+    8020252c:	f2f76de3          	bltu	a4,a5,80202466 <vmprint+0x84>
+  for (pte_t *pte = (pte_t *) pagetable; pte < pagetable + capacity; pte++) {
+    80202530:	fe843783          	ld	a5,-24(s0)
+    80202534:	07a1                	addi	a5,a5,8
+    80202536:	fef43423          	sd	a5,-24(s0)
+    8020253a:	fd442783          	lw	a5,-44(s0)
+    8020253e:	078e                	slli	a5,a5,0x3
+    80202540:	fb843703          	ld	a4,-72(s0)
+    80202544:	97ba                	add	a5,a5,a4
+    80202546:	fe843703          	ld	a4,-24(s0)
+    8020254a:	ecf765e3          	bltu	a4,a5,80202414 <vmprint+0x32>
+        }
+      }
+    }
+  }
+  return;
+    8020254e:	0001                	nop
+    80202550:	60a6                	ld	ra,72(sp)
+    80202552:	6406                	ld	s0,64(sp)
+    80202554:	6161                	addi	sp,sp,80
+    80202556:	8082                	ret
+
+0000000080202558 <r_sstatus>:
+{
+    80202558:	1101                	addi	sp,sp,-32
+    8020255a:	ec22                	sd	s0,24(sp)
+    8020255c:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    8020255e:	100027f3          	csrr	a5,sstatus
+    80202562:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80202566:	fe843783          	ld	a5,-24(s0)
+}
+    8020256a:	853e                	mv	a0,a5
+    8020256c:	6462                	ld	s0,24(sp)
+    8020256e:	6105                	addi	sp,sp,32
+    80202570:	8082                	ret
+
+0000000080202572 <w_sstatus>:
+{
+    80202572:	1101                	addi	sp,sp,-32
+    80202574:	ec22                	sd	s0,24(sp)
+    80202576:	1000                	addi	s0,sp,32
+    80202578:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    8020257c:	fe843783          	ld	a5,-24(s0)
+    80202580:	10079073          	csrw	sstatus,a5
+}
+    80202584:	0001                	nop
+    80202586:	6462                	ld	s0,24(sp)
+    80202588:	6105                	addi	sp,sp,32
+    8020258a:	8082                	ret
+
+000000008020258c <r_sip>:
+{
+    8020258c:	1101                	addi	sp,sp,-32
+    8020258e:	ec22                	sd	s0,24(sp)
+    80202590:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sip" : "=r" (x) );
+    80202592:	144027f3          	csrr	a5,sip
+    80202596:	fef43423          	sd	a5,-24(s0)
+  return x;
+    8020259a:	fe843783          	ld	a5,-24(s0)
+}
+    8020259e:	853e                	mv	a0,a5
+    802025a0:	6462                	ld	s0,24(sp)
+    802025a2:	6105                	addi	sp,sp,32
+    802025a4:	8082                	ret
+
+00000000802025a6 <r_sie>:
+{
+    802025a6:	1101                	addi	sp,sp,-32
+    802025a8:	ec22                	sd	s0,24(sp)
+    802025aa:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sie" : "=r" (x) );
+    802025ac:	104027f3          	csrr	a5,sie
+    802025b0:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802025b4:	fe843783          	ld	a5,-24(s0)
+}
+    802025b8:	853e                	mv	a0,a5
+    802025ba:	6462                	ld	s0,24(sp)
+    802025bc:	6105                	addi	sp,sp,32
+    802025be:	8082                	ret
+
+00000000802025c0 <r_sepc>:
+{
+    802025c0:	1101                	addi	sp,sp,-32
+    802025c2:	ec22                	sd	s0,24(sp)
+    802025c4:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    802025c6:	141027f3          	csrr	a5,sepc
+    802025ca:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802025ce:	fe843783          	ld	a5,-24(s0)
+}
+    802025d2:	853e                	mv	a0,a5
+    802025d4:	6462                	ld	s0,24(sp)
+    802025d6:	6105                	addi	sp,sp,32
+    802025d8:	8082                	ret
+
+00000000802025da <r_stvec>:
+{
+    802025da:	1101                	addi	sp,sp,-32
+    802025dc:	ec22                	sd	s0,24(sp)
+    802025de:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, stvec" : "=r" (x) );
+    802025e0:	105027f3          	csrr	a5,stvec
+    802025e4:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802025e8:	fe843783          	ld	a5,-24(s0)
+}
+    802025ec:	853e                	mv	a0,a5
+    802025ee:	6462                	ld	s0,24(sp)
+    802025f0:	6105                	addi	sp,sp,32
+    802025f2:	8082                	ret
+
+00000000802025f4 <w_satp>:
+{
+    802025f4:	1101                	addi	sp,sp,-32
+    802025f6:	ec22                	sd	s0,24(sp)
+    802025f8:	1000                	addi	s0,sp,32
+    802025fa:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw satp, %0" : : "r" (x));
+    802025fe:	fe843783          	ld	a5,-24(s0)
+    80202602:	18079073          	csrw	satp,a5
+}
+    80202606:	0001                	nop
+    80202608:	6462                	ld	s0,24(sp)
+    8020260a:	6105                	addi	sp,sp,32
+    8020260c:	8082                	ret
+
+000000008020260e <r_satp>:
+{
+    8020260e:	1101                	addi	sp,sp,-32
+    80202610:	ec22                	sd	s0,24(sp)
+    80202612:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, satp" : "=r" (x) );
+    80202614:	180027f3          	csrr	a5,satp
+    80202618:	fef43423          	sd	a5,-24(s0)
+  return x;
+    8020261c:	fe843783          	ld	a5,-24(s0)
+}
+    80202620:	853e                	mv	a0,a5
+    80202622:	6462                	ld	s0,24(sp)
+    80202624:	6105                	addi	sp,sp,32
+    80202626:	8082                	ret
+
+0000000080202628 <r_scause>:
+{
+    80202628:	1101                	addi	sp,sp,-32
+    8020262a:	ec22                	sd	s0,24(sp)
+    8020262c:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    8020262e:	142027f3          	csrr	a5,scause
+    80202632:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80202636:	fe843783          	ld	a5,-24(s0)
+}
+    8020263a:	853e                	mv	a0,a5
+    8020263c:	6462                	ld	s0,24(sp)
+    8020263e:	6105                	addi	sp,sp,32
+    80202640:	8082                	ret
+
+0000000080202642 <r_stval>:
+{
+    80202642:	1101                	addi	sp,sp,-32
+    80202644:	ec22                	sd	s0,24(sp)
+    80202646:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, stval" : "=r" (x) );
+    80202648:	143027f3          	csrr	a5,stval
+    8020264c:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80202650:	fe843783          	ld	a5,-24(s0)
+}
+    80202654:	853e                	mv	a0,a5
+    80202656:	6462                	ld	s0,24(sp)
+    80202658:	6105                	addi	sp,sp,32
+    8020265a:	8082                	ret
+
+000000008020265c <intr_on>:
+{
+    8020265c:	1141                	addi	sp,sp,-16
+    8020265e:	e406                	sd	ra,8(sp)
+    80202660:	e022                	sd	s0,0(sp)
+    80202662:	0800                	addi	s0,sp,16
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    80202664:	00000097          	auipc	ra,0x0
+    80202668:	ef4080e7          	jalr	-268(ra) # 80202558 <r_sstatus>
+    8020266c:	87aa                	mv	a5,a0
+    8020266e:	0027e793          	ori	a5,a5,2
+    80202672:	853e                	mv	a0,a5
+    80202674:	00000097          	auipc	ra,0x0
+    80202678:	efe080e7          	jalr	-258(ra) # 80202572 <w_sstatus>
+}
+    8020267c:	0001                	nop
+    8020267e:	60a2                	ld	ra,8(sp)
+    80202680:	6402                	ld	s0,0(sp)
+    80202682:	0141                	addi	sp,sp,16
+    80202684:	8082                	ret
+
+0000000080202686 <intr_get>:
+{
+    80202686:	1101                	addi	sp,sp,-32
+    80202688:	ec06                	sd	ra,24(sp)
+    8020268a:	e822                	sd	s0,16(sp)
+    8020268c:	1000                	addi	s0,sp,32
+  uint64 x = r_sstatus();
+    8020268e:	00000097          	auipc	ra,0x0
+    80202692:	eca080e7          	jalr	-310(ra) # 80202558 <r_sstatus>
+    80202696:	fea43423          	sd	a0,-24(s0)
+  return (x & SSTATUS_SIE) != 0;
+    8020269a:	fe843783          	ld	a5,-24(s0)
+    8020269e:	8b89                	andi	a5,a5,2
+    802026a0:	00f037b3          	snez	a5,a5
+    802026a4:	0ff7f793          	andi	a5,a5,255
+    802026a8:	2781                	sext.w	a5,a5
+}
+    802026aa:	853e                	mv	a0,a5
+    802026ac:	60e2                	ld	ra,24(sp)
+    802026ae:	6442                	ld	s0,16(sp)
+    802026b0:	6105                	addi	sp,sp,32
+    802026b2:	8082                	ret
+
+00000000802026b4 <r_sp>:
+{
+    802026b4:	1101                	addi	sp,sp,-32
+    802026b6:	ec22                	sd	s0,24(sp)
+    802026b8:	1000                	addi	s0,sp,32
+  asm volatile("mv %0, sp" : "=r" (x) );
+    802026ba:	878a                	mv	a5,sp
+    802026bc:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802026c0:	fe843783          	ld	a5,-24(s0)
+}
+    802026c4:	853e                	mv	a0,a5
+    802026c6:	6462                	ld	s0,24(sp)
+    802026c8:	6105                	addi	sp,sp,32
+    802026ca:	8082                	ret
+
+00000000802026cc <r_tp>:
+{
+    802026cc:	1101                	addi	sp,sp,-32
+    802026ce:	ec22                	sd	s0,24(sp)
+    802026d0:	1000                	addi	s0,sp,32
+  asm volatile("mv %0, tp" : "=r" (x) );
+    802026d2:	8792                	mv	a5,tp
+    802026d4:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802026d8:	fe843783          	ld	a5,-24(s0)
+}
+    802026dc:	853e                	mv	a0,a5
+    802026de:	6462                	ld	s0,24(sp)
+    802026e0:	6105                	addi	sp,sp,32
+    802026e2:	8082                	ret
+
+00000000802026e4 <r_ra>:
+{
+    802026e4:	1101                	addi	sp,sp,-32
+    802026e6:	ec22                	sd	s0,24(sp)
+    802026e8:	1000                	addi	s0,sp,32
+  asm volatile("mv %0, ra" : "=r" (x) );
+    802026ea:	8786                	mv	a5,ra
+    802026ec:	fef43423          	sd	a5,-24(s0)
+  return x;
+    802026f0:	fe843783          	ld	a5,-24(s0)
+}
+    802026f4:	853e                	mv	a0,a5
+    802026f6:	6462                	ld	s0,24(sp)
+    802026f8:	6105                	addi	sp,sp,32
+    802026fa:	8082                	ret
+
+00000000802026fc <sfence_vma>:
+{
+    802026fc:	1141                	addi	sp,sp,-16
+    802026fe:	e422                	sd	s0,8(sp)
+    80202700:	0800                	addi	s0,sp,16
+  asm volatile("sfence.vma");
+    80202702:	12000073          	sfence.vma
+}
+    80202706:	0001                	nop
+    80202708:	6422                	ld	s0,8(sp)
+    8020270a:	0141                	addi	sp,sp,16
+    8020270c:	8082                	ret
+
+000000008020270e <reg_info>:
+static void wakeup1(struct proc *chan);
+static void freeproc(struct proc *p);
+
+extern char trampoline[]; // trampoline.S
+
+void reg_info(void) {
+    8020270e:	1141                	addi	sp,sp,-16
+    80202710:	e406                	sd	ra,8(sp)
+    80202712:	e022                	sd	s0,0(sp)
+    80202714:	0800                	addi	s0,sp,16
+  printf("register info: {\n");
+    80202716:	0000b517          	auipc	a0,0xb
+    8020271a:	eaa50513          	addi	a0,a0,-342 # 8020d5c0 <etext+0x5c0>
+    8020271e:	ffffe097          	auipc	ra,0xffffe
+    80202722:	ad0080e7          	jalr	-1328(ra) # 802001ee <printf>
+  printf("sstatus: %p\n", r_sstatus());
+    80202726:	00000097          	auipc	ra,0x0
+    8020272a:	e32080e7          	jalr	-462(ra) # 80202558 <r_sstatus>
+    8020272e:	87aa                	mv	a5,a0
+    80202730:	85be                	mv	a1,a5
+    80202732:	0000b517          	auipc	a0,0xb
+    80202736:	ea650513          	addi	a0,a0,-346 # 8020d5d8 <etext+0x5d8>
+    8020273a:	ffffe097          	auipc	ra,0xffffe
+    8020273e:	ab4080e7          	jalr	-1356(ra) # 802001ee <printf>
+  printf("sip: %p\n", r_sip());
+    80202742:	00000097          	auipc	ra,0x0
+    80202746:	e4a080e7          	jalr	-438(ra) # 8020258c <r_sip>
+    8020274a:	87aa                	mv	a5,a0
+    8020274c:	85be                	mv	a1,a5
+    8020274e:	0000b517          	auipc	a0,0xb
+    80202752:	e9a50513          	addi	a0,a0,-358 # 8020d5e8 <etext+0x5e8>
+    80202756:	ffffe097          	auipc	ra,0xffffe
+    8020275a:	a98080e7          	jalr	-1384(ra) # 802001ee <printf>
+  printf("sie: %p\n", r_sie());
+    8020275e:	00000097          	auipc	ra,0x0
+    80202762:	e48080e7          	jalr	-440(ra) # 802025a6 <r_sie>
+    80202766:	87aa                	mv	a5,a0
+    80202768:	85be                	mv	a1,a5
+    8020276a:	0000b517          	auipc	a0,0xb
+    8020276e:	e8e50513          	addi	a0,a0,-370 # 8020d5f8 <etext+0x5f8>
+    80202772:	ffffe097          	auipc	ra,0xffffe
+    80202776:	a7c080e7          	jalr	-1412(ra) # 802001ee <printf>
+  printf("sepc: %p\n", r_sepc());
+    8020277a:	00000097          	auipc	ra,0x0
+    8020277e:	e46080e7          	jalr	-442(ra) # 802025c0 <r_sepc>
+    80202782:	87aa                	mv	a5,a0
+    80202784:	85be                	mv	a1,a5
+    80202786:	0000b517          	auipc	a0,0xb
+    8020278a:	e8250513          	addi	a0,a0,-382 # 8020d608 <etext+0x608>
+    8020278e:	ffffe097          	auipc	ra,0xffffe
+    80202792:	a60080e7          	jalr	-1440(ra) # 802001ee <printf>
+  printf("stvec: %p\n", r_stvec());
+    80202796:	00000097          	auipc	ra,0x0
+    8020279a:	e44080e7          	jalr	-444(ra) # 802025da <r_stvec>
+    8020279e:	87aa                	mv	a5,a0
+    802027a0:	85be                	mv	a1,a5
+    802027a2:	0000b517          	auipc	a0,0xb
+    802027a6:	e7650513          	addi	a0,a0,-394 # 8020d618 <etext+0x618>
+    802027aa:	ffffe097          	auipc	ra,0xffffe
+    802027ae:	a44080e7          	jalr	-1468(ra) # 802001ee <printf>
+  printf("satp: %p\n", r_satp());
+    802027b2:	00000097          	auipc	ra,0x0
+    802027b6:	e5c080e7          	jalr	-420(ra) # 8020260e <r_satp>
+    802027ba:	87aa                	mv	a5,a0
+    802027bc:	85be                	mv	a1,a5
+    802027be:	0000b517          	auipc	a0,0xb
+    802027c2:	e6a50513          	addi	a0,a0,-406 # 8020d628 <etext+0x628>
+    802027c6:	ffffe097          	auipc	ra,0xffffe
+    802027ca:	a28080e7          	jalr	-1496(ra) # 802001ee <printf>
+  printf("scause: %p\n", r_scause());
+    802027ce:	00000097          	auipc	ra,0x0
+    802027d2:	e5a080e7          	jalr	-422(ra) # 80202628 <r_scause>
+    802027d6:	87aa                	mv	a5,a0
+    802027d8:	85be                	mv	a1,a5
+    802027da:	0000b517          	auipc	a0,0xb
+    802027de:	e5e50513          	addi	a0,a0,-418 # 8020d638 <etext+0x638>
+    802027e2:	ffffe097          	auipc	ra,0xffffe
+    802027e6:	a0c080e7          	jalr	-1524(ra) # 802001ee <printf>
+  printf("stval: %p\n", r_stval());
+    802027ea:	00000097          	auipc	ra,0x0
+    802027ee:	e58080e7          	jalr	-424(ra) # 80202642 <r_stval>
+    802027f2:	87aa                	mv	a5,a0
+    802027f4:	85be                	mv	a1,a5
+    802027f6:	0000b517          	auipc	a0,0xb
+    802027fa:	e5250513          	addi	a0,a0,-430 # 8020d648 <etext+0x648>
+    802027fe:	ffffe097          	auipc	ra,0xffffe
+    80202802:	9f0080e7          	jalr	-1552(ra) # 802001ee <printf>
+  printf("sp: %p\n", r_sp());
+    80202806:	00000097          	auipc	ra,0x0
+    8020280a:	eae080e7          	jalr	-338(ra) # 802026b4 <r_sp>
+    8020280e:	87aa                	mv	a5,a0
+    80202810:	85be                	mv	a1,a5
+    80202812:	0000b517          	auipc	a0,0xb
+    80202816:	e4650513          	addi	a0,a0,-442 # 8020d658 <etext+0x658>
+    8020281a:	ffffe097          	auipc	ra,0xffffe
+    8020281e:	9d4080e7          	jalr	-1580(ra) # 802001ee <printf>
+  printf("tp: %p\n", r_tp());
+    80202822:	00000097          	auipc	ra,0x0
+    80202826:	eaa080e7          	jalr	-342(ra) # 802026cc <r_tp>
+    8020282a:	87aa                	mv	a5,a0
+    8020282c:	85be                	mv	a1,a5
+    8020282e:	0000b517          	auipc	a0,0xb
+    80202832:	e3250513          	addi	a0,a0,-462 # 8020d660 <etext+0x660>
+    80202836:	ffffe097          	auipc	ra,0xffffe
+    8020283a:	9b8080e7          	jalr	-1608(ra) # 802001ee <printf>
+  printf("ra: %p\n", r_ra());
+    8020283e:	00000097          	auipc	ra,0x0
+    80202842:	ea6080e7          	jalr	-346(ra) # 802026e4 <r_ra>
+    80202846:	87aa                	mv	a5,a0
+    80202848:	85be                	mv	a1,a5
+    8020284a:	0000b517          	auipc	a0,0xb
+    8020284e:	e1e50513          	addi	a0,a0,-482 # 8020d668 <etext+0x668>
+    80202852:	ffffe097          	auipc	ra,0xffffe
+    80202856:	99c080e7          	jalr	-1636(ra) # 802001ee <printf>
+  printf("}\n");
+    8020285a:	0000b517          	auipc	a0,0xb
+    8020285e:	e1650513          	addi	a0,a0,-490 # 8020d670 <etext+0x670>
+    80202862:	ffffe097          	auipc	ra,0xffffe
+    80202866:	98c080e7          	jalr	-1652(ra) # 802001ee <printf>
+}
+    8020286a:	0001                	nop
+    8020286c:	60a2                	ld	ra,8(sp)
+    8020286e:	6402                	ld	s0,0(sp)
+    80202870:	0141                	addi	sp,sp,16
+    80202872:	8082                	ret
+
+0000000080202874 <procinit>:
+
+// initialize the proc table at boot time.
+void
+procinit(void)
+{
+    80202874:	1101                	addi	sp,sp,-32
+    80202876:	ec06                	sd	ra,24(sp)
+    80202878:	e822                	sd	s0,16(sp)
+    8020287a:	1000                	addi	s0,sp,32
+  struct proc *p;
+  
+  initlock(&pid_lock, "nextpid");
+    8020287c:	0000b597          	auipc	a1,0xb
+    80202880:	dfc58593          	addi	a1,a1,-516 # 8020d678 <etext+0x678>
+    80202884:	0001c517          	auipc	a0,0x1c
+    80202888:	89450513          	addi	a0,a0,-1900 # 8021e118 <pid_lock>
+    8020288c:	ffffe097          	auipc	ra,0xffffe
+    80202890:	12c080e7          	jalr	300(ra) # 802009b8 <initlock>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    80202894:	00017797          	auipc	a5,0x17
+    80202898:	8cc78793          	addi	a5,a5,-1844 # 80219160 <proc>
+    8020289c:	fef43423          	sd	a5,-24(s0)
+    802028a0:	a015                	j	802028c4 <procinit+0x50>
+      initlock(&p->lock, "proc");
+    802028a2:	fe843783          	ld	a5,-24(s0)
+    802028a6:	0000b597          	auipc	a1,0xb
+    802028aa:	dda58593          	addi	a1,a1,-550 # 8020d680 <etext+0x680>
+    802028ae:	853e                	mv	a0,a5
+    802028b0:	ffffe097          	auipc	ra,0xffffe
+    802028b4:	108080e7          	jalr	264(ra) # 802009b8 <initlock>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802028b8:	fe843783          	ld	a5,-24(s0)
+    802028bc:	19878793          	addi	a5,a5,408
+    802028c0:	fef43423          	sd	a5,-24(s0)
+    802028c4:	fe843703          	ld	a4,-24(s0)
+    802028c8:	0001c797          	auipc	a5,0x1c
+    802028cc:	84878793          	addi	a5,a5,-1976 # 8021e110 <initproc>
+    802028d0:	fcf769e3          	bltu	a4,a5,802028a2 <procinit+0x2e>
+      // kvmmap(va, (uint64)pa, PGSIZE, PTE_R | PTE_W);
+      // p->kstack = va;
+  }
+  //kvminithart();
+
+  memset(cpus, 0, sizeof(cpus));
+    802028d4:	10000613          	li	a2,256
+    802028d8:	4581                	li	a1,0
+    802028da:	00016517          	auipc	a0,0x16
+    802028de:	78650513          	addi	a0,a0,1926 # 80219060 <cpus>
+    802028e2:	ffffe097          	auipc	ra,0xffffe
+    802028e6:	204080e7          	jalr	516(ra) # 80200ae6 <memset>
+  #ifdef DEBUG
+  printf("procinit\n");
+    802028ea:	0000b517          	auipc	a0,0xb
+    802028ee:	d9e50513          	addi	a0,a0,-610 # 8020d688 <etext+0x688>
+    802028f2:	ffffe097          	auipc	ra,0xffffe
+    802028f6:	8fc080e7          	jalr	-1796(ra) # 802001ee <printf>
+  #endif
+}
+    802028fa:	0001                	nop
+    802028fc:	60e2                	ld	ra,24(sp)
+    802028fe:	6442                	ld	s0,16(sp)
+    80202900:	6105                	addi	sp,sp,32
+    80202902:	8082                	ret
+
+0000000080202904 <cpuid>:
+// Must be called with interrupts disabled,
+// to prevent race with process being moved
+// to a different CPU.
+int
+cpuid()
+{
+    80202904:	1101                	addi	sp,sp,-32
+    80202906:	ec06                	sd	ra,24(sp)
+    80202908:	e822                	sd	s0,16(sp)
+    8020290a:	1000                	addi	s0,sp,32
+  int id = r_tp();
+    8020290c:	00000097          	auipc	ra,0x0
+    80202910:	dc0080e7          	jalr	-576(ra) # 802026cc <r_tp>
+    80202914:	87aa                	mv	a5,a0
+    80202916:	fef42623          	sw	a5,-20(s0)
+  return id;
+    8020291a:	fec42783          	lw	a5,-20(s0)
+}
+    8020291e:	853e                	mv	a0,a5
+    80202920:	60e2                	ld	ra,24(sp)
+    80202922:	6442                	ld	s0,16(sp)
+    80202924:	6105                	addi	sp,sp,32
+    80202926:	8082                	ret
+
+0000000080202928 <mycpu>:
+
+// Return this CPU's cpu struct.
+// Interrupts must be disabled.
+struct cpu*
+mycpu(void) {
+    80202928:	1101                	addi	sp,sp,-32
+    8020292a:	ec06                	sd	ra,24(sp)
+    8020292c:	e822                	sd	s0,16(sp)
+    8020292e:	1000                	addi	s0,sp,32
+  int id = cpuid();
+    80202930:	00000097          	auipc	ra,0x0
+    80202934:	fd4080e7          	jalr	-44(ra) # 80202904 <cpuid>
+    80202938:	87aa                	mv	a5,a0
+    8020293a:	fef42623          	sw	a5,-20(s0)
+  struct cpu *c = &cpus[id];
+    8020293e:	fec42783          	lw	a5,-20(s0)
+    80202942:	00779713          	slli	a4,a5,0x7
+    80202946:	00016797          	auipc	a5,0x16
+    8020294a:	71a78793          	addi	a5,a5,1818 # 80219060 <cpus>
+    8020294e:	97ba                	add	a5,a5,a4
+    80202950:	fef43023          	sd	a5,-32(s0)
+  
+  return c;
+    80202954:	fe043783          	ld	a5,-32(s0)
+}
+    80202958:	853e                	mv	a0,a5
+    8020295a:	60e2                	ld	ra,24(sp)
+    8020295c:	6442                	ld	s0,16(sp)
+    8020295e:	6105                	addi	sp,sp,32
+    80202960:	8082                	ret
+
+0000000080202962 <myproc>:
+
+// Return the current struct proc *, or zero if none.
+struct proc*
+myproc(void) {
+    80202962:	1101                	addi	sp,sp,-32
+    80202964:	ec06                	sd	ra,24(sp)
+    80202966:	e822                	sd	s0,16(sp)
+    80202968:	1000                	addi	s0,sp,32
+  push_off();
+    8020296a:	ffffe097          	auipc	ra,0xffffe
+    8020296e:	f78080e7          	jalr	-136(ra) # 802008e2 <push_off>
+  struct cpu *c = mycpu();
+    80202972:	00000097          	auipc	ra,0x0
+    80202976:	fb6080e7          	jalr	-74(ra) # 80202928 <mycpu>
+    8020297a:	fea43423          	sd	a0,-24(s0)
+  struct proc *p = c->proc;
+    8020297e:	fe843783          	ld	a5,-24(s0)
+    80202982:	639c                	ld	a5,0(a5)
+    80202984:	fef43023          	sd	a5,-32(s0)
+  pop_off();
+    80202988:	ffffe097          	auipc	ra,0xffffe
+    8020298c:	fb2080e7          	jalr	-78(ra) # 8020093a <pop_off>
+  return p;
+    80202990:	fe043783          	ld	a5,-32(s0)
+}
+    80202994:	853e                	mv	a0,a5
+    80202996:	60e2                	ld	ra,24(sp)
+    80202998:	6442                	ld	s0,16(sp)
+    8020299a:	6105                	addi	sp,sp,32
+    8020299c:	8082                	ret
+
+000000008020299e <allocpid>:
+
+int
+allocpid() {
+    8020299e:	1101                	addi	sp,sp,-32
+    802029a0:	ec06                	sd	ra,24(sp)
+    802029a2:	e822                	sd	s0,16(sp)
+    802029a4:	1000                	addi	s0,sp,32
+  int pid;
+  
+  acquire(&pid_lock);
+    802029a6:	0001b517          	auipc	a0,0x1b
+    802029aa:	77250513          	addi	a0,a0,1906 # 8021e118 <pid_lock>
+    802029ae:	ffffe097          	auipc	ra,0xffffe
+    802029b2:	03a080e7          	jalr	58(ra) # 802009e8 <acquire>
+  pid = nextpid;
+    802029b6:	0000c797          	auipc	a5,0xc
+    802029ba:	65e78793          	addi	a5,a5,1630 # 8020f014 <nextpid>
+    802029be:	439c                	lw	a5,0(a5)
+    802029c0:	fef42623          	sw	a5,-20(s0)
+  nextpid = nextpid + 1;
+    802029c4:	0000c797          	auipc	a5,0xc
+    802029c8:	65078793          	addi	a5,a5,1616 # 8020f014 <nextpid>
+    802029cc:	439c                	lw	a5,0(a5)
+    802029ce:	2785                	addiw	a5,a5,1
+    802029d0:	0007871b          	sext.w	a4,a5
+    802029d4:	0000c797          	auipc	a5,0xc
+    802029d8:	64078793          	addi	a5,a5,1600 # 8020f014 <nextpid>
+    802029dc:	c398                	sw	a4,0(a5)
+  release(&pid_lock);
+    802029de:	0001b517          	auipc	a0,0x1b
+    802029e2:	73a50513          	addi	a0,a0,1850 # 8021e118 <pid_lock>
+    802029e6:	ffffe097          	auipc	ra,0xffffe
+    802029ea:	066080e7          	jalr	102(ra) # 80200a4c <release>
+
+  return pid;
+    802029ee:	fec42783          	lw	a5,-20(s0)
+}
+    802029f2:	853e                	mv	a0,a5
+    802029f4:	60e2                	ld	ra,24(sp)
+    802029f6:	6442                	ld	s0,16(sp)
+    802029f8:	6105                	addi	sp,sp,32
+    802029fa:	8082                	ret
+
+00000000802029fc <allocproc>:
+// If found, initialize state required to run in the kernel,
+// and return with p->lock held.
+// If there are no free procs, or a memory allocation fails, return 0.
+static struct proc*
+allocproc(void)
+{
+    802029fc:	1101                	addi	sp,sp,-32
+    802029fe:	ec06                	sd	ra,24(sp)
+    80202a00:	e822                	sd	s0,16(sp)
+    80202a02:	1000                	addi	s0,sp,32
+  struct proc *p;
+
+  for(p = proc; p < &proc[NPROC]; p++) {
+    80202a04:	00016797          	auipc	a5,0x16
+    80202a08:	75c78793          	addi	a5,a5,1884 # 80219160 <proc>
+    80202a0c:	fef43423          	sd	a5,-24(s0)
+    80202a10:	a80d                	j	80202a42 <allocproc+0x46>
+    acquire(&p->lock);
+    80202a12:	fe843783          	ld	a5,-24(s0)
+    80202a16:	853e                	mv	a0,a5
+    80202a18:	ffffe097          	auipc	ra,0xffffe
+    80202a1c:	fd0080e7          	jalr	-48(ra) # 802009e8 <acquire>
+    if(p->state == UNUSED) {
+    80202a20:	fe843783          	ld	a5,-24(s0)
+    80202a24:	4f9c                	lw	a5,24(a5)
+    80202a26:	cb85                	beqz	a5,80202a56 <allocproc+0x5a>
+      goto found;
+    } else {
+      release(&p->lock);
+    80202a28:	fe843783          	ld	a5,-24(s0)
+    80202a2c:	853e                	mv	a0,a5
+    80202a2e:	ffffe097          	auipc	ra,0xffffe
+    80202a32:	01e080e7          	jalr	30(ra) # 80200a4c <release>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    80202a36:	fe843783          	ld	a5,-24(s0)
+    80202a3a:	19878793          	addi	a5,a5,408
+    80202a3e:	fef43423          	sd	a5,-24(s0)
+    80202a42:	fe843703          	ld	a4,-24(s0)
+    80202a46:	0001b797          	auipc	a5,0x1b
+    80202a4a:	6ca78793          	addi	a5,a5,1738 # 8021e110 <initproc>
+    80202a4e:	fcf762e3          	bltu	a4,a5,80202a12 <allocproc+0x16>
+    }
+  }
+  return NULL;
+    80202a52:	4781                	li	a5,0
+    80202a54:	a8e5                	j	80202b4c <allocproc+0x150>
+      goto found;
+    80202a56:	0001                	nop
+
+found:
+  p->pid = allocpid();
+    80202a58:	00000097          	auipc	ra,0x0
+    80202a5c:	f46080e7          	jalr	-186(ra) # 8020299e <allocpid>
+    80202a60:	87aa                	mv	a5,a0
+    80202a62:	873e                	mv	a4,a5
+    80202a64:	fe843783          	ld	a5,-24(s0)
+    80202a68:	df98                	sw	a4,56(a5)
+
+  // Allocate a trapframe page.
+  if((p->trapframe = (struct trapframe *)kalloc()) == NULL){
+    80202a6a:	ffffe097          	auipc	ra,0xffffe
+    80202a6e:	d22080e7          	jalr	-734(ra) # 8020078c <kalloc>
+    80202a72:	872a                	mv	a4,a0
+    80202a74:	fe843783          	ld	a5,-24(s0)
+    80202a78:	f3b8                	sd	a4,96(a5)
+    80202a7a:	fe843783          	ld	a5,-24(s0)
+    80202a7e:	73bc                	ld	a5,96(a5)
+    80202a80:	eb91                	bnez	a5,80202a94 <allocproc+0x98>
+    release(&p->lock);
+    80202a82:	fe843783          	ld	a5,-24(s0)
+    80202a86:	853e                	mv	a0,a5
+    80202a88:	ffffe097          	auipc	ra,0xffffe
+    80202a8c:	fc4080e7          	jalr	-60(ra) # 80200a4c <release>
+    return NULL;
+    80202a90:	4781                	li	a5,0
+    80202a92:	a86d                	j	80202b4c <allocproc+0x150>
+  }
+
+  // An empty user page table.
+  // And an identical kernel page table for this proc.
+  if ((p->pagetable = proc_pagetable(p)) == NULL ||
+    80202a94:	fe843503          	ld	a0,-24(s0)
+    80202a98:	00000097          	auipc	ra,0x0
+    80202a9c:	19e080e7          	jalr	414(ra) # 80202c36 <proc_pagetable>
+    80202aa0:	872a                	mv	a4,a0
+    80202aa2:	fe843783          	ld	a5,-24(s0)
+    80202aa6:	ebb8                	sd	a4,80(a5)
+    80202aa8:	fe843783          	ld	a5,-24(s0)
+    80202aac:	6bbc                	ld	a5,80(a5)
+    80202aae:	cf89                	beqz	a5,80202ac8 <allocproc+0xcc>
+      (p->kpagetable = proc_kpagetable()) == NULL) {
+    80202ab0:	fffff097          	auipc	ra,0xfffff
+    80202ab4:	712080e7          	jalr	1810(ra) # 802021c2 <proc_kpagetable>
+    80202ab8:	872a                	mv	a4,a0
+    80202aba:	fe843783          	ld	a5,-24(s0)
+    80202abe:	efb8                	sd	a4,88(a5)
+    80202ac0:	fe843783          	ld	a5,-24(s0)
+    80202ac4:	6fbc                	ld	a5,88(a5)
+  if ((p->pagetable = proc_pagetable(p)) == NULL ||
+    80202ac6:	e385                	bnez	a5,80202ae6 <allocproc+0xea>
+    freeproc(p);
+    80202ac8:	fe843503          	ld	a0,-24(s0)
+    80202acc:	00000097          	auipc	ra,0x0
+    80202ad0:	08a080e7          	jalr	138(ra) # 80202b56 <freeproc>
+    release(&p->lock);
+    80202ad4:	fe843783          	ld	a5,-24(s0)
+    80202ad8:	853e                	mv	a0,a5
+    80202ada:	ffffe097          	auipc	ra,0xffffe
+    80202ade:	f72080e7          	jalr	-142(ra) # 80200a4c <release>
+    return NULL;
+    80202ae2:	4781                	li	a5,0
+    80202ae4:	a0a5                	j	80202b4c <allocproc+0x150>
+  }
+
+  p->kstack = VKSTACK;
+    80202ae6:	fe843783          	ld	a5,-24(s0)
+    80202aea:	0fb00713          	li	a4,251
+    80202aee:	077a                	slli	a4,a4,0x1e
+    80202af0:	e3b8                	sd	a4,64(a5)
+
+  // Set up new context to start executing at forkret,
+  // which returns to user space.
+  memset(&p->context, 0, sizeof(p->context));
+    80202af2:	fe843783          	ld	a5,-24(s0)
+    80202af6:	06878793          	addi	a5,a5,104
+    80202afa:	07000613          	li	a2,112
+    80202afe:	4581                	li	a1,0
+    80202b00:	853e                	mv	a0,a5
+    80202b02:	ffffe097          	auipc	ra,0xffffe
+    80202b06:	fe4080e7          	jalr	-28(ra) # 80200ae6 <memset>
+  p->context.ra = (uint64)forkret;
+    80202b0a:	00001717          	auipc	a4,0x1
+    80202b0e:	c4070713          	addi	a4,a4,-960 # 8020374a <forkret>
+    80202b12:	fe843783          	ld	a5,-24(s0)
+    80202b16:	f7b8                	sd	a4,104(a5)
+  p->context.sp = p->kstack + PGSIZE;
+    80202b18:	fe843783          	ld	a5,-24(s0)
+    80202b1c:	63b8                	ld	a4,64(a5)
+    80202b1e:	6785                	lui	a5,0x1
+    80202b20:	973e                	add	a4,a4,a5
+    80202b22:	fe843783          	ld	a5,-24(s0)
+    80202b26:	fbb8                	sd	a4,112(a5)
+
+  //在分配进程的时候初始化各个时间为0
+  p->ti.tms_cstime=0;
+    80202b28:	fe843783          	ld	a5,-24(s0)
+    80202b2c:	1607bc23          	sd	zero,376(a5) # 1178 <_entry-0x801fee88>
+  p->ti.tms_cutime=0;
+    80202b30:	fe843783          	ld	a5,-24(s0)
+    80202b34:	1607b823          	sd	zero,368(a5)
+  p->ti.tms_stime=0;
+    80202b38:	fe843783          	ld	a5,-24(s0)
+    80202b3c:	1607b423          	sd	zero,360(a5)
+  p->ti.tms_utime=0;
+    80202b40:	fe843783          	ld	a5,-24(s0)
+    80202b44:	1607b023          	sd	zero,352(a5)
+
+
+  return p;
+    80202b48:	fe843783          	ld	a5,-24(s0)
+}
+    80202b4c:	853e                	mv	a0,a5
+    80202b4e:	60e2                	ld	ra,24(sp)
+    80202b50:	6442                	ld	s0,16(sp)
+    80202b52:	6105                	addi	sp,sp,32
+    80202b54:	8082                	ret
+
+0000000080202b56 <freeproc>:
+// free a proc structure and the data hanging from it,
+// including user pages.
+// p->lock must be held.
+static void
+freeproc(struct proc *p)
+{
+    80202b56:	1101                	addi	sp,sp,-32
+    80202b58:	ec06                	sd	ra,24(sp)
+    80202b5a:	e822                	sd	s0,16(sp)
+    80202b5c:	1000                	addi	s0,sp,32
+    80202b5e:	fea43423          	sd	a0,-24(s0)
+  if(p->trapframe)
+    80202b62:	fe843783          	ld	a5,-24(s0)
+    80202b66:	73bc                	ld	a5,96(a5)
+    80202b68:	cb89                	beqz	a5,80202b7a <freeproc+0x24>
+    kfree((void*)p->trapframe);
+    80202b6a:	fe843783          	ld	a5,-24(s0)
+    80202b6e:	73bc                	ld	a5,96(a5)
+    80202b70:	853e                	mv	a0,a5
+    80202b72:	ffffe097          	auipc	ra,0xffffe
+    80202b76:	b5c080e7          	jalr	-1188(ra) # 802006ce <kfree>
+  p->trapframe = 0;
+    80202b7a:	fe843783          	ld	a5,-24(s0)
+    80202b7e:	0607b023          	sd	zero,96(a5)
+  if (p->kpagetable) {
+    80202b82:	fe843783          	ld	a5,-24(s0)
+    80202b86:	6fbc                	ld	a5,88(a5)
+    80202b88:	cb91                	beqz	a5,80202b9c <freeproc+0x46>
+    kvmfree(p->kpagetable, 1);
+    80202b8a:	fe843783          	ld	a5,-24(s0)
+    80202b8e:	6fbc                	ld	a5,88(a5)
+    80202b90:	4585                	li	a1,1
+    80202b92:	853e                	mv	a0,a5
+    80202b94:	fffff097          	auipc	ra,0xfffff
+    80202b98:	7cc080e7          	jalr	1996(ra) # 80202360 <kvmfree>
+  }
+  p->kpagetable = 0;
+    80202b9c:	fe843783          	ld	a5,-24(s0)
+    80202ba0:	0407bc23          	sd	zero,88(a5)
+  if(p->pagetable)
+    80202ba4:	fe843783          	ld	a5,-24(s0)
+    80202ba8:	6bbc                	ld	a5,80(a5)
+    80202baa:	cf89                	beqz	a5,80202bc4 <freeproc+0x6e>
+    proc_freepagetable(p->pagetable, p->sz);
+    80202bac:	fe843783          	ld	a5,-24(s0)
+    80202bb0:	6bb8                	ld	a4,80(a5)
+    80202bb2:	fe843783          	ld	a5,-24(s0)
+    80202bb6:	67bc                	ld	a5,72(a5)
+    80202bb8:	85be                	mv	a1,a5
+    80202bba:	853a                	mv	a0,a4
+    80202bbc:	00000097          	auipc	ra,0x0
+    80202bc0:	13a080e7          	jalr	314(ra) # 80202cf6 <proc_freepagetable>
+  p->pagetable = 0;
+    80202bc4:	fe843783          	ld	a5,-24(s0)
+    80202bc8:	0407b823          	sd	zero,80(a5)
+  p->sz = 0;
+    80202bcc:	fe843783          	ld	a5,-24(s0)
+    80202bd0:	0407b423          	sd	zero,72(a5)
+  p->pid = 0;
+    80202bd4:	fe843783          	ld	a5,-24(s0)
+    80202bd8:	0207ac23          	sw	zero,56(a5)
+  p->parent = 0;
+    80202bdc:	fe843783          	ld	a5,-24(s0)
+    80202be0:	0207b023          	sd	zero,32(a5)
+  p->name[0] = 0;
+    80202be4:	fe843783          	ld	a5,-24(s0)
+    80202be8:	18078023          	sb	zero,384(a5)
+  p->chan = 0;
+    80202bec:	fe843783          	ld	a5,-24(s0)
+    80202bf0:	0207b423          	sd	zero,40(a5)
+  p->killed = 0;
+    80202bf4:	fe843783          	ld	a5,-24(s0)
+    80202bf8:	0207a823          	sw	zero,48(a5)
+  p->xstate = 0;
+    80202bfc:	fe843783          	ld	a5,-24(s0)
+    80202c00:	0207aa23          	sw	zero,52(a5)
+  p->state = UNUSED;
+    80202c04:	fe843783          	ld	a5,-24(s0)
+    80202c08:	0007ac23          	sw	zero,24(a5)
+  p->ti.tms_cstime=0;  //清空tms
+    80202c0c:	fe843783          	ld	a5,-24(s0)
+    80202c10:	1607bc23          	sd	zero,376(a5)
+  p->ti.tms_cutime=0;
+    80202c14:	fe843783          	ld	a5,-24(s0)
+    80202c18:	1607b823          	sd	zero,368(a5)
+  p->ti.tms_stime=0;
+    80202c1c:	fe843783          	ld	a5,-24(s0)
+    80202c20:	1607b423          	sd	zero,360(a5)
+  p->ti.tms_utime=0;
+    80202c24:	fe843783          	ld	a5,-24(s0)
+    80202c28:	1607b023          	sd	zero,352(a5)
+}
+    80202c2c:	0001                	nop
+    80202c2e:	60e2                	ld	ra,24(sp)
+    80202c30:	6442                	ld	s0,16(sp)
+    80202c32:	6105                	addi	sp,sp,32
+    80202c34:	8082                	ret
+
+0000000080202c36 <proc_pagetable>:
+
+// Create a user page table for a given process,
+// with no user memory, but with trampoline pages.
+pagetable_t
+proc_pagetable(struct proc *p)
+{
+    80202c36:	7179                	addi	sp,sp,-48
+    80202c38:	f406                	sd	ra,40(sp)
+    80202c3a:	f022                	sd	s0,32(sp)
+    80202c3c:	1800                	addi	s0,sp,48
+    80202c3e:	fca43c23          	sd	a0,-40(s0)
+  pagetable_t pagetable;
+
+  // An empty page table.
+  pagetable = uvmcreate();
+    80202c42:	fffff097          	auipc	ra,0xfffff
+    80202c46:	bac080e7          	jalr	-1108(ra) # 802017ee <uvmcreate>
+    80202c4a:	fea43423          	sd	a0,-24(s0)
+  if(pagetable == 0)
+    80202c4e:	fe843783          	ld	a5,-24(s0)
+    80202c52:	e399                	bnez	a5,80202c58 <proc_pagetable+0x22>
+    return NULL;
+    80202c54:	4781                	li	a5,0
+    80202c56:	a859                	j	80202cec <proc_pagetable+0xb6>
+
+  // map the trampoline code (for system call return)
+  // at the highest user virtual address.
+  // only the supervisor uses it, on the way
+  // to/from user space, so not PTE_U.
+  if(mappages(pagetable, TRAMPOLINE, PGSIZE,
+    80202c58:	0000e797          	auipc	a5,0xe
+    80202c5c:	8387b783          	ld	a5,-1992(a5) # 80210490 <_GLOBAL_OFFSET_TABLE_+0x8>
+    80202c60:	4729                	li	a4,10
+    80202c62:	86be                	mv	a3,a5
+    80202c64:	6605                	lui	a2,0x1
+    80202c66:	040007b7          	lui	a5,0x4000
+    80202c6a:	17fd                	addi	a5,a5,-1
+    80202c6c:	00c79593          	slli	a1,a5,0xc
+    80202c70:	fe843503          	ld	a0,-24(s0)
+    80202c74:	fffff097          	auipc	ra,0xfffff
+    80202c78:	9b2080e7          	jalr	-1614(ra) # 80201626 <mappages>
+    80202c7c:	87aa                	mv	a5,a0
+    80202c7e:	0007db63          	bgez	a5,80202c94 <proc_pagetable+0x5e>
+              (uint64)trampoline, PTE_R | PTE_X) < 0){
+    uvmfree(pagetable, 0);
+    80202c82:	4581                	li	a1,0
+    80202c84:	fe843503          	ld	a0,-24(s0)
+    80202c88:	fffff097          	auipc	ra,0xfffff
+    80202c8c:	f0c080e7          	jalr	-244(ra) # 80201b94 <uvmfree>
+    return NULL;
+    80202c90:	4781                	li	a5,0
+    80202c92:	a8a9                	j	80202cec <proc_pagetable+0xb6>
+  }
+
+  // map the trapframe just below TRAMPOLINE, for trampoline.S.
+  if(mappages(pagetable, TRAPFRAME, PGSIZE,
+              (uint64)(p->trapframe), PTE_R | PTE_W) < 0){
+    80202c94:	fd843783          	ld	a5,-40(s0)
+    80202c98:	73bc                	ld	a5,96(a5)
+  if(mappages(pagetable, TRAPFRAME, PGSIZE,
+    80202c9a:	4719                	li	a4,6
+    80202c9c:	86be                	mv	a3,a5
+    80202c9e:	6605                	lui	a2,0x1
+    80202ca0:	020007b7          	lui	a5,0x2000
+    80202ca4:	17fd                	addi	a5,a5,-1
+    80202ca6:	00d79593          	slli	a1,a5,0xd
+    80202caa:	fe843503          	ld	a0,-24(s0)
+    80202cae:	fffff097          	auipc	ra,0xfffff
+    80202cb2:	978080e7          	jalr	-1672(ra) # 80201626 <mappages>
+    80202cb6:	87aa                	mv	a5,a0
+    80202cb8:	0207d863          	bgez	a5,80202ce8 <proc_pagetable+0xb2>
+    vmunmap(pagetable, TRAMPOLINE, 1, 0);
+    80202cbc:	4681                	li	a3,0
+    80202cbe:	4605                	li	a2,1
+    80202cc0:	040007b7          	lui	a5,0x4000
+    80202cc4:	17fd                	addi	a5,a5,-1
+    80202cc6:	00c79593          	slli	a1,a5,0xc
+    80202cca:	fe843503          	ld	a0,-24(s0)
+    80202cce:	fffff097          	auipc	ra,0xfffff
+    80202cd2:	a20080e7          	jalr	-1504(ra) # 802016ee <vmunmap>
+    uvmfree(pagetable, 0);
+    80202cd6:	4581                	li	a1,0
+    80202cd8:	fe843503          	ld	a0,-24(s0)
+    80202cdc:	fffff097          	auipc	ra,0xfffff
+    80202ce0:	eb8080e7          	jalr	-328(ra) # 80201b94 <uvmfree>
+    return NULL;
+    80202ce4:	4781                	li	a5,0
+    80202ce6:	a019                	j	80202cec <proc_pagetable+0xb6>
+  }
+
+  return pagetable;
+    80202ce8:	fe843783          	ld	a5,-24(s0)
+}
+    80202cec:	853e                	mv	a0,a5
+    80202cee:	70a2                	ld	ra,40(sp)
+    80202cf0:	7402                	ld	s0,32(sp)
+    80202cf2:	6145                	addi	sp,sp,48
+    80202cf4:	8082                	ret
+
+0000000080202cf6 <proc_freepagetable>:
+
+// Free a process's page table, and free the
+// physical memory it refers to.
+void
+proc_freepagetable(pagetable_t pagetable, uint64 sz)
+{
+    80202cf6:	1101                	addi	sp,sp,-32
+    80202cf8:	ec06                	sd	ra,24(sp)
+    80202cfa:	e822                	sd	s0,16(sp)
+    80202cfc:	1000                	addi	s0,sp,32
+    80202cfe:	fea43423          	sd	a0,-24(s0)
+    80202d02:	feb43023          	sd	a1,-32(s0)
+  vmunmap(pagetable, TRAMPOLINE, 1, 0);
+    80202d06:	4681                	li	a3,0
+    80202d08:	4605                	li	a2,1
+    80202d0a:	040007b7          	lui	a5,0x4000
+    80202d0e:	17fd                	addi	a5,a5,-1
+    80202d10:	00c79593          	slli	a1,a5,0xc
+    80202d14:	fe843503          	ld	a0,-24(s0)
+    80202d18:	fffff097          	auipc	ra,0xfffff
+    80202d1c:	9d6080e7          	jalr	-1578(ra) # 802016ee <vmunmap>
+  vmunmap(pagetable, TRAPFRAME, 1, 0);
+    80202d20:	4681                	li	a3,0
+    80202d22:	4605                	li	a2,1
+    80202d24:	020007b7          	lui	a5,0x2000
+    80202d28:	17fd                	addi	a5,a5,-1
+    80202d2a:	00d79593          	slli	a1,a5,0xd
+    80202d2e:	fe843503          	ld	a0,-24(s0)
+    80202d32:	fffff097          	auipc	ra,0xfffff
+    80202d36:	9bc080e7          	jalr	-1604(ra) # 802016ee <vmunmap>
+  uvmfree(pagetable, sz);
+    80202d3a:	fe043583          	ld	a1,-32(s0)
+    80202d3e:	fe843503          	ld	a0,-24(s0)
+    80202d42:	fffff097          	auipc	ra,0xfffff
+    80202d46:	e52080e7          	jalr	-430(ra) # 80201b94 <uvmfree>
+}
+    80202d4a:	0001                	nop
+    80202d4c:	60e2                	ld	ra,24(sp)
+    80202d4e:	6442                	ld	s0,16(sp)
+    80202d50:	6105                	addi	sp,sp,32
+    80202d52:	8082                	ret
+
+0000000080202d54 <userinit>:
+// }
+
+// Set up first user process.
+void
+userinit(void)
+{
+    80202d54:	1101                	addi	sp,sp,-32
+    80202d56:	ec06                	sd	ra,24(sp)
+    80202d58:	e822                	sd	s0,16(sp)
+    80202d5a:	1000                	addi	s0,sp,32
+  struct proc *p;
+
+  p = allocproc();
+    80202d5c:	00000097          	auipc	ra,0x0
+    80202d60:	ca0080e7          	jalr	-864(ra) # 802029fc <allocproc>
+    80202d64:	fea43423          	sd	a0,-24(s0)
+  initproc = p;
+    80202d68:	0001b797          	auipc	a5,0x1b
+    80202d6c:	3a878793          	addi	a5,a5,936 # 8021e110 <initproc>
+    80202d70:	fe843703          	ld	a4,-24(s0)
+    80202d74:	e398                	sd	a4,0(a5)
+  // allocate one user page and copy init's instructions
+  // and data into it.
+  #ifdef LOCAL
+  uvminit(p->pagetable , p->kpagetable, initcode, sizeof(initcode));
+  #else
+  uvminit(p->pagetable , p->kpagetable, initcode, initcodesize);
+    80202d76:	fe843783          	ld	a5,-24(s0)
+    80202d7a:	6bb8                	ld	a4,80(a5)
+    80202d7c:	fe843783          	ld	a5,-24(s0)
+    80202d80:	6fac                	ld	a1,88(a5)
+    80202d82:	0000d797          	auipc	a5,0xd
+    80202d86:	72e7b783          	ld	a5,1838(a5) # 802104b0 <_GLOBAL_OFFSET_TABLE_+0x28>
+    80202d8a:	439c                	lw	a5,0(a5)
+    80202d8c:	2781                	sext.w	a5,a5
+    80202d8e:	86be                	mv	a3,a5
+    80202d90:	0000d617          	auipc	a2,0xd
+    80202d94:	74863603          	ld	a2,1864(a2) # 802104d8 <_GLOBAL_OFFSET_TABLE_+0x50>
+    80202d98:	853a                	mv	a0,a4
+    80202d9a:	fffff097          	auipc	ra,0xfffff
+    80202d9e:	a90080e7          	jalr	-1392(ra) # 8020182a <uvminit>
+  #endif
+  p->sz = PGSIZE;
+    80202da2:	fe843783          	ld	a5,-24(s0)
+    80202da6:	6705                	lui	a4,0x1
+    80202da8:	e7b8                	sd	a4,72(a5)
+
+  // prepare for the very first "return" from kernel to user.
+  p->trapframe->epc = 0x0;      // user program counter
+    80202daa:	fe843783          	ld	a5,-24(s0)
+    80202dae:	73bc                	ld	a5,96(a5)
+    80202db0:	0007bc23          	sd	zero,24(a5)
+  p->trapframe->sp = PGSIZE;  // user stack pointer
+    80202db4:	fe843783          	ld	a5,-24(s0)
+    80202db8:	73bc                	ld	a5,96(a5)
+    80202dba:	6705                	lui	a4,0x1
+    80202dbc:	fb98                	sd	a4,48(a5)
+
+  safestrcpy(p->name, "initcode", sizeof(p->name));
+    80202dbe:	fe843783          	ld	a5,-24(s0)
+    80202dc2:	18078793          	addi	a5,a5,384
+    80202dc6:	4641                	li	a2,16
+    80202dc8:	0000b597          	auipc	a1,0xb
+    80202dcc:	8d058593          	addi	a1,a1,-1840 # 8020d698 <etext+0x698>
+    80202dd0:	853e                	mv	a0,a5
+    80202dd2:	ffffe097          	auipc	ra,0xffffe
+    80202dd6:	00a080e7          	jalr	10(ra) # 80200ddc <safestrcpy>
+
+  p->state = RUNNABLE;
+    80202dda:	fe843783          	ld	a5,-24(s0)
+    80202dde:	4709                	li	a4,2
+    80202de0:	cf98                	sw	a4,24(a5)
+
+  p->tmask = 0;
+    80202de2:	fe843783          	ld	a5,-24(s0)
+    80202de6:	1807a823          	sw	zero,400(a5)
+
+  release(&p->lock);
+    80202dea:	fe843783          	ld	a5,-24(s0)
+    80202dee:	853e                	mv	a0,a5
+    80202df0:	ffffe097          	auipc	ra,0xffffe
+    80202df4:	c5c080e7          	jalr	-932(ra) # 80200a4c <release>
+  #ifdef DEBUG
+  printf("userinit\n");
+    80202df8:	0000b517          	auipc	a0,0xb
+    80202dfc:	8b050513          	addi	a0,a0,-1872 # 8020d6a8 <etext+0x6a8>
+    80202e00:	ffffd097          	auipc	ra,0xffffd
+    80202e04:	3ee080e7          	jalr	1006(ra) # 802001ee <printf>
+  #endif
+}
+    80202e08:	0001                	nop
+    80202e0a:	60e2                	ld	ra,24(sp)
+    80202e0c:	6442                	ld	s0,16(sp)
+    80202e0e:	6105                	addi	sp,sp,32
+    80202e10:	8082                	ret
+
+0000000080202e12 <growproc>:
+
+// Grow or shrink user memory by n bytes.
+// Return 0 on success, -1 on failure.
+int
+growproc(int n)
+{
+    80202e12:	7179                	addi	sp,sp,-48
+    80202e14:	f406                	sd	ra,40(sp)
+    80202e16:	f022                	sd	s0,32(sp)
+    80202e18:	1800                	addi	s0,sp,48
+    80202e1a:	87aa                	mv	a5,a0
+    80202e1c:	fcf42e23          	sw	a5,-36(s0)
+  uint sz;
+  struct proc *p = myproc();
+    80202e20:	00000097          	auipc	ra,0x0
+    80202e24:	b42080e7          	jalr	-1214(ra) # 80202962 <myproc>
+    80202e28:	fea43023          	sd	a0,-32(s0)
+
+  sz = p->sz;
+    80202e2c:	fe043783          	ld	a5,-32(s0)
+    80202e30:	67bc                	ld	a5,72(a5)
+    80202e32:	fef42623          	sw	a5,-20(s0)
+  if(n > 0){
+    80202e36:	fdc42783          	lw	a5,-36(s0)
+    80202e3a:	2781                	sext.w	a5,a5
+    80202e3c:	04f05063          	blez	a5,80202e7c <growproc+0x6a>
+    if((sz = uvmalloc(p->pagetable, p->kpagetable, sz, sz + n)) == 0) {
+    80202e40:	fe043783          	ld	a5,-32(s0)
+    80202e44:	6ba8                	ld	a0,80(a5)
+    80202e46:	fe043783          	ld	a5,-32(s0)
+    80202e4a:	6fac                	ld	a1,88(a5)
+    80202e4c:	fec46603          	lwu	a2,-20(s0)
+    80202e50:	fdc42783          	lw	a5,-36(s0)
+    80202e54:	fec42703          	lw	a4,-20(s0)
+    80202e58:	9fb9                	addw	a5,a5,a4
+    80202e5a:	2781                	sext.w	a5,a5
+    80202e5c:	1782                	slli	a5,a5,0x20
+    80202e5e:	9381                	srli	a5,a5,0x20
+    80202e60:	86be                	mv	a3,a5
+    80202e62:	fffff097          	auipc	ra,0xfffff
+    80202e66:	a6c080e7          	jalr	-1428(ra) # 802018ce <uvmalloc>
+    80202e6a:	87aa                	mv	a5,a0
+    80202e6c:	fef42623          	sw	a5,-20(s0)
+    80202e70:	fec42783          	lw	a5,-20(s0)
+    80202e74:	2781                	sext.w	a5,a5
+    80202e76:	e3a1                	bnez	a5,80202eb6 <growproc+0xa4>
+      return -1;
+    80202e78:	57fd                	li	a5,-1
+    80202e7a:	a0a1                	j	80202ec2 <growproc+0xb0>
+    }
+  } else if(n < 0){
+    80202e7c:	fdc42783          	lw	a5,-36(s0)
+    80202e80:	2781                	sext.w	a5,a5
+    80202e82:	0207da63          	bgez	a5,80202eb6 <growproc+0xa4>
+    sz = uvmdealloc(p->pagetable, p->kpagetable, sz, sz + n);
+    80202e86:	fe043783          	ld	a5,-32(s0)
+    80202e8a:	6ba8                	ld	a0,80(a5)
+    80202e8c:	fe043783          	ld	a5,-32(s0)
+    80202e90:	6fac                	ld	a1,88(a5)
+    80202e92:	fec46603          	lwu	a2,-20(s0)
+    80202e96:	fdc42783          	lw	a5,-36(s0)
+    80202e9a:	fec42703          	lw	a4,-20(s0)
+    80202e9e:	9fb9                	addw	a5,a5,a4
+    80202ea0:	2781                	sext.w	a5,a5
+    80202ea2:	1782                	slli	a5,a5,0x20
+    80202ea4:	9381                	srli	a5,a5,0x20
+    80202ea6:	86be                	mv	a3,a5
+    80202ea8:	fffff097          	auipc	ra,0xfffff
+    80202eac:	b7e080e7          	jalr	-1154(ra) # 80201a26 <uvmdealloc>
+    80202eb0:	87aa                	mv	a5,a0
+    80202eb2:	fef42623          	sw	a5,-20(s0)
+  }
+  p->sz = sz;
+    80202eb6:	fec46703          	lwu	a4,-20(s0)
+    80202eba:	fe043783          	ld	a5,-32(s0)
+    80202ebe:	e7b8                	sd	a4,72(a5)
+  return 0;
+    80202ec0:	4781                	li	a5,0
+}
+    80202ec2:	853e                	mv	a0,a5
+    80202ec4:	70a2                	ld	ra,40(sp)
+    80202ec6:	7402                	ld	s0,32(sp)
+    80202ec8:	6145                	addi	sp,sp,48
+    80202eca:	8082                	ret
+
+0000000080202ecc <do_fork>:
+
+// Create a new process, copying the parent.
+// Sets up child kernel stack to return as if from fork() system call.
+int
+do_fork(uint64 stack)
+{
+    80202ecc:	7139                	addi	sp,sp,-64
+    80202ece:	fc06                	sd	ra,56(sp)
+    80202ed0:	f822                	sd	s0,48(sp)
+    80202ed2:	0080                	addi	s0,sp,64
+    80202ed4:	fca43423          	sd	a0,-56(s0)
+  int i, pid;
+  struct proc *np;
+  struct proc *p = myproc();
+    80202ed8:	00000097          	auipc	ra,0x0
+    80202edc:	a8a080e7          	jalr	-1398(ra) # 80202962 <myproc>
+    80202ee0:	fea43023          	sd	a0,-32(s0)
+
+  // Allocate process.
+  if((np = allocproc()) == NULL){
+    80202ee4:	00000097          	auipc	ra,0x0
+    80202ee8:	b18080e7          	jalr	-1256(ra) # 802029fc <allocproc>
+    80202eec:	fca43c23          	sd	a0,-40(s0)
+    80202ef0:	fd843783          	ld	a5,-40(s0)
+    80202ef4:	e399                	bnez	a5,80202efa <do_fork+0x2e>
+    return -1;
+    80202ef6:	57fd                	li	a5,-1
+    80202ef8:	a29d                	j	8020305e <do_fork+0x192>
+  }
+
+  // Copy user memory from parent to child.
+  if(uvmcopy(p->pagetable, np->pagetable, np->kpagetable, p->sz) < 0){
+    80202efa:	fe043783          	ld	a5,-32(s0)
+    80202efe:	6bb8                	ld	a4,80(a5)
+    80202f00:	fd843783          	ld	a5,-40(s0)
+    80202f04:	6bac                	ld	a1,80(a5)
+    80202f06:	fd843783          	ld	a5,-40(s0)
+    80202f0a:	6fb0                	ld	a2,88(a5)
+    80202f0c:	fe043783          	ld	a5,-32(s0)
+    80202f10:	67bc                	ld	a5,72(a5)
+    80202f12:	86be                	mv	a3,a5
+    80202f14:	853a                	mv	a0,a4
+    80202f16:	fffff097          	auipc	ra,0xfffff
+    80202f1a:	cc8080e7          	jalr	-824(ra) # 80201bde <uvmcopy>
+    80202f1e:	87aa                	mv	a5,a0
+    80202f20:	0207d163          	bgez	a5,80202f42 <do_fork+0x76>
+    freeproc(np);
+    80202f24:	fd843503          	ld	a0,-40(s0)
+    80202f28:	00000097          	auipc	ra,0x0
+    80202f2c:	c2e080e7          	jalr	-978(ra) # 80202b56 <freeproc>
+    release(&np->lock);
+    80202f30:	fd843783          	ld	a5,-40(s0)
+    80202f34:	853e                	mv	a0,a5
+    80202f36:	ffffe097          	auipc	ra,0xffffe
+    80202f3a:	b16080e7          	jalr	-1258(ra) # 80200a4c <release>
+    return -1;
+    80202f3e:	57fd                	li	a5,-1
+    80202f40:	aa39                	j	8020305e <do_fork+0x192>
+  }
+  np->sz = p->sz;
+    80202f42:	fe043783          	ld	a5,-32(s0)
+    80202f46:	67b8                	ld	a4,72(a5)
+    80202f48:	fd843783          	ld	a5,-40(s0)
+    80202f4c:	e7b8                	sd	a4,72(a5)
+
+  np->parent = p;
+    80202f4e:	fd843783          	ld	a5,-40(s0)
+    80202f52:	fe043703          	ld	a4,-32(s0)
+    80202f56:	f398                	sd	a4,32(a5)
+
+  // copy tracing mask from parent.
+  np->tmask = p->tmask;
+    80202f58:	fe043783          	ld	a5,-32(s0)
+    80202f5c:	1907a703          	lw	a4,400(a5)
+    80202f60:	fd843783          	ld	a5,-40(s0)
+    80202f64:	18e7a823          	sw	a4,400(a5)
+
+  // copy saved user registers.
+  *(np->trapframe) = *(p->trapframe);
+    80202f68:	fe043783          	ld	a5,-32(s0)
+    80202f6c:	73b8                	ld	a4,96(a5)
+    80202f6e:	fd843783          	ld	a5,-40(s0)
+    80202f72:	73bc                	ld	a5,96(a5)
+    80202f74:	86be                	mv	a3,a5
+    80202f76:	12000793          	li	a5,288
+    80202f7a:	863e                	mv	a2,a5
+    80202f7c:	85ba                	mv	a1,a4
+    80202f7e:	8536                	mv	a0,a3
+    80202f80:	ffffe097          	auipc	ra,0xffffe
+    80202f84:	d18080e7          	jalr	-744(ra) # 80200c98 <memcpy>
+
+  // Cause fork to return 0 in the child.
+  np->trapframe->a0 = 0;
+    80202f88:	fd843783          	ld	a5,-40(s0)
+    80202f8c:	73bc                	ld	a5,96(a5)
+    80202f8e:	0607b823          	sd	zero,112(a5)
+
+  //copy stack
+  if(stack)
+    80202f92:	fc843783          	ld	a5,-56(s0)
+    80202f96:	c799                	beqz	a5,80202fa4 <do_fork+0xd8>
+    np->trapframe->sp = stack;
+    80202f98:	fd843783          	ld	a5,-40(s0)
+    80202f9c:	73bc                	ld	a5,96(a5)
+    80202f9e:	fc843703          	ld	a4,-56(s0)
+    80202fa2:	fb98                	sd	a4,48(a5)
+
+  // increment reference counts on open file descriptors.
+  for(i = 0; i < NOFILE; i++)
+    80202fa4:	fe042623          	sw	zero,-20(s0)
+    80202fa8:	a0a9                	j	80202ff2 <do_fork+0x126>
+    if(p->ofile[i])
+    80202faa:	fe043703          	ld	a4,-32(s0)
+    80202fae:	fec42783          	lw	a5,-20(s0)
+    80202fb2:	07e9                	addi	a5,a5,26
+    80202fb4:	078e                	slli	a5,a5,0x3
+    80202fb6:	97ba                	add	a5,a5,a4
+    80202fb8:	679c                	ld	a5,8(a5)
+    80202fba:	c79d                	beqz	a5,80202fe8 <do_fork+0x11c>
+      np->ofile[i] = filedup(p->ofile[i]);
+    80202fbc:	fe043703          	ld	a4,-32(s0)
+    80202fc0:	fec42783          	lw	a5,-20(s0)
+    80202fc4:	07e9                	addi	a5,a5,26
+    80202fc6:	078e                	slli	a5,a5,0x3
+    80202fc8:	97ba                	add	a5,a5,a4
+    80202fca:	679c                	ld	a5,8(a5)
+    80202fcc:	853e                	mv	a0,a5
+    80202fce:	00002097          	auipc	ra,0x2
+    80202fd2:	78a080e7          	jalr	1930(ra) # 80205758 <filedup>
+    80202fd6:	86aa                	mv	a3,a0
+    80202fd8:	fd843703          	ld	a4,-40(s0)
+    80202fdc:	fec42783          	lw	a5,-20(s0)
+    80202fe0:	07e9                	addi	a5,a5,26
+    80202fe2:	078e                	slli	a5,a5,0x3
+    80202fe4:	97ba                	add	a5,a5,a4
+    80202fe6:	e794                	sd	a3,8(a5)
+  for(i = 0; i < NOFILE; i++)
+    80202fe8:	fec42783          	lw	a5,-20(s0)
+    80202fec:	2785                	addiw	a5,a5,1
+    80202fee:	fef42623          	sw	a5,-20(s0)
+    80202ff2:	fec42783          	lw	a5,-20(s0)
+    80202ff6:	0007871b          	sext.w	a4,a5
+    80202ffa:	47bd                	li	a5,15
+    80202ffc:	fae7d7e3          	bge	a5,a4,80202faa <do_fork+0xde>
+  np->cwd = edup(p->cwd);
+    80203000:	fe043783          	ld	a5,-32(s0)
+    80203004:	1587b783          	ld	a5,344(a5)
+    80203008:	853e                	mv	a0,a5
+    8020300a:	00006097          	auipc	ra,0x6
+    8020300e:	7ce080e7          	jalr	1998(ra) # 802097d8 <edup>
+    80203012:	872a                	mv	a4,a0
+    80203014:	fd843783          	ld	a5,-40(s0)
+    80203018:	14e7bc23          	sd	a4,344(a5)
+
+  safestrcpy(np->name, p->name, sizeof(p->name));
+    8020301c:	fd843783          	ld	a5,-40(s0)
+    80203020:	18078713          	addi	a4,a5,384
+    80203024:	fe043783          	ld	a5,-32(s0)
+    80203028:	18078793          	addi	a5,a5,384
+    8020302c:	4641                	li	a2,16
+    8020302e:	85be                	mv	a1,a5
+    80203030:	853a                	mv	a0,a4
+    80203032:	ffffe097          	auipc	ra,0xffffe
+    80203036:	daa080e7          	jalr	-598(ra) # 80200ddc <safestrcpy>
+
+  pid = np->pid;
+    8020303a:	fd843783          	ld	a5,-40(s0)
+    8020303e:	5f9c                	lw	a5,56(a5)
+    80203040:	fcf42a23          	sw	a5,-44(s0)
+
+  np->state = RUNNABLE;
+    80203044:	fd843783          	ld	a5,-40(s0)
+    80203048:	4709                	li	a4,2
+    8020304a:	cf98                	sw	a4,24(a5)
+
+  release(&np->lock);
+    8020304c:	fd843783          	ld	a5,-40(s0)
+    80203050:	853e                	mv	a0,a5
+    80203052:	ffffe097          	auipc	ra,0xffffe
+    80203056:	9fa080e7          	jalr	-1542(ra) # 80200a4c <release>
+
+  return pid;
+    8020305a:	fd442783          	lw	a5,-44(s0)
+}
+    8020305e:	853e                	mv	a0,a5
+    80203060:	70e2                	ld	ra,56(sp)
+    80203062:	7442                	ld	s0,48(sp)
+    80203064:	6121                	addi	sp,sp,64
+    80203066:	8082                	ret
+
+0000000080203068 <reparent>:
+
+// Pass p's abandoned children to init.
+// Caller must hold p->lock.
+void
+reparent(struct proc *p)
+{
+    80203068:	7179                	addi	sp,sp,-48
+    8020306a:	f406                	sd	ra,40(sp)
+    8020306c:	f022                	sd	s0,32(sp)
+    8020306e:	1800                	addi	s0,sp,48
+    80203070:	fca43c23          	sd	a0,-40(s0)
+  struct proc *pp;
+
+  for(pp = proc; pp < &proc[NPROC]; pp++){
+    80203074:	00016797          	auipc	a5,0x16
+    80203078:	0ec78793          	addi	a5,a5,236 # 80219160 <proc>
+    8020307c:	fef43423          	sd	a5,-24(s0)
+    80203080:	a0a1                	j	802030c8 <reparent+0x60>
+    // this code uses pp->parent without holding pp->lock.
+    // acquiring the lock first could cause a deadlock
+    // if pp or a child of pp were also in exit()
+    // and about to try to lock p.
+    if(pp->parent == p){
+    80203082:	fe843783          	ld	a5,-24(s0)
+    80203086:	739c                	ld	a5,32(a5)
+    80203088:	fd843703          	ld	a4,-40(s0)
+    8020308c:	02f71863          	bne	a4,a5,802030bc <reparent+0x54>
+      // pp->parent can't change between the check and the acquire()
+      // because only the parent changes it, and we're the parent.
+      acquire(&pp->lock);
+    80203090:	fe843783          	ld	a5,-24(s0)
+    80203094:	853e                	mv	a0,a5
+    80203096:	ffffe097          	auipc	ra,0xffffe
+    8020309a:	952080e7          	jalr	-1710(ra) # 802009e8 <acquire>
+      pp->parent = initproc;
+    8020309e:	0001b797          	auipc	a5,0x1b
+    802030a2:	07278793          	addi	a5,a5,114 # 8021e110 <initproc>
+    802030a6:	6398                	ld	a4,0(a5)
+    802030a8:	fe843783          	ld	a5,-24(s0)
+    802030ac:	f398                	sd	a4,32(a5)
+      // we should wake up init here, but that would require
+      // initproc->lock, which would be a deadlock, since we hold
+      // the lock on one of init's children (pp). this is why
+      // exit() always wakes init (before acquiring any locks).
+      release(&pp->lock);
+    802030ae:	fe843783          	ld	a5,-24(s0)
+    802030b2:	853e                	mv	a0,a5
+    802030b4:	ffffe097          	auipc	ra,0xffffe
+    802030b8:	998080e7          	jalr	-1640(ra) # 80200a4c <release>
+  for(pp = proc; pp < &proc[NPROC]; pp++){
+    802030bc:	fe843783          	ld	a5,-24(s0)
+    802030c0:	19878793          	addi	a5,a5,408
+    802030c4:	fef43423          	sd	a5,-24(s0)
+    802030c8:	fe843703          	ld	a4,-24(s0)
+    802030cc:	0001b797          	auipc	a5,0x1b
+    802030d0:	04478793          	addi	a5,a5,68 # 8021e110 <initproc>
+    802030d4:	faf767e3          	bltu	a4,a5,80203082 <reparent+0x1a>
+    }
+  }
+}
+    802030d8:	0001                	nop
+    802030da:	0001                	nop
+    802030dc:	70a2                	ld	ra,40(sp)
+    802030de:	7402                	ld	s0,32(sp)
+    802030e0:	6145                	addi	sp,sp,48
+    802030e2:	8082                	ret
+
+00000000802030e4 <exit>:
+// Exit the current process.  Does not return.
+// An exited process remains in the zombie state
+// until its parent calls wait().
+void
+exit(int status)
+{
+    802030e4:	7139                	addi	sp,sp,-64
+    802030e6:	fc06                	sd	ra,56(sp)
+    802030e8:	f822                	sd	s0,48(sp)
+    802030ea:	0080                	addi	s0,sp,64
+    802030ec:	87aa                	mv	a5,a0
+    802030ee:	fcf42623          	sw	a5,-52(s0)
+  struct proc *p = myproc();
+    802030f2:	00000097          	auipc	ra,0x0
+    802030f6:	870080e7          	jalr	-1936(ra) # 80202962 <myproc>
+    802030fa:	fea43023          	sd	a0,-32(s0)
+
+  if(p == initproc)
+    802030fe:	0001b797          	auipc	a5,0x1b
+    80203102:	01278793          	addi	a5,a5,18 # 8021e110 <initproc>
+    80203106:	639c                	ld	a5,0(a5)
+    80203108:	fe043703          	ld	a4,-32(s0)
+    8020310c:	00f71a63          	bne	a4,a5,80203120 <exit+0x3c>
+    panic("init exiting");
+    80203110:	0000a517          	auipc	a0,0xa
+    80203114:	5a850513          	addi	a0,a0,1448 # 8020d6b8 <etext+0x6b8>
+    80203118:	ffffd097          	auipc	ra,0xffffd
+    8020311c:	32c080e7          	jalr	812(ra) # 80200444 <panic>
+
+  // Close all open files.
+  for(int fd = 0; fd < NOFILE; fd++){
+    80203120:	fe042623          	sw	zero,-20(s0)
+    80203124:	a881                	j	80203174 <exit+0x90>
+    if(p->ofile[fd]){
+    80203126:	fe043703          	ld	a4,-32(s0)
+    8020312a:	fec42783          	lw	a5,-20(s0)
+    8020312e:	07e9                	addi	a5,a5,26
+    80203130:	078e                	slli	a5,a5,0x3
+    80203132:	97ba                	add	a5,a5,a4
+    80203134:	679c                	ld	a5,8(a5)
+    80203136:	cb95                	beqz	a5,8020316a <exit+0x86>
+      struct file *f = p->ofile[fd];
+    80203138:	fe043703          	ld	a4,-32(s0)
+    8020313c:	fec42783          	lw	a5,-20(s0)
+    80203140:	07e9                	addi	a5,a5,26
+    80203142:	078e                	slli	a5,a5,0x3
+    80203144:	97ba                	add	a5,a5,a4
+    80203146:	679c                	ld	a5,8(a5)
+    80203148:	fcf43823          	sd	a5,-48(s0)
+      fileclose(f);
+    8020314c:	fd043503          	ld	a0,-48(s0)
+    80203150:	00002097          	auipc	ra,0x2
+    80203154:	66e080e7          	jalr	1646(ra) # 802057be <fileclose>
+      p->ofile[fd] = 0;
+    80203158:	fe043703          	ld	a4,-32(s0)
+    8020315c:	fec42783          	lw	a5,-20(s0)
+    80203160:	07e9                	addi	a5,a5,26
+    80203162:	078e                	slli	a5,a5,0x3
+    80203164:	97ba                	add	a5,a5,a4
+    80203166:	0007b423          	sd	zero,8(a5)
+  for(int fd = 0; fd < NOFILE; fd++){
+    8020316a:	fec42783          	lw	a5,-20(s0)
+    8020316e:	2785                	addiw	a5,a5,1
+    80203170:	fef42623          	sw	a5,-20(s0)
+    80203174:	fec42783          	lw	a5,-20(s0)
+    80203178:	0007871b          	sext.w	a4,a5
+    8020317c:	47bd                	li	a5,15
+    8020317e:	fae7d4e3          	bge	a5,a4,80203126 <exit+0x42>
+    }
+  }
+
+  eput(p->cwd);
+    80203182:	fe043783          	ld	a5,-32(s0)
+    80203186:	1587b783          	ld	a5,344(a5)
+    8020318a:	853e                	mv	a0,a5
+    8020318c:	00007097          	auipc	ra,0x7
+    80203190:	a1a080e7          	jalr	-1510(ra) # 80209ba6 <eput>
+  p->cwd = 0;
+    80203194:	fe043783          	ld	a5,-32(s0)
+    80203198:	1407bc23          	sd	zero,344(a5)
+  // we might re-parent a child to init. we can't be precise about
+  // waking up init, since we can't acquire its lock once we've
+  // acquired any other proc lock. so wake up init whether that's
+  // necessary or not. init may miss this wakeup, but that seems
+  // harmless.
+  acquire(&initproc->lock);
+    8020319c:	0001b797          	auipc	a5,0x1b
+    802031a0:	f7478793          	addi	a5,a5,-140 # 8021e110 <initproc>
+    802031a4:	639c                	ld	a5,0(a5)
+    802031a6:	853e                	mv	a0,a5
+    802031a8:	ffffe097          	auipc	ra,0xffffe
+    802031ac:	840080e7          	jalr	-1984(ra) # 802009e8 <acquire>
+  wakeup1(initproc);
+    802031b0:	0001b797          	auipc	a5,0x1b
+    802031b4:	f6078793          	addi	a5,a5,-160 # 8021e110 <initproc>
+    802031b8:	639c                	ld	a5,0(a5)
+    802031ba:	853e                	mv	a0,a5
+    802031bc:	00000097          	auipc	ra,0x0
+    802031c0:	716080e7          	jalr	1814(ra) # 802038d2 <wakeup1>
+  release(&initproc->lock);
+    802031c4:	0001b797          	auipc	a5,0x1b
+    802031c8:	f4c78793          	addi	a5,a5,-180 # 8021e110 <initproc>
+    802031cc:	639c                	ld	a5,0(a5)
+    802031ce:	853e                	mv	a0,a5
+    802031d0:	ffffe097          	auipc	ra,0xffffe
+    802031d4:	87c080e7          	jalr	-1924(ra) # 80200a4c <release>
+  // parent we locked. in case our parent gives us away to init while
+  // we're waiting for the parent lock. we may then race with an
+  // exiting parent, but the result will be a harmless spurious wakeup
+  // to a dead or wrong process; proc structs are never re-allocated
+  // as anything else.
+  acquire(&p->lock);
+    802031d8:	fe043783          	ld	a5,-32(s0)
+    802031dc:	853e                	mv	a0,a5
+    802031de:	ffffe097          	auipc	ra,0xffffe
+    802031e2:	80a080e7          	jalr	-2038(ra) # 802009e8 <acquire>
+  struct proc *original_parent = p->parent;
+    802031e6:	fe043783          	ld	a5,-32(s0)
+    802031ea:	739c                	ld	a5,32(a5)
+    802031ec:	fcf43c23          	sd	a5,-40(s0)
+  release(&p->lock);
+    802031f0:	fe043783          	ld	a5,-32(s0)
+    802031f4:	853e                	mv	a0,a5
+    802031f6:	ffffe097          	auipc	ra,0xffffe
+    802031fa:	856080e7          	jalr	-1962(ra) # 80200a4c <release>
+  
+  // we need the parent's lock in order to wake it up from wait().
+  // the parent-then-child rule says we have to lock it first.
+  acquire(&original_parent->lock);
+    802031fe:	fd843783          	ld	a5,-40(s0)
+    80203202:	853e                	mv	a0,a5
+    80203204:	ffffd097          	auipc	ra,0xffffd
+    80203208:	7e4080e7          	jalr	2020(ra) # 802009e8 <acquire>
+
+  acquire(&p->lock);
+    8020320c:	fe043783          	ld	a5,-32(s0)
+    80203210:	853e                	mv	a0,a5
+    80203212:	ffffd097          	auipc	ra,0xffffd
+    80203216:	7d6080e7          	jalr	2006(ra) # 802009e8 <acquire>
+
+  // Give any children to init.
+  reparent(p);
+    8020321a:	fe043503          	ld	a0,-32(s0)
+    8020321e:	00000097          	auipc	ra,0x0
+    80203222:	e4a080e7          	jalr	-438(ra) # 80203068 <reparent>
+
+  // Parent might be sleeping in wait().
+  wakeup1(original_parent);
+    80203226:	fd843503          	ld	a0,-40(s0)
+    8020322a:	00000097          	auipc	ra,0x0
+    8020322e:	6a8080e7          	jalr	1704(ra) # 802038d2 <wakeup1>
+
+  p->xstate = status;
+    80203232:	fe043783          	ld	a5,-32(s0)
+    80203236:	fcc42703          	lw	a4,-52(s0)
+    8020323a:	dbd8                	sw	a4,52(a5)
+  p->state = ZOMBIE;
+    8020323c:	fe043783          	ld	a5,-32(s0)
+    80203240:	4711                	li	a4,4
+    80203242:	cf98                	sw	a4,24(a5)
+
+  release(&original_parent->lock);
+    80203244:	fd843783          	ld	a5,-40(s0)
+    80203248:	853e                	mv	a0,a5
+    8020324a:	ffffe097          	auipc	ra,0xffffe
+    8020324e:	802080e7          	jalr	-2046(ra) # 80200a4c <release>
+
+  // Jump into the scheduler, never to return.
+  sched();
+    80203252:	00000097          	auipc	ra,0x0
+    80203256:	3cc080e7          	jalr	972(ra) # 8020361e <sched>
+  panic("zombie exit");
+    8020325a:	0000a517          	auipc	a0,0xa
+    8020325e:	46e50513          	addi	a0,a0,1134 # 8020d6c8 <etext+0x6c8>
+    80203262:	ffffd097          	auipc	ra,0xffffd
+    80203266:	1e2080e7          	jalr	482(ra) # 80200444 <panic>
+
+000000008020326a <wait>:
+
+// Wait for a child process to exit and return its pid.
+// Return -1 if this process has no children.
+int
+wait(uint64 addr)
+{
+    8020326a:	7139                	addi	sp,sp,-64
+    8020326c:	fc06                	sd	ra,56(sp)
+    8020326e:	f822                	sd	s0,48(sp)
+    80203270:	0080                	addi	s0,sp,64
+    80203272:	fca43423          	sd	a0,-56(s0)
+  struct proc *np;
+  int havekids, pid;
+  struct proc *p = myproc();
+    80203276:	fffff097          	auipc	ra,0xfffff
+    8020327a:	6ec080e7          	jalr	1772(ra) # 80202962 <myproc>
+    8020327e:	fca43c23          	sd	a0,-40(s0)
+
+  // hold p->lock for the whole time to avoid lost
+  // wakeups from a child's exit().
+  acquire(&p->lock);
+    80203282:	fd843783          	ld	a5,-40(s0)
+    80203286:	853e                	mv	a0,a5
+    80203288:	ffffd097          	auipc	ra,0xffffd
+    8020328c:	760080e7          	jalr	1888(ra) # 802009e8 <acquire>
+
+  for(;;){
+    // Scan through table looking for exited children.
+    havekids = 0;
+    80203290:	fe042223          	sw	zero,-28(s0)
+    for(np = proc; np < &proc[NPROC]; np++){
+    80203294:	00016797          	auipc	a5,0x16
+    80203298:	ecc78793          	addi	a5,a5,-308 # 80219160 <proc>
+    8020329c:	fef43423          	sd	a5,-24(s0)
+    802032a0:	a0e1                	j	80203368 <wait+0xfe>
+      // this code uses np->parent without holding np->lock.
+      // acquiring the lock first would cause a deadlock,
+      // since np might be an ancestor, and we already hold p->lock.
+      if(np->parent == p){
+    802032a2:	fe843783          	ld	a5,-24(s0)
+    802032a6:	739c                	ld	a5,32(a5)
+    802032a8:	fd843703          	ld	a4,-40(s0)
+    802032ac:	0af71863          	bne	a4,a5,8020335c <wait+0xf2>
+        // np->parent can't change between the check and the acquire()
+        // because only the parent changes it, and we're the parent.
+        acquire(&np->lock);
+    802032b0:	fe843783          	ld	a5,-24(s0)
+    802032b4:	853e                	mv	a0,a5
+    802032b6:	ffffd097          	auipc	ra,0xffffd
+    802032ba:	732080e7          	jalr	1842(ra) # 802009e8 <acquire>
+        havekids = 1;
+    802032be:	4785                	li	a5,1
+    802032c0:	fef42223          	sw	a5,-28(s0)
+        if(np->state == ZOMBIE){
+    802032c4:	fe843783          	ld	a5,-24(s0)
+    802032c8:	4f9c                	lw	a5,24(a5)
+    802032ca:	873e                	mv	a4,a5
+    802032cc:	4791                	li	a5,4
+    802032ce:	08f71063          	bne	a4,a5,8020334e <wait+0xe4>
+          // Found one.
+          pid = np->pid;
+    802032d2:	fe843783          	ld	a5,-24(s0)
+    802032d6:	5f9c                	lw	a5,56(a5)
+    802032d8:	fcf42a23          	sw	a5,-44(s0)
+          if(addr != 0 && copyout2(addr, (char *)&np->xstate, sizeof(np->xstate)) < 0) {
+    802032dc:	fc843783          	ld	a5,-56(s0)
+    802032e0:	c3a1                	beqz	a5,80203320 <wait+0xb6>
+    802032e2:	fe843783          	ld	a5,-24(s0)
+    802032e6:	03478793          	addi	a5,a5,52
+    802032ea:	4611                	li	a2,4
+    802032ec:	85be                	mv	a1,a5
+    802032ee:	fc843503          	ld	a0,-56(s0)
+    802032f2:	fffff097          	auipc	ra,0xfffff
+    802032f6:	b78080e7          	jalr	-1160(ra) # 80201e6a <copyout2>
+    802032fa:	87aa                	mv	a5,a0
+    802032fc:	0207d263          	bgez	a5,80203320 <wait+0xb6>
+            release(&np->lock);
+    80203300:	fe843783          	ld	a5,-24(s0)
+    80203304:	853e                	mv	a0,a5
+    80203306:	ffffd097          	auipc	ra,0xffffd
+    8020330a:	746080e7          	jalr	1862(ra) # 80200a4c <release>
+            release(&p->lock);
+    8020330e:	fd843783          	ld	a5,-40(s0)
+    80203312:	853e                	mv	a0,a5
+    80203314:	ffffd097          	auipc	ra,0xffffd
+    80203318:	738080e7          	jalr	1848(ra) # 80200a4c <release>
+            return -1;
+    8020331c:	57fd                	li	a5,-1
+    8020331e:	a841                	j	802033ae <wait+0x144>
+          }
+          freeproc(np);
+    80203320:	fe843503          	ld	a0,-24(s0)
+    80203324:	00000097          	auipc	ra,0x0
+    80203328:	832080e7          	jalr	-1998(ra) # 80202b56 <freeproc>
+          release(&np->lock);
+    8020332c:	fe843783          	ld	a5,-24(s0)
+    80203330:	853e                	mv	a0,a5
+    80203332:	ffffd097          	auipc	ra,0xffffd
+    80203336:	71a080e7          	jalr	1818(ra) # 80200a4c <release>
+          release(&p->lock);
+    8020333a:	fd843783          	ld	a5,-40(s0)
+    8020333e:	853e                	mv	a0,a5
+    80203340:	ffffd097          	auipc	ra,0xffffd
+    80203344:	70c080e7          	jalr	1804(ra) # 80200a4c <release>
+          return pid;
+    80203348:	fd442783          	lw	a5,-44(s0)
+    8020334c:	a08d                	j	802033ae <wait+0x144>
+        }
+        release(&np->lock);
+    8020334e:	fe843783          	ld	a5,-24(s0)
+    80203352:	853e                	mv	a0,a5
+    80203354:	ffffd097          	auipc	ra,0xffffd
+    80203358:	6f8080e7          	jalr	1784(ra) # 80200a4c <release>
+    for(np = proc; np < &proc[NPROC]; np++){
+    8020335c:	fe843783          	ld	a5,-24(s0)
+    80203360:	19878793          	addi	a5,a5,408
+    80203364:	fef43423          	sd	a5,-24(s0)
+    80203368:	fe843703          	ld	a4,-24(s0)
+    8020336c:	0001b797          	auipc	a5,0x1b
+    80203370:	da478793          	addi	a5,a5,-604 # 8021e110 <initproc>
+    80203374:	f2f767e3          	bltu	a4,a5,802032a2 <wait+0x38>
+      }
+    }
+
+    // No point waiting if we don't have any children.
+    if(!havekids || p->killed){
+    80203378:	fe442783          	lw	a5,-28(s0)
+    8020337c:	2781                	sext.w	a5,a5
+    8020337e:	c789                	beqz	a5,80203388 <wait+0x11e>
+    80203380:	fd843783          	ld	a5,-40(s0)
+    80203384:	5b9c                	lw	a5,48(a5)
+    80203386:	cb91                	beqz	a5,8020339a <wait+0x130>
+      release(&p->lock);
+    80203388:	fd843783          	ld	a5,-40(s0)
+    8020338c:	853e                	mv	a0,a5
+    8020338e:	ffffd097          	auipc	ra,0xffffd
+    80203392:	6be080e7          	jalr	1726(ra) # 80200a4c <release>
+      return -1;
+    80203396:	57fd                	li	a5,-1
+    80203398:	a819                	j	802033ae <wait+0x144>
+    }
+    
+    // Wait for a child to exit.
+    sleep(p, &p->lock);  //DOC: wait-sleep
+    8020339a:	fd843783          	ld	a5,-40(s0)
+    8020339e:	85be                	mv	a1,a5
+    802033a0:	fd843503          	ld	a0,-40(s0)
+    802033a4:	00000097          	auipc	ra,0x0
+    802033a8:	418080e7          	jalr	1048(ra) # 802037bc <sleep>
+    havekids = 0;
+    802033ac:	b5d5                	j	80203290 <wait+0x26>
+  }
+}
+    802033ae:	853e                	mv	a0,a5
+    802033b0:	70e2                	ld	ra,56(sp)
+    802033b2:	7442                	ld	s0,48(sp)
+    802033b4:	6121                	addi	sp,sp,64
+    802033b6:	8082                	ret
+
+00000000802033b8 <do_wait>:
+
+int
+do_wait(uint64 pid, uint64 addr)
+{
+    802033b8:	7179                	addi	sp,sp,-48
+    802033ba:	f406                	sd	ra,40(sp)
+    802033bc:	f022                	sd	s0,32(sp)
+    802033be:	1800                	addi	s0,sp,48
+    802033c0:	fca43c23          	sd	a0,-40(s0)
+    802033c4:	fcb43823          	sd	a1,-48(s0)
+  struct proc *np;
+  struct proc *p = myproc();
+    802033c8:	fffff097          	auipc	ra,0xfffff
+    802033cc:	59a080e7          	jalr	1434(ra) # 80202962 <myproc>
+    802033d0:	fea43023          	sd	a0,-32(s0)
+
+  // hold p->lock for the whole time to avoid lost
+  // wakeups from a child's exit().
+  acquire(&p->lock);
+    802033d4:	fe043783          	ld	a5,-32(s0)
+    802033d8:	853e                	mv	a0,a5
+    802033da:	ffffd097          	auipc	ra,0xffffd
+    802033de:	60e080e7          	jalr	1550(ra) # 802009e8 <acquire>
+
+  for(np = proc; np < &proc[NPROC]; np++){
+    802033e2:	00016797          	auipc	a5,0x16
+    802033e6:	d7e78793          	addi	a5,a5,-642 # 80219160 <proc>
+    802033ea:	fef43423          	sd	a5,-24(s0)
+    802033ee:	a8c5                	j	802034de <do_wait+0x126>
+    // this code uses np->parent without holding np->lock.
+    // acquiring the lock first would cause a deadlock,
+    // since np might be an ancestor, and we already hold p->lock.
+    if(np->parent == p && np->pid == pid){
+    802033f0:	fe843783          	ld	a5,-24(s0)
+    802033f4:	739c                	ld	a5,32(a5)
+    802033f6:	fe043703          	ld	a4,-32(s0)
+    802033fa:	0cf71c63          	bne	a4,a5,802034d2 <do_wait+0x11a>
+    802033fe:	fe843783          	ld	a5,-24(s0)
+    80203402:	5f9c                	lw	a5,56(a5)
+    80203404:	873e                	mv	a4,a5
+    80203406:	fd843783          	ld	a5,-40(s0)
+    8020340a:	0ce79463          	bne	a5,a4,802034d2 <do_wait+0x11a>
+      // np->parent can't change between the check and the acquire()
+      // because only the parent changes it, and we're the parent.
+      for (;;) {
+        acquire(&np->lock);
+    8020340e:	fe843783          	ld	a5,-24(s0)
+    80203412:	853e                	mv	a0,a5
+    80203414:	ffffd097          	auipc	ra,0xffffd
+    80203418:	5d4080e7          	jalr	1492(ra) # 802009e8 <acquire>
+        if(np->state == ZOMBIE){
+    8020341c:	fe843783          	ld	a5,-24(s0)
+    80203420:	4f9c                	lw	a5,24(a5)
+    80203422:	873e                	mv	a4,a5
+    80203424:	4791                	li	a5,4
+    80203426:	08f71563          	bne	a4,a5,802034b0 <do_wait+0xf8>
+          if(addr != 0 && copyout2(addr, (char *)&np->xstate, sizeof(np->xstate)) < 0) {
+    8020342a:	fd043783          	ld	a5,-48(s0)
+    8020342e:	c3a1                	beqz	a5,8020346e <do_wait+0xb6>
+    80203430:	fe843783          	ld	a5,-24(s0)
+    80203434:	03478793          	addi	a5,a5,52
+    80203438:	4611                	li	a2,4
+    8020343a:	85be                	mv	a1,a5
+    8020343c:	fd043503          	ld	a0,-48(s0)
+    80203440:	fffff097          	auipc	ra,0xfffff
+    80203444:	a2a080e7          	jalr	-1494(ra) # 80201e6a <copyout2>
+    80203448:	87aa                	mv	a5,a0
+    8020344a:	0207d263          	bgez	a5,8020346e <do_wait+0xb6>
+            release(&np->lock);
+    8020344e:	fe843783          	ld	a5,-24(s0)
+    80203452:	853e                	mv	a0,a5
+    80203454:	ffffd097          	auipc	ra,0xffffd
+    80203458:	5f8080e7          	jalr	1528(ra) # 80200a4c <release>
+            release(&p->lock);
+    8020345c:	fe043783          	ld	a5,-32(s0)
+    80203460:	853e                	mv	a0,a5
+    80203462:	ffffd097          	auipc	ra,0xffffd
+    80203466:	5ea080e7          	jalr	1514(ra) # 80200a4c <release>
+            return -1;
+    8020346a:	57fd                	li	a5,-1
+    8020346c:	a849                	j	802034fe <do_wait+0x146>
+          }
+          *((uint32*)addr) <<= 8;
+    8020346e:	fd043783          	ld	a5,-48(s0)
+    80203472:	4398                	lw	a4,0(a5)
+    80203474:	fd043783          	ld	a5,-48(s0)
+    80203478:	0087171b          	slliw	a4,a4,0x8
+    8020347c:	2701                	sext.w	a4,a4
+    8020347e:	c398                	sw	a4,0(a5)
+          freeproc(np);
+    80203480:	fe843503          	ld	a0,-24(s0)
+    80203484:	fffff097          	auipc	ra,0xfffff
+    80203488:	6d2080e7          	jalr	1746(ra) # 80202b56 <freeproc>
+          release(&np->lock);
+    8020348c:	fe843783          	ld	a5,-24(s0)
+    80203490:	853e                	mv	a0,a5
+    80203492:	ffffd097          	auipc	ra,0xffffd
+    80203496:	5ba080e7          	jalr	1466(ra) # 80200a4c <release>
+          release(&p->lock);
+    8020349a:	fe043783          	ld	a5,-32(s0)
+    8020349e:	853e                	mv	a0,a5
+    802034a0:	ffffd097          	auipc	ra,0xffffd
+    802034a4:	5ac080e7          	jalr	1452(ra) # 80200a4c <release>
+          return pid;
+    802034a8:	fd843783          	ld	a5,-40(s0)
+    802034ac:	2781                	sext.w	a5,a5
+    802034ae:	a881                	j	802034fe <do_wait+0x146>
+        }
+        release(&np->lock);
+    802034b0:	fe843783          	ld	a5,-24(s0)
+    802034b4:	853e                	mv	a0,a5
+    802034b6:	ffffd097          	auipc	ra,0xffffd
+    802034ba:	596080e7          	jalr	1430(ra) # 80200a4c <release>
+
+        sleep(p, &p->lock);
+    802034be:	fe043783          	ld	a5,-32(s0)
+    802034c2:	85be                	mv	a1,a5
+    802034c4:	fe043503          	ld	a0,-32(s0)
+    802034c8:	00000097          	auipc	ra,0x0
+    802034cc:	2f4080e7          	jalr	756(ra) # 802037bc <sleep>
+        acquire(&np->lock);
+    802034d0:	bf3d                	j	8020340e <do_wait+0x56>
+  for(np = proc; np < &proc[NPROC]; np++){
+    802034d2:	fe843783          	ld	a5,-24(s0)
+    802034d6:	19878793          	addi	a5,a5,408
+    802034da:	fef43423          	sd	a5,-24(s0)
+    802034de:	fe843703          	ld	a4,-24(s0)
+    802034e2:	0001b797          	auipc	a5,0x1b
+    802034e6:	c2e78793          	addi	a5,a5,-978 # 8021e110 <initproc>
+    802034ea:	f0f763e3          	bltu	a4,a5,802033f0 <do_wait+0x38>
+      }
+    }
+  }
+  release(&p->lock);
+    802034ee:	fe043783          	ld	a5,-32(s0)
+    802034f2:	853e                	mv	a0,a5
+    802034f4:	ffffd097          	auipc	ra,0xffffd
+    802034f8:	558080e7          	jalr	1368(ra) # 80200a4c <release>
+  return -1;
+    802034fc:	57fd                	li	a5,-1
+}
+    802034fe:	853e                	mv	a0,a5
+    80203500:	70a2                	ld	ra,40(sp)
+    80203502:	7402                	ld	s0,32(sp)
+    80203504:	6145                	addi	sp,sp,48
+    80203506:	8082                	ret
+
+0000000080203508 <scheduler>:
+//  - swtch to start running that process.
+//  - eventually that process transfers control
+//    via swtch back to the scheduler.
+void
+scheduler(void)
+{
+    80203508:	7179                	addi	sp,sp,-48
+    8020350a:	f406                	sd	ra,40(sp)
+    8020350c:	f022                	sd	s0,32(sp)
+    8020350e:	1800                	addi	s0,sp,48
+  struct proc *p;
+  struct cpu *c = mycpu();
+    80203510:	fffff097          	auipc	ra,0xfffff
+    80203514:	418080e7          	jalr	1048(ra) # 80202928 <mycpu>
+    80203518:	fca43c23          	sd	a0,-40(s0)
+  extern pagetable_t kernel_pagetable;
+
+  c->proc = 0;
+    8020351c:	fd843783          	ld	a5,-40(s0)
+    80203520:	0007b023          	sd	zero,0(a5)
+  for(;;){
+    // Avoid deadlock by ensuring that devices can interrupt.
+    intr_on();
+    80203524:	fffff097          	auipc	ra,0xfffff
+    80203528:	138080e7          	jalr	312(ra) # 8020265c <intr_on>
+    
+    int found = 0;
+    8020352c:	fe042223          	sw	zero,-28(s0)
+    for(p = proc; p < &proc[NPROC]; p++) {
+    80203530:	00016797          	auipc	a5,0x16
+    80203534:	c3078793          	addi	a5,a5,-976 # 80219160 <proc>
+    80203538:	fef43423          	sd	a5,-24(s0)
+    8020353c:	a875                	j	802035f8 <scheduler+0xf0>
+      acquire(&p->lock);   //
+    8020353e:	fe843783          	ld	a5,-24(s0)
+    80203542:	853e                	mv	a0,a5
+    80203544:	ffffd097          	auipc	ra,0xffffd
+    80203548:	4a4080e7          	jalr	1188(ra) # 802009e8 <acquire>
+      if(p->state == RUNNABLE) {
+    8020354c:	fe843783          	ld	a5,-24(s0)
+    80203550:	4f9c                	lw	a5,24(a5)
+    80203552:	873e                	mv	a4,a5
+    80203554:	4789                	li	a5,2
+    80203556:	08f71463          	bne	a4,a5,802035de <scheduler+0xd6>
+        // Switch to chosen process.  It is the process's job
+        // to release its lock and then reacquire it
+        // before jumping back to us.
+        // printf("[scheduler]found runnable proc with pid: %d\n", p->pid);
+        p->state = RUNNING;
+    8020355a:	fe843783          	ld	a5,-24(s0)
+    8020355e:	470d                	li	a4,3
+    80203560:	cf98                	sw	a4,24(a5)
+        c->proc = p;
+    80203562:	fd843783          	ld	a5,-40(s0)
+    80203566:	fe843703          	ld	a4,-24(s0)
+    8020356a:	e398                	sd	a4,0(a5)
+        w_satp(MAKE_SATP(p->kpagetable));
+    8020356c:	fe843783          	ld	a5,-24(s0)
+    80203570:	6fbc                	ld	a5,88(a5)
+    80203572:	00c7d713          	srli	a4,a5,0xc
+    80203576:	57fd                	li	a5,-1
+    80203578:	17fe                	slli	a5,a5,0x3f
+    8020357a:	8fd9                	or	a5,a5,a4
+    8020357c:	853e                	mv	a0,a5
+    8020357e:	fffff097          	auipc	ra,0xfffff
+    80203582:	076080e7          	jalr	118(ra) # 802025f4 <w_satp>
+        sfence_vma();
+    80203586:	fffff097          	auipc	ra,0xfffff
+    8020358a:	176080e7          	jalr	374(ra) # 802026fc <sfence_vma>
+        swtch(&c->context, &p->context); //切换上下文
+    8020358e:	fd843783          	ld	a5,-40(s0)
+    80203592:	00878713          	addi	a4,a5,8
+    80203596:	fe843783          	ld	a5,-24(s0)
+    8020359a:	06878793          	addi	a5,a5,104
+    8020359e:	85be                	mv	a1,a5
+    802035a0:	853a                	mv	a0,a4
+    802035a2:	00000097          	auipc	ra,0x0
+    802035a6:	624080e7          	jalr	1572(ra) # 80203bc6 <swtch>
+        w_satp(MAKE_SATP(kernel_pagetable));
+    802035aa:	0000d797          	auipc	a5,0xd
+    802035ae:	f467b783          	ld	a5,-186(a5) # 802104f0 <_GLOBAL_OFFSET_TABLE_+0x68>
+    802035b2:	639c                	ld	a5,0(a5)
+    802035b4:	00c7d713          	srli	a4,a5,0xc
+    802035b8:	57fd                	li	a5,-1
+    802035ba:	17fe                	slli	a5,a5,0x3f
+    802035bc:	8fd9                	or	a5,a5,a4
+    802035be:	853e                	mv	a0,a5
+    802035c0:	fffff097          	auipc	ra,0xfffff
+    802035c4:	034080e7          	jalr	52(ra) # 802025f4 <w_satp>
+        sfence_vma();
+    802035c8:	fffff097          	auipc	ra,0xfffff
+    802035cc:	134080e7          	jalr	308(ra) # 802026fc <sfence_vma>
+        // Process is done running for now.
+        // It should have changed its p->state before coming back.
+        c->proc = 0;
+    802035d0:	fd843783          	ld	a5,-40(s0)
+    802035d4:	0007b023          	sd	zero,0(a5)
+
+        found = 1;
+    802035d8:	4785                	li	a5,1
+    802035da:	fef42223          	sw	a5,-28(s0)
+      }
+      release(&p->lock);
+    802035de:	fe843783          	ld	a5,-24(s0)
+    802035e2:	853e                	mv	a0,a5
+    802035e4:	ffffd097          	auipc	ra,0xffffd
+    802035e8:	468080e7          	jalr	1128(ra) # 80200a4c <release>
+    for(p = proc; p < &proc[NPROC]; p++) {
+    802035ec:	fe843783          	ld	a5,-24(s0)
+    802035f0:	19878793          	addi	a5,a5,408
+    802035f4:	fef43423          	sd	a5,-24(s0)
+    802035f8:	fe843703          	ld	a4,-24(s0)
+    802035fc:	0001b797          	auipc	a5,0x1b
+    80203600:	b1478793          	addi	a5,a5,-1260 # 8021e110 <initproc>
+    80203604:	f2f76de3          	bltu	a4,a5,8020353e <scheduler+0x36>
+    }
+    if(found == 0) {
+    80203608:	fe442783          	lw	a5,-28(s0)
+    8020360c:	2781                	sext.w	a5,a5
+    8020360e:	fb99                	bnez	a5,80203524 <scheduler+0x1c>
+      intr_on();
+    80203610:	fffff097          	auipc	ra,0xfffff
+    80203614:	04c080e7          	jalr	76(ra) # 8020265c <intr_on>
+      asm volatile("wfi");
+    80203618:	10500073          	wfi
+  for(;;){
+    8020361c:	b721                	j	80203524 <scheduler+0x1c>
+
+000000008020361e <sched>:
+// be proc->intena and proc->noff, but that would
+// break in the few places where a lock is held but
+// there's no process.
+void
+sched(void)
+{
+    8020361e:	7179                	addi	sp,sp,-48
+    80203620:	f406                	sd	ra,40(sp)
+    80203622:	f022                	sd	s0,32(sp)
+    80203624:	ec26                	sd	s1,24(sp)
+    80203626:	1800                	addi	s0,sp,48
+  int intena;
+  struct proc *p = myproc();
+    80203628:	fffff097          	auipc	ra,0xfffff
+    8020362c:	33a080e7          	jalr	826(ra) # 80202962 <myproc>
+    80203630:	fca43c23          	sd	a0,-40(s0)
+
+  if(!holding(&p->lock))
+    80203634:	fd843783          	ld	a5,-40(s0)
+    80203638:	853e                	mv	a0,a5
+    8020363a:	ffffd097          	auipc	ra,0xffffd
+    8020363e:	468080e7          	jalr	1128(ra) # 80200aa2 <holding>
+    80203642:	87aa                	mv	a5,a0
+    80203644:	eb89                	bnez	a5,80203656 <sched+0x38>
+    panic("sched p->lock");
+    80203646:	0000a517          	auipc	a0,0xa
+    8020364a:	09250513          	addi	a0,a0,146 # 8020d6d8 <etext+0x6d8>
+    8020364e:	ffffd097          	auipc	ra,0xffffd
+    80203652:	df6080e7          	jalr	-522(ra) # 80200444 <panic>
+  if(mycpu()->noff != 1)
+    80203656:	fffff097          	auipc	ra,0xfffff
+    8020365a:	2d2080e7          	jalr	722(ra) # 80202928 <mycpu>
+    8020365e:	87aa                	mv	a5,a0
+    80203660:	5fbc                	lw	a5,120(a5)
+    80203662:	873e                	mv	a4,a5
+    80203664:	4785                	li	a5,1
+    80203666:	00f70a63          	beq	a4,a5,8020367a <sched+0x5c>
+    panic("sched locks");
+    8020366a:	0000a517          	auipc	a0,0xa
+    8020366e:	07e50513          	addi	a0,a0,126 # 8020d6e8 <etext+0x6e8>
+    80203672:	ffffd097          	auipc	ra,0xffffd
+    80203676:	dd2080e7          	jalr	-558(ra) # 80200444 <panic>
+  if(p->state == RUNNING)
+    8020367a:	fd843783          	ld	a5,-40(s0)
+    8020367e:	4f9c                	lw	a5,24(a5)
+    80203680:	873e                	mv	a4,a5
+    80203682:	478d                	li	a5,3
+    80203684:	00f71a63          	bne	a4,a5,80203698 <sched+0x7a>
+    panic("sched running");
+    80203688:	0000a517          	auipc	a0,0xa
+    8020368c:	07050513          	addi	a0,a0,112 # 8020d6f8 <etext+0x6f8>
+    80203690:	ffffd097          	auipc	ra,0xffffd
+    80203694:	db4080e7          	jalr	-588(ra) # 80200444 <panic>
+  if(intr_get())
+    80203698:	fffff097          	auipc	ra,0xfffff
+    8020369c:	fee080e7          	jalr	-18(ra) # 80202686 <intr_get>
+    802036a0:	87aa                	mv	a5,a0
+    802036a2:	cb89                	beqz	a5,802036b4 <sched+0x96>
+    panic("sched interruptible");
+    802036a4:	0000a517          	auipc	a0,0xa
+    802036a8:	06450513          	addi	a0,a0,100 # 8020d708 <etext+0x708>
+    802036ac:	ffffd097          	auipc	ra,0xffffd
+    802036b0:	d98080e7          	jalr	-616(ra) # 80200444 <panic>
+
+  intena = mycpu()->intena;
+    802036b4:	fffff097          	auipc	ra,0xfffff
+    802036b8:	274080e7          	jalr	628(ra) # 80202928 <mycpu>
+    802036bc:	87aa                	mv	a5,a0
+    802036be:	5ffc                	lw	a5,124(a5)
+    802036c0:	fcf42a23          	sw	a5,-44(s0)
+  swtch(&p->context, &mycpu()->context);
+    802036c4:	fd843783          	ld	a5,-40(s0)
+    802036c8:	06878493          	addi	s1,a5,104
+    802036cc:	fffff097          	auipc	ra,0xfffff
+    802036d0:	25c080e7          	jalr	604(ra) # 80202928 <mycpu>
+    802036d4:	87aa                	mv	a5,a0
+    802036d6:	07a1                	addi	a5,a5,8
+    802036d8:	85be                	mv	a1,a5
+    802036da:	8526                	mv	a0,s1
+    802036dc:	00000097          	auipc	ra,0x0
+    802036e0:	4ea080e7          	jalr	1258(ra) # 80203bc6 <swtch>
+  mycpu()->intena = intena;
+    802036e4:	fffff097          	auipc	ra,0xfffff
+    802036e8:	244080e7          	jalr	580(ra) # 80202928 <mycpu>
+    802036ec:	872a                	mv	a4,a0
+    802036ee:	fd442783          	lw	a5,-44(s0)
+    802036f2:	df7c                	sw	a5,124(a4)
+}
+    802036f4:	0001                	nop
+    802036f6:	70a2                	ld	ra,40(sp)
+    802036f8:	7402                	ld	s0,32(sp)
+    802036fa:	64e2                	ld	s1,24(sp)
+    802036fc:	6145                	addi	sp,sp,48
+    802036fe:	8082                	ret
+
+0000000080203700 <yield>:
+
+// Give up the CPU for one scheduling round.
+void
+yield(void)
+{
+    80203700:	1101                	addi	sp,sp,-32
+    80203702:	ec06                	sd	ra,24(sp)
+    80203704:	e822                	sd	s0,16(sp)
+    80203706:	1000                	addi	s0,sp,32
+  struct proc *p = myproc();
+    80203708:	fffff097          	auipc	ra,0xfffff
+    8020370c:	25a080e7          	jalr	602(ra) # 80202962 <myproc>
+    80203710:	fea43423          	sd	a0,-24(s0)
+  acquire(&p->lock);
+    80203714:	fe843783          	ld	a5,-24(s0)
+    80203718:	853e                	mv	a0,a5
+    8020371a:	ffffd097          	auipc	ra,0xffffd
+    8020371e:	2ce080e7          	jalr	718(ra) # 802009e8 <acquire>
+  p->state = RUNNABLE;
+    80203722:	fe843783          	ld	a5,-24(s0)
+    80203726:	4709                	li	a4,2
+    80203728:	cf98                	sw	a4,24(a5)
+  sched();
+    8020372a:	00000097          	auipc	ra,0x0
+    8020372e:	ef4080e7          	jalr	-268(ra) # 8020361e <sched>
+  release(&p->lock);
+    80203732:	fe843783          	ld	a5,-24(s0)
+    80203736:	853e                	mv	a0,a5
+    80203738:	ffffd097          	auipc	ra,0xffffd
+    8020373c:	314080e7          	jalr	788(ra) # 80200a4c <release>
+}
+    80203740:	0001                	nop
+    80203742:	60e2                	ld	ra,24(sp)
+    80203744:	6442                	ld	s0,16(sp)
+    80203746:	6105                	addi	sp,sp,32
+    80203748:	8082                	ret
+
+000000008020374a <forkret>:
+
+// A fork child's very first scheduling by scheduler()
+// will swtch to forkret.
+void
+forkret(void)
+{
+    8020374a:	1101                	addi	sp,sp,-32
+    8020374c:	ec06                	sd	ra,24(sp)
+    8020374e:	e822                	sd	s0,16(sp)
+    80203750:	e426                	sd	s1,8(sp)
+    80203752:	1000                	addi	s0,sp,32
+  // printf("run in forkret\n");
+  static int first = 1;
+
+  // Still holding p->lock from scheduler.
+  release(&myproc()->lock);
+    80203754:	fffff097          	auipc	ra,0xfffff
+    80203758:	20e080e7          	jalr	526(ra) # 80202962 <myproc>
+    8020375c:	87aa                	mv	a5,a0
+    8020375e:	853e                	mv	a0,a5
+    80203760:	ffffd097          	auipc	ra,0xffffd
+    80203764:	2ec080e7          	jalr	748(ra) # 80200a4c <release>
+
+  if (first) {
+    80203768:	0000c797          	auipc	a5,0xc
+    8020376c:	8b078793          	addi	a5,a5,-1872 # 8020f018 <first.1704>
+    80203770:	439c                	lw	a5,0(a5)
+    80203772:	cb9d                	beqz	a5,802037a8 <forkret+0x5e>
+    // File system initialization must be run in the context of a
+    // regular process (e.g., because it calls sleep), and thus cannot
+    // be run from main().
+    // printf("[forkret]first scheduling\n");
+    first = 0;
+    80203774:	0000c797          	auipc	a5,0xc
+    80203778:	8a478793          	addi	a5,a5,-1884 # 8020f018 <first.1704>
+    8020377c:	0007a023          	sw	zero,0(a5)
+    fat32_init();
+    80203780:	00004097          	auipc	ra,0x4
+    80203784:	698080e7          	jalr	1688(ra) # 80207e18 <fat32_init>
+    myproc()->cwd = ename("/");
+    80203788:	fffff097          	auipc	ra,0xfffff
+    8020378c:	1da080e7          	jalr	474(ra) # 80202962 <myproc>
+    80203790:	84aa                	mv	s1,a0
+    80203792:	0000a517          	auipc	a0,0xa
+    80203796:	f8e50513          	addi	a0,a0,-114 # 8020d720 <etext+0x720>
+    8020379a:	00007097          	auipc	ra,0x7
+    8020379e:	ea6080e7          	jalr	-346(ra) # 8020a640 <ename>
+    802037a2:	87aa                	mv	a5,a0
+    802037a4:	14f4bc23          	sd	a5,344(s1)
+  }
+
+  usertrapret();
+    802037a8:	00001097          	auipc	ra,0x1
+    802037ac:	806080e7          	jalr	-2042(ra) # 80203fae <usertrapret>
+}
+    802037b0:	0001                	nop
+    802037b2:	60e2                	ld	ra,24(sp)
+    802037b4:	6442                	ld	s0,16(sp)
+    802037b6:	64a2                	ld	s1,8(sp)
+    802037b8:	6105                	addi	sp,sp,32
+    802037ba:	8082                	ret
+
+00000000802037bc <sleep>:
+
+// Atomically release lock and sleep on chan.
+// Reacquires lock when awakened.
+void
+sleep(void *chan, struct spinlock *lk)
+{
+    802037bc:	7179                	addi	sp,sp,-48
+    802037be:	f406                	sd	ra,40(sp)
+    802037c0:	f022                	sd	s0,32(sp)
+    802037c2:	1800                	addi	s0,sp,48
+    802037c4:	fca43c23          	sd	a0,-40(s0)
+    802037c8:	fcb43823          	sd	a1,-48(s0)
+  struct proc *p = myproc();
+    802037cc:	fffff097          	auipc	ra,0xfffff
+    802037d0:	196080e7          	jalr	406(ra) # 80202962 <myproc>
+    802037d4:	fea43423          	sd	a0,-24(s0)
+  // change p->state and then call sched.
+  // Once we hold p->lock, we can be
+  // guaranteed that we won't miss any wakeup
+  // (wakeup locks p->lock),
+  // so it's okay to release lk.
+  if(lk != &p->lock){  //DOC: sleeplock0
+    802037d8:	fe843783          	ld	a5,-24(s0)
+    802037dc:	fd043703          	ld	a4,-48(s0)
+    802037e0:	00f70f63          	beq	a4,a5,802037fe <sleep+0x42>
+    acquire(&p->lock);  //DOC: sleeplock1
+    802037e4:	fe843783          	ld	a5,-24(s0)
+    802037e8:	853e                	mv	a0,a5
+    802037ea:	ffffd097          	auipc	ra,0xffffd
+    802037ee:	1fe080e7          	jalr	510(ra) # 802009e8 <acquire>
+    release(lk);
+    802037f2:	fd043503          	ld	a0,-48(s0)
+    802037f6:	ffffd097          	auipc	ra,0xffffd
+    802037fa:	256080e7          	jalr	598(ra) # 80200a4c <release>
+  }
+
+  // Go to sleep.
+  p->chan = chan;
+    802037fe:	fe843783          	ld	a5,-24(s0)
+    80203802:	fd843703          	ld	a4,-40(s0)
+    80203806:	f798                	sd	a4,40(a5)
+  p->state = SLEEPING;
+    80203808:	fe843783          	ld	a5,-24(s0)
+    8020380c:	4705                	li	a4,1
+    8020380e:	cf98                	sw	a4,24(a5)
+
+  sched();
+    80203810:	00000097          	auipc	ra,0x0
+    80203814:	e0e080e7          	jalr	-498(ra) # 8020361e <sched>
+
+  // Tidy up.
+  p->chan = 0;
+    80203818:	fe843783          	ld	a5,-24(s0)
+    8020381c:	0207b423          	sd	zero,40(a5)
+
+  // Reacquire original lock.
+  if(lk != &p->lock){
+    80203820:	fe843783          	ld	a5,-24(s0)
+    80203824:	fd043703          	ld	a4,-48(s0)
+    80203828:	00f70f63          	beq	a4,a5,80203846 <sleep+0x8a>
+    release(&p->lock);
+    8020382c:	fe843783          	ld	a5,-24(s0)
+    80203830:	853e                	mv	a0,a5
+    80203832:	ffffd097          	auipc	ra,0xffffd
+    80203836:	21a080e7          	jalr	538(ra) # 80200a4c <release>
+    acquire(lk);
+    8020383a:	fd043503          	ld	a0,-48(s0)
+    8020383e:	ffffd097          	auipc	ra,0xffffd
+    80203842:	1aa080e7          	jalr	426(ra) # 802009e8 <acquire>
+  }
+}
+    80203846:	0001                	nop
+    80203848:	70a2                	ld	ra,40(sp)
+    8020384a:	7402                	ld	s0,32(sp)
+    8020384c:	6145                	addi	sp,sp,48
+    8020384e:	8082                	ret
+
+0000000080203850 <wakeup>:
+
+// Wake up all processes sleeping on chan.
+// Must be called without any p->lock.
+void
+wakeup(void *chan)
+{
+    80203850:	7179                	addi	sp,sp,-48
+    80203852:	f406                	sd	ra,40(sp)
+    80203854:	f022                	sd	s0,32(sp)
+    80203856:	1800                	addi	s0,sp,48
+    80203858:	fca43c23          	sd	a0,-40(s0)
+  struct proc *p;
+
+  for(p = proc; p < &proc[NPROC]; p++) {
+    8020385c:	00016797          	auipc	a5,0x16
+    80203860:	90478793          	addi	a5,a5,-1788 # 80219160 <proc>
+    80203864:	fef43423          	sd	a5,-24(s0)
+    80203868:	a0b9                	j	802038b6 <wakeup+0x66>
+    acquire(&p->lock);
+    8020386a:	fe843783          	ld	a5,-24(s0)
+    8020386e:	853e                	mv	a0,a5
+    80203870:	ffffd097          	auipc	ra,0xffffd
+    80203874:	178080e7          	jalr	376(ra) # 802009e8 <acquire>
+    if(p->state == SLEEPING && p->chan == chan) {
+    80203878:	fe843783          	ld	a5,-24(s0)
+    8020387c:	4f9c                	lw	a5,24(a5)
+    8020387e:	873e                	mv	a4,a5
+    80203880:	4785                	li	a5,1
+    80203882:	00f71d63          	bne	a4,a5,8020389c <wakeup+0x4c>
+    80203886:	fe843783          	ld	a5,-24(s0)
+    8020388a:	779c                	ld	a5,40(a5)
+    8020388c:	fd843703          	ld	a4,-40(s0)
+    80203890:	00f71663          	bne	a4,a5,8020389c <wakeup+0x4c>
+      p->state = RUNNABLE;
+    80203894:	fe843783          	ld	a5,-24(s0)
+    80203898:	4709                	li	a4,2
+    8020389a:	cf98                	sw	a4,24(a5)
+    }
+    release(&p->lock);
+    8020389c:	fe843783          	ld	a5,-24(s0)
+    802038a0:	853e                	mv	a0,a5
+    802038a2:	ffffd097          	auipc	ra,0xffffd
+    802038a6:	1aa080e7          	jalr	426(ra) # 80200a4c <release>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802038aa:	fe843783          	ld	a5,-24(s0)
+    802038ae:	19878793          	addi	a5,a5,408
+    802038b2:	fef43423          	sd	a5,-24(s0)
+    802038b6:	fe843703          	ld	a4,-24(s0)
+    802038ba:	0001b797          	auipc	a5,0x1b
+    802038be:	85678793          	addi	a5,a5,-1962 # 8021e110 <initproc>
+    802038c2:	faf764e3          	bltu	a4,a5,8020386a <wakeup+0x1a>
+  }
+}
+    802038c6:	0001                	nop
+    802038c8:	0001                	nop
+    802038ca:	70a2                	ld	ra,40(sp)
+    802038cc:	7402                	ld	s0,32(sp)
+    802038ce:	6145                	addi	sp,sp,48
+    802038d0:	8082                	ret
+
+00000000802038d2 <wakeup1>:
+
+// Wake up p if it is sleeping in wait(); used by exit().
+// Caller must hold p->lock.
+static void
+wakeup1(struct proc *p)
+{
+    802038d2:	1101                	addi	sp,sp,-32
+    802038d4:	ec06                	sd	ra,24(sp)
+    802038d6:	e822                	sd	s0,16(sp)
+    802038d8:	1000                	addi	s0,sp,32
+    802038da:	fea43423          	sd	a0,-24(s0)
+  if(!holding(&p->lock))
+    802038de:	fe843783          	ld	a5,-24(s0)
+    802038e2:	853e                	mv	a0,a5
+    802038e4:	ffffd097          	auipc	ra,0xffffd
+    802038e8:	1be080e7          	jalr	446(ra) # 80200aa2 <holding>
+    802038ec:	87aa                	mv	a5,a0
+    802038ee:	eb89                	bnez	a5,80203900 <wakeup1+0x2e>
+    panic("wakeup1");
+    802038f0:	0000a517          	auipc	a0,0xa
+    802038f4:	e3850513          	addi	a0,a0,-456 # 8020d728 <etext+0x728>
+    802038f8:	ffffd097          	auipc	ra,0xffffd
+    802038fc:	b4c080e7          	jalr	-1204(ra) # 80200444 <panic>
+  if(p->chan == p && p->state == SLEEPING) {
+    80203900:	fe843783          	ld	a5,-24(s0)
+    80203904:	779c                	ld	a5,40(a5)
+    80203906:	fe843703          	ld	a4,-24(s0)
+    8020390a:	00f71d63          	bne	a4,a5,80203924 <wakeup1+0x52>
+    8020390e:	fe843783          	ld	a5,-24(s0)
+    80203912:	4f9c                	lw	a5,24(a5)
+    80203914:	873e                	mv	a4,a5
+    80203916:	4785                	li	a5,1
+    80203918:	00f71663          	bne	a4,a5,80203924 <wakeup1+0x52>
+    p->state = RUNNABLE;
+    8020391c:	fe843783          	ld	a5,-24(s0)
+    80203920:	4709                	li	a4,2
+    80203922:	cf98                	sw	a4,24(a5)
+  }
+}
+    80203924:	0001                	nop
+    80203926:	60e2                	ld	ra,24(sp)
+    80203928:	6442                	ld	s0,16(sp)
+    8020392a:	6105                	addi	sp,sp,32
+    8020392c:	8082                	ret
+
+000000008020392e <kill>:
+// Kill the process with the given pid.
+// The victim won't exit until it tries to return
+// to user space (see usertrap() in trap.c).
+int
+kill(int pid)
+{
+    8020392e:	7179                	addi	sp,sp,-48
+    80203930:	f406                	sd	ra,40(sp)
+    80203932:	f022                	sd	s0,32(sp)
+    80203934:	1800                	addi	s0,sp,48
+    80203936:	87aa                	mv	a5,a0
+    80203938:	fcf42e23          	sw	a5,-36(s0)
+  struct proc *p;
+
+  for(p = proc; p < &proc[NPROC]; p++){
+    8020393c:	00016797          	auipc	a5,0x16
+    80203940:	82478793          	addi	a5,a5,-2012 # 80219160 <proc>
+    80203944:	fef43423          	sd	a5,-24(s0)
+    80203948:	a0ad                	j	802039b2 <kill+0x84>
+    acquire(&p->lock);
+    8020394a:	fe843783          	ld	a5,-24(s0)
+    8020394e:	853e                	mv	a0,a5
+    80203950:	ffffd097          	auipc	ra,0xffffd
+    80203954:	098080e7          	jalr	152(ra) # 802009e8 <acquire>
+    if(p->pid == pid){
+    80203958:	fe843783          	ld	a5,-24(s0)
+    8020395c:	5f98                	lw	a4,56(a5)
+    8020395e:	fdc42783          	lw	a5,-36(s0)
+    80203962:	2781                	sext.w	a5,a5
+    80203964:	02e79a63          	bne	a5,a4,80203998 <kill+0x6a>
+      p->killed = 1;
+    80203968:	fe843783          	ld	a5,-24(s0)
+    8020396c:	4705                	li	a4,1
+    8020396e:	db98                	sw	a4,48(a5)
+      if(p->state == SLEEPING){
+    80203970:	fe843783          	ld	a5,-24(s0)
+    80203974:	4f9c                	lw	a5,24(a5)
+    80203976:	873e                	mv	a4,a5
+    80203978:	4785                	li	a5,1
+    8020397a:	00f71663          	bne	a4,a5,80203986 <kill+0x58>
+        // Wake process from sleep().
+        p->state = RUNNABLE;
+    8020397e:	fe843783          	ld	a5,-24(s0)
+    80203982:	4709                	li	a4,2
+    80203984:	cf98                	sw	a4,24(a5)
+      }
+      release(&p->lock);
+    80203986:	fe843783          	ld	a5,-24(s0)
+    8020398a:	853e                	mv	a0,a5
+    8020398c:	ffffd097          	auipc	ra,0xffffd
+    80203990:	0c0080e7          	jalr	192(ra) # 80200a4c <release>
+      return 0;
+    80203994:	4781                	li	a5,0
+    80203996:	a03d                	j	802039c4 <kill+0x96>
+    }
+    release(&p->lock);
+    80203998:	fe843783          	ld	a5,-24(s0)
+    8020399c:	853e                	mv	a0,a5
+    8020399e:	ffffd097          	auipc	ra,0xffffd
+    802039a2:	0ae080e7          	jalr	174(ra) # 80200a4c <release>
+  for(p = proc; p < &proc[NPROC]; p++){
+    802039a6:	fe843783          	ld	a5,-24(s0)
+    802039aa:	19878793          	addi	a5,a5,408
+    802039ae:	fef43423          	sd	a5,-24(s0)
+    802039b2:	fe843703          	ld	a4,-24(s0)
+    802039b6:	0001a797          	auipc	a5,0x1a
+    802039ba:	75a78793          	addi	a5,a5,1882 # 8021e110 <initproc>
+    802039be:	f8f766e3          	bltu	a4,a5,8020394a <kill+0x1c>
+  }
+  return -1;
+    802039c2:	57fd                	li	a5,-1
+}
+    802039c4:	853e                	mv	a0,a5
+    802039c6:	70a2                	ld	ra,40(sp)
+    802039c8:	7402                	ld	s0,32(sp)
+    802039ca:	6145                	addi	sp,sp,48
+    802039cc:	8082                	ret
+
+00000000802039ce <either_copyout>:
+// Copy to either a user address, or kernel address,
+// depending on usr_dst.
+// Returns 0 on success, -1 on error.
+int
+either_copyout(int user_dst, uint64 dst, void *src, uint64 len)
+{
+    802039ce:	7179                	addi	sp,sp,-48
+    802039d0:	f406                	sd	ra,40(sp)
+    802039d2:	f022                	sd	s0,32(sp)
+    802039d4:	1800                	addi	s0,sp,48
+    802039d6:	87aa                	mv	a5,a0
+    802039d8:	feb43023          	sd	a1,-32(s0)
+    802039dc:	fcc43c23          	sd	a2,-40(s0)
+    802039e0:	fcd43823          	sd	a3,-48(s0)
+    802039e4:	fef42623          	sw	a5,-20(s0)
+  // struct proc *p = myproc();
+  if(user_dst){
+    802039e8:	fec42783          	lw	a5,-20(s0)
+    802039ec:	2781                	sext.w	a5,a5
+    802039ee:	cf89                	beqz	a5,80203a08 <either_copyout+0x3a>
+    // return copyout(p->pagetable, dst, src, len);
+    return copyout2(dst, src, len);
+    802039f0:	fd043603          	ld	a2,-48(s0)
+    802039f4:	fd843583          	ld	a1,-40(s0)
+    802039f8:	fe043503          	ld	a0,-32(s0)
+    802039fc:	ffffe097          	auipc	ra,0xffffe
+    80203a00:	46e080e7          	jalr	1134(ra) # 80201e6a <copyout2>
+    80203a04:	87aa                	mv	a5,a0
+    80203a06:	a839                	j	80203a24 <either_copyout+0x56>
+  } else {
+    memmove((char *)dst, src, len);
+    80203a08:	fe043783          	ld	a5,-32(s0)
+    80203a0c:	fd043703          	ld	a4,-48(s0)
+    80203a10:	2701                	sext.w	a4,a4
+    80203a12:	863a                	mv	a2,a4
+    80203a14:	fd843583          	ld	a1,-40(s0)
+    80203a18:	853e                	mv	a0,a5
+    80203a1a:	ffffd097          	auipc	ra,0xffffd
+    80203a1e:	1b0080e7          	jalr	432(ra) # 80200bca <memmove>
+    return 0;
+    80203a22:	4781                	li	a5,0
+  }
+}
+    80203a24:	853e                	mv	a0,a5
+    80203a26:	70a2                	ld	ra,40(sp)
+    80203a28:	7402                	ld	s0,32(sp)
+    80203a2a:	6145                	addi	sp,sp,48
+    80203a2c:	8082                	ret
+
+0000000080203a2e <either_copyin>:
+// Copy from either a user address, or kernel address,
+// depending on usr_src.
+// Returns 0 on success, -1 on error.
+int
+either_copyin(void *dst, int user_src, uint64 src, uint64 len)
+{
+    80203a2e:	7179                	addi	sp,sp,-48
+    80203a30:	f406                	sd	ra,40(sp)
+    80203a32:	f022                	sd	s0,32(sp)
+    80203a34:	1800                	addi	s0,sp,48
+    80203a36:	fea43423          	sd	a0,-24(s0)
+    80203a3a:	87ae                	mv	a5,a1
+    80203a3c:	fcc43c23          	sd	a2,-40(s0)
+    80203a40:	fcd43823          	sd	a3,-48(s0)
+    80203a44:	fef42223          	sw	a5,-28(s0)
+  // struct proc *p = myproc();
+  if(user_src){
+    80203a48:	fe442783          	lw	a5,-28(s0)
+    80203a4c:	2781                	sext.w	a5,a5
+    80203a4e:	cf89                	beqz	a5,80203a68 <either_copyin+0x3a>
+    // return copyin(p->pagetable, dst, src, len);
+    return copyin2(dst, src, len);
+    80203a50:	fd043603          	ld	a2,-48(s0)
+    80203a54:	fd843583          	ld	a1,-40(s0)
+    80203a58:	fe843503          	ld	a0,-24(s0)
+    80203a5c:	ffffe097          	auipc	ra,0xffffe
+    80203a60:	548080e7          	jalr	1352(ra) # 80201fa4 <copyin2>
+    80203a64:	87aa                	mv	a5,a0
+    80203a66:	a839                	j	80203a84 <either_copyin+0x56>
+  } else {
+    memmove(dst, (char*)src, len);
+    80203a68:	fd843783          	ld	a5,-40(s0)
+    80203a6c:	fd043703          	ld	a4,-48(s0)
+    80203a70:	2701                	sext.w	a4,a4
+    80203a72:	863a                	mv	a2,a4
+    80203a74:	85be                	mv	a1,a5
+    80203a76:	fe843503          	ld	a0,-24(s0)
+    80203a7a:	ffffd097          	auipc	ra,0xffffd
+    80203a7e:	150080e7          	jalr	336(ra) # 80200bca <memmove>
+    return 0;
+    80203a82:	4781                	li	a5,0
+  }
+}
+    80203a84:	853e                	mv	a0,a5
+    80203a86:	70a2                	ld	ra,40(sp)
+    80203a88:	7402                	ld	s0,32(sp)
+    80203a8a:	6145                	addi	sp,sp,48
+    80203a8c:	8082                	ret
+
+0000000080203a8e <procdump>:
+// Print a process listing to console.  For debugging.
+// Runs when user types ^P on console.
+// No lock to avoid wedging a stuck machine further.
+void
+procdump(void)
+{
+    80203a8e:	1101                	addi	sp,sp,-32
+    80203a90:	ec06                	sd	ra,24(sp)
+    80203a92:	e822                	sd	s0,16(sp)
+    80203a94:	1000                	addi	s0,sp,32
+  [ZOMBIE]    "zombie"
+  };
+  struct proc *p;
+  char *state;
+
+  printf("\nPID\tSTATE\tNAME\tMEM\n");
+    80203a96:	0000a517          	auipc	a0,0xa
+    80203a9a:	c9a50513          	addi	a0,a0,-870 # 8020d730 <etext+0x730>
+    80203a9e:	ffffc097          	auipc	ra,0xffffc
+    80203aa2:	750080e7          	jalr	1872(ra) # 802001ee <printf>
+  for(p = proc; p < &proc[NPROC]; p++){
+    80203aa6:	00015797          	auipc	a5,0x15
+    80203aaa:	6ba78793          	addi	a5,a5,1722 # 80219160 <proc>
+    80203aae:	fef43423          	sd	a5,-24(s0)
+    80203ab2:	a05d                	j	80203b58 <procdump+0xca>
+    if(p->state == UNUSED)
+    80203ab4:	fe843783          	ld	a5,-24(s0)
+    80203ab8:	4f9c                	lw	a5,24(a5)
+    80203aba:	cbc1                	beqz	a5,80203b4a <procdump+0xbc>
+      continue;
+    if(p->state >= 0 && p->state < NELEM(states) && states[p->state])
+    80203abc:	fe843783          	ld	a5,-24(s0)
+    80203ac0:	4f9c                	lw	a5,24(a5)
+    80203ac2:	873e                	mv	a4,a5
+    80203ac4:	4791                	li	a5,4
+    80203ac6:	02e7ee63          	bltu	a5,a4,80203b02 <procdump+0x74>
+    80203aca:	fe843783          	ld	a5,-24(s0)
+    80203ace:	4f9c                	lw	a5,24(a5)
+    80203ad0:	0000b717          	auipc	a4,0xb
+    80203ad4:	55070713          	addi	a4,a4,1360 # 8020f020 <states.1742>
+    80203ad8:	1782                	slli	a5,a5,0x20
+    80203ada:	9381                	srli	a5,a5,0x20
+    80203adc:	078e                	slli	a5,a5,0x3
+    80203ade:	97ba                	add	a5,a5,a4
+    80203ae0:	639c                	ld	a5,0(a5)
+    80203ae2:	c385                	beqz	a5,80203b02 <procdump+0x74>
+      state = states[p->state];
+    80203ae4:	fe843783          	ld	a5,-24(s0)
+    80203ae8:	4f9c                	lw	a5,24(a5)
+    80203aea:	0000b717          	auipc	a4,0xb
+    80203aee:	53670713          	addi	a4,a4,1334 # 8020f020 <states.1742>
+    80203af2:	1782                	slli	a5,a5,0x20
+    80203af4:	9381                	srli	a5,a5,0x20
+    80203af6:	078e                	slli	a5,a5,0x3
+    80203af8:	97ba                	add	a5,a5,a4
+    80203afa:	639c                	ld	a5,0(a5)
+    80203afc:	fef43023          	sd	a5,-32(s0)
+    80203b00:	a039                	j	80203b0e <procdump+0x80>
+    else
+      state = "???";
+    80203b02:	0000a797          	auipc	a5,0xa
+    80203b06:	c4678793          	addi	a5,a5,-954 # 8020d748 <etext+0x748>
+    80203b0a:	fef43023          	sd	a5,-32(s0)
+    printf("%d\t%s\t%s\t%d", p->pid, state, p->name, p->sz);
+    80203b0e:	fe843783          	ld	a5,-24(s0)
+    80203b12:	5f8c                	lw	a1,56(a5)
+    80203b14:	fe843783          	ld	a5,-24(s0)
+    80203b18:	18078693          	addi	a3,a5,384
+    80203b1c:	fe843783          	ld	a5,-24(s0)
+    80203b20:	67bc                	ld	a5,72(a5)
+    80203b22:	873e                	mv	a4,a5
+    80203b24:	fe043603          	ld	a2,-32(s0)
+    80203b28:	0000a517          	auipc	a0,0xa
+    80203b2c:	c2850513          	addi	a0,a0,-984 # 8020d750 <etext+0x750>
+    80203b30:	ffffc097          	auipc	ra,0xffffc
+    80203b34:	6be080e7          	jalr	1726(ra) # 802001ee <printf>
+    printf("\n");
+    80203b38:	0000a517          	auipc	a0,0xa
+    80203b3c:	c2850513          	addi	a0,a0,-984 # 8020d760 <etext+0x760>
+    80203b40:	ffffc097          	auipc	ra,0xffffc
+    80203b44:	6ae080e7          	jalr	1710(ra) # 802001ee <printf>
+    80203b48:	a011                	j	80203b4c <procdump+0xbe>
+      continue;
+    80203b4a:	0001                	nop
+  for(p = proc; p < &proc[NPROC]; p++){
+    80203b4c:	fe843783          	ld	a5,-24(s0)
+    80203b50:	19878793          	addi	a5,a5,408
+    80203b54:	fef43423          	sd	a5,-24(s0)
+    80203b58:	fe843703          	ld	a4,-24(s0)
+    80203b5c:	0001a797          	auipc	a5,0x1a
+    80203b60:	5b478793          	addi	a5,a5,1460 # 8021e110 <initproc>
+    80203b64:	f4f768e3          	bltu	a4,a5,80203ab4 <procdump+0x26>
+  }
+}
+    80203b68:	0001                	nop
+    80203b6a:	0001                	nop
+    80203b6c:	60e2                	ld	ra,24(sp)
+    80203b6e:	6442                	ld	s0,16(sp)
+    80203b70:	6105                	addi	sp,sp,32
+    80203b72:	8082                	ret
+
+0000000080203b74 <procnum>:
+
+uint64
+procnum(void)
+{
+    80203b74:	1101                	addi	sp,sp,-32
+    80203b76:	ec22                	sd	s0,24(sp)
+    80203b78:	1000                	addi	s0,sp,32
+  int num = 0;
+    80203b7a:	fe042623          	sw	zero,-20(s0)
+  struct proc *p;
+
+  for (p = proc; p < &proc[NPROC]; p++) {
+    80203b7e:	00015797          	auipc	a5,0x15
+    80203b82:	5e278793          	addi	a5,a5,1506 # 80219160 <proc>
+    80203b86:	fef43023          	sd	a5,-32(s0)
+    80203b8a:	a005                	j	80203baa <procnum+0x36>
+    if (p->state != UNUSED) {
+    80203b8c:	fe043783          	ld	a5,-32(s0)
+    80203b90:	4f9c                	lw	a5,24(a5)
+    80203b92:	c791                	beqz	a5,80203b9e <procnum+0x2a>
+      num++;
+    80203b94:	fec42783          	lw	a5,-20(s0)
+    80203b98:	2785                	addiw	a5,a5,1
+    80203b9a:	fef42623          	sw	a5,-20(s0)
+  for (p = proc; p < &proc[NPROC]; p++) {
+    80203b9e:	fe043783          	ld	a5,-32(s0)
+    80203ba2:	19878793          	addi	a5,a5,408
+    80203ba6:	fef43023          	sd	a5,-32(s0)
+    80203baa:	fe043703          	ld	a4,-32(s0)
+    80203bae:	0001a797          	auipc	a5,0x1a
+    80203bb2:	56278793          	addi	a5,a5,1378 # 8021e110 <initproc>
+    80203bb6:	fcf76be3          	bltu	a4,a5,80203b8c <procnum+0x18>
+    }
+  }
+
+  return num;
+    80203bba:	fec42783          	lw	a5,-20(s0)
+}
+    80203bbe:	853e                	mv	a0,a5
+    80203bc0:	6462                	ld	s0,24(sp)
+    80203bc2:	6105                	addi	sp,sp,32
+    80203bc4:	8082                	ret
+
+0000000080203bc6 <swtch>:
+    80203bc6:	00153023          	sd	ra,0(a0)
+    80203bca:	00253423          	sd	sp,8(a0)
+    80203bce:	e900                	sd	s0,16(a0)
+    80203bd0:	ed04                	sd	s1,24(a0)
+    80203bd2:	03253023          	sd	s2,32(a0)
+    80203bd6:	03353423          	sd	s3,40(a0)
+    80203bda:	03453823          	sd	s4,48(a0)
+    80203bde:	03553c23          	sd	s5,56(a0)
+    80203be2:	05653023          	sd	s6,64(a0)
+    80203be6:	05753423          	sd	s7,72(a0)
+    80203bea:	05853823          	sd	s8,80(a0)
+    80203bee:	05953c23          	sd	s9,88(a0)
+    80203bf2:	07a53023          	sd	s10,96(a0)
+    80203bf6:	07b53423          	sd	s11,104(a0)
+    80203bfa:	0005b083          	ld	ra,0(a1)
+    80203bfe:	0085b103          	ld	sp,8(a1)
+    80203c02:	6980                	ld	s0,16(a1)
+    80203c04:	6d84                	ld	s1,24(a1)
+    80203c06:	0205b903          	ld	s2,32(a1)
+    80203c0a:	0285b983          	ld	s3,40(a1)
+    80203c0e:	0305ba03          	ld	s4,48(a1)
+    80203c12:	0385ba83          	ld	s5,56(a1)
+    80203c16:	0405bb03          	ld	s6,64(a1)
+    80203c1a:	0485bb83          	ld	s7,72(a1)
+    80203c1e:	0505bc03          	ld	s8,80(a1)
+    80203c22:	0585bc83          	ld	s9,88(a1)
+    80203c26:	0605bd03          	ld	s10,96(a1)
+    80203c2a:	0685bd83          	ld	s11,104(a1)
+    80203c2e:	8082                	ret
+
+0000000080203c30 <r_sstatus>:
+{
+    80203c30:	1101                	addi	sp,sp,-32
+    80203c32:	ec22                	sd	s0,24(sp)
+    80203c34:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80203c36:	100027f3          	csrr	a5,sstatus
+    80203c3a:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203c3e:	fe843783          	ld	a5,-24(s0)
+}
+    80203c42:	853e                	mv	a0,a5
+    80203c44:	6462                	ld	s0,24(sp)
+    80203c46:	6105                	addi	sp,sp,32
+    80203c48:	8082                	ret
+
+0000000080203c4a <w_sstatus>:
+{
+    80203c4a:	1101                	addi	sp,sp,-32
+    80203c4c:	ec22                	sd	s0,24(sp)
+    80203c4e:	1000                	addi	s0,sp,32
+    80203c50:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80203c54:	fe843783          	ld	a5,-24(s0)
+    80203c58:	10079073          	csrw	sstatus,a5
+}
+    80203c5c:	0001                	nop
+    80203c5e:	6462                	ld	s0,24(sp)
+    80203c60:	6105                	addi	sp,sp,32
+    80203c62:	8082                	ret
+
+0000000080203c64 <r_sie>:
+{
+    80203c64:	1101                	addi	sp,sp,-32
+    80203c66:	ec22                	sd	s0,24(sp)
+    80203c68:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sie" : "=r" (x) );
+    80203c6a:	104027f3          	csrr	a5,sie
+    80203c6e:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203c72:	fe843783          	ld	a5,-24(s0)
+}
+    80203c76:	853e                	mv	a0,a5
+    80203c78:	6462                	ld	s0,24(sp)
+    80203c7a:	6105                	addi	sp,sp,32
+    80203c7c:	8082                	ret
+
+0000000080203c7e <w_sie>:
+{
+    80203c7e:	1101                	addi	sp,sp,-32
+    80203c80:	ec22                	sd	s0,24(sp)
+    80203c82:	1000                	addi	s0,sp,32
+    80203c84:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw sie, %0" : : "r" (x));
+    80203c88:	fe843783          	ld	a5,-24(s0)
+    80203c8c:	10479073          	csrw	sie,a5
+}
+    80203c90:	0001                	nop
+    80203c92:	6462                	ld	s0,24(sp)
+    80203c94:	6105                	addi	sp,sp,32
+    80203c96:	8082                	ret
+
+0000000080203c98 <w_sepc>:
+{
+    80203c98:	1101                	addi	sp,sp,-32
+    80203c9a:	ec22                	sd	s0,24(sp)
+    80203c9c:	1000                	addi	s0,sp,32
+    80203c9e:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw sepc, %0" : : "r" (x));
+    80203ca2:	fe843783          	ld	a5,-24(s0)
+    80203ca6:	14179073          	csrw	sepc,a5
+}
+    80203caa:	0001                	nop
+    80203cac:	6462                	ld	s0,24(sp)
+    80203cae:	6105                	addi	sp,sp,32
+    80203cb0:	8082                	ret
+
+0000000080203cb2 <r_sepc>:
+{
+    80203cb2:	1101                	addi	sp,sp,-32
+    80203cb4:	ec22                	sd	s0,24(sp)
+    80203cb6:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    80203cb8:	141027f3          	csrr	a5,sepc
+    80203cbc:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203cc0:	fe843783          	ld	a5,-24(s0)
+}
+    80203cc4:	853e                	mv	a0,a5
+    80203cc6:	6462                	ld	s0,24(sp)
+    80203cc8:	6105                	addi	sp,sp,32
+    80203cca:	8082                	ret
+
+0000000080203ccc <w_stvec>:
+{
+    80203ccc:	1101                	addi	sp,sp,-32
+    80203cce:	ec22                	sd	s0,24(sp)
+    80203cd0:	1000                	addi	s0,sp,32
+    80203cd2:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw stvec, %0" : : "r" (x));
+    80203cd6:	fe843783          	ld	a5,-24(s0)
+    80203cda:	10579073          	csrw	stvec,a5
+}
+    80203cde:	0001                	nop
+    80203ce0:	6462                	ld	s0,24(sp)
+    80203ce2:	6105                	addi	sp,sp,32
+    80203ce4:	8082                	ret
+
+0000000080203ce6 <r_satp>:
+{
+    80203ce6:	1101                	addi	sp,sp,-32
+    80203ce8:	ec22                	sd	s0,24(sp)
+    80203cea:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, satp" : "=r" (x) );
+    80203cec:	180027f3          	csrr	a5,satp
+    80203cf0:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203cf4:	fe843783          	ld	a5,-24(s0)
+}
+    80203cf8:	853e                	mv	a0,a5
+    80203cfa:	6462                	ld	s0,24(sp)
+    80203cfc:	6105                	addi	sp,sp,32
+    80203cfe:	8082                	ret
+
+0000000080203d00 <r_scause>:
+{
+    80203d00:	1101                	addi	sp,sp,-32
+    80203d02:	ec22                	sd	s0,24(sp)
+    80203d04:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80203d06:	142027f3          	csrr	a5,scause
+    80203d0a:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203d0e:	fe843783          	ld	a5,-24(s0)
+}
+    80203d12:	853e                	mv	a0,a5
+    80203d14:	6462                	ld	s0,24(sp)
+    80203d16:	6105                	addi	sp,sp,32
+    80203d18:	8082                	ret
+
+0000000080203d1a <r_stval>:
+{
+    80203d1a:	1101                	addi	sp,sp,-32
+    80203d1c:	ec22                	sd	s0,24(sp)
+    80203d1e:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, stval" : "=r" (x) );
+    80203d20:	143027f3          	csrr	a5,stval
+    80203d24:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203d28:	fe843783          	ld	a5,-24(s0)
+}
+    80203d2c:	853e                	mv	a0,a5
+    80203d2e:	6462                	ld	s0,24(sp)
+    80203d30:	6105                	addi	sp,sp,32
+    80203d32:	8082                	ret
+
+0000000080203d34 <intr_on>:
+{
+    80203d34:	1141                	addi	sp,sp,-16
+    80203d36:	e406                	sd	ra,8(sp)
+    80203d38:	e022                	sd	s0,0(sp)
+    80203d3a:	0800                	addi	s0,sp,16
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    80203d3c:	00000097          	auipc	ra,0x0
+    80203d40:	ef4080e7          	jalr	-268(ra) # 80203c30 <r_sstatus>
+    80203d44:	87aa                	mv	a5,a0
+    80203d46:	0027e793          	ori	a5,a5,2
+    80203d4a:	853e                	mv	a0,a5
+    80203d4c:	00000097          	auipc	ra,0x0
+    80203d50:	efe080e7          	jalr	-258(ra) # 80203c4a <w_sstatus>
+}
+    80203d54:	0001                	nop
+    80203d56:	60a2                	ld	ra,8(sp)
+    80203d58:	6402                	ld	s0,0(sp)
+    80203d5a:	0141                	addi	sp,sp,16
+    80203d5c:	8082                	ret
+
+0000000080203d5e <intr_off>:
+{
+    80203d5e:	1141                	addi	sp,sp,-16
+    80203d60:	e406                	sd	ra,8(sp)
+    80203d62:	e022                	sd	s0,0(sp)
+    80203d64:	0800                	addi	s0,sp,16
+  w_sstatus(r_sstatus() & ~SSTATUS_SIE); //按位取反,将状态寄存器中的中断使能位关闭,从而实现关中断
+    80203d66:	00000097          	auipc	ra,0x0
+    80203d6a:	eca080e7          	jalr	-310(ra) # 80203c30 <r_sstatus>
+    80203d6e:	87aa                	mv	a5,a0
+    80203d70:	9bf5                	andi	a5,a5,-3
+    80203d72:	853e                	mv	a0,a5
+    80203d74:	00000097          	auipc	ra,0x0
+    80203d78:	ed6080e7          	jalr	-298(ra) # 80203c4a <w_sstatus>
+}
+    80203d7c:	0001                	nop
+    80203d7e:	60a2                	ld	ra,8(sp)
+    80203d80:	6402                	ld	s0,0(sp)
+    80203d82:	0141                	addi	sp,sp,16
+    80203d84:	8082                	ret
+
+0000000080203d86 <intr_get>:
+{
+    80203d86:	1101                	addi	sp,sp,-32
+    80203d88:	ec06                	sd	ra,24(sp)
+    80203d8a:	e822                	sd	s0,16(sp)
+    80203d8c:	1000                	addi	s0,sp,32
+  uint64 x = r_sstatus();
+    80203d8e:	00000097          	auipc	ra,0x0
+    80203d92:	ea2080e7          	jalr	-350(ra) # 80203c30 <r_sstatus>
+    80203d96:	fea43423          	sd	a0,-24(s0)
+  return (x & SSTATUS_SIE) != 0;
+    80203d9a:	fe843783          	ld	a5,-24(s0)
+    80203d9e:	8b89                	andi	a5,a5,2
+    80203da0:	00f037b3          	snez	a5,a5
+    80203da4:	0ff7f793          	andi	a5,a5,255
+    80203da8:	2781                	sext.w	a5,a5
+}
+    80203daa:	853e                	mv	a0,a5
+    80203dac:	60e2                	ld	ra,24(sp)
+    80203dae:	6442                	ld	s0,16(sp)
+    80203db0:	6105                	addi	sp,sp,32
+    80203db2:	8082                	ret
+
+0000000080203db4 <r_tp>:
+{
+    80203db4:	1101                	addi	sp,sp,-32
+    80203db6:	ec22                	sd	s0,24(sp)
+    80203db8:	1000                	addi	s0,sp,32
+  asm volatile("mv %0, tp" : "=r" (x) );
+    80203dba:	8792                	mv	a5,tp
+    80203dbc:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80203dc0:	fe843783          	ld	a5,-24(s0)
+}
+    80203dc4:	853e                	mv	a0,a5
+    80203dc6:	6462                	ld	s0,24(sp)
+    80203dc8:	6105                	addi	sp,sp,32
+    80203dca:	8082                	ret
+
+0000000080203dcc <sbi_console_getchar>:
+{
+	SBI_CALL_1(SBI_CONSOLE_PUTCHAR, 0, ch);
+}
+
+static inline int sbi_console_getchar(void)
+{
+    80203dcc:	1141                	addi	sp,sp,-16
+    80203dce:	e422                	sd	s0,8(sp)
+    80203dd0:	0800                	addi	s0,sp,16
+	return SBI_CALL_0(SBI_CONSOLE_GETCHAR, 0);
+    80203dd2:	4501                	li	a0,0
+    80203dd4:	4581                	li	a1,0
+    80203dd6:	4601                	li	a2,0
+    80203dd8:	4681                	li	a3,0
+    80203dda:	4889                	li	a7,2
+    80203ddc:	4801                	li	a6,0
+    80203dde:	00000073          	ecall
+    80203de2:	87aa                	mv	a5,a0
+    80203de4:	2781                	sext.w	a5,a5
+}
+    80203de6:	853e                	mv	a0,a5
+    80203de8:	6422                	ld	s0,8(sp)
+    80203dea:	0141                	addi	sp,sp,16
+    80203dec:	8082                	ret
+
+0000000080203dee <trapinithart>:
+// }
+
+// set up to take exceptions and traps while in the kernel.
+void
+trapinithart(void)
+{
+    80203dee:	1141                	addi	sp,sp,-16
+    80203df0:	e406                	sd	ra,8(sp)
+    80203df2:	e022                	sd	s0,0(sp)
+    80203df4:	0800                	addi	s0,sp,16
+  w_stvec((uint64)kernelvec);
+    80203df6:	0000c797          	auipc	a5,0xc
+    80203dfa:	6b27b783          	ld	a5,1714(a5) # 802104a8 <_GLOBAL_OFFSET_TABLE_+0x20>
+    80203dfe:	853e                	mv	a0,a5
+    80203e00:	00000097          	auipc	ra,0x0
+    80203e04:	ecc080e7          	jalr	-308(ra) # 80203ccc <w_stvec>
+  w_sstatus(r_sstatus() | SSTATUS_SIE | SSTATUS_SPIE);
+    80203e08:	00000097          	auipc	ra,0x0
+    80203e0c:	e28080e7          	jalr	-472(ra) # 80203c30 <r_sstatus>
+    80203e10:	87aa                	mv	a5,a0
+    80203e12:	0227e793          	ori	a5,a5,34
+    80203e16:	853e                	mv	a0,a5
+    80203e18:	00000097          	auipc	ra,0x0
+    80203e1c:	e32080e7          	jalr	-462(ra) # 80203c4a <w_sstatus>
+  // enable supervisor-mode timer interrupts.
+  w_sie(r_sie() | SIE_SEIE | SIE_SSIE | SIE_STIE);
+    80203e20:	00000097          	auipc	ra,0x0
+    80203e24:	e44080e7          	jalr	-444(ra) # 80203c64 <r_sie>
+    80203e28:	87aa                	mv	a5,a0
+    80203e2a:	2227e793          	ori	a5,a5,546
+    80203e2e:	853e                	mv	a0,a5
+    80203e30:	00000097          	auipc	ra,0x0
+    80203e34:	e4e080e7          	jalr	-434(ra) # 80203c7e <w_sie>
+  set_next_timeout();
+    80203e38:	00004097          	auipc	ra,0x4
+    80203e3c:	d9a080e7          	jalr	-614(ra) # 80207bd2 <set_next_timeout>
+  #ifdef DEBUG
+  printf("trapinithart\n");
+    80203e40:	0000a517          	auipc	a0,0xa
+    80203e44:	95050513          	addi	a0,a0,-1712 # 8020d790 <etext+0x790>
+    80203e48:	ffffc097          	auipc	ra,0xffffc
+    80203e4c:	3a6080e7          	jalr	934(ra) # 802001ee <printf>
+  #endif
+}
+    80203e50:	0001                	nop
+    80203e52:	60a2                	ld	ra,8(sp)
+    80203e54:	6402                	ld	s0,0(sp)
+    80203e56:	0141                	addi	sp,sp,16
+    80203e58:	8082                	ret
+
+0000000080203e5a <usertrap>:
+// handle an interrupt, exception, or system call from user space.
+// called from trampoline.S
+//
+void
+usertrap(void)
+{
+    80203e5a:	7179                	addi	sp,sp,-48
+    80203e5c:	f406                	sd	ra,40(sp)
+    80203e5e:	f022                	sd	s0,32(sp)
+    80203e60:	ec26                	sd	s1,24(sp)
+    80203e62:	1800                	addi	s0,sp,48
+  // printf("run in usertrap\n");
+  int which_dev = 0;
+    80203e64:	fc042e23          	sw	zero,-36(s0)
+
+  if((r_sstatus() & SSTATUS_SPP) != 0)
+    80203e68:	00000097          	auipc	ra,0x0
+    80203e6c:	dc8080e7          	jalr	-568(ra) # 80203c30 <r_sstatus>
+    80203e70:	87aa                	mv	a5,a0
+    80203e72:	1007f793          	andi	a5,a5,256
+    80203e76:	cb89                	beqz	a5,80203e88 <usertrap+0x2e>
+    panic("usertrap: not from user mode");
+    80203e78:	0000a517          	auipc	a0,0xa
+    80203e7c:	92850513          	addi	a0,a0,-1752 # 8020d7a0 <etext+0x7a0>
+    80203e80:	ffffc097          	auipc	ra,0xffffc
+    80203e84:	5c4080e7          	jalr	1476(ra) # 80200444 <panic>
+
+  // send interrupts and exceptions to kerneltrap(),
+  // since we're now in the kernel.
+  w_stvec((uint64)kernelvec);
+    80203e88:	0000c797          	auipc	a5,0xc
+    80203e8c:	6207b783          	ld	a5,1568(a5) # 802104a8 <_GLOBAL_OFFSET_TABLE_+0x20>
+    80203e90:	853e                	mv	a0,a5
+    80203e92:	00000097          	auipc	ra,0x0
+    80203e96:	e3a080e7          	jalr	-454(ra) # 80203ccc <w_stvec>
+
+  struct proc *p = myproc();
+    80203e9a:	fffff097          	auipc	ra,0xfffff
+    80203e9e:	ac8080e7          	jalr	-1336(ra) # 80202962 <myproc>
+    80203ea2:	fca43823          	sd	a0,-48(s0)
+  
+  // save user program counter.
+  p->trapframe->epc = r_sepc();
+    80203ea6:	fd043783          	ld	a5,-48(s0)
+    80203eaa:	73a4                	ld	s1,96(a5)
+    80203eac:	00000097          	auipc	ra,0x0
+    80203eb0:	e06080e7          	jalr	-506(ra) # 80203cb2 <r_sepc>
+    80203eb4:	87aa                	mv	a5,a0
+    80203eb6:	ec9c                	sd	a5,24(s1)
+  
+  if(r_scause() == 8){
+    80203eb8:	00000097          	auipc	ra,0x0
+    80203ebc:	e48080e7          	jalr	-440(ra) # 80203d00 <r_scause>
+    80203ec0:	872a                	mv	a4,a0
+    80203ec2:	47a1                	li	a5,8
+    80203ec4:	02f71d63          	bne	a4,a5,80203efe <usertrap+0xa4>
+    // system call
+    if(p->killed)
+    80203ec8:	fd043783          	ld	a5,-48(s0)
+    80203ecc:	5b9c                	lw	a5,48(a5)
+    80203ece:	c791                	beqz	a5,80203eda <usertrap+0x80>
+      exit(-1);
+    80203ed0:	557d                	li	a0,-1
+    80203ed2:	fffff097          	auipc	ra,0xfffff
+    80203ed6:	212080e7          	jalr	530(ra) # 802030e4 <exit>
+    // sepc points to the ecall instruction,
+    // but we want to return to the next instruction.
+    p->trapframe->epc += 4;
+    80203eda:	fd043783          	ld	a5,-48(s0)
+    80203ede:	73bc                	ld	a5,96(a5)
+    80203ee0:	6f98                	ld	a4,24(a5)
+    80203ee2:	fd043783          	ld	a5,-48(s0)
+    80203ee6:	73bc                	ld	a5,96(a5)
+    80203ee8:	0711                	addi	a4,a4,4
+    80203eea:	ef98                	sd	a4,24(a5)
+    // an interrupt will change sstatus &c registers,
+    // so don't enable until done with those registers.
+    intr_on();
+    80203eec:	00000097          	auipc	ra,0x0
+    80203ef0:	e48080e7          	jalr	-440(ra) # 80203d34 <intr_on>
+    syscall();
+    80203ef4:	00001097          	auipc	ra,0x1
+    80203ef8:	998080e7          	jalr	-1640(ra) # 8020488c <syscall>
+    80203efc:	a89d                	j	80203f72 <usertrap+0x118>
+  } 
+  else if((which_dev = devintr(0)) != 0){
+    80203efe:	4501                	li	a0,0
+    80203f00:	00000097          	auipc	ra,0x0
+    80203f04:	338080e7          	jalr	824(ra) # 80204238 <devintr>
+    80203f08:	87aa                	mv	a5,a0
+    80203f0a:	fcf42e23          	sw	a5,-36(s0)
+    80203f0e:	fdc42783          	lw	a5,-36(s0)
+    80203f12:	2781                	sext.w	a5,a5
+    80203f14:	efb9                	bnez	a5,80203f72 <usertrap+0x118>
+    // ok
+  } 
+  else {
+    printf("\nusertrap(): unexpected scause %p pid=%d %s\n", r_scause(), p->pid, p->name);
+    80203f16:	00000097          	auipc	ra,0x0
+    80203f1a:	dea080e7          	jalr	-534(ra) # 80203d00 <r_scause>
+    80203f1e:	85aa                	mv	a1,a0
+    80203f20:	fd043783          	ld	a5,-48(s0)
+    80203f24:	5f98                	lw	a4,56(a5)
+    80203f26:	fd043783          	ld	a5,-48(s0)
+    80203f2a:	18078793          	addi	a5,a5,384
+    80203f2e:	86be                	mv	a3,a5
+    80203f30:	863a                	mv	a2,a4
+    80203f32:	0000a517          	auipc	a0,0xa
+    80203f36:	88e50513          	addi	a0,a0,-1906 # 8020d7c0 <etext+0x7c0>
+    80203f3a:	ffffc097          	auipc	ra,0xffffc
+    80203f3e:	2b4080e7          	jalr	692(ra) # 802001ee <printf>
+    printf("            sepc=%p stval=%p\n", r_sepc(), r_stval());
+    80203f42:	00000097          	auipc	ra,0x0
+    80203f46:	d70080e7          	jalr	-656(ra) # 80203cb2 <r_sepc>
+    80203f4a:	84aa                	mv	s1,a0
+    80203f4c:	00000097          	auipc	ra,0x0
+    80203f50:	dce080e7          	jalr	-562(ra) # 80203d1a <r_stval>
+    80203f54:	87aa                	mv	a5,a0
+    80203f56:	863e                	mv	a2,a5
+    80203f58:	85a6                	mv	a1,s1
+    80203f5a:	0000a517          	auipc	a0,0xa
+    80203f5e:	89650513          	addi	a0,a0,-1898 # 8020d7f0 <etext+0x7f0>
+    80203f62:	ffffc097          	auipc	ra,0xffffc
+    80203f66:	28c080e7          	jalr	652(ra) # 802001ee <printf>
+    // trapframedump(p->trapframe);
+    p->killed = 1;
+    80203f6a:	fd043783          	ld	a5,-48(s0)
+    80203f6e:	4705                	li	a4,1
+    80203f70:	db98                	sw	a4,48(a5)
+  }
+
+  if(p->killed)
+    80203f72:	fd043783          	ld	a5,-48(s0)
+    80203f76:	5b9c                	lw	a5,48(a5)
+    80203f78:	c791                	beqz	a5,80203f84 <usertrap+0x12a>
+    exit(-1);
+    80203f7a:	557d                	li	a0,-1
+    80203f7c:	fffff097          	auipc	ra,0xfffff
+    80203f80:	168080e7          	jalr	360(ra) # 802030e4 <exit>
+
+  // give up the CPU if this is a timer interrupt.
+  if(which_dev == 2)
+    80203f84:	fdc42783          	lw	a5,-36(s0)
+    80203f88:	0007871b          	sext.w	a4,a5
+    80203f8c:	4789                	li	a5,2
+    80203f8e:	00f71663          	bne	a4,a5,80203f9a <usertrap+0x140>
+    yield();
+    80203f92:	fffff097          	auipc	ra,0xfffff
+    80203f96:	76e080e7          	jalr	1902(ra) # 80203700 <yield>
+
+  usertrapret();
+    80203f9a:	00000097          	auipc	ra,0x0
+    80203f9e:	014080e7          	jalr	20(ra) # 80203fae <usertrapret>
+}
+    80203fa2:	0001                	nop
+    80203fa4:	70a2                	ld	ra,40(sp)
+    80203fa6:	7402                	ld	s0,32(sp)
+    80203fa8:	64e2                	ld	s1,24(sp)
+    80203faa:	6145                	addi	sp,sp,48
+    80203fac:	8082                	ret
+
+0000000080203fae <usertrapret>:
+//
+// return to user space
+//
+void
+usertrapret(void)
+{
+    80203fae:	7139                	addi	sp,sp,-64
+    80203fb0:	fc06                	sd	ra,56(sp)
+    80203fb2:	f822                	sd	s0,48(sp)
+    80203fb4:	f426                	sd	s1,40(sp)
+    80203fb6:	0080                	addi	s0,sp,64
+  struct proc *p = myproc();
+    80203fb8:	fffff097          	auipc	ra,0xfffff
+    80203fbc:	9aa080e7          	jalr	-1622(ra) # 80202962 <myproc>
+    80203fc0:	fca43c23          	sd	a0,-40(s0)
+
+  // we're about to switch the destination of traps from
+  // kerneltrap() to usertrap(), so turn off interrupts until
+  // we're back in user space, where usertrap() is correct.
+  intr_off();
+    80203fc4:	00000097          	auipc	ra,0x0
+    80203fc8:	d9a080e7          	jalr	-614(ra) # 80203d5e <intr_off>
+
+  // send syscalls, interrupts, and exceptions to trampoline.S
+  w_stvec(TRAMPOLINE + (uservec - trampoline));
+    80203fcc:	0000c717          	auipc	a4,0xc
+    80203fd0:	51473703          	ld	a4,1300(a4) # 802104e0 <_GLOBAL_OFFSET_TABLE_+0x58>
+    80203fd4:	0000c797          	auipc	a5,0xc
+    80203fd8:	4bc7b783          	ld	a5,1212(a5) # 80210490 <_GLOBAL_OFFSET_TABLE_+0x8>
+    80203fdc:	8f1d                	sub	a4,a4,a5
+    80203fde:	040007b7          	lui	a5,0x4000
+    80203fe2:	17fd                	addi	a5,a5,-1
+    80203fe4:	07b2                	slli	a5,a5,0xc
+    80203fe6:	97ba                	add	a5,a5,a4
+    80203fe8:	853e                	mv	a0,a5
+    80203fea:	00000097          	auipc	ra,0x0
+    80203fee:	ce2080e7          	jalr	-798(ra) # 80203ccc <w_stvec>
+
+  // set up trapframe values that uservec will need when
+  // the process next re-enters the kernel.
+  p->trapframe->kernel_satp = r_satp();         // kernel page table
+    80203ff2:	fd843783          	ld	a5,-40(s0)
+    80203ff6:	73a4                	ld	s1,96(a5)
+    80203ff8:	00000097          	auipc	ra,0x0
+    80203ffc:	cee080e7          	jalr	-786(ra) # 80203ce6 <r_satp>
+    80204000:	87aa                	mv	a5,a0
+    80204002:	e09c                	sd	a5,0(s1)
+  p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack
+    80204004:	fd843783          	ld	a5,-40(s0)
+    80204008:	63b4                	ld	a3,64(a5)
+    8020400a:	fd843783          	ld	a5,-40(s0)
+    8020400e:	73bc                	ld	a5,96(a5)
+    80204010:	6705                	lui	a4,0x1
+    80204012:	9736                	add	a4,a4,a3
+    80204014:	e798                	sd	a4,8(a5)
+  p->trapframe->kernel_trap = (uint64)usertrap;
+    80204016:	fd843783          	ld	a5,-40(s0)
+    8020401a:	73bc                	ld	a5,96(a5)
+    8020401c:	00000717          	auipc	a4,0x0
+    80204020:	e3e70713          	addi	a4,a4,-450 # 80203e5a <usertrap>
+    80204024:	eb98                	sd	a4,16(a5)
+  p->trapframe->kernel_hartid = r_tp();         // hartid for cpuid()
+    80204026:	fd843783          	ld	a5,-40(s0)
+    8020402a:	73a4                	ld	s1,96(a5)
+    8020402c:	00000097          	auipc	ra,0x0
+    80204030:	d88080e7          	jalr	-632(ra) # 80203db4 <r_tp>
+    80204034:	87aa                	mv	a5,a0
+    80204036:	f09c                	sd	a5,32(s1)
+
+  // set up the registers that trampoline.S's sret will use
+  // to get to user space.
+  
+  // set S Previous Privilege mode to User.
+  unsigned long x = r_sstatus();
+    80204038:	00000097          	auipc	ra,0x0
+    8020403c:	bf8080e7          	jalr	-1032(ra) # 80203c30 <r_sstatus>
+    80204040:	fca43823          	sd	a0,-48(s0)
+  x &= ~SSTATUS_SPP; // clear SPP to 0 for user mode
+    80204044:	fd043783          	ld	a5,-48(s0)
+    80204048:	eff7f793          	andi	a5,a5,-257
+    8020404c:	fcf43823          	sd	a5,-48(s0)
+  x |= SSTATUS_SPIE; // enable interrupts in user mode
+    80204050:	fd043783          	ld	a5,-48(s0)
+    80204054:	0207e793          	ori	a5,a5,32
+    80204058:	fcf43823          	sd	a5,-48(s0)
+  w_sstatus(x);
+    8020405c:	fd043503          	ld	a0,-48(s0)
+    80204060:	00000097          	auipc	ra,0x0
+    80204064:	bea080e7          	jalr	-1046(ra) # 80203c4a <w_sstatus>
+
+  // set S Exception Program Counter to the saved user pc.
+  w_sepc(p->trapframe->epc);
+    80204068:	fd843783          	ld	a5,-40(s0)
+    8020406c:	73bc                	ld	a5,96(a5)
+    8020406e:	6f9c                	ld	a5,24(a5)
+    80204070:	853e                	mv	a0,a5
+    80204072:	00000097          	auipc	ra,0x0
+    80204076:	c26080e7          	jalr	-986(ra) # 80203c98 <w_sepc>
+
+  // tell trampoline.S the user page table to switch to.
+  // printf("[usertrapret]p->pagetable: %p\n", p->pagetable);
+  uint64 satp = MAKE_SATP(p->pagetable);
+    8020407a:	fd843783          	ld	a5,-40(s0)
+    8020407e:	6bbc                	ld	a5,80(a5)
+    80204080:	00c7d713          	srli	a4,a5,0xc
+    80204084:	57fd                	li	a5,-1
+    80204086:	17fe                	slli	a5,a5,0x3f
+    80204088:	8fd9                	or	a5,a5,a4
+    8020408a:	fcf43423          	sd	a5,-56(s0)
+
+  // jump to trampoline.S at the top of memory, which 
+  // switches to the user page table, restores user registers,
+  // and switches to user mode with sret.
+  uint64 fn = TRAMPOLINE + (userret - trampoline);
+    8020408e:	0000c717          	auipc	a4,0xc
+    80204092:	41273703          	ld	a4,1042(a4) # 802104a0 <_GLOBAL_OFFSET_TABLE_+0x18>
+    80204096:	0000c797          	auipc	a5,0xc
+    8020409a:	3fa7b783          	ld	a5,1018(a5) # 80210490 <_GLOBAL_OFFSET_TABLE_+0x8>
+    8020409e:	8f1d                	sub	a4,a4,a5
+    802040a0:	040007b7          	lui	a5,0x4000
+    802040a4:	17fd                	addi	a5,a5,-1
+    802040a6:	07b2                	slli	a5,a5,0xc
+    802040a8:	97ba                	add	a5,a5,a4
+    802040aa:	fcf43023          	sd	a5,-64(s0)
+  ((void (*)(uint64,uint64))fn)(TRAPFRAME, satp);
+    802040ae:	fc043703          	ld	a4,-64(s0)
+    802040b2:	fc843583          	ld	a1,-56(s0)
+    802040b6:	020007b7          	lui	a5,0x2000
+    802040ba:	17fd                	addi	a5,a5,-1
+    802040bc:	00d79513          	slli	a0,a5,0xd
+    802040c0:	9702                	jalr	a4
+}
+    802040c2:	0001                	nop
+    802040c4:	70e2                	ld	ra,56(sp)
+    802040c6:	7442                	ld	s0,48(sp)
+    802040c8:	74a2                	ld	s1,40(sp)
+    802040ca:	6121                	addi	sp,sp,64
+    802040cc:	8082                	ret
+
+00000000802040ce <kerneltrap>:
+
+// interrupts and exceptions from kernel code go here via kernelvec,
+// on whatever the current kernel stack is.
+void 
+kerneltrap() {
+    802040ce:	715d                	addi	sp,sp,-80
+    802040d0:	e486                	sd	ra,72(sp)
+    802040d2:	e0a2                	sd	s0,64(sp)
+    802040d4:	fc26                	sd	s1,56(sp)
+    802040d6:	f84a                	sd	s2,48(sp)
+    802040d8:	0880                	addi	s0,sp,80
+  int which_dev = 0;
+    802040da:	fc042e23          	sw	zero,-36(s0)
+  uint64 sepc = r_sepc();
+    802040de:	00000097          	auipc	ra,0x0
+    802040e2:	bd4080e7          	jalr	-1068(ra) # 80203cb2 <r_sepc>
+    802040e6:	fca43823          	sd	a0,-48(s0)
+  uint64 sstatus = r_sstatus();
+    802040ea:	00000097          	auipc	ra,0x0
+    802040ee:	b46080e7          	jalr	-1210(ra) # 80203c30 <r_sstatus>
+    802040f2:	fca43423          	sd	a0,-56(s0)
+  uint64 scause = r_scause();
+    802040f6:	00000097          	auipc	ra,0x0
+    802040fa:	c0a080e7          	jalr	-1014(ra) # 80203d00 <r_scause>
+    802040fe:	fca43023          	sd	a0,-64(s0)
+  
+  if((sstatus & SSTATUS_SPP) == 0)
+    80204102:	fc843783          	ld	a5,-56(s0)
+    80204106:	1007f793          	andi	a5,a5,256
+    8020410a:	eb89                	bnez	a5,8020411c <kerneltrap+0x4e>
+    panic("kerneltrap: not from supervisor mode");
+    8020410c:	00009517          	auipc	a0,0x9
+    80204110:	70450513          	addi	a0,a0,1796 # 8020d810 <etext+0x810>
+    80204114:	ffffc097          	auipc	ra,0xffffc
+    80204118:	330080e7          	jalr	816(ra) # 80200444 <panic>
+  if(intr_get() != 0)
+    8020411c:	00000097          	auipc	ra,0x0
+    80204120:	c6a080e7          	jalr	-918(ra) # 80203d86 <intr_get>
+    80204124:	87aa                	mv	a5,a0
+    80204126:	cb89                	beqz	a5,80204138 <kerneltrap+0x6a>
+    panic("kerneltrap: interrupts enabled");
+    80204128:	00009517          	auipc	a0,0x9
+    8020412c:	71050513          	addi	a0,a0,1808 # 8020d838 <etext+0x838>
+    80204130:	ffffc097          	auipc	ra,0xffffc
+    80204134:	314080e7          	jalr	788(ra) # 80200444 <panic>
+
+  if((which_dev = devintr(1)) == 0){
+    80204138:	4505                	li	a0,1
+    8020413a:	00000097          	auipc	ra,0x0
+    8020413e:	0fe080e7          	jalr	254(ra) # 80204238 <devintr>
+    80204142:	87aa                	mv	a5,a0
+    80204144:	fcf42e23          	sw	a5,-36(s0)
+    80204148:	fdc42783          	lw	a5,-36(s0)
+    8020414c:	2781                	sext.w	a5,a5
+    8020414e:	e7d9                	bnez	a5,802041dc <kerneltrap+0x10e>
+    printf("\nscause %p\n", scause);
+    80204150:	fc043583          	ld	a1,-64(s0)
+    80204154:	00009517          	auipc	a0,0x9
+    80204158:	70450513          	addi	a0,a0,1796 # 8020d858 <etext+0x858>
+    8020415c:	ffffc097          	auipc	ra,0xffffc
+    80204160:	092080e7          	jalr	146(ra) # 802001ee <printf>
+    printf("sepc=%p stval=%p hart=%d\n", r_sepc(), r_stval(), r_tp());
+    80204164:	00000097          	auipc	ra,0x0
+    80204168:	b4e080e7          	jalr	-1202(ra) # 80203cb2 <r_sepc>
+    8020416c:	84aa                	mv	s1,a0
+    8020416e:	00000097          	auipc	ra,0x0
+    80204172:	bac080e7          	jalr	-1108(ra) # 80203d1a <r_stval>
+    80204176:	892a                	mv	s2,a0
+    80204178:	00000097          	auipc	ra,0x0
+    8020417c:	c3c080e7          	jalr	-964(ra) # 80203db4 <r_tp>
+    80204180:	87aa                	mv	a5,a0
+    80204182:	86be                	mv	a3,a5
+    80204184:	864a                	mv	a2,s2
+    80204186:	85a6                	mv	a1,s1
+    80204188:	00009517          	auipc	a0,0x9
+    8020418c:	6e050513          	addi	a0,a0,1760 # 8020d868 <etext+0x868>
+    80204190:	ffffc097          	auipc	ra,0xffffc
+    80204194:	05e080e7          	jalr	94(ra) # 802001ee <printf>
+    struct proc *p = myproc();
+    80204198:	ffffe097          	auipc	ra,0xffffe
+    8020419c:	7ca080e7          	jalr	1994(ra) # 80202962 <myproc>
+    802041a0:	faa43c23          	sd	a0,-72(s0)
+    if (p != 0) {
+    802041a4:	fb843783          	ld	a5,-72(s0)
+    802041a8:	c395                	beqz	a5,802041cc <kerneltrap+0xfe>
+      printf("pid: %d, name: %s\n", p->pid, p->name);
+    802041aa:	fb843783          	ld	a5,-72(s0)
+    802041ae:	5f98                	lw	a4,56(a5)
+    802041b0:	fb843783          	ld	a5,-72(s0)
+    802041b4:	18078793          	addi	a5,a5,384 # 2000180 <_entry-0x7e1ffe80>
+    802041b8:	863e                	mv	a2,a5
+    802041ba:	85ba                	mv	a1,a4
+    802041bc:	00009517          	auipc	a0,0x9
+    802041c0:	6cc50513          	addi	a0,a0,1740 # 8020d888 <etext+0x888>
+    802041c4:	ffffc097          	auipc	ra,0xffffc
+    802041c8:	02a080e7          	jalr	42(ra) # 802001ee <printf>
+    }
+    panic("kerneltrap");
+    802041cc:	00009517          	auipc	a0,0x9
+    802041d0:	6d450513          	addi	a0,a0,1748 # 8020d8a0 <etext+0x8a0>
+    802041d4:	ffffc097          	auipc	ra,0xffffc
+    802041d8:	270080e7          	jalr	624(ra) # 80200444 <panic>
+  }
+  // printf("which_dev: %d\n", which_dev);
+  
+  // give up the CPU if this is a timer interrupt.
+  if(which_dev == 2 && myproc() != 0 && myproc()->state == RUNNING) {
+    802041dc:	fdc42783          	lw	a5,-36(s0)
+    802041e0:	0007871b          	sext.w	a4,a5
+    802041e4:	4789                	li	a5,2
+    802041e6:	02f71663          	bne	a4,a5,80204212 <kerneltrap+0x144>
+    802041ea:	ffffe097          	auipc	ra,0xffffe
+    802041ee:	778080e7          	jalr	1912(ra) # 80202962 <myproc>
+    802041f2:	87aa                	mv	a5,a0
+    802041f4:	cf99                	beqz	a5,80204212 <kerneltrap+0x144>
+    802041f6:	ffffe097          	auipc	ra,0xffffe
+    802041fa:	76c080e7          	jalr	1900(ra) # 80202962 <myproc>
+    802041fe:	87aa                	mv	a5,a0
+    80204200:	4f9c                	lw	a5,24(a5)
+    80204202:	873e                	mv	a4,a5
+    80204204:	478d                	li	a5,3
+    80204206:	00f71663          	bne	a4,a5,80204212 <kerneltrap+0x144>
+    yield();
+    8020420a:	fffff097          	auipc	ra,0xfffff
+    8020420e:	4f6080e7          	jalr	1270(ra) # 80203700 <yield>
+  }
+  // the yield() may have caused some traps to occur,
+  // so restore trap registers for use by kernelvec.S's sepc instruction.
+  w_sepc(sepc);
+    80204212:	fd043503          	ld	a0,-48(s0)
+    80204216:	00000097          	auipc	ra,0x0
+    8020421a:	a82080e7          	jalr	-1406(ra) # 80203c98 <w_sepc>
+  w_sstatus(sstatus);
+    8020421e:	fc843503          	ld	a0,-56(s0)
+    80204222:	00000097          	auipc	ra,0x0
+    80204226:	a28080e7          	jalr	-1496(ra) # 80203c4a <w_sstatus>
+}
+    8020422a:	0001                	nop
+    8020422c:	60a6                	ld	ra,72(sp)
+    8020422e:	6406                	ld	s0,64(sp)
+    80204230:	74e2                	ld	s1,56(sp)
+    80204232:	7942                	ld	s2,48(sp)
+    80204234:	6161                	addi	sp,sp,80
+    80204236:	8082                	ret
+
+0000000080204238 <devintr>:
+// Check if it's an external/software interrupt, 
+// and handle it. 
+// returns  2 if timer interrupt, 
+//          1 if other device, 
+//          0 if not recognized. 
+int devintr(int cpl) {
+    80204238:	7179                	addi	sp,sp,-48
+    8020423a:	f406                	sd	ra,40(sp)
+    8020423c:	f022                	sd	s0,32(sp)
+    8020423e:	1800                	addi	s0,sp,48
+    80204240:	87aa                	mv	a5,a0
+    80204242:	fcf42e23          	sw	a5,-36(s0)
+	uint64 scause = r_scause();
+    80204246:	00000097          	auipc	ra,0x0
+    8020424a:	aba080e7          	jalr	-1350(ra) # 80203d00 <r_scause>
+    8020424e:	fea43423          	sd	a0,-24(s0)
+
+	#ifdef QEMU 
+	// handle external interrupt 
+	if ((0x8000000000000000L & scause) && 9 == (scause & 0xff)) 
+    80204252:	fe843783          	ld	a5,-24(s0)
+    80204256:	0a07d563          	bgez	a5,80204300 <devintr+0xc8>
+    8020425a:	fe843783          	ld	a5,-24(s0)
+    8020425e:	0ff7f713          	andi	a4,a5,255
+    80204262:	47a5                	li	a5,9
+    80204264:	08f71e63          	bne	a4,a5,80204300 <devintr+0xc8>
+	// in alternative to supervisor external interrupt, 
+	// which is not available on k210. 
+	if (0x8000000000000001L == scause && 9 == r_stval()) 
+	#endif 
+	{
+		int irq = plic_claim();
+    80204268:	00006097          	auipc	ra,0x6
+    8020426c:	4e8080e7          	jalr	1256(ra) # 8020a750 <plic_claim>
+    80204270:	87aa                	mv	a5,a0
+    80204272:	fef42223          	sw	a5,-28(s0)
+		if (UART_IRQ == irq) {
+    80204276:	fe442783          	lw	a5,-28(s0)
+    8020427a:	0007871b          	sext.w	a4,a5
+    8020427e:	47a9                	li	a5,10
+    80204280:	02f71863          	bne	a4,a5,802042b0 <devintr+0x78>
+			// keyboard input 
+			int c = sbi_console_getchar();
+    80204284:	00000097          	auipc	ra,0x0
+    80204288:	b48080e7          	jalr	-1208(ra) # 80203dcc <sbi_console_getchar>
+    8020428c:	87aa                	mv	a5,a0
+    8020428e:	fef42023          	sw	a5,-32(s0)
+			if (-1 != c) {
+    80204292:	fe042783          	lw	a5,-32(s0)
+    80204296:	0007871b          	sext.w	a4,a5
+    8020429a:	57fd                	li	a5,-1
+    8020429c:	04f70563          	beq	a4,a5,802042e6 <devintr+0xae>
+				consoleintr(c);
+    802042a0:	fe042783          	lw	a5,-32(s0)
+    802042a4:	853e                	mv	a0,a5
+    802042a6:	00006097          	auipc	ra,0x6
+    802042aa:	7f0080e7          	jalr	2032(ra) # 8020aa96 <consoleintr>
+    802042ae:	a825                	j	802042e6 <devintr+0xae>
+			}
+		}
+		else if (DISK_IRQ == irq) {
+    802042b0:	fe442783          	lw	a5,-28(s0)
+    802042b4:	0007871b          	sext.w	a4,a5
+    802042b8:	4785                	li	a5,1
+    802042ba:	00f71763          	bne	a4,a5,802042c8 <devintr+0x90>
+			disk_intr();
+    802042be:	00004097          	auipc	ra,0x4
+    802042c2:	b40080e7          	jalr	-1216(ra) # 80207dfe <disk_intr>
+    802042c6:	a005                	j	802042e6 <devintr+0xae>
+		}
+		else if (irq) {
+    802042c8:	fe442783          	lw	a5,-28(s0)
+    802042cc:	2781                	sext.w	a5,a5
+    802042ce:	cf81                	beqz	a5,802042e6 <devintr+0xae>
+			printf("unexpected interrupt irq = %d\n", irq);
+    802042d0:	fe442783          	lw	a5,-28(s0)
+    802042d4:	85be                	mv	a1,a5
+    802042d6:	00009517          	auipc	a0,0x9
+    802042da:	5da50513          	addi	a0,a0,1498 # 8020d8b0 <etext+0x8b0>
+    802042de:	ffffc097          	auipc	ra,0xffffc
+    802042e2:	f10080e7          	jalr	-240(ra) # 802001ee <printf>
+		}
+
+		if (irq) { plic_complete(irq);}
+    802042e6:	fe442783          	lw	a5,-28(s0)
+    802042ea:	2781                	sext.w	a5,a5
+    802042ec:	cb81                	beqz	a5,802042fc <devintr+0xc4>
+    802042ee:	fe442783          	lw	a5,-28(s0)
+    802042f2:	853e                	mv	a0,a5
+    802042f4:	00006097          	auipc	ra,0x6
+    802042f8:	49e080e7          	jalr	1182(ra) # 8020a792 <plic_complete>
+		#ifndef QEMU 
+		w_sip(r_sip() & ~2);    // clear pending bit
+		sbi_set_mie();
+		#endif 
+
+		return 1;
+    802042fc:	4785                	li	a5,1
+    802042fe:	a015                	j	80204322 <devintr+0xea>
+	}
+	else if (0x8000000000000005L == scause) {
+    80204300:	fe843703          	ld	a4,-24(s0)
+    80204304:	57fd                	li	a5,-1
+    80204306:	17fe                	slli	a5,a5,0x3f
+    80204308:	0795                	addi	a5,a5,5
+    8020430a:	00f71b63          	bne	a4,a5,80204320 <devintr+0xe8>
+		timer_tick(cpl);
+    8020430e:	fdc42783          	lw	a5,-36(s0)
+    80204312:	853e                	mv	a0,a5
+    80204314:	00004097          	auipc	ra,0x4
+    80204318:	9d4080e7          	jalr	-1580(ra) # 80207ce8 <timer_tick>
+		return 2;
+    8020431c:	4789                	li	a5,2
+    8020431e:	a011                	j	80204322 <devintr+0xea>
+	}
+	else { return 0;}
+    80204320:	4781                	li	a5,0
+}
+    80204322:	853e                	mv	a0,a5
+    80204324:	70a2                	ld	ra,40(sp)
+    80204326:	7402                	ld	s0,32(sp)
+    80204328:	6145                	addi	sp,sp,48
+    8020432a:	8082                	ret
+
+000000008020432c <trapframedump>:
+
+void trapframedump(struct trapframe *tf)
+{
+    8020432c:	1101                	addi	sp,sp,-32
+    8020432e:	ec06                	sd	ra,24(sp)
+    80204330:	e822                	sd	s0,16(sp)
+    80204332:	1000                	addi	s0,sp,32
+    80204334:	fea43423          	sd	a0,-24(s0)
+  printf("a0: %p\t", tf->a0);
+    80204338:	fe843783          	ld	a5,-24(s0)
+    8020433c:	7bbc                	ld	a5,112(a5)
+    8020433e:	85be                	mv	a1,a5
+    80204340:	00009517          	auipc	a0,0x9
+    80204344:	59050513          	addi	a0,a0,1424 # 8020d8d0 <etext+0x8d0>
+    80204348:	ffffc097          	auipc	ra,0xffffc
+    8020434c:	ea6080e7          	jalr	-346(ra) # 802001ee <printf>
+  printf("a1: %p\t", tf->a1);
+    80204350:	fe843783          	ld	a5,-24(s0)
+    80204354:	7fbc                	ld	a5,120(a5)
+    80204356:	85be                	mv	a1,a5
+    80204358:	00009517          	auipc	a0,0x9
+    8020435c:	58050513          	addi	a0,a0,1408 # 8020d8d8 <etext+0x8d8>
+    80204360:	ffffc097          	auipc	ra,0xffffc
+    80204364:	e8e080e7          	jalr	-370(ra) # 802001ee <printf>
+  printf("a2: %p\t", tf->a2);
+    80204368:	fe843783          	ld	a5,-24(s0)
+    8020436c:	63dc                	ld	a5,128(a5)
+    8020436e:	85be                	mv	a1,a5
+    80204370:	00009517          	auipc	a0,0x9
+    80204374:	57050513          	addi	a0,a0,1392 # 8020d8e0 <etext+0x8e0>
+    80204378:	ffffc097          	auipc	ra,0xffffc
+    8020437c:	e76080e7          	jalr	-394(ra) # 802001ee <printf>
+  printf("a3: %p\n", tf->a3);
+    80204380:	fe843783          	ld	a5,-24(s0)
+    80204384:	67dc                	ld	a5,136(a5)
+    80204386:	85be                	mv	a1,a5
+    80204388:	00009517          	auipc	a0,0x9
+    8020438c:	56050513          	addi	a0,a0,1376 # 8020d8e8 <etext+0x8e8>
+    80204390:	ffffc097          	auipc	ra,0xffffc
+    80204394:	e5e080e7          	jalr	-418(ra) # 802001ee <printf>
+  printf("a4: %p\t", tf->a4);
+    80204398:	fe843783          	ld	a5,-24(s0)
+    8020439c:	6bdc                	ld	a5,144(a5)
+    8020439e:	85be                	mv	a1,a5
+    802043a0:	00009517          	auipc	a0,0x9
+    802043a4:	55050513          	addi	a0,a0,1360 # 8020d8f0 <etext+0x8f0>
+    802043a8:	ffffc097          	auipc	ra,0xffffc
+    802043ac:	e46080e7          	jalr	-442(ra) # 802001ee <printf>
+  printf("a5: %p\t", tf->a5);
+    802043b0:	fe843783          	ld	a5,-24(s0)
+    802043b4:	6fdc                	ld	a5,152(a5)
+    802043b6:	85be                	mv	a1,a5
+    802043b8:	00009517          	auipc	a0,0x9
+    802043bc:	54050513          	addi	a0,a0,1344 # 8020d8f8 <etext+0x8f8>
+    802043c0:	ffffc097          	auipc	ra,0xffffc
+    802043c4:	e2e080e7          	jalr	-466(ra) # 802001ee <printf>
+  printf("a6: %p\t", tf->a6);
+    802043c8:	fe843783          	ld	a5,-24(s0)
+    802043cc:	73dc                	ld	a5,160(a5)
+    802043ce:	85be                	mv	a1,a5
+    802043d0:	00009517          	auipc	a0,0x9
+    802043d4:	53050513          	addi	a0,a0,1328 # 8020d900 <etext+0x900>
+    802043d8:	ffffc097          	auipc	ra,0xffffc
+    802043dc:	e16080e7          	jalr	-490(ra) # 802001ee <printf>
+  printf("a7: %p\n", tf->a7);
+    802043e0:	fe843783          	ld	a5,-24(s0)
+    802043e4:	77dc                	ld	a5,168(a5)
+    802043e6:	85be                	mv	a1,a5
+    802043e8:	00009517          	auipc	a0,0x9
+    802043ec:	52050513          	addi	a0,a0,1312 # 8020d908 <etext+0x908>
+    802043f0:	ffffc097          	auipc	ra,0xffffc
+    802043f4:	dfe080e7          	jalr	-514(ra) # 802001ee <printf>
+  printf("t0: %p\t", tf->t0);
+    802043f8:	fe843783          	ld	a5,-24(s0)
+    802043fc:	67bc                	ld	a5,72(a5)
+    802043fe:	85be                	mv	a1,a5
+    80204400:	00009517          	auipc	a0,0x9
+    80204404:	51050513          	addi	a0,a0,1296 # 8020d910 <etext+0x910>
+    80204408:	ffffc097          	auipc	ra,0xffffc
+    8020440c:	de6080e7          	jalr	-538(ra) # 802001ee <printf>
+  printf("t1: %p\t", tf->t1);
+    80204410:	fe843783          	ld	a5,-24(s0)
+    80204414:	6bbc                	ld	a5,80(a5)
+    80204416:	85be                	mv	a1,a5
+    80204418:	00009517          	auipc	a0,0x9
+    8020441c:	50050513          	addi	a0,a0,1280 # 8020d918 <etext+0x918>
+    80204420:	ffffc097          	auipc	ra,0xffffc
+    80204424:	dce080e7          	jalr	-562(ra) # 802001ee <printf>
+  printf("t2: %p\t", tf->t2);
+    80204428:	fe843783          	ld	a5,-24(s0)
+    8020442c:	6fbc                	ld	a5,88(a5)
+    8020442e:	85be                	mv	a1,a5
+    80204430:	00009517          	auipc	a0,0x9
+    80204434:	4f050513          	addi	a0,a0,1264 # 8020d920 <etext+0x920>
+    80204438:	ffffc097          	auipc	ra,0xffffc
+    8020443c:	db6080e7          	jalr	-586(ra) # 802001ee <printf>
+  printf("t3: %p\n", tf->t3);
+    80204440:	fe843783          	ld	a5,-24(s0)
+    80204444:	1007b783          	ld	a5,256(a5)
+    80204448:	85be                	mv	a1,a5
+    8020444a:	00009517          	auipc	a0,0x9
+    8020444e:	4de50513          	addi	a0,a0,1246 # 8020d928 <etext+0x928>
+    80204452:	ffffc097          	auipc	ra,0xffffc
+    80204456:	d9c080e7          	jalr	-612(ra) # 802001ee <printf>
+  printf("t4: %p\t", tf->t4);
+    8020445a:	fe843783          	ld	a5,-24(s0)
+    8020445e:	1087b783          	ld	a5,264(a5)
+    80204462:	85be                	mv	a1,a5
+    80204464:	00009517          	auipc	a0,0x9
+    80204468:	4cc50513          	addi	a0,a0,1228 # 8020d930 <etext+0x930>
+    8020446c:	ffffc097          	auipc	ra,0xffffc
+    80204470:	d82080e7          	jalr	-638(ra) # 802001ee <printf>
+  printf("t5: %p\t", tf->t5);
+    80204474:	fe843783          	ld	a5,-24(s0)
+    80204478:	1107b783          	ld	a5,272(a5)
+    8020447c:	85be                	mv	a1,a5
+    8020447e:	00009517          	auipc	a0,0x9
+    80204482:	4ba50513          	addi	a0,a0,1210 # 8020d938 <etext+0x938>
+    80204486:	ffffc097          	auipc	ra,0xffffc
+    8020448a:	d68080e7          	jalr	-664(ra) # 802001ee <printf>
+  printf("t6: %p\t", tf->t6);
+    8020448e:	fe843783          	ld	a5,-24(s0)
+    80204492:	1187b783          	ld	a5,280(a5)
+    80204496:	85be                	mv	a1,a5
+    80204498:	00009517          	auipc	a0,0x9
+    8020449c:	4a850513          	addi	a0,a0,1192 # 8020d940 <etext+0x940>
+    802044a0:	ffffc097          	auipc	ra,0xffffc
+    802044a4:	d4e080e7          	jalr	-690(ra) # 802001ee <printf>
+  printf("s0: %p\n", tf->s0);
+    802044a8:	fe843783          	ld	a5,-24(s0)
+    802044ac:	73bc                	ld	a5,96(a5)
+    802044ae:	85be                	mv	a1,a5
+    802044b0:	00009517          	auipc	a0,0x9
+    802044b4:	49850513          	addi	a0,a0,1176 # 8020d948 <etext+0x948>
+    802044b8:	ffffc097          	auipc	ra,0xffffc
+    802044bc:	d36080e7          	jalr	-714(ra) # 802001ee <printf>
+  printf("s1: %p\t", tf->s1);
+    802044c0:	fe843783          	ld	a5,-24(s0)
+    802044c4:	77bc                	ld	a5,104(a5)
+    802044c6:	85be                	mv	a1,a5
+    802044c8:	00009517          	auipc	a0,0x9
+    802044cc:	48850513          	addi	a0,a0,1160 # 8020d950 <etext+0x950>
+    802044d0:	ffffc097          	auipc	ra,0xffffc
+    802044d4:	d1e080e7          	jalr	-738(ra) # 802001ee <printf>
+  printf("s2: %p\t", tf->s2);
+    802044d8:	fe843783          	ld	a5,-24(s0)
+    802044dc:	7bdc                	ld	a5,176(a5)
+    802044de:	85be                	mv	a1,a5
+    802044e0:	00009517          	auipc	a0,0x9
+    802044e4:	47850513          	addi	a0,a0,1144 # 8020d958 <etext+0x958>
+    802044e8:	ffffc097          	auipc	ra,0xffffc
+    802044ec:	d06080e7          	jalr	-762(ra) # 802001ee <printf>
+  printf("s3: %p\t", tf->s3);
+    802044f0:	fe843783          	ld	a5,-24(s0)
+    802044f4:	7fdc                	ld	a5,184(a5)
+    802044f6:	85be                	mv	a1,a5
+    802044f8:	00009517          	auipc	a0,0x9
+    802044fc:	46850513          	addi	a0,a0,1128 # 8020d960 <etext+0x960>
+    80204500:	ffffc097          	auipc	ra,0xffffc
+    80204504:	cee080e7          	jalr	-786(ra) # 802001ee <printf>
+  printf("s4: %p\n", tf->s4);
+    80204508:	fe843783          	ld	a5,-24(s0)
+    8020450c:	63fc                	ld	a5,192(a5)
+    8020450e:	85be                	mv	a1,a5
+    80204510:	00009517          	auipc	a0,0x9
+    80204514:	45850513          	addi	a0,a0,1112 # 8020d968 <etext+0x968>
+    80204518:	ffffc097          	auipc	ra,0xffffc
+    8020451c:	cd6080e7          	jalr	-810(ra) # 802001ee <printf>
+  printf("s5: %p\t", tf->s5);
+    80204520:	fe843783          	ld	a5,-24(s0)
+    80204524:	67fc                	ld	a5,200(a5)
+    80204526:	85be                	mv	a1,a5
+    80204528:	00009517          	auipc	a0,0x9
+    8020452c:	44850513          	addi	a0,a0,1096 # 8020d970 <etext+0x970>
+    80204530:	ffffc097          	auipc	ra,0xffffc
+    80204534:	cbe080e7          	jalr	-834(ra) # 802001ee <printf>
+  printf("s6: %p\t", tf->s6);
+    80204538:	fe843783          	ld	a5,-24(s0)
+    8020453c:	6bfc                	ld	a5,208(a5)
+    8020453e:	85be                	mv	a1,a5
+    80204540:	00009517          	auipc	a0,0x9
+    80204544:	43850513          	addi	a0,a0,1080 # 8020d978 <etext+0x978>
+    80204548:	ffffc097          	auipc	ra,0xffffc
+    8020454c:	ca6080e7          	jalr	-858(ra) # 802001ee <printf>
+  printf("s7: %p\t", tf->s7);
+    80204550:	fe843783          	ld	a5,-24(s0)
+    80204554:	6ffc                	ld	a5,216(a5)
+    80204556:	85be                	mv	a1,a5
+    80204558:	00009517          	auipc	a0,0x9
+    8020455c:	42850513          	addi	a0,a0,1064 # 8020d980 <etext+0x980>
+    80204560:	ffffc097          	auipc	ra,0xffffc
+    80204564:	c8e080e7          	jalr	-882(ra) # 802001ee <printf>
+  printf("s8: %p\n", tf->s8);
+    80204568:	fe843783          	ld	a5,-24(s0)
+    8020456c:	73fc                	ld	a5,224(a5)
+    8020456e:	85be                	mv	a1,a5
+    80204570:	00009517          	auipc	a0,0x9
+    80204574:	41850513          	addi	a0,a0,1048 # 8020d988 <etext+0x988>
+    80204578:	ffffc097          	auipc	ra,0xffffc
+    8020457c:	c76080e7          	jalr	-906(ra) # 802001ee <printf>
+  printf("s9: %p\t", tf->s9);
+    80204580:	fe843783          	ld	a5,-24(s0)
+    80204584:	77fc                	ld	a5,232(a5)
+    80204586:	85be                	mv	a1,a5
+    80204588:	00009517          	auipc	a0,0x9
+    8020458c:	40850513          	addi	a0,a0,1032 # 8020d990 <etext+0x990>
+    80204590:	ffffc097          	auipc	ra,0xffffc
+    80204594:	c5e080e7          	jalr	-930(ra) # 802001ee <printf>
+  printf("s10: %p\t", tf->s10);
+    80204598:	fe843783          	ld	a5,-24(s0)
+    8020459c:	7bfc                	ld	a5,240(a5)
+    8020459e:	85be                	mv	a1,a5
+    802045a0:	00009517          	auipc	a0,0x9
+    802045a4:	3f850513          	addi	a0,a0,1016 # 8020d998 <etext+0x998>
+    802045a8:	ffffc097          	auipc	ra,0xffffc
+    802045ac:	c46080e7          	jalr	-954(ra) # 802001ee <printf>
+  printf("s11: %p\t", tf->s11);
+    802045b0:	fe843783          	ld	a5,-24(s0)
+    802045b4:	7ffc                	ld	a5,248(a5)
+    802045b6:	85be                	mv	a1,a5
+    802045b8:	00009517          	auipc	a0,0x9
+    802045bc:	3f050513          	addi	a0,a0,1008 # 8020d9a8 <etext+0x9a8>
+    802045c0:	ffffc097          	auipc	ra,0xffffc
+    802045c4:	c2e080e7          	jalr	-978(ra) # 802001ee <printf>
+  printf("ra: %p\n", tf->ra);
+    802045c8:	fe843783          	ld	a5,-24(s0)
+    802045cc:	779c                	ld	a5,40(a5)
+    802045ce:	85be                	mv	a1,a5
+    802045d0:	00009517          	auipc	a0,0x9
+    802045d4:	3e850513          	addi	a0,a0,1000 # 8020d9b8 <etext+0x9b8>
+    802045d8:	ffffc097          	auipc	ra,0xffffc
+    802045dc:	c16080e7          	jalr	-1002(ra) # 802001ee <printf>
+  printf("sp: %p\t", tf->sp);
+    802045e0:	fe843783          	ld	a5,-24(s0)
+    802045e4:	7b9c                	ld	a5,48(a5)
+    802045e6:	85be                	mv	a1,a5
+    802045e8:	00009517          	auipc	a0,0x9
+    802045ec:	3d850513          	addi	a0,a0,984 # 8020d9c0 <etext+0x9c0>
+    802045f0:	ffffc097          	auipc	ra,0xffffc
+    802045f4:	bfe080e7          	jalr	-1026(ra) # 802001ee <printf>
+  printf("gp: %p\t", tf->gp);
+    802045f8:	fe843783          	ld	a5,-24(s0)
+    802045fc:	7f9c                	ld	a5,56(a5)
+    802045fe:	85be                	mv	a1,a5
+    80204600:	00009517          	auipc	a0,0x9
+    80204604:	3c850513          	addi	a0,a0,968 # 8020d9c8 <etext+0x9c8>
+    80204608:	ffffc097          	auipc	ra,0xffffc
+    8020460c:	be6080e7          	jalr	-1050(ra) # 802001ee <printf>
+  printf("tp: %p\t", tf->tp);
+    80204610:	fe843783          	ld	a5,-24(s0)
+    80204614:	63bc                	ld	a5,64(a5)
+    80204616:	85be                	mv	a1,a5
+    80204618:	00009517          	auipc	a0,0x9
+    8020461c:	3b850513          	addi	a0,a0,952 # 8020d9d0 <etext+0x9d0>
+    80204620:	ffffc097          	auipc	ra,0xffffc
+    80204624:	bce080e7          	jalr	-1074(ra) # 802001ee <printf>
+  printf("epc: %p\n", tf->epc);
+    80204628:	fe843783          	ld	a5,-24(s0)
+    8020462c:	6f9c                	ld	a5,24(a5)
+    8020462e:	85be                	mv	a1,a5
+    80204630:	00009517          	auipc	a0,0x9
+    80204634:	3a850513          	addi	a0,a0,936 # 8020d9d8 <etext+0x9d8>
+    80204638:	ffffc097          	auipc	ra,0xffffc
+    8020463c:	bb6080e7          	jalr	-1098(ra) # 802001ee <printf>
+}
+    80204640:	0001                	nop
+    80204642:	60e2                	ld	ra,24(sp)
+    80204644:	6442                	ld	s0,16(sp)
+    80204646:	6105                	addi	sp,sp,32
+    80204648:	8082                	ret
+
+000000008020464a <r_tp>:
+{
+    8020464a:	1101                	addi	sp,sp,-32
+    8020464c:	ec22                	sd	s0,24(sp)
+    8020464e:	1000                	addi	s0,sp,32
+  asm volatile("mv %0, tp" : "=r" (x) );
+    80204650:	8792                	mv	a5,tp
+    80204652:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80204656:	fe843783          	ld	a5,-24(s0)
+}
+    8020465a:	853e                	mv	a0,a5
+    8020465c:	6462                	ld	s0,24(sp)
+    8020465e:	6105                	addi	sp,sp,32
+    80204660:	8082                	ret
+
+0000000080204662 <fetchaddr>:
+#include "include/printf.h"
+
+// Fetch the uint64 at addr from the current process.
+int
+fetchaddr(uint64 addr, uint64 *ip)
+{
+    80204662:	7179                	addi	sp,sp,-48
+    80204664:	f406                	sd	ra,40(sp)
+    80204666:	f022                	sd	s0,32(sp)
+    80204668:	1800                	addi	s0,sp,48
+    8020466a:	fca43c23          	sd	a0,-40(s0)
+    8020466e:	fcb43823          	sd	a1,-48(s0)
+  struct proc *p = myproc();
+    80204672:	ffffe097          	auipc	ra,0xffffe
+    80204676:	2f0080e7          	jalr	752(ra) # 80202962 <myproc>
+    8020467a:	fea43423          	sd	a0,-24(s0)
+  if(addr >= p->sz || addr+sizeof(uint64) > p->sz)
+    8020467e:	fe843783          	ld	a5,-24(s0)
+    80204682:	67bc                	ld	a5,72(a5)
+    80204684:	fd843703          	ld	a4,-40(s0)
+    80204688:	00f77b63          	bgeu	a4,a5,8020469e <fetchaddr+0x3c>
+    8020468c:	fd843783          	ld	a5,-40(s0)
+    80204690:	00878713          	addi	a4,a5,8
+    80204694:	fe843783          	ld	a5,-24(s0)
+    80204698:	67bc                	ld	a5,72(a5)
+    8020469a:	00e7f463          	bgeu	a5,a4,802046a2 <fetchaddr+0x40>
+    return -1;
+    8020469e:	57fd                	li	a5,-1
+    802046a0:	a839                	j	802046be <fetchaddr+0x5c>
+  // if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0)
+  if(copyin2((char *)ip, addr, sizeof(*ip)) != 0)
+    802046a2:	4621                	li	a2,8
+    802046a4:	fd843583          	ld	a1,-40(s0)
+    802046a8:	fd043503          	ld	a0,-48(s0)
+    802046ac:	ffffe097          	auipc	ra,0xffffe
+    802046b0:	8f8080e7          	jalr	-1800(ra) # 80201fa4 <copyin2>
+    802046b4:	87aa                	mv	a5,a0
+    802046b6:	c399                	beqz	a5,802046bc <fetchaddr+0x5a>
+    return -1;
+    802046b8:	57fd                	li	a5,-1
+    802046ba:	a011                	j	802046be <fetchaddr+0x5c>
+  return 0;
+    802046bc:	4781                	li	a5,0
+}
+    802046be:	853e                	mv	a0,a5
+    802046c0:	70a2                	ld	ra,40(sp)
+    802046c2:	7402                	ld	s0,32(sp)
+    802046c4:	6145                	addi	sp,sp,48
+    802046c6:	8082                	ret
+
+00000000802046c8 <fetchstr>:
+
+// Fetch the nul-terminated string at addr from the current process.
+// Returns length of string, not including nul, or -1 for error.
+int
+fetchstr(uint64 addr, char *buf, int max)
+{
+    802046c8:	7139                	addi	sp,sp,-64
+    802046ca:	fc06                	sd	ra,56(sp)
+    802046cc:	f822                	sd	s0,48(sp)
+    802046ce:	0080                	addi	s0,sp,64
+    802046d0:	fca43c23          	sd	a0,-40(s0)
+    802046d4:	fcb43823          	sd	a1,-48(s0)
+    802046d8:	87b2                	mv	a5,a2
+    802046da:	fcf42623          	sw	a5,-52(s0)
+  // struct proc *p = myproc();
+  // int err = copyinstr(p->pagetable, buf, addr, max);
+  int err = copyinstr2(buf, addr, max);
+    802046de:	fcc42783          	lw	a5,-52(s0)
+    802046e2:	863e                	mv	a2,a5
+    802046e4:	fd843583          	ld	a1,-40(s0)
+    802046e8:	fd043503          	ld	a0,-48(s0)
+    802046ec:	ffffe097          	auipc	ra,0xffffe
+    802046f0:	a32080e7          	jalr	-1486(ra) # 8020211e <copyinstr2>
+    802046f4:	87aa                	mv	a5,a0
+    802046f6:	fef42623          	sw	a5,-20(s0)
+  if(err < 0)
+    802046fa:	fec42783          	lw	a5,-20(s0)
+    802046fe:	2781                	sext.w	a5,a5
+    80204700:	0007d563          	bgez	a5,8020470a <fetchstr+0x42>
+    return err;
+    80204704:	fec42783          	lw	a5,-20(s0)
+    80204708:	a801                	j	80204718 <fetchstr+0x50>
+  return strlen(buf);
+    8020470a:	fd043503          	ld	a0,-48(s0)
+    8020470e:	ffffc097          	auipc	ra,0xffffc
+    80204712:	748080e7          	jalr	1864(ra) # 80200e56 <strlen>
+    80204716:	87aa                	mv	a5,a0
+}
+    80204718:	853e                	mv	a0,a5
+    8020471a:	70e2                	ld	ra,56(sp)
+    8020471c:	7442                	ld	s0,48(sp)
+    8020471e:	6121                	addi	sp,sp,64
+    80204720:	8082                	ret
+
+0000000080204722 <argraw>:
+
+static uint64
+argraw(int n)
+{
+    80204722:	7179                	addi	sp,sp,-48
+    80204724:	f406                	sd	ra,40(sp)
+    80204726:	f022                	sd	s0,32(sp)
+    80204728:	1800                	addi	s0,sp,48
+    8020472a:	87aa                	mv	a5,a0
+    8020472c:	fcf42e23          	sw	a5,-36(s0)
+  struct proc *p = myproc();
+    80204730:	ffffe097          	auipc	ra,0xffffe
+    80204734:	232080e7          	jalr	562(ra) # 80202962 <myproc>
+    80204738:	fea43423          	sd	a0,-24(s0)
+    8020473c:	fdc42783          	lw	a5,-36(s0)
+    80204740:	0007871b          	sext.w	a4,a5
+    80204744:	4795                	li	a5,5
+    80204746:	06e7e263          	bltu	a5,a4,802047aa <argraw+0x88>
+    8020474a:	fdc46783          	lwu	a5,-36(s0)
+    8020474e:	00279713          	slli	a4,a5,0x2
+    80204752:	00009797          	auipc	a5,0x9
+    80204756:	29e78793          	addi	a5,a5,670 # 8020d9f0 <etext+0x9f0>
+    8020475a:	97ba                	add	a5,a5,a4
+    8020475c:	439c                	lw	a5,0(a5)
+    8020475e:	0007871b          	sext.w	a4,a5
+    80204762:	00009797          	auipc	a5,0x9
+    80204766:	28e78793          	addi	a5,a5,654 # 8020d9f0 <etext+0x9f0>
+    8020476a:	97ba                	add	a5,a5,a4
+    8020476c:	8782                	jr	a5
+  switch (n) {
+  case 0:
+    return p->trapframe->a0;
+    8020476e:	fe843783          	ld	a5,-24(s0)
+    80204772:	73bc                	ld	a5,96(a5)
+    80204774:	7bbc                	ld	a5,112(a5)
+    80204776:	a091                	j	802047ba <argraw+0x98>
+  case 1:
+    return p->trapframe->a1;
+    80204778:	fe843783          	ld	a5,-24(s0)
+    8020477c:	73bc                	ld	a5,96(a5)
+    8020477e:	7fbc                	ld	a5,120(a5)
+    80204780:	a82d                	j	802047ba <argraw+0x98>
+  case 2:
+    return p->trapframe->a2;
+    80204782:	fe843783          	ld	a5,-24(s0)
+    80204786:	73bc                	ld	a5,96(a5)
+    80204788:	63dc                	ld	a5,128(a5)
+    8020478a:	a805                	j	802047ba <argraw+0x98>
+  case 3:
+    return p->trapframe->a3;
+    8020478c:	fe843783          	ld	a5,-24(s0)
+    80204790:	73bc                	ld	a5,96(a5)
+    80204792:	67dc                	ld	a5,136(a5)
+    80204794:	a01d                	j	802047ba <argraw+0x98>
+  case 4:
+    return p->trapframe->a4;
+    80204796:	fe843783          	ld	a5,-24(s0)
+    8020479a:	73bc                	ld	a5,96(a5)
+    8020479c:	6bdc                	ld	a5,144(a5)
+    8020479e:	a831                	j	802047ba <argraw+0x98>
+  case 5:
+    return p->trapframe->a5;
+    802047a0:	fe843783          	ld	a5,-24(s0)
+    802047a4:	73bc                	ld	a5,96(a5)
+    802047a6:	6fdc                	ld	a5,152(a5)
+    802047a8:	a809                	j	802047ba <argraw+0x98>
+  }
+  panic("argraw");
+    802047aa:	00009517          	auipc	a0,0x9
+    802047ae:	23e50513          	addi	a0,a0,574 # 8020d9e8 <etext+0x9e8>
+    802047b2:	ffffc097          	auipc	ra,0xffffc
+    802047b6:	c92080e7          	jalr	-878(ra) # 80200444 <panic>
+  return -1;
+}
+    802047ba:	853e                	mv	a0,a5
+    802047bc:	70a2                	ld	ra,40(sp)
+    802047be:	7402                	ld	s0,32(sp)
+    802047c0:	6145                	addi	sp,sp,48
+    802047c2:	8082                	ret
+
+00000000802047c4 <argint>:
+
+// Fetch the nth 32-bit system call argument.
+int
+argint(int n, int *ip)
+{
+    802047c4:	1101                	addi	sp,sp,-32
+    802047c6:	ec06                	sd	ra,24(sp)
+    802047c8:	e822                	sd	s0,16(sp)
+    802047ca:	1000                	addi	s0,sp,32
+    802047cc:	87aa                	mv	a5,a0
+    802047ce:	feb43023          	sd	a1,-32(s0)
+    802047d2:	fef42623          	sw	a5,-20(s0)
+  *ip = argraw(n);
+    802047d6:	fec42783          	lw	a5,-20(s0)
+    802047da:	853e                	mv	a0,a5
+    802047dc:	00000097          	auipc	ra,0x0
+    802047e0:	f46080e7          	jalr	-186(ra) # 80204722 <argraw>
+    802047e4:	87aa                	mv	a5,a0
+    802047e6:	0007871b          	sext.w	a4,a5
+    802047ea:	fe043783          	ld	a5,-32(s0)
+    802047ee:	c398                	sw	a4,0(a5)
+  return 0;
+    802047f0:	4781                	li	a5,0
+}
+    802047f2:	853e                	mv	a0,a5
+    802047f4:	60e2                	ld	ra,24(sp)
+    802047f6:	6442                	ld	s0,16(sp)
+    802047f8:	6105                	addi	sp,sp,32
+    802047fa:	8082                	ret
+
+00000000802047fc <argaddr>:
+// Retrieve an argument as a pointer.
+// Doesn't check for legality, since
+// copyin/copyout will do that.
+int
+argaddr(int n, uint64 *ip)
+{
+    802047fc:	1101                	addi	sp,sp,-32
+    802047fe:	ec06                	sd	ra,24(sp)
+    80204800:	e822                	sd	s0,16(sp)
+    80204802:	1000                	addi	s0,sp,32
+    80204804:	87aa                	mv	a5,a0
+    80204806:	feb43023          	sd	a1,-32(s0)
+    8020480a:	fef42623          	sw	a5,-20(s0)
+  *ip = argraw(n);
+    8020480e:	fec42783          	lw	a5,-20(s0)
+    80204812:	853e                	mv	a0,a5
+    80204814:	00000097          	auipc	ra,0x0
+    80204818:	f0e080e7          	jalr	-242(ra) # 80204722 <argraw>
+    8020481c:	872a                	mv	a4,a0
+    8020481e:	fe043783          	ld	a5,-32(s0)
+    80204822:	e398                	sd	a4,0(a5)
+  return 0;
+    80204824:	4781                	li	a5,0
+}
+    80204826:	853e                	mv	a0,a5
+    80204828:	60e2                	ld	ra,24(sp)
+    8020482a:	6442                	ld	s0,16(sp)
+    8020482c:	6105                	addi	sp,sp,32
+    8020482e:	8082                	ret
+
+0000000080204830 <argstr>:
+// Fetch the nth word-sized system call argument as a null-terminated string.
+// Copies into buf, at most max.
+// Returns string length if OK (including nul), -1 if error.
+int
+argstr(int n, char *buf, int max)
+{
+    80204830:	7179                	addi	sp,sp,-48
+    80204832:	f406                	sd	ra,40(sp)
+    80204834:	f022                	sd	s0,32(sp)
+    80204836:	1800                	addi	s0,sp,48
+    80204838:	87aa                	mv	a5,a0
+    8020483a:	fcb43823          	sd	a1,-48(s0)
+    8020483e:	8732                	mv	a4,a2
+    80204840:	fcf42e23          	sw	a5,-36(s0)
+    80204844:	87ba                	mv	a5,a4
+    80204846:	fcf42c23          	sw	a5,-40(s0)
+  uint64 addr;
+  if(argaddr(n, &addr) < 0)
+    8020484a:	fe840713          	addi	a4,s0,-24
+    8020484e:	fdc42783          	lw	a5,-36(s0)
+    80204852:	85ba                	mv	a1,a4
+    80204854:	853e                	mv	a0,a5
+    80204856:	00000097          	auipc	ra,0x0
+    8020485a:	fa6080e7          	jalr	-90(ra) # 802047fc <argaddr>
+    8020485e:	87aa                	mv	a5,a0
+    80204860:	0007d463          	bgez	a5,80204868 <argstr+0x38>
+    return -1;
+    80204864:	57fd                	li	a5,-1
+    80204866:	a831                	j	80204882 <argstr+0x52>
+  return fetchstr(addr, buf, max);
+    80204868:	fe843783          	ld	a5,-24(s0)
+    8020486c:	fd842703          	lw	a4,-40(s0)
+    80204870:	863a                	mv	a2,a4
+    80204872:	fd043583          	ld	a1,-48(s0)
+    80204876:	853e                	mv	a0,a5
+    80204878:	00000097          	auipc	ra,0x0
+    8020487c:	e50080e7          	jalr	-432(ra) # 802046c8 <fetchstr>
+    80204880:	87aa                	mv	a5,a0
+}
+    80204882:	853e                	mv	a0,a5
+    80204884:	70a2                	ld	ra,40(sp)
+    80204886:	7402                	ld	s0,32(sp)
+    80204888:	6145                	addi	sp,sp,48
+    8020488a:	8082                	ret
+
+000000008020488c <syscall>:
+  [SYS_uname]       "sys_uname",
+};
+
+void
+syscall(void)
+{
+    8020488c:	7179                	addi	sp,sp,-48
+    8020488e:	f406                	sd	ra,40(sp)
+    80204890:	f022                	sd	s0,32(sp)
+    80204892:	ec26                	sd	s1,24(sp)
+    80204894:	1800                	addi	s0,sp,48
+  int num;
+  struct proc *p = myproc();
+    80204896:	ffffe097          	auipc	ra,0xffffe
+    8020489a:	0cc080e7          	jalr	204(ra) # 80202962 <myproc>
+    8020489e:	fca43c23          	sd	a0,-40(s0)
+
+  num = p->trapframe->a7;             //从a7寄存器获取系统调用号
+    802048a2:	fd843783          	ld	a5,-40(s0)
+    802048a6:	73bc                	ld	a5,96(a5)
+    802048a8:	77dc                	ld	a5,168(a5)
+    802048aa:	fcf42a23          	sw	a5,-44(s0)
+  if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { //检查获取到的系统调用号是否合法
+    802048ae:	fd442783          	lw	a5,-44(s0)
+    802048b2:	2781                	sext.w	a5,a5
+    802048b4:	08f05963          	blez	a5,80204946 <syscall+0xba>
+    802048b8:	fd442783          	lw	a5,-44(s0)
+    802048bc:	873e                	mv	a4,a5
+    802048be:	10400793          	li	a5,260
+    802048c2:	08e7e263          	bltu	a5,a4,80204946 <syscall+0xba>
+    802048c6:	0000a717          	auipc	a4,0xa
+    802048ca:	78270713          	addi	a4,a4,1922 # 8020f048 <syscalls>
+    802048ce:	fd442783          	lw	a5,-44(s0)
+    802048d2:	078e                	slli	a5,a5,0x3
+    802048d4:	97ba                	add	a5,a5,a4
+    802048d6:	639c                	ld	a5,0(a5)
+    802048d8:	c7bd                	beqz	a5,80204946 <syscall+0xba>
+    p->trapframe->a0 = syscalls[num]();              //合法则执行并将返回值放入a0
+    802048da:	0000a717          	auipc	a4,0xa
+    802048de:	76e70713          	addi	a4,a4,1902 # 8020f048 <syscalls>
+    802048e2:	fd442783          	lw	a5,-44(s0)
+    802048e6:	078e                	slli	a5,a5,0x3
+    802048e8:	97ba                	add	a5,a5,a4
+    802048ea:	6398                	ld	a4,0(a5)
+    802048ec:	fd843783          	ld	a5,-40(s0)
+    802048f0:	73a4                	ld	s1,96(a5)
+    802048f2:	9702                	jalr	a4
+    802048f4:	87aa                	mv	a5,a0
+    802048f6:	f8bc                	sd	a5,112(s1)
+        // trace
+    if ((p->tmask & (1 << num)) != 0) {               
+    802048f8:	fd843783          	ld	a5,-40(s0)
+    802048fc:	1907a703          	lw	a4,400(a5)
+    80204900:	fd442783          	lw	a5,-44(s0)
+    80204904:	40f757bb          	sraw	a5,a4,a5
+    80204908:	2781                	sext.w	a5,a5
+    8020490a:	8b85                	andi	a5,a5,1
+    8020490c:	2781                	sext.w	a5,a5
+    8020490e:	c7ad                	beqz	a5,80204978 <syscall+0xec>
+      printf("pid %d: %s -> %d\n", p->pid, sysnames[num], p->trapframe->a0);
+    80204910:	fd843783          	ld	a5,-40(s0)
+    80204914:	5f8c                	lw	a1,56(a5)
+    80204916:	0000b717          	auipc	a4,0xb
+    8020491a:	f5a70713          	addi	a4,a4,-166 # 8020f870 <sysnames>
+    8020491e:	fd442783          	lw	a5,-44(s0)
+    80204922:	078e                	slli	a5,a5,0x3
+    80204924:	97ba                	add	a5,a5,a4
+    80204926:	6398                	ld	a4,0(a5)
+    80204928:	fd843783          	ld	a5,-40(s0)
+    8020492c:	73bc                	ld	a5,96(a5)
+    8020492e:	7bbc                	ld	a5,112(a5)
+    80204930:	86be                	mv	a3,a5
+    80204932:	863a                	mv	a2,a4
+    80204934:	00009517          	auipc	a0,0x9
+    80204938:	21450513          	addi	a0,a0,532 # 8020db48 <etext+0xb48>
+    8020493c:	ffffc097          	auipc	ra,0xffffc
+    80204940:	8b2080e7          	jalr	-1870(ra) # 802001ee <printf>
+    if ((p->tmask & (1 << num)) != 0) {               
+    80204944:	a815                	j	80204978 <syscall+0xec>
+    }
+  } else {
+    printf("pid %d %s: unknown sys call %d\n",  //不合法则输出报错信息
+    80204946:	fd843783          	ld	a5,-40(s0)
+    8020494a:	5f98                	lw	a4,56(a5)
+            p->pid, p->name, num);
+    8020494c:	fd843783          	ld	a5,-40(s0)
+    80204950:	18078793          	addi	a5,a5,384
+    printf("pid %d %s: unknown sys call %d\n",  //不合法则输出报错信息
+    80204954:	fd442683          	lw	a3,-44(s0)
+    80204958:	863e                	mv	a2,a5
+    8020495a:	85ba                	mv	a1,a4
+    8020495c:	00009517          	auipc	a0,0x9
+    80204960:	20450513          	addi	a0,a0,516 # 8020db60 <etext+0xb60>
+    80204964:	ffffc097          	auipc	ra,0xffffc
+    80204968:	88a080e7          	jalr	-1910(ra) # 802001ee <printf>
+    p->trapframe->a0 = -1;
+    8020496c:	fd843783          	ld	a5,-40(s0)
+    80204970:	73bc                	ld	a5,96(a5)
+    80204972:	577d                	li	a4,-1
+    80204974:	fbb8                	sd	a4,112(a5)
+  }
+}
+    80204976:	0001                	nop
+    80204978:	0001                	nop
+    8020497a:	70a2                	ld	ra,40(sp)
+    8020497c:	7402                	ld	s0,32(sp)
+    8020497e:	64e2                	ld	s1,24(sp)
+    80204980:	6145                	addi	sp,sp,48
+    80204982:	8082                	ret
+
+0000000080204984 <sys_test_proc>:
+
+uint64 
+sys_test_proc(void) {
+    80204984:	7179                	addi	sp,sp,-48
+    80204986:	f406                	sd	ra,40(sp)
+    80204988:	f022                	sd	s0,32(sp)
+    8020498a:	ec26                	sd	s1,24(sp)
+    8020498c:	1800                	addi	s0,sp,48
+    int n;
+    argint(0, &n);
+    8020498e:	fdc40793          	addi	a5,s0,-36
+    80204992:	85be                	mv	a1,a5
+    80204994:	4501                	li	a0,0
+    80204996:	00000097          	auipc	ra,0x0
+    8020499a:	e2e080e7          	jalr	-466(ra) # 802047c4 <argint>
+    printf("hello world from proc %d, hart %d, arg %d\n", myproc()->pid, r_tp(), n);
+    8020499e:	ffffe097          	auipc	ra,0xffffe
+    802049a2:	fc4080e7          	jalr	-60(ra) # 80202962 <myproc>
+    802049a6:	87aa                	mv	a5,a0
+    802049a8:	5f84                	lw	s1,56(a5)
+    802049aa:	00000097          	auipc	ra,0x0
+    802049ae:	ca0080e7          	jalr	-864(ra) # 8020464a <r_tp>
+    802049b2:	872a                	mv	a4,a0
+    802049b4:	fdc42783          	lw	a5,-36(s0)
+    802049b8:	86be                	mv	a3,a5
+    802049ba:	863a                	mv	a2,a4
+    802049bc:	85a6                	mv	a1,s1
+    802049be:	00009517          	auipc	a0,0x9
+    802049c2:	1c250513          	addi	a0,a0,450 # 8020db80 <etext+0xb80>
+    802049c6:	ffffc097          	auipc	ra,0xffffc
+    802049ca:	828080e7          	jalr	-2008(ra) # 802001ee <printf>
+    return 0;
+    802049ce:	4781                	li	a5,0
+}
+    802049d0:	853e                	mv	a0,a5
+    802049d2:	70a2                	ld	ra,40(sp)
+    802049d4:	7402                	ld	s0,32(sp)
+    802049d6:	64e2                	ld	s1,24(sp)
+    802049d8:	6145                	addi	sp,sp,48
+    802049da:	8082                	ret
+
+00000000802049dc <sys_sysinfo>:
+
+uint64
+sys_sysinfo(void)
+{
+    802049dc:	7179                	addi	sp,sp,-48
+    802049de:	f406                	sd	ra,40(sp)
+    802049e0:	f022                	sd	s0,32(sp)
+    802049e2:	1800                	addi	s0,sp,48
+  uint64 addr;
+  // struct proc *p = myproc();
+
+  if (argaddr(0, &addr) < 0) {
+    802049e4:	fe840793          	addi	a5,s0,-24
+    802049e8:	85be                	mv	a1,a5
+    802049ea:	4501                	li	a0,0
+    802049ec:	00000097          	auipc	ra,0x0
+    802049f0:	e10080e7          	jalr	-496(ra) # 802047fc <argaddr>
+    802049f4:	87aa                	mv	a5,a0
+    802049f6:	0007d463          	bgez	a5,802049fe <sys_sysinfo+0x22>
+    return -1;
+    802049fa:	57fd                	li	a5,-1
+    802049fc:	a081                	j	80204a3c <sys_sysinfo+0x60>
+  }
+
+  struct sysinfo info;
+  info.freemem = freemem_amount();
+    802049fe:	ffffc097          	auipc	ra,0xffffc
+    80204a02:	e16080e7          	jalr	-490(ra) # 80200814 <freemem_amount>
+    80204a06:	87aa                	mv	a5,a0
+    80204a08:	fcf43c23          	sd	a5,-40(s0)
+  info.nproc = procnum();
+    80204a0c:	fffff097          	auipc	ra,0xfffff
+    80204a10:	168080e7          	jalr	360(ra) # 80203b74 <procnum>
+    80204a14:	87aa                	mv	a5,a0
+    80204a16:	fef43023          	sd	a5,-32(s0)
+
+  // if (copyout(p->pagetable, addr, (char *)&info, sizeof(info)) < 0) {
+  if (copyout2(addr, (char *)&info, sizeof(info)) < 0) {
+    80204a1a:	fe843783          	ld	a5,-24(s0)
+    80204a1e:	fd840713          	addi	a4,s0,-40
+    80204a22:	4641                	li	a2,16
+    80204a24:	85ba                	mv	a1,a4
+    80204a26:	853e                	mv	a0,a5
+    80204a28:	ffffd097          	auipc	ra,0xffffd
+    80204a2c:	442080e7          	jalr	1090(ra) # 80201e6a <copyout2>
+    80204a30:	87aa                	mv	a5,a0
+    80204a32:	0007d463          	bgez	a5,80204a3a <sys_sysinfo+0x5e>
+    return -1;
+    80204a36:	57fd                	li	a5,-1
+    80204a38:	a011                	j	80204a3c <sys_sysinfo+0x60>
+  }
+
+  return 0;
+    80204a3a:	4781                	li	a5,0
+    80204a3c:	853e                	mv	a0,a5
+    80204a3e:	70a2                	ld	ra,40(sp)
+    80204a40:	7402                	ld	s0,32(sp)
+    80204a42:	6145                	addi	sp,sp,48
+    80204a44:	8082                	ret
+
+0000000080204a46 <sys_exec>:
+extern int exec(char *path, char **argv);
+
+
+uint64
+sys_exec(void)
+{
+    80204a46:	dd010113          	addi	sp,sp,-560
+    80204a4a:	22113423          	sd	ra,552(sp)
+    80204a4e:	22813023          	sd	s0,544(sp)
+    80204a52:	1c00                	addi	s0,sp,560
+  char path[FAT32_MAX_PATH], *argv[MAXARG];
+  int i;
+  uint64 uargv, uarg;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argaddr(1, &uargv) < 0){
+    80204a54:	ee040793          	addi	a5,s0,-288
+    80204a58:	10400613          	li	a2,260
+    80204a5c:	85be                	mv	a1,a5
+    80204a5e:	4501                	li	a0,0
+    80204a60:	00000097          	auipc	ra,0x0
+    80204a64:	dd0080e7          	jalr	-560(ra) # 80204830 <argstr>
+    80204a68:	87aa                	mv	a5,a0
+    80204a6a:	0007cd63          	bltz	a5,80204a84 <sys_exec+0x3e>
+    80204a6e:	dd840793          	addi	a5,s0,-552
+    80204a72:	85be                	mv	a1,a5
+    80204a74:	4505                	li	a0,1
+    80204a76:	00000097          	auipc	ra,0x0
+    80204a7a:	d86080e7          	jalr	-634(ra) # 802047fc <argaddr>
+    80204a7e:	87aa                	mv	a5,a0
+    80204a80:	0007d463          	bgez	a5,80204a88 <sys_exec+0x42>
+    return -1;
+    80204a84:	57fd                	li	a5,-1
+    80204a86:	a249                	j	80204c08 <sys_exec+0x1c2>
+  }
+  memset(argv, 0, sizeof(argv));
+    80204a88:	de040793          	addi	a5,s0,-544
+    80204a8c:	10000613          	li	a2,256
+    80204a90:	4581                	li	a1,0
+    80204a92:	853e                	mv	a0,a5
+    80204a94:	ffffc097          	auipc	ra,0xffffc
+    80204a98:	052080e7          	jalr	82(ra) # 80200ae6 <memset>
+  for(i=0;; i++){
+    80204a9c:	fe042623          	sw	zero,-20(s0)
+    if(i >= NELEM(argv)){
+    80204aa0:	fec42783          	lw	a5,-20(s0)
+    80204aa4:	873e                	mv	a4,a5
+    80204aa6:	47fd                	li	a5,31
+    80204aa8:	10e7e463          	bltu	a5,a4,80204bb0 <sys_exec+0x16a>
+      goto bad;
+    }
+    if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){
+    80204aac:	fec42783          	lw	a5,-20(s0)
+    80204ab0:	00379713          	slli	a4,a5,0x3
+    80204ab4:	dd843783          	ld	a5,-552(s0)
+    80204ab8:	97ba                	add	a5,a5,a4
+    80204aba:	dd040713          	addi	a4,s0,-560
+    80204abe:	85ba                	mv	a1,a4
+    80204ac0:	853e                	mv	a0,a5
+    80204ac2:	00000097          	auipc	ra,0x0
+    80204ac6:	ba0080e7          	jalr	-1120(ra) # 80204662 <fetchaddr>
+    80204aca:	87aa                	mv	a5,a0
+    80204acc:	0e07c463          	bltz	a5,80204bb4 <sys_exec+0x16e>
+      goto bad;
+    }
+    if(uarg == 0){
+    80204ad0:	dd043783          	ld	a5,-560(s0)
+    80204ad4:	eb95                	bnez	a5,80204b08 <sys_exec+0xc2>
+      argv[i] = 0;
+    80204ad6:	fec42783          	lw	a5,-20(s0)
+    80204ada:	078e                	slli	a5,a5,0x3
+    80204adc:	ff040713          	addi	a4,s0,-16
+    80204ae0:	97ba                	add	a5,a5,a4
+    80204ae2:	de07b823          	sd	zero,-528(a5)
+      break;
+    80204ae6:	0001                	nop
+      goto bad;
+    if(fetchstr(uarg, argv[i], PGSIZE) < 0)
+      goto bad;
+  }
+
+  int ret = exec(path, argv);
+    80204ae8:	de040713          	addi	a4,s0,-544
+    80204aec:	ee040793          	addi	a5,s0,-288
+    80204af0:	85ba                	mv	a1,a4
+    80204af2:	853e                	mv	a0,a5
+    80204af4:	00001097          	auipc	ra,0x1
+    80204af8:	7d4080e7          	jalr	2004(ra) # 802062c8 <exec>
+    80204afc:	87aa                	mv	a5,a0
+    80204afe:	fef42423          	sw	a5,-24(s0)
+
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    80204b02:	fe042623          	sw	zero,-20(s0)
+    80204b06:	a059                	j	80204b8c <sys_exec+0x146>
+    argv[i] = kalloc();
+    80204b08:	ffffc097          	auipc	ra,0xffffc
+    80204b0c:	c84080e7          	jalr	-892(ra) # 8020078c <kalloc>
+    80204b10:	872a                	mv	a4,a0
+    80204b12:	fec42783          	lw	a5,-20(s0)
+    80204b16:	078e                	slli	a5,a5,0x3
+    80204b18:	ff040693          	addi	a3,s0,-16
+    80204b1c:	97b6                	add	a5,a5,a3
+    80204b1e:	dee7b823          	sd	a4,-528(a5)
+    if(argv[i] == 0)
+    80204b22:	fec42783          	lw	a5,-20(s0)
+    80204b26:	078e                	slli	a5,a5,0x3
+    80204b28:	ff040713          	addi	a4,s0,-16
+    80204b2c:	97ba                	add	a5,a5,a4
+    80204b2e:	df07b783          	ld	a5,-528(a5)
+    80204b32:	c3d9                	beqz	a5,80204bb8 <sys_exec+0x172>
+    if(fetchstr(uarg, argv[i], PGSIZE) < 0)
+    80204b34:	dd043703          	ld	a4,-560(s0)
+    80204b38:	fec42783          	lw	a5,-20(s0)
+    80204b3c:	078e                	slli	a5,a5,0x3
+    80204b3e:	ff040693          	addi	a3,s0,-16
+    80204b42:	97b6                	add	a5,a5,a3
+    80204b44:	df07b783          	ld	a5,-528(a5)
+    80204b48:	6605                	lui	a2,0x1
+    80204b4a:	85be                	mv	a1,a5
+    80204b4c:	853a                	mv	a0,a4
+    80204b4e:	00000097          	auipc	ra,0x0
+    80204b52:	b7a080e7          	jalr	-1158(ra) # 802046c8 <fetchstr>
+    80204b56:	87aa                	mv	a5,a0
+    80204b58:	0607c263          	bltz	a5,80204bbc <sys_exec+0x176>
+  for(i=0;; i++){
+    80204b5c:	fec42783          	lw	a5,-20(s0)
+    80204b60:	2785                	addiw	a5,a5,1
+    80204b62:	fef42623          	sw	a5,-20(s0)
+    if(i >= NELEM(argv)){
+    80204b66:	bf2d                	j	80204aa0 <sys_exec+0x5a>
+    kfree(argv[i]);
+    80204b68:	fec42783          	lw	a5,-20(s0)
+    80204b6c:	078e                	slli	a5,a5,0x3
+    80204b6e:	ff040713          	addi	a4,s0,-16
+    80204b72:	97ba                	add	a5,a5,a4
+    80204b74:	df07b783          	ld	a5,-528(a5)
+    80204b78:	853e                	mv	a0,a5
+    80204b7a:	ffffc097          	auipc	ra,0xffffc
+    80204b7e:	b54080e7          	jalr	-1196(ra) # 802006ce <kfree>
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    80204b82:	fec42783          	lw	a5,-20(s0)
+    80204b86:	2785                	addiw	a5,a5,1
+    80204b88:	fef42623          	sw	a5,-20(s0)
+    80204b8c:	fec42783          	lw	a5,-20(s0)
+    80204b90:	873e                	mv	a4,a5
+    80204b92:	47fd                	li	a5,31
+    80204b94:	00e7eb63          	bltu	a5,a4,80204baa <sys_exec+0x164>
+    80204b98:	fec42783          	lw	a5,-20(s0)
+    80204b9c:	078e                	slli	a5,a5,0x3
+    80204b9e:	ff040713          	addi	a4,s0,-16
+    80204ba2:	97ba                	add	a5,a5,a4
+    80204ba4:	df07b783          	ld	a5,-528(a5)
+    80204ba8:	f3e1                	bnez	a5,80204b68 <sys_exec+0x122>
+
+  return ret;
+    80204baa:	fe842783          	lw	a5,-24(s0)
+    80204bae:	a8a9                	j	80204c08 <sys_exec+0x1c2>
+      goto bad;
+    80204bb0:	0001                	nop
+    80204bb2:	a031                	j	80204bbe <sys_exec+0x178>
+      goto bad;
+    80204bb4:	0001                	nop
+    80204bb6:	a021                	j	80204bbe <sys_exec+0x178>
+      goto bad;
+    80204bb8:	0001                	nop
+    80204bba:	a011                	j	80204bbe <sys_exec+0x178>
+      goto bad;
+    80204bbc:	0001                	nop
+
+ bad:
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    80204bbe:	fe042623          	sw	zero,-20(s0)
+    80204bc2:	a01d                	j	80204be8 <sys_exec+0x1a2>
+    kfree(argv[i]);
+    80204bc4:	fec42783          	lw	a5,-20(s0)
+    80204bc8:	078e                	slli	a5,a5,0x3
+    80204bca:	ff040713          	addi	a4,s0,-16
+    80204bce:	97ba                	add	a5,a5,a4
+    80204bd0:	df07b783          	ld	a5,-528(a5)
+    80204bd4:	853e                	mv	a0,a5
+    80204bd6:	ffffc097          	auipc	ra,0xffffc
+    80204bda:	af8080e7          	jalr	-1288(ra) # 802006ce <kfree>
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    80204bde:	fec42783          	lw	a5,-20(s0)
+    80204be2:	2785                	addiw	a5,a5,1
+    80204be4:	fef42623          	sw	a5,-20(s0)
+    80204be8:	fec42783          	lw	a5,-20(s0)
+    80204bec:	873e                	mv	a4,a5
+    80204bee:	47fd                	li	a5,31
+    80204bf0:	00e7eb63          	bltu	a5,a4,80204c06 <sys_exec+0x1c0>
+    80204bf4:	fec42783          	lw	a5,-20(s0)
+    80204bf8:	078e                	slli	a5,a5,0x3
+    80204bfa:	ff040713          	addi	a4,s0,-16
+    80204bfe:	97ba                	add	a5,a5,a4
+    80204c00:	df07b783          	ld	a5,-528(a5)
+    80204c04:	f3e1                	bnez	a5,80204bc4 <sys_exec+0x17e>
+  return -1;
+    80204c06:	57fd                	li	a5,-1
+}
+    80204c08:	853e                	mv	a0,a5
+    80204c0a:	22813083          	ld	ra,552(sp)
+    80204c0e:	22013403          	ld	s0,544(sp)
+    80204c12:	23010113          	addi	sp,sp,560
+    80204c16:	8082                	ret
+
+0000000080204c18 <sys_exit>:
+
+uint64
+sys_exit(void)
+{
+    80204c18:	1101                	addi	sp,sp,-32
+    80204c1a:	ec06                	sd	ra,24(sp)
+    80204c1c:	e822                	sd	s0,16(sp)
+    80204c1e:	1000                	addi	s0,sp,32
+  int n;
+  if(argint(0, &n) < 0)
+    80204c20:	fec40793          	addi	a5,s0,-20
+    80204c24:	85be                	mv	a1,a5
+    80204c26:	4501                	li	a0,0
+    80204c28:	00000097          	auipc	ra,0x0
+    80204c2c:	b9c080e7          	jalr	-1124(ra) # 802047c4 <argint>
+    80204c30:	87aa                	mv	a5,a0
+    80204c32:	0007d463          	bgez	a5,80204c3a <sys_exit+0x22>
+    return -1;
+    80204c36:	57fd                	li	a5,-1
+    80204c38:	a809                	j	80204c4a <sys_exit+0x32>
+  exit(n);
+    80204c3a:	fec42783          	lw	a5,-20(s0)
+    80204c3e:	853e                	mv	a0,a5
+    80204c40:	ffffe097          	auipc	ra,0xffffe
+    80204c44:	4a4080e7          	jalr	1188(ra) # 802030e4 <exit>
+  return 0;  // not reached
+    80204c48:	4781                	li	a5,0
+}
+    80204c4a:	853e                	mv	a0,a5
+    80204c4c:	60e2                	ld	ra,24(sp)
+    80204c4e:	6442                	ld	s0,16(sp)
+    80204c50:	6105                	addi	sp,sp,32
+    80204c52:	8082                	ret
+
+0000000080204c54 <sys_getpid>:
+
+uint64
+sys_getpid(void)
+{
+    80204c54:	1141                	addi	sp,sp,-16
+    80204c56:	e406                	sd	ra,8(sp)
+    80204c58:	e022                	sd	s0,0(sp)
+    80204c5a:	0800                	addi	s0,sp,16
+  return myproc()->pid;
+    80204c5c:	ffffe097          	auipc	ra,0xffffe
+    80204c60:	d06080e7          	jalr	-762(ra) # 80202962 <myproc>
+    80204c64:	87aa                	mv	a5,a0
+    80204c66:	5f9c                	lw	a5,56(a5)
+}
+    80204c68:	853e                	mv	a0,a5
+    80204c6a:	60a2                	ld	ra,8(sp)
+    80204c6c:	6402                	ld	s0,0(sp)
+    80204c6e:	0141                	addi	sp,sp,16
+    80204c70:	8082                	ret
+
+0000000080204c72 <sys_getppid>:
+
+uint64
+sys_getppid(void)
+{
+    80204c72:	1141                	addi	sp,sp,-16
+    80204c74:	e406                	sd	ra,8(sp)
+    80204c76:	e022                	sd	s0,0(sp)
+    80204c78:	0800                	addi	s0,sp,16
+  return myproc()->parent->pid;
+    80204c7a:	ffffe097          	auipc	ra,0xffffe
+    80204c7e:	ce8080e7          	jalr	-792(ra) # 80202962 <myproc>
+    80204c82:	87aa                	mv	a5,a0
+    80204c84:	739c                	ld	a5,32(a5)
+    80204c86:	5f9c                	lw	a5,56(a5)
+}
+    80204c88:	853e                	mv	a0,a5
+    80204c8a:	60a2                	ld	ra,8(sp)
+    80204c8c:	6402                	ld	s0,0(sp)
+    80204c8e:	0141                	addi	sp,sp,16
+    80204c90:	8082                	ret
+
+0000000080204c92 <sys_fork>:
+
+uint64
+sys_fork(void)
+{
+    80204c92:	1141                	addi	sp,sp,-16
+    80204c94:	e406                	sd	ra,8(sp)
+    80204c96:	e022                	sd	s0,0(sp)
+    80204c98:	0800                	addi	s0,sp,16
+  return do_fork(0);
+    80204c9a:	4501                	li	a0,0
+    80204c9c:	ffffe097          	auipc	ra,0xffffe
+    80204ca0:	230080e7          	jalr	560(ra) # 80202ecc <do_fork>
+    80204ca4:	87aa                	mv	a5,a0
+}
+    80204ca6:	853e                	mv	a0,a5
+    80204ca8:	60a2                	ld	ra,8(sp)
+    80204caa:	6402                	ld	s0,0(sp)
+    80204cac:	0141                	addi	sp,sp,16
+    80204cae:	8082                	ret
+
+0000000080204cb0 <sys_clone>:
+
+uint64
+sys_clone(void)
+{
+    80204cb0:	1101                	addi	sp,sp,-32
+    80204cb2:	ec06                	sd	ra,24(sp)
+    80204cb4:	e822                	sd	s0,16(sp)
+    80204cb6:	1000                	addi	s0,sp,32
+  uint64 stack;
+  int flag;
+  argint(0, &flag);
+    80204cb8:	fe440793          	addi	a5,s0,-28
+    80204cbc:	85be                	mv	a1,a5
+    80204cbe:	4501                	li	a0,0
+    80204cc0:	00000097          	auipc	ra,0x0
+    80204cc4:	b04080e7          	jalr	-1276(ra) # 802047c4 <argint>
+  argaddr(1, &stack);
+    80204cc8:	fe840793          	addi	a5,s0,-24
+    80204ccc:	85be                	mv	a1,a5
+    80204cce:	4505                	li	a0,1
+    80204cd0:	00000097          	auipc	ra,0x0
+    80204cd4:	b2c080e7          	jalr	-1236(ra) # 802047fc <argaddr>
+  return do_fork(stack);
+    80204cd8:	fe843783          	ld	a5,-24(s0)
+    80204cdc:	853e                	mv	a0,a5
+    80204cde:	ffffe097          	auipc	ra,0xffffe
+    80204ce2:	1ee080e7          	jalr	494(ra) # 80202ecc <do_fork>
+    80204ce6:	87aa                	mv	a5,a0
+}
+    80204ce8:	853e                	mv	a0,a5
+    80204cea:	60e2                	ld	ra,24(sp)
+    80204cec:	6442                	ld	s0,16(sp)
+    80204cee:	6105                	addi	sp,sp,32
+    80204cf0:	8082                	ret
+
+0000000080204cf2 <sys_wait>:
+
+
+uint64
+sys_wait(void)
+{
+    80204cf2:	1101                	addi	sp,sp,-32
+    80204cf4:	ec06                	sd	ra,24(sp)
+    80204cf6:	e822                	sd	s0,16(sp)
+    80204cf8:	1000                	addi	s0,sp,32
+  uint64 p;
+  if(argaddr(1, &p) < 0)
+    80204cfa:	fe840793          	addi	a5,s0,-24
+    80204cfe:	85be                	mv	a1,a5
+    80204d00:	4505                	li	a0,1
+    80204d02:	00000097          	auipc	ra,0x0
+    80204d06:	afa080e7          	jalr	-1286(ra) # 802047fc <argaddr>
+    80204d0a:	87aa                	mv	a5,a0
+    80204d0c:	0007d463          	bgez	a5,80204d14 <sys_wait+0x22>
+    return -1;
+    80204d10:	57fd                	li	a5,-1
+    80204d12:	a809                	j	80204d24 <sys_wait+0x32>
+  return wait(p);
+    80204d14:	fe843783          	ld	a5,-24(s0)
+    80204d18:	853e                	mv	a0,a5
+    80204d1a:	ffffe097          	auipc	ra,0xffffe
+    80204d1e:	550080e7          	jalr	1360(ra) # 8020326a <wait>
+    80204d22:	87aa                	mv	a5,a0
+}
+    80204d24:	853e                	mv	a0,a5
+    80204d26:	60e2                	ld	ra,24(sp)
+    80204d28:	6442                	ld	s0,16(sp)
+    80204d2a:	6105                	addi	sp,sp,32
+    80204d2c:	8082                	ret
+
+0000000080204d2e <sys_wait4>:
+
+uint64
+sys_wait4(void)
+{
+    80204d2e:	7179                	addi	sp,sp,-48
+    80204d30:	f406                	sd	ra,40(sp)
+    80204d32:	f022                	sd	s0,32(sp)
+    80204d34:	1800                	addi	s0,sp,48
+  uint64 pid;
+  uint64 status;
+  uint64 option;
+  if(argaddr(0, &pid) < 0)
+    80204d36:	fe840793          	addi	a5,s0,-24
+    80204d3a:	85be                	mv	a1,a5
+    80204d3c:	4501                	li	a0,0
+    80204d3e:	00000097          	auipc	ra,0x0
+    80204d42:	abe080e7          	jalr	-1346(ra) # 802047fc <argaddr>
+    80204d46:	87aa                	mv	a5,a0
+    80204d48:	0007d463          	bgez	a5,80204d50 <sys_wait4+0x22>
+    return -1;
+    80204d4c:	57fd                	li	a5,-1
+    80204d4e:	a0a5                	j	80204db6 <sys_wait4+0x88>
+  if(argaddr(1, &status) < 0)
+    80204d50:	fe040793          	addi	a5,s0,-32
+    80204d54:	85be                	mv	a1,a5
+    80204d56:	4505                	li	a0,1
+    80204d58:	00000097          	auipc	ra,0x0
+    80204d5c:	aa4080e7          	jalr	-1372(ra) # 802047fc <argaddr>
+    80204d60:	87aa                	mv	a5,a0
+    80204d62:	0007d463          	bgez	a5,80204d6a <sys_wait4+0x3c>
+    return -1; 
+    80204d66:	57fd                	li	a5,-1
+    80204d68:	a0b9                	j	80204db6 <sys_wait4+0x88>
+  if(argaddr(2, &option) < 0)
+    80204d6a:	fd840793          	addi	a5,s0,-40
+    80204d6e:	85be                	mv	a1,a5
+    80204d70:	4509                	li	a0,2
+    80204d72:	00000097          	auipc	ra,0x0
+    80204d76:	a8a080e7          	jalr	-1398(ra) # 802047fc <argaddr>
+    80204d7a:	87aa                	mv	a5,a0
+    80204d7c:	0007d463          	bgez	a5,80204d84 <sys_wait4+0x56>
+    return -1;
+    80204d80:	57fd                	li	a5,-1
+    80204d82:	a815                	j	80204db6 <sys_wait4+0x88>
+  if(pid == -1)
+    80204d84:	fe843703          	ld	a4,-24(s0)
+    80204d88:	57fd                	li	a5,-1
+    80204d8a:	00f71b63          	bne	a4,a5,80204da0 <sys_wait4+0x72>
+    return wait(status);
+    80204d8e:	fe043783          	ld	a5,-32(s0)
+    80204d92:	853e                	mv	a0,a5
+    80204d94:	ffffe097          	auipc	ra,0xffffe
+    80204d98:	4d6080e7          	jalr	1238(ra) # 8020326a <wait>
+    80204d9c:	87aa                	mv	a5,a0
+    80204d9e:	a821                	j	80204db6 <sys_wait4+0x88>
+  return do_wait(pid, status);
+    80204da0:	fe843783          	ld	a5,-24(s0)
+    80204da4:	fe043703          	ld	a4,-32(s0)
+    80204da8:	85ba                	mv	a1,a4
+    80204daa:	853e                	mv	a0,a5
+    80204dac:	ffffe097          	auipc	ra,0xffffe
+    80204db0:	60c080e7          	jalr	1548(ra) # 802033b8 <do_wait>
+    80204db4:	87aa                	mv	a5,a0
+}
+    80204db6:	853e                	mv	a0,a5
+    80204db8:	70a2                	ld	ra,40(sp)
+    80204dba:	7402                	ld	s0,32(sp)
+    80204dbc:	6145                	addi	sp,sp,48
+    80204dbe:	8082                	ret
+
+0000000080204dc0 <sys_sbrk>:
+
+
+uint64
+sys_sbrk(void)
+{
+    80204dc0:	1101                	addi	sp,sp,-32
+    80204dc2:	ec06                	sd	ra,24(sp)
+    80204dc4:	e822                	sd	s0,16(sp)
+    80204dc6:	1000                	addi	s0,sp,32
+  int addr;
+  int n;
+
+  if(argint(0, &n) < 0)
+    80204dc8:	fe840793          	addi	a5,s0,-24
+    80204dcc:	85be                	mv	a1,a5
+    80204dce:	4501                	li	a0,0
+    80204dd0:	00000097          	auipc	ra,0x0
+    80204dd4:	9f4080e7          	jalr	-1548(ra) # 802047c4 <argint>
+    80204dd8:	87aa                	mv	a5,a0
+    80204dda:	0007d463          	bgez	a5,80204de2 <sys_sbrk+0x22>
+    return -1;
+    80204dde:	57fd                	li	a5,-1
+    80204de0:	a03d                	j	80204e0e <sys_sbrk+0x4e>
+  addr = myproc()->sz;
+    80204de2:	ffffe097          	auipc	ra,0xffffe
+    80204de6:	b80080e7          	jalr	-1152(ra) # 80202962 <myproc>
+    80204dea:	87aa                	mv	a5,a0
+    80204dec:	67bc                	ld	a5,72(a5)
+    80204dee:	fef42623          	sw	a5,-20(s0)
+  if(growproc(n) < 0)
+    80204df2:	fe842783          	lw	a5,-24(s0)
+    80204df6:	853e                	mv	a0,a5
+    80204df8:	ffffe097          	auipc	ra,0xffffe
+    80204dfc:	01a080e7          	jalr	26(ra) # 80202e12 <growproc>
+    80204e00:	87aa                	mv	a5,a0
+    80204e02:	0007d463          	bgez	a5,80204e0a <sys_sbrk+0x4a>
+    return -1;
+    80204e06:	57fd                	li	a5,-1
+    80204e08:	a019                	j	80204e0e <sys_sbrk+0x4e>
+  return addr;
+    80204e0a:	fec42783          	lw	a5,-20(s0)
+}
+    80204e0e:	853e                	mv	a0,a5
+    80204e10:	60e2                	ld	ra,24(sp)
+    80204e12:	6442                	ld	s0,16(sp)
+    80204e14:	6105                	addi	sp,sp,32
+    80204e16:	8082                	ret
+
+0000000080204e18 <sys_sleep>:
+
+uint64
+sys_sleep(void)
+{
+    80204e18:	1101                	addi	sp,sp,-32
+    80204e1a:	ec06                	sd	ra,24(sp)
+    80204e1c:	e822                	sd	s0,16(sp)
+    80204e1e:	1000                	addi	s0,sp,32
+  int n;
+  uint ticks0;
+
+  if(argint(0, &n) < 0)
+    80204e20:	fe840793          	addi	a5,s0,-24
+    80204e24:	85be                	mv	a1,a5
+    80204e26:	4501                	li	a0,0
+    80204e28:	00000097          	auipc	ra,0x0
+    80204e2c:	99c080e7          	jalr	-1636(ra) # 802047c4 <argint>
+    80204e30:	87aa                	mv	a5,a0
+    80204e32:	0007d463          	bgez	a5,80204e3a <sys_sleep+0x22>
+    return -1;
+    80204e36:	57fd                	li	a5,-1
+    80204e38:	a079                	j	80204ec6 <sys_sleep+0xae>
+  acquire(&tickslock);
+    80204e3a:	0000b517          	auipc	a0,0xb
+    80204e3e:	68e53503          	ld	a0,1678(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204e42:	ffffc097          	auipc	ra,0xffffc
+    80204e46:	ba6080e7          	jalr	-1114(ra) # 802009e8 <acquire>
+  ticks0 = ticks;
+    80204e4a:	0000b797          	auipc	a5,0xb
+    80204e4e:	69e7b783          	ld	a5,1694(a5) # 802104e8 <_GLOBAL_OFFSET_TABLE_+0x60>
+    80204e52:	439c                	lw	a5,0(a5)
+    80204e54:	fef42623          	sw	a5,-20(s0)
+  while(ticks - ticks0 < n){
+    80204e58:	a835                	j	80204e94 <sys_sleep+0x7c>
+    if(myproc()->killed){
+    80204e5a:	ffffe097          	auipc	ra,0xffffe
+    80204e5e:	b08080e7          	jalr	-1272(ra) # 80202962 <myproc>
+    80204e62:	87aa                	mv	a5,a0
+    80204e64:	5b9c                	lw	a5,48(a5)
+    80204e66:	cb99                	beqz	a5,80204e7c <sys_sleep+0x64>
+      release(&tickslock);
+    80204e68:	0000b517          	auipc	a0,0xb
+    80204e6c:	66053503          	ld	a0,1632(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204e70:	ffffc097          	auipc	ra,0xffffc
+    80204e74:	bdc080e7          	jalr	-1060(ra) # 80200a4c <release>
+      return -1;
+    80204e78:	57fd                	li	a5,-1
+    80204e7a:	a0b1                	j	80204ec6 <sys_sleep+0xae>
+    }
+    sleep(&ticks, &tickslock);
+    80204e7c:	0000b597          	auipc	a1,0xb
+    80204e80:	64c5b583          	ld	a1,1612(a1) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204e84:	0000b517          	auipc	a0,0xb
+    80204e88:	66453503          	ld	a0,1636(a0) # 802104e8 <_GLOBAL_OFFSET_TABLE_+0x60>
+    80204e8c:	fffff097          	auipc	ra,0xfffff
+    80204e90:	930080e7          	jalr	-1744(ra) # 802037bc <sleep>
+  while(ticks - ticks0 < n){
+    80204e94:	0000b797          	auipc	a5,0xb
+    80204e98:	6547b783          	ld	a5,1620(a5) # 802104e8 <_GLOBAL_OFFSET_TABLE_+0x60>
+    80204e9c:	4398                	lw	a4,0(a5)
+    80204e9e:	fec42783          	lw	a5,-20(s0)
+    80204ea2:	40f707bb          	subw	a5,a4,a5
+    80204ea6:	0007871b          	sext.w	a4,a5
+    80204eaa:	fe842783          	lw	a5,-24(s0)
+    80204eae:	2781                	sext.w	a5,a5
+    80204eb0:	faf765e3          	bltu	a4,a5,80204e5a <sys_sleep+0x42>
+  }
+  release(&tickslock);
+    80204eb4:	0000b517          	auipc	a0,0xb
+    80204eb8:	61453503          	ld	a0,1556(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204ebc:	ffffc097          	auipc	ra,0xffffc
+    80204ec0:	b90080e7          	jalr	-1136(ra) # 80200a4c <release>
+  return 0;
+    80204ec4:	4781                	li	a5,0
+}
+    80204ec6:	853e                	mv	a0,a5
+    80204ec8:	60e2                	ld	ra,24(sp)
+    80204eca:	6442                	ld	s0,16(sp)
+    80204ecc:	6105                	addi	sp,sp,32
+    80204ece:	8082                	ret
+
+0000000080204ed0 <sys_kill>:
+
+uint64
+sys_kill(void)
+{
+    80204ed0:	1101                	addi	sp,sp,-32
+    80204ed2:	ec06                	sd	ra,24(sp)
+    80204ed4:	e822                	sd	s0,16(sp)
+    80204ed6:	1000                	addi	s0,sp,32
+  int pid;
+
+  if(argint(0, &pid) < 0)
+    80204ed8:	fec40793          	addi	a5,s0,-20
+    80204edc:	85be                	mv	a1,a5
+    80204ede:	4501                	li	a0,0
+    80204ee0:	00000097          	auipc	ra,0x0
+    80204ee4:	8e4080e7          	jalr	-1820(ra) # 802047c4 <argint>
+    80204ee8:	87aa                	mv	a5,a0
+    80204eea:	0007d463          	bgez	a5,80204ef2 <sys_kill+0x22>
+    return -1;
+    80204eee:	57fd                	li	a5,-1
+    80204ef0:	a809                	j	80204f02 <sys_kill+0x32>
+  return kill(pid);
+    80204ef2:	fec42783          	lw	a5,-20(s0)
+    80204ef6:	853e                	mv	a0,a5
+    80204ef8:	fffff097          	auipc	ra,0xfffff
+    80204efc:	a36080e7          	jalr	-1482(ra) # 8020392e <kill>
+    80204f00:	87aa                	mv	a5,a0
+}
+    80204f02:	853e                	mv	a0,a5
+    80204f04:	60e2                	ld	ra,24(sp)
+    80204f06:	6442                	ld	s0,16(sp)
+    80204f08:	6105                	addi	sp,sp,32
+    80204f0a:	8082                	ret
+
+0000000080204f0c <sys_uptime>:
+
+// return how many clock tick interrupts have occurred
+// since start.
+uint64
+sys_uptime(void)
+{
+    80204f0c:	1101                	addi	sp,sp,-32
+    80204f0e:	ec06                	sd	ra,24(sp)
+    80204f10:	e822                	sd	s0,16(sp)
+    80204f12:	1000                	addi	s0,sp,32
+  uint xticks;
+
+  acquire(&tickslock);
+    80204f14:	0000b517          	auipc	a0,0xb
+    80204f18:	5b453503          	ld	a0,1460(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204f1c:	ffffc097          	auipc	ra,0xffffc
+    80204f20:	acc080e7          	jalr	-1332(ra) # 802009e8 <acquire>
+  xticks = ticks;
+    80204f24:	0000b797          	auipc	a5,0xb
+    80204f28:	5c47b783          	ld	a5,1476(a5) # 802104e8 <_GLOBAL_OFFSET_TABLE_+0x60>
+    80204f2c:	439c                	lw	a5,0(a5)
+    80204f2e:	fef42623          	sw	a5,-20(s0)
+  release(&tickslock);
+    80204f32:	0000b517          	auipc	a0,0xb
+    80204f36:	59653503          	ld	a0,1430(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80204f3a:	ffffc097          	auipc	ra,0xffffc
+    80204f3e:	b12080e7          	jalr	-1262(ra) # 80200a4c <release>
+  return xticks;
+    80204f42:	fec46783          	lwu	a5,-20(s0)
+}
+    80204f46:	853e                	mv	a0,a5
+    80204f48:	60e2                	ld	ra,24(sp)
+    80204f4a:	6442                	ld	s0,16(sp)
+    80204f4c:	6105                	addi	sp,sp,32
+    80204f4e:	8082                	ret
+
+0000000080204f50 <sys_trace>:
+
+uint64
+sys_trace(void)
+{
+    80204f50:	1101                	addi	sp,sp,-32
+    80204f52:	ec06                	sd	ra,24(sp)
+    80204f54:	e822                	sd	s0,16(sp)
+    80204f56:	1000                	addi	s0,sp,32
+  int mask;
+  if(argint(0, &mask) < 0) {
+    80204f58:	fec40793          	addi	a5,s0,-20
+    80204f5c:	85be                	mv	a1,a5
+    80204f5e:	4501                	li	a0,0
+    80204f60:	00000097          	auipc	ra,0x0
+    80204f64:	864080e7          	jalr	-1948(ra) # 802047c4 <argint>
+    80204f68:	87aa                	mv	a5,a0
+    80204f6a:	0007d463          	bgez	a5,80204f72 <sys_trace+0x22>
+    return -1;
+    80204f6e:	57fd                	li	a5,-1
+    80204f70:	a819                	j	80204f86 <sys_trace+0x36>
+  }
+  myproc()->tmask = mask;
+    80204f72:	ffffe097          	auipc	ra,0xffffe
+    80204f76:	9f0080e7          	jalr	-1552(ra) # 80202962 <myproc>
+    80204f7a:	872a                	mv	a4,a0
+    80204f7c:	fec42783          	lw	a5,-20(s0)
+    80204f80:	18f72823          	sw	a5,400(a4)
+  return 0;
+    80204f84:	4781                	li	a5,0
+}
+    80204f86:	853e                	mv	a0,a5
+    80204f88:	60e2                	ld	ra,24(sp)
+    80204f8a:	6442                	ld	s0,16(sp)
+    80204f8c:	6105                	addi	sp,sp,32
+    80204f8e:	8082                	ret
+
+0000000080204f90 <sys_sched_yield>:
+
+uint64
+sys_sched_yield(void){
+    80204f90:	1141                	addi	sp,sp,-16
+    80204f92:	e406                	sd	ra,8(sp)
+    80204f94:	e022                	sd	s0,0(sp)
+    80204f96:	0800                	addi	s0,sp,16
+  yield();
+    80204f98:	ffffe097          	auipc	ra,0xffffe
+    80204f9c:	768080e7          	jalr	1896(ra) # 80203700 <yield>
+  return 0;
+    80204fa0:	4781                	li	a5,0
+}
+    80204fa2:	853e                	mv	a0,a5
+    80204fa4:	60a2                	ld	ra,8(sp)
+    80204fa6:	6402                	ld	s0,0(sp)
+    80204fa8:	0141                	addi	sp,sp,16
+    80204faa:	8082                	ret
+
+0000000080204fac <sys_times>:
+
+uint64
+sys_times(void)
+{
+    80204fac:	7179                	addi	sp,sp,-48
+    80204fae:	f406                	sd	ra,40(sp)
+    80204fb0:	f022                	sd	s0,32(sp)
+    80204fb2:	1800                	addi	s0,sp,48
+
+  printf("%d", a);
+
+  return 1; */
+
+  struct proc *p=myproc();   //获取当前进程信息
+    80204fb4:	ffffe097          	auipc	ra,0xffffe
+    80204fb8:	9ae080e7          	jalr	-1618(ra) # 80202962 <myproc>
+    80204fbc:	fea43423          	sd	a0,-24(s0)
+  uint64 addr_tms;           //获取结构体地址
+  int xticks;
+  if(argaddr(0, &addr_tms) < 0) {   //如果地址有问题,返回-1
+    80204fc0:	fd040793          	addi	a5,s0,-48
+    80204fc4:	85be                	mv	a1,a5
+    80204fc6:	4501                	li	a0,0
+    80204fc8:	00000097          	auipc	ra,0x0
+    80204fcc:	834080e7          	jalr	-1996(ra) # 802047fc <argaddr>
+    80204fd0:	87aa                	mv	a5,a0
+    80204fd2:	0007d463          	bgez	a5,80204fda <sys_times+0x2e>
+    return -1;
+    80204fd6:	57fd                	li	a5,-1
+    80204fd8:	a841                	j	80205068 <sys_times+0xbc>
+  }
+  struct tms *t=(struct tms*)addr_tms;  //将结构体地址强制类型转化为结构体指针
+    80204fda:	fd043783          	ld	a5,-48(s0)
+    80204fde:	fef43023          	sd	a5,-32(s0)
+ 
+  if(t!=0){                           //利用指针修改结构体的值
+    80204fe2:	fe043783          	ld	a5,-32(s0)
+    80204fe6:	cf8d                	beqz	a5,80205020 <sys_times+0x74>
+    t->tms_cstime=p->ti.tms_cstime;
+    80204fe8:	fe843783          	ld	a5,-24(s0)
+    80204fec:	1787b703          	ld	a4,376(a5)
+    80204ff0:	fe043783          	ld	a5,-32(s0)
+    80204ff4:	ef98                	sd	a4,24(a5)
+    t->tms_cutime=p->ti.tms_cutime;
+    80204ff6:	fe843783          	ld	a5,-24(s0)
+    80204ffa:	1707b703          	ld	a4,368(a5)
+    80204ffe:	fe043783          	ld	a5,-32(s0)
+    80205002:	eb98                	sd	a4,16(a5)
+    t->tms_stime=p->ti.tms_stime;
+    80205004:	fe843783          	ld	a5,-24(s0)
+    80205008:	1687b703          	ld	a4,360(a5)
+    8020500c:	fe043783          	ld	a5,-32(s0)
+    80205010:	e798                	sd	a4,8(a5)
+    t->tms_utime=p->ti.tms_utime;
+    80205012:	fe843783          	ld	a5,-24(s0)
+    80205016:	1607b703          	ld	a4,352(a5)
+    8020501a:	fe043783          	ld	a5,-32(s0)
+    8020501e:	e398                	sd	a4,0(a5)
+  }
+  //printf("ddd");
+  acquire(&tickslock);
+    80205020:	0000b517          	auipc	a0,0xb
+    80205024:	4a853503          	ld	a0,1192(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80205028:	ffffc097          	auipc	ra,0xffffc
+    8020502c:	9c0080e7          	jalr	-1600(ra) # 802009e8 <acquire>
+  xticks = ticks; //
+    80205030:	0000b797          	auipc	a5,0xb
+    80205034:	4b87b783          	ld	a5,1208(a5) # 802104e8 <_GLOBAL_OFFSET_TABLE_+0x60>
+    80205038:	439c                	lw	a5,0(a5)
+    8020503a:	fcf42e23          	sw	a5,-36(s0)
+  release(&tickslock);
+    8020503e:	0000b517          	auipc	a0,0xb
+    80205042:	48a53503          	ld	a0,1162(a0) # 802104c8 <_GLOBAL_OFFSET_TABLE_+0x40>
+    80205046:	ffffc097          	auipc	ra,0xffffc
+    8020504a:	a06080e7          	jalr	-1530(ra) # 80200a4c <release>
+  printf("%d",xticks);
+    8020504e:	fdc42783          	lw	a5,-36(s0)
+    80205052:	85be                	mv	a1,a5
+    80205054:	00009517          	auipc	a0,0x9
+    80205058:	b5c50513          	addi	a0,a0,-1188 # 8020dbb0 <etext+0xbb0>
+    8020505c:	ffffb097          	auipc	ra,0xffffb
+    80205060:	192080e7          	jalr	402(ra) # 802001ee <printf>
+  return xticks;                  //返回已经过去的滴答数
+    80205064:	fdc42783          	lw	a5,-36(s0)
+}
+    80205068:	853e                	mv	a0,a5
+    8020506a:	70a2                	ld	ra,40(sp)
+    8020506c:	7402                	ld	s0,32(sp)
+    8020506e:	6145                	addi	sp,sp,48
+    80205070:	8082                	ret
+
+0000000080205072 <binit>:
+  struct buf head;
+} bcache;
+
+void
+binit(void)
+{
+    80205072:	1101                	addi	sp,sp,-32
+    80205074:	ec06                	sd	ra,24(sp)
+    80205076:	e822                	sd	s0,16(sp)
+    80205078:	1000                	addi	s0,sp,32
+  struct buf *b;
+
+  initlock(&bcache.lock, "bcache");
+    8020507a:	00009597          	auipc	a1,0x9
+    8020507e:	b3e58593          	addi	a1,a1,-1218 # 8020dbb8 <etext+0xbb8>
+    80205082:	00019517          	auipc	a0,0x19
+    80205086:	0ae50513          	addi	a0,a0,174 # 8021e130 <bcache>
+    8020508a:	ffffc097          	auipc	ra,0xffffc
+    8020508e:	92e080e7          	jalr	-1746(ra) # 802009b8 <initlock>
+
+  // Create linked list of buffers
+  bcache.head.prev = &bcache.head;
+    80205092:	00019717          	auipc	a4,0x19
+    80205096:	09e70713          	addi	a4,a4,158 # 8021e130 <bcache>
+    8020509a:	6791                	lui	a5,0x4
+    8020509c:	97ba                	add	a5,a5,a4
+    8020509e:	0001d717          	auipc	a4,0x1d
+    802050a2:	6fa70713          	addi	a4,a4,1786 # 80222798 <bcache+0x4668>
+    802050a6:	6ae7b823          	sd	a4,1712(a5) # 46b0 <_entry-0x801fb950>
+  bcache.head.next = &bcache.head;
+    802050aa:	00019717          	auipc	a4,0x19
+    802050ae:	08670713          	addi	a4,a4,134 # 8021e130 <bcache>
+    802050b2:	6791                	lui	a5,0x4
+    802050b4:	97ba                	add	a5,a5,a4
+    802050b6:	0001d717          	auipc	a4,0x1d
+    802050ba:	6e270713          	addi	a4,a4,1762 # 80222798 <bcache+0x4668>
+    802050be:	6ae7bc23          	sd	a4,1720(a5) # 46b8 <_entry-0x801fb948>
+  for(b = bcache.buf; b < bcache.buf+NBUF; b++){
+    802050c2:	00019797          	auipc	a5,0x19
+    802050c6:	08678793          	addi	a5,a5,134 # 8021e148 <bcache+0x18>
+    802050ca:	fef43423          	sd	a5,-24(s0)
+    802050ce:	a071                	j	8020515a <binit+0xe8>
+    b->refcnt = 0;
+    802050d0:	fe843783          	ld	a5,-24(s0)
+    802050d4:	0407a023          	sw	zero,64(a5)
+    b->sectorno = ~0;
+    802050d8:	fe843783          	ld	a5,-24(s0)
+    802050dc:	577d                	li	a4,-1
+    802050de:	c7d8                	sw	a4,12(a5)
+    b->dev = ~0;
+    802050e0:	fe843783          	ld	a5,-24(s0)
+    802050e4:	577d                	li	a4,-1
+    802050e6:	c798                	sw	a4,8(a5)
+    b->next = bcache.head.next;
+    802050e8:	00019717          	auipc	a4,0x19
+    802050ec:	04870713          	addi	a4,a4,72 # 8021e130 <bcache>
+    802050f0:	6791                	lui	a5,0x4
+    802050f2:	97ba                	add	a5,a5,a4
+    802050f4:	6b87b703          	ld	a4,1720(a5) # 46b8 <_entry-0x801fb948>
+    802050f8:	fe843783          	ld	a5,-24(s0)
+    802050fc:	ebb8                	sd	a4,80(a5)
+    b->prev = &bcache.head;
+    802050fe:	fe843783          	ld	a5,-24(s0)
+    80205102:	0001d717          	auipc	a4,0x1d
+    80205106:	69670713          	addi	a4,a4,1686 # 80222798 <bcache+0x4668>
+    8020510a:	e7b8                	sd	a4,72(a5)
+    initsleeplock(&b->lock, "buffer");
+    8020510c:	fe843783          	ld	a5,-24(s0)
+    80205110:	07c1                	addi	a5,a5,16
+    80205112:	00009597          	auipc	a1,0x9
+    80205116:	aae58593          	addi	a1,a1,-1362 # 8020dbc0 <etext+0xbc0>
+    8020511a:	853e                	mv	a0,a5
+    8020511c:	00000097          	auipc	ra,0x0
+    80205120:	3ce080e7          	jalr	974(ra) # 802054ea <initsleeplock>
+    bcache.head.next->prev = b;
+    80205124:	00019717          	auipc	a4,0x19
+    80205128:	00c70713          	addi	a4,a4,12 # 8021e130 <bcache>
+    8020512c:	6791                	lui	a5,0x4
+    8020512e:	97ba                	add	a5,a5,a4
+    80205130:	6b87b783          	ld	a5,1720(a5) # 46b8 <_entry-0x801fb948>
+    80205134:	fe843703          	ld	a4,-24(s0)
+    80205138:	e7b8                	sd	a4,72(a5)
+    bcache.head.next = b;
+    8020513a:	00019717          	auipc	a4,0x19
+    8020513e:	ff670713          	addi	a4,a4,-10 # 8021e130 <bcache>
+    80205142:	6791                	lui	a5,0x4
+    80205144:	97ba                	add	a5,a5,a4
+    80205146:	fe843703          	ld	a4,-24(s0)
+    8020514a:	6ae7bc23          	sd	a4,1720(a5) # 46b8 <_entry-0x801fb948>
+  for(b = bcache.buf; b < bcache.buf+NBUF; b++){
+    8020514e:	fe843783          	ld	a5,-24(s0)
+    80205152:	25878793          	addi	a5,a5,600
+    80205156:	fef43423          	sd	a5,-24(s0)
+    8020515a:	0001d797          	auipc	a5,0x1d
+    8020515e:	63e78793          	addi	a5,a5,1598 # 80222798 <bcache+0x4668>
+    80205162:	fe843703          	ld	a4,-24(s0)
+    80205166:	f6f765e3          	bltu	a4,a5,802050d0 <binit+0x5e>
+  }
+  #ifdef DEBUG
+  printf("binit\n");
+    8020516a:	00009517          	auipc	a0,0x9
+    8020516e:	a5e50513          	addi	a0,a0,-1442 # 8020dbc8 <etext+0xbc8>
+    80205172:	ffffb097          	auipc	ra,0xffffb
+    80205176:	07c080e7          	jalr	124(ra) # 802001ee <printf>
+  #endif
+}
+    8020517a:	0001                	nop
+    8020517c:	60e2                	ld	ra,24(sp)
+    8020517e:	6442                	ld	s0,16(sp)
+    80205180:	6105                	addi	sp,sp,32
+    80205182:	8082                	ret
+
+0000000080205184 <bget>:
+// Look through buffer cache for block on device dev.
+// If not found, allocate a buffer.
+// In either case, return locked buffer.
+static struct buf*
+bget(uint dev, uint sectorno)
+{
+    80205184:	7179                	addi	sp,sp,-48
+    80205186:	f406                	sd	ra,40(sp)
+    80205188:	f022                	sd	s0,32(sp)
+    8020518a:	1800                	addi	s0,sp,48
+    8020518c:	87aa                	mv	a5,a0
+    8020518e:	872e                	mv	a4,a1
+    80205190:	fcf42e23          	sw	a5,-36(s0)
+    80205194:	87ba                	mv	a5,a4
+    80205196:	fcf42c23          	sw	a5,-40(s0)
+  struct buf *b;
+
+  acquire(&bcache.lock);
+    8020519a:	00019517          	auipc	a0,0x19
+    8020519e:	f9650513          	addi	a0,a0,-106 # 8021e130 <bcache>
+    802051a2:	ffffc097          	auipc	ra,0xffffc
+    802051a6:	846080e7          	jalr	-1978(ra) # 802009e8 <acquire>
+
+  // Is the block already cached?
+  for(b = bcache.head.next; b != &bcache.head; b = b->next){
+    802051aa:	00019717          	auipc	a4,0x19
+    802051ae:	f8670713          	addi	a4,a4,-122 # 8021e130 <bcache>
+    802051b2:	6791                	lui	a5,0x4
+    802051b4:	97ba                	add	a5,a5,a4
+    802051b6:	6b87b783          	ld	a5,1720(a5) # 46b8 <_entry-0x801fb948>
+    802051ba:	fef43423          	sd	a5,-24(s0)
+    802051be:	a095                	j	80205222 <bget+0x9e>
+    if(b->dev == dev && b->sectorno == sectorno){
+    802051c0:	fe843783          	ld	a5,-24(s0)
+    802051c4:	4798                	lw	a4,8(a5)
+    802051c6:	fdc42783          	lw	a5,-36(s0)
+    802051ca:	2781                	sext.w	a5,a5
+    802051cc:	04e79663          	bne	a5,a4,80205218 <bget+0x94>
+    802051d0:	fe843783          	ld	a5,-24(s0)
+    802051d4:	47d8                	lw	a4,12(a5)
+    802051d6:	fd842783          	lw	a5,-40(s0)
+    802051da:	2781                	sext.w	a5,a5
+    802051dc:	02e79e63          	bne	a5,a4,80205218 <bget+0x94>
+      b->refcnt++;
+    802051e0:	fe843783          	ld	a5,-24(s0)
+    802051e4:	43bc                	lw	a5,64(a5)
+    802051e6:	2785                	addiw	a5,a5,1
+    802051e8:	0007871b          	sext.w	a4,a5
+    802051ec:	fe843783          	ld	a5,-24(s0)
+    802051f0:	c3b8                	sw	a4,64(a5)
+      release(&bcache.lock);
+    802051f2:	00019517          	auipc	a0,0x19
+    802051f6:	f3e50513          	addi	a0,a0,-194 # 8021e130 <bcache>
+    802051fa:	ffffc097          	auipc	ra,0xffffc
+    802051fe:	852080e7          	jalr	-1966(ra) # 80200a4c <release>
+      acquiresleep(&b->lock);
+    80205202:	fe843783          	ld	a5,-24(s0)
+    80205206:	07c1                	addi	a5,a5,16
+    80205208:	853e                	mv	a0,a5
+    8020520a:	00000097          	auipc	ra,0x0
+    8020520e:	32c080e7          	jalr	812(ra) # 80205536 <acquiresleep>
+      return b;
+    80205212:	fe843783          	ld	a5,-24(s0)
+    80205216:	a07d                	j	802052c4 <bget+0x140>
+  for(b = bcache.head.next; b != &bcache.head; b = b->next){
+    80205218:	fe843783          	ld	a5,-24(s0)
+    8020521c:	6bbc                	ld	a5,80(a5)
+    8020521e:	fef43423          	sd	a5,-24(s0)
+    80205222:	fe843703          	ld	a4,-24(s0)
+    80205226:	0001d797          	auipc	a5,0x1d
+    8020522a:	57278793          	addi	a5,a5,1394 # 80222798 <bcache+0x4668>
+    8020522e:	f8f719e3          	bne	a4,a5,802051c0 <bget+0x3c>
+    }
+  }
+
+  // Not cached.
+  // Recycle the least recently used (LRU) unused buffer.
+  for(b = bcache.head.prev; b != &bcache.head; b = b->prev){
+    80205232:	00019717          	auipc	a4,0x19
+    80205236:	efe70713          	addi	a4,a4,-258 # 8021e130 <bcache>
+    8020523a:	6791                	lui	a5,0x4
+    8020523c:	97ba                	add	a5,a5,a4
+    8020523e:	6b07b783          	ld	a5,1712(a5) # 46b0 <_entry-0x801fb950>
+    80205242:	fef43423          	sd	a5,-24(s0)
+    80205246:	a8b9                	j	802052a4 <bget+0x120>
+    if(b->refcnt == 0) {
+    80205248:	fe843783          	ld	a5,-24(s0)
+    8020524c:	43bc                	lw	a5,64(a5)
+    8020524e:	e7b1                	bnez	a5,8020529a <bget+0x116>
+      b->dev = dev;
+    80205250:	fe843783          	ld	a5,-24(s0)
+    80205254:	fdc42703          	lw	a4,-36(s0)
+    80205258:	c798                	sw	a4,8(a5)
+      b->sectorno = sectorno;
+    8020525a:	fe843783          	ld	a5,-24(s0)
+    8020525e:	fd842703          	lw	a4,-40(s0)
+    80205262:	c7d8                	sw	a4,12(a5)
+      b->valid = 0;
+    80205264:	fe843783          	ld	a5,-24(s0)
+    80205268:	0007a023          	sw	zero,0(a5)
+      b->refcnt = 1;
+    8020526c:	fe843783          	ld	a5,-24(s0)
+    80205270:	4705                	li	a4,1
+    80205272:	c3b8                	sw	a4,64(a5)
+      release(&bcache.lock);
+    80205274:	00019517          	auipc	a0,0x19
+    80205278:	ebc50513          	addi	a0,a0,-324 # 8021e130 <bcache>
+    8020527c:	ffffb097          	auipc	ra,0xffffb
+    80205280:	7d0080e7          	jalr	2000(ra) # 80200a4c <release>
+      acquiresleep(&b->lock);
+    80205284:	fe843783          	ld	a5,-24(s0)
+    80205288:	07c1                	addi	a5,a5,16
+    8020528a:	853e                	mv	a0,a5
+    8020528c:	00000097          	auipc	ra,0x0
+    80205290:	2aa080e7          	jalr	682(ra) # 80205536 <acquiresleep>
+      return b;
+    80205294:	fe843783          	ld	a5,-24(s0)
+    80205298:	a035                	j	802052c4 <bget+0x140>
+  for(b = bcache.head.prev; b != &bcache.head; b = b->prev){
+    8020529a:	fe843783          	ld	a5,-24(s0)
+    8020529e:	67bc                	ld	a5,72(a5)
+    802052a0:	fef43423          	sd	a5,-24(s0)
+    802052a4:	fe843703          	ld	a4,-24(s0)
+    802052a8:	0001d797          	auipc	a5,0x1d
+    802052ac:	4f078793          	addi	a5,a5,1264 # 80222798 <bcache+0x4668>
+    802052b0:	f8f71ce3          	bne	a4,a5,80205248 <bget+0xc4>
+    }
+  }
+  panic("bget: no buffers");
+    802052b4:	00009517          	auipc	a0,0x9
+    802052b8:	91c50513          	addi	a0,a0,-1764 # 8020dbd0 <etext+0xbd0>
+    802052bc:	ffffb097          	auipc	ra,0xffffb
+    802052c0:	188080e7          	jalr	392(ra) # 80200444 <panic>
+}
+    802052c4:	853e                	mv	a0,a5
+    802052c6:	70a2                	ld	ra,40(sp)
+    802052c8:	7402                	ld	s0,32(sp)
+    802052ca:	6145                	addi	sp,sp,48
+    802052cc:	8082                	ret
+
+00000000802052ce <bread>:
+
+// Return a locked buf with the contents of the indicated block.
+struct buf* 
+bread(uint dev, uint sectorno) {
+    802052ce:	7179                	addi	sp,sp,-48
+    802052d0:	f406                	sd	ra,40(sp)
+    802052d2:	f022                	sd	s0,32(sp)
+    802052d4:	1800                	addi	s0,sp,48
+    802052d6:	87aa                	mv	a5,a0
+    802052d8:	872e                	mv	a4,a1
+    802052da:	fcf42e23          	sw	a5,-36(s0)
+    802052de:	87ba                	mv	a5,a4
+    802052e0:	fcf42c23          	sw	a5,-40(s0)
+  struct buf *b;
+
+  b = bget(dev, sectorno);
+    802052e4:	fd842703          	lw	a4,-40(s0)
+    802052e8:	fdc42783          	lw	a5,-36(s0)
+    802052ec:	85ba                	mv	a1,a4
+    802052ee:	853e                	mv	a0,a5
+    802052f0:	00000097          	auipc	ra,0x0
+    802052f4:	e94080e7          	jalr	-364(ra) # 80205184 <bget>
+    802052f8:	fea43423          	sd	a0,-24(s0)
+  if (!b->valid) {
+    802052fc:	fe843783          	ld	a5,-24(s0)
+    80205300:	439c                	lw	a5,0(a5)
+    80205302:	eb99                	bnez	a5,80205318 <bread+0x4a>
+    disk_read(b);
+    80205304:	fe843503          	ld	a0,-24(s0)
+    80205308:	00003097          	auipc	ra,0x3
+    8020530c:	aae080e7          	jalr	-1362(ra) # 80207db6 <disk_read>
+    b->valid = 1;
+    80205310:	fe843783          	ld	a5,-24(s0)
+    80205314:	4705                	li	a4,1
+    80205316:	c398                	sw	a4,0(a5)
+  }
+
+  return b;
+    80205318:	fe843783          	ld	a5,-24(s0)
+}
+    8020531c:	853e                	mv	a0,a5
+    8020531e:	70a2                	ld	ra,40(sp)
+    80205320:	7402                	ld	s0,32(sp)
+    80205322:	6145                	addi	sp,sp,48
+    80205324:	8082                	ret
+
+0000000080205326 <bwrite>:
+
+// Write b's contents to disk.  Must be locked.
+void 
+bwrite(struct buf *b) {
+    80205326:	1101                	addi	sp,sp,-32
+    80205328:	ec06                	sd	ra,24(sp)
+    8020532a:	e822                	sd	s0,16(sp)
+    8020532c:	1000                	addi	s0,sp,32
+    8020532e:	fea43423          	sd	a0,-24(s0)
+  if(!holdingsleep(&b->lock))
+    80205332:	fe843783          	ld	a5,-24(s0)
+    80205336:	07c1                	addi	a5,a5,16
+    80205338:	853e                	mv	a0,a5
+    8020533a:	00000097          	auipc	ra,0x0
+    8020533e:	2bc080e7          	jalr	700(ra) # 802055f6 <holdingsleep>
+    80205342:	87aa                	mv	a5,a0
+    80205344:	eb89                	bnez	a5,80205356 <bwrite+0x30>
+    panic("bwrite");
+    80205346:	00009517          	auipc	a0,0x9
+    8020534a:	8a250513          	addi	a0,a0,-1886 # 8020dbe8 <etext+0xbe8>
+    8020534e:	ffffb097          	auipc	ra,0xffffb
+    80205352:	0f6080e7          	jalr	246(ra) # 80200444 <panic>
+  disk_write(b);
+    80205356:	fe843503          	ld	a0,-24(s0)
+    8020535a:	00003097          	auipc	ra,0x3
+    8020535e:	a80080e7          	jalr	-1408(ra) # 80207dda <disk_write>
+}
+    80205362:	0001                	nop
+    80205364:	60e2                	ld	ra,24(sp)
+    80205366:	6442                	ld	s0,16(sp)
+    80205368:	6105                	addi	sp,sp,32
+    8020536a:	8082                	ret
+
+000000008020536c <brelse>:
+
+// Release a locked buffer.
+// Move to the head of the most-recently-used list.
+void
+brelse(struct buf *b)
+{
+    8020536c:	1101                	addi	sp,sp,-32
+    8020536e:	ec06                	sd	ra,24(sp)
+    80205370:	e822                	sd	s0,16(sp)
+    80205372:	1000                	addi	s0,sp,32
+    80205374:	fea43423          	sd	a0,-24(s0)
+  if(!holdingsleep(&b->lock))
+    80205378:	fe843783          	ld	a5,-24(s0)
+    8020537c:	07c1                	addi	a5,a5,16
+    8020537e:	853e                	mv	a0,a5
+    80205380:	00000097          	auipc	ra,0x0
+    80205384:	276080e7          	jalr	630(ra) # 802055f6 <holdingsleep>
+    80205388:	87aa                	mv	a5,a0
+    8020538a:	eb89                	bnez	a5,8020539c <brelse+0x30>
+    panic("brelse");
+    8020538c:	00009517          	auipc	a0,0x9
+    80205390:	86450513          	addi	a0,a0,-1948 # 8020dbf0 <etext+0xbf0>
+    80205394:	ffffb097          	auipc	ra,0xffffb
+    80205398:	0b0080e7          	jalr	176(ra) # 80200444 <panic>
+
+  releasesleep(&b->lock);
+    8020539c:	fe843783          	ld	a5,-24(s0)
+    802053a0:	07c1                	addi	a5,a5,16
+    802053a2:	853e                	mv	a0,a5
+    802053a4:	00000097          	auipc	ra,0x0
+    802053a8:	200080e7          	jalr	512(ra) # 802055a4 <releasesleep>
+
+  acquire(&bcache.lock);
+    802053ac:	00019517          	auipc	a0,0x19
+    802053b0:	d8450513          	addi	a0,a0,-636 # 8021e130 <bcache>
+    802053b4:	ffffb097          	auipc	ra,0xffffb
+    802053b8:	634080e7          	jalr	1588(ra) # 802009e8 <acquire>
+  b->refcnt--;
+    802053bc:	fe843783          	ld	a5,-24(s0)
+    802053c0:	43bc                	lw	a5,64(a5)
+    802053c2:	37fd                	addiw	a5,a5,-1
+    802053c4:	0007871b          	sext.w	a4,a5
+    802053c8:	fe843783          	ld	a5,-24(s0)
+    802053cc:	c3b8                	sw	a4,64(a5)
+  if (b->refcnt == 0) {
+    802053ce:	fe843783          	ld	a5,-24(s0)
+    802053d2:	43bc                	lw	a5,64(a5)
+    802053d4:	e7b5                	bnez	a5,80205440 <brelse+0xd4>
+    // no one is waiting for it.
+    b->next->prev = b->prev;
+    802053d6:	fe843783          	ld	a5,-24(s0)
+    802053da:	6bbc                	ld	a5,80(a5)
+    802053dc:	fe843703          	ld	a4,-24(s0)
+    802053e0:	6738                	ld	a4,72(a4)
+    802053e2:	e7b8                	sd	a4,72(a5)
+    b->prev->next = b->next;
+    802053e4:	fe843783          	ld	a5,-24(s0)
+    802053e8:	67bc                	ld	a5,72(a5)
+    802053ea:	fe843703          	ld	a4,-24(s0)
+    802053ee:	6b38                	ld	a4,80(a4)
+    802053f0:	ebb8                	sd	a4,80(a5)
+    b->next = bcache.head.next;
+    802053f2:	00019717          	auipc	a4,0x19
+    802053f6:	d3e70713          	addi	a4,a4,-706 # 8021e130 <bcache>
+    802053fa:	6791                	lui	a5,0x4
+    802053fc:	97ba                	add	a5,a5,a4
+    802053fe:	6b87b703          	ld	a4,1720(a5) # 46b8 <_entry-0x801fb948>
+    80205402:	fe843783          	ld	a5,-24(s0)
+    80205406:	ebb8                	sd	a4,80(a5)
+    b->prev = &bcache.head;
+    80205408:	fe843783          	ld	a5,-24(s0)
+    8020540c:	0001d717          	auipc	a4,0x1d
+    80205410:	38c70713          	addi	a4,a4,908 # 80222798 <bcache+0x4668>
+    80205414:	e7b8                	sd	a4,72(a5)
+    bcache.head.next->prev = b;
+    80205416:	00019717          	auipc	a4,0x19
+    8020541a:	d1a70713          	addi	a4,a4,-742 # 8021e130 <bcache>
+    8020541e:	6791                	lui	a5,0x4
+    80205420:	97ba                	add	a5,a5,a4
+    80205422:	6b87b783          	ld	a5,1720(a5) # 46b8 <_entry-0x801fb948>
+    80205426:	fe843703          	ld	a4,-24(s0)
+    8020542a:	e7b8                	sd	a4,72(a5)
+    bcache.head.next = b;
+    8020542c:	00019717          	auipc	a4,0x19
+    80205430:	d0470713          	addi	a4,a4,-764 # 8021e130 <bcache>
+    80205434:	6791                	lui	a5,0x4
+    80205436:	97ba                	add	a5,a5,a4
+    80205438:	fe843703          	ld	a4,-24(s0)
+    8020543c:	6ae7bc23          	sd	a4,1720(a5) # 46b8 <_entry-0x801fb948>
+  }
+  
+  release(&bcache.lock);
+    80205440:	00019517          	auipc	a0,0x19
+    80205444:	cf050513          	addi	a0,a0,-784 # 8021e130 <bcache>
+    80205448:	ffffb097          	auipc	ra,0xffffb
+    8020544c:	604080e7          	jalr	1540(ra) # 80200a4c <release>
+}
+    80205450:	0001                	nop
+    80205452:	60e2                	ld	ra,24(sp)
+    80205454:	6442                	ld	s0,16(sp)
+    80205456:	6105                	addi	sp,sp,32
+    80205458:	8082                	ret
+
+000000008020545a <bpin>:
+
+void
+bpin(struct buf *b) {
+    8020545a:	1101                	addi	sp,sp,-32
+    8020545c:	ec06                	sd	ra,24(sp)
+    8020545e:	e822                	sd	s0,16(sp)
+    80205460:	1000                	addi	s0,sp,32
+    80205462:	fea43423          	sd	a0,-24(s0)
+  acquire(&bcache.lock);
+    80205466:	00019517          	auipc	a0,0x19
+    8020546a:	cca50513          	addi	a0,a0,-822 # 8021e130 <bcache>
+    8020546e:	ffffb097          	auipc	ra,0xffffb
+    80205472:	57a080e7          	jalr	1402(ra) # 802009e8 <acquire>
+  b->refcnt++;
+    80205476:	fe843783          	ld	a5,-24(s0)
+    8020547a:	43bc                	lw	a5,64(a5)
+    8020547c:	2785                	addiw	a5,a5,1
+    8020547e:	0007871b          	sext.w	a4,a5
+    80205482:	fe843783          	ld	a5,-24(s0)
+    80205486:	c3b8                	sw	a4,64(a5)
+  release(&bcache.lock);
+    80205488:	00019517          	auipc	a0,0x19
+    8020548c:	ca850513          	addi	a0,a0,-856 # 8021e130 <bcache>
+    80205490:	ffffb097          	auipc	ra,0xffffb
+    80205494:	5bc080e7          	jalr	1468(ra) # 80200a4c <release>
+}
+    80205498:	0001                	nop
+    8020549a:	60e2                	ld	ra,24(sp)
+    8020549c:	6442                	ld	s0,16(sp)
+    8020549e:	6105                	addi	sp,sp,32
+    802054a0:	8082                	ret
+
+00000000802054a2 <bunpin>:
+
+void
+bunpin(struct buf *b) {
+    802054a2:	1101                	addi	sp,sp,-32
+    802054a4:	ec06                	sd	ra,24(sp)
+    802054a6:	e822                	sd	s0,16(sp)
+    802054a8:	1000                	addi	s0,sp,32
+    802054aa:	fea43423          	sd	a0,-24(s0)
+  acquire(&bcache.lock);
+    802054ae:	00019517          	auipc	a0,0x19
+    802054b2:	c8250513          	addi	a0,a0,-894 # 8021e130 <bcache>
+    802054b6:	ffffb097          	auipc	ra,0xffffb
+    802054ba:	532080e7          	jalr	1330(ra) # 802009e8 <acquire>
+  b->refcnt--;
+    802054be:	fe843783          	ld	a5,-24(s0)
+    802054c2:	43bc                	lw	a5,64(a5)
+    802054c4:	37fd                	addiw	a5,a5,-1
+    802054c6:	0007871b          	sext.w	a4,a5
+    802054ca:	fe843783          	ld	a5,-24(s0)
+    802054ce:	c3b8                	sw	a4,64(a5)
+  release(&bcache.lock);
+    802054d0:	00019517          	auipc	a0,0x19
+    802054d4:	c6050513          	addi	a0,a0,-928 # 8021e130 <bcache>
+    802054d8:	ffffb097          	auipc	ra,0xffffb
+    802054dc:	574080e7          	jalr	1396(ra) # 80200a4c <release>
+}
+    802054e0:	0001                	nop
+    802054e2:	60e2                	ld	ra,24(sp)
+    802054e4:	6442                	ld	s0,16(sp)
+    802054e6:	6105                	addi	sp,sp,32
+    802054e8:	8082                	ret
+
+00000000802054ea <initsleeplock>:
+#include "include/proc.h"
+#include "include/sleeplock.h"
+
+void
+initsleeplock(struct sleeplock *lk, char *name)
+{
+    802054ea:	1101                	addi	sp,sp,-32
+    802054ec:	ec06                	sd	ra,24(sp)
+    802054ee:	e822                	sd	s0,16(sp)
+    802054f0:	1000                	addi	s0,sp,32
+    802054f2:	fea43423          	sd	a0,-24(s0)
+    802054f6:	feb43023          	sd	a1,-32(s0)
+  initlock(&lk->lk, "sleep lock");
+    802054fa:	fe843783          	ld	a5,-24(s0)
+    802054fe:	07a1                	addi	a5,a5,8
+    80205500:	00008597          	auipc	a1,0x8
+    80205504:	6f858593          	addi	a1,a1,1784 # 8020dbf8 <etext+0xbf8>
+    80205508:	853e                	mv	a0,a5
+    8020550a:	ffffb097          	auipc	ra,0xffffb
+    8020550e:	4ae080e7          	jalr	1198(ra) # 802009b8 <initlock>
+  lk->name = name;
+    80205512:	fe843783          	ld	a5,-24(s0)
+    80205516:	fe043703          	ld	a4,-32(s0)
+    8020551a:	f398                	sd	a4,32(a5)
+  lk->locked = 0;
+    8020551c:	fe843783          	ld	a5,-24(s0)
+    80205520:	0007a023          	sw	zero,0(a5)
+  lk->pid = 0;
+    80205524:	fe843783          	ld	a5,-24(s0)
+    80205528:	0207a423          	sw	zero,40(a5)
+}
+    8020552c:	0001                	nop
+    8020552e:	60e2                	ld	ra,24(sp)
+    80205530:	6442                	ld	s0,16(sp)
+    80205532:	6105                	addi	sp,sp,32
+    80205534:	8082                	ret
+
+0000000080205536 <acquiresleep>:
+
+void
+acquiresleep(struct sleeplock *lk)
+{
+    80205536:	1101                	addi	sp,sp,-32
+    80205538:	ec06                	sd	ra,24(sp)
+    8020553a:	e822                	sd	s0,16(sp)
+    8020553c:	1000                	addi	s0,sp,32
+    8020553e:	fea43423          	sd	a0,-24(s0)
+  acquire(&lk->lk);
+    80205542:	fe843783          	ld	a5,-24(s0)
+    80205546:	07a1                	addi	a5,a5,8
+    80205548:	853e                	mv	a0,a5
+    8020554a:	ffffb097          	auipc	ra,0xffffb
+    8020554e:	49e080e7          	jalr	1182(ra) # 802009e8 <acquire>
+  while (lk->locked) {
+    80205552:	a819                	j	80205568 <acquiresleep+0x32>
+    sleep(lk, &lk->lk);
+    80205554:	fe843783          	ld	a5,-24(s0)
+    80205558:	07a1                	addi	a5,a5,8
+    8020555a:	85be                	mv	a1,a5
+    8020555c:	fe843503          	ld	a0,-24(s0)
+    80205560:	ffffe097          	auipc	ra,0xffffe
+    80205564:	25c080e7          	jalr	604(ra) # 802037bc <sleep>
+  while (lk->locked) {
+    80205568:	fe843783          	ld	a5,-24(s0)
+    8020556c:	439c                	lw	a5,0(a5)
+    8020556e:	f3fd                	bnez	a5,80205554 <acquiresleep+0x1e>
+  }
+  lk->locked = 1;
+    80205570:	fe843783          	ld	a5,-24(s0)
+    80205574:	4705                	li	a4,1
+    80205576:	c398                	sw	a4,0(a5)
+  lk->pid = myproc()->pid;
+    80205578:	ffffd097          	auipc	ra,0xffffd
+    8020557c:	3ea080e7          	jalr	1002(ra) # 80202962 <myproc>
+    80205580:	87aa                	mv	a5,a0
+    80205582:	5f98                	lw	a4,56(a5)
+    80205584:	fe843783          	ld	a5,-24(s0)
+    80205588:	d798                	sw	a4,40(a5)
+  release(&lk->lk);
+    8020558a:	fe843783          	ld	a5,-24(s0)
+    8020558e:	07a1                	addi	a5,a5,8
+    80205590:	853e                	mv	a0,a5
+    80205592:	ffffb097          	auipc	ra,0xffffb
+    80205596:	4ba080e7          	jalr	1210(ra) # 80200a4c <release>
+}
+    8020559a:	0001                	nop
+    8020559c:	60e2                	ld	ra,24(sp)
+    8020559e:	6442                	ld	s0,16(sp)
+    802055a0:	6105                	addi	sp,sp,32
+    802055a2:	8082                	ret
+
+00000000802055a4 <releasesleep>:
+
+void
+releasesleep(struct sleeplock *lk)
+{
+    802055a4:	1101                	addi	sp,sp,-32
+    802055a6:	ec06                	sd	ra,24(sp)
+    802055a8:	e822                	sd	s0,16(sp)
+    802055aa:	1000                	addi	s0,sp,32
+    802055ac:	fea43423          	sd	a0,-24(s0)
+  acquire(&lk->lk);
+    802055b0:	fe843783          	ld	a5,-24(s0)
+    802055b4:	07a1                	addi	a5,a5,8
+    802055b6:	853e                	mv	a0,a5
+    802055b8:	ffffb097          	auipc	ra,0xffffb
+    802055bc:	430080e7          	jalr	1072(ra) # 802009e8 <acquire>
+  lk->locked = 0;
+    802055c0:	fe843783          	ld	a5,-24(s0)
+    802055c4:	0007a023          	sw	zero,0(a5)
+  lk->pid = 0;
+    802055c8:	fe843783          	ld	a5,-24(s0)
+    802055cc:	0207a423          	sw	zero,40(a5)
+  wakeup(lk);
+    802055d0:	fe843503          	ld	a0,-24(s0)
+    802055d4:	ffffe097          	auipc	ra,0xffffe
+    802055d8:	27c080e7          	jalr	636(ra) # 80203850 <wakeup>
+  release(&lk->lk);
+    802055dc:	fe843783          	ld	a5,-24(s0)
+    802055e0:	07a1                	addi	a5,a5,8
+    802055e2:	853e                	mv	a0,a5
+    802055e4:	ffffb097          	auipc	ra,0xffffb
+    802055e8:	468080e7          	jalr	1128(ra) # 80200a4c <release>
+}
+    802055ec:	0001                	nop
+    802055ee:	60e2                	ld	ra,24(sp)
+    802055f0:	6442                	ld	s0,16(sp)
+    802055f2:	6105                	addi	sp,sp,32
+    802055f4:	8082                	ret
+
+00000000802055f6 <holdingsleep>:
+
+int
+holdingsleep(struct sleeplock *lk)
+{
+    802055f6:	7139                	addi	sp,sp,-64
+    802055f8:	fc06                	sd	ra,56(sp)
+    802055fa:	f822                	sd	s0,48(sp)
+    802055fc:	f426                	sd	s1,40(sp)
+    802055fe:	0080                	addi	s0,sp,64
+    80205600:	fca43423          	sd	a0,-56(s0)
+  int r;
+  
+  acquire(&lk->lk);
+    80205604:	fc843783          	ld	a5,-56(s0)
+    80205608:	07a1                	addi	a5,a5,8
+    8020560a:	853e                	mv	a0,a5
+    8020560c:	ffffb097          	auipc	ra,0xffffb
+    80205610:	3dc080e7          	jalr	988(ra) # 802009e8 <acquire>
+  r = lk->locked && (lk->pid == myproc()->pid);
+    80205614:	fc843783          	ld	a5,-56(s0)
+    80205618:	439c                	lw	a5,0(a5)
+    8020561a:	cf99                	beqz	a5,80205638 <holdingsleep+0x42>
+    8020561c:	fc843783          	ld	a5,-56(s0)
+    80205620:	5784                	lw	s1,40(a5)
+    80205622:	ffffd097          	auipc	ra,0xffffd
+    80205626:	340080e7          	jalr	832(ra) # 80202962 <myproc>
+    8020562a:	87aa                	mv	a5,a0
+    8020562c:	5f9c                	lw	a5,56(a5)
+    8020562e:	8726                	mv	a4,s1
+    80205630:	00f71463          	bne	a4,a5,80205638 <holdingsleep+0x42>
+    80205634:	4785                	li	a5,1
+    80205636:	a011                	j	8020563a <holdingsleep+0x44>
+    80205638:	4781                	li	a5,0
+    8020563a:	fcf42e23          	sw	a5,-36(s0)
+  release(&lk->lk);
+    8020563e:	fc843783          	ld	a5,-56(s0)
+    80205642:	07a1                	addi	a5,a5,8
+    80205644:	853e                	mv	a0,a5
+    80205646:	ffffb097          	auipc	ra,0xffffb
+    8020564a:	406080e7          	jalr	1030(ra) # 80200a4c <release>
+  return r;
+    8020564e:	fdc42783          	lw	a5,-36(s0)
+}
+    80205652:	853e                	mv	a0,a5
+    80205654:	70e2                	ld	ra,56(sp)
+    80205656:	7442                	ld	s0,48(sp)
+    80205658:	74a2                	ld	s1,40(sp)
+    8020565a:	6121                	addi	sp,sp,64
+    8020565c:	8082                	ret
+
+000000008020565e <fileinit>:
+  struct file file[NFILE];
+} ftable;
+
+void
+fileinit(void)
+{
+    8020565e:	1101                	addi	sp,sp,-32
+    80205660:	ec06                	sd	ra,24(sp)
+    80205662:	e822                	sd	s0,16(sp)
+    80205664:	1000                	addi	s0,sp,32
+  initlock(&ftable.lock, "ftable");
+    80205666:	00008597          	auipc	a1,0x8
+    8020566a:	5a258593          	addi	a1,a1,1442 # 8020dc08 <etext+0xc08>
+    8020566e:	0001d517          	auipc	a0,0x1d
+    80205672:	42250513          	addi	a0,a0,1058 # 80222a90 <ftable>
+    80205676:	ffffb097          	auipc	ra,0xffffb
+    8020567a:	342080e7          	jalr	834(ra) # 802009b8 <initlock>
+  struct file *f;
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    8020567e:	0001d797          	auipc	a5,0x1d
+    80205682:	42a78793          	addi	a5,a5,1066 # 80222aa8 <ftable+0x18>
+    80205686:	fef43423          	sd	a5,-24(s0)
+    8020568a:	a005                	j	802056aa <fileinit+0x4c>
+    memset(f, 0, sizeof(struct file));
+    8020568c:	02800613          	li	a2,40
+    80205690:	4581                	li	a1,0
+    80205692:	fe843503          	ld	a0,-24(s0)
+    80205696:	ffffb097          	auipc	ra,0xffffb
+    8020569a:	450080e7          	jalr	1104(ra) # 80200ae6 <memset>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    8020569e:	fe843783          	ld	a5,-24(s0)
+    802056a2:	02878793          	addi	a5,a5,40
+    802056a6:	fef43423          	sd	a5,-24(s0)
+    802056aa:	0001e797          	auipc	a5,0x1e
+    802056ae:	39e78793          	addi	a5,a5,926 # 80223a48 <tickslock>
+    802056b2:	fe843703          	ld	a4,-24(s0)
+    802056b6:	fcf76be3          	bltu	a4,a5,8020568c <fileinit+0x2e>
+  }
+  #ifdef DEBUG
+  printf("fileinit\n");
+    802056ba:	00008517          	auipc	a0,0x8
+    802056be:	55650513          	addi	a0,a0,1366 # 8020dc10 <etext+0xc10>
+    802056c2:	ffffb097          	auipc	ra,0xffffb
+    802056c6:	b2c080e7          	jalr	-1236(ra) # 802001ee <printf>
+  #endif
+}
+    802056ca:	0001                	nop
+    802056cc:	60e2                	ld	ra,24(sp)
+    802056ce:	6442                	ld	s0,16(sp)
+    802056d0:	6105                	addi	sp,sp,32
+    802056d2:	8082                	ret
+
+00000000802056d4 <filealloc>:
+
+// Allocate a file structure.
+struct file*
+filealloc(void)
+{
+    802056d4:	1101                	addi	sp,sp,-32
+    802056d6:	ec06                	sd	ra,24(sp)
+    802056d8:	e822                	sd	s0,16(sp)
+    802056da:	1000                	addi	s0,sp,32
+  struct file *f;
+
+  acquire(&ftable.lock);
+    802056dc:	0001d517          	auipc	a0,0x1d
+    802056e0:	3b450513          	addi	a0,a0,948 # 80222a90 <ftable>
+    802056e4:	ffffb097          	auipc	ra,0xffffb
+    802056e8:	304080e7          	jalr	772(ra) # 802009e8 <acquire>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    802056ec:	0001d797          	auipc	a5,0x1d
+    802056f0:	3bc78793          	addi	a5,a5,956 # 80222aa8 <ftable+0x18>
+    802056f4:	fef43423          	sd	a5,-24(s0)
+    802056f8:	a815                	j	8020572c <filealloc+0x58>
+    if(f->ref == 0){
+    802056fa:	fe843783          	ld	a5,-24(s0)
+    802056fe:	43dc                	lw	a5,4(a5)
+    80205700:	e385                	bnez	a5,80205720 <filealloc+0x4c>
+      f->ref = 1;
+    80205702:	fe843783          	ld	a5,-24(s0)
+    80205706:	4705                	li	a4,1
+    80205708:	c3d8                	sw	a4,4(a5)
+      release(&ftable.lock);
+    8020570a:	0001d517          	auipc	a0,0x1d
+    8020570e:	38650513          	addi	a0,a0,902 # 80222a90 <ftable>
+    80205712:	ffffb097          	auipc	ra,0xffffb
+    80205716:	33a080e7          	jalr	826(ra) # 80200a4c <release>
+      return f;
+    8020571a:	fe843783          	ld	a5,-24(s0)
+    8020571e:	a805                	j	8020574e <filealloc+0x7a>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    80205720:	fe843783          	ld	a5,-24(s0)
+    80205724:	02878793          	addi	a5,a5,40
+    80205728:	fef43423          	sd	a5,-24(s0)
+    8020572c:	0001e797          	auipc	a5,0x1e
+    80205730:	31c78793          	addi	a5,a5,796 # 80223a48 <tickslock>
+    80205734:	fe843703          	ld	a4,-24(s0)
+    80205738:	fcf761e3          	bltu	a4,a5,802056fa <filealloc+0x26>
+    }
+  }
+  release(&ftable.lock);
+    8020573c:	0001d517          	auipc	a0,0x1d
+    80205740:	35450513          	addi	a0,a0,852 # 80222a90 <ftable>
+    80205744:	ffffb097          	auipc	ra,0xffffb
+    80205748:	308080e7          	jalr	776(ra) # 80200a4c <release>
+  return NULL;
+    8020574c:	4781                	li	a5,0
+}
+    8020574e:	853e                	mv	a0,a5
+    80205750:	60e2                	ld	ra,24(sp)
+    80205752:	6442                	ld	s0,16(sp)
+    80205754:	6105                	addi	sp,sp,32
+    80205756:	8082                	ret
+
+0000000080205758 <filedup>:
+
+// Increment ref count for file f.
+struct file*
+filedup(struct file *f)
+{
+    80205758:	1101                	addi	sp,sp,-32
+    8020575a:	ec06                	sd	ra,24(sp)
+    8020575c:	e822                	sd	s0,16(sp)
+    8020575e:	1000                	addi	s0,sp,32
+    80205760:	fea43423          	sd	a0,-24(s0)
+  acquire(&ftable.lock);
+    80205764:	0001d517          	auipc	a0,0x1d
+    80205768:	32c50513          	addi	a0,a0,812 # 80222a90 <ftable>
+    8020576c:	ffffb097          	auipc	ra,0xffffb
+    80205770:	27c080e7          	jalr	636(ra) # 802009e8 <acquire>
+  if(f->ref < 1)
+    80205774:	fe843783          	ld	a5,-24(s0)
+    80205778:	43dc                	lw	a5,4(a5)
+    8020577a:	00f04a63          	bgtz	a5,8020578e <filedup+0x36>
+    panic("filedup");
+    8020577e:	00008517          	auipc	a0,0x8
+    80205782:	4a250513          	addi	a0,a0,1186 # 8020dc20 <etext+0xc20>
+    80205786:	ffffb097          	auipc	ra,0xffffb
+    8020578a:	cbe080e7          	jalr	-834(ra) # 80200444 <panic>
+  f->ref++;
+    8020578e:	fe843783          	ld	a5,-24(s0)
+    80205792:	43dc                	lw	a5,4(a5)
+    80205794:	2785                	addiw	a5,a5,1
+    80205796:	0007871b          	sext.w	a4,a5
+    8020579a:	fe843783          	ld	a5,-24(s0)
+    8020579e:	c3d8                	sw	a4,4(a5)
+  release(&ftable.lock);
+    802057a0:	0001d517          	auipc	a0,0x1d
+    802057a4:	2f050513          	addi	a0,a0,752 # 80222a90 <ftable>
+    802057a8:	ffffb097          	auipc	ra,0xffffb
+    802057ac:	2a4080e7          	jalr	676(ra) # 80200a4c <release>
+  return f;
+    802057b0:	fe843783          	ld	a5,-24(s0)
+}
+    802057b4:	853e                	mv	a0,a5
+    802057b6:	60e2                	ld	ra,24(sp)
+    802057b8:	6442                	ld	s0,16(sp)
+    802057ba:	6105                	addi	sp,sp,32
+    802057bc:	8082                	ret
+
+00000000802057be <fileclose>:
+
+// Close file f.  (Decrement ref count, close when reaches 0.)
+void
+fileclose(struct file *f)
+{
+    802057be:	715d                	addi	sp,sp,-80
+    802057c0:	e486                	sd	ra,72(sp)
+    802057c2:	e0a2                	sd	s0,64(sp)
+    802057c4:	0880                	addi	s0,sp,80
+    802057c6:	faa43c23          	sd	a0,-72(s0)
+  struct file ff;
+
+  acquire(&ftable.lock);
+    802057ca:	0001d517          	auipc	a0,0x1d
+    802057ce:	2c650513          	addi	a0,a0,710 # 80222a90 <ftable>
+    802057d2:	ffffb097          	auipc	ra,0xffffb
+    802057d6:	216080e7          	jalr	534(ra) # 802009e8 <acquire>
+  if(f->ref < 1)
+    802057da:	fb843783          	ld	a5,-72(s0)
+    802057de:	43dc                	lw	a5,4(a5)
+    802057e0:	00f04a63          	bgtz	a5,802057f4 <fileclose+0x36>
+    panic("fileclose");
+    802057e4:	00008517          	auipc	a0,0x8
+    802057e8:	44450513          	addi	a0,a0,1092 # 8020dc28 <etext+0xc28>
+    802057ec:	ffffb097          	auipc	ra,0xffffb
+    802057f0:	c58080e7          	jalr	-936(ra) # 80200444 <panic>
+  if(--f->ref > 0){
+    802057f4:	fb843783          	ld	a5,-72(s0)
+    802057f8:	43dc                	lw	a5,4(a5)
+    802057fa:	37fd                	addiw	a5,a5,-1
+    802057fc:	0007871b          	sext.w	a4,a5
+    80205800:	fb843783          	ld	a5,-72(s0)
+    80205804:	c3d8                	sw	a4,4(a5)
+    80205806:	fb843783          	ld	a5,-72(s0)
+    8020580a:	43dc                	lw	a5,4(a5)
+    8020580c:	00f05b63          	blez	a5,80205822 <fileclose+0x64>
+    release(&ftable.lock);
+    80205810:	0001d517          	auipc	a0,0x1d
+    80205814:	28050513          	addi	a0,a0,640 # 80222a90 <ftable>
+    80205818:	ffffb097          	auipc	ra,0xffffb
+    8020581c:	234080e7          	jalr	564(ra) # 80200a4c <release>
+    80205820:	a049                	j	802058a2 <fileclose+0xe4>
+    return;
+  }
+  ff = *f;
+    80205822:	fb843783          	ld	a5,-72(s0)
+    80205826:	638c                	ld	a1,0(a5)
+    80205828:	6790                	ld	a2,8(a5)
+    8020582a:	6b94                	ld	a3,16(a5)
+    8020582c:	6f98                	ld	a4,24(a5)
+    8020582e:	739c                	ld	a5,32(a5)
+    80205830:	fcb43423          	sd	a1,-56(s0)
+    80205834:	fcc43823          	sd	a2,-48(s0)
+    80205838:	fcd43c23          	sd	a3,-40(s0)
+    8020583c:	fee43023          	sd	a4,-32(s0)
+    80205840:	fef43423          	sd	a5,-24(s0)
+  f->ref = 0;
+    80205844:	fb843783          	ld	a5,-72(s0)
+    80205848:	0007a223          	sw	zero,4(a5)
+  f->type = FD_NONE;
+    8020584c:	fb843783          	ld	a5,-72(s0)
+    80205850:	0007a023          	sw	zero,0(a5)
+  release(&ftable.lock);
+    80205854:	0001d517          	auipc	a0,0x1d
+    80205858:	23c50513          	addi	a0,a0,572 # 80222a90 <ftable>
+    8020585c:	ffffb097          	auipc	ra,0xffffb
+    80205860:	1f0080e7          	jalr	496(ra) # 80200a4c <release>
+
+  if(ff.type == FD_PIPE){
+    80205864:	fc842783          	lw	a5,-56(s0)
+    80205868:	873e                	mv	a4,a5
+    8020586a:	4785                	li	a5,1
+    8020586c:	00f71e63          	bne	a4,a5,80205888 <fileclose+0xca>
+    pipeclose(ff.pipe, ff.writable);
+    80205870:	fd843783          	ld	a5,-40(s0)
+    80205874:	fd144703          	lbu	a4,-47(s0)
+    80205878:	2701                	sext.w	a4,a4
+    8020587a:	85ba                	mv	a1,a4
+    8020587c:	853e                	mv	a0,a5
+    8020587e:	00000097          	auipc	ra,0x0
+    80205882:	5ee080e7          	jalr	1518(ra) # 80205e6c <pipeclose>
+    80205886:	a831                	j	802058a2 <fileclose+0xe4>
+  } else if(ff.type == FD_ENTRY){
+    80205888:	fc842783          	lw	a5,-56(s0)
+    8020588c:	873e                	mv	a4,a5
+    8020588e:	4789                	li	a5,2
+    80205890:	00f71963          	bne	a4,a5,802058a2 <fileclose+0xe4>
+    eput(ff.ep);
+    80205894:	fe043783          	ld	a5,-32(s0)
+    80205898:	853e                	mv	a0,a5
+    8020589a:	00004097          	auipc	ra,0x4
+    8020589e:	30c080e7          	jalr	780(ra) # 80209ba6 <eput>
+  } else if (ff.type == FD_DEVICE) {
+
+  }
+}
+    802058a2:	60a6                	ld	ra,72(sp)
+    802058a4:	6406                	ld	s0,64(sp)
+    802058a6:	6161                	addi	sp,sp,80
+    802058a8:	8082                	ret
+
+00000000802058aa <filestat>:
+
+// Get metadata about file f.
+// addr is a user virtual address, pointing to a struct stat.
+int
+filestat(struct file *f, uint64 addr)
+{
+    802058aa:	711d                	addi	sp,sp,-96
+    802058ac:	ec86                	sd	ra,88(sp)
+    802058ae:	e8a2                	sd	s0,80(sp)
+    802058b0:	1080                	addi	s0,sp,96
+    802058b2:	faa43423          	sd	a0,-88(s0)
+    802058b6:	fab43023          	sd	a1,-96(s0)
+  // struct proc *p = myproc();
+  struct stat st;
+  
+  if(f->type == FD_ENTRY){
+    802058ba:	fa843783          	ld	a5,-88(s0)
+    802058be:	439c                	lw	a5,0(a5)
+    802058c0:	873e                	mv	a4,a5
+    802058c2:	4789                	li	a5,2
+    802058c4:	04f71f63          	bne	a4,a5,80205922 <filestat+0x78>
+    elock(f->ep);
+    802058c8:	fa843783          	ld	a5,-88(s0)
+    802058cc:	6f9c                	ld	a5,24(a5)
+    802058ce:	853e                	mv	a0,a5
+    802058d0:	00004097          	auipc	ra,0x4
+    802058d4:	22c080e7          	jalr	556(ra) # 80209afc <elock>
+    estat(f->ep, &st);
+    802058d8:	fa843783          	ld	a5,-88(s0)
+    802058dc:	6f9c                	ld	a5,24(a5)
+    802058de:	fb840713          	addi	a4,s0,-72
+    802058e2:	85ba                	mv	a1,a4
+    802058e4:	853e                	mv	a0,a5
+    802058e6:	00004097          	auipc	ra,0x4
+    802058ea:	488080e7          	jalr	1160(ra) # 80209d6e <estat>
+    eunlock(f->ep);
+    802058ee:	fa843783          	ld	a5,-88(s0)
+    802058f2:	6f9c                	ld	a5,24(a5)
+    802058f4:	853e                	mv	a0,a5
+    802058f6:	00004097          	auipc	ra,0x4
+    802058fa:	250080e7          	jalr	592(ra) # 80209b46 <eunlock>
+    // if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0)
+    if(copyout2(addr, (char *)&st, sizeof(st)) < 0)
+    802058fe:	fb840793          	addi	a5,s0,-72
+    80205902:	03800613          	li	a2,56
+    80205906:	85be                	mv	a1,a5
+    80205908:	fa043503          	ld	a0,-96(s0)
+    8020590c:	ffffc097          	auipc	ra,0xffffc
+    80205910:	55e080e7          	jalr	1374(ra) # 80201e6a <copyout2>
+    80205914:	87aa                	mv	a5,a0
+    80205916:	0007d463          	bgez	a5,8020591e <filestat+0x74>
+      return -1;
+    8020591a:	57fd                	li	a5,-1
+    8020591c:	a021                	j	80205924 <filestat+0x7a>
+    return 0;
+    8020591e:	4781                	li	a5,0
+    80205920:	a011                	j	80205924 <filestat+0x7a>
+  }
+  return -1;
+    80205922:	57fd                	li	a5,-1
+}
+    80205924:	853e                	mv	a0,a5
+    80205926:	60e6                	ld	ra,88(sp)
+    80205928:	6446                	ld	s0,80(sp)
+    8020592a:	6125                	addi	sp,sp,96
+    8020592c:	8082                	ret
+
+000000008020592e <fileread>:
+
+// Read from file f.
+// addr is a user virtual address.
+int
+fileread(struct file *f, uint64 addr, int n)
+{
+    8020592e:	7139                	addi	sp,sp,-64
+    80205930:	fc06                	sd	ra,56(sp)
+    80205932:	f822                	sd	s0,48(sp)
+    80205934:	0080                	addi	s0,sp,64
+    80205936:	fca43c23          	sd	a0,-40(s0)
+    8020593a:	fcb43823          	sd	a1,-48(s0)
+    8020593e:	87b2                	mv	a5,a2
+    80205940:	fcf42623          	sw	a5,-52(s0)
+  int r = 0;
+    80205944:	fe042623          	sw	zero,-20(s0)
+
+  if(f->readable == 0)
+    80205948:	fd843783          	ld	a5,-40(s0)
+    8020594c:	0087c783          	lbu	a5,8(a5)
+    80205950:	e399                	bnez	a5,80205956 <fileread+0x28>
+    return -1;
+    80205952:	57fd                	li	a5,-1
+    80205954:	aa15                	j	80205a88 <fileread+0x15a>
+
+  switch (f->type) {
+    80205956:	fd843783          	ld	a5,-40(s0)
+    8020595a:	439c                	lw	a5,0(a5)
+    8020595c:	86be                	mv	a3,a5
+    8020595e:	470d                	li	a4,3
+    80205960:	04e68063          	beq	a3,a4,802059a0 <fileread+0x72>
+    80205964:	86be                	mv	a3,a5
+    80205966:	470d                	li	a4,3
+    80205968:	10d76663          	bltu	a4,a3,80205a74 <fileread+0x146>
+    8020596c:	86be                	mv	a3,a5
+    8020596e:	4705                	li	a4,1
+    80205970:	00e68763          	beq	a3,a4,8020597e <fileread+0x50>
+    80205974:	873e                	mv	a4,a5
+    80205976:	4789                	li	a5,2
+    80205978:	08f70a63          	beq	a4,a5,80205a0c <fileread+0xde>
+    8020597c:	a8e5                	j	80205a74 <fileread+0x146>
+    case FD_PIPE:
+        r = piperead(f->pipe, addr, n);
+    8020597e:	fd843783          	ld	a5,-40(s0)
+    80205982:	6b9c                	ld	a5,16(a5)
+    80205984:	fcc42703          	lw	a4,-52(s0)
+    80205988:	863a                	mv	a2,a4
+    8020598a:	fd043583          	ld	a1,-48(s0)
+    8020598e:	853e                	mv	a0,a5
+    80205990:	00000097          	auipc	ra,0x0
+    80205994:	6c6080e7          	jalr	1734(ra) # 80206056 <piperead>
+    80205998:	87aa                	mv	a5,a0
+    8020599a:	fef42623          	sw	a5,-20(s0)
+        break;
+    8020599e:	a0dd                	j	80205a84 <fileread+0x156>
+    case FD_DEVICE:
+        if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read)
+    802059a0:	fd843783          	ld	a5,-40(s0)
+    802059a4:	02479783          	lh	a5,36(a5)
+    802059a8:	2781                	sext.w	a5,a5
+    802059aa:	0207c863          	bltz	a5,802059da <fileread+0xac>
+    802059ae:	fd843783          	ld	a5,-40(s0)
+    802059b2:	02479783          	lh	a5,36(a5)
+    802059b6:	0007871b          	sext.w	a4,a5
+    802059ba:	47a5                	li	a5,9
+    802059bc:	00e7cf63          	blt	a5,a4,802059da <fileread+0xac>
+    802059c0:	fd843783          	ld	a5,-40(s0)
+    802059c4:	02479783          	lh	a5,36(a5)
+    802059c8:	2781                	sext.w	a5,a5
+    802059ca:	0001d717          	auipc	a4,0x1d
+    802059ce:	02670713          	addi	a4,a4,38 # 802229f0 <devsw>
+    802059d2:	0792                	slli	a5,a5,0x4
+    802059d4:	97ba                	add	a5,a5,a4
+    802059d6:	639c                	ld	a5,0(a5)
+    802059d8:	e399                	bnez	a5,802059de <fileread+0xb0>
+          return -1;
+    802059da:	57fd                	li	a5,-1
+    802059dc:	a075                	j	80205a88 <fileread+0x15a>
+        r = devsw[f->major].read(1, addr, n);
+    802059de:	fd843783          	ld	a5,-40(s0)
+    802059e2:	02479783          	lh	a5,36(a5)
+    802059e6:	2781                	sext.w	a5,a5
+    802059e8:	0001d717          	auipc	a4,0x1d
+    802059ec:	00870713          	addi	a4,a4,8 # 802229f0 <devsw>
+    802059f0:	0792                	slli	a5,a5,0x4
+    802059f2:	97ba                	add	a5,a5,a4
+    802059f4:	6398                	ld	a4,0(a5)
+    802059f6:	fcc42783          	lw	a5,-52(s0)
+    802059fa:	863e                	mv	a2,a5
+    802059fc:	fd043583          	ld	a1,-48(s0)
+    80205a00:	4505                	li	a0,1
+    80205a02:	9702                	jalr	a4
+    80205a04:	87aa                	mv	a5,a0
+    80205a06:	fef42623          	sw	a5,-20(s0)
+        break;
+    80205a0a:	a8ad                	j	80205a84 <fileread+0x156>
+    case FD_ENTRY:
+        elock(f->ep);
+    80205a0c:	fd843783          	ld	a5,-40(s0)
+    80205a10:	6f9c                	ld	a5,24(a5)
+    80205a12:	853e                	mv	a0,a5
+    80205a14:	00004097          	auipc	ra,0x4
+    80205a18:	0e8080e7          	jalr	232(ra) # 80209afc <elock>
+          if((r = eread(f->ep, 1, addr, f->off, n)) > 0)
+    80205a1c:	fd843783          	ld	a5,-40(s0)
+    80205a20:	6f88                	ld	a0,24(a5)
+    80205a22:	fd843783          	ld	a5,-40(s0)
+    80205a26:	539c                	lw	a5,32(a5)
+    80205a28:	fcc42703          	lw	a4,-52(s0)
+    80205a2c:	86be                	mv	a3,a5
+    80205a2e:	fd043603          	ld	a2,-48(s0)
+    80205a32:	4585                	li	a1,1
+    80205a34:	00003097          	auipc	ra,0x3
+    80205a38:	ffa080e7          	jalr	-6(ra) # 80208a2e <eread>
+    80205a3c:	87aa                	mv	a5,a0
+    80205a3e:	fef42623          	sw	a5,-20(s0)
+    80205a42:	fec42783          	lw	a5,-20(s0)
+    80205a46:	2781                	sext.w	a5,a5
+    80205a48:	00f05d63          	blez	a5,80205a62 <fileread+0x134>
+            f->off += r;
+    80205a4c:	fd843783          	ld	a5,-40(s0)
+    80205a50:	5398                	lw	a4,32(a5)
+    80205a52:	fec42783          	lw	a5,-20(s0)
+    80205a56:	9fb9                	addw	a5,a5,a4
+    80205a58:	0007871b          	sext.w	a4,a5
+    80205a5c:	fd843783          	ld	a5,-40(s0)
+    80205a60:	d398                	sw	a4,32(a5)
+        eunlock(f->ep);
+    80205a62:	fd843783          	ld	a5,-40(s0)
+    80205a66:	6f9c                	ld	a5,24(a5)
+    80205a68:	853e                	mv	a0,a5
+    80205a6a:	00004097          	auipc	ra,0x4
+    80205a6e:	0dc080e7          	jalr	220(ra) # 80209b46 <eunlock>
+        break;
+    80205a72:	a809                	j	80205a84 <fileread+0x156>
+    default:
+      panic("fileread");
+    80205a74:	00008517          	auipc	a0,0x8
+    80205a78:	1c450513          	addi	a0,a0,452 # 8020dc38 <etext+0xc38>
+    80205a7c:	ffffb097          	auipc	ra,0xffffb
+    80205a80:	9c8080e7          	jalr	-1592(ra) # 80200444 <panic>
+  }
+
+  return r;
+    80205a84:	fec42783          	lw	a5,-20(s0)
+}
+    80205a88:	853e                	mv	a0,a5
+    80205a8a:	70e2                	ld	ra,56(sp)
+    80205a8c:	7442                	ld	s0,48(sp)
+    80205a8e:	6121                	addi	sp,sp,64
+    80205a90:	8082                	ret
+
+0000000080205a92 <filewrite>:
+
+// Write to file f.
+// addr is a user virtual address.
+int
+filewrite(struct file *f, uint64 addr, int n)
+{
+    80205a92:	7139                	addi	sp,sp,-64
+    80205a94:	fc06                	sd	ra,56(sp)
+    80205a96:	f822                	sd	s0,48(sp)
+    80205a98:	0080                	addi	s0,sp,64
+    80205a9a:	fca43c23          	sd	a0,-40(s0)
+    80205a9e:	fcb43823          	sd	a1,-48(s0)
+    80205aa2:	87b2                	mv	a5,a2
+    80205aa4:	fcf42623          	sw	a5,-52(s0)
+  int ret = 0;
+    80205aa8:	fe042623          	sw	zero,-20(s0)
+
+  if(f->writable == 0)
+    80205aac:	fd843783          	ld	a5,-40(s0)
+    80205ab0:	0097c783          	lbu	a5,9(a5)
+    80205ab4:	e399                	bnez	a5,80205aba <filewrite+0x28>
+    return -1;
+    80205ab6:	57fd                	li	a5,-1
+    80205ab8:	a291                	j	80205bfc <filewrite+0x16a>
+
+  if(f->type == FD_PIPE){
+    80205aba:	fd843783          	ld	a5,-40(s0)
+    80205abe:	439c                	lw	a5,0(a5)
+    80205ac0:	873e                	mv	a4,a5
+    80205ac2:	4785                	li	a5,1
+    80205ac4:	02f71363          	bne	a4,a5,80205aea <filewrite+0x58>
+    ret = pipewrite(f->pipe, addr, n);
+    80205ac8:	fd843783          	ld	a5,-40(s0)
+    80205acc:	6b9c                	ld	a5,16(a5)
+    80205ace:	fcc42703          	lw	a4,-52(s0)
+    80205ad2:	863a                	mv	a2,a4
+    80205ad4:	fd043583          	ld	a1,-48(s0)
+    80205ad8:	853e                	mv	a0,a5
+    80205ada:	00000097          	auipc	ra,0x0
+    80205ade:	43a080e7          	jalr	1082(ra) # 80205f14 <pipewrite>
+    80205ae2:	87aa                	mv	a5,a0
+    80205ae4:	fef42623          	sw	a5,-20(s0)
+    80205ae8:	aa01                	j	80205bf8 <filewrite+0x166>
+  } else if(f->type == FD_DEVICE){
+    80205aea:	fd843783          	ld	a5,-40(s0)
+    80205aee:	439c                	lw	a5,0(a5)
+    80205af0:	873e                	mv	a4,a5
+    80205af2:	478d                	li	a5,3
+    80205af4:	06f71863          	bne	a4,a5,80205b64 <filewrite+0xd2>
+    if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write)
+    80205af8:	fd843783          	ld	a5,-40(s0)
+    80205afc:	02479783          	lh	a5,36(a5)
+    80205b00:	2781                	sext.w	a5,a5
+    80205b02:	0207c863          	bltz	a5,80205b32 <filewrite+0xa0>
+    80205b06:	fd843783          	ld	a5,-40(s0)
+    80205b0a:	02479783          	lh	a5,36(a5)
+    80205b0e:	0007871b          	sext.w	a4,a5
+    80205b12:	47a5                	li	a5,9
+    80205b14:	00e7cf63          	blt	a5,a4,80205b32 <filewrite+0xa0>
+    80205b18:	fd843783          	ld	a5,-40(s0)
+    80205b1c:	02479783          	lh	a5,36(a5)
+    80205b20:	2781                	sext.w	a5,a5
+    80205b22:	0001d717          	auipc	a4,0x1d
+    80205b26:	ece70713          	addi	a4,a4,-306 # 802229f0 <devsw>
+    80205b2a:	0792                	slli	a5,a5,0x4
+    80205b2c:	97ba                	add	a5,a5,a4
+    80205b2e:	679c                	ld	a5,8(a5)
+    80205b30:	e399                	bnez	a5,80205b36 <filewrite+0xa4>
+      return -1;
+    80205b32:	57fd                	li	a5,-1
+    80205b34:	a0e1                	j	80205bfc <filewrite+0x16a>
+    ret = devsw[f->major].write(1, addr, n);
+    80205b36:	fd843783          	ld	a5,-40(s0)
+    80205b3a:	02479783          	lh	a5,36(a5)
+    80205b3e:	2781                	sext.w	a5,a5
+    80205b40:	0001d717          	auipc	a4,0x1d
+    80205b44:	eb070713          	addi	a4,a4,-336 # 802229f0 <devsw>
+    80205b48:	0792                	slli	a5,a5,0x4
+    80205b4a:	97ba                	add	a5,a5,a4
+    80205b4c:	6798                	ld	a4,8(a5)
+    80205b4e:	fcc42783          	lw	a5,-52(s0)
+    80205b52:	863e                	mv	a2,a5
+    80205b54:	fd043583          	ld	a1,-48(s0)
+    80205b58:	4505                	li	a0,1
+    80205b5a:	9702                	jalr	a4
+    80205b5c:	87aa                	mv	a5,a0
+    80205b5e:	fef42623          	sw	a5,-20(s0)
+    80205b62:	a859                	j	80205bf8 <filewrite+0x166>
+  } else if(f->type == FD_ENTRY){
+    80205b64:	fd843783          	ld	a5,-40(s0)
+    80205b68:	439c                	lw	a5,0(a5)
+    80205b6a:	873e                	mv	a4,a5
+    80205b6c:	4789                	li	a5,2
+    80205b6e:	06f71d63          	bne	a4,a5,80205be8 <filewrite+0x156>
+    elock(f->ep);
+    80205b72:	fd843783          	ld	a5,-40(s0)
+    80205b76:	6f9c                	ld	a5,24(a5)
+    80205b78:	853e                	mv	a0,a5
+    80205b7a:	00004097          	auipc	ra,0x4
+    80205b7e:	f82080e7          	jalr	-126(ra) # 80209afc <elock>
+    if (ewrite(f->ep, 1, addr, f->off, n) == n) {
+    80205b82:	fd843783          	ld	a5,-40(s0)
+    80205b86:	6f88                	ld	a0,24(a5)
+    80205b88:	fd843783          	ld	a5,-40(s0)
+    80205b8c:	539c                	lw	a5,32(a5)
+    80205b8e:	fcc42703          	lw	a4,-52(s0)
+    80205b92:	86be                	mv	a3,a5
+    80205b94:	fd043603          	ld	a2,-48(s0)
+    80205b98:	4585                	li	a1,1
+    80205b9a:	00003097          	auipc	ra,0x3
+    80205b9e:	030080e7          	jalr	48(ra) # 80208bca <ewrite>
+    80205ba2:	87aa                	mv	a5,a0
+    80205ba4:	873e                	mv	a4,a5
+    80205ba6:	fcc42783          	lw	a5,-52(s0)
+    80205baa:	2781                	sext.w	a5,a5
+    80205bac:	02e79263          	bne	a5,a4,80205bd0 <filewrite+0x13e>
+      ret = n;
+    80205bb0:	fcc42783          	lw	a5,-52(s0)
+    80205bb4:	fef42623          	sw	a5,-20(s0)
+      f->off += n;
+    80205bb8:	fd843783          	ld	a5,-40(s0)
+    80205bbc:	5398                	lw	a4,32(a5)
+    80205bbe:	fcc42783          	lw	a5,-52(s0)
+    80205bc2:	9fb9                	addw	a5,a5,a4
+    80205bc4:	0007871b          	sext.w	a4,a5
+    80205bc8:	fd843783          	ld	a5,-40(s0)
+    80205bcc:	d398                	sw	a4,32(a5)
+    80205bce:	a021                	j	80205bd6 <filewrite+0x144>
+    } else {
+      ret = -1;
+    80205bd0:	57fd                	li	a5,-1
+    80205bd2:	fef42623          	sw	a5,-20(s0)
+    }
+    eunlock(f->ep);
+    80205bd6:	fd843783          	ld	a5,-40(s0)
+    80205bda:	6f9c                	ld	a5,24(a5)
+    80205bdc:	853e                	mv	a0,a5
+    80205bde:	00004097          	auipc	ra,0x4
+    80205be2:	f68080e7          	jalr	-152(ra) # 80209b46 <eunlock>
+    80205be6:	a809                	j	80205bf8 <filewrite+0x166>
+  } else {
+    panic("filewrite");
+    80205be8:	00008517          	auipc	a0,0x8
+    80205bec:	06050513          	addi	a0,a0,96 # 8020dc48 <etext+0xc48>
+    80205bf0:	ffffb097          	auipc	ra,0xffffb
+    80205bf4:	854080e7          	jalr	-1964(ra) # 80200444 <panic>
+  }
+
+  return ret;
+    80205bf8:	fec42783          	lw	a5,-20(s0)
+}
+    80205bfc:	853e                	mv	a0,a5
+    80205bfe:	70e2                	ld	ra,56(sp)
+    80205c00:	7442                	ld	s0,48(sp)
+    80205c02:	6121                	addi	sp,sp,64
+    80205c04:	8082                	ret
+
+0000000080205c06 <dirnext>:
+
+// Read from dir f.
+// addr is a user virtual address.
+int
+dirnext(struct file *f, uint64 addr)
+{
+    80205c06:	7145                	addi	sp,sp,-464
+    80205c08:	e786                	sd	ra,456(sp)
+    80205c0a:	e3a2                	sd	s0,448(sp)
+    80205c0c:	0b80                	addi	s0,sp,464
+    80205c0e:	e2a43c23          	sd	a0,-456(s0)
+    80205c12:	e2b43823          	sd	a1,-464(s0)
+  // struct proc *p = myproc();
+
+  if(f->readable == 0 || !(f->ep->attribute & ATTR_DIRECTORY))
+    80205c16:	e3843783          	ld	a5,-456(s0)
+    80205c1a:	0087c783          	lbu	a5,8(a5)
+    80205c1e:	cb91                	beqz	a5,80205c32 <dirnext+0x2c>
+    80205c20:	e3843783          	ld	a5,-456(s0)
+    80205c24:	6f9c                	ld	a5,24(a5)
+    80205c26:	1007c783          	lbu	a5,256(a5)
+    80205c2a:	2781                	sext.w	a5,a5
+    80205c2c:	8bc1                	andi	a5,a5,16
+    80205c2e:	2781                	sext.w	a5,a5
+    80205c30:	e399                	bnez	a5,80205c36 <dirnext+0x30>
+    return -1;
+    80205c32:	57fd                	li	a5,-1
+    80205c34:	a8e9                	j	80205d0e <dirnext+0x108>
+
+  struct dirent de;
+  struct stat st;
+  int count = 0;
+    80205c36:	e4042223          	sw	zero,-444(s0)
+  int ret;
+  elock(f->ep);
+    80205c3a:	e3843783          	ld	a5,-456(s0)
+    80205c3e:	6f9c                	ld	a5,24(a5)
+    80205c40:	853e                	mv	a0,a5
+    80205c42:	00004097          	auipc	ra,0x4
+    80205c46:	eba080e7          	jalr	-326(ra) # 80209afc <elock>
+  while ((ret = enext(f->ep, &de, f->off, &count)) == 0) {  // skip empty entry
+    80205c4a:	a005                	j	80205c6a <dirnext+0x64>
+    f->off += count * 32;
+    80205c4c:	e3843783          	ld	a5,-456(s0)
+    80205c50:	5398                	lw	a4,32(a5)
+    80205c52:	e4442783          	lw	a5,-444(s0)
+    80205c56:	0057979b          	slliw	a5,a5,0x5
+    80205c5a:	2781                	sext.w	a5,a5
+    80205c5c:	2781                	sext.w	a5,a5
+    80205c5e:	9fb9                	addw	a5,a5,a4
+    80205c60:	0007871b          	sext.w	a4,a5
+    80205c64:	e3843783          	ld	a5,-456(s0)
+    80205c68:	d398                	sw	a4,32(a5)
+  while ((ret = enext(f->ep, &de, f->off, &count)) == 0) {  // skip empty entry
+    80205c6a:	e3843783          	ld	a5,-456(s0)
+    80205c6e:	6f98                	ld	a4,24(a5)
+    80205c70:	e3843783          	ld	a5,-456(s0)
+    80205c74:	5390                	lw	a2,32(a5)
+    80205c76:	e4440693          	addi	a3,s0,-444
+    80205c7a:	e8040793          	addi	a5,s0,-384
+    80205c7e:	85be                	mv	a1,a5
+    80205c80:	853a                	mv	a0,a4
+    80205c82:	00004097          	auipc	ra,0x4
+    80205c86:	364080e7          	jalr	868(ra) # 80209fe6 <enext>
+    80205c8a:	87aa                	mv	a5,a0
+    80205c8c:	fef42623          	sw	a5,-20(s0)
+    80205c90:	fec42783          	lw	a5,-20(s0)
+    80205c94:	2781                	sext.w	a5,a5
+    80205c96:	dbdd                	beqz	a5,80205c4c <dirnext+0x46>
+  }
+  eunlock(f->ep);
+    80205c98:	e3843783          	ld	a5,-456(s0)
+    80205c9c:	6f9c                	ld	a5,24(a5)
+    80205c9e:	853e                	mv	a0,a5
+    80205ca0:	00004097          	auipc	ra,0x4
+    80205ca4:	ea6080e7          	jalr	-346(ra) # 80209b46 <eunlock>
+  if (ret == -1)
+    80205ca8:	fec42783          	lw	a5,-20(s0)
+    80205cac:	0007871b          	sext.w	a4,a5
+    80205cb0:	57fd                	li	a5,-1
+    80205cb2:	00f71463          	bne	a4,a5,80205cba <dirnext+0xb4>
+    return 0;
+    80205cb6:	4781                	li	a5,0
+    80205cb8:	a899                	j	80205d0e <dirnext+0x108>
+
+  f->off += count * 32;
+    80205cba:	e3843783          	ld	a5,-456(s0)
+    80205cbe:	5398                	lw	a4,32(a5)
+    80205cc0:	e4442783          	lw	a5,-444(s0)
+    80205cc4:	0057979b          	slliw	a5,a5,0x5
+    80205cc8:	2781                	sext.w	a5,a5
+    80205cca:	2781                	sext.w	a5,a5
+    80205ccc:	9fb9                	addw	a5,a5,a4
+    80205cce:	0007871b          	sext.w	a4,a5
+    80205cd2:	e3843783          	ld	a5,-456(s0)
+    80205cd6:	d398                	sw	a4,32(a5)
+  estat(&de, &st);
+    80205cd8:	e4840713          	addi	a4,s0,-440
+    80205cdc:	e8040793          	addi	a5,s0,-384
+    80205ce0:	85ba                	mv	a1,a4
+    80205ce2:	853e                	mv	a0,a5
+    80205ce4:	00004097          	auipc	ra,0x4
+    80205ce8:	08a080e7          	jalr	138(ra) # 80209d6e <estat>
+  // if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0)
+  if(copyout2(addr, (char *)&st, sizeof(st)) < 0)
+    80205cec:	e4840793          	addi	a5,s0,-440
+    80205cf0:	03800613          	li	a2,56
+    80205cf4:	85be                	mv	a1,a5
+    80205cf6:	e3043503          	ld	a0,-464(s0)
+    80205cfa:	ffffc097          	auipc	ra,0xffffc
+    80205cfe:	170080e7          	jalr	368(ra) # 80201e6a <copyout2>
+    80205d02:	87aa                	mv	a5,a0
+    80205d04:	0007d463          	bgez	a5,80205d0c <dirnext+0x106>
+    return -1;
+    80205d08:	57fd                	li	a5,-1
+    80205d0a:	a011                	j	80205d0e <dirnext+0x108>
+
+  return 1;
+    80205d0c:	4785                	li	a5,1
+    80205d0e:	853e                	mv	a0,a5
+    80205d10:	60be                	ld	ra,456(sp)
+    80205d12:	641e                	ld	s0,448(sp)
+    80205d14:	6179                	addi	sp,sp,464
+    80205d16:	8082                	ret
+
+0000000080205d18 <pipealloc>:
+#include "include/kalloc.h"
+#include "include/vm.h"
+
+int
+pipealloc(struct file **f0, struct file **f1)
+{
+    80205d18:	7179                	addi	sp,sp,-48
+    80205d1a:	f406                	sd	ra,40(sp)
+    80205d1c:	f022                	sd	s0,32(sp)
+    80205d1e:	1800                	addi	s0,sp,48
+    80205d20:	fca43c23          	sd	a0,-40(s0)
+    80205d24:	fcb43823          	sd	a1,-48(s0)
+  struct pipe *pi;
+
+  pi = 0;
+    80205d28:	fe043423          	sd	zero,-24(s0)
+  *f0 = *f1 = 0;
+    80205d2c:	fd043783          	ld	a5,-48(s0)
+    80205d30:	0007b023          	sd	zero,0(a5)
+    80205d34:	fd043783          	ld	a5,-48(s0)
+    80205d38:	6398                	ld	a4,0(a5)
+    80205d3a:	fd843783          	ld	a5,-40(s0)
+    80205d3e:	e398                	sd	a4,0(a5)
+  if((*f0 = filealloc()) == NULL || (*f1 = filealloc()) == NULL)
+    80205d40:	00000097          	auipc	ra,0x0
+    80205d44:	994080e7          	jalr	-1644(ra) # 802056d4 <filealloc>
+    80205d48:	872a                	mv	a4,a0
+    80205d4a:	fd843783          	ld	a5,-40(s0)
+    80205d4e:	e398                	sd	a4,0(a5)
+    80205d50:	fd843783          	ld	a5,-40(s0)
+    80205d54:	639c                	ld	a5,0(a5)
+    80205d56:	c3e9                	beqz	a5,80205e18 <pipealloc+0x100>
+    80205d58:	00000097          	auipc	ra,0x0
+    80205d5c:	97c080e7          	jalr	-1668(ra) # 802056d4 <filealloc>
+    80205d60:	872a                	mv	a4,a0
+    80205d62:	fd043783          	ld	a5,-48(s0)
+    80205d66:	e398                	sd	a4,0(a5)
+    80205d68:	fd043783          	ld	a5,-48(s0)
+    80205d6c:	639c                	ld	a5,0(a5)
+    80205d6e:	c7cd                	beqz	a5,80205e18 <pipealloc+0x100>
+    goto bad;
+  if((pi = (struct pipe*)kalloc()) == NULL)
+    80205d70:	ffffb097          	auipc	ra,0xffffb
+    80205d74:	a1c080e7          	jalr	-1508(ra) # 8020078c <kalloc>
+    80205d78:	fea43423          	sd	a0,-24(s0)
+    80205d7c:	fe843783          	ld	a5,-24(s0)
+    80205d80:	cfd1                	beqz	a5,80205e1c <pipealloc+0x104>
+    goto bad;
+  pi->readopen = 1;
+    80205d82:	fe843783          	ld	a5,-24(s0)
+    80205d86:	4705                	li	a4,1
+    80205d88:	22e7a023          	sw	a4,544(a5)
+  pi->writeopen = 1;
+    80205d8c:	fe843783          	ld	a5,-24(s0)
+    80205d90:	4705                	li	a4,1
+    80205d92:	22e7a223          	sw	a4,548(a5)
+  pi->nwrite = 0;
+    80205d96:	fe843783          	ld	a5,-24(s0)
+    80205d9a:	2007ae23          	sw	zero,540(a5)
+  pi->nread = 0;
+    80205d9e:	fe843783          	ld	a5,-24(s0)
+    80205da2:	2007ac23          	sw	zero,536(a5)
+  initlock(&pi->lock, "pipe");
+    80205da6:	fe843783          	ld	a5,-24(s0)
+    80205daa:	00008597          	auipc	a1,0x8
+    80205dae:	eae58593          	addi	a1,a1,-338 # 8020dc58 <etext+0xc58>
+    80205db2:	853e                	mv	a0,a5
+    80205db4:	ffffb097          	auipc	ra,0xffffb
+    80205db8:	c04080e7          	jalr	-1020(ra) # 802009b8 <initlock>
+  (*f0)->type = FD_PIPE;
+    80205dbc:	fd843783          	ld	a5,-40(s0)
+    80205dc0:	639c                	ld	a5,0(a5)
+    80205dc2:	4705                	li	a4,1
+    80205dc4:	c398                	sw	a4,0(a5)
+  (*f0)->readable = 1;
+    80205dc6:	fd843783          	ld	a5,-40(s0)
+    80205dca:	639c                	ld	a5,0(a5)
+    80205dcc:	4705                	li	a4,1
+    80205dce:	00e78423          	sb	a4,8(a5)
+  (*f0)->writable = 0;
+    80205dd2:	fd843783          	ld	a5,-40(s0)
+    80205dd6:	639c                	ld	a5,0(a5)
+    80205dd8:	000784a3          	sb	zero,9(a5)
+  (*f0)->pipe = pi;
+    80205ddc:	fd843783          	ld	a5,-40(s0)
+    80205de0:	639c                	ld	a5,0(a5)
+    80205de2:	fe843703          	ld	a4,-24(s0)
+    80205de6:	eb98                	sd	a4,16(a5)
+  (*f1)->type = FD_PIPE;
+    80205de8:	fd043783          	ld	a5,-48(s0)
+    80205dec:	639c                	ld	a5,0(a5)
+    80205dee:	4705                	li	a4,1
+    80205df0:	c398                	sw	a4,0(a5)
+  (*f1)->readable = 0;
+    80205df2:	fd043783          	ld	a5,-48(s0)
+    80205df6:	639c                	ld	a5,0(a5)
+    80205df8:	00078423          	sb	zero,8(a5)
+  (*f1)->writable = 1;
+    80205dfc:	fd043783          	ld	a5,-48(s0)
+    80205e00:	639c                	ld	a5,0(a5)
+    80205e02:	4705                	li	a4,1
+    80205e04:	00e784a3          	sb	a4,9(a5)
+  (*f1)->pipe = pi;
+    80205e08:	fd043783          	ld	a5,-48(s0)
+    80205e0c:	639c                	ld	a5,0(a5)
+    80205e0e:	fe843703          	ld	a4,-24(s0)
+    80205e12:	eb98                	sd	a4,16(a5)
+  return 0;
+    80205e14:	4781                	li	a5,0
+    80205e16:	a0b1                	j	80205e62 <pipealloc+0x14a>
+    goto bad;
+    80205e18:	0001                	nop
+    80205e1a:	a011                	j	80205e1e <pipealloc+0x106>
+    goto bad;
+    80205e1c:	0001                	nop
+
+ bad:
+  if(pi)
+    80205e1e:	fe843783          	ld	a5,-24(s0)
+    80205e22:	c799                	beqz	a5,80205e30 <pipealloc+0x118>
+    kfree((char*)pi);
+    80205e24:	fe843503          	ld	a0,-24(s0)
+    80205e28:	ffffb097          	auipc	ra,0xffffb
+    80205e2c:	8a6080e7          	jalr	-1882(ra) # 802006ce <kfree>
+  if(*f0)
+    80205e30:	fd843783          	ld	a5,-40(s0)
+    80205e34:	639c                	ld	a5,0(a5)
+    80205e36:	cb89                	beqz	a5,80205e48 <pipealloc+0x130>
+    fileclose(*f0);
+    80205e38:	fd843783          	ld	a5,-40(s0)
+    80205e3c:	639c                	ld	a5,0(a5)
+    80205e3e:	853e                	mv	a0,a5
+    80205e40:	00000097          	auipc	ra,0x0
+    80205e44:	97e080e7          	jalr	-1666(ra) # 802057be <fileclose>
+  if(*f1)
+    80205e48:	fd043783          	ld	a5,-48(s0)
+    80205e4c:	639c                	ld	a5,0(a5)
+    80205e4e:	cb89                	beqz	a5,80205e60 <pipealloc+0x148>
+    fileclose(*f1);
+    80205e50:	fd043783          	ld	a5,-48(s0)
+    80205e54:	639c                	ld	a5,0(a5)
+    80205e56:	853e                	mv	a0,a5
+    80205e58:	00000097          	auipc	ra,0x0
+    80205e5c:	966080e7          	jalr	-1690(ra) # 802057be <fileclose>
+  return -1;
+    80205e60:	57fd                	li	a5,-1
+}
+    80205e62:	853e                	mv	a0,a5
+    80205e64:	70a2                	ld	ra,40(sp)
+    80205e66:	7402                	ld	s0,32(sp)
+    80205e68:	6145                	addi	sp,sp,48
+    80205e6a:	8082                	ret
+
+0000000080205e6c <pipeclose>:
+
+void
+pipeclose(struct pipe *pi, int writable)
+{
+    80205e6c:	1101                	addi	sp,sp,-32
+    80205e6e:	ec06                	sd	ra,24(sp)
+    80205e70:	e822                	sd	s0,16(sp)
+    80205e72:	1000                	addi	s0,sp,32
+    80205e74:	fea43423          	sd	a0,-24(s0)
+    80205e78:	87ae                	mv	a5,a1
+    80205e7a:	fef42223          	sw	a5,-28(s0)
+  acquire(&pi->lock);
+    80205e7e:	fe843783          	ld	a5,-24(s0)
+    80205e82:	853e                	mv	a0,a5
+    80205e84:	ffffb097          	auipc	ra,0xffffb
+    80205e88:	b64080e7          	jalr	-1180(ra) # 802009e8 <acquire>
+  if(writable){
+    80205e8c:	fe442783          	lw	a5,-28(s0)
+    80205e90:	2781                	sext.w	a5,a5
+    80205e92:	cf99                	beqz	a5,80205eb0 <pipeclose+0x44>
+    pi->writeopen = 0;
+    80205e94:	fe843783          	ld	a5,-24(s0)
+    80205e98:	2207a223          	sw	zero,548(a5)
+    wakeup(&pi->nread);
+    80205e9c:	fe843783          	ld	a5,-24(s0)
+    80205ea0:	21878793          	addi	a5,a5,536
+    80205ea4:	853e                	mv	a0,a5
+    80205ea6:	ffffe097          	auipc	ra,0xffffe
+    80205eaa:	9aa080e7          	jalr	-1622(ra) # 80203850 <wakeup>
+    80205eae:	a831                	j	80205eca <pipeclose+0x5e>
+  } else {
+    pi->readopen = 0;
+    80205eb0:	fe843783          	ld	a5,-24(s0)
+    80205eb4:	2207a023          	sw	zero,544(a5)
+    wakeup(&pi->nwrite);
+    80205eb8:	fe843783          	ld	a5,-24(s0)
+    80205ebc:	21c78793          	addi	a5,a5,540
+    80205ec0:	853e                	mv	a0,a5
+    80205ec2:	ffffe097          	auipc	ra,0xffffe
+    80205ec6:	98e080e7          	jalr	-1650(ra) # 80203850 <wakeup>
+  }
+  if(pi->readopen == 0 && pi->writeopen == 0){
+    80205eca:	fe843783          	ld	a5,-24(s0)
+    80205ece:	2207a783          	lw	a5,544(a5)
+    80205ed2:	e785                	bnez	a5,80205efa <pipeclose+0x8e>
+    80205ed4:	fe843783          	ld	a5,-24(s0)
+    80205ed8:	2247a783          	lw	a5,548(a5)
+    80205edc:	ef99                	bnez	a5,80205efa <pipeclose+0x8e>
+    release(&pi->lock);
+    80205ede:	fe843783          	ld	a5,-24(s0)
+    80205ee2:	853e                	mv	a0,a5
+    80205ee4:	ffffb097          	auipc	ra,0xffffb
+    80205ee8:	b68080e7          	jalr	-1176(ra) # 80200a4c <release>
+    kfree((char*)pi);
+    80205eec:	fe843503          	ld	a0,-24(s0)
+    80205ef0:	ffffa097          	auipc	ra,0xffffa
+    80205ef4:	7de080e7          	jalr	2014(ra) # 802006ce <kfree>
+    80205ef8:	a809                	j	80205f0a <pipeclose+0x9e>
+  } else
+    release(&pi->lock);
+    80205efa:	fe843783          	ld	a5,-24(s0)
+    80205efe:	853e                	mv	a0,a5
+    80205f00:	ffffb097          	auipc	ra,0xffffb
+    80205f04:	b4c080e7          	jalr	-1204(ra) # 80200a4c <release>
+}
+    80205f08:	0001                	nop
+    80205f0a:	0001                	nop
+    80205f0c:	60e2                	ld	ra,24(sp)
+    80205f0e:	6442                	ld	s0,16(sp)
+    80205f10:	6105                	addi	sp,sp,32
+    80205f12:	8082                	ret
+
+0000000080205f14 <pipewrite>:
+
+int
+pipewrite(struct pipe *pi, uint64 addr, int n)
+{
+    80205f14:	715d                	addi	sp,sp,-80
+    80205f16:	e486                	sd	ra,72(sp)
+    80205f18:	e0a2                	sd	s0,64(sp)
+    80205f1a:	0880                	addi	s0,sp,80
+    80205f1c:	fca43423          	sd	a0,-56(s0)
+    80205f20:	fcb43023          	sd	a1,-64(s0)
+    80205f24:	87b2                	mv	a5,a2
+    80205f26:	faf42e23          	sw	a5,-68(s0)
+  int i;
+  char ch;
+  struct proc *pr = myproc();
+    80205f2a:	ffffd097          	auipc	ra,0xffffd
+    80205f2e:	a38080e7          	jalr	-1480(ra) # 80202962 <myproc>
+    80205f32:	fea43023          	sd	a0,-32(s0)
+
+  acquire(&pi->lock);
+    80205f36:	fc843783          	ld	a5,-56(s0)
+    80205f3a:	853e                	mv	a0,a5
+    80205f3c:	ffffb097          	auipc	ra,0xffffb
+    80205f40:	aac080e7          	jalr	-1364(ra) # 802009e8 <acquire>
+  for(i = 0; i < n; i++){
+    80205f44:	fe042623          	sw	zero,-20(s0)
+    80205f48:	a0f1                	j	80206014 <pipewrite+0x100>
+    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full
+      if(pi->readopen == 0 || pr->killed){
+    80205f4a:	fc843783          	ld	a5,-56(s0)
+    80205f4e:	2207a783          	lw	a5,544(a5)
+    80205f52:	c789                	beqz	a5,80205f5c <pipewrite+0x48>
+    80205f54:	fe043783          	ld	a5,-32(s0)
+    80205f58:	5b9c                	lw	a5,48(a5)
+    80205f5a:	cb91                	beqz	a5,80205f6e <pipewrite+0x5a>
+        release(&pi->lock);
+    80205f5c:	fc843783          	ld	a5,-56(s0)
+    80205f60:	853e                	mv	a0,a5
+    80205f62:	ffffb097          	auipc	ra,0xffffb
+    80205f66:	aea080e7          	jalr	-1302(ra) # 80200a4c <release>
+        return -1;
+    80205f6a:	57fd                	li	a5,-1
+    80205f6c:	a0c5                	j	8020604c <pipewrite+0x138>
+      }
+      wakeup(&pi->nread);
+    80205f6e:	fc843783          	ld	a5,-56(s0)
+    80205f72:	21878793          	addi	a5,a5,536
+    80205f76:	853e                	mv	a0,a5
+    80205f78:	ffffe097          	auipc	ra,0xffffe
+    80205f7c:	8d8080e7          	jalr	-1832(ra) # 80203850 <wakeup>
+      sleep(&pi->nwrite, &pi->lock);
+    80205f80:	fc843783          	ld	a5,-56(s0)
+    80205f84:	21c78793          	addi	a5,a5,540
+    80205f88:	fc843703          	ld	a4,-56(s0)
+    80205f8c:	85ba                	mv	a1,a4
+    80205f8e:	853e                	mv	a0,a5
+    80205f90:	ffffe097          	auipc	ra,0xffffe
+    80205f94:	82c080e7          	jalr	-2004(ra) # 802037bc <sleep>
+    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full
+    80205f98:	fc843783          	ld	a5,-56(s0)
+    80205f9c:	21c7a703          	lw	a4,540(a5)
+    80205fa0:	fc843783          	ld	a5,-56(s0)
+    80205fa4:	2187a783          	lw	a5,536(a5)
+    80205fa8:	2007879b          	addiw	a5,a5,512
+    80205fac:	2781                	sext.w	a5,a5
+    80205fae:	f8f70ee3          	beq	a4,a5,80205f4a <pipewrite+0x36>
+    }
+    // if(copyin(pr->pagetable, &ch, addr + i, 1) == -1)
+    if(copyin2(&ch, addr + i, 1) == -1)
+    80205fb2:	fec42703          	lw	a4,-20(s0)
+    80205fb6:	fc043783          	ld	a5,-64(s0)
+    80205fba:	973e                	add	a4,a4,a5
+    80205fbc:	fdf40793          	addi	a5,s0,-33
+    80205fc0:	4605                	li	a2,1
+    80205fc2:	85ba                	mv	a1,a4
+    80205fc4:	853e                	mv	a0,a5
+    80205fc6:	ffffc097          	auipc	ra,0xffffc
+    80205fca:	fde080e7          	jalr	-34(ra) # 80201fa4 <copyin2>
+    80205fce:	87aa                	mv	a5,a0
+    80205fd0:	873e                	mv	a4,a5
+    80205fd2:	57fd                	li	a5,-1
+    80205fd4:	04f70963          	beq	a4,a5,80206026 <pipewrite+0x112>
+      break;
+    pi->data[pi->nwrite++ % PIPESIZE] = ch;
+    80205fd8:	fc843783          	ld	a5,-56(s0)
+    80205fdc:	21c7a783          	lw	a5,540(a5)
+    80205fe0:	2781                	sext.w	a5,a5
+    80205fe2:	0017871b          	addiw	a4,a5,1
+    80205fe6:	0007069b          	sext.w	a3,a4
+    80205fea:	fc843703          	ld	a4,-56(s0)
+    80205fee:	20d72e23          	sw	a3,540(a4)
+    80205ff2:	1ff7f793          	andi	a5,a5,511
+    80205ff6:	2781                	sext.w	a5,a5
+    80205ff8:	fdf44703          	lbu	a4,-33(s0)
+    80205ffc:	fc843683          	ld	a3,-56(s0)
+    80206000:	1782                	slli	a5,a5,0x20
+    80206002:	9381                	srli	a5,a5,0x20
+    80206004:	97b6                	add	a5,a5,a3
+    80206006:	00e78c23          	sb	a4,24(a5)
+  for(i = 0; i < n; i++){
+    8020600a:	fec42783          	lw	a5,-20(s0)
+    8020600e:	2785                	addiw	a5,a5,1
+    80206010:	fef42623          	sw	a5,-20(s0)
+    80206014:	fec42703          	lw	a4,-20(s0)
+    80206018:	fbc42783          	lw	a5,-68(s0)
+    8020601c:	2701                	sext.w	a4,a4
+    8020601e:	2781                	sext.w	a5,a5
+    80206020:	f6f74ce3          	blt	a4,a5,80205f98 <pipewrite+0x84>
+    80206024:	a011                	j	80206028 <pipewrite+0x114>
+      break;
+    80206026:	0001                	nop
+  }
+  wakeup(&pi->nread);
+    80206028:	fc843783          	ld	a5,-56(s0)
+    8020602c:	21878793          	addi	a5,a5,536
+    80206030:	853e                	mv	a0,a5
+    80206032:	ffffe097          	auipc	ra,0xffffe
+    80206036:	81e080e7          	jalr	-2018(ra) # 80203850 <wakeup>
+  release(&pi->lock);
+    8020603a:	fc843783          	ld	a5,-56(s0)
+    8020603e:	853e                	mv	a0,a5
+    80206040:	ffffb097          	auipc	ra,0xffffb
+    80206044:	a0c080e7          	jalr	-1524(ra) # 80200a4c <release>
+  return i;
+    80206048:	fec42783          	lw	a5,-20(s0)
+}
+    8020604c:	853e                	mv	a0,a5
+    8020604e:	60a6                	ld	ra,72(sp)
+    80206050:	6406                	ld	s0,64(sp)
+    80206052:	6161                	addi	sp,sp,80
+    80206054:	8082                	ret
+
+0000000080206056 <piperead>:
+
+int
+piperead(struct pipe *pi, uint64 addr, int n)
+{
+    80206056:	715d                	addi	sp,sp,-80
+    80206058:	e486                	sd	ra,72(sp)
+    8020605a:	e0a2                	sd	s0,64(sp)
+    8020605c:	0880                	addi	s0,sp,80
+    8020605e:	fca43423          	sd	a0,-56(s0)
+    80206062:	fcb43023          	sd	a1,-64(s0)
+    80206066:	87b2                	mv	a5,a2
+    80206068:	faf42e23          	sw	a5,-68(s0)
+  int i;
+  struct proc *pr = myproc();
+    8020606c:	ffffd097          	auipc	ra,0xffffd
+    80206070:	8f6080e7          	jalr	-1802(ra) # 80202962 <myproc>
+    80206074:	fea43023          	sd	a0,-32(s0)
+  char ch;
+
+  acquire(&pi->lock);
+    80206078:	fc843783          	ld	a5,-56(s0)
+    8020607c:	853e                	mv	a0,a5
+    8020607e:	ffffb097          	auipc	ra,0xffffb
+    80206082:	96a080e7          	jalr	-1686(ra) # 802009e8 <acquire>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
+    80206086:	a815                	j	802060ba <piperead+0x64>
+    if(pr->killed){
+    80206088:	fe043783          	ld	a5,-32(s0)
+    8020608c:	5b9c                	lw	a5,48(a5)
+    8020608e:	cb91                	beqz	a5,802060a2 <piperead+0x4c>
+      release(&pi->lock);
+    80206090:	fc843783          	ld	a5,-56(s0)
+    80206094:	853e                	mv	a0,a5
+    80206096:	ffffb097          	auipc	ra,0xffffb
+    8020609a:	9b6080e7          	jalr	-1610(ra) # 80200a4c <release>
+      return -1;
+    8020609e:	57fd                	li	a5,-1
+    802060a0:	a8c5                	j	80206190 <piperead+0x13a>
+    }
+    sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep
+    802060a2:	fc843783          	ld	a5,-56(s0)
+    802060a6:	21878793          	addi	a5,a5,536
+    802060aa:	fc843703          	ld	a4,-56(s0)
+    802060ae:	85ba                	mv	a1,a4
+    802060b0:	853e                	mv	a0,a5
+    802060b2:	ffffd097          	auipc	ra,0xffffd
+    802060b6:	70a080e7          	jalr	1802(ra) # 802037bc <sleep>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
+    802060ba:	fc843783          	ld	a5,-56(s0)
+    802060be:	2187a703          	lw	a4,536(a5)
+    802060c2:	fc843783          	ld	a5,-56(s0)
+    802060c6:	21c7a783          	lw	a5,540(a5)
+    802060ca:	00f71763          	bne	a4,a5,802060d8 <piperead+0x82>
+    802060ce:	fc843783          	ld	a5,-56(s0)
+    802060d2:	2247a783          	lw	a5,548(a5)
+    802060d6:	fbcd                	bnez	a5,80206088 <piperead+0x32>
+  }
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
+    802060d8:	fe042623          	sw	zero,-20(s0)
+    802060dc:	a8a5                	j	80206154 <piperead+0xfe>
+    if(pi->nread == pi->nwrite)
+    802060de:	fc843783          	ld	a5,-56(s0)
+    802060e2:	2187a703          	lw	a4,536(a5)
+    802060e6:	fc843783          	ld	a5,-56(s0)
+    802060ea:	21c7a783          	lw	a5,540(a5)
+    802060ee:	06f70c63          	beq	a4,a5,80206166 <piperead+0x110>
+      break;
+    ch = pi->data[pi->nread++ % PIPESIZE];
+    802060f2:	fc843783          	ld	a5,-56(s0)
+    802060f6:	2187a783          	lw	a5,536(a5)
+    802060fa:	2781                	sext.w	a5,a5
+    802060fc:	0017871b          	addiw	a4,a5,1
+    80206100:	0007069b          	sext.w	a3,a4
+    80206104:	fc843703          	ld	a4,-56(s0)
+    80206108:	20d72c23          	sw	a3,536(a4)
+    8020610c:	1ff7f793          	andi	a5,a5,511
+    80206110:	2781                	sext.w	a5,a5
+    80206112:	fc843703          	ld	a4,-56(s0)
+    80206116:	1782                	slli	a5,a5,0x20
+    80206118:	9381                	srli	a5,a5,0x20
+    8020611a:	97ba                	add	a5,a5,a4
+    8020611c:	0187c783          	lbu	a5,24(a5)
+    80206120:	fcf40fa3          	sb	a5,-33(s0)
+    // if(copyout(pr->pagetable, addr + i, &ch, 1) == -1)
+    if(copyout2(addr + i, &ch, 1) == -1)
+    80206124:	fec42703          	lw	a4,-20(s0)
+    80206128:	fc043783          	ld	a5,-64(s0)
+    8020612c:	97ba                	add	a5,a5,a4
+    8020612e:	fdf40713          	addi	a4,s0,-33
+    80206132:	4605                	li	a2,1
+    80206134:	85ba                	mv	a1,a4
+    80206136:	853e                	mv	a0,a5
+    80206138:	ffffc097          	auipc	ra,0xffffc
+    8020613c:	d32080e7          	jalr	-718(ra) # 80201e6a <copyout2>
+    80206140:	87aa                	mv	a5,a0
+    80206142:	873e                	mv	a4,a5
+    80206144:	57fd                	li	a5,-1
+    80206146:	02f70263          	beq	a4,a5,8020616a <piperead+0x114>
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
+    8020614a:	fec42783          	lw	a5,-20(s0)
+    8020614e:	2785                	addiw	a5,a5,1
+    80206150:	fef42623          	sw	a5,-20(s0)
+    80206154:	fec42703          	lw	a4,-20(s0)
+    80206158:	fbc42783          	lw	a5,-68(s0)
+    8020615c:	2701                	sext.w	a4,a4
+    8020615e:	2781                	sext.w	a5,a5
+    80206160:	f6f74fe3          	blt	a4,a5,802060de <piperead+0x88>
+    80206164:	a021                	j	8020616c <piperead+0x116>
+      break;
+    80206166:	0001                	nop
+    80206168:	a011                	j	8020616c <piperead+0x116>
+      break;
+    8020616a:	0001                	nop
+  }
+  wakeup(&pi->nwrite);  //DOC: piperead-wakeup
+    8020616c:	fc843783          	ld	a5,-56(s0)
+    80206170:	21c78793          	addi	a5,a5,540
+    80206174:	853e                	mv	a0,a5
+    80206176:	ffffd097          	auipc	ra,0xffffd
+    8020617a:	6da080e7          	jalr	1754(ra) # 80203850 <wakeup>
+  release(&pi->lock);
+    8020617e:	fc843783          	ld	a5,-56(s0)
+    80206182:	853e                	mv	a0,a5
+    80206184:	ffffb097          	auipc	ra,0xffffb
+    80206188:	8c8080e7          	jalr	-1848(ra) # 80200a4c <release>
+  return i;
+    8020618c:	fec42783          	lw	a5,-20(s0)
+}
+    80206190:	853e                	mv	a0,a5
+    80206192:	60a6                	ld	ra,72(sp)
+    80206194:	6406                	ld	s0,64(sp)
+    80206196:	6161                	addi	sp,sp,80
+    80206198:	8082                	ret
+
+000000008020619a <w_satp>:
+{
+    8020619a:	1101                	addi	sp,sp,-32
+    8020619c:	ec22                	sd	s0,24(sp)
+    8020619e:	1000                	addi	s0,sp,32
+    802061a0:	fea43423          	sd	a0,-24(s0)
+  asm volatile("csrw satp, %0" : : "r" (x));
+    802061a4:	fe843783          	ld	a5,-24(s0)
+    802061a8:	18079073          	csrw	satp,a5
+}
+    802061ac:	0001                	nop
+    802061ae:	6462                	ld	s0,24(sp)
+    802061b0:	6105                	addi	sp,sp,32
+    802061b2:	8082                	ret
+
+00000000802061b4 <sfence_vma>:
+{
+    802061b4:	1141                	addi	sp,sp,-16
+    802061b6:	e422                	sd	s0,8(sp)
+    802061b8:	0800                	addi	s0,sp,16
+  asm volatile("sfence.vma");
+    802061ba:	12000073          	sfence.vma
+}
+    802061be:	0001                	nop
+    802061c0:	6422                	ld	s0,8(sp)
+    802061c2:	0141                	addi	sp,sp,16
+    802061c4:	8082                	ret
+
+00000000802061c6 <loadseg>:
+// va must be page-aligned
+// and the pages from va to va+sz must already be mapped.
+// Returns 0 on success, -1 on failure.
+static int
+loadseg(pagetable_t pagetable, uint64 va, struct dirent *ep, uint offset, uint sz)
+{
+    802061c6:	7139                	addi	sp,sp,-64
+    802061c8:	fc06                	sd	ra,56(sp)
+    802061ca:	f822                	sd	s0,48(sp)
+    802061cc:	0080                	addi	s0,sp,64
+    802061ce:	fca43c23          	sd	a0,-40(s0)
+    802061d2:	fcb43823          	sd	a1,-48(s0)
+    802061d6:	fcc43423          	sd	a2,-56(s0)
+    802061da:	87b6                	mv	a5,a3
+    802061dc:	fcf42223          	sw	a5,-60(s0)
+    802061e0:	87ba                	mv	a5,a4
+    802061e2:	fcf42023          	sw	a5,-64(s0)
+  uint i, n;
+  uint64 pa;
+  if((va % PGSIZE) != 0)
+    802061e6:	fd043703          	ld	a4,-48(s0)
+    802061ea:	6785                	lui	a5,0x1
+    802061ec:	17fd                	addi	a5,a5,-1
+    802061ee:	8ff9                	and	a5,a5,a4
+    802061f0:	cb89                	beqz	a5,80206202 <loadseg+0x3c>
+    panic("loadseg: va must be page aligned");
+    802061f2:	00008517          	auipc	a0,0x8
+    802061f6:	a6e50513          	addi	a0,a0,-1426 # 8020dc60 <etext+0xc60>
+    802061fa:	ffffa097          	auipc	ra,0xffffa
+    802061fe:	24a080e7          	jalr	586(ra) # 80200444 <panic>
+
+  for(i = 0; i < sz; i += PGSIZE){
+    80206202:	fe042623          	sw	zero,-20(s0)
+    80206206:	a05d                	j	802062ac <loadseg+0xe6>
+    pa = walkaddr(pagetable, va + i);
+    80206208:	fec46703          	lwu	a4,-20(s0)
+    8020620c:	fd043783          	ld	a5,-48(s0)
+    80206210:	97ba                	add	a5,a5,a4
+    80206212:	85be                	mv	a1,a5
+    80206214:	fd843503          	ld	a0,-40(s0)
+    80206218:	ffffb097          	auipc	ra,0xffffb
+    8020621c:	284080e7          	jalr	644(ra) # 8020149c <walkaddr>
+    80206220:	fea43023          	sd	a0,-32(s0)
+    if(pa == NULL)
+    80206224:	fe043783          	ld	a5,-32(s0)
+    80206228:	eb89                	bnez	a5,8020623a <loadseg+0x74>
+      panic("loadseg: address should exist");
+    8020622a:	00008517          	auipc	a0,0x8
+    8020622e:	a5e50513          	addi	a0,a0,-1442 # 8020dc88 <etext+0xc88>
+    80206232:	ffffa097          	auipc	ra,0xffffa
+    80206236:	212080e7          	jalr	530(ra) # 80200444 <panic>
+    if(sz - i < PGSIZE)
+    8020623a:	fc042703          	lw	a4,-64(s0)
+    8020623e:	fec42783          	lw	a5,-20(s0)
+    80206242:	40f707bb          	subw	a5,a4,a5
+    80206246:	2781                	sext.w	a5,a5
+    80206248:	873e                	mv	a4,a5
+    8020624a:	6785                	lui	a5,0x1
+    8020624c:	00f77b63          	bgeu	a4,a5,80206262 <loadseg+0x9c>
+      n = sz - i;
+    80206250:	fc042703          	lw	a4,-64(s0)
+    80206254:	fec42783          	lw	a5,-20(s0)
+    80206258:	40f707bb          	subw	a5,a4,a5
+    8020625c:	fef42423          	sw	a5,-24(s0)
+    80206260:	a021                	j	80206268 <loadseg+0xa2>
+    else
+      n = PGSIZE;
+    80206262:	6785                	lui	a5,0x1
+    80206264:	fef42423          	sw	a5,-24(s0)
+    if(eread(ep, 0, (uint64)pa, offset+i, n) != n)
+    80206268:	fc442703          	lw	a4,-60(s0)
+    8020626c:	fec42783          	lw	a5,-20(s0)
+    80206270:	9fb9                	addw	a5,a5,a4
+    80206272:	2781                	sext.w	a5,a5
+    80206274:	fe842703          	lw	a4,-24(s0)
+    80206278:	86be                	mv	a3,a5
+    8020627a:	fe043603          	ld	a2,-32(s0)
+    8020627e:	4581                	li	a1,0
+    80206280:	fc843503          	ld	a0,-56(s0)
+    80206284:	00002097          	auipc	ra,0x2
+    80206288:	7aa080e7          	jalr	1962(ra) # 80208a2e <eread>
+    8020628c:	87aa                	mv	a5,a0
+    8020628e:	0007871b          	sext.w	a4,a5
+    80206292:	fe842783          	lw	a5,-24(s0)
+    80206296:	2781                	sext.w	a5,a5
+    80206298:	00e78463          	beq	a5,a4,802062a0 <loadseg+0xda>
+      return -1;
+    8020629c:	57fd                	li	a5,-1
+    8020629e:	a005                	j	802062be <loadseg+0xf8>
+  for(i = 0; i < sz; i += PGSIZE){
+    802062a0:	fec42703          	lw	a4,-20(s0)
+    802062a4:	6785                	lui	a5,0x1
+    802062a6:	9fb9                	addw	a5,a5,a4
+    802062a8:	fef42623          	sw	a5,-20(s0)
+    802062ac:	fec42703          	lw	a4,-20(s0)
+    802062b0:	fc042783          	lw	a5,-64(s0)
+    802062b4:	2701                	sext.w	a4,a4
+    802062b6:	2781                	sext.w	a5,a5
+    802062b8:	f4f768e3          	bltu	a4,a5,80206208 <loadseg+0x42>
+  }
+
+  return 0;
+    802062bc:	4781                	li	a5,0
+}
+    802062be:	853e                	mv	a0,a5
+    802062c0:	70e2                	ld	ra,56(sp)
+    802062c2:	7442                	ld	s0,48(sp)
+    802062c4:	6121                	addi	sp,sp,64
+    802062c6:	8082                	ret
+
+00000000802062c8 <exec>:
+
+
+int exec(char *path, char **argv)
+{
+    802062c8:	dc010113          	addi	sp,sp,-576
+    802062cc:	22113c23          	sd	ra,568(sp)
+    802062d0:	22813823          	sd	s0,560(sp)
+    802062d4:	22913423          	sd	s1,552(sp)
+    802062d8:	0480                	addi	s0,sp,576
+    802062da:	dca43423          	sd	a0,-568(s0)
+    802062de:	dcb43023          	sd	a1,-576(s0)
+  char *s, *last;
+  int i, off;
+  uint64 argc, sz = 0, sp, ustack[MAXARG+1], stackbase;
+    802062e2:	fa043c23          	sd	zero,-72(s0)
+  struct elfhdr elf;
+  struct dirent *ep;
+  struct proghdr ph;
+  pagetable_t pagetable = 0, oldpagetable;
+    802062e6:	fa043023          	sd	zero,-96(s0)
+  pagetable_t kpagetable = 0, oldkpagetable;
+    802062ea:	f8043823          	sd	zero,-112(s0)
+  struct proc *p = myproc();
+    802062ee:	ffffc097          	auipc	ra,0xffffc
+    802062f2:	674080e7          	jalr	1652(ra) # 80202962 <myproc>
+    802062f6:	f8a43423          	sd	a0,-120(s0)
+
+  // Make a copy of p->kpt without old user space, 
+  // but with the same kstack we are using now, which can't be changed
+  if ((kpagetable = (pagetable_t)kalloc()) == NULL) {
+    802062fa:	ffffa097          	auipc	ra,0xffffa
+    802062fe:	492080e7          	jalr	1170(ra) # 8020078c <kalloc>
+    80206302:	f8a43823          	sd	a0,-112(s0)
+    80206306:	f9043783          	ld	a5,-112(s0)
+    8020630a:	e399                	bnez	a5,80206310 <exec+0x48>
+    return -1;
+    8020630c:	57fd                	li	a5,-1
+    8020630e:	ab21                	j	80206826 <exec+0x55e>
+  }
+  memmove(kpagetable, p->kpagetable, PGSIZE);
+    80206310:	f8843783          	ld	a5,-120(s0)
+    80206314:	6fbc                	ld	a5,88(a5)
+    80206316:	6605                	lui	a2,0x1
+    80206318:	85be                	mv	a1,a5
+    8020631a:	f9043503          	ld	a0,-112(s0)
+    8020631e:	ffffb097          	auipc	ra,0xffffb
+    80206322:	8ac080e7          	jalr	-1876(ra) # 80200bca <memmove>
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    80206326:	f8042e23          	sw	zero,-100(s0)
+    8020632a:	a831                	j	80206346 <exec+0x7e>
+    kpagetable[i] = 0;
+    8020632c:	f9c42783          	lw	a5,-100(s0)
+    80206330:	078e                	slli	a5,a5,0x3
+    80206332:	f9043703          	ld	a4,-112(s0)
+    80206336:	97ba                	add	a5,a5,a4
+    80206338:	0007b023          	sd	zero,0(a5) # 1000 <_entry-0x801ff000>
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    8020633c:	f9c42783          	lw	a5,-100(s0)
+    80206340:	2785                	addiw	a5,a5,1
+    80206342:	f8f42e23          	sw	a5,-100(s0)
+    80206346:	f9c42783          	lw	a5,-100(s0)
+    8020634a:	873e                	mv	a4,a5
+    8020634c:	4785                	li	a5,1
+    8020634e:	fce7ffe3          	bgeu	a5,a4,8020632c <exec+0x64>
+  }
+
+  if((ep = ename(path)) == NULL) {
+    80206352:	dc843503          	ld	a0,-568(s0)
+    80206356:	00004097          	auipc	ra,0x4
+    8020635a:	2ea080e7          	jalr	746(ra) # 8020a640 <ename>
+    8020635e:	faa43423          	sd	a0,-88(s0)
+    80206362:	fa843783          	ld	a5,-88(s0)
+    80206366:	ef81                	bnez	a5,8020637e <exec+0xb6>
+    #ifdef DEBUG
+    printf("[exec] %s not found\n", path);
+    80206368:	dc843583          	ld	a1,-568(s0)
+    8020636c:	00008517          	auipc	a0,0x8
+    80206370:	93c50513          	addi	a0,a0,-1732 # 8020dca8 <etext+0xca8>
+    80206374:	ffffa097          	auipc	ra,0xffffa
+    80206378:	e7a080e7          	jalr	-390(ra) # 802001ee <printf>
+    #endif
+    goto bad;
+    8020637c:	a981                	j	802067cc <exec+0x504>
+  }
+  elock(ep);
+    8020637e:	fa843503          	ld	a0,-88(s0)
+    80206382:	00003097          	auipc	ra,0x3
+    80206386:	77a080e7          	jalr	1914(ra) # 80209afc <elock>
+
+  // Check ELF header
+  if(eread(ep, 0, (uint64) &elf, 0, sizeof(elf)) != sizeof(elf))
+    8020638a:	e1040793          	addi	a5,s0,-496
+    8020638e:	04000713          	li	a4,64
+    80206392:	4681                	li	a3,0
+    80206394:	863e                	mv	a2,a5
+    80206396:	4581                	li	a1,0
+    80206398:	fa843503          	ld	a0,-88(s0)
+    8020639c:	00002097          	auipc	ra,0x2
+    802063a0:	692080e7          	jalr	1682(ra) # 80208a2e <eread>
+    802063a4:	87aa                	mv	a5,a0
+    802063a6:	873e                	mv	a4,a5
+    802063a8:	04000793          	li	a5,64
+    802063ac:	3ef71363          	bne	a4,a5,80206792 <exec+0x4ca>
+    goto bad;
+  if(elf.magic != ELF_MAGIC)
+    802063b0:	e1042783          	lw	a5,-496(s0)
+    802063b4:	873e                	mv	a4,a5
+    802063b6:	464c47b7          	lui	a5,0x464c4
+    802063ba:	57f78793          	addi	a5,a5,1407 # 464c457f <_entry-0x39d3ba81>
+    802063be:	3cf71c63          	bne	a4,a5,80206796 <exec+0x4ce>
+    goto bad;
+  if((pagetable = proc_pagetable(p)) == NULL)
+    802063c2:	f8843503          	ld	a0,-120(s0)
+    802063c6:	ffffd097          	auipc	ra,0xffffd
+    802063ca:	870080e7          	jalr	-1936(ra) # 80202c36 <proc_pagetable>
+    802063ce:	faa43023          	sd	a0,-96(s0)
+    802063d2:	fa043783          	ld	a5,-96(s0)
+    802063d6:	3c078263          	beqz	a5,8020679a <exec+0x4d2>
+    goto bad;
+
+  // Load program into memory.
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
+    802063da:	fc042623          	sw	zero,-52(s0)
+    802063de:	e3043783          	ld	a5,-464(s0)
+    802063e2:	fcf42423          	sw	a5,-56(s0)
+    802063e6:	a8f1                	j	802064c2 <exec+0x1fa>
+    if(eread(ep, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
+    802063e8:	dd840793          	addi	a5,s0,-552
+    802063ec:	fc842683          	lw	a3,-56(s0)
+    802063f0:	03800713          	li	a4,56
+    802063f4:	863e                	mv	a2,a5
+    802063f6:	4581                	li	a1,0
+    802063f8:	fa843503          	ld	a0,-88(s0)
+    802063fc:	00002097          	auipc	ra,0x2
+    80206400:	632080e7          	jalr	1586(ra) # 80208a2e <eread>
+    80206404:	87aa                	mv	a5,a0
+    80206406:	873e                	mv	a4,a5
+    80206408:	03800793          	li	a5,56
+    8020640c:	38f71963          	bne	a4,a5,8020679e <exec+0x4d6>
+      goto bad;
+    if(ph.type != ELF_PROG_LOAD)
+    80206410:	dd842783          	lw	a5,-552(s0)
+    80206414:	873e                	mv	a4,a5
+    80206416:	4785                	li	a5,1
+    80206418:	08f71863          	bne	a4,a5,802064a8 <exec+0x1e0>
+      continue;
+    if(ph.memsz < ph.filesz)
+    8020641c:	e0043703          	ld	a4,-512(s0)
+    80206420:	df843783          	ld	a5,-520(s0)
+    80206424:	36f76f63          	bltu	a4,a5,802067a2 <exec+0x4da>
+      goto bad;
+    if(ph.vaddr + ph.memsz < ph.vaddr)
+    80206428:	de843703          	ld	a4,-536(s0)
+    8020642c:	e0043783          	ld	a5,-512(s0)
+    80206430:	973e                	add	a4,a4,a5
+    80206432:	de843783          	ld	a5,-536(s0)
+    80206436:	36f76863          	bltu	a4,a5,802067a6 <exec+0x4de>
+      goto bad;
+    uint64 sz1;
+    if((sz1 = uvmalloc(pagetable, kpagetable, sz, ph.vaddr + ph.memsz)) == 0)
+    8020643a:	de843703          	ld	a4,-536(s0)
+    8020643e:	e0043783          	ld	a5,-512(s0)
+    80206442:	97ba                	add	a5,a5,a4
+    80206444:	86be                	mv	a3,a5
+    80206446:	fb843603          	ld	a2,-72(s0)
+    8020644a:	f9043583          	ld	a1,-112(s0)
+    8020644e:	fa043503          	ld	a0,-96(s0)
+    80206452:	ffffb097          	auipc	ra,0xffffb
+    80206456:	47c080e7          	jalr	1148(ra) # 802018ce <uvmalloc>
+    8020645a:	f4a43c23          	sd	a0,-168(s0)
+    8020645e:	f5843783          	ld	a5,-168(s0)
+    80206462:	34078463          	beqz	a5,802067aa <exec+0x4e2>
+      goto bad;
+    sz = sz1;
+    80206466:	f5843783          	ld	a5,-168(s0)
+    8020646a:	faf43c23          	sd	a5,-72(s0)
+    if(ph.vaddr % PGSIZE != 0)
+    8020646e:	de843703          	ld	a4,-536(s0)
+    80206472:	6785                	lui	a5,0x1
+    80206474:	17fd                	addi	a5,a5,-1
+    80206476:	8ff9                	and	a5,a5,a4
+    80206478:	32079b63          	bnez	a5,802067ae <exec+0x4e6>
+      goto bad;
+    if(loadseg(pagetable, ph.vaddr, ep, ph.off, ph.filesz) < 0)
+    8020647c:	de843783          	ld	a5,-536(s0)
+    80206480:	de043703          	ld	a4,-544(s0)
+    80206484:	0007069b          	sext.w	a3,a4
+    80206488:	df843703          	ld	a4,-520(s0)
+    8020648c:	2701                	sext.w	a4,a4
+    8020648e:	fa843603          	ld	a2,-88(s0)
+    80206492:	85be                	mv	a1,a5
+    80206494:	fa043503          	ld	a0,-96(s0)
+    80206498:	00000097          	auipc	ra,0x0
+    8020649c:	d2e080e7          	jalr	-722(ra) # 802061c6 <loadseg>
+    802064a0:	87aa                	mv	a5,a0
+    802064a2:	3007c863          	bltz	a5,802067b2 <exec+0x4ea>
+    802064a6:	a011                	j	802064aa <exec+0x1e2>
+      continue;
+    802064a8:	0001                	nop
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
+    802064aa:	fcc42783          	lw	a5,-52(s0)
+    802064ae:	2785                	addiw	a5,a5,1
+    802064b0:	fcf42623          	sw	a5,-52(s0)
+    802064b4:	fc842783          	lw	a5,-56(s0)
+    802064b8:	0387879b          	addiw	a5,a5,56
+    802064bc:	2781                	sext.w	a5,a5
+    802064be:	fcf42423          	sw	a5,-56(s0)
+    802064c2:	e4845783          	lhu	a5,-440(s0)
+    802064c6:	0007871b          	sext.w	a4,a5
+    802064ca:	fcc42783          	lw	a5,-52(s0)
+    802064ce:	2781                	sext.w	a5,a5
+    802064d0:	f0e7cce3          	blt	a5,a4,802063e8 <exec+0x120>
+      goto bad;
+  }
+  eunlock(ep);
+    802064d4:	fa843503          	ld	a0,-88(s0)
+    802064d8:	00003097          	auipc	ra,0x3
+    802064dc:	66e080e7          	jalr	1646(ra) # 80209b46 <eunlock>
+  eput(ep);
+    802064e0:	fa843503          	ld	a0,-88(s0)
+    802064e4:	00003097          	auipc	ra,0x3
+    802064e8:	6c2080e7          	jalr	1730(ra) # 80209ba6 <eput>
+  ep = 0;
+    802064ec:	fa043423          	sd	zero,-88(s0)
+
+  p = myproc();
+    802064f0:	ffffc097          	auipc	ra,0xffffc
+    802064f4:	472080e7          	jalr	1138(ra) # 80202962 <myproc>
+    802064f8:	f8a43423          	sd	a0,-120(s0)
+  uint64 oldsz = p->sz;
+    802064fc:	f8843783          	ld	a5,-120(s0)
+    80206500:	67bc                	ld	a5,72(a5)
+    80206502:	f8f43023          	sd	a5,-128(s0)
+
+  // Allocate two pages at the next page boundary.
+  // Use the second as the user stack.
+  sz = PGROUNDUP(sz);
+    80206506:	fb843703          	ld	a4,-72(s0)
+    8020650a:	6785                	lui	a5,0x1
+    8020650c:	17fd                	addi	a5,a5,-1
+    8020650e:	973e                	add	a4,a4,a5
+    80206510:	77fd                	lui	a5,0xfffff
+    80206512:	8ff9                	and	a5,a5,a4
+    80206514:	faf43c23          	sd	a5,-72(s0)
+  uint64 sz1;
+  if((sz1 = uvmalloc(pagetable, kpagetable, sz, sz + 2*PGSIZE)) == 0)
+    80206518:	fb843703          	ld	a4,-72(s0)
+    8020651c:	6789                	lui	a5,0x2
+    8020651e:	97ba                	add	a5,a5,a4
+    80206520:	86be                	mv	a3,a5
+    80206522:	fb843603          	ld	a2,-72(s0)
+    80206526:	f9043583          	ld	a1,-112(s0)
+    8020652a:	fa043503          	ld	a0,-96(s0)
+    8020652e:	ffffb097          	auipc	ra,0xffffb
+    80206532:	3a0080e7          	jalr	928(ra) # 802018ce <uvmalloc>
+    80206536:	f6a43c23          	sd	a0,-136(s0)
+    8020653a:	f7843783          	ld	a5,-136(s0)
+    8020653e:	26078c63          	beqz	a5,802067b6 <exec+0x4ee>
+    goto bad;
+  sz = sz1;
+    80206542:	f7843783          	ld	a5,-136(s0)
+    80206546:	faf43c23          	sd	a5,-72(s0)
+  uvmclear(pagetable, sz-2*PGSIZE);
+    8020654a:	fb843703          	ld	a4,-72(s0)
+    8020654e:	77f9                	lui	a5,0xffffe
+    80206550:	97ba                	add	a5,a5,a4
+    80206552:	85be                	mv	a1,a5
+    80206554:	fa043503          	ld	a0,-96(s0)
+    80206558:	ffffb097          	auipc	ra,0xffffb
+    8020655c:	7ee080e7          	jalr	2030(ra) # 80201d46 <uvmclear>
+  sp = sz;
+    80206560:	fb843783          	ld	a5,-72(s0)
+    80206564:	faf43823          	sd	a5,-80(s0)
+  stackbase = sp - PGSIZE;
+    80206568:	fb043703          	ld	a4,-80(s0)
+    8020656c:	77fd                	lui	a5,0xfffff
+    8020656e:	97ba                	add	a5,a5,a4
+    80206570:	f6f43823          	sd	a5,-144(s0)
+
+  // Push argument strings, prepare rest of stack in ustack.
+  for(argc = 0; argv[argc]; argc++) {
+    80206574:	fc043023          	sd	zero,-64(s0)
+    80206578:	a845                	j	80206628 <exec+0x360>
+    if(argc >= MAXARG)
+    8020657a:	fc043703          	ld	a4,-64(s0)
+    8020657e:	47fd                	li	a5,31
+    80206580:	22e7ed63          	bltu	a5,a4,802067ba <exec+0x4f2>
+      goto bad;
+    sp -= strlen(argv[argc]) + 1;
+    80206584:	fc043783          	ld	a5,-64(s0)
+    80206588:	078e                	slli	a5,a5,0x3
+    8020658a:	dc043703          	ld	a4,-576(s0)
+    8020658e:	97ba                	add	a5,a5,a4
+    80206590:	639c                	ld	a5,0(a5)
+    80206592:	853e                	mv	a0,a5
+    80206594:	ffffb097          	auipc	ra,0xffffb
+    80206598:	8c2080e7          	jalr	-1854(ra) # 80200e56 <strlen>
+    8020659c:	87aa                	mv	a5,a0
+    8020659e:	2785                	addiw	a5,a5,1
+    802065a0:	2781                	sext.w	a5,a5
+    802065a2:	873e                	mv	a4,a5
+    802065a4:	fb043783          	ld	a5,-80(s0)
+    802065a8:	8f99                	sub	a5,a5,a4
+    802065aa:	faf43823          	sd	a5,-80(s0)
+    sp -= sp % 16; // riscv sp must be 16-byte aligned
+    802065ae:	fb043783          	ld	a5,-80(s0)
+    802065b2:	9bc1                	andi	a5,a5,-16
+    802065b4:	faf43823          	sd	a5,-80(s0)
+    if(sp < stackbase)
+    802065b8:	fb043703          	ld	a4,-80(s0)
+    802065bc:	f7043783          	ld	a5,-144(s0)
+    802065c0:	1ef76f63          	bltu	a4,a5,802067be <exec+0x4f6>
+      goto bad;
+    if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
+    802065c4:	fc043783          	ld	a5,-64(s0)
+    802065c8:	078e                	slli	a5,a5,0x3
+    802065ca:	dc043703          	ld	a4,-576(s0)
+    802065ce:	97ba                	add	a5,a5,a4
+    802065d0:	6384                	ld	s1,0(a5)
+    802065d2:	fc043783          	ld	a5,-64(s0)
+    802065d6:	078e                	slli	a5,a5,0x3
+    802065d8:	dc043703          	ld	a4,-576(s0)
+    802065dc:	97ba                	add	a5,a5,a4
+    802065de:	639c                	ld	a5,0(a5)
+    802065e0:	853e                	mv	a0,a5
+    802065e2:	ffffb097          	auipc	ra,0xffffb
+    802065e6:	874080e7          	jalr	-1932(ra) # 80200e56 <strlen>
+    802065ea:	87aa                	mv	a5,a0
+    802065ec:	2785                	addiw	a5,a5,1
+    802065ee:	2781                	sext.w	a5,a5
+    802065f0:	86be                	mv	a3,a5
+    802065f2:	8626                	mv	a2,s1
+    802065f4:	fb043583          	ld	a1,-80(s0)
+    802065f8:	fa043503          	ld	a0,-96(s0)
+    802065fc:	ffffb097          	auipc	ra,0xffffb
+    80206600:	7a0080e7          	jalr	1952(ra) # 80201d9c <copyout>
+    80206604:	87aa                	mv	a5,a0
+    80206606:	1a07ce63          	bltz	a5,802067c2 <exec+0x4fa>
+      goto bad;
+    ustack[argc] = sp;
+    8020660a:	fc043783          	ld	a5,-64(s0)
+    8020660e:	078e                	slli	a5,a5,0x3
+    80206610:	fe040713          	addi	a4,s0,-32
+    80206614:	97ba                	add	a5,a5,a4
+    80206616:	fb043703          	ld	a4,-80(s0)
+    8020661a:	e6e7b823          	sd	a4,-400(a5) # ffffffffffffee70 <kernel_end+0xffffffff7fdd1e70>
+  for(argc = 0; argv[argc]; argc++) {
+    8020661e:	fc043783          	ld	a5,-64(s0)
+    80206622:	0785                	addi	a5,a5,1
+    80206624:	fcf43023          	sd	a5,-64(s0)
+    80206628:	fc043783          	ld	a5,-64(s0)
+    8020662c:	078e                	slli	a5,a5,0x3
+    8020662e:	dc043703          	ld	a4,-576(s0)
+    80206632:	97ba                	add	a5,a5,a4
+    80206634:	639c                	ld	a5,0(a5)
+    80206636:	f3b1                	bnez	a5,8020657a <exec+0x2b2>
+  }
+  ustack[argc] = 0;
+    80206638:	fc043783          	ld	a5,-64(s0)
+    8020663c:	078e                	slli	a5,a5,0x3
+    8020663e:	fe040713          	addi	a4,s0,-32
+    80206642:	97ba                	add	a5,a5,a4
+    80206644:	e607b823          	sd	zero,-400(a5)
+
+  // push the array of argv[] pointers.
+  sp -= (argc+1) * sizeof(uint64);
+    80206648:	fc043783          	ld	a5,-64(s0)
+    8020664c:	0785                	addi	a5,a5,1
+    8020664e:	078e                	slli	a5,a5,0x3
+    80206650:	fb043703          	ld	a4,-80(s0)
+    80206654:	40f707b3          	sub	a5,a4,a5
+    80206658:	faf43823          	sd	a5,-80(s0)
+  sp -= sp % 16;
+    8020665c:	fb043783          	ld	a5,-80(s0)
+    80206660:	9bc1                	andi	a5,a5,-16
+    80206662:	faf43823          	sd	a5,-80(s0)
+  if(sp < stackbase)
+    80206666:	fb043703          	ld	a4,-80(s0)
+    8020666a:	f7043783          	ld	a5,-144(s0)
+    8020666e:	14f76c63          	bltu	a4,a5,802067c6 <exec+0x4fe>
+    goto bad;
+  if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0)
+    80206672:	fc043783          	ld	a5,-64(s0)
+    80206676:	0785                	addi	a5,a5,1
+    80206678:	00379713          	slli	a4,a5,0x3
+    8020667c:	e5040793          	addi	a5,s0,-432
+    80206680:	86ba                	mv	a3,a4
+    80206682:	863e                	mv	a2,a5
+    80206684:	fb043583          	ld	a1,-80(s0)
+    80206688:	fa043503          	ld	a0,-96(s0)
+    8020668c:	ffffb097          	auipc	ra,0xffffb
+    80206690:	710080e7          	jalr	1808(ra) # 80201d9c <copyout>
+    80206694:	87aa                	mv	a5,a0
+    80206696:	1207ca63          	bltz	a5,802067ca <exec+0x502>
+    goto bad;
+
+  // arguments to user main(argc, argv)
+  // argc is returned via the system call return
+  // value, which goes in a0.
+  p->trapframe->a1 = sp;
+    8020669a:	f8843783          	ld	a5,-120(s0)
+    8020669e:	73bc                	ld	a5,96(a5)
+    802066a0:	fb043703          	ld	a4,-80(s0)
+    802066a4:	ffb8                	sd	a4,120(a5)
+
+  // Save program name for debugging.
+  for(last=s=path; *s; s++)
+    802066a6:	dc843783          	ld	a5,-568(s0)
+    802066aa:	fcf43c23          	sd	a5,-40(s0)
+    802066ae:	fd843783          	ld	a5,-40(s0)
+    802066b2:	fcf43823          	sd	a5,-48(s0)
+    802066b6:	a025                	j	802066de <exec+0x416>
+    if(*s == '/')
+    802066b8:	fd843783          	ld	a5,-40(s0)
+    802066bc:	0007c783          	lbu	a5,0(a5)
+    802066c0:	873e                	mv	a4,a5
+    802066c2:	02f00793          	li	a5,47
+    802066c6:	00f71763          	bne	a4,a5,802066d4 <exec+0x40c>
+      last = s+1;
+    802066ca:	fd843783          	ld	a5,-40(s0)
+    802066ce:	0785                	addi	a5,a5,1
+    802066d0:	fcf43823          	sd	a5,-48(s0)
+  for(last=s=path; *s; s++)
+    802066d4:	fd843783          	ld	a5,-40(s0)
+    802066d8:	0785                	addi	a5,a5,1
+    802066da:	fcf43c23          	sd	a5,-40(s0)
+    802066de:	fd843783          	ld	a5,-40(s0)
+    802066e2:	0007c783          	lbu	a5,0(a5)
+    802066e6:	fbe9                	bnez	a5,802066b8 <exec+0x3f0>
+  safestrcpy(p->name, last, sizeof(p->name));
+    802066e8:	f8843783          	ld	a5,-120(s0)
+    802066ec:	18078793          	addi	a5,a5,384
+    802066f0:	4641                	li	a2,16
+    802066f2:	fd043583          	ld	a1,-48(s0)
+    802066f6:	853e                	mv	a0,a5
+    802066f8:	ffffa097          	auipc	ra,0xffffa
+    802066fc:	6e4080e7          	jalr	1764(ra) # 80200ddc <safestrcpy>
+    
+  // Commit to the user image.
+  oldpagetable = p->pagetable;
+    80206700:	f8843783          	ld	a5,-120(s0)
+    80206704:	6bbc                	ld	a5,80(a5)
+    80206706:	f6f43423          	sd	a5,-152(s0)
+  oldkpagetable = p->kpagetable;
+    8020670a:	f8843783          	ld	a5,-120(s0)
+    8020670e:	6fbc                	ld	a5,88(a5)
+    80206710:	f6f43023          	sd	a5,-160(s0)
+  p->pagetable = pagetable;
+    80206714:	f8843783          	ld	a5,-120(s0)
+    80206718:	fa043703          	ld	a4,-96(s0)
+    8020671c:	ebb8                	sd	a4,80(a5)
+  p->kpagetable = kpagetable;
+    8020671e:	f8843783          	ld	a5,-120(s0)
+    80206722:	f9043703          	ld	a4,-112(s0)
+    80206726:	efb8                	sd	a4,88(a5)
+  p->sz = sz;
+    80206728:	f8843783          	ld	a5,-120(s0)
+    8020672c:	fb843703          	ld	a4,-72(s0)
+    80206730:	e7b8                	sd	a4,72(a5)
+  p->trapframe->epc = elf.entry;  // initial program counter = main
+    80206732:	f8843783          	ld	a5,-120(s0)
+    80206736:	73bc                	ld	a5,96(a5)
+    80206738:	e2843703          	ld	a4,-472(s0)
+    8020673c:	ef98                	sd	a4,24(a5)
+  p->trapframe->sp = sp; // initial stack pointer
+    8020673e:	f8843783          	ld	a5,-120(s0)
+    80206742:	73bc                	ld	a5,96(a5)
+    80206744:	fb043703          	ld	a4,-80(s0)
+    80206748:	fb98                	sd	a4,48(a5)
+  proc_freepagetable(oldpagetable, oldsz);
+    8020674a:	f8043583          	ld	a1,-128(s0)
+    8020674e:	f6843503          	ld	a0,-152(s0)
+    80206752:	ffffc097          	auipc	ra,0xffffc
+    80206756:	5a4080e7          	jalr	1444(ra) # 80202cf6 <proc_freepagetable>
+  w_satp(MAKE_SATP(p->kpagetable));
+    8020675a:	f8843783          	ld	a5,-120(s0)
+    8020675e:	6fbc                	ld	a5,88(a5)
+    80206760:	00c7d713          	srli	a4,a5,0xc
+    80206764:	57fd                	li	a5,-1
+    80206766:	17fe                	slli	a5,a5,0x3f
+    80206768:	8fd9                	or	a5,a5,a4
+    8020676a:	853e                	mv	a0,a5
+    8020676c:	00000097          	auipc	ra,0x0
+    80206770:	a2e080e7          	jalr	-1490(ra) # 8020619a <w_satp>
+  sfence_vma();
+    80206774:	00000097          	auipc	ra,0x0
+    80206778:	a40080e7          	jalr	-1472(ra) # 802061b4 <sfence_vma>
+  kvmfree(oldkpagetable, 0);
+    8020677c:	4581                	li	a1,0
+    8020677e:	f6043503          	ld	a0,-160(s0)
+    80206782:	ffffc097          	auipc	ra,0xffffc
+    80206786:	bde080e7          	jalr	-1058(ra) # 80202360 <kvmfree>
+  return argc; // this ends up in a0, the first argument to main(argc, argv)
+    8020678a:	fc043783          	ld	a5,-64(s0)
+    8020678e:	2781                	sext.w	a5,a5
+    80206790:	a859                	j	80206826 <exec+0x55e>
+    goto bad;
+    80206792:	0001                	nop
+    80206794:	a825                	j	802067cc <exec+0x504>
+    goto bad;
+    80206796:	0001                	nop
+    80206798:	a815                	j	802067cc <exec+0x504>
+    goto bad;
+    8020679a:	0001                	nop
+    8020679c:	a805                	j	802067cc <exec+0x504>
+      goto bad;
+    8020679e:	0001                	nop
+    802067a0:	a035                	j	802067cc <exec+0x504>
+      goto bad;
+    802067a2:	0001                	nop
+    802067a4:	a025                	j	802067cc <exec+0x504>
+      goto bad;
+    802067a6:	0001                	nop
+    802067a8:	a015                	j	802067cc <exec+0x504>
+      goto bad;
+    802067aa:	0001                	nop
+    802067ac:	a005                	j	802067cc <exec+0x504>
+      goto bad;
+    802067ae:	0001                	nop
+    802067b0:	a831                	j	802067cc <exec+0x504>
+      goto bad;
+    802067b2:	0001                	nop
+    802067b4:	a821                	j	802067cc <exec+0x504>
+    goto bad;
+    802067b6:	0001                	nop
+    802067b8:	a811                	j	802067cc <exec+0x504>
+      goto bad;
+    802067ba:	0001                	nop
+    802067bc:	a801                	j	802067cc <exec+0x504>
+      goto bad;
+    802067be:	0001                	nop
+    802067c0:	a031                	j	802067cc <exec+0x504>
+      goto bad;
+    802067c2:	0001                	nop
+    802067c4:	a021                	j	802067cc <exec+0x504>
+    goto bad;
+    802067c6:	0001                	nop
+    802067c8:	a011                	j	802067cc <exec+0x504>
+    goto bad;
+    802067ca:	0001                	nop
+
+ bad:
+  #ifdef DEBUG
+  printf("[exec] reach bad\n");
+    802067cc:	00007517          	auipc	a0,0x7
+    802067d0:	4f450513          	addi	a0,a0,1268 # 8020dcc0 <etext+0xcc0>
+    802067d4:	ffffa097          	auipc	ra,0xffffa
+    802067d8:	a1a080e7          	jalr	-1510(ra) # 802001ee <printf>
+  #endif
+  if(pagetable)
+    802067dc:	fa043783          	ld	a5,-96(s0)
+    802067e0:	cb89                	beqz	a5,802067f2 <exec+0x52a>
+    proc_freepagetable(pagetable, sz);
+    802067e2:	fb843583          	ld	a1,-72(s0)
+    802067e6:	fa043503          	ld	a0,-96(s0)
+    802067ea:	ffffc097          	auipc	ra,0xffffc
+    802067ee:	50c080e7          	jalr	1292(ra) # 80202cf6 <proc_freepagetable>
+  if(kpagetable)
+    802067f2:	f9043783          	ld	a5,-112(s0)
+    802067f6:	cb81                	beqz	a5,80206806 <exec+0x53e>
+    kvmfree(kpagetable, 0);
+    802067f8:	4581                	li	a1,0
+    802067fa:	f9043503          	ld	a0,-112(s0)
+    802067fe:	ffffc097          	auipc	ra,0xffffc
+    80206802:	b62080e7          	jalr	-1182(ra) # 80202360 <kvmfree>
+  if(ep){
+    80206806:	fa843783          	ld	a5,-88(s0)
+    8020680a:	cf89                	beqz	a5,80206824 <exec+0x55c>
+    eunlock(ep);
+    8020680c:	fa843503          	ld	a0,-88(s0)
+    80206810:	00003097          	auipc	ra,0x3
+    80206814:	336080e7          	jalr	822(ra) # 80209b46 <eunlock>
+    eput(ep);
+    80206818:	fa843503          	ld	a0,-88(s0)
+    8020681c:	00003097          	auipc	ra,0x3
+    80206820:	38a080e7          	jalr	906(ra) # 80209ba6 <eput>
+  }
+  return -1;
+    80206824:	57fd                	li	a5,-1
+}
+    80206826:	853e                	mv	a0,a5
+    80206828:	23813083          	ld	ra,568(sp)
+    8020682c:	23013403          	ld	s0,560(sp)
+    80206830:	22813483          	ld	s1,552(sp)
+    80206834:	24010113          	addi	sp,sp,576
+    80206838:	8082                	ret
+
+000000008020683a <r_time>:
+{
+    8020683a:	1101                	addi	sp,sp,-32
+    8020683c:	ec22                	sd	s0,24(sp)
+    8020683e:	1000                	addi	s0,sp,32
+  asm volatile("rdtime %0" : "=r" (x) );
+    80206840:	c01027f3          	rdtime	a5
+    80206844:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80206848:	fe843783          	ld	a5,-24(s0)
+}
+    8020684c:	853e                	mv	a0,a5
+    8020684e:	6462                	ld	s0,24(sp)
+    80206850:	6105                	addi	sp,sp,32
+    80206852:	8082                	ret
+
+0000000080206854 <argfd>:
+
+// Fetch the nth word-sized system call argument as a file descriptor
+// and return both the descriptor and the corresponding struct file.
+static int
+argfd(int n, int *pfd, struct file **pf)
+{
+    80206854:	7139                	addi	sp,sp,-64
+    80206856:	fc06                	sd	ra,56(sp)
+    80206858:	f822                	sd	s0,48(sp)
+    8020685a:	0080                	addi	s0,sp,64
+    8020685c:	87aa                	mv	a5,a0
+    8020685e:	fcb43823          	sd	a1,-48(s0)
+    80206862:	fcc43423          	sd	a2,-56(s0)
+    80206866:	fcf42e23          	sw	a5,-36(s0)
+  int fd;
+  struct file *f;
+
+  if(argint(n, &fd) < 0)
+    8020686a:	fe440713          	addi	a4,s0,-28
+    8020686e:	fdc42783          	lw	a5,-36(s0)
+    80206872:	85ba                	mv	a1,a4
+    80206874:	853e                	mv	a0,a5
+    80206876:	ffffe097          	auipc	ra,0xffffe
+    8020687a:	f4e080e7          	jalr	-178(ra) # 802047c4 <argint>
+    8020687e:	87aa                	mv	a5,a0
+    80206880:	0007d463          	bgez	a5,80206888 <argfd+0x34>
+    return -1;
+    80206884:	57fd                	li	a5,-1
+    80206886:	a8b1                	j	802068e2 <argfd+0x8e>
+  if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == NULL)
+    80206888:	fe442783          	lw	a5,-28(s0)
+    8020688c:	0207c863          	bltz	a5,802068bc <argfd+0x68>
+    80206890:	fe442783          	lw	a5,-28(s0)
+    80206894:	873e                	mv	a4,a5
+    80206896:	47bd                	li	a5,15
+    80206898:	02e7c263          	blt	a5,a4,802068bc <argfd+0x68>
+    8020689c:	ffffc097          	auipc	ra,0xffffc
+    802068a0:	0c6080e7          	jalr	198(ra) # 80202962 <myproc>
+    802068a4:	872a                	mv	a4,a0
+    802068a6:	fe442783          	lw	a5,-28(s0)
+    802068aa:	07e9                	addi	a5,a5,26
+    802068ac:	078e                	slli	a5,a5,0x3
+    802068ae:	97ba                	add	a5,a5,a4
+    802068b0:	679c                	ld	a5,8(a5)
+    802068b2:	fef43423          	sd	a5,-24(s0)
+    802068b6:	fe843783          	ld	a5,-24(s0)
+    802068ba:	e399                	bnez	a5,802068c0 <argfd+0x6c>
+    return -1;
+    802068bc:	57fd                	li	a5,-1
+    802068be:	a015                	j	802068e2 <argfd+0x8e>
+  if(pfd)
+    802068c0:	fd043783          	ld	a5,-48(s0)
+    802068c4:	c791                	beqz	a5,802068d0 <argfd+0x7c>
+    *pfd = fd;
+    802068c6:	fe442703          	lw	a4,-28(s0)
+    802068ca:	fd043783          	ld	a5,-48(s0)
+    802068ce:	c398                	sw	a4,0(a5)
+  if(pf)
+    802068d0:	fc843783          	ld	a5,-56(s0)
+    802068d4:	c791                	beqz	a5,802068e0 <argfd+0x8c>
+    *pf = f;
+    802068d6:	fc843783          	ld	a5,-56(s0)
+    802068da:	fe843703          	ld	a4,-24(s0)
+    802068de:	e398                	sd	a4,0(a5)
+  return 0;
+    802068e0:	4781                	li	a5,0
+}
+    802068e2:	853e                	mv	a0,a5
+    802068e4:	70e2                	ld	ra,56(sp)
+    802068e6:	7442                	ld	s0,48(sp)
+    802068e8:	6121                	addi	sp,sp,64
+    802068ea:	8082                	ret
+
+00000000802068ec <fdalloc>:
+
+// Allocate a file descriptor for the given file.
+// Takes over file reference from caller on success.
+static int
+fdalloc(struct file *f)
+{
+    802068ec:	7179                	addi	sp,sp,-48
+    802068ee:	f406                	sd	ra,40(sp)
+    802068f0:	f022                	sd	s0,32(sp)
+    802068f2:	1800                	addi	s0,sp,48
+    802068f4:	fca43c23          	sd	a0,-40(s0)
+  int fd;
+  struct proc *p = myproc();
+    802068f8:	ffffc097          	auipc	ra,0xffffc
+    802068fc:	06a080e7          	jalr	106(ra) # 80202962 <myproc>
+    80206900:	fea43023          	sd	a0,-32(s0)
+
+  for(fd = 0; fd < NOFILE; fd++){
+    80206904:	fe042623          	sw	zero,-20(s0)
+    80206908:	a825                	j	80206940 <fdalloc+0x54>
+    if(p->ofile[fd] == 0){
+    8020690a:	fe043703          	ld	a4,-32(s0)
+    8020690e:	fec42783          	lw	a5,-20(s0)
+    80206912:	07e9                	addi	a5,a5,26
+    80206914:	078e                	slli	a5,a5,0x3
+    80206916:	97ba                	add	a5,a5,a4
+    80206918:	679c                	ld	a5,8(a5)
+    8020691a:	ef91                	bnez	a5,80206936 <fdalloc+0x4a>
+      p->ofile[fd] = f;
+    8020691c:	fe043703          	ld	a4,-32(s0)
+    80206920:	fec42783          	lw	a5,-20(s0)
+    80206924:	07e9                	addi	a5,a5,26
+    80206926:	078e                	slli	a5,a5,0x3
+    80206928:	97ba                	add	a5,a5,a4
+    8020692a:	fd843703          	ld	a4,-40(s0)
+    8020692e:	e798                	sd	a4,8(a5)
+      return fd;
+    80206930:	fec42783          	lw	a5,-20(s0)
+    80206934:	a831                	j	80206950 <fdalloc+0x64>
+  for(fd = 0; fd < NOFILE; fd++){
+    80206936:	fec42783          	lw	a5,-20(s0)
+    8020693a:	2785                	addiw	a5,a5,1
+    8020693c:	fef42623          	sw	a5,-20(s0)
+    80206940:	fec42783          	lw	a5,-20(s0)
+    80206944:	0007871b          	sext.w	a4,a5
+    80206948:	47bd                	li	a5,15
+    8020694a:	fce7d0e3          	bge	a5,a4,8020690a <fdalloc+0x1e>
+    }
+  }
+  return -1;
+    8020694e:	57fd                	li	a5,-1
+}
+    80206950:	853e                	mv	a0,a5
+    80206952:	70a2                	ld	ra,40(sp)
+    80206954:	7402                	ld	s0,32(sp)
+    80206956:	6145                	addi	sp,sp,48
+    80206958:	8082                	ret
+
+000000008020695a <sys_dup>:
+
+uint64
+sys_dup(void)
+{
+    8020695a:	1101                	addi	sp,sp,-32
+    8020695c:	ec06                	sd	ra,24(sp)
+    8020695e:	e822                	sd	s0,16(sp)
+    80206960:	1000                	addi	s0,sp,32
+  struct file *f;
+  int fd;
+
+  if(argfd(0, 0, &f) < 0)
+    80206962:	fe040793          	addi	a5,s0,-32
+    80206966:	863e                	mv	a2,a5
+    80206968:	4581                	li	a1,0
+    8020696a:	4501                	li	a0,0
+    8020696c:	00000097          	auipc	ra,0x0
+    80206970:	ee8080e7          	jalr	-280(ra) # 80206854 <argfd>
+    80206974:	87aa                	mv	a5,a0
+    80206976:	0007d463          	bgez	a5,8020697e <sys_dup+0x24>
+    return -1;
+    8020697a:	57fd                	li	a5,-1
+    8020697c:	a81d                	j	802069b2 <sys_dup+0x58>
+  if((fd=fdalloc(f)) < 0)
+    8020697e:	fe043783          	ld	a5,-32(s0)
+    80206982:	853e                	mv	a0,a5
+    80206984:	00000097          	auipc	ra,0x0
+    80206988:	f68080e7          	jalr	-152(ra) # 802068ec <fdalloc>
+    8020698c:	87aa                	mv	a5,a0
+    8020698e:	fef42623          	sw	a5,-20(s0)
+    80206992:	fec42783          	lw	a5,-20(s0)
+    80206996:	2781                	sext.w	a5,a5
+    80206998:	0007d463          	bgez	a5,802069a0 <sys_dup+0x46>
+    return -1;
+    8020699c:	57fd                	li	a5,-1
+    8020699e:	a811                	j	802069b2 <sys_dup+0x58>
+  filedup(f);
+    802069a0:	fe043783          	ld	a5,-32(s0)
+    802069a4:	853e                	mv	a0,a5
+    802069a6:	fffff097          	auipc	ra,0xfffff
+    802069aa:	db2080e7          	jalr	-590(ra) # 80205758 <filedup>
+  return fd;
+    802069ae:	fec42783          	lw	a5,-20(s0)
+}
+    802069b2:	853e                	mv	a0,a5
+    802069b4:	60e2                	ld	ra,24(sp)
+    802069b6:	6442                	ld	s0,16(sp)
+    802069b8:	6105                	addi	sp,sp,32
+    802069ba:	8082                	ret
+
+00000000802069bc <sys_read>:
+
+uint64
+sys_read(void)
+{
+    802069bc:	7179                	addi	sp,sp,-48
+    802069be:	f406                	sd	ra,40(sp)
+    802069c0:	f022                	sd	s0,32(sp)
+    802069c2:	1800                	addi	s0,sp,48
+  struct file *f;
+  int n;
+  uint64 p;
+
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    802069c4:	fe840793          	addi	a5,s0,-24
+    802069c8:	863e                	mv	a2,a5
+    802069ca:	4581                	li	a1,0
+    802069cc:	4501                	li	a0,0
+    802069ce:	00000097          	auipc	ra,0x0
+    802069d2:	e86080e7          	jalr	-378(ra) # 80206854 <argfd>
+    802069d6:	87aa                	mv	a5,a0
+    802069d8:	0207c863          	bltz	a5,80206a08 <sys_read+0x4c>
+    802069dc:	fe440793          	addi	a5,s0,-28
+    802069e0:	85be                	mv	a1,a5
+    802069e2:	4509                	li	a0,2
+    802069e4:	ffffe097          	auipc	ra,0xffffe
+    802069e8:	de0080e7          	jalr	-544(ra) # 802047c4 <argint>
+    802069ec:	87aa                	mv	a5,a0
+    802069ee:	0007cd63          	bltz	a5,80206a08 <sys_read+0x4c>
+    802069f2:	fd840793          	addi	a5,s0,-40
+    802069f6:	85be                	mv	a1,a5
+    802069f8:	4505                	li	a0,1
+    802069fa:	ffffe097          	auipc	ra,0xffffe
+    802069fe:	e02080e7          	jalr	-510(ra) # 802047fc <argaddr>
+    80206a02:	87aa                	mv	a5,a0
+    80206a04:	0007d463          	bgez	a5,80206a0c <sys_read+0x50>
+    return -1;
+    80206a08:	57fd                	li	a5,-1
+    80206a0a:	a839                	j	80206a28 <sys_read+0x6c>
+  return fileread(f, p, n);
+    80206a0c:	fe843783          	ld	a5,-24(s0)
+    80206a10:	fd843703          	ld	a4,-40(s0)
+    80206a14:	fe442683          	lw	a3,-28(s0)
+    80206a18:	8636                	mv	a2,a3
+    80206a1a:	85ba                	mv	a1,a4
+    80206a1c:	853e                	mv	a0,a5
+    80206a1e:	fffff097          	auipc	ra,0xfffff
+    80206a22:	f10080e7          	jalr	-240(ra) # 8020592e <fileread>
+    80206a26:	87aa                	mv	a5,a0
+}
+    80206a28:	853e                	mv	a0,a5
+    80206a2a:	70a2                	ld	ra,40(sp)
+    80206a2c:	7402                	ld	s0,32(sp)
+    80206a2e:	6145                	addi	sp,sp,48
+    80206a30:	8082                	ret
+
+0000000080206a32 <sys_write>:
+
+uint64
+sys_write(void)
+{
+    80206a32:	7179                	addi	sp,sp,-48
+    80206a34:	f406                	sd	ra,40(sp)
+    80206a36:	f022                	sd	s0,32(sp)
+    80206a38:	1800                	addi	s0,sp,48
+  struct file *f;
+  int n;
+  uint64 p;
+
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    80206a3a:	fe840793          	addi	a5,s0,-24
+    80206a3e:	863e                	mv	a2,a5
+    80206a40:	4581                	li	a1,0
+    80206a42:	4501                	li	a0,0
+    80206a44:	00000097          	auipc	ra,0x0
+    80206a48:	e10080e7          	jalr	-496(ra) # 80206854 <argfd>
+    80206a4c:	87aa                	mv	a5,a0
+    80206a4e:	0207c863          	bltz	a5,80206a7e <sys_write+0x4c>
+    80206a52:	fe440793          	addi	a5,s0,-28
+    80206a56:	85be                	mv	a1,a5
+    80206a58:	4509                	li	a0,2
+    80206a5a:	ffffe097          	auipc	ra,0xffffe
+    80206a5e:	d6a080e7          	jalr	-662(ra) # 802047c4 <argint>
+    80206a62:	87aa                	mv	a5,a0
+    80206a64:	0007cd63          	bltz	a5,80206a7e <sys_write+0x4c>
+    80206a68:	fd840793          	addi	a5,s0,-40
+    80206a6c:	85be                	mv	a1,a5
+    80206a6e:	4505                	li	a0,1
+    80206a70:	ffffe097          	auipc	ra,0xffffe
+    80206a74:	d8c080e7          	jalr	-628(ra) # 802047fc <argaddr>
+    80206a78:	87aa                	mv	a5,a0
+    80206a7a:	0007d463          	bgez	a5,80206a82 <sys_write+0x50>
+    return -1;
+    80206a7e:	57fd                	li	a5,-1
+    80206a80:	a839                	j	80206a9e <sys_write+0x6c>
+
+  return filewrite(f, p, n);
+    80206a82:	fe843783          	ld	a5,-24(s0)
+    80206a86:	fd843703          	ld	a4,-40(s0)
+    80206a8a:	fe442683          	lw	a3,-28(s0)
+    80206a8e:	8636                	mv	a2,a3
+    80206a90:	85ba                	mv	a1,a4
+    80206a92:	853e                	mv	a0,a5
+    80206a94:	fffff097          	auipc	ra,0xfffff
+    80206a98:	ffe080e7          	jalr	-2(ra) # 80205a92 <filewrite>
+    80206a9c:	87aa                	mv	a5,a0
+}
+    80206a9e:	853e                	mv	a0,a5
+    80206aa0:	70a2                	ld	ra,40(sp)
+    80206aa2:	7402                	ld	s0,32(sp)
+    80206aa4:	6145                	addi	sp,sp,48
+    80206aa6:	8082                	ret
+
+0000000080206aa8 <sys_close>:
+
+uint64
+sys_close(void)
+{
+    80206aa8:	1101                	addi	sp,sp,-32
+    80206aaa:	ec06                	sd	ra,24(sp)
+    80206aac:	e822                	sd	s0,16(sp)
+    80206aae:	1000                	addi	s0,sp,32
+  int fd;
+  struct file *f;
+
+  if(argfd(0, &fd, &f) < 0)
+    80206ab0:	fe040713          	addi	a4,s0,-32
+    80206ab4:	fec40793          	addi	a5,s0,-20
+    80206ab8:	863a                	mv	a2,a4
+    80206aba:	85be                	mv	a1,a5
+    80206abc:	4501                	li	a0,0
+    80206abe:	00000097          	auipc	ra,0x0
+    80206ac2:	d96080e7          	jalr	-618(ra) # 80206854 <argfd>
+    80206ac6:	87aa                	mv	a5,a0
+    80206ac8:	0007d463          	bgez	a5,80206ad0 <sys_close+0x28>
+    return -1;
+    80206acc:	57fd                	li	a5,-1
+    80206ace:	a02d                	j	80206af8 <sys_close+0x50>
+  myproc()->ofile[fd] = 0;
+    80206ad0:	ffffc097          	auipc	ra,0xffffc
+    80206ad4:	e92080e7          	jalr	-366(ra) # 80202962 <myproc>
+    80206ad8:	872a                	mv	a4,a0
+    80206ada:	fec42783          	lw	a5,-20(s0)
+    80206ade:	07e9                	addi	a5,a5,26
+    80206ae0:	078e                	slli	a5,a5,0x3
+    80206ae2:	97ba                	add	a5,a5,a4
+    80206ae4:	0007b423          	sd	zero,8(a5)
+  fileclose(f);
+    80206ae8:	fe043783          	ld	a5,-32(s0)
+    80206aec:	853e                	mv	a0,a5
+    80206aee:	fffff097          	auipc	ra,0xfffff
+    80206af2:	cd0080e7          	jalr	-816(ra) # 802057be <fileclose>
+  return 0;
+    80206af6:	4781                	li	a5,0
+}
+    80206af8:	853e                	mv	a0,a5
+    80206afa:	60e2                	ld	ra,24(sp)
+    80206afc:	6442                	ld	s0,16(sp)
+    80206afe:	6105                	addi	sp,sp,32
+    80206b00:	8082                	ret
+
+0000000080206b02 <sys_fstat>:
+
+uint64
+sys_fstat(void)
+{
+    80206b02:	1101                	addi	sp,sp,-32
+    80206b04:	ec06                	sd	ra,24(sp)
+    80206b06:	e822                	sd	s0,16(sp)
+    80206b08:	1000                	addi	s0,sp,32
+  struct file *f;
+  uint64 st; // user pointer to struct stat
+
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &st) < 0)
+    80206b0a:	fe840793          	addi	a5,s0,-24
+    80206b0e:	863e                	mv	a2,a5
+    80206b10:	4581                	li	a1,0
+    80206b12:	4501                	li	a0,0
+    80206b14:	00000097          	auipc	ra,0x0
+    80206b18:	d40080e7          	jalr	-704(ra) # 80206854 <argfd>
+    80206b1c:	87aa                	mv	a5,a0
+    80206b1e:	0007cd63          	bltz	a5,80206b38 <sys_fstat+0x36>
+    80206b22:	fe040793          	addi	a5,s0,-32
+    80206b26:	85be                	mv	a1,a5
+    80206b28:	4505                	li	a0,1
+    80206b2a:	ffffe097          	auipc	ra,0xffffe
+    80206b2e:	cd2080e7          	jalr	-814(ra) # 802047fc <argaddr>
+    80206b32:	87aa                	mv	a5,a0
+    80206b34:	0007d463          	bgez	a5,80206b3c <sys_fstat+0x3a>
+    return -1;
+    80206b38:	57fd                	li	a5,-1
+    80206b3a:	a821                	j	80206b52 <sys_fstat+0x50>
+  return filestat(f, st);
+    80206b3c:	fe843783          	ld	a5,-24(s0)
+    80206b40:	fe043703          	ld	a4,-32(s0)
+    80206b44:	85ba                	mv	a1,a4
+    80206b46:	853e                	mv	a0,a5
+    80206b48:	fffff097          	auipc	ra,0xfffff
+    80206b4c:	d62080e7          	jalr	-670(ra) # 802058aa <filestat>
+    80206b50:	87aa                	mv	a5,a0
+}
+    80206b52:	853e                	mv	a0,a5
+    80206b54:	60e2                	ld	ra,24(sp)
+    80206b56:	6442                	ld	s0,16(sp)
+    80206b58:	6105                	addi	sp,sp,32
+    80206b5a:	8082                	ret
+
+0000000080206b5c <create>:
+
+static struct dirent*
+create(char *path, short type, int mode)
+{
+    80206b5c:	7169                	addi	sp,sp,-304
+    80206b5e:	f606                	sd	ra,296(sp)
+    80206b60:	f222                	sd	s0,288(sp)
+    80206b62:	1a00                	addi	s0,sp,304
+    80206b64:	eca43c23          	sd	a0,-296(s0)
+    80206b68:	87ae                	mv	a5,a1
+    80206b6a:	8732                	mv	a4,a2
+    80206b6c:	ecf41b23          	sh	a5,-298(s0)
+    80206b70:	87ba                	mv	a5,a4
+    80206b72:	ecf42823          	sw	a5,-304(s0)
+  struct dirent *ep, *dp;
+  char name[FAT32_MAX_FILENAME + 1];
+
+  if((dp = enameparent(path, name)) == NULL)
+    80206b76:	ee040793          	addi	a5,s0,-288
+    80206b7a:	85be                	mv	a1,a5
+    80206b7c:	ed843503          	ld	a0,-296(s0)
+    80206b80:	00004097          	auipc	ra,0x4
+    80206b84:	aec080e7          	jalr	-1300(ra) # 8020a66c <enameparent>
+    80206b88:	fea43423          	sd	a0,-24(s0)
+    80206b8c:	fe843783          	ld	a5,-24(s0)
+    80206b90:	e399                	bnez	a5,80206b96 <create+0x3a>
+    return NULL;
+    80206b92:	4781                	li	a5,0
+    80206b94:	a8cd                	j	80206c86 <create+0x12a>
+
+  if (type == T_DIR) {
+    80206b96:	ed641783          	lh	a5,-298(s0)
+    80206b9a:	0007871b          	sext.w	a4,a5
+    80206b9e:	4785                	li	a5,1
+    80206ba0:	00f71663          	bne	a4,a5,80206bac <create+0x50>
+    mode = ATTR_DIRECTORY;
+    80206ba4:	47c1                	li	a5,16
+    80206ba6:	ecf42823          	sw	a5,-304(s0)
+    80206baa:	a019                	j	80206bb0 <create+0x54>
+  } else if (mode & O_RDONLY) {
+    mode = ATTR_READ_ONLY;
+  } else {
+    mode = 0;  
+    80206bac:	ec042823          	sw	zero,-304(s0)
+  }
+
+  elock(dp);
+    80206bb0:	fe843503          	ld	a0,-24(s0)
+    80206bb4:	00003097          	auipc	ra,0x3
+    80206bb8:	f48080e7          	jalr	-184(ra) # 80209afc <elock>
+  if ((ep = ealloc(dp, name, mode)) == NULL) {
+    80206bbc:	ed042703          	lw	a4,-304(s0)
+    80206bc0:	ee040793          	addi	a5,s0,-288
+    80206bc4:	863a                	mv	a2,a4
+    80206bc6:	85be                	mv	a1,a5
+    80206bc8:	fe843503          	ld	a0,-24(s0)
+    80206bcc:	00003097          	auipc	ra,0x3
+    80206bd0:	a18080e7          	jalr	-1512(ra) # 802095e4 <ealloc>
+    80206bd4:	fea43023          	sd	a0,-32(s0)
+    80206bd8:	fe043783          	ld	a5,-32(s0)
+    80206bdc:	ef99                	bnez	a5,80206bfa <create+0x9e>
+    eunlock(dp);
+    80206bde:	fe843503          	ld	a0,-24(s0)
+    80206be2:	00003097          	auipc	ra,0x3
+    80206be6:	f64080e7          	jalr	-156(ra) # 80209b46 <eunlock>
+    eput(dp);
+    80206bea:	fe843503          	ld	a0,-24(s0)
+    80206bee:	00003097          	auipc	ra,0x3
+    80206bf2:	fb8080e7          	jalr	-72(ra) # 80209ba6 <eput>
+    return NULL;
+    80206bf6:	4781                	li	a5,0
+    80206bf8:	a079                	j	80206c86 <create+0x12a>
+  }
+  
+  if ((type == T_DIR && !(ep->attribute & ATTR_DIRECTORY)) ||
+    80206bfa:	ed641783          	lh	a5,-298(s0)
+    80206bfe:	0007871b          	sext.w	a4,a5
+    80206c02:	4785                	li	a5,1
+    80206c04:	00f71a63          	bne	a4,a5,80206c18 <create+0xbc>
+    80206c08:	fe043783          	ld	a5,-32(s0)
+    80206c0c:	1007c783          	lbu	a5,256(a5)
+    80206c10:	2781                	sext.w	a5,a5
+    80206c12:	8bc1                	andi	a5,a5,16
+    80206c14:	2781                	sext.w	a5,a5
+    80206c16:	c385                	beqz	a5,80206c36 <create+0xda>
+    80206c18:	ed641783          	lh	a5,-298(s0)
+    80206c1c:	0007871b          	sext.w	a4,a5
+    80206c20:	4789                	li	a5,2
+    80206c22:	02f71e63          	bne	a4,a5,80206c5e <create+0x102>
+      (type == T_FILE && (ep->attribute & ATTR_DIRECTORY))) {
+    80206c26:	fe043783          	ld	a5,-32(s0)
+    80206c2a:	1007c783          	lbu	a5,256(a5)
+    80206c2e:	2781                	sext.w	a5,a5
+    80206c30:	8bc1                	andi	a5,a5,16
+    80206c32:	2781                	sext.w	a5,a5
+    80206c34:	c78d                	beqz	a5,80206c5e <create+0x102>
+    eunlock(dp);
+    80206c36:	fe843503          	ld	a0,-24(s0)
+    80206c3a:	00003097          	auipc	ra,0x3
+    80206c3e:	f0c080e7          	jalr	-244(ra) # 80209b46 <eunlock>
+    eput(ep);
+    80206c42:	fe043503          	ld	a0,-32(s0)
+    80206c46:	00003097          	auipc	ra,0x3
+    80206c4a:	f60080e7          	jalr	-160(ra) # 80209ba6 <eput>
+    eput(dp);
+    80206c4e:	fe843503          	ld	a0,-24(s0)
+    80206c52:	00003097          	auipc	ra,0x3
+    80206c56:	f54080e7          	jalr	-172(ra) # 80209ba6 <eput>
+    return NULL;
+    80206c5a:	4781                	li	a5,0
+    80206c5c:	a02d                	j	80206c86 <create+0x12a>
+  }
+
+  eunlock(dp);
+    80206c5e:	fe843503          	ld	a0,-24(s0)
+    80206c62:	00003097          	auipc	ra,0x3
+    80206c66:	ee4080e7          	jalr	-284(ra) # 80209b46 <eunlock>
+  eput(dp);
+    80206c6a:	fe843503          	ld	a0,-24(s0)
+    80206c6e:	00003097          	auipc	ra,0x3
+    80206c72:	f38080e7          	jalr	-200(ra) # 80209ba6 <eput>
+
+  elock(ep);
+    80206c76:	fe043503          	ld	a0,-32(s0)
+    80206c7a:	00003097          	auipc	ra,0x3
+    80206c7e:	e82080e7          	jalr	-382(ra) # 80209afc <elock>
+  return ep;
+    80206c82:	fe043783          	ld	a5,-32(s0)
+}
+    80206c86:	853e                	mv	a0,a5
+    80206c88:	70b2                	ld	ra,296(sp)
+    80206c8a:	7412                	ld	s0,288(sp)
+    80206c8c:	6155                	addi	sp,sp,304
+    80206c8e:	8082                	ret
+
+0000000080206c90 <sys_open>:
+
+uint64
+sys_open(void)
+{
+    80206c90:	7169                	addi	sp,sp,-304
+    80206c92:	f606                	sd	ra,296(sp)
+    80206c94:	f222                	sd	s0,288(sp)
+    80206c96:	1a00                	addi	s0,sp,304
+  char path[FAT32_MAX_PATH];
+  int fd, omode;
+  struct file *f;
+  struct dirent *ep;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argint(1, &omode) < 0)
+    80206c98:	ed840793          	addi	a5,s0,-296
+    80206c9c:	10400613          	li	a2,260
+    80206ca0:	85be                	mv	a1,a5
+    80206ca2:	4501                	li	a0,0
+    80206ca4:	ffffe097          	auipc	ra,0xffffe
+    80206ca8:	b8c080e7          	jalr	-1140(ra) # 80204830 <argstr>
+    80206cac:	87aa                	mv	a5,a0
+    80206cae:	0007cd63          	bltz	a5,80206cc8 <sys_open+0x38>
+    80206cb2:	ed440793          	addi	a5,s0,-300
+    80206cb6:	85be                	mv	a1,a5
+    80206cb8:	4505                	li	a0,1
+    80206cba:	ffffe097          	auipc	ra,0xffffe
+    80206cbe:	b0a080e7          	jalr	-1270(ra) # 802047c4 <argint>
+    80206cc2:	87aa                	mv	a5,a0
+    80206cc4:	0007d463          	bgez	a5,80206ccc <sys_open+0x3c>
+    return -1;
+    80206cc8:	57fd                	li	a5,-1
+    80206cca:	a279                	j	80206e58 <sys_open+0x1c8>
+
+  if(omode & O_CREATE){
+    80206ccc:	ed442783          	lw	a5,-300(s0)
+    80206cd0:	2007f793          	andi	a5,a5,512
+    80206cd4:	2781                	sext.w	a5,a5
+    80206cd6:	c39d                	beqz	a5,80206cfc <sys_open+0x6c>
+    ep = create(path, T_FILE, omode);
+    80206cd8:	ed442703          	lw	a4,-300(s0)
+    80206cdc:	ed840793          	addi	a5,s0,-296
+    80206ce0:	863a                	mv	a2,a4
+    80206ce2:	4589                	li	a1,2
+    80206ce4:	853e                	mv	a0,a5
+    80206ce6:	00000097          	auipc	ra,0x0
+    80206cea:	e76080e7          	jalr	-394(ra) # 80206b5c <create>
+    80206cee:	fea43423          	sd	a0,-24(s0)
+    if(ep == NULL){
+    80206cf2:	fe843783          	ld	a5,-24(s0)
+    80206cf6:	e3a5                	bnez	a5,80206d56 <sys_open+0xc6>
+      return -1;
+    80206cf8:	57fd                	li	a5,-1
+    80206cfa:	aab9                	j	80206e58 <sys_open+0x1c8>
+    }
+  } else {
+    if((ep = ename(path)) == NULL){
+    80206cfc:	ed840793          	addi	a5,s0,-296
+    80206d00:	853e                	mv	a0,a5
+    80206d02:	00004097          	auipc	ra,0x4
+    80206d06:	93e080e7          	jalr	-1730(ra) # 8020a640 <ename>
+    80206d0a:	fea43423          	sd	a0,-24(s0)
+    80206d0e:	fe843783          	ld	a5,-24(s0)
+    80206d12:	e399                	bnez	a5,80206d18 <sys_open+0x88>
+      return -1;
+    80206d14:	57fd                	li	a5,-1
+    80206d16:	a289                	j	80206e58 <sys_open+0x1c8>
+    }
+    elock(ep);
+    80206d18:	fe843503          	ld	a0,-24(s0)
+    80206d1c:	00003097          	auipc	ra,0x3
+    80206d20:	de0080e7          	jalr	-544(ra) # 80209afc <elock>
+    if((ep->attribute & ATTR_DIRECTORY) && omode != O_RDONLY){
+    80206d24:	fe843783          	ld	a5,-24(s0)
+    80206d28:	1007c783          	lbu	a5,256(a5)
+    80206d2c:	2781                	sext.w	a5,a5
+    80206d2e:	8bc1                	andi	a5,a5,16
+    80206d30:	2781                	sext.w	a5,a5
+    80206d32:	c395                	beqz	a5,80206d56 <sys_open+0xc6>
+    80206d34:	ed442783          	lw	a5,-300(s0)
+    80206d38:	cf99                	beqz	a5,80206d56 <sys_open+0xc6>
+      eunlock(ep);
+    80206d3a:	fe843503          	ld	a0,-24(s0)
+    80206d3e:	00003097          	auipc	ra,0x3
+    80206d42:	e08080e7          	jalr	-504(ra) # 80209b46 <eunlock>
+      eput(ep);
+    80206d46:	fe843503          	ld	a0,-24(s0)
+    80206d4a:	00003097          	auipc	ra,0x3
+    80206d4e:	e5c080e7          	jalr	-420(ra) # 80209ba6 <eput>
+      return -1;
+    80206d52:	57fd                	li	a5,-1
+    80206d54:	a211                	j	80206e58 <sys_open+0x1c8>
+    }
+  }
+
+  if((f = filealloc()) == NULL || (fd = fdalloc(f)) < 0){
+    80206d56:	fffff097          	auipc	ra,0xfffff
+    80206d5a:	97e080e7          	jalr	-1666(ra) # 802056d4 <filealloc>
+    80206d5e:	fea43023          	sd	a0,-32(s0)
+    80206d62:	fe043783          	ld	a5,-32(s0)
+    80206d66:	cf99                	beqz	a5,80206d84 <sys_open+0xf4>
+    80206d68:	fe043503          	ld	a0,-32(s0)
+    80206d6c:	00000097          	auipc	ra,0x0
+    80206d70:	b80080e7          	jalr	-1152(ra) # 802068ec <fdalloc>
+    80206d74:	87aa                	mv	a5,a0
+    80206d76:	fcf42e23          	sw	a5,-36(s0)
+    80206d7a:	fdc42783          	lw	a5,-36(s0)
+    80206d7e:	2781                	sext.w	a5,a5
+    80206d80:	0207d963          	bgez	a5,80206db2 <sys_open+0x122>
+    if (f) {
+    80206d84:	fe043783          	ld	a5,-32(s0)
+    80206d88:	c799                	beqz	a5,80206d96 <sys_open+0x106>
+      fileclose(f);
+    80206d8a:	fe043503          	ld	a0,-32(s0)
+    80206d8e:	fffff097          	auipc	ra,0xfffff
+    80206d92:	a30080e7          	jalr	-1488(ra) # 802057be <fileclose>
+    }
+    eunlock(ep);
+    80206d96:	fe843503          	ld	a0,-24(s0)
+    80206d9a:	00003097          	auipc	ra,0x3
+    80206d9e:	dac080e7          	jalr	-596(ra) # 80209b46 <eunlock>
+    eput(ep);
+    80206da2:	fe843503          	ld	a0,-24(s0)
+    80206da6:	00003097          	auipc	ra,0x3
+    80206daa:	e00080e7          	jalr	-512(ra) # 80209ba6 <eput>
+    return -1;
+    80206dae:	57fd                	li	a5,-1
+    80206db0:	a065                	j	80206e58 <sys_open+0x1c8>
+  }
+
+  if(!(ep->attribute & ATTR_DIRECTORY) && (omode & O_TRUNC)){
+    80206db2:	fe843783          	ld	a5,-24(s0)
+    80206db6:	1007c783          	lbu	a5,256(a5)
+    80206dba:	2781                	sext.w	a5,a5
+    80206dbc:	8bc1                	andi	a5,a5,16
+    80206dbe:	2781                	sext.w	a5,a5
+    80206dc0:	ef89                	bnez	a5,80206dda <sys_open+0x14a>
+    80206dc2:	ed442783          	lw	a5,-300(s0)
+    80206dc6:	4007f793          	andi	a5,a5,1024
+    80206dca:	2781                	sext.w	a5,a5
+    80206dcc:	c799                	beqz	a5,80206dda <sys_open+0x14a>
+    etrunc(ep);
+    80206dce:	fe843503          	ld	a0,-24(s0)
+    80206dd2:	00003097          	auipc	ra,0x3
+    80206dd6:	ca2080e7          	jalr	-862(ra) # 80209a74 <etrunc>
+  }
+
+  f->type = FD_ENTRY;
+    80206dda:	fe043783          	ld	a5,-32(s0)
+    80206dde:	4709                	li	a4,2
+    80206de0:	c398                	sw	a4,0(a5)
+  f->off = (omode & O_APPEND) ? ep->file_size : 0;
+    80206de2:	ed442783          	lw	a5,-300(s0)
+    80206de6:	8b91                	andi	a5,a5,4
+    80206de8:	2781                	sext.w	a5,a5
+    80206dea:	c791                	beqz	a5,80206df6 <sys_open+0x166>
+    80206dec:	fe843783          	ld	a5,-24(s0)
+    80206df0:	1087a783          	lw	a5,264(a5)
+    80206df4:	a011                	j	80206df8 <sys_open+0x168>
+    80206df6:	4781                	li	a5,0
+    80206df8:	fe043703          	ld	a4,-32(s0)
+    80206dfc:	d31c                	sw	a5,32(a4)
+  f->ep = ep;
+    80206dfe:	fe043783          	ld	a5,-32(s0)
+    80206e02:	fe843703          	ld	a4,-24(s0)
+    80206e06:	ef98                	sd	a4,24(a5)
+  f->readable = !(omode & O_WRONLY);
+    80206e08:	ed442783          	lw	a5,-300(s0)
+    80206e0c:	8b85                	andi	a5,a5,1
+    80206e0e:	2781                	sext.w	a5,a5
+    80206e10:	0017b793          	seqz	a5,a5
+    80206e14:	0ff7f793          	andi	a5,a5,255
+    80206e18:	873e                	mv	a4,a5
+    80206e1a:	fe043783          	ld	a5,-32(s0)
+    80206e1e:	00e78423          	sb	a4,8(a5)
+  f->writable = (omode & O_WRONLY) || (omode & O_RDWR);
+    80206e22:	ed442783          	lw	a5,-300(s0)
+    80206e26:	8b85                	andi	a5,a5,1
+    80206e28:	2781                	sext.w	a5,a5
+    80206e2a:	e791                	bnez	a5,80206e36 <sys_open+0x1a6>
+    80206e2c:	ed442783          	lw	a5,-300(s0)
+    80206e30:	8b89                	andi	a5,a5,2
+    80206e32:	2781                	sext.w	a5,a5
+    80206e34:	c399                	beqz	a5,80206e3a <sys_open+0x1aa>
+    80206e36:	4785                	li	a5,1
+    80206e38:	a011                	j	80206e3c <sys_open+0x1ac>
+    80206e3a:	4781                	li	a5,0
+    80206e3c:	0ff7f713          	andi	a4,a5,255
+    80206e40:	fe043783          	ld	a5,-32(s0)
+    80206e44:	00e784a3          	sb	a4,9(a5)
+
+  eunlock(ep);
+    80206e48:	fe843503          	ld	a0,-24(s0)
+    80206e4c:	00003097          	auipc	ra,0x3
+    80206e50:	cfa080e7          	jalr	-774(ra) # 80209b46 <eunlock>
+
+  return fd;
+    80206e54:	fdc42783          	lw	a5,-36(s0)
+}
+    80206e58:	853e                	mv	a0,a5
+    80206e5a:	70b2                	ld	ra,296(sp)
+    80206e5c:	7412                	ld	s0,288(sp)
+    80206e5e:	6155                	addi	sp,sp,304
+    80206e60:	8082                	ret
+
+0000000080206e62 <sys_mkdir>:
+
+uint64
+sys_mkdir(void)
+{
+    80206e62:	712d                	addi	sp,sp,-288
+    80206e64:	ee06                	sd	ra,280(sp)
+    80206e66:	ea22                	sd	s0,272(sp)
+    80206e68:	1200                	addi	s0,sp,288
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = create(path, T_DIR, 0)) == 0){
+    80206e6a:	ee040793          	addi	a5,s0,-288
+    80206e6e:	10400613          	li	a2,260
+    80206e72:	85be                	mv	a1,a5
+    80206e74:	4501                	li	a0,0
+    80206e76:	ffffe097          	auipc	ra,0xffffe
+    80206e7a:	9ba080e7          	jalr	-1606(ra) # 80204830 <argstr>
+    80206e7e:	87aa                	mv	a5,a0
+    80206e80:	0207c063          	bltz	a5,80206ea0 <sys_mkdir+0x3e>
+    80206e84:	ee040793          	addi	a5,s0,-288
+    80206e88:	4601                	li	a2,0
+    80206e8a:	4585                	li	a1,1
+    80206e8c:	853e                	mv	a0,a5
+    80206e8e:	00000097          	auipc	ra,0x0
+    80206e92:	cce080e7          	jalr	-818(ra) # 80206b5c <create>
+    80206e96:	fea43423          	sd	a0,-24(s0)
+    80206e9a:	fe843783          	ld	a5,-24(s0)
+    80206e9e:	e399                	bnez	a5,80206ea4 <sys_mkdir+0x42>
+    return -1;
+    80206ea0:	57fd                	li	a5,-1
+    80206ea2:	a831                	j	80206ebe <sys_mkdir+0x5c>
+  }
+  eunlock(ep);
+    80206ea4:	fe843503          	ld	a0,-24(s0)
+    80206ea8:	00003097          	auipc	ra,0x3
+    80206eac:	c9e080e7          	jalr	-866(ra) # 80209b46 <eunlock>
+  eput(ep);
+    80206eb0:	fe843503          	ld	a0,-24(s0)
+    80206eb4:	00003097          	auipc	ra,0x3
+    80206eb8:	cf2080e7          	jalr	-782(ra) # 80209ba6 <eput>
+  return 0;
+    80206ebc:	4781                	li	a5,0
+}
+    80206ebe:	853e                	mv	a0,a5
+    80206ec0:	60f2                	ld	ra,280(sp)
+    80206ec2:	6452                	ld	s0,272(sp)
+    80206ec4:	6115                	addi	sp,sp,288
+    80206ec6:	8082                	ret
+
+0000000080206ec8 <sys_chdir>:
+
+uint64
+sys_chdir(void)
+{
+    80206ec8:	7169                	addi	sp,sp,-304
+    80206eca:	f606                	sd	ra,296(sp)
+    80206ecc:	f222                	sd	s0,288(sp)
+    80206ece:	1a00                	addi	s0,sp,304
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+  struct proc *p = myproc();
+    80206ed0:	ffffc097          	auipc	ra,0xffffc
+    80206ed4:	a92080e7          	jalr	-1390(ra) # 80202962 <myproc>
+    80206ed8:	fea43423          	sd	a0,-24(s0)
+  
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = ename(path)) == NULL){
+    80206edc:	ed840793          	addi	a5,s0,-296
+    80206ee0:	10400613          	li	a2,260
+    80206ee4:	85be                	mv	a1,a5
+    80206ee6:	4501                	li	a0,0
+    80206ee8:	ffffe097          	auipc	ra,0xffffe
+    80206eec:	948080e7          	jalr	-1720(ra) # 80204830 <argstr>
+    80206ef0:	87aa                	mv	a5,a0
+    80206ef2:	0007ce63          	bltz	a5,80206f0e <sys_chdir+0x46>
+    80206ef6:	ed840793          	addi	a5,s0,-296
+    80206efa:	853e                	mv	a0,a5
+    80206efc:	00003097          	auipc	ra,0x3
+    80206f00:	744080e7          	jalr	1860(ra) # 8020a640 <ename>
+    80206f04:	fea43023          	sd	a0,-32(s0)
+    80206f08:	fe043783          	ld	a5,-32(s0)
+    80206f0c:	e399                	bnez	a5,80206f12 <sys_chdir+0x4a>
+    return -1;
+    80206f0e:	57fd                	li	a5,-1
+    80206f10:	a09d                	j	80206f76 <sys_chdir+0xae>
+  }
+  elock(ep);
+    80206f12:	fe043503          	ld	a0,-32(s0)
+    80206f16:	00003097          	auipc	ra,0x3
+    80206f1a:	be6080e7          	jalr	-1050(ra) # 80209afc <elock>
+  if(!(ep->attribute & ATTR_DIRECTORY)){
+    80206f1e:	fe043783          	ld	a5,-32(s0)
+    80206f22:	1007c783          	lbu	a5,256(a5)
+    80206f26:	2781                	sext.w	a5,a5
+    80206f28:	8bc1                	andi	a5,a5,16
+    80206f2a:	2781                	sext.w	a5,a5
+    80206f2c:	ef99                	bnez	a5,80206f4a <sys_chdir+0x82>
+    eunlock(ep);
+    80206f2e:	fe043503          	ld	a0,-32(s0)
+    80206f32:	00003097          	auipc	ra,0x3
+    80206f36:	c14080e7          	jalr	-1004(ra) # 80209b46 <eunlock>
+    eput(ep);
+    80206f3a:	fe043503          	ld	a0,-32(s0)
+    80206f3e:	00003097          	auipc	ra,0x3
+    80206f42:	c68080e7          	jalr	-920(ra) # 80209ba6 <eput>
+    return -1;
+    80206f46:	57fd                	li	a5,-1
+    80206f48:	a03d                	j	80206f76 <sys_chdir+0xae>
+  }
+  eunlock(ep);
+    80206f4a:	fe043503          	ld	a0,-32(s0)
+    80206f4e:	00003097          	auipc	ra,0x3
+    80206f52:	bf8080e7          	jalr	-1032(ra) # 80209b46 <eunlock>
+  eput(p->cwd);
+    80206f56:	fe843783          	ld	a5,-24(s0)
+    80206f5a:	1587b783          	ld	a5,344(a5)
+    80206f5e:	853e                	mv	a0,a5
+    80206f60:	00003097          	auipc	ra,0x3
+    80206f64:	c46080e7          	jalr	-954(ra) # 80209ba6 <eput>
+  p->cwd = ep;
+    80206f68:	fe843783          	ld	a5,-24(s0)
+    80206f6c:	fe043703          	ld	a4,-32(s0)
+    80206f70:	14e7bc23          	sd	a4,344(a5)
+  return 0;
+    80206f74:	4781                	li	a5,0
+}
+    80206f76:	853e                	mv	a0,a5
+    80206f78:	70b2                	ld	ra,296(sp)
+    80206f7a:	7412                	ld	s0,288(sp)
+    80206f7c:	6155                	addi	sp,sp,304
+    80206f7e:	8082                	ret
+
+0000000080206f80 <sys_pipe>:
+
+uint64
+sys_pipe(void)
+{
+    80206f80:	7139                	addi	sp,sp,-64
+    80206f82:	fc06                	sd	ra,56(sp)
+    80206f84:	f822                	sd	s0,48(sp)
+    80206f86:	0080                	addi	s0,sp,64
+  uint64 fdarray; // user pointer to array of two integers
+  struct file *rf, *wf;
+  int fd0, fd1;
+  struct proc *p = myproc();
+    80206f88:	ffffc097          	auipc	ra,0xffffc
+    80206f8c:	9da080e7          	jalr	-1574(ra) # 80202962 <myproc>
+    80206f90:	fea43423          	sd	a0,-24(s0)
+
+  if(argaddr(0, &fdarray) < 0)
+    80206f94:	fe040793          	addi	a5,s0,-32
+    80206f98:	85be                	mv	a1,a5
+    80206f9a:	4501                	li	a0,0
+    80206f9c:	ffffe097          	auipc	ra,0xffffe
+    80206fa0:	860080e7          	jalr	-1952(ra) # 802047fc <argaddr>
+    80206fa4:	87aa                	mv	a5,a0
+    80206fa6:	0007d463          	bgez	a5,80206fae <sys_pipe+0x2e>
+    return -1;
+    80206faa:	57fd                	li	a5,-1
+    80206fac:	aa21                	j	802070c4 <sys_pipe+0x144>
+  if(pipealloc(&rf, &wf) < 0)
+    80206fae:	fd040713          	addi	a4,s0,-48
+    80206fb2:	fd840793          	addi	a5,s0,-40
+    80206fb6:	85ba                	mv	a1,a4
+    80206fb8:	853e                	mv	a0,a5
+    80206fba:	fffff097          	auipc	ra,0xfffff
+    80206fbe:	d5e080e7          	jalr	-674(ra) # 80205d18 <pipealloc>
+    80206fc2:	87aa                	mv	a5,a0
+    80206fc4:	0007d463          	bgez	a5,80206fcc <sys_pipe+0x4c>
+    return -1;
+    80206fc8:	57fd                	li	a5,-1
+    80206fca:	a8ed                	j	802070c4 <sys_pipe+0x144>
+  fd0 = -1;
+    80206fcc:	57fd                	li	a5,-1
+    80206fce:	fcf42623          	sw	a5,-52(s0)
+  if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){
+    80206fd2:	fd843783          	ld	a5,-40(s0)
+    80206fd6:	853e                	mv	a0,a5
+    80206fd8:	00000097          	auipc	ra,0x0
+    80206fdc:	914080e7          	jalr	-1772(ra) # 802068ec <fdalloc>
+    80206fe0:	87aa                	mv	a5,a0
+    80206fe2:	fcf42623          	sw	a5,-52(s0)
+    80206fe6:	fcc42783          	lw	a5,-52(s0)
+    80206fea:	0207c063          	bltz	a5,8020700a <sys_pipe+0x8a>
+    80206fee:	fd043783          	ld	a5,-48(s0)
+    80206ff2:	853e                	mv	a0,a5
+    80206ff4:	00000097          	auipc	ra,0x0
+    80206ff8:	8f8080e7          	jalr	-1800(ra) # 802068ec <fdalloc>
+    80206ffc:	87aa                	mv	a5,a0
+    80206ffe:	fcf42423          	sw	a5,-56(s0)
+    80207002:	fc842783          	lw	a5,-56(s0)
+    80207006:	0207df63          	bgez	a5,80207044 <sys_pipe+0xc4>
+    if(fd0 >= 0)
+    8020700a:	fcc42783          	lw	a5,-52(s0)
+    8020700e:	0007cb63          	bltz	a5,80207024 <sys_pipe+0xa4>
+      p->ofile[fd0] = 0;
+    80207012:	fcc42783          	lw	a5,-52(s0)
+    80207016:	fe843703          	ld	a4,-24(s0)
+    8020701a:	07e9                	addi	a5,a5,26
+    8020701c:	078e                	slli	a5,a5,0x3
+    8020701e:	97ba                	add	a5,a5,a4
+    80207020:	0007b423          	sd	zero,8(a5)
+    fileclose(rf);
+    80207024:	fd843783          	ld	a5,-40(s0)
+    80207028:	853e                	mv	a0,a5
+    8020702a:	ffffe097          	auipc	ra,0xffffe
+    8020702e:	794080e7          	jalr	1940(ra) # 802057be <fileclose>
+    fileclose(wf);
+    80207032:	fd043783          	ld	a5,-48(s0)
+    80207036:	853e                	mv	a0,a5
+    80207038:	ffffe097          	auipc	ra,0xffffe
+    8020703c:	786080e7          	jalr	1926(ra) # 802057be <fileclose>
+    return -1;
+    80207040:	57fd                	li	a5,-1
+    80207042:	a049                	j	802070c4 <sys_pipe+0x144>
+  }
+  // if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+  //    copyout(p->pagetable, fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){
+  if(copyout2(fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+    80207044:	fe043783          	ld	a5,-32(s0)
+    80207048:	fcc40713          	addi	a4,s0,-52
+    8020704c:	4611                	li	a2,4
+    8020704e:	85ba                	mv	a1,a4
+    80207050:	853e                	mv	a0,a5
+    80207052:	ffffb097          	auipc	ra,0xffffb
+    80207056:	e18080e7          	jalr	-488(ra) # 80201e6a <copyout2>
+    8020705a:	87aa                	mv	a5,a0
+    8020705c:	0207c163          	bltz	a5,8020707e <sys_pipe+0xfe>
+     copyout2(fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){
+    80207060:	fe043783          	ld	a5,-32(s0)
+    80207064:	0791                	addi	a5,a5,4
+    80207066:	fc840713          	addi	a4,s0,-56
+    8020706a:	4611                	li	a2,4
+    8020706c:	85ba                	mv	a1,a4
+    8020706e:	853e                	mv	a0,a5
+    80207070:	ffffb097          	auipc	ra,0xffffb
+    80207074:	dfa080e7          	jalr	-518(ra) # 80201e6a <copyout2>
+    80207078:	87aa                	mv	a5,a0
+  if(copyout2(fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+    8020707a:	0407d463          	bgez	a5,802070c2 <sys_pipe+0x142>
+    p->ofile[fd0] = 0;
+    8020707e:	fcc42783          	lw	a5,-52(s0)
+    80207082:	fe843703          	ld	a4,-24(s0)
+    80207086:	07e9                	addi	a5,a5,26
+    80207088:	078e                	slli	a5,a5,0x3
+    8020708a:	97ba                	add	a5,a5,a4
+    8020708c:	0007b423          	sd	zero,8(a5)
+    p->ofile[fd1] = 0;
+    80207090:	fc842783          	lw	a5,-56(s0)
+    80207094:	fe843703          	ld	a4,-24(s0)
+    80207098:	07e9                	addi	a5,a5,26
+    8020709a:	078e                	slli	a5,a5,0x3
+    8020709c:	97ba                	add	a5,a5,a4
+    8020709e:	0007b423          	sd	zero,8(a5)
+    fileclose(rf);
+    802070a2:	fd843783          	ld	a5,-40(s0)
+    802070a6:	853e                	mv	a0,a5
+    802070a8:	ffffe097          	auipc	ra,0xffffe
+    802070ac:	716080e7          	jalr	1814(ra) # 802057be <fileclose>
+    fileclose(wf);
+    802070b0:	fd043783          	ld	a5,-48(s0)
+    802070b4:	853e                	mv	a0,a5
+    802070b6:	ffffe097          	auipc	ra,0xffffe
+    802070ba:	708080e7          	jalr	1800(ra) # 802057be <fileclose>
+    return -1;
+    802070be:	57fd                	li	a5,-1
+    802070c0:	a011                	j	802070c4 <sys_pipe+0x144>
+  }
+  return 0;
+    802070c2:	4781                	li	a5,0
+}
+    802070c4:	853e                	mv	a0,a5
+    802070c6:	70e2                	ld	ra,56(sp)
+    802070c8:	7442                	ld	s0,48(sp)
+    802070ca:	6121                	addi	sp,sp,64
+    802070cc:	8082                	ret
+
+00000000802070ce <sys_dev>:
+
+// To open console device.
+uint64
+sys_dev(void)
+{
+    802070ce:	7179                	addi	sp,sp,-48
+    802070d0:	f406                	sd	ra,40(sp)
+    802070d2:	f022                	sd	s0,32(sp)
+    802070d4:	1800                	addi	s0,sp,48
+  int fd, omode;
+  int major, minor;
+  struct file *f;
+
+  if(argint(0, &omode) < 0 || argint(1, &major) < 0 || argint(2, &minor) < 0){
+    802070d6:	fe040793          	addi	a5,s0,-32
+    802070da:	85be                	mv	a1,a5
+    802070dc:	4501                	li	a0,0
+    802070de:	ffffd097          	auipc	ra,0xffffd
+    802070e2:	6e6080e7          	jalr	1766(ra) # 802047c4 <argint>
+    802070e6:	87aa                	mv	a5,a0
+    802070e8:	0207c863          	bltz	a5,80207118 <sys_dev+0x4a>
+    802070ec:	fdc40793          	addi	a5,s0,-36
+    802070f0:	85be                	mv	a1,a5
+    802070f2:	4505                	li	a0,1
+    802070f4:	ffffd097          	auipc	ra,0xffffd
+    802070f8:	6d0080e7          	jalr	1744(ra) # 802047c4 <argint>
+    802070fc:	87aa                	mv	a5,a0
+    802070fe:	0007cd63          	bltz	a5,80207118 <sys_dev+0x4a>
+    80207102:	fd840793          	addi	a5,s0,-40
+    80207106:	85be                	mv	a1,a5
+    80207108:	4509                	li	a0,2
+    8020710a:	ffffd097          	auipc	ra,0xffffd
+    8020710e:	6ba080e7          	jalr	1722(ra) # 802047c4 <argint>
+    80207112:	87aa                	mv	a5,a0
+    80207114:	0007d463          	bgez	a5,8020711c <sys_dev+0x4e>
+    return -1;
+    80207118:	57fd                	li	a5,-1
+    8020711a:	a0ed                	j	80207204 <sys_dev+0x136>
+  }
+
+  if(omode & O_CREATE){
+    8020711c:	fe042783          	lw	a5,-32(s0)
+    80207120:	2007f793          	andi	a5,a5,512
+    80207124:	2781                	sext.w	a5,a5
+    80207126:	cb89                	beqz	a5,80207138 <sys_dev+0x6a>
+    panic("dev file on FAT");
+    80207128:	00007517          	auipc	a0,0x7
+    8020712c:	bb050513          	addi	a0,a0,-1104 # 8020dcd8 <etext+0xcd8>
+    80207130:	ffff9097          	auipc	ra,0xffff9
+    80207134:	314080e7          	jalr	788(ra) # 80200444 <panic>
+  }
+
+  if(major < 0 || major >= NDEV)
+    80207138:	fdc42783          	lw	a5,-36(s0)
+    8020713c:	0007c863          	bltz	a5,8020714c <sys_dev+0x7e>
+    80207140:	fdc42783          	lw	a5,-36(s0)
+    80207144:	873e                	mv	a4,a5
+    80207146:	47a5                	li	a5,9
+    80207148:	00e7d463          	bge	a5,a4,80207150 <sys_dev+0x82>
+    return -1;
+    8020714c:	57fd                	li	a5,-1
+    8020714e:	a85d                	j	80207204 <sys_dev+0x136>
+
+  if((f = filealloc()) == NULL || (fd = fdalloc(f)) < 0){
+    80207150:	ffffe097          	auipc	ra,0xffffe
+    80207154:	584080e7          	jalr	1412(ra) # 802056d4 <filealloc>
+    80207158:	fea43423          	sd	a0,-24(s0)
+    8020715c:	fe843783          	ld	a5,-24(s0)
+    80207160:	cf99                	beqz	a5,8020717e <sys_dev+0xb0>
+    80207162:	fe843503          	ld	a0,-24(s0)
+    80207166:	fffff097          	auipc	ra,0xfffff
+    8020716a:	786080e7          	jalr	1926(ra) # 802068ec <fdalloc>
+    8020716e:	87aa                	mv	a5,a0
+    80207170:	fef42223          	sw	a5,-28(s0)
+    80207174:	fe442783          	lw	a5,-28(s0)
+    80207178:	2781                	sext.w	a5,a5
+    8020717a:	0007dd63          	bgez	a5,80207194 <sys_dev+0xc6>
+    if(f)
+    8020717e:	fe843783          	ld	a5,-24(s0)
+    80207182:	c799                	beqz	a5,80207190 <sys_dev+0xc2>
+      fileclose(f);
+    80207184:	fe843503          	ld	a0,-24(s0)
+    80207188:	ffffe097          	auipc	ra,0xffffe
+    8020718c:	636080e7          	jalr	1590(ra) # 802057be <fileclose>
+    return -1;
+    80207190:	57fd                	li	a5,-1
+    80207192:	a88d                	j	80207204 <sys_dev+0x136>
+  }
+
+  f->type = FD_DEVICE;
+    80207194:	fe843783          	ld	a5,-24(s0)
+    80207198:	470d                	li	a4,3
+    8020719a:	c398                	sw	a4,0(a5)
+  f->off = 0;
+    8020719c:	fe843783          	ld	a5,-24(s0)
+    802071a0:	0207a023          	sw	zero,32(a5)
+  f->ep = 0;
+    802071a4:	fe843783          	ld	a5,-24(s0)
+    802071a8:	0007bc23          	sd	zero,24(a5)
+  f->major = major;
+    802071ac:	fdc42783          	lw	a5,-36(s0)
+    802071b0:	0107971b          	slliw	a4,a5,0x10
+    802071b4:	4107571b          	sraiw	a4,a4,0x10
+    802071b8:	fe843783          	ld	a5,-24(s0)
+    802071bc:	02e79223          	sh	a4,36(a5)
+  f->readable = !(omode & O_WRONLY);
+    802071c0:	fe042783          	lw	a5,-32(s0)
+    802071c4:	8b85                	andi	a5,a5,1
+    802071c6:	2781                	sext.w	a5,a5
+    802071c8:	0017b793          	seqz	a5,a5
+    802071cc:	0ff7f793          	andi	a5,a5,255
+    802071d0:	873e                	mv	a4,a5
+    802071d2:	fe843783          	ld	a5,-24(s0)
+    802071d6:	00e78423          	sb	a4,8(a5)
+  f->writable = (omode & O_WRONLY) || (omode & O_RDWR);
+    802071da:	fe042783          	lw	a5,-32(s0)
+    802071de:	8b85                	andi	a5,a5,1
+    802071e0:	2781                	sext.w	a5,a5
+    802071e2:	e791                	bnez	a5,802071ee <sys_dev+0x120>
+    802071e4:	fe042783          	lw	a5,-32(s0)
+    802071e8:	8b89                	andi	a5,a5,2
+    802071ea:	2781                	sext.w	a5,a5
+    802071ec:	c399                	beqz	a5,802071f2 <sys_dev+0x124>
+    802071ee:	4785                	li	a5,1
+    802071f0:	a011                	j	802071f4 <sys_dev+0x126>
+    802071f2:	4781                	li	a5,0
+    802071f4:	0ff7f713          	andi	a4,a5,255
+    802071f8:	fe843783          	ld	a5,-24(s0)
+    802071fc:	00e784a3          	sb	a4,9(a5)
+
+  return fd;
+    80207200:	fe442783          	lw	a5,-28(s0)
+}
+    80207204:	853e                	mv	a0,a5
+    80207206:	70a2                	ld	ra,40(sp)
+    80207208:	7402                	ld	s0,32(sp)
+    8020720a:	6145                	addi	sp,sp,48
+    8020720c:	8082                	ret
+
+000000008020720e <sys_readdir>:
+
+// To support ls command
+uint64
+sys_readdir(void)
+{
+    8020720e:	1101                	addi	sp,sp,-32
+    80207210:	ec06                	sd	ra,24(sp)
+    80207212:	e822                	sd	s0,16(sp)
+    80207214:	1000                	addi	s0,sp,32
+  struct file *f;
+  uint64 p;
+
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &p) < 0)
+    80207216:	fe840793          	addi	a5,s0,-24
+    8020721a:	863e                	mv	a2,a5
+    8020721c:	4581                	li	a1,0
+    8020721e:	4501                	li	a0,0
+    80207220:	fffff097          	auipc	ra,0xfffff
+    80207224:	634080e7          	jalr	1588(ra) # 80206854 <argfd>
+    80207228:	87aa                	mv	a5,a0
+    8020722a:	0007cd63          	bltz	a5,80207244 <sys_readdir+0x36>
+    8020722e:	fe040793          	addi	a5,s0,-32
+    80207232:	85be                	mv	a1,a5
+    80207234:	4505                	li	a0,1
+    80207236:	ffffd097          	auipc	ra,0xffffd
+    8020723a:	5c6080e7          	jalr	1478(ra) # 802047fc <argaddr>
+    8020723e:	87aa                	mv	a5,a0
+    80207240:	0007d463          	bgez	a5,80207248 <sys_readdir+0x3a>
+    return -1;
+    80207244:	57fd                	li	a5,-1
+    80207246:	a821                	j	8020725e <sys_readdir+0x50>
+  return dirnext(f, p);
+    80207248:	fe843783          	ld	a5,-24(s0)
+    8020724c:	fe043703          	ld	a4,-32(s0)
+    80207250:	85ba                	mv	a1,a4
+    80207252:	853e                	mv	a0,a5
+    80207254:	fffff097          	auipc	ra,0xfffff
+    80207258:	9b2080e7          	jalr	-1614(ra) # 80205c06 <dirnext>
+    8020725c:	87aa                	mv	a5,a0
+}
+    8020725e:	853e                	mv	a0,a5
+    80207260:	60e2                	ld	ra,24(sp)
+    80207262:	6442                	ld	s0,16(sp)
+    80207264:	6105                	addi	sp,sp,32
+    80207266:	8082                	ret
+
+0000000080207268 <sys_getcwd>:
+
+// get absolute cwd string
+uint64
+sys_getcwd(void)
+{
+    80207268:	714d                	addi	sp,sp,-336
+    8020726a:	e686                	sd	ra,328(sp)
+    8020726c:	e2a2                	sd	s0,320(sp)
+    8020726e:	fe26                	sd	s1,312(sp)
+    80207270:	0a80                	addi	s0,sp,336
+  uint64 addr;
+  if (argaddr(0, &addr) < 0)
+    80207272:	fc040793          	addi	a5,s0,-64
+    80207276:	85be                	mv	a1,a5
+    80207278:	4501                	li	a0,0
+    8020727a:	ffffd097          	auipc	ra,0xffffd
+    8020727e:	582080e7          	jalr	1410(ra) # 802047fc <argaddr>
+    80207282:	87aa                	mv	a5,a0
+    80207284:	0007d463          	bgez	a5,8020728c <sys_getcwd+0x24>
+    return -1;
+    80207288:	57fd                	li	a5,-1
+    8020728a:	a0fd                	j	80207378 <sys_getcwd+0x110>
+
+  struct dirent *de = myproc()->cwd;
+    8020728c:	ffffb097          	auipc	ra,0xffffb
+    80207290:	6d6080e7          	jalr	1750(ra) # 80202962 <myproc>
+    80207294:	87aa                	mv	a5,a0
+    80207296:	1587b783          	ld	a5,344(a5)
+    8020729a:	fcf43c23          	sd	a5,-40(s0)
+  char path[FAT32_MAX_PATH];
+  char *s;
+  int len;
+
+  if (de->parent == NULL) {
+    8020729e:	fd843783          	ld	a5,-40(s0)
+    802072a2:	1207b783          	ld	a5,288(a5)
+    802072a6:	eb81                	bnez	a5,802072b6 <sys_getcwd+0x4e>
+    s = "/";
+    802072a8:	00007797          	auipc	a5,0x7
+    802072ac:	a4078793          	addi	a5,a5,-1472 # 8020dce8 <etext+0xce8>
+    802072b0:	fcf43823          	sd	a5,-48(s0)
+    802072b4:	a849                	j	80207346 <sys_getcwd+0xde>
+  } else {
+    s = path + FAT32_MAX_PATH - 1;
+    802072b6:	eb840793          	addi	a5,s0,-328
+    802072ba:	10378793          	addi	a5,a5,259
+    802072be:	fcf43823          	sd	a5,-48(s0)
+    *s = '\0';
+    802072c2:	fd043783          	ld	a5,-48(s0)
+    802072c6:	00078023          	sb	zero,0(a5)
+    while (de->parent) {
+    802072ca:	a88d                	j	8020733c <sys_getcwd+0xd4>
+      len = strlen(de->filename);
+    802072cc:	fd843783          	ld	a5,-40(s0)
+    802072d0:	853e                	mv	a0,a5
+    802072d2:	ffffa097          	auipc	ra,0xffffa
+    802072d6:	b84080e7          	jalr	-1148(ra) # 80200e56 <strlen>
+    802072da:	87aa                	mv	a5,a0
+    802072dc:	fcf42623          	sw	a5,-52(s0)
+      s -= len;
+    802072e0:	fcc42783          	lw	a5,-52(s0)
+    802072e4:	40f007b3          	neg	a5,a5
+    802072e8:	fd043703          	ld	a4,-48(s0)
+    802072ec:	97ba                	add	a5,a5,a4
+    802072ee:	fcf43823          	sd	a5,-48(s0)
+      if (s <= path)          // can't reach root "/"
+    802072f2:	eb840793          	addi	a5,s0,-328
+    802072f6:	fd043703          	ld	a4,-48(s0)
+    802072fa:	00e7e463          	bltu	a5,a4,80207302 <sys_getcwd+0x9a>
+        return -1;
+    802072fe:	57fd                	li	a5,-1
+    80207300:	a8a5                	j	80207378 <sys_getcwd+0x110>
+      strncpy(s, de->filename, len);
+    80207302:	fd843783          	ld	a5,-40(s0)
+    80207306:	fcc42703          	lw	a4,-52(s0)
+    8020730a:	863a                	mv	a2,a4
+    8020730c:	85be                	mv	a1,a5
+    8020730e:	fd043503          	ld	a0,-48(s0)
+    80207312:	ffffa097          	auipc	ra,0xffffa
+    80207316:	a48080e7          	jalr	-1464(ra) # 80200d5a <strncpy>
+      *--s = '/';
+    8020731a:	fd043783          	ld	a5,-48(s0)
+    8020731e:	17fd                	addi	a5,a5,-1
+    80207320:	fcf43823          	sd	a5,-48(s0)
+    80207324:	fd043783          	ld	a5,-48(s0)
+    80207328:	02f00713          	li	a4,47
+    8020732c:	00e78023          	sb	a4,0(a5)
+      de = de->parent;
+    80207330:	fd843783          	ld	a5,-40(s0)
+    80207334:	1207b783          	ld	a5,288(a5)
+    80207338:	fcf43c23          	sd	a5,-40(s0)
+    while (de->parent) {
+    8020733c:	fd843783          	ld	a5,-40(s0)
+    80207340:	1207b783          	ld	a5,288(a5)
+    80207344:	f7c1                	bnez	a5,802072cc <sys_getcwd+0x64>
+    }
+  }
+
+  // if (copyout(myproc()->pagetable, addr, s, strlen(s) + 1) < 0)
+  if (copyout2(addr, s, strlen(s) + 1) < 0)
+    80207346:	fc043483          	ld	s1,-64(s0)
+    8020734a:	fd043503          	ld	a0,-48(s0)
+    8020734e:	ffffa097          	auipc	ra,0xffffa
+    80207352:	b08080e7          	jalr	-1272(ra) # 80200e56 <strlen>
+    80207356:	87aa                	mv	a5,a0
+    80207358:	2785                	addiw	a5,a5,1
+    8020735a:	2781                	sext.w	a5,a5
+    8020735c:	863e                	mv	a2,a5
+    8020735e:	fd043583          	ld	a1,-48(s0)
+    80207362:	8526                	mv	a0,s1
+    80207364:	ffffb097          	auipc	ra,0xffffb
+    80207368:	b06080e7          	jalr	-1274(ra) # 80201e6a <copyout2>
+    8020736c:	87aa                	mv	a5,a0
+    8020736e:	0007d463          	bgez	a5,80207376 <sys_getcwd+0x10e>
+    return -1;
+    80207372:	57fd                	li	a5,-1
+    80207374:	a011                	j	80207378 <sys_getcwd+0x110>
+  
+  return 0;
+    80207376:	4781                	li	a5,0
+
+}
+    80207378:	853e                	mv	a0,a5
+    8020737a:	60b6                	ld	ra,328(sp)
+    8020737c:	6416                	ld	s0,320(sp)
+    8020737e:	74f2                	ld	s1,312(sp)
+    80207380:	6171                	addi	sp,sp,336
+    80207382:	8082                	ret
+
+0000000080207384 <isdirempty>:
+
+// Is the directory dp empty except for "." and ".." ?
+static int
+isdirempty(struct dirent *dp)
+{
+    80207384:	7125                	addi	sp,sp,-416
+    80207386:	ef06                	sd	ra,408(sp)
+    80207388:	eb22                	sd	s0,400(sp)
+    8020738a:	1300                	addi	s0,sp,416
+    8020738c:	e6a43423          	sd	a0,-408(s0)
+  struct dirent ep;
+  int count;
+  int ret;
+  ep.valid = 0;
+    80207390:	f8041b23          	sh	zero,-106(s0)
+  ret = enext(dp, &ep, 2 * 32, &count);   // skip the "." and ".."
+    80207394:	e7c40713          	addi	a4,s0,-388
+    80207398:	e8040793          	addi	a5,s0,-384
+    8020739c:	86ba                	mv	a3,a4
+    8020739e:	04000613          	li	a2,64
+    802073a2:	85be                	mv	a1,a5
+    802073a4:	e6843503          	ld	a0,-408(s0)
+    802073a8:	00003097          	auipc	ra,0x3
+    802073ac:	c3e080e7          	jalr	-962(ra) # 80209fe6 <enext>
+    802073b0:	87aa                	mv	a5,a0
+    802073b2:	fef42623          	sw	a5,-20(s0)
+  return ret == -1;
+    802073b6:	fec42783          	lw	a5,-20(s0)
+    802073ba:	0007871b          	sext.w	a4,a5
+    802073be:	57fd                	li	a5,-1
+    802073c0:	40f707b3          	sub	a5,a4,a5
+    802073c4:	0017b793          	seqz	a5,a5
+    802073c8:	0ff7f793          	andi	a5,a5,255
+    802073cc:	2781                	sext.w	a5,a5
+}
+    802073ce:	853e                	mv	a0,a5
+    802073d0:	60fa                	ld	ra,408(sp)
+    802073d2:	645a                	ld	s0,400(sp)
+    802073d4:	611d                	addi	sp,sp,416
+    802073d6:	8082                	ret
+
+00000000802073d8 <sys_remove>:
+
+uint64
+sys_remove(void)
+{
+    802073d8:	7169                	addi	sp,sp,-304
+    802073da:	f606                	sd	ra,296(sp)
+    802073dc:	f222                	sd	s0,288(sp)
+    802073de:	1a00                	addi	s0,sp,304
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+  int len;
+  if((len = argstr(0, path, FAT32_MAX_PATH)) <= 0)
+    802073e0:	ed040793          	addi	a5,s0,-304
+    802073e4:	10400613          	li	a2,260
+    802073e8:	85be                	mv	a1,a5
+    802073ea:	4501                	li	a0,0
+    802073ec:	ffffd097          	auipc	ra,0xffffd
+    802073f0:	444080e7          	jalr	1092(ra) # 80204830 <argstr>
+    802073f4:	87aa                	mv	a5,a0
+    802073f6:	fef42223          	sw	a5,-28(s0)
+    802073fa:	fe442783          	lw	a5,-28(s0)
+    802073fe:	2781                	sext.w	a5,a5
+    80207400:	00f04463          	bgtz	a5,80207408 <sys_remove+0x30>
+    return -1;
+    80207404:	57fd                	li	a5,-1
+    80207406:	aa15                	j	8020753a <sys_remove+0x162>
+
+  char *s = path + len - 1;
+    80207408:	fe442783          	lw	a5,-28(s0)
+    8020740c:	17fd                	addi	a5,a5,-1
+    8020740e:	ed040713          	addi	a4,s0,-304
+    80207412:	97ba                	add	a5,a5,a4
+    80207414:	fef43423          	sd	a5,-24(s0)
+  while (s >= path && *s == '/') {
+    80207418:	a031                	j	80207424 <sys_remove+0x4c>
+    s--;
+    8020741a:	fe843783          	ld	a5,-24(s0)
+    8020741e:	17fd                	addi	a5,a5,-1
+    80207420:	fef43423          	sd	a5,-24(s0)
+  while (s >= path && *s == '/') {
+    80207424:	ed040793          	addi	a5,s0,-304
+    80207428:	fe843703          	ld	a4,-24(s0)
+    8020742c:	00f76b63          	bltu	a4,a5,80207442 <sys_remove+0x6a>
+    80207430:	fe843783          	ld	a5,-24(s0)
+    80207434:	0007c783          	lbu	a5,0(a5)
+    80207438:	873e                	mv	a4,a5
+    8020743a:	02f00793          	li	a5,47
+    8020743e:	fcf70ee3          	beq	a4,a5,8020741a <sys_remove+0x42>
+  }
+  if (s >= path && *s == '.' && (s == path || *--s == '/')) {
+    80207442:	ed040793          	addi	a5,s0,-304
+    80207446:	fe843703          	ld	a4,-24(s0)
+    8020744a:	04f76163          	bltu	a4,a5,8020748c <sys_remove+0xb4>
+    8020744e:	fe843783          	ld	a5,-24(s0)
+    80207452:	0007c783          	lbu	a5,0(a5)
+    80207456:	873e                	mv	a4,a5
+    80207458:	02e00793          	li	a5,46
+    8020745c:	02f71863          	bne	a4,a5,8020748c <sys_remove+0xb4>
+    80207460:	ed040793          	addi	a5,s0,-304
+    80207464:	fe843703          	ld	a4,-24(s0)
+    80207468:	02f70063          	beq	a4,a5,80207488 <sys_remove+0xb0>
+    8020746c:	fe843783          	ld	a5,-24(s0)
+    80207470:	17fd                	addi	a5,a5,-1
+    80207472:	fef43423          	sd	a5,-24(s0)
+    80207476:	fe843783          	ld	a5,-24(s0)
+    8020747a:	0007c783          	lbu	a5,0(a5)
+    8020747e:	873e                	mv	a4,a5
+    80207480:	02f00793          	li	a5,47
+    80207484:	00f71463          	bne	a4,a5,8020748c <sys_remove+0xb4>
+    return -1;
+    80207488:	57fd                	li	a5,-1
+    8020748a:	a845                	j	8020753a <sys_remove+0x162>
+  }
+  
+  if((ep = ename(path)) == NULL){
+    8020748c:	ed040793          	addi	a5,s0,-304
+    80207490:	853e                	mv	a0,a5
+    80207492:	00003097          	auipc	ra,0x3
+    80207496:	1ae080e7          	jalr	430(ra) # 8020a640 <ename>
+    8020749a:	fca43c23          	sd	a0,-40(s0)
+    8020749e:	fd843783          	ld	a5,-40(s0)
+    802074a2:	e399                	bnez	a5,802074a8 <sys_remove+0xd0>
+    return -1;
+    802074a4:	57fd                	li	a5,-1
+    802074a6:	a851                	j	8020753a <sys_remove+0x162>
+  }
+  elock(ep);
+    802074a8:	fd843503          	ld	a0,-40(s0)
+    802074ac:	00002097          	auipc	ra,0x2
+    802074b0:	650080e7          	jalr	1616(ra) # 80209afc <elock>
+  if((ep->attribute & ATTR_DIRECTORY) && !isdirempty(ep)){
+    802074b4:	fd843783          	ld	a5,-40(s0)
+    802074b8:	1007c783          	lbu	a5,256(a5)
+    802074bc:	2781                	sext.w	a5,a5
+    802074be:	8bc1                	andi	a5,a5,16
+    802074c0:	2781                	sext.w	a5,a5
+    802074c2:	c79d                	beqz	a5,802074f0 <sys_remove+0x118>
+    802074c4:	fd843503          	ld	a0,-40(s0)
+    802074c8:	00000097          	auipc	ra,0x0
+    802074cc:	ebc080e7          	jalr	-324(ra) # 80207384 <isdirempty>
+    802074d0:	87aa                	mv	a5,a0
+    802074d2:	ef99                	bnez	a5,802074f0 <sys_remove+0x118>
+      eunlock(ep);
+    802074d4:	fd843503          	ld	a0,-40(s0)
+    802074d8:	00002097          	auipc	ra,0x2
+    802074dc:	66e080e7          	jalr	1646(ra) # 80209b46 <eunlock>
+      eput(ep);
+    802074e0:	fd843503          	ld	a0,-40(s0)
+    802074e4:	00002097          	auipc	ra,0x2
+    802074e8:	6c2080e7          	jalr	1730(ra) # 80209ba6 <eput>
+      return -1;
+    802074ec:	57fd                	li	a5,-1
+    802074ee:	a0b1                	j	8020753a <sys_remove+0x162>
+  }
+  elock(ep->parent);      // Will this lead to deadlock?
+    802074f0:	fd843783          	ld	a5,-40(s0)
+    802074f4:	1207b783          	ld	a5,288(a5)
+    802074f8:	853e                	mv	a0,a5
+    802074fa:	00002097          	auipc	ra,0x2
+    802074fe:	602080e7          	jalr	1538(ra) # 80209afc <elock>
+  eremove(ep);
+    80207502:	fd843503          	ld	a0,-40(s0)
+    80207506:	00002097          	auipc	ra,0x2
+    8020750a:	46a080e7          	jalr	1130(ra) # 80209970 <eremove>
+  eunlock(ep->parent);
+    8020750e:	fd843783          	ld	a5,-40(s0)
+    80207512:	1207b783          	ld	a5,288(a5)
+    80207516:	853e                	mv	a0,a5
+    80207518:	00002097          	auipc	ra,0x2
+    8020751c:	62e080e7          	jalr	1582(ra) # 80209b46 <eunlock>
+  eunlock(ep);
+    80207520:	fd843503          	ld	a0,-40(s0)
+    80207524:	00002097          	auipc	ra,0x2
+    80207528:	622080e7          	jalr	1570(ra) # 80209b46 <eunlock>
+  eput(ep);
+    8020752c:	fd843503          	ld	a0,-40(s0)
+    80207530:	00002097          	auipc	ra,0x2
+    80207534:	676080e7          	jalr	1654(ra) # 80209ba6 <eput>
+
+  return 0;
+    80207538:	4781                	li	a5,0
+}
+    8020753a:	853e                	mv	a0,a5
+    8020753c:	70b2                	ld	ra,296(sp)
+    8020753e:	7412                	ld	s0,288(sp)
+    80207540:	6155                	addi	sp,sp,304
+    80207542:	8082                	ret
+
+0000000080207544 <sys_rename>:
+
+// Must hold too many locks at a time! It's possible to raise a deadlock.
+// Because this op takes some steps, we can't promise
+uint64
+sys_rename(void)
+{
+    80207544:	da010113          	addi	sp,sp,-608
+    80207548:	24113c23          	sd	ra,600(sp)
+    8020754c:	24813823          	sd	s0,592(sp)
+    80207550:	1480                	addi	s0,sp,608
+  char old[FAT32_MAX_PATH], new[FAT32_MAX_PATH];
+  if (argstr(0, old, FAT32_MAX_PATH) < 0 || argstr(1, new, FAT32_MAX_PATH) < 0) {
+    80207552:	eb040793          	addi	a5,s0,-336
+    80207556:	10400613          	li	a2,260
+    8020755a:	85be                	mv	a1,a5
+    8020755c:	4501                	li	a0,0
+    8020755e:	ffffd097          	auipc	ra,0xffffd
+    80207562:	2d2080e7          	jalr	722(ra) # 80204830 <argstr>
+    80207566:	87aa                	mv	a5,a0
+    80207568:	0007cf63          	bltz	a5,80207586 <sys_rename+0x42>
+    8020756c:	da840793          	addi	a5,s0,-600
+    80207570:	10400613          	li	a2,260
+    80207574:	85be                	mv	a1,a5
+    80207576:	4505                	li	a0,1
+    80207578:	ffffd097          	auipc	ra,0xffffd
+    8020757c:	2b8080e7          	jalr	696(ra) # 80204830 <argstr>
+    80207580:	87aa                	mv	a5,a0
+    80207582:	0007d463          	bgez	a5,8020758a <sys_rename+0x46>
+      return -1;
+    80207586:	57fd                	li	a5,-1
+    80207588:	a465                	j	80207830 <sys_rename+0x2ec>
+  }
+
+  struct dirent *src = NULL, *dst = NULL, *pdst = NULL;
+    8020758a:	fc043423          	sd	zero,-56(s0)
+    8020758e:	fe043423          	sd	zero,-24(s0)
+    80207592:	fe043023          	sd	zero,-32(s0)
+  int srclock = 0;
+    80207596:	fc042e23          	sw	zero,-36(s0)
+  char *name;
+  if ((src = ename(old)) == NULL || (pdst = enameparent(new, old)) == NULL
+    8020759a:	eb040793          	addi	a5,s0,-336
+    8020759e:	853e                	mv	a0,a5
+    802075a0:	00003097          	auipc	ra,0x3
+    802075a4:	0a0080e7          	jalr	160(ra) # 8020a640 <ename>
+    802075a8:	fca43423          	sd	a0,-56(s0)
+    802075ac:	fc843783          	ld	a5,-56(s0)
+    802075b0:	22078363          	beqz	a5,802077d6 <sys_rename+0x292>
+    802075b4:	eb040713          	addi	a4,s0,-336
+    802075b8:	da840793          	addi	a5,s0,-600
+    802075bc:	85ba                	mv	a1,a4
+    802075be:	853e                	mv	a0,a5
+    802075c0:	00003097          	auipc	ra,0x3
+    802075c4:	0ac080e7          	jalr	172(ra) # 8020a66c <enameparent>
+    802075c8:	fea43023          	sd	a0,-32(s0)
+    802075cc:	fe043783          	ld	a5,-32(s0)
+    802075d0:	20078363          	beqz	a5,802077d6 <sys_rename+0x292>
+      || (name = formatname(old)) == NULL) {
+    802075d4:	eb040793          	addi	a5,s0,-336
+    802075d8:	853e                	mv	a0,a5
+    802075da:	00002097          	auipc	ra,0x2
+    802075de:	946080e7          	jalr	-1722(ra) # 80208f20 <formatname>
+    802075e2:	fca43023          	sd	a0,-64(s0)
+    802075e6:	fc043783          	ld	a5,-64(s0)
+    802075ea:	1e078663          	beqz	a5,802077d6 <sys_rename+0x292>
+    goto fail;          // src doesn't exist || dst parent doesn't exist || illegal new name
+  }
+  for (struct dirent *ep = pdst; ep != NULL; ep = ep->parent) {
+    802075ee:	fe043783          	ld	a5,-32(s0)
+    802075f2:	fcf43823          	sd	a5,-48(s0)
+    802075f6:	a829                	j	80207610 <sys_rename+0xcc>
+    if (ep == src) {    // In what universe can we move a directory into its child?
+    802075f8:	fd043703          	ld	a4,-48(s0)
+    802075fc:	fc843783          	ld	a5,-56(s0)
+    80207600:	1cf70d63          	beq	a4,a5,802077da <sys_rename+0x296>
+  for (struct dirent *ep = pdst; ep != NULL; ep = ep->parent) {
+    80207604:	fd043783          	ld	a5,-48(s0)
+    80207608:	1207b783          	ld	a5,288(a5)
+    8020760c:	fcf43823          	sd	a5,-48(s0)
+    80207610:	fd043783          	ld	a5,-48(s0)
+    80207614:	f3f5                	bnez	a5,802075f8 <sys_rename+0xb4>
+      goto fail;
+    }
+  }
+
+  uint off;
+  elock(src);     // must hold child's lock before acquiring parent's, because we do so in other similar cases
+    80207616:	fc843503          	ld	a0,-56(s0)
+    8020761a:	00002097          	auipc	ra,0x2
+    8020761e:	4e2080e7          	jalr	1250(ra) # 80209afc <elock>
+  srclock = 1;
+    80207622:	4785                	li	a5,1
+    80207624:	fcf42e23          	sw	a5,-36(s0)
+  elock(pdst);
+    80207628:	fe043503          	ld	a0,-32(s0)
+    8020762c:	00002097          	auipc	ra,0x2
+    80207630:	4d0080e7          	jalr	1232(ra) # 80209afc <elock>
+  dst = dirlookup(pdst, name, &off);
+    80207634:	da440793          	addi	a5,s0,-604
+    80207638:	863e                	mv	a2,a5
+    8020763a:	fc043583          	ld	a1,-64(s0)
+    8020763e:	fe043503          	ld	a0,-32(s0)
+    80207642:	00003097          	auipc	ra,0x3
+    80207646:	b90080e7          	jalr	-1136(ra) # 8020a1d2 <dirlookup>
+    8020764a:	fea43423          	sd	a0,-24(s0)
+  if (dst != NULL) {
+    8020764e:	fe843783          	ld	a5,-24(s0)
+    80207652:	cba5                	beqz	a5,802076c2 <sys_rename+0x17e>
+    eunlock(pdst);
+    80207654:	fe043503          	ld	a0,-32(s0)
+    80207658:	00002097          	auipc	ra,0x2
+    8020765c:	4ee080e7          	jalr	1262(ra) # 80209b46 <eunlock>
+    if (src == dst) {
+    80207660:	fc843703          	ld	a4,-56(s0)
+    80207664:	fe843783          	ld	a5,-24(s0)
+    80207668:	16f70b63          	beq	a4,a5,802077de <sys_rename+0x29a>
+      goto fail;
+    } else if (src->attribute & dst->attribute & ATTR_DIRECTORY) {
+    8020766c:	fc843783          	ld	a5,-56(s0)
+    80207670:	1007c703          	lbu	a4,256(a5)
+    80207674:	fe843783          	ld	a5,-24(s0)
+    80207678:	1007c783          	lbu	a5,256(a5)
+    8020767c:	8ff9                	and	a5,a5,a4
+    8020767e:	0ff7f793          	andi	a5,a5,255
+    80207682:	2781                	sext.w	a5,a5
+    80207684:	8bc1                	andi	a5,a5,16
+    80207686:	2781                	sext.w	a5,a5
+    80207688:	14078d63          	beqz	a5,802077e2 <sys_rename+0x29e>
+      elock(dst);
+    8020768c:	fe843503          	ld	a0,-24(s0)
+    80207690:	00002097          	auipc	ra,0x2
+    80207694:	46c080e7          	jalr	1132(ra) # 80209afc <elock>
+      if (!isdirempty(dst)) {    // it's ok to overwrite an empty dir
+    80207698:	fe843503          	ld	a0,-24(s0)
+    8020769c:	00000097          	auipc	ra,0x0
+    802076a0:	ce8080e7          	jalr	-792(ra) # 80207384 <isdirempty>
+    802076a4:	87aa                	mv	a5,a0
+    802076a6:	eb81                	bnez	a5,802076b6 <sys_rename+0x172>
+        eunlock(dst);
+    802076a8:	fe843503          	ld	a0,-24(s0)
+    802076ac:	00002097          	auipc	ra,0x2
+    802076b0:	49a080e7          	jalr	1178(ra) # 80209b46 <eunlock>
+        goto fail;
+    802076b4:	aa05                	j	802077e4 <sys_rename+0x2a0>
+      }
+      elock(pdst);
+    802076b6:	fe043503          	ld	a0,-32(s0)
+    802076ba:	00002097          	auipc	ra,0x2
+    802076be:	442080e7          	jalr	1090(ra) # 80209afc <elock>
+    } else {                    // src is not a dir || dst exists and is not an dir
+      goto fail;
+    }
+  }
+
+  if (dst) {
+    802076c2:	fe843783          	ld	a5,-24(s0)
+    802076c6:	cf89                	beqz	a5,802076e0 <sys_rename+0x19c>
+    eremove(dst);
+    802076c8:	fe843503          	ld	a0,-24(s0)
+    802076cc:	00002097          	auipc	ra,0x2
+    802076d0:	2a4080e7          	jalr	676(ra) # 80209970 <eremove>
+    eunlock(dst);
+    802076d4:	fe843503          	ld	a0,-24(s0)
+    802076d8:	00002097          	auipc	ra,0x2
+    802076dc:	46e080e7          	jalr	1134(ra) # 80209b46 <eunlock>
+  }
+  memmove(src->filename, name, FAT32_MAX_FILENAME);
+    802076e0:	fc843783          	ld	a5,-56(s0)
+    802076e4:	0ff00613          	li	a2,255
+    802076e8:	fc043583          	ld	a1,-64(s0)
+    802076ec:	853e                	mv	a0,a5
+    802076ee:	ffff9097          	auipc	ra,0xffff9
+    802076f2:	4dc080e7          	jalr	1244(ra) # 80200bca <memmove>
+  emake(pdst, src, off);
+    802076f6:	da442783          	lw	a5,-604(s0)
+    802076fa:	863e                	mv	a2,a5
+    802076fc:	fc843583          	ld	a1,-56(s0)
+    80207700:	fe043503          	ld	a0,-32(s0)
+    80207704:	00002097          	auipc	ra,0x2
+    80207708:	b36080e7          	jalr	-1226(ra) # 8020923a <emake>
+  if (src->parent != pdst) {
+    8020770c:	fc843783          	ld	a5,-56(s0)
+    80207710:	1207b783          	ld	a5,288(a5)
+    80207714:	fe043703          	ld	a4,-32(s0)
+    80207718:	02f70163          	beq	a4,a5,8020773a <sys_rename+0x1f6>
+    eunlock(pdst);
+    8020771c:	fe043503          	ld	a0,-32(s0)
+    80207720:	00002097          	auipc	ra,0x2
+    80207724:	426080e7          	jalr	1062(ra) # 80209b46 <eunlock>
+    elock(src->parent);
+    80207728:	fc843783          	ld	a5,-56(s0)
+    8020772c:	1207b783          	ld	a5,288(a5)
+    80207730:	853e                	mv	a0,a5
+    80207732:	00002097          	auipc	ra,0x2
+    80207736:	3ca080e7          	jalr	970(ra) # 80209afc <elock>
+  }
+  eremove(src);
+    8020773a:	fc843503          	ld	a0,-56(s0)
+    8020773e:	00002097          	auipc	ra,0x2
+    80207742:	232080e7          	jalr	562(ra) # 80209970 <eremove>
+  eunlock(src->parent);
+    80207746:	fc843783          	ld	a5,-56(s0)
+    8020774a:	1207b783          	ld	a5,288(a5)
+    8020774e:	853e                	mv	a0,a5
+    80207750:	00002097          	auipc	ra,0x2
+    80207754:	3f6080e7          	jalr	1014(ra) # 80209b46 <eunlock>
+  struct dirent *psrc = src->parent;  // src must not be root, or it won't pass the for-loop test
+    80207758:	fc843783          	ld	a5,-56(s0)
+    8020775c:	1207b783          	ld	a5,288(a5)
+    80207760:	faf43c23          	sd	a5,-72(s0)
+  src->parent = edup(pdst);
+    80207764:	fe043503          	ld	a0,-32(s0)
+    80207768:	00002097          	auipc	ra,0x2
+    8020776c:	070080e7          	jalr	112(ra) # 802097d8 <edup>
+    80207770:	872a                	mv	a4,a0
+    80207772:	fc843783          	ld	a5,-56(s0)
+    80207776:	12e7b023          	sd	a4,288(a5)
+  src->off = off;
+    8020777a:	da442703          	lw	a4,-604(s0)
+    8020777e:	fc843783          	ld	a5,-56(s0)
+    80207782:	10e7ae23          	sw	a4,284(a5)
+  src->valid = 1;
+    80207786:	fc843783          	ld	a5,-56(s0)
+    8020778a:	4705                	li	a4,1
+    8020778c:	10e79b23          	sh	a4,278(a5)
+  eunlock(src);
+    80207790:	fc843503          	ld	a0,-56(s0)
+    80207794:	00002097          	auipc	ra,0x2
+    80207798:	3b2080e7          	jalr	946(ra) # 80209b46 <eunlock>
+
+  eput(psrc);
+    8020779c:	fb843503          	ld	a0,-72(s0)
+    802077a0:	00002097          	auipc	ra,0x2
+    802077a4:	406080e7          	jalr	1030(ra) # 80209ba6 <eput>
+  if (dst) {
+    802077a8:	fe843783          	ld	a5,-24(s0)
+    802077ac:	c799                	beqz	a5,802077ba <sys_rename+0x276>
+    eput(dst);
+    802077ae:	fe843503          	ld	a0,-24(s0)
+    802077b2:	00002097          	auipc	ra,0x2
+    802077b6:	3f4080e7          	jalr	1012(ra) # 80209ba6 <eput>
+  }
+  eput(pdst);
+    802077ba:	fe043503          	ld	a0,-32(s0)
+    802077be:	00002097          	auipc	ra,0x2
+    802077c2:	3e8080e7          	jalr	1000(ra) # 80209ba6 <eput>
+  eput(src);
+    802077c6:	fc843503          	ld	a0,-56(s0)
+    802077ca:	00002097          	auipc	ra,0x2
+    802077ce:	3dc080e7          	jalr	988(ra) # 80209ba6 <eput>
+
+  return 0;
+    802077d2:	4781                	li	a5,0
+    802077d4:	a8b1                	j	80207830 <sys_rename+0x2ec>
+    goto fail;          // src doesn't exist || dst parent doesn't exist || illegal new name
+    802077d6:	0001                	nop
+    802077d8:	a031                	j	802077e4 <sys_rename+0x2a0>
+      goto fail;
+    802077da:	0001                	nop
+    802077dc:	a021                	j	802077e4 <sys_rename+0x2a0>
+      goto fail;
+    802077de:	0001                	nop
+    802077e0:	a011                	j	802077e4 <sys_rename+0x2a0>
+      goto fail;
+    802077e2:	0001                	nop
+
+fail:
+  if (srclock)
+    802077e4:	fdc42783          	lw	a5,-36(s0)
+    802077e8:	2781                	sext.w	a5,a5
+    802077ea:	c799                	beqz	a5,802077f8 <sys_rename+0x2b4>
+    eunlock(src);
+    802077ec:	fc843503          	ld	a0,-56(s0)
+    802077f0:	00002097          	auipc	ra,0x2
+    802077f4:	356080e7          	jalr	854(ra) # 80209b46 <eunlock>
+  if (dst)
+    802077f8:	fe843783          	ld	a5,-24(s0)
+    802077fc:	c799                	beqz	a5,8020780a <sys_rename+0x2c6>
+    eput(dst);
+    802077fe:	fe843503          	ld	a0,-24(s0)
+    80207802:	00002097          	auipc	ra,0x2
+    80207806:	3a4080e7          	jalr	932(ra) # 80209ba6 <eput>
+  if (pdst)
+    8020780a:	fe043783          	ld	a5,-32(s0)
+    8020780e:	c799                	beqz	a5,8020781c <sys_rename+0x2d8>
+    eput(pdst);
+    80207810:	fe043503          	ld	a0,-32(s0)
+    80207814:	00002097          	auipc	ra,0x2
+    80207818:	392080e7          	jalr	914(ra) # 80209ba6 <eput>
+  if (src)
+    8020781c:	fc843783          	ld	a5,-56(s0)
+    80207820:	c799                	beqz	a5,8020782e <sys_rename+0x2ea>
+    eput(src);
+    80207822:	fc843503          	ld	a0,-56(s0)
+    80207826:	00002097          	auipc	ra,0x2
+    8020782a:	380080e7          	jalr	896(ra) # 80209ba6 <eput>
+  return -1;
+    8020782e:	57fd                	li	a5,-1
+}
+    80207830:	853e                	mv	a0,a5
+    80207832:	25813083          	ld	ra,600(sp)
+    80207836:	25013403          	ld	s0,592(sp)
+    8020783a:	26010113          	addi	sp,sp,608
+    8020783e:	8082                	ret
+
+0000000080207840 <sys_uname>:
+
+uint64
+sys_uname(void){
+    80207840:	1101                	addi	sp,sp,-32
+    80207842:	ec06                	sd	ra,24(sp)
+    80207844:	e822                	sd	s0,16(sp)
+    80207846:	1000                	addi	s0,sp,32
+  uint64 sys_uname;
+  if(argaddr(0, &sys_uname) < 0)
+    80207848:	fe840793          	addi	a5,s0,-24
+    8020784c:	85be                	mv	a1,a5
+    8020784e:	4501                	li	a0,0
+    80207850:	ffffd097          	auipc	ra,0xffffd
+    80207854:	fac080e7          	jalr	-84(ra) # 802047fc <argaddr>
+    80207858:	87aa                	mv	a5,a0
+    8020785a:	0007d463          	bgez	a5,80207862 <sys_uname+0x22>
+    return -1;
+    8020785e:	57fd                	li	a5,-1
+    80207860:	a809                	j	80207872 <sys_uname+0x32>
+  return do_uname(sys_uname);
+    80207862:	fe843783          	ld	a5,-24(s0)
+    80207866:	853e                	mv	a0,a5
+    80207868:	00003097          	auipc	ra,0x3
+    8020786c:	53a080e7          	jalr	1338(ra) # 8020ada2 <do_uname>
+    80207870:	87aa                	mv	a5,a0
+}
+    80207872:	853e                	mv	a0,a5
+    80207874:	60e2                	ld	ra,24(sp)
+    80207876:	6442                	ld	s0,16(sp)
+    80207878:	6105                	addi	sp,sp,32
+    8020787a:	8082                	ret
+
+000000008020787c <sys_gettimeofday>:
+
+
+uint64
+sys_gettimeofday(void){
+    8020787c:	7179                	addi	sp,sp,-48
+    8020787e:	f406                	sd	ra,40(sp)
+    80207880:	f022                	sd	s0,32(sp)
+    80207882:	1800                	addi	s0,sp,48
+
+  uint64 ptval;               
+	if (argaddr(0, &ptval) < 0) {
+    80207884:	fd840793          	addi	a5,s0,-40
+    80207888:	85be                	mv	a1,a5
+    8020788a:	4501                	li	a0,0
+    8020788c:	ffffd097          	auipc	ra,0xffffd
+    80207890:	f70080e7          	jalr	-144(ra) # 802047fc <argaddr>
+    80207894:	87aa                	mv	a5,a0
+    80207896:	0007d463          	bgez	a5,8020789e <sys_gettimeofday+0x22>
+		return -1;
+    8020789a:	57fd                	li	a5,-1
+    8020789c:	a899                	j	802078f2 <sys_gettimeofday+0x76>
+	}
+  
+  TimeVal *tval =( TimeVal *)ptval;   
+    8020789e:	fd843783          	ld	a5,-40(s0)
+    802078a2:	fef43423          	sd	a5,-24(s0)
+//莫名其妙,这里又没有调用测试用例中的结构体,为什么要用这种方式?
+//删去另立,传值失败了。大概知道怎么回事了。
+//不对,还是要用测试用例中的结构体,不然怎么传值,这次的传值结构体在syscall的get_time里。
+
+	uint64 tmp_ticks = r_time();                //获取当前的ticks数
+    802078a6:	fffff097          	auipc	ra,0xfffff
+    802078aa:	f94080e7          	jalr	-108(ra) # 8020683a <r_time>
+    802078ae:	fea43023          	sd	a0,-32(s0)
+	tval->sec = tmp_ticks / CLK_FREQ;             //秒数等于中断数除以中断频率
+    802078b2:	fe043703          	ld	a4,-32(s0)
+    802078b6:	00bec7b7          	lui	a5,0xbec
+    802078ba:	c2078793          	addi	a5,a5,-992 # bebc20 <_entry-0x7f6143e0>
+    802078be:	02f75733          	divu	a4,a4,a5
+    802078c2:	fe843783          	ld	a5,-24(s0)
+    802078c6:	e398                	sd	a4,0(a5)
+	tval->usec = tmp_ticks / (CLK_FREQ / 1000000); //注意,微妙数不能直接用秒*1000000,会影响精度,应当求出每微秒的中断次数再除
+    802078c8:	fe043703          	ld	a4,-32(s0)
+    802078cc:	47b1                	li	a5,12
+    802078ce:	02f75733          	divu	a4,a4,a5
+    802078d2:	fe843783          	ld	a5,-24(s0)
+    802078d6:	e798                	sd	a4,8(a5)
+  tval->usec = (tval->usec % 1000000) ;     //取余
+    802078d8:	fe843783          	ld	a5,-24(s0)
+    802078dc:	6798                	ld	a4,8(a5)
+    802078de:	000f47b7          	lui	a5,0xf4
+    802078e2:	24078793          	addi	a5,a5,576 # f4240 <_entry-0x8010bdc0>
+    802078e6:	02f77733          	remu	a4,a4,a5
+    802078ea:	fe843783          	ld	a5,-24(s0)
+    802078ee:	e798                	sd	a4,8(a5)
+	return 0;
+    802078f0:	4781                	li	a5,0
+}
+    802078f2:	853e                	mv	a0,a5
+    802078f4:	70a2                	ld	ra,40(sp)
+    802078f6:	7402                	ld	s0,32(sp)
+    802078f8:	6145                	addi	sp,sp,48
+    802078fa:	8082                	ret
+
+00000000802078fc <sys_nanosleep>:
+
+uint64
+sys_nanosleep(void){
+    802078fc:	7179                	addi	sp,sp,-48
+    802078fe:	f406                	sd	ra,40(sp)
+    80207900:	f022                	sd	s0,32(sp)
+    80207902:	1800                	addi	s0,sp,48
+  uint64 addr;                  //老样子,需要给测试用例中的结构体传递值先给一个地址
+  TimeVal *tv;
+  struct proc *p = myproc();
+    80207904:	ffffb097          	auipc	ra,0xffffb
+    80207908:	05e080e7          	jalr	94(ra) # 80202962 <myproc>
+    8020790c:	fea43423          	sd	a0,-24(s0)
+  if(argaddr(0, &addr) < 0)   //利用argaddr获取传递来的休眠秒数(不过为什么要传两个?只用一个加可以了。)
+    80207910:	fd840793          	addi	a5,s0,-40
+    80207914:	85be                	mv	a1,a5
+    80207916:	4501                	li	a0,0
+    80207918:	ffffd097          	auipc	ra,0xffffd
+    8020791c:	ee4080e7          	jalr	-284(ra) # 802047fc <argaddr>
+    80207920:	87aa                	mv	a5,a0
+    80207922:	0007d463          	bgez	a5,8020792a <sys_nanosleep+0x2e>
+    return -1;
+    80207926:	57fd                	li	a5,-1
+    80207928:	a8a9                	j	80207982 <sys_nanosleep+0x86>
+  tv=(TimeVal *)addr;     //强制类型转换
+    8020792a:	fd843783          	ld	a5,-40(s0)
+    8020792e:	fef43023          	sd	a5,-32(s0)
+
+  if(myproc()->killed||gain_sleep(tv)==0){  //如果进程被杀死,或者gain_sleep异常则返回-1
+    80207932:	ffffb097          	auipc	ra,0xffffb
+    80207936:	030080e7          	jalr	48(ra) # 80202962 <myproc>
+    8020793a:	87aa                	mv	a5,a0
+    8020793c:	5b9c                	lw	a5,48(a5)
+    8020793e:	eb89                	bnez	a5,80207950 <sys_nanosleep+0x54>
+    80207940:	fe043503          	ld	a0,-32(s0)
+    80207944:	00000097          	auipc	ra,0x0
+    80207948:	11e080e7          	jalr	286(ra) # 80207a62 <gain_sleep>
+    8020794c:	87aa                	mv	a5,a0
+    8020794e:	e399                	bnez	a5,80207954 <sys_nanosleep+0x58>
+    return -1;
+    80207950:	57fd                	li	a5,-1
+    80207952:	a805                	j	80207982 <sys_nanosleep+0x86>
+  }
+  
+  acquire(&p->lock);  
+    80207954:	fe843783          	ld	a5,-24(s0)
+    80207958:	853e                	mv	a0,a5
+    8020795a:	ffff9097          	auipc	ra,0xffff9
+    8020795e:	08e080e7          	jalr	142(ra) # 802009e8 <acquire>
+  p->state = SLEEPING;  //将进程的状态设置为睡眠。
+    80207962:	fe843783          	ld	a5,-24(s0)
+    80207966:	4705                	li	a4,1
+    80207968:	cf98                	sw	a4,24(a5)
+  sched();
+    8020796a:	ffffc097          	auipc	ra,0xffffc
+    8020796e:	cb4080e7          	jalr	-844(ra) # 8020361e <sched>
+  release(&p->lock);
+    80207972:	fe843783          	ld	a5,-24(s0)
+    80207976:	853e                	mv	a0,a5
+    80207978:	ffff9097          	auipc	ra,0xffff9
+    8020797c:	0d4080e7          	jalr	212(ra) # 80200a4c <release>
+
+  return 0;            //这里需要返回1才可以过判定,否则过测试用例时会导致 sleep也return 0进而断言判定失败,结果程序终止。
+    80207980:	4781                	li	a5,0
+    80207982:	853e                	mv	a0,a5
+    80207984:	70a2                	ld	ra,40(sp)
+    80207986:	7402                	ld	s0,32(sp)
+    80207988:	6145                	addi	sp,sp,48
+    8020798a:	8082                	ret
+    8020798c:	0000                	unimp
+	...
+
+0000000080207990 <kernelvec>:
+    80207990:	7111                	addi	sp,sp,-256
+    80207992:	e006                	sd	ra,0(sp)
+    80207994:	e40a                	sd	sp,8(sp)
+    80207996:	e80e                	sd	gp,16(sp)
+    80207998:	ec12                	sd	tp,24(sp)
+    8020799a:	f016                	sd	t0,32(sp)
+    8020799c:	f41a                	sd	t1,40(sp)
+    8020799e:	f81e                	sd	t2,48(sp)
+    802079a0:	fc22                	sd	s0,56(sp)
+    802079a2:	e0a6                	sd	s1,64(sp)
+    802079a4:	e4aa                	sd	a0,72(sp)
+    802079a6:	e8ae                	sd	a1,80(sp)
+    802079a8:	ecb2                	sd	a2,88(sp)
+    802079aa:	f0b6                	sd	a3,96(sp)
+    802079ac:	f4ba                	sd	a4,104(sp)
+    802079ae:	f8be                	sd	a5,112(sp)
+    802079b0:	fcc2                	sd	a6,120(sp)
+    802079b2:	e146                	sd	a7,128(sp)
+    802079b4:	e54a                	sd	s2,136(sp)
+    802079b6:	e94e                	sd	s3,144(sp)
+    802079b8:	ed52                	sd	s4,152(sp)
+    802079ba:	f156                	sd	s5,160(sp)
+    802079bc:	f55a                	sd	s6,168(sp)
+    802079be:	f95e                	sd	s7,176(sp)
+    802079c0:	fd62                	sd	s8,184(sp)
+    802079c2:	e1e6                	sd	s9,192(sp)
+    802079c4:	e5ea                	sd	s10,200(sp)
+    802079c6:	e9ee                	sd	s11,208(sp)
+    802079c8:	edf2                	sd	t3,216(sp)
+    802079ca:	f1f6                	sd	t4,224(sp)
+    802079cc:	f5fa                	sd	t5,232(sp)
+    802079ce:	f9fe                	sd	t6,240(sp)
+    802079d0:	efefc0ef          	jal	ra,802040ce <kerneltrap>
+    802079d4:	6082                	ld	ra,0(sp)
+    802079d6:	6122                	ld	sp,8(sp)
+    802079d8:	61c2                	ld	gp,16(sp)
+    802079da:	7282                	ld	t0,32(sp)
+    802079dc:	7322                	ld	t1,40(sp)
+    802079de:	73c2                	ld	t2,48(sp)
+    802079e0:	7462                	ld	s0,56(sp)
+    802079e2:	6486                	ld	s1,64(sp)
+    802079e4:	6526                	ld	a0,72(sp)
+    802079e6:	65c6                	ld	a1,80(sp)
+    802079e8:	6666                	ld	a2,88(sp)
+    802079ea:	7686                	ld	a3,96(sp)
+    802079ec:	7726                	ld	a4,104(sp)
+    802079ee:	77c6                	ld	a5,112(sp)
+    802079f0:	7866                	ld	a6,120(sp)
+    802079f2:	688a                	ld	a7,128(sp)
+    802079f4:	692a                	ld	s2,136(sp)
+    802079f6:	69ca                	ld	s3,144(sp)
+    802079f8:	6a6a                	ld	s4,152(sp)
+    802079fa:	7a8a                	ld	s5,160(sp)
+    802079fc:	7b2a                	ld	s6,168(sp)
+    802079fe:	7bca                	ld	s7,176(sp)
+    80207a00:	7c6a                	ld	s8,184(sp)
+    80207a02:	6c8e                	ld	s9,192(sp)
+    80207a04:	6d2e                	ld	s10,200(sp)
+    80207a06:	6dce                	ld	s11,208(sp)
+    80207a08:	6e6e                	ld	t3,216(sp)
+    80207a0a:	7e8e                	ld	t4,224(sp)
+    80207a0c:	7f2e                	ld	t5,232(sp)
+    80207a0e:	7fce                	ld	t6,240(sp)
+    80207a10:	6111                	addi	sp,sp,256
+    80207a12:	10200073          	sret
+	...
+
+0000000080207a1e <r_time>:
+{
+    80207a1e:	1101                	addi	sp,sp,-32
+    80207a20:	ec22                	sd	s0,24(sp)
+    80207a22:	1000                	addi	s0,sp,32
+  asm volatile("rdtime %0" : "=r" (x) );
+    80207a24:	c01027f3          	rdtime	a5
+    80207a28:	fef43423          	sd	a5,-24(s0)
+  return x;
+    80207a2c:	fe843783          	ld	a5,-24(s0)
+}
+    80207a30:	853e                	mv	a0,a5
+    80207a32:	6462                	ld	s0,24(sp)
+    80207a34:	6105                	addi	sp,sp,32
+    80207a36:	8082                	ret
+
+0000000080207a38 <sbi_set_timer>:
+
+static inline void sbi_set_timer(uint64 stime_value)
+{
+    80207a38:	1101                	addi	sp,sp,-32
+    80207a3a:	ec22                	sd	s0,24(sp)
+    80207a3c:	1000                	addi	s0,sp,32
+    80207a3e:	fea43423          	sd	a0,-24(s0)
+	SBI_CALL_1(SBI_TIMER_EXTION, SBI_SET_TIMER, stime_value);
+    80207a42:	fe843503          	ld	a0,-24(s0)
+    80207a46:	4581                	li	a1,0
+    80207a48:	4601                	li	a2,0
+    80207a4a:	4681                	li	a3,0
+    80207a4c:	544957b7          	lui	a5,0x54495
+    80207a50:	d4578893          	addi	a7,a5,-699 # 54494d45 <_entry-0x2bd6b2bb>
+    80207a54:	4801                	li	a6,0
+    80207a56:	00000073          	ecall
+}
+    80207a5a:	0001                	nop
+    80207a5c:	6462                	ld	s0,24(sp)
+    80207a5e:	6105                	addi	sp,sp,32
+    80207a60:	8082                	ret
+
+0000000080207a62 <gain_sleep>:
+
+
+struct sleep_proc sleep_procs[N_SLEEP_PRCO]; //设置睡眠进程组
+
+
+int gain_sleep(TimeVal *tv){
+    80207a62:	7179                	addi	sp,sp,-48
+    80207a64:	f406                	sd	ra,40(sp)
+    80207a66:	f022                	sd	s0,32(sp)
+    80207a68:	1800                	addi	s0,sp,48
+    80207a6a:	fca43c23          	sd	a0,-40(s0)
+    struct sleep_proc* sp;                         //设置睡眠进程指针
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){
+    80207a6e:	0001c797          	auipc	a5,0x1c
+    80207a72:	ffa78793          	addi	a5,a5,-6 # 80223a68 <sleep_procs>
+    80207a76:	fef43423          	sd	a5,-24(s0)
+    80207a7a:	a85d                	j	80207b30 <gain_sleep+0xce>
+        acquire(&sp->lock);
+    80207a7c:	fe843783          	ld	a5,-24(s0)
+    80207a80:	07c1                	addi	a5,a5,16
+    80207a82:	853e                	mv	a0,a5
+    80207a84:	ffff9097          	auipc	ra,0xffff9
+    80207a88:	f64080e7          	jalr	-156(ra) # 802009e8 <acquire>
+        if(sp->p==0){
+    80207a8c:	fe843783          	ld	a5,-24(s0)
+    80207a90:	679c                	ld	a5,8(a5)
+    80207a92:	e3c9                	bnez	a5,80207b14 <gain_sleep+0xb2>
+            sp->p=myproc();                   //指向当前进程
+    80207a94:	ffffb097          	auipc	ra,0xffffb
+    80207a98:	ece080e7          	jalr	-306(ra) # 80202962 <myproc>
+    80207a9c:	872a                	mv	a4,a0
+    80207a9e:	fe843783          	ld	a5,-24(s0)
+    80207aa2:	e798                	sd	a4,8(a5)
+            sp->sleep_ticks=ticks + tv->sec*CLK_FREQ/INTERVAL +tv->usec*(CLK_FREQ/1000000)/INTERVAL;//秒数*每秒时钟数/中断间隔=睡眠ticks数,微秒同理
+    80207aa4:	fd843783          	ld	a5,-40(s0)
+    80207aa8:	6398                	ld	a4,0(a5)
+    80207aaa:	00bec7b7          	lui	a5,0xbec
+    80207aae:	c2078793          	addi	a5,a5,-992 # bebc20 <_entry-0x7f6143e0>
+    80207ab2:	02f70733          	mul	a4,a4,a5
+    80207ab6:	003b87b7          	lui	a5,0x3b8
+    80207aba:	26078793          	addi	a5,a5,608 # 3b8260 <_entry-0x7fe47da0>
+    80207abe:	02f757b3          	divu	a5,a4,a5
+    80207ac2:	0007871b          	sext.w	a4,a5
+    80207ac6:	0001c797          	auipc	a5,0x1c
+    80207aca:	f9a78793          	addi	a5,a5,-102 # 80223a60 <ticks>
+    80207ace:	439c                	lw	a5,0(a5)
+    80207ad0:	9fb9                	addw	a5,a5,a4
+    80207ad2:	0007869b          	sext.w	a3,a5
+    80207ad6:	fd843783          	ld	a5,-40(s0)
+    80207ada:	6798                	ld	a4,8(a5)
+    80207adc:	87ba                	mv	a5,a4
+    80207ade:	0786                	slli	a5,a5,0x1
+    80207ae0:	97ba                	add	a5,a5,a4
+    80207ae2:	078a                	slli	a5,a5,0x2
+    80207ae4:	873e                	mv	a4,a5
+    80207ae6:	003b87b7          	lui	a5,0x3b8
+    80207aea:	26078793          	addi	a5,a5,608 # 3b8260 <_entry-0x7fe47da0>
+    80207aee:	02f757b3          	divu	a5,a4,a5
+    80207af2:	2781                	sext.w	a5,a5
+    80207af4:	9fb5                	addw	a5,a5,a3
+    80207af6:	0007871b          	sext.w	a4,a5
+    80207afa:	fe843783          	ld	a5,-24(s0)
+    80207afe:	c398                	sw	a4,0(a5)
+            release(&sp->lock);
+    80207b00:	fe843783          	ld	a5,-24(s0)
+    80207b04:	07c1                	addi	a5,a5,16
+    80207b06:	853e                	mv	a0,a5
+    80207b08:	ffff9097          	auipc	ra,0xffff9
+    80207b0c:	f44080e7          	jalr	-188(ra) # 80200a4c <release>
+            return 1;   //正常返回
+    80207b10:	4785                	li	a5,1
+    80207b12:	a805                	j	80207b42 <gain_sleep+0xe0>
+        }
+        release(&sp->lock);
+    80207b14:	fe843783          	ld	a5,-24(s0)
+    80207b18:	07c1                	addi	a5,a5,16
+    80207b1a:	853e                	mv	a0,a5
+    80207b1c:	ffff9097          	auipc	ra,0xffff9
+    80207b20:	f30080e7          	jalr	-208(ra) # 80200a4c <release>
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){
+    80207b24:	fe843783          	ld	a5,-24(s0)
+    80207b28:	02878793          	addi	a5,a5,40
+    80207b2c:	fef43423          	sd	a5,-24(s0)
+    80207b30:	fe843703          	ld	a4,-24(s0)
+    80207b34:	0001c797          	auipc	a5,0x1c
+    80207b38:	ffc78793          	addi	a5,a5,-4 # 80223b30 <fat>
+    80207b3c:	f4f760e3          	bltu	a4,a5,80207a7c <gain_sleep+0x1a>
+    }
+    return 0;
+    80207b40:	4781                	li	a5,0
+}
+    80207b42:	853e                	mv	a0,a5
+    80207b44:	70a2                	ld	ra,40(sp)
+    80207b46:	7402                	ld	s0,32(sp)
+    80207b48:	6145                	addi	sp,sp,48
+    80207b4a:	8082                	ret
+
+0000000080207b4c <timerinit>:
+
+void timerinit() {
+    80207b4c:	1101                	addi	sp,sp,-32
+    80207b4e:	ec06                	sd	ra,24(sp)
+    80207b50:	e822                	sd	s0,16(sp)
+    80207b52:	1000                	addi	s0,sp,32
+    initlock(&tickslock, "time");
+    80207b54:	00006597          	auipc	a1,0x6
+    80207b58:	19c58593          	addi	a1,a1,412 # 8020dcf0 <etext+0xcf0>
+    80207b5c:	0001c517          	auipc	a0,0x1c
+    80207b60:	eec50513          	addi	a0,a0,-276 # 80223a48 <tickslock>
+    80207b64:	ffff9097          	auipc	ra,0xffff9
+    80207b68:	e54080e7          	jalr	-428(ra) # 802009b8 <initlock>
+    #ifdef DEBUG
+    printf("timerinit\n");
+    80207b6c:	00006517          	auipc	a0,0x6
+    80207b70:	18c50513          	addi	a0,a0,396 # 8020dcf8 <etext+0xcf8>
+    80207b74:	ffff8097          	auipc	ra,0xffff8
+    80207b78:	67a080e7          	jalr	1658(ra) # 802001ee <printf>
+    #endif
+
+ struct sleep_proc* sp;
+
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){
+    80207b7c:	0001c797          	auipc	a5,0x1c
+    80207b80:	eec78793          	addi	a5,a5,-276 # 80223a68 <sleep_procs>
+    80207b84:	fef43423          	sd	a5,-24(s0)
+    80207b88:	a03d                	j	80207bb6 <timerinit+0x6a>
+        initlock(&sp->lock,"sleep");
+    80207b8a:	fe843783          	ld	a5,-24(s0)
+    80207b8e:	07c1                	addi	a5,a5,16
+    80207b90:	00006597          	auipc	a1,0x6
+    80207b94:	17858593          	addi	a1,a1,376 # 8020dd08 <etext+0xd08>
+    80207b98:	853e                	mv	a0,a5
+    80207b9a:	ffff9097          	auipc	ra,0xffff9
+    80207b9e:	e1e080e7          	jalr	-482(ra) # 802009b8 <initlock>
+        sp->p=0;              //初始化睡眠进程块,起初每个睡眠进程块指向空。
+    80207ba2:	fe843783          	ld	a5,-24(s0)
+    80207ba6:	0007b423          	sd	zero,8(a5)
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){
+    80207baa:	fe843783          	ld	a5,-24(s0)
+    80207bae:	02878793          	addi	a5,a5,40
+    80207bb2:	fef43423          	sd	a5,-24(s0)
+    80207bb6:	fe843703          	ld	a4,-24(s0)
+    80207bba:	0001c797          	auipc	a5,0x1c
+    80207bbe:	f7678793          	addi	a5,a5,-138 # 80223b30 <fat>
+    80207bc2:	fcf764e3          	bltu	a4,a5,80207b8a <timerinit+0x3e>
+    }
+
+}
+    80207bc6:	0001                	nop
+    80207bc8:	0001                	nop
+    80207bca:	60e2                	ld	ra,24(sp)
+    80207bcc:	6442                	ld	s0,16(sp)
+    80207bce:	6105                	addi	sp,sp,32
+    80207bd0:	8082                	ret
+
+0000000080207bd2 <set_next_timeout>:
+
+void
+set_next_timeout() {
+    80207bd2:	1141                	addi	sp,sp,-16
+    80207bd4:	e406                	sd	ra,8(sp)
+    80207bd6:	e022                	sd	s0,0(sp)
+    80207bd8:	0800                	addi	s0,sp,16
+    // There is a very strange bug,
+    // if comment the `printf` line below
+    // the timer will not work.
+    // this bug seems to disappear automatically
+    printf("");
+    80207bda:	00006517          	auipc	a0,0x6
+    80207bde:	13650513          	addi	a0,a0,310 # 8020dd10 <etext+0xd10>
+    80207be2:	ffff8097          	auipc	ra,0xffff8
+    80207be6:	60c080e7          	jalr	1548(ra) # 802001ee <printf>
+    sbi_set_timer(r_time() + INTERVAL);
+    80207bea:	00000097          	auipc	ra,0x0
+    80207bee:	e34080e7          	jalr	-460(ra) # 80207a1e <r_time>
+    80207bf2:	872a                	mv	a4,a0
+    80207bf4:	003b87b7          	lui	a5,0x3b8
+    80207bf8:	26078793          	addi	a5,a5,608 # 3b8260 <_entry-0x7fe47da0>
+    80207bfc:	97ba                	add	a5,a5,a4
+    80207bfe:	853e                	mv	a0,a5
+    80207c00:	00000097          	auipc	ra,0x0
+    80207c04:	e38080e7          	jalr	-456(ra) # 80207a38 <sbi_set_timer>
+}
+    80207c08:	0001                	nop
+    80207c0a:	60a2                	ld	ra,8(sp)
+    80207c0c:	6402                	ld	s0,0(sp)
+    80207c0e:	0141                	addi	sp,sp,16
+    80207c10:	8082                	ret
+
+0000000080207c12 <wakeup_sleep>:
+
+void wakeup_sleep(){
+    80207c12:	1101                	addi	sp,sp,-32
+    80207c14:	ec06                	sd	ra,24(sp)
+    80207c16:	e822                	sd	s0,16(sp)
+    80207c18:	1000                	addi	s0,sp,32
+    struct sleep_proc* sp;
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){   //在每次时钟中断的时候遍历睡眠进程组
+    80207c1a:	0001c797          	auipc	a5,0x1c
+    80207c1e:	e4e78793          	addi	a5,a5,-434 # 80223a68 <sleep_procs>
+    80207c22:	fef43423          	sd	a5,-24(s0)
+    80207c26:	a05d                	j	80207ccc <wakeup_sleep+0xba>
+        acquire(&sp->lock);
+    80207c28:	fe843783          	ld	a5,-24(s0)
+    80207c2c:	07c1                	addi	a5,a5,16
+    80207c2e:	853e                	mv	a0,a5
+    80207c30:	ffff9097          	auipc	ra,0xffff9
+    80207c34:	db8080e7          	jalr	-584(ra) # 802009e8 <acquire>
+        if(sp->p!=0){
+    80207c38:	fe843783          	ld	a5,-24(s0)
+    80207c3c:	679c                	ld	a5,8(a5)
+    80207c3e:	cbad                	beqz	a5,80207cb0 <wakeup_sleep+0x9e>
+            if(sp->p->killed){
+    80207c40:	fe843783          	ld	a5,-24(s0)
+    80207c44:	679c                	ld	a5,8(a5)
+    80207c46:	5b9c                	lw	a5,48(a5)
+    80207c48:	c791                	beqz	a5,80207c54 <wakeup_sleep+0x42>
+                sp->p=0;
+    80207c4a:	fe843783          	ld	a5,-24(s0)
+    80207c4e:	0007b423          	sd	zero,8(a5)
+    80207c52:	a8b9                	j	80207cb0 <wakeup_sleep+0x9e>
+            }
+            else{
+                if(ticks>sp->sleep_ticks){            //到点了就喊还在睡觉的进程起床
+    80207c54:	fe843783          	ld	a5,-24(s0)
+    80207c58:	4398                	lw	a4,0(a5)
+    80207c5a:	0001c797          	auipc	a5,0x1c
+    80207c5e:	e0678793          	addi	a5,a5,-506 # 80223a60 <ticks>
+    80207c62:	439c                	lw	a5,0(a5)
+    80207c64:	04f77663          	bgeu	a4,a5,80207cb0 <wakeup_sleep+0x9e>
+                    struct proc* p=sp->p;
+    80207c68:	fe843783          	ld	a5,-24(s0)
+    80207c6c:	679c                	ld	a5,8(a5)
+    80207c6e:	fef43023          	sd	a5,-32(s0)
+                    acquire(&p->lock);
+    80207c72:	fe043783          	ld	a5,-32(s0)
+    80207c76:	853e                	mv	a0,a5
+    80207c78:	ffff9097          	auipc	ra,0xffff9
+    80207c7c:	d70080e7          	jalr	-656(ra) # 802009e8 <acquire>
+                    if(sp->p->state==SLEEPING){
+    80207c80:	fe843783          	ld	a5,-24(s0)
+    80207c84:	679c                	ld	a5,8(a5)
+    80207c86:	4f9c                	lw	a5,24(a5)
+    80207c88:	873e                	mv	a4,a5
+    80207c8a:	4785                	li	a5,1
+    80207c8c:	00f71b63          	bne	a4,a5,80207ca2 <wakeup_sleep+0x90>
+                        sp->p->state=RUNNABLE;
+    80207c90:	fe843783          	ld	a5,-24(s0)
+    80207c94:	679c                	ld	a5,8(a5)
+    80207c96:	4709                	li	a4,2
+    80207c98:	cf98                	sw	a4,24(a5)
+                        sp->p=0;
+    80207c9a:	fe843783          	ld	a5,-24(s0)
+    80207c9e:	0007b423          	sd	zero,8(a5)
+                    }
+                    release(&p->lock);
+    80207ca2:	fe043783          	ld	a5,-32(s0)
+    80207ca6:	853e                	mv	a0,a5
+    80207ca8:	ffff9097          	auipc	ra,0xffff9
+    80207cac:	da4080e7          	jalr	-604(ra) # 80200a4c <release>
+                }
+            }
+        }
+        release(&sp->lock);
+    80207cb0:	fe843783          	ld	a5,-24(s0)
+    80207cb4:	07c1                	addi	a5,a5,16
+    80207cb6:	853e                	mv	a0,a5
+    80207cb8:	ffff9097          	auipc	ra,0xffff9
+    80207cbc:	d94080e7          	jalr	-620(ra) # 80200a4c <release>
+    for(sp=sleep_procs;sp<&sleep_procs[N_SLEEP_PRCO];++sp){   //在每次时钟中断的时候遍历睡眠进程组
+    80207cc0:	fe843783          	ld	a5,-24(s0)
+    80207cc4:	02878793          	addi	a5,a5,40
+    80207cc8:	fef43423          	sd	a5,-24(s0)
+    80207ccc:	fe843703          	ld	a4,-24(s0)
+    80207cd0:	0001c797          	auipc	a5,0x1c
+    80207cd4:	e6078793          	addi	a5,a5,-416 # 80223b30 <fat>
+    80207cd8:	f4f768e3          	bltu	a4,a5,80207c28 <wakeup_sleep+0x16>
+    }
+}
+    80207cdc:	0001                	nop
+    80207cde:	0001                	nop
+    80207ce0:	60e2                	ld	ra,24(sp)
+    80207ce2:	6442                	ld	s0,16(sp)
+    80207ce4:	6105                	addi	sp,sp,32
+    80207ce6:	8082                	ret
+
+0000000080207ce8 <timer_tick>:
+
+
+void timer_tick(int cpl) {
+    80207ce8:	7179                	addi	sp,sp,-48
+    80207cea:	f406                	sd	ra,40(sp)
+    80207cec:	f022                	sd	s0,32(sp)
+    80207cee:	1800                	addi	s0,sp,48
+    80207cf0:	87aa                	mv	a5,a0
+    80207cf2:	fcf42e23          	sw	a5,-36(s0)
+    struct proc *p=myproc();
+    80207cf6:	ffffb097          	auipc	ra,0xffffb
+    80207cfa:	c6c080e7          	jalr	-916(ra) # 80202962 <myproc>
+    80207cfe:	fea43423          	sd	a0,-24(s0)
+//    printf("%d",myproc());     //输出0,说明myproc获取的是空指针!
+    if(p!=0){                 //似乎无法通过指针正常获取proc
+    80207d02:	fe843783          	ld	a5,-24(s0)
+    80207d06:	cf8d                	beqz	a5,80207d40 <timer_tick+0x58>
+//        printf("%d",cpl);             //检查发现这里不执行,有可能是进程指针有问题
+        if(cpl==1){                  //在time_ticker的时候判断当前特权级别
+    80207d08:	fdc42783          	lw	a5,-36(s0)
+    80207d0c:	0007871b          	sext.w	a4,a5
+    80207d10:	4785                	li	a5,1
+    80207d12:	00f71d63          	bne	a4,a5,80207d2c <timer_tick+0x44>
+            ++p->ti.tms_stime;       //s级则加stime
+    80207d16:	fe843783          	ld	a5,-24(s0)
+    80207d1a:	1687b783          	ld	a5,360(a5)
+    80207d1e:	00178713          	addi	a4,a5,1
+    80207d22:	fe843783          	ld	a5,-24(s0)
+    80207d26:	16e7b423          	sd	a4,360(a5)
+    80207d2a:	a819                	j	80207d40 <timer_tick+0x58>
+        }
+        else{
+            ++p->ti.tms_utime;       //u级则加utime
+    80207d2c:	fe843783          	ld	a5,-24(s0)
+    80207d30:	1607b783          	ld	a5,352(a5)
+    80207d34:	00178713          	addi	a4,a5,1
+    80207d38:	fe843783          	ld	a5,-24(s0)
+    80207d3c:	16e7b023          	sd	a4,352(a5)
+        }
+   }
+    acquire(&tickslock);
+    80207d40:	0001c517          	auipc	a0,0x1c
+    80207d44:	d0850513          	addi	a0,a0,-760 # 80223a48 <tickslock>
+    80207d48:	ffff9097          	auipc	ra,0xffff9
+    80207d4c:	ca0080e7          	jalr	-864(ra) # 802009e8 <acquire>
+    ticks++;
+    80207d50:	0001c797          	auipc	a5,0x1c
+    80207d54:	d1078793          	addi	a5,a5,-752 # 80223a60 <ticks>
+    80207d58:	439c                	lw	a5,0(a5)
+    80207d5a:	2785                	addiw	a5,a5,1
+    80207d5c:	0007871b          	sext.w	a4,a5
+    80207d60:	0001c797          	auipc	a5,0x1c
+    80207d64:	d0078793          	addi	a5,a5,-768 # 80223a60 <ticks>
+    80207d68:	c398                	sw	a4,0(a5)
+    wakeup_sleep(&ticks);               //用于唤醒睡眠进程
+    80207d6a:	0001c517          	auipc	a0,0x1c
+    80207d6e:	cf650513          	addi	a0,a0,-778 # 80223a60 <ticks>
+    80207d72:	00000097          	auipc	ra,0x0
+    80207d76:	ea0080e7          	jalr	-352(ra) # 80207c12 <wakeup_sleep>
+    release(&tickslock);
+    80207d7a:	0001c517          	auipc	a0,0x1c
+    80207d7e:	cce50513          	addi	a0,a0,-818 # 80223a48 <tickslock>
+    80207d82:	ffff9097          	auipc	ra,0xffff9
+    80207d86:	cca080e7          	jalr	-822(ra) # 80200a4c <release>
+    set_next_timeout();
+    80207d8a:	00000097          	auipc	ra,0x0
+    80207d8e:	e48080e7          	jalr	-440(ra) # 80207bd2 <set_next_timeout>
+}
+    80207d92:	0001                	nop
+    80207d94:	70a2                	ld	ra,40(sp)
+    80207d96:	7402                	ld	s0,32(sp)
+    80207d98:	6145                	addi	sp,sp,48
+    80207d9a:	8082                	ret
+
+0000000080207d9c <disk_init>:
+#else
+#include "include/virtio.h"
+#endif 
+
+void disk_init(void)
+{
+    80207d9c:	1141                	addi	sp,sp,-16
+    80207d9e:	e406                	sd	ra,8(sp)
+    80207da0:	e022                	sd	s0,0(sp)
+    80207da2:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+    virtio_disk_init();
+    80207da4:	00003097          	auipc	ra,0x3
+    80207da8:	06e080e7          	jalr	110(ra) # 8020ae12 <virtio_disk_init>
+	#else 
+	sdcard_init();
+    #endif
+}
+    80207dac:	0001                	nop
+    80207dae:	60a2                	ld	ra,8(sp)
+    80207db0:	6402                	ld	s0,0(sp)
+    80207db2:	0141                	addi	sp,sp,16
+    80207db4:	8082                	ret
+
+0000000080207db6 <disk_read>:
+
+void disk_read(struct buf *b)
+{
+    80207db6:	1101                	addi	sp,sp,-32
+    80207db8:	ec06                	sd	ra,24(sp)
+    80207dba:	e822                	sd	s0,16(sp)
+    80207dbc:	1000                	addi	s0,sp,32
+    80207dbe:	fea43423          	sd	a0,-24(s0)
+    #ifdef QEMU
+	virtio_disk_rw(b, 0);
+    80207dc2:	4581                	li	a1,0
+    80207dc4:	fe843503          	ld	a0,-24(s0)
+    80207dc8:	00003097          	auipc	ra,0x3
+    80207dcc:	526080e7          	jalr	1318(ra) # 8020b2ee <virtio_disk_rw>
+    #else 
+	sdcard_read_sector(b->data, b->sectorno);
+	#endif
+}
+    80207dd0:	0001                	nop
+    80207dd2:	60e2                	ld	ra,24(sp)
+    80207dd4:	6442                	ld	s0,16(sp)
+    80207dd6:	6105                	addi	sp,sp,32
+    80207dd8:	8082                	ret
+
+0000000080207dda <disk_write>:
+
+void disk_write(struct buf *b)
+{
+    80207dda:	1101                	addi	sp,sp,-32
+    80207ddc:	ec06                	sd	ra,24(sp)
+    80207dde:	e822                	sd	s0,16(sp)
+    80207de0:	1000                	addi	s0,sp,32
+    80207de2:	fea43423          	sd	a0,-24(s0)
+    #ifdef QEMU
+	virtio_disk_rw(b, 1);
+    80207de6:	4585                	li	a1,1
+    80207de8:	fe843503          	ld	a0,-24(s0)
+    80207dec:	00003097          	auipc	ra,0x3
+    80207df0:	502080e7          	jalr	1282(ra) # 8020b2ee <virtio_disk_rw>
+    #else 
+	sdcard_write_sector(b->data, b->sectorno);
+	#endif
+}
+    80207df4:	0001                	nop
+    80207df6:	60e2                	ld	ra,24(sp)
+    80207df8:	6442                	ld	s0,16(sp)
+    80207dfa:	6105                	addi	sp,sp,32
+    80207dfc:	8082                	ret
+
+0000000080207dfe <disk_intr>:
+
+void disk_intr(void)
+{
+    80207dfe:	1141                	addi	sp,sp,-16
+    80207e00:	e406                	sd	ra,8(sp)
+    80207e02:	e022                	sd	s0,0(sp)
+    80207e04:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+    virtio_disk_intr();
+    80207e06:	00004097          	auipc	ra,0x4
+    80207e0a:	87a080e7          	jalr	-1926(ra) # 8020b680 <virtio_disk_intr>
+    #else 
+    dmac_intr(DMAC_CHANNEL0);
+    #endif
+}
+    80207e0e:	0001                	nop
+    80207e10:	60a2                	ld	ra,8(sp)
+    80207e12:	6402                	ld	s0,0(sp)
+    80207e14:	0141                	addi	sp,sp,16
+    80207e16:	8082                	ret
+
+0000000080207e18 <fat32_init>:
+ * Read the Boot Parameter Block.
+ * @return  0       if success
+ *          -1      if fail
+ */
+int fat32_init()
+{
+    80207e18:	1101                	addi	sp,sp,-32
+    80207e1a:	ec06                	sd	ra,24(sp)
+    80207e1c:	e822                	sd	s0,16(sp)
+    80207e1e:	1000                	addi	s0,sp,32
+    #ifdef DEBUG
+    printf("[fat32_init] enter!\n");
+    80207e20:	00006517          	auipc	a0,0x6
+    80207e24:	ef850513          	addi	a0,a0,-264 # 8020dd18 <etext+0xd18>
+    80207e28:	ffff8097          	auipc	ra,0xffff8
+    80207e2c:	3c6080e7          	jalr	966(ra) # 802001ee <printf>
+    #endif
+    struct buf *b = bread(0, 0);
+    80207e30:	4581                	li	a1,0
+    80207e32:	4501                	li	a0,0
+    80207e34:	ffffd097          	auipc	ra,0xffffd
+    80207e38:	49a080e7          	jalr	1178(ra) # 802052ce <bread>
+    80207e3c:	fea43023          	sd	a0,-32(s0)
+    if (strncmp((char const*)(b->data + 82), "FAT32", 5))
+    80207e40:	fe043783          	ld	a5,-32(s0)
+    80207e44:	05878793          	addi	a5,a5,88
+    80207e48:	05278793          	addi	a5,a5,82
+    80207e4c:	4615                	li	a2,5
+    80207e4e:	00006597          	auipc	a1,0x6
+    80207e52:	ee258593          	addi	a1,a1,-286 # 8020dd30 <etext+0xd30>
+    80207e56:	853e                	mv	a0,a5
+    80207e58:	ffff9097          	auipc	ra,0xffff9
+    80207e5c:	e78080e7          	jalr	-392(ra) # 80200cd0 <strncmp>
+    80207e60:	87aa                	mv	a5,a0
+    80207e62:	cb89                	beqz	a5,80207e74 <fat32_init+0x5c>
+        panic("not FAT32 volume");
+    80207e64:	00006517          	auipc	a0,0x6
+    80207e68:	ed450513          	addi	a0,a0,-300 # 8020dd38 <etext+0xd38>
+    80207e6c:	ffff8097          	auipc	ra,0xffff8
+    80207e70:	5d8080e7          	jalr	1496(ra) # 80200444 <panic>
+    // fat.bpb.byts_per_sec = *(uint16 *)(b->data + 11);
+    memmove(&fat.bpb.byts_per_sec, b->data + 11, 2);            // avoid misaligned load on k210
+    80207e74:	fe043783          	ld	a5,-32(s0)
+    80207e78:	05878793          	addi	a5,a5,88
+    80207e7c:	07ad                	addi	a5,a5,11
+    80207e7e:	4609                	li	a2,2
+    80207e80:	85be                	mv	a1,a5
+    80207e82:	0001c517          	auipc	a0,0x1c
+    80207e86:	cbe50513          	addi	a0,a0,-834 # 80223b40 <fat+0x10>
+    80207e8a:	ffff9097          	auipc	ra,0xffff9
+    80207e8e:	d40080e7          	jalr	-704(ra) # 80200bca <memmove>
+    fat.bpb.sec_per_clus = *(b->data + 13);
+    80207e92:	fe043783          	ld	a5,-32(s0)
+    80207e96:	0657c703          	lbu	a4,101(a5)
+    80207e9a:	0001c797          	auipc	a5,0x1c
+    80207e9e:	c9678793          	addi	a5,a5,-874 # 80223b30 <fat>
+    80207ea2:	00e78923          	sb	a4,18(a5)
+    fat.bpb.rsvd_sec_cnt = *(uint16 *)(b->data + 14);
+    80207ea6:	fe043783          	ld	a5,-32(s0)
+    80207eaa:	05878793          	addi	a5,a5,88
+    80207eae:	07b9                	addi	a5,a5,14
+    80207eb0:	0007d703          	lhu	a4,0(a5)
+    80207eb4:	0001c797          	auipc	a5,0x1c
+    80207eb8:	c7c78793          	addi	a5,a5,-900 # 80223b30 <fat>
+    80207ebc:	00e79a23          	sh	a4,20(a5)
+    fat.bpb.fat_cnt = *(b->data + 16);
+    80207ec0:	fe043783          	ld	a5,-32(s0)
+    80207ec4:	0687c703          	lbu	a4,104(a5)
+    80207ec8:	0001c797          	auipc	a5,0x1c
+    80207ecc:	c6878793          	addi	a5,a5,-920 # 80223b30 <fat>
+    80207ed0:	00e78b23          	sb	a4,22(a5)
+    fat.bpb.hidd_sec = *(uint32 *)(b->data + 28);
+    80207ed4:	fe043783          	ld	a5,-32(s0)
+    80207ed8:	05878793          	addi	a5,a5,88
+    80207edc:	07f1                	addi	a5,a5,28
+    80207ede:	4398                	lw	a4,0(a5)
+    80207ee0:	0001c797          	auipc	a5,0x1c
+    80207ee4:	c5078793          	addi	a5,a5,-944 # 80223b30 <fat>
+    80207ee8:	cf98                	sw	a4,24(a5)
+    fat.bpb.tot_sec = *(uint32 *)(b->data + 32);
+    80207eea:	fe043783          	ld	a5,-32(s0)
+    80207eee:	05878793          	addi	a5,a5,88
+    80207ef2:	02078793          	addi	a5,a5,32
+    80207ef6:	4398                	lw	a4,0(a5)
+    80207ef8:	0001c797          	auipc	a5,0x1c
+    80207efc:	c3878793          	addi	a5,a5,-968 # 80223b30 <fat>
+    80207f00:	cfd8                	sw	a4,28(a5)
+    fat.bpb.fat_sz = *(uint32 *)(b->data + 36);
+    80207f02:	fe043783          	ld	a5,-32(s0)
+    80207f06:	05878793          	addi	a5,a5,88
+    80207f0a:	02478793          	addi	a5,a5,36
+    80207f0e:	4398                	lw	a4,0(a5)
+    80207f10:	0001c797          	auipc	a5,0x1c
+    80207f14:	c2078793          	addi	a5,a5,-992 # 80223b30 <fat>
+    80207f18:	d398                	sw	a4,32(a5)
+    fat.bpb.root_clus = *(uint32 *)(b->data + 44);
+    80207f1a:	fe043783          	ld	a5,-32(s0)
+    80207f1e:	05878793          	addi	a5,a5,88
+    80207f22:	02c78793          	addi	a5,a5,44
+    80207f26:	4398                	lw	a4,0(a5)
+    80207f28:	0001c797          	auipc	a5,0x1c
+    80207f2c:	c0878793          	addi	a5,a5,-1016 # 80223b30 <fat>
+    80207f30:	d3d8                	sw	a4,36(a5)
+    fat.first_data_sec = fat.bpb.rsvd_sec_cnt + fat.bpb.fat_cnt * fat.bpb.fat_sz;
+    80207f32:	0001c797          	auipc	a5,0x1c
+    80207f36:	bfe78793          	addi	a5,a5,-1026 # 80223b30 <fat>
+    80207f3a:	0147d783          	lhu	a5,20(a5)
+    80207f3e:	0007871b          	sext.w	a4,a5
+    80207f42:	0001c797          	auipc	a5,0x1c
+    80207f46:	bee78793          	addi	a5,a5,-1042 # 80223b30 <fat>
+    80207f4a:	0167c783          	lbu	a5,22(a5)
+    80207f4e:	0007869b          	sext.w	a3,a5
+    80207f52:	0001c797          	auipc	a5,0x1c
+    80207f56:	bde78793          	addi	a5,a5,-1058 # 80223b30 <fat>
+    80207f5a:	539c                	lw	a5,32(a5)
+    80207f5c:	02f687bb          	mulw	a5,a3,a5
+    80207f60:	2781                	sext.w	a5,a5
+    80207f62:	9fb9                	addw	a5,a5,a4
+    80207f64:	0007871b          	sext.w	a4,a5
+    80207f68:	0001c797          	auipc	a5,0x1c
+    80207f6c:	bc878793          	addi	a5,a5,-1080 # 80223b30 <fat>
+    80207f70:	c398                	sw	a4,0(a5)
+    fat.data_sec_cnt = fat.bpb.tot_sec - fat.first_data_sec;
+    80207f72:	0001c797          	auipc	a5,0x1c
+    80207f76:	bbe78793          	addi	a5,a5,-1090 # 80223b30 <fat>
+    80207f7a:	4fd8                	lw	a4,28(a5)
+    80207f7c:	0001c797          	auipc	a5,0x1c
+    80207f80:	bb478793          	addi	a5,a5,-1100 # 80223b30 <fat>
+    80207f84:	439c                	lw	a5,0(a5)
+    80207f86:	40f707bb          	subw	a5,a4,a5
+    80207f8a:	0007871b          	sext.w	a4,a5
+    80207f8e:	0001c797          	auipc	a5,0x1c
+    80207f92:	ba278793          	addi	a5,a5,-1118 # 80223b30 <fat>
+    80207f96:	c3d8                	sw	a4,4(a5)
+    fat.data_clus_cnt = fat.data_sec_cnt / fat.bpb.sec_per_clus;
+    80207f98:	0001c797          	auipc	a5,0x1c
+    80207f9c:	b9878793          	addi	a5,a5,-1128 # 80223b30 <fat>
+    80207fa0:	43d8                	lw	a4,4(a5)
+    80207fa2:	0001c797          	auipc	a5,0x1c
+    80207fa6:	b8e78793          	addi	a5,a5,-1138 # 80223b30 <fat>
+    80207faa:	0127c783          	lbu	a5,18(a5)
+    80207fae:	2781                	sext.w	a5,a5
+    80207fb0:	02f757bb          	divuw	a5,a4,a5
+    80207fb4:	0007871b          	sext.w	a4,a5
+    80207fb8:	0001c797          	auipc	a5,0x1c
+    80207fbc:	b7878793          	addi	a5,a5,-1160 # 80223b30 <fat>
+    80207fc0:	c798                	sw	a4,8(a5)
+    fat.byts_per_clus = fat.bpb.sec_per_clus * fat.bpb.byts_per_sec;
+    80207fc2:	0001c797          	auipc	a5,0x1c
+    80207fc6:	b6e78793          	addi	a5,a5,-1170 # 80223b30 <fat>
+    80207fca:	0127c783          	lbu	a5,18(a5)
+    80207fce:	0007871b          	sext.w	a4,a5
+    80207fd2:	0001c797          	auipc	a5,0x1c
+    80207fd6:	b5e78793          	addi	a5,a5,-1186 # 80223b30 <fat>
+    80207fda:	0107d783          	lhu	a5,16(a5)
+    80207fde:	2781                	sext.w	a5,a5
+    80207fe0:	02f707bb          	mulw	a5,a4,a5
+    80207fe4:	2781                	sext.w	a5,a5
+    80207fe6:	0007871b          	sext.w	a4,a5
+    80207fea:	0001c797          	auipc	a5,0x1c
+    80207fee:	b4678793          	addi	a5,a5,-1210 # 80223b30 <fat>
+    80207ff2:	c7d8                	sw	a4,12(a5)
+    brelse(b);
+    80207ff4:	fe043503          	ld	a0,-32(s0)
+    80207ff8:	ffffd097          	auipc	ra,0xffffd
+    80207ffc:	374080e7          	jalr	884(ra) # 8020536c <brelse>
+
+    #ifdef DEBUG
+    printf("[FAT32 init]byts_per_sec: %d\n", fat.bpb.byts_per_sec);
+    80208000:	0001c797          	auipc	a5,0x1c
+    80208004:	b3078793          	addi	a5,a5,-1232 # 80223b30 <fat>
+    80208008:	0107d783          	lhu	a5,16(a5)
+    8020800c:	2781                	sext.w	a5,a5
+    8020800e:	85be                	mv	a1,a5
+    80208010:	00006517          	auipc	a0,0x6
+    80208014:	d4050513          	addi	a0,a0,-704 # 8020dd50 <etext+0xd50>
+    80208018:	ffff8097          	auipc	ra,0xffff8
+    8020801c:	1d6080e7          	jalr	470(ra) # 802001ee <printf>
+    printf("[FAT32 init]root_clus: %d\n", fat.bpb.root_clus);
+    80208020:	0001c797          	auipc	a5,0x1c
+    80208024:	b1078793          	addi	a5,a5,-1264 # 80223b30 <fat>
+    80208028:	53dc                	lw	a5,36(a5)
+    8020802a:	85be                	mv	a1,a5
+    8020802c:	00006517          	auipc	a0,0x6
+    80208030:	d4450513          	addi	a0,a0,-700 # 8020dd70 <etext+0xd70>
+    80208034:	ffff8097          	auipc	ra,0xffff8
+    80208038:	1ba080e7          	jalr	442(ra) # 802001ee <printf>
+    printf("[FAT32 init]sec_per_clus: %d\n", fat.bpb.sec_per_clus);
+    8020803c:	0001c797          	auipc	a5,0x1c
+    80208040:	af478793          	addi	a5,a5,-1292 # 80223b30 <fat>
+    80208044:	0127c783          	lbu	a5,18(a5)
+    80208048:	2781                	sext.w	a5,a5
+    8020804a:	85be                	mv	a1,a5
+    8020804c:	00006517          	auipc	a0,0x6
+    80208050:	d4450513          	addi	a0,a0,-700 # 8020dd90 <etext+0xd90>
+    80208054:	ffff8097          	auipc	ra,0xffff8
+    80208058:	19a080e7          	jalr	410(ra) # 802001ee <printf>
+    printf("[FAT32 init]fat_cnt: %d\n", fat.bpb.fat_cnt);
+    8020805c:	0001c797          	auipc	a5,0x1c
+    80208060:	ad478793          	addi	a5,a5,-1324 # 80223b30 <fat>
+    80208064:	0167c783          	lbu	a5,22(a5)
+    80208068:	2781                	sext.w	a5,a5
+    8020806a:	85be                	mv	a1,a5
+    8020806c:	00006517          	auipc	a0,0x6
+    80208070:	d4450513          	addi	a0,a0,-700 # 8020ddb0 <etext+0xdb0>
+    80208074:	ffff8097          	auipc	ra,0xffff8
+    80208078:	17a080e7          	jalr	378(ra) # 802001ee <printf>
+    printf("[FAT32 init]fat_sz: %d\n", fat.bpb.fat_sz);
+    8020807c:	0001c797          	auipc	a5,0x1c
+    80208080:	ab478793          	addi	a5,a5,-1356 # 80223b30 <fat>
+    80208084:	539c                	lw	a5,32(a5)
+    80208086:	85be                	mv	a1,a5
+    80208088:	00006517          	auipc	a0,0x6
+    8020808c:	d4850513          	addi	a0,a0,-696 # 8020ddd0 <etext+0xdd0>
+    80208090:	ffff8097          	auipc	ra,0xffff8
+    80208094:	15e080e7          	jalr	350(ra) # 802001ee <printf>
+    printf("[FAT32 init]first_data_sec: %d\n", fat.first_data_sec);
+    80208098:	0001c797          	auipc	a5,0x1c
+    8020809c:	a9878793          	addi	a5,a5,-1384 # 80223b30 <fat>
+    802080a0:	439c                	lw	a5,0(a5)
+    802080a2:	85be                	mv	a1,a5
+    802080a4:	00006517          	auipc	a0,0x6
+    802080a8:	d4450513          	addi	a0,a0,-700 # 8020dde8 <etext+0xde8>
+    802080ac:	ffff8097          	auipc	ra,0xffff8
+    802080b0:	142080e7          	jalr	322(ra) # 802001ee <printf>
+    #endif
+
+    // make sure that byts_per_sec has the same value with BSIZE 
+    if (BSIZE != fat.bpb.byts_per_sec) 
+    802080b4:	0001c797          	auipc	a5,0x1c
+    802080b8:	a7c78793          	addi	a5,a5,-1412 # 80223b30 <fat>
+    802080bc:	0107d783          	lhu	a5,16(a5)
+    802080c0:	0007871b          	sext.w	a4,a5
+    802080c4:	20000793          	li	a5,512
+    802080c8:	00f70a63          	beq	a4,a5,802080dc <fat32_init+0x2c4>
+        panic("byts_per_sec != BSIZE");
+    802080cc:	00006517          	auipc	a0,0x6
+    802080d0:	d3c50513          	addi	a0,a0,-708 # 8020de08 <etext+0xe08>
+    802080d4:	ffff8097          	auipc	ra,0xffff8
+    802080d8:	370080e7          	jalr	880(ra) # 80200444 <panic>
+    initlock(&ecache.lock, "ecache");
+    802080dc:	00006597          	auipc	a1,0x6
+    802080e0:	d4458593          	addi	a1,a1,-700 # 8020de20 <etext+0xe20>
+    802080e4:	0001c517          	auipc	a0,0x1c
+    802080e8:	a7450513          	addi	a0,a0,-1420 # 80223b58 <ecache>
+    802080ec:	ffff9097          	auipc	ra,0xffff9
+    802080f0:	8cc080e7          	jalr	-1844(ra) # 802009b8 <initlock>
+    memset(&root, 0, sizeof(root));
+    802080f4:	16800613          	li	a2,360
+    802080f8:	4581                	li	a1,0
+    802080fa:	00020517          	auipc	a0,0x20
+    802080fe:	0c650513          	addi	a0,a0,198 # 802281c0 <root>
+    80208102:	ffff9097          	auipc	ra,0xffff9
+    80208106:	9e4080e7          	jalr	-1564(ra) # 80200ae6 <memset>
+    initsleeplock(&root.lock, "entry");
+    8020810a:	00006597          	auipc	a1,0x6
+    8020810e:	d1e58593          	addi	a1,a1,-738 # 8020de28 <etext+0xe28>
+    80208112:	00020517          	auipc	a0,0x20
+    80208116:	1e650513          	addi	a0,a0,486 # 802282f8 <root+0x138>
+    8020811a:	ffffd097          	auipc	ra,0xffffd
+    8020811e:	3d0080e7          	jalr	976(ra) # 802054ea <initsleeplock>
+    root.attribute = (ATTR_DIRECTORY | ATTR_SYSTEM);
+    80208122:	00020797          	auipc	a5,0x20
+    80208126:	09e78793          	addi	a5,a5,158 # 802281c0 <root>
+    8020812a:	4751                	li	a4,20
+    8020812c:	10e78023          	sb	a4,256(a5)
+    root.first_clus = root.cur_clus = fat.bpb.root_clus;
+    80208130:	0001c797          	auipc	a5,0x1c
+    80208134:	a0078793          	addi	a5,a5,-1536 # 80223b30 <fat>
+    80208138:	53d8                	lw	a4,36(a5)
+    8020813a:	00020797          	auipc	a5,0x20
+    8020813e:	08678793          	addi	a5,a5,134 # 802281c0 <root>
+    80208142:	10e7a623          	sw	a4,268(a5)
+    80208146:	00020797          	auipc	a5,0x20
+    8020814a:	07a78793          	addi	a5,a5,122 # 802281c0 <root>
+    8020814e:	10c7a703          	lw	a4,268(a5)
+    80208152:	00020797          	auipc	a5,0x20
+    80208156:	06e78793          	addi	a5,a5,110 # 802281c0 <root>
+    8020815a:	10e7a223          	sw	a4,260(a5)
+    root.valid = 1;
+    8020815e:	00020797          	auipc	a5,0x20
+    80208162:	06278793          	addi	a5,a5,98 # 802281c0 <root>
+    80208166:	4705                	li	a4,1
+    80208168:	10e79b23          	sh	a4,278(a5)
+    root.prev = &root;
+    8020816c:	00020797          	auipc	a5,0x20
+    80208170:	05478793          	addi	a5,a5,84 # 802281c0 <root>
+    80208174:	00020717          	auipc	a4,0x20
+    80208178:	04c70713          	addi	a4,a4,76 # 802281c0 <root>
+    8020817c:	12e7b823          	sd	a4,304(a5)
+    root.next = &root;
+    80208180:	00020797          	auipc	a5,0x20
+    80208184:	04078793          	addi	a5,a5,64 # 802281c0 <root>
+    80208188:	00020717          	auipc	a4,0x20
+    8020818c:	03870713          	addi	a4,a4,56 # 802281c0 <root>
+    80208190:	12e7b423          	sd	a4,296(a5)
+    for(struct dirent *de = ecache.entries; de < ecache.entries + ENTRY_CACHE_NUM; de++) {
+    80208194:	0001c797          	auipc	a5,0x1c
+    80208198:	9dc78793          	addi	a5,a5,-1572 # 80223b70 <ecache+0x18>
+    8020819c:	fef43423          	sd	a5,-24(s0)
+    802081a0:	a861                	j	80208238 <fat32_init+0x420>
+        de->dev = 0;
+    802081a2:	fe843783          	ld	a5,-24(s0)
+    802081a6:	10078a23          	sb	zero,276(a5)
+        de->valid = 0;
+    802081aa:	fe843783          	ld	a5,-24(s0)
+    802081ae:	10079b23          	sh	zero,278(a5)
+        de->ref = 0;
+    802081b2:	fe843783          	ld	a5,-24(s0)
+    802081b6:	1007ac23          	sw	zero,280(a5)
+        de->dirty = 0;
+    802081ba:	fe843783          	ld	a5,-24(s0)
+    802081be:	10078aa3          	sb	zero,277(a5)
+        de->parent = 0;
+    802081c2:	fe843783          	ld	a5,-24(s0)
+    802081c6:	1207b023          	sd	zero,288(a5)
+        de->next = root.next;
+    802081ca:	00020797          	auipc	a5,0x20
+    802081ce:	ff678793          	addi	a5,a5,-10 # 802281c0 <root>
+    802081d2:	1287b703          	ld	a4,296(a5)
+    802081d6:	fe843783          	ld	a5,-24(s0)
+    802081da:	12e7b423          	sd	a4,296(a5)
+        de->prev = &root;
+    802081de:	fe843783          	ld	a5,-24(s0)
+    802081e2:	00020717          	auipc	a4,0x20
+    802081e6:	fde70713          	addi	a4,a4,-34 # 802281c0 <root>
+    802081ea:	12e7b823          	sd	a4,304(a5)
+        initsleeplock(&de->lock, "entry");
+    802081ee:	fe843783          	ld	a5,-24(s0)
+    802081f2:	13878793          	addi	a5,a5,312
+    802081f6:	00006597          	auipc	a1,0x6
+    802081fa:	c3258593          	addi	a1,a1,-974 # 8020de28 <etext+0xe28>
+    802081fe:	853e                	mv	a0,a5
+    80208200:	ffffd097          	auipc	ra,0xffffd
+    80208204:	2ea080e7          	jalr	746(ra) # 802054ea <initsleeplock>
+        root.next->prev = de;
+    80208208:	00020797          	auipc	a5,0x20
+    8020820c:	fb878793          	addi	a5,a5,-72 # 802281c0 <root>
+    80208210:	1287b783          	ld	a5,296(a5)
+    80208214:	fe843703          	ld	a4,-24(s0)
+    80208218:	12e7b823          	sd	a4,304(a5)
+        root.next = de;
+    8020821c:	00020797          	auipc	a5,0x20
+    80208220:	fa478793          	addi	a5,a5,-92 # 802281c0 <root>
+    80208224:	fe843703          	ld	a4,-24(s0)
+    80208228:	12e7b423          	sd	a4,296(a5)
+    for(struct dirent *de = ecache.entries; de < ecache.entries + ENTRY_CACHE_NUM; de++) {
+    8020822c:	fe843783          	ld	a5,-24(s0)
+    80208230:	16878793          	addi	a5,a5,360
+    80208234:	fef43423          	sd	a5,-24(s0)
+    80208238:	00020797          	auipc	a5,0x20
+    8020823c:	f8878793          	addi	a5,a5,-120 # 802281c0 <root>
+    80208240:	fe843703          	ld	a4,-24(s0)
+    80208244:	f4f76fe3          	bltu	a4,a5,802081a2 <fat32_init+0x38a>
+    }
+    return 0;
+    80208248:	4781                	li	a5,0
+}
+    8020824a:	853e                	mv	a0,a5
+    8020824c:	60e2                	ld	ra,24(sp)
+    8020824e:	6442                	ld	s0,16(sp)
+    80208250:	6105                	addi	sp,sp,32
+    80208252:	8082                	ret
+
+0000000080208254 <first_sec_of_clus>:
+
+/**
+ * @param   cluster   cluster number starts from 2, which means no 0 and 1
+ */
+static inline uint32 first_sec_of_clus(uint32 cluster)
+{
+    80208254:	1101                	addi	sp,sp,-32
+    80208256:	ec22                	sd	s0,24(sp)
+    80208258:	1000                	addi	s0,sp,32
+    8020825a:	87aa                	mv	a5,a0
+    8020825c:	fef42623          	sw	a5,-20(s0)
+    return ((cluster - 2) * fat.bpb.sec_per_clus) + fat.first_data_sec;
+    80208260:	fec42783          	lw	a5,-20(s0)
+    80208264:	37f9                	addiw	a5,a5,-2
+    80208266:	0007871b          	sext.w	a4,a5
+    8020826a:	0001c797          	auipc	a5,0x1c
+    8020826e:	8c678793          	addi	a5,a5,-1850 # 80223b30 <fat>
+    80208272:	0127c783          	lbu	a5,18(a5)
+    80208276:	2781                	sext.w	a5,a5
+    80208278:	02f707bb          	mulw	a5,a4,a5
+    8020827c:	0007871b          	sext.w	a4,a5
+    80208280:	0001c797          	auipc	a5,0x1c
+    80208284:	8b078793          	addi	a5,a5,-1872 # 80223b30 <fat>
+    80208288:	439c                	lw	a5,0(a5)
+    8020828a:	9fb9                	addw	a5,a5,a4
+    8020828c:	2781                	sext.w	a5,a5
+}
+    8020828e:	853e                	mv	a0,a5
+    80208290:	6462                	ld	s0,24(sp)
+    80208292:	6105                	addi	sp,sp,32
+    80208294:	8082                	ret
+
+0000000080208296 <fat_sec_of_clus>:
+ * For the given number of a data cluster, return the number of the sector in a FAT table.
+ * @param   cluster     number of a data cluster
+ * @param   fat_num     number of FAT table from 1, shouldn't be larger than bpb::fat_cnt
+ */
+static inline uint32 fat_sec_of_clus(uint32 cluster, uint8 fat_num)
+{
+    80208296:	1101                	addi	sp,sp,-32
+    80208298:	ec22                	sd	s0,24(sp)
+    8020829a:	1000                	addi	s0,sp,32
+    8020829c:	87aa                	mv	a5,a0
+    8020829e:	872e                	mv	a4,a1
+    802082a0:	fef42623          	sw	a5,-20(s0)
+    802082a4:	87ba                	mv	a5,a4
+    802082a6:	fef405a3          	sb	a5,-21(s0)
+    return fat.bpb.rsvd_sec_cnt + (cluster << 2) / fat.bpb.byts_per_sec + fat.bpb.fat_sz * (fat_num - 1);
+    802082aa:	0001c797          	auipc	a5,0x1c
+    802082ae:	88678793          	addi	a5,a5,-1914 # 80223b30 <fat>
+    802082b2:	0147d783          	lhu	a5,20(a5)
+    802082b6:	0007871b          	sext.w	a4,a5
+    802082ba:	fec42783          	lw	a5,-20(s0)
+    802082be:	0027979b          	slliw	a5,a5,0x2
+    802082c2:	0007869b          	sext.w	a3,a5
+    802082c6:	0001c797          	auipc	a5,0x1c
+    802082ca:	86a78793          	addi	a5,a5,-1942 # 80223b30 <fat>
+    802082ce:	0107d783          	lhu	a5,16(a5)
+    802082d2:	2781                	sext.w	a5,a5
+    802082d4:	02f6d7bb          	divuw	a5,a3,a5
+    802082d8:	2781                	sext.w	a5,a5
+    802082da:	9fb9                	addw	a5,a5,a4
+    802082dc:	0007871b          	sext.w	a4,a5
+    802082e0:	0001c797          	auipc	a5,0x1c
+    802082e4:	85078793          	addi	a5,a5,-1968 # 80223b30 <fat>
+    802082e8:	5394                	lw	a3,32(a5)
+    802082ea:	feb44783          	lbu	a5,-21(s0)
+    802082ee:	2781                	sext.w	a5,a5
+    802082f0:	37fd                	addiw	a5,a5,-1
+    802082f2:	2781                	sext.w	a5,a5
+    802082f4:	2781                	sext.w	a5,a5
+    802082f6:	02f687bb          	mulw	a5,a3,a5
+    802082fa:	2781                	sext.w	a5,a5
+    802082fc:	9fb9                	addw	a5,a5,a4
+    802082fe:	2781                	sext.w	a5,a5
+}
+    80208300:	853e                	mv	a0,a5
+    80208302:	6462                	ld	s0,24(sp)
+    80208304:	6105                	addi	sp,sp,32
+    80208306:	8082                	ret
+
+0000000080208308 <fat_offset_of_clus>:
+/**
+ * For the given number of a data cluster, return the offest in the corresponding sector in a FAT table.
+ * @param   cluster   number of a data cluster
+ */
+static inline uint32 fat_offset_of_clus(uint32 cluster)
+{
+    80208308:	1101                	addi	sp,sp,-32
+    8020830a:	ec22                	sd	s0,24(sp)
+    8020830c:	1000                	addi	s0,sp,32
+    8020830e:	87aa                	mv	a5,a0
+    80208310:	fef42623          	sw	a5,-20(s0)
+    return (cluster << 2) % fat.bpb.byts_per_sec;
+    80208314:	fec42783          	lw	a5,-20(s0)
+    80208318:	0027979b          	slliw	a5,a5,0x2
+    8020831c:	0007871b          	sext.w	a4,a5
+    80208320:	0001c797          	auipc	a5,0x1c
+    80208324:	81078793          	addi	a5,a5,-2032 # 80223b30 <fat>
+    80208328:	0107d783          	lhu	a5,16(a5)
+    8020832c:	2781                	sext.w	a5,a5
+    8020832e:	02f777bb          	remuw	a5,a4,a5
+    80208332:	2781                	sext.w	a5,a5
+}
+    80208334:	853e                	mv	a0,a5
+    80208336:	6462                	ld	s0,24(sp)
+    80208338:	6105                	addi	sp,sp,32
+    8020833a:	8082                	ret
+
+000000008020833c <read_fat>:
+/**
+ * Read the FAT table content corresponded to the given cluster number.
+ * @param   cluster     the number of cluster which you want to read its content in FAT table
+ */
+static uint32 read_fat(uint32 cluster)
+{
+    8020833c:	715d                	addi	sp,sp,-80
+    8020833e:	e486                	sd	ra,72(sp)
+    80208340:	e0a2                	sd	s0,64(sp)
+    80208342:	fc26                	sd	s1,56(sp)
+    80208344:	0880                	addi	s0,sp,80
+    80208346:	87aa                	mv	a5,a0
+    80208348:	faf42e23          	sw	a5,-68(s0)
+    if (cluster >= FAT32_EOC) {
+    8020834c:	fbc42783          	lw	a5,-68(s0)
+    80208350:	0007871b          	sext.w	a4,a5
+    80208354:	100007b7          	lui	a5,0x10000
+    80208358:	17dd                	addi	a5,a5,-9
+    8020835a:	00e7f563          	bgeu	a5,a4,80208364 <read_fat+0x28>
+        return cluster;
+    8020835e:	fbc42783          	lw	a5,-68(s0)
+    80208362:	a041                	j	802083e2 <read_fat+0xa6>
+    }
+    if (cluster > fat.data_clus_cnt + 1) {     // because cluster number starts at 2, not 0
+    80208364:	0001b797          	auipc	a5,0x1b
+    80208368:	7cc78793          	addi	a5,a5,1996 # 80223b30 <fat>
+    8020836c:	479c                	lw	a5,8(a5)
+    8020836e:	2785                	addiw	a5,a5,1
+    80208370:	0007871b          	sext.w	a4,a5
+    80208374:	fbc42783          	lw	a5,-68(s0)
+    80208378:	2781                	sext.w	a5,a5
+    8020837a:	00f77463          	bgeu	a4,a5,80208382 <read_fat+0x46>
+        return 0;
+    8020837e:	4781                	li	a5,0
+    80208380:	a08d                	j	802083e2 <read_fat+0xa6>
+    }
+    uint32 fat_sec = fat_sec_of_clus(cluster, 1);
+    80208382:	fbc42783          	lw	a5,-68(s0)
+    80208386:	4585                	li	a1,1
+    80208388:	853e                	mv	a0,a5
+    8020838a:	00000097          	auipc	ra,0x0
+    8020838e:	f0c080e7          	jalr	-244(ra) # 80208296 <fat_sec_of_clus>
+    80208392:	87aa                	mv	a5,a0
+    80208394:	fcf42e23          	sw	a5,-36(s0)
+    // here should be a cache layer for FAT table, but not implemented yet.
+    struct buf *b = bread(0, fat_sec);
+    80208398:	fdc42783          	lw	a5,-36(s0)
+    8020839c:	85be                	mv	a1,a5
+    8020839e:	4501                	li	a0,0
+    802083a0:	ffffd097          	auipc	ra,0xffffd
+    802083a4:	f2e080e7          	jalr	-210(ra) # 802052ce <bread>
+    802083a8:	fca43823          	sd	a0,-48(s0)
+    uint32 next_clus = *(uint32 *)(b->data + fat_offset_of_clus(cluster));
+    802083ac:	fd043783          	ld	a5,-48(s0)
+    802083b0:	05878493          	addi	s1,a5,88
+    802083b4:	fbc42783          	lw	a5,-68(s0)
+    802083b8:	853e                	mv	a0,a5
+    802083ba:	00000097          	auipc	ra,0x0
+    802083be:	f4e080e7          	jalr	-178(ra) # 80208308 <fat_offset_of_clus>
+    802083c2:	87aa                	mv	a5,a0
+    802083c4:	2781                	sext.w	a5,a5
+    802083c6:	1782                	slli	a5,a5,0x20
+    802083c8:	9381                	srli	a5,a5,0x20
+    802083ca:	97a6                	add	a5,a5,s1
+    802083cc:	439c                	lw	a5,0(a5)
+    802083ce:	fcf42623          	sw	a5,-52(s0)
+    brelse(b);
+    802083d2:	fd043503          	ld	a0,-48(s0)
+    802083d6:	ffffd097          	auipc	ra,0xffffd
+    802083da:	f96080e7          	jalr	-106(ra) # 8020536c <brelse>
+    return next_clus;
+    802083de:	fcc42783          	lw	a5,-52(s0)
+}
+    802083e2:	853e                	mv	a0,a5
+    802083e4:	60a6                	ld	ra,72(sp)
+    802083e6:	6406                	ld	s0,64(sp)
+    802083e8:	74e2                	ld	s1,56(sp)
+    802083ea:	6161                	addi	sp,sp,80
+    802083ec:	8082                	ret
+
+00000000802083ee <write_fat>:
+ * Write the FAT region content corresponded to the given cluster number.
+ * @param   cluster     the number of cluster to write its content in FAT table
+ * @param   content     the content which should be the next cluster number of FAT end of chain flag
+ */
+static int write_fat(uint32 cluster, uint32 content)
+{
+    802083ee:	7139                	addi	sp,sp,-64
+    802083f0:	fc06                	sd	ra,56(sp)
+    802083f2:	f822                	sd	s0,48(sp)
+    802083f4:	0080                	addi	s0,sp,64
+    802083f6:	87aa                	mv	a5,a0
+    802083f8:	872e                	mv	a4,a1
+    802083fa:	fcf42623          	sw	a5,-52(s0)
+    802083fe:	87ba                	mv	a5,a4
+    80208400:	fcf42423          	sw	a5,-56(s0)
+    if (cluster > fat.data_clus_cnt + 1) {
+    80208404:	0001b797          	auipc	a5,0x1b
+    80208408:	72c78793          	addi	a5,a5,1836 # 80223b30 <fat>
+    8020840c:	479c                	lw	a5,8(a5)
+    8020840e:	2785                	addiw	a5,a5,1
+    80208410:	0007871b          	sext.w	a4,a5
+    80208414:	fcc42783          	lw	a5,-52(s0)
+    80208418:	2781                	sext.w	a5,a5
+    8020841a:	00f77463          	bgeu	a4,a5,80208422 <write_fat+0x34>
+        return -1;
+    8020841e:	57fd                	li	a5,-1
+    80208420:	a0bd                	j	8020848e <write_fat+0xa0>
+    }
+    uint32 fat_sec = fat_sec_of_clus(cluster, 1);
+    80208422:	fcc42783          	lw	a5,-52(s0)
+    80208426:	4585                	li	a1,1
+    80208428:	853e                	mv	a0,a5
+    8020842a:	00000097          	auipc	ra,0x0
+    8020842e:	e6c080e7          	jalr	-404(ra) # 80208296 <fat_sec_of_clus>
+    80208432:	87aa                	mv	a5,a0
+    80208434:	fef42623          	sw	a5,-20(s0)
+    struct buf *b = bread(0, fat_sec);
+    80208438:	fec42783          	lw	a5,-20(s0)
+    8020843c:	85be                	mv	a1,a5
+    8020843e:	4501                	li	a0,0
+    80208440:	ffffd097          	auipc	ra,0xffffd
+    80208444:	e8e080e7          	jalr	-370(ra) # 802052ce <bread>
+    80208448:	fea43023          	sd	a0,-32(s0)
+    uint off = fat_offset_of_clus(cluster);
+    8020844c:	fcc42783          	lw	a5,-52(s0)
+    80208450:	853e                	mv	a0,a5
+    80208452:	00000097          	auipc	ra,0x0
+    80208456:	eb6080e7          	jalr	-330(ra) # 80208308 <fat_offset_of_clus>
+    8020845a:	87aa                	mv	a5,a0
+    8020845c:	fcf42e23          	sw	a5,-36(s0)
+    *(uint32 *)(b->data + off) = content;
+    80208460:	fe043783          	ld	a5,-32(s0)
+    80208464:	05878713          	addi	a4,a5,88
+    80208468:	fdc46783          	lwu	a5,-36(s0)
+    8020846c:	97ba                	add	a5,a5,a4
+    8020846e:	fc842703          	lw	a4,-56(s0)
+    80208472:	c398                	sw	a4,0(a5)
+    bwrite(b);
+    80208474:	fe043503          	ld	a0,-32(s0)
+    80208478:	ffffd097          	auipc	ra,0xffffd
+    8020847c:	eae080e7          	jalr	-338(ra) # 80205326 <bwrite>
+    brelse(b);
+    80208480:	fe043503          	ld	a0,-32(s0)
+    80208484:	ffffd097          	auipc	ra,0xffffd
+    80208488:	ee8080e7          	jalr	-280(ra) # 8020536c <brelse>
+    return 0;
+    8020848c:	4781                	li	a5,0
+}
+    8020848e:	853e                	mv	a0,a5
+    80208490:	70e2                	ld	ra,56(sp)
+    80208492:	7442                	ld	s0,48(sp)
+    80208494:	6121                	addi	sp,sp,64
+    80208496:	8082                	ret
+
+0000000080208498 <zero_clus>:
+
+static void zero_clus(uint32 cluster)
+{
+    80208498:	7179                	addi	sp,sp,-48
+    8020849a:	f406                	sd	ra,40(sp)
+    8020849c:	f022                	sd	s0,32(sp)
+    8020849e:	1800                	addi	s0,sp,48
+    802084a0:	87aa                	mv	a5,a0
+    802084a2:	fcf42e23          	sw	a5,-36(s0)
+    uint32 sec = first_sec_of_clus(cluster);
+    802084a6:	fdc42783          	lw	a5,-36(s0)
+    802084aa:	853e                	mv	a0,a5
+    802084ac:	00000097          	auipc	ra,0x0
+    802084b0:	da8080e7          	jalr	-600(ra) # 80208254 <first_sec_of_clus>
+    802084b4:	87aa                	mv	a5,a0
+    802084b6:	fef42623          	sw	a5,-20(s0)
+    struct buf *b;
+    for (int i = 0; i < fat.bpb.sec_per_clus; i++) {
+    802084ba:	fe042423          	sw	zero,-24(s0)
+    802084be:	a8a1                	j	80208516 <zero_clus+0x7e>
+        b = bread(0, sec++);
+    802084c0:	fec42783          	lw	a5,-20(s0)
+    802084c4:	0017871b          	addiw	a4,a5,1
+    802084c8:	fee42623          	sw	a4,-20(s0)
+    802084cc:	85be                	mv	a1,a5
+    802084ce:	4501                	li	a0,0
+    802084d0:	ffffd097          	auipc	ra,0xffffd
+    802084d4:	dfe080e7          	jalr	-514(ra) # 802052ce <bread>
+    802084d8:	fea43023          	sd	a0,-32(s0)
+        memset(b->data, 0, BSIZE);
+    802084dc:	fe043783          	ld	a5,-32(s0)
+    802084e0:	05878793          	addi	a5,a5,88
+    802084e4:	20000613          	li	a2,512
+    802084e8:	4581                	li	a1,0
+    802084ea:	853e                	mv	a0,a5
+    802084ec:	ffff8097          	auipc	ra,0xffff8
+    802084f0:	5fa080e7          	jalr	1530(ra) # 80200ae6 <memset>
+        bwrite(b);
+    802084f4:	fe043503          	ld	a0,-32(s0)
+    802084f8:	ffffd097          	auipc	ra,0xffffd
+    802084fc:	e2e080e7          	jalr	-466(ra) # 80205326 <bwrite>
+        brelse(b);
+    80208500:	fe043503          	ld	a0,-32(s0)
+    80208504:	ffffd097          	auipc	ra,0xffffd
+    80208508:	e68080e7          	jalr	-408(ra) # 8020536c <brelse>
+    for (int i = 0; i < fat.bpb.sec_per_clus; i++) {
+    8020850c:	fe842783          	lw	a5,-24(s0)
+    80208510:	2785                	addiw	a5,a5,1
+    80208512:	fef42423          	sw	a5,-24(s0)
+    80208516:	0001b797          	auipc	a5,0x1b
+    8020851a:	61a78793          	addi	a5,a5,1562 # 80223b30 <fat>
+    8020851e:	0127c783          	lbu	a5,18(a5)
+    80208522:	0007871b          	sext.w	a4,a5
+    80208526:	fe842783          	lw	a5,-24(s0)
+    8020852a:	2781                	sext.w	a5,a5
+    8020852c:	f8e7cae3          	blt	a5,a4,802084c0 <zero_clus+0x28>
+    }
+}
+    80208530:	0001                	nop
+    80208532:	0001                	nop
+    80208534:	70a2                	ld	ra,40(sp)
+    80208536:	7402                	ld	s0,32(sp)
+    80208538:	6145                	addi	sp,sp,48
+    8020853a:	8082                	ret
+
+000000008020853c <alloc_clus>:
+
+static uint32 alloc_clus(uint8 dev)
+{
+    8020853c:	7139                	addi	sp,sp,-64
+    8020853e:	fc06                	sd	ra,56(sp)
+    80208540:	f822                	sd	s0,48(sp)
+    80208542:	0080                	addi	s0,sp,64
+    80208544:	87aa                	mv	a5,a0
+    80208546:	fcf407a3          	sb	a5,-49(s0)
+    // should we keep a free cluster list? instead of searching fat every time.
+    struct buf *b;
+    uint32 sec = fat.bpb.rsvd_sec_cnt;
+    8020854a:	0001b797          	auipc	a5,0x1b
+    8020854e:	5e678793          	addi	a5,a5,1510 # 80223b30 <fat>
+    80208552:	0147d783          	lhu	a5,20(a5)
+    80208556:	fef42623          	sw	a5,-20(s0)
+    uint32 const ent_per_sec = fat.bpb.byts_per_sec / sizeof(uint32);
+    8020855a:	0001b797          	auipc	a5,0x1b
+    8020855e:	5d678793          	addi	a5,a5,1494 # 80223b30 <fat>
+    80208562:	0107d783          	lhu	a5,16(a5)
+    80208566:	0027d79b          	srliw	a5,a5,0x2
+    8020856a:	17c2                	slli	a5,a5,0x30
+    8020856c:	93c1                	srli	a5,a5,0x30
+    8020856e:	fef42023          	sw	a5,-32(s0)
+    for (uint32 i = 0; i < fat.bpb.fat_sz; i++, sec++) {
+    80208572:	fe042423          	sw	zero,-24(s0)
+    80208576:	a0f1                	j	80208642 <alloc_clus+0x106>
+        b = bread(dev, sec);
+    80208578:	fcf44783          	lbu	a5,-49(s0)
+    8020857c:	2781                	sext.w	a5,a5
+    8020857e:	fec42703          	lw	a4,-20(s0)
+    80208582:	85ba                	mv	a1,a4
+    80208584:	853e                	mv	a0,a5
+    80208586:	ffffd097          	auipc	ra,0xffffd
+    8020858a:	d48080e7          	jalr	-696(ra) # 802052ce <bread>
+    8020858e:	fca43c23          	sd	a0,-40(s0)
+        for (uint32 j = 0; j < ent_per_sec; j++) {
+    80208592:	fe042223          	sw	zero,-28(s0)
+    80208596:	a8b5                	j	80208612 <alloc_clus+0xd6>
+            if (((uint32 *)(b->data))[j] == 0) {
+    80208598:	fd843783          	ld	a5,-40(s0)
+    8020859c:	05878713          	addi	a4,a5,88
+    802085a0:	fe446783          	lwu	a5,-28(s0)
+    802085a4:	078a                	slli	a5,a5,0x2
+    802085a6:	97ba                	add	a5,a5,a4
+    802085a8:	439c                	lw	a5,0(a5)
+    802085aa:	efb9                	bnez	a5,80208608 <alloc_clus+0xcc>
+                ((uint32 *)(b->data))[j] = FAT32_EOC + 7;
+    802085ac:	fd843783          	ld	a5,-40(s0)
+    802085b0:	05878713          	addi	a4,a5,88
+    802085b4:	fe446783          	lwu	a5,-28(s0)
+    802085b8:	078a                	slli	a5,a5,0x2
+    802085ba:	97ba                	add	a5,a5,a4
+    802085bc:	10000737          	lui	a4,0x10000
+    802085c0:	377d                	addiw	a4,a4,-1
+    802085c2:	c398                	sw	a4,0(a5)
+                bwrite(b);
+    802085c4:	fd843503          	ld	a0,-40(s0)
+    802085c8:	ffffd097          	auipc	ra,0xffffd
+    802085cc:	d5e080e7          	jalr	-674(ra) # 80205326 <bwrite>
+                brelse(b);
+    802085d0:	fd843503          	ld	a0,-40(s0)
+    802085d4:	ffffd097          	auipc	ra,0xffffd
+    802085d8:	d98080e7          	jalr	-616(ra) # 8020536c <brelse>
+                uint32 clus = i * ent_per_sec + j;
+    802085dc:	fe842703          	lw	a4,-24(s0)
+    802085e0:	fe042783          	lw	a5,-32(s0)
+    802085e4:	02f707bb          	mulw	a5,a4,a5
+    802085e8:	2781                	sext.w	a5,a5
+    802085ea:	fe442703          	lw	a4,-28(s0)
+    802085ee:	9fb9                	addw	a5,a5,a4
+    802085f0:	fcf42a23          	sw	a5,-44(s0)
+                zero_clus(clus);
+    802085f4:	fd442783          	lw	a5,-44(s0)
+    802085f8:	853e                	mv	a0,a5
+    802085fa:	00000097          	auipc	ra,0x0
+    802085fe:	e9e080e7          	jalr	-354(ra) # 80208498 <zero_clus>
+                return clus;
+    80208602:	fd442783          	lw	a5,-44(s0)
+    80208606:	a085                	j	80208666 <alloc_clus+0x12a>
+        for (uint32 j = 0; j < ent_per_sec; j++) {
+    80208608:	fe442783          	lw	a5,-28(s0)
+    8020860c:	2785                	addiw	a5,a5,1
+    8020860e:	fef42223          	sw	a5,-28(s0)
+    80208612:	fe442703          	lw	a4,-28(s0)
+    80208616:	fe042783          	lw	a5,-32(s0)
+    8020861a:	2701                	sext.w	a4,a4
+    8020861c:	2781                	sext.w	a5,a5
+    8020861e:	f6f76de3          	bltu	a4,a5,80208598 <alloc_clus+0x5c>
+            }
+        }
+        brelse(b);
+    80208622:	fd843503          	ld	a0,-40(s0)
+    80208626:	ffffd097          	auipc	ra,0xffffd
+    8020862a:	d46080e7          	jalr	-698(ra) # 8020536c <brelse>
+    for (uint32 i = 0; i < fat.bpb.fat_sz; i++, sec++) {
+    8020862e:	fe842783          	lw	a5,-24(s0)
+    80208632:	2785                	addiw	a5,a5,1
+    80208634:	fef42423          	sw	a5,-24(s0)
+    80208638:	fec42783          	lw	a5,-20(s0)
+    8020863c:	2785                	addiw	a5,a5,1
+    8020863e:	fef42623          	sw	a5,-20(s0)
+    80208642:	0001b797          	auipc	a5,0x1b
+    80208646:	4ee78793          	addi	a5,a5,1262 # 80223b30 <fat>
+    8020864a:	5398                	lw	a4,32(a5)
+    8020864c:	fe842783          	lw	a5,-24(s0)
+    80208650:	2781                	sext.w	a5,a5
+    80208652:	f2e7e3e3          	bltu	a5,a4,80208578 <alloc_clus+0x3c>
+    }
+    panic("no clusters");
+    80208656:	00005517          	auipc	a0,0x5
+    8020865a:	7da50513          	addi	a0,a0,2010 # 8020de30 <etext+0xe30>
+    8020865e:	ffff8097          	auipc	ra,0xffff8
+    80208662:	de6080e7          	jalr	-538(ra) # 80200444 <panic>
+}
+    80208666:	853e                	mv	a0,a5
+    80208668:	70e2                	ld	ra,56(sp)
+    8020866a:	7442                	ld	s0,48(sp)
+    8020866c:	6121                	addi	sp,sp,64
+    8020866e:	8082                	ret
+
+0000000080208670 <free_clus>:
+
+static void free_clus(uint32 cluster)
+{
+    80208670:	1101                	addi	sp,sp,-32
+    80208672:	ec06                	sd	ra,24(sp)
+    80208674:	e822                	sd	s0,16(sp)
+    80208676:	1000                	addi	s0,sp,32
+    80208678:	87aa                	mv	a5,a0
+    8020867a:	fef42623          	sw	a5,-20(s0)
+    write_fat(cluster, 0);
+    8020867e:	fec42783          	lw	a5,-20(s0)
+    80208682:	4581                	li	a1,0
+    80208684:	853e                	mv	a0,a5
+    80208686:	00000097          	auipc	ra,0x0
+    8020868a:	d68080e7          	jalr	-664(ra) # 802083ee <write_fat>
+}
+    8020868e:	0001                	nop
+    80208690:	60e2                	ld	ra,24(sp)
+    80208692:	6442                	ld	s0,16(sp)
+    80208694:	6105                	addi	sp,sp,32
+    80208696:	8082                	ret
+
+0000000080208698 <rw_clus>:
+
+static uint rw_clus(uint32 cluster, int write, int user, uint64 data, uint off, uint n)
+{
+    80208698:	715d                	addi	sp,sp,-80
+    8020869a:	e486                	sd	ra,72(sp)
+    8020869c:	e0a2                	sd	s0,64(sp)
+    8020869e:	0880                	addi	s0,sp,80
+    802086a0:	fad43c23          	sd	a3,-72(s0)
+    802086a4:	86ba                	mv	a3,a4
+    802086a6:	873e                	mv	a4,a5
+    802086a8:	87aa                	mv	a5,a0
+    802086aa:	fcf42623          	sw	a5,-52(s0)
+    802086ae:	87ae                	mv	a5,a1
+    802086b0:	fcf42423          	sw	a5,-56(s0)
+    802086b4:	87b2                	mv	a5,a2
+    802086b6:	fcf42223          	sw	a5,-60(s0)
+    802086ba:	87b6                	mv	a5,a3
+    802086bc:	fcf42023          	sw	a5,-64(s0)
+    802086c0:	87ba                	mv	a5,a4
+    802086c2:	faf42a23          	sw	a5,-76(s0)
+    if (off + n > fat.byts_per_clus)
+    802086c6:	fc042703          	lw	a4,-64(s0)
+    802086ca:	fb442783          	lw	a5,-76(s0)
+    802086ce:	9fb9                	addw	a5,a5,a4
+    802086d0:	0007871b          	sext.w	a4,a5
+    802086d4:	0001b797          	auipc	a5,0x1b
+    802086d8:	45c78793          	addi	a5,a5,1116 # 80223b30 <fat>
+    802086dc:	47dc                	lw	a5,12(a5)
+    802086de:	00e7fa63          	bgeu	a5,a4,802086f2 <rw_clus+0x5a>
+        panic("offset out of range");
+    802086e2:	00005517          	auipc	a0,0x5
+    802086e6:	75e50513          	addi	a0,a0,1886 # 8020de40 <etext+0xe40>
+    802086ea:	ffff8097          	auipc	ra,0xffff8
+    802086ee:	d5a080e7          	jalr	-678(ra) # 80200444 <panic>
+    uint tot, m;
+    struct buf *bp;
+    uint sec = first_sec_of_clus(cluster) + off / fat.bpb.byts_per_sec;
+    802086f2:	fcc42783          	lw	a5,-52(s0)
+    802086f6:	853e                	mv	a0,a5
+    802086f8:	00000097          	auipc	ra,0x0
+    802086fc:	b5c080e7          	jalr	-1188(ra) # 80208254 <first_sec_of_clus>
+    80208700:	87aa                	mv	a5,a0
+    80208702:	0007871b          	sext.w	a4,a5
+    80208706:	0001b797          	auipc	a5,0x1b
+    8020870a:	42a78793          	addi	a5,a5,1066 # 80223b30 <fat>
+    8020870e:	0107d783          	lhu	a5,16(a5)
+    80208712:	2781                	sext.w	a5,a5
+    80208714:	fc042683          	lw	a3,-64(s0)
+    80208718:	02f6d7bb          	divuw	a5,a3,a5
+    8020871c:	2781                	sext.w	a5,a5
+    8020871e:	9fb9                	addw	a5,a5,a4
+    80208720:	fef42223          	sw	a5,-28(s0)
+    off = off % fat.bpb.byts_per_sec;
+    80208724:	0001b797          	auipc	a5,0x1b
+    80208728:	40c78793          	addi	a5,a5,1036 # 80223b30 <fat>
+    8020872c:	0107d783          	lhu	a5,16(a5)
+    80208730:	2781                	sext.w	a5,a5
+    80208732:	fc042703          	lw	a4,-64(s0)
+    80208736:	02f777bb          	remuw	a5,a4,a5
+    8020873a:	fcf42023          	sw	a5,-64(s0)
+
+    int bad = 0;
+    8020873e:	fe042023          	sw	zero,-32(s0)
+    for (tot = 0; tot < n; tot += m, off += m, data += m, sec++) {
+    80208742:	fe042623          	sw	zero,-20(s0)
+    80208746:	a225                	j	8020886e <rw_clus+0x1d6>
+        bp = bread(0, sec);
+    80208748:	fe442783          	lw	a5,-28(s0)
+    8020874c:	85be                	mv	a1,a5
+    8020874e:	4501                	li	a0,0
+    80208750:	ffffd097          	auipc	ra,0xffffd
+    80208754:	b7e080e7          	jalr	-1154(ra) # 802052ce <bread>
+    80208758:	fca43c23          	sd	a0,-40(s0)
+        m = BSIZE - off % BSIZE;
+    8020875c:	fc042783          	lw	a5,-64(s0)
+    80208760:	1ff7f793          	andi	a5,a5,511
+    80208764:	2781                	sext.w	a5,a5
+    80208766:	20000713          	li	a4,512
+    8020876a:	40f707bb          	subw	a5,a4,a5
+    8020876e:	fef42423          	sw	a5,-24(s0)
+        if (n - tot < m) {
+    80208772:	fb442703          	lw	a4,-76(s0)
+    80208776:	fec42783          	lw	a5,-20(s0)
+    8020877a:	40f707bb          	subw	a5,a4,a5
+    8020877e:	0007871b          	sext.w	a4,a5
+    80208782:	fe842783          	lw	a5,-24(s0)
+    80208786:	2781                	sext.w	a5,a5
+    80208788:	00f77a63          	bgeu	a4,a5,8020879c <rw_clus+0x104>
+            m = n - tot;
+    8020878c:	fb442703          	lw	a4,-76(s0)
+    80208790:	fec42783          	lw	a5,-20(s0)
+    80208794:	40f707bb          	subw	a5,a4,a5
+    80208798:	fef42423          	sw	a5,-24(s0)
+        }
+        if (write) {
+    8020879c:	fc842783          	lw	a5,-56(s0)
+    802087a0:	2781                	sext.w	a5,a5
+    802087a2:	c7b9                	beqz	a5,802087f0 <rw_clus+0x158>
+            if ((bad = either_copyin(bp->data + (off % BSIZE), user, data, m)) != -1) {
+    802087a4:	fd843783          	ld	a5,-40(s0)
+    802087a8:	05878713          	addi	a4,a5,88
+    802087ac:	fc046783          	lwu	a5,-64(s0)
+    802087b0:	1ff7f793          	andi	a5,a5,511
+    802087b4:	97ba                	add	a5,a5,a4
+    802087b6:	fe846683          	lwu	a3,-24(s0)
+    802087ba:	fc442703          	lw	a4,-60(s0)
+    802087be:	fb843603          	ld	a2,-72(s0)
+    802087c2:	85ba                	mv	a1,a4
+    802087c4:	853e                	mv	a0,a5
+    802087c6:	ffffb097          	auipc	ra,0xffffb
+    802087ca:	268080e7          	jalr	616(ra) # 80203a2e <either_copyin>
+    802087ce:	87aa                	mv	a5,a0
+    802087d0:	fef42023          	sw	a5,-32(s0)
+    802087d4:	fe042783          	lw	a5,-32(s0)
+    802087d8:	0007871b          	sext.w	a4,a5
+    802087dc:	57fd                	li	a5,-1
+    802087de:	04f70163          	beq	a4,a5,80208820 <rw_clus+0x188>
+                bwrite(bp);
+    802087e2:	fd843503          	ld	a0,-40(s0)
+    802087e6:	ffffd097          	auipc	ra,0xffffd
+    802087ea:	b40080e7          	jalr	-1216(ra) # 80205326 <bwrite>
+    802087ee:	a80d                	j	80208820 <rw_clus+0x188>
+            }
+        } else {
+            bad = either_copyout(user, data, bp->data + (off % BSIZE), m);
+    802087f0:	fd843783          	ld	a5,-40(s0)
+    802087f4:	05878713          	addi	a4,a5,88
+    802087f8:	fc046783          	lwu	a5,-64(s0)
+    802087fc:	1ff7f793          	andi	a5,a5,511
+    80208800:	973e                	add	a4,a4,a5
+    80208802:	fe846683          	lwu	a3,-24(s0)
+    80208806:	fc442783          	lw	a5,-60(s0)
+    8020880a:	863a                	mv	a2,a4
+    8020880c:	fb843583          	ld	a1,-72(s0)
+    80208810:	853e                	mv	a0,a5
+    80208812:	ffffb097          	auipc	ra,0xffffb
+    80208816:	1bc080e7          	jalr	444(ra) # 802039ce <either_copyout>
+    8020881a:	87aa                	mv	a5,a0
+    8020881c:	fef42023          	sw	a5,-32(s0)
+        }
+        brelse(bp);
+    80208820:	fd843503          	ld	a0,-40(s0)
+    80208824:	ffffd097          	auipc	ra,0xffffd
+    80208828:	b48080e7          	jalr	-1208(ra) # 8020536c <brelse>
+        if (bad == -1) {
+    8020882c:	fe042783          	lw	a5,-32(s0)
+    80208830:	0007871b          	sext.w	a4,a5
+    80208834:	57fd                	li	a5,-1
+    80208836:	04f70563          	beq	a4,a5,80208880 <rw_clus+0x1e8>
+    for (tot = 0; tot < n; tot += m, off += m, data += m, sec++) {
+    8020883a:	fec42703          	lw	a4,-20(s0)
+    8020883e:	fe842783          	lw	a5,-24(s0)
+    80208842:	9fb9                	addw	a5,a5,a4
+    80208844:	fef42623          	sw	a5,-20(s0)
+    80208848:	fc042703          	lw	a4,-64(s0)
+    8020884c:	fe842783          	lw	a5,-24(s0)
+    80208850:	9fb9                	addw	a5,a5,a4
+    80208852:	fcf42023          	sw	a5,-64(s0)
+    80208856:	fe846783          	lwu	a5,-24(s0)
+    8020885a:	fb843703          	ld	a4,-72(s0)
+    8020885e:	97ba                	add	a5,a5,a4
+    80208860:	faf43c23          	sd	a5,-72(s0)
+    80208864:	fe442783          	lw	a5,-28(s0)
+    80208868:	2785                	addiw	a5,a5,1
+    8020886a:	fef42223          	sw	a5,-28(s0)
+    8020886e:	fec42703          	lw	a4,-20(s0)
+    80208872:	fb442783          	lw	a5,-76(s0)
+    80208876:	2701                	sext.w	a4,a4
+    80208878:	2781                	sext.w	a5,a5
+    8020887a:	ecf767e3          	bltu	a4,a5,80208748 <rw_clus+0xb0>
+    8020887e:	a011                	j	80208882 <rw_clus+0x1ea>
+            break;
+    80208880:	0001                	nop
+        }
+    }
+    return tot;
+    80208882:	fec42783          	lw	a5,-20(s0)
+}
+    80208886:	853e                	mv	a0,a5
+    80208888:	60a6                	ld	ra,72(sp)
+    8020888a:	6406                	ld	s0,64(sp)
+    8020888c:	6161                	addi	sp,sp,80
+    8020888e:	8082                	ret
+
+0000000080208890 <reloc_clus>:
+ * @param   off         the offset from the beginning of the relative file
+ * @param   alloc       whether alloc new cluster when meeting end of FAT chains
+ * @return              the offset from the new cur_clus
+ */
+static int reloc_clus(struct dirent *entry, uint off, int alloc)
+{
+    80208890:	7179                	addi	sp,sp,-48
+    80208892:	f406                	sd	ra,40(sp)
+    80208894:	f022                	sd	s0,32(sp)
+    80208896:	1800                	addi	s0,sp,48
+    80208898:	fca43c23          	sd	a0,-40(s0)
+    8020889c:	87ae                	mv	a5,a1
+    8020889e:	8732                	mv	a4,a2
+    802088a0:	fcf42a23          	sw	a5,-44(s0)
+    802088a4:	87ba                	mv	a5,a4
+    802088a6:	fcf42823          	sw	a5,-48(s0)
+    int clus_num = off / fat.byts_per_clus;
+    802088aa:	0001b797          	auipc	a5,0x1b
+    802088ae:	28678793          	addi	a5,a5,646 # 80223b30 <fat>
+    802088b2:	47dc                	lw	a5,12(a5)
+    802088b4:	fd442703          	lw	a4,-44(s0)
+    802088b8:	02f757bb          	divuw	a5,a4,a5
+    802088bc:	2781                	sext.w	a5,a5
+    802088be:	fef42423          	sw	a5,-24(s0)
+    while (clus_num > entry->clus_cnt) {
+    802088c2:	a065                	j	8020896a <reloc_clus+0xda>
+        int clus = read_fat(entry->cur_clus);
+    802088c4:	fd843783          	ld	a5,-40(s0)
+    802088c8:	10c7a783          	lw	a5,268(a5)
+    802088cc:	853e                	mv	a0,a5
+    802088ce:	00000097          	auipc	ra,0x0
+    802088d2:	a6e080e7          	jalr	-1426(ra) # 8020833c <read_fat>
+    802088d6:	87aa                	mv	a5,a0
+    802088d8:	2781                	sext.w	a5,a5
+    802088da:	fef42623          	sw	a5,-20(s0)
+        if (clus >= FAT32_EOC) {
+    802088de:	fec42783          	lw	a5,-20(s0)
+    802088e2:	0007871b          	sext.w	a4,a5
+    802088e6:	100007b7          	lui	a5,0x10000
+    802088ea:	17dd                	addi	a5,a5,-9
+    802088ec:	04e7de63          	bge	a5,a4,80208948 <reloc_clus+0xb8>
+            if (alloc) {
+    802088f0:	fd042783          	lw	a5,-48(s0)
+    802088f4:	2781                	sext.w	a5,a5
+    802088f6:	cb9d                	beqz	a5,8020892c <reloc_clus+0x9c>
+                clus = alloc_clus(entry->dev);
+    802088f8:	fd843783          	ld	a5,-40(s0)
+    802088fc:	1147c783          	lbu	a5,276(a5) # 10000114 <_entry-0x701ffeec>
+    80208900:	853e                	mv	a0,a5
+    80208902:	00000097          	auipc	ra,0x0
+    80208906:	c3a080e7          	jalr	-966(ra) # 8020853c <alloc_clus>
+    8020890a:	87aa                	mv	a5,a0
+    8020890c:	2781                	sext.w	a5,a5
+    8020890e:	fef42623          	sw	a5,-20(s0)
+                write_fat(entry->cur_clus, clus);
+    80208912:	fd843783          	ld	a5,-40(s0)
+    80208916:	10c7a783          	lw	a5,268(a5)
+    8020891a:	fec42703          	lw	a4,-20(s0)
+    8020891e:	85ba                	mv	a1,a4
+    80208920:	853e                	mv	a0,a5
+    80208922:	00000097          	auipc	ra,0x0
+    80208926:	acc080e7          	jalr	-1332(ra) # 802083ee <write_fat>
+    8020892a:	a839                	j	80208948 <reloc_clus+0xb8>
+            } else {
+                entry->cur_clus = entry->first_clus;
+    8020892c:	fd843783          	ld	a5,-40(s0)
+    80208930:	1047a703          	lw	a4,260(a5)
+    80208934:	fd843783          	ld	a5,-40(s0)
+    80208938:	10e7a623          	sw	a4,268(a5)
+                entry->clus_cnt = 0;
+    8020893c:	fd843783          	ld	a5,-40(s0)
+    80208940:	1007a823          	sw	zero,272(a5)
+                return -1;
+    80208944:	57fd                	li	a5,-1
+    80208946:	a8f9                	j	80208a24 <reloc_clus+0x194>
+            }
+        }
+        entry->cur_clus = clus;
+    80208948:	fec42703          	lw	a4,-20(s0)
+    8020894c:	fd843783          	ld	a5,-40(s0)
+    80208950:	10e7a623          	sw	a4,268(a5)
+        entry->clus_cnt++;
+    80208954:	fd843783          	ld	a5,-40(s0)
+    80208958:	1107a783          	lw	a5,272(a5)
+    8020895c:	2785                	addiw	a5,a5,1
+    8020895e:	0007871b          	sext.w	a4,a5
+    80208962:	fd843783          	ld	a5,-40(s0)
+    80208966:	10e7a823          	sw	a4,272(a5)
+    while (clus_num > entry->clus_cnt) {
+    8020896a:	fd843783          	ld	a5,-40(s0)
+    8020896e:	1107a703          	lw	a4,272(a5)
+    80208972:	fe842783          	lw	a5,-24(s0)
+    80208976:	f4f767e3          	bltu	a4,a5,802088c4 <reloc_clus+0x34>
+    }
+    if (clus_num < entry->clus_cnt) {
+    8020897a:	fd843783          	ld	a5,-40(s0)
+    8020897e:	1107a703          	lw	a4,272(a5)
+    80208982:	fe842783          	lw	a5,-24(s0)
+    80208986:	08e7f463          	bgeu	a5,a4,80208a0e <reloc_clus+0x17e>
+        entry->cur_clus = entry->first_clus;
+    8020898a:	fd843783          	ld	a5,-40(s0)
+    8020898e:	1047a703          	lw	a4,260(a5)
+    80208992:	fd843783          	ld	a5,-40(s0)
+    80208996:	10e7a623          	sw	a4,268(a5)
+        entry->clus_cnt = 0;
+    8020899a:	fd843783          	ld	a5,-40(s0)
+    8020899e:	1007a823          	sw	zero,272(a5)
+        while (entry->clus_cnt < clus_num) {
+    802089a2:	a8b1                	j	802089fe <reloc_clus+0x16e>
+            entry->cur_clus = read_fat(entry->cur_clus);
+    802089a4:	fd843783          	ld	a5,-40(s0)
+    802089a8:	10c7a783          	lw	a5,268(a5)
+    802089ac:	853e                	mv	a0,a5
+    802089ae:	00000097          	auipc	ra,0x0
+    802089b2:	98e080e7          	jalr	-1650(ra) # 8020833c <read_fat>
+    802089b6:	87aa                	mv	a5,a0
+    802089b8:	0007871b          	sext.w	a4,a5
+    802089bc:	fd843783          	ld	a5,-40(s0)
+    802089c0:	10e7a623          	sw	a4,268(a5)
+            if (entry->cur_clus >= FAT32_EOC) {
+    802089c4:	fd843783          	ld	a5,-40(s0)
+    802089c8:	10c7a783          	lw	a5,268(a5)
+    802089cc:	873e                	mv	a4,a5
+    802089ce:	100007b7          	lui	a5,0x10000
+    802089d2:	17dd                	addi	a5,a5,-9
+    802089d4:	00e7fa63          	bgeu	a5,a4,802089e8 <reloc_clus+0x158>
+                panic("reloc_clus");
+    802089d8:	00005517          	auipc	a0,0x5
+    802089dc:	48050513          	addi	a0,a0,1152 # 8020de58 <etext+0xe58>
+    802089e0:	ffff8097          	auipc	ra,0xffff8
+    802089e4:	a64080e7          	jalr	-1436(ra) # 80200444 <panic>
+            }
+            entry->clus_cnt++;
+    802089e8:	fd843783          	ld	a5,-40(s0)
+    802089ec:	1107a783          	lw	a5,272(a5) # 10000110 <_entry-0x701ffef0>
+    802089f0:	2785                	addiw	a5,a5,1
+    802089f2:	0007871b          	sext.w	a4,a5
+    802089f6:	fd843783          	ld	a5,-40(s0)
+    802089fa:	10e7a823          	sw	a4,272(a5)
+        while (entry->clus_cnt < clus_num) {
+    802089fe:	fd843783          	ld	a5,-40(s0)
+    80208a02:	1107a703          	lw	a4,272(a5)
+    80208a06:	fe842783          	lw	a5,-24(s0)
+    80208a0a:	f8f76de3          	bltu	a4,a5,802089a4 <reloc_clus+0x114>
+        }
+    }
+    return off % fat.byts_per_clus;
+    80208a0e:	0001b797          	auipc	a5,0x1b
+    80208a12:	12278793          	addi	a5,a5,290 # 80223b30 <fat>
+    80208a16:	47dc                	lw	a5,12(a5)
+    80208a18:	fd442703          	lw	a4,-44(s0)
+    80208a1c:	02f777bb          	remuw	a5,a4,a5
+    80208a20:	2781                	sext.w	a5,a5
+    80208a22:	2781                	sext.w	a5,a5
+}
+    80208a24:	853e                	mv	a0,a5
+    80208a26:	70a2                	ld	ra,40(sp)
+    80208a28:	7402                	ld	s0,32(sp)
+    80208a2a:	6145                	addi	sp,sp,48
+    80208a2c:	8082                	ret
+
+0000000080208a2e <eread>:
+
+/* like the original readi, but "reade" is odd, let alone "writee" */
+// Caller must hold entry->lock.
+int eread(struct dirent *entry, int user_dst, uint64 dst, uint off, uint n)
+{
+    80208a2e:	7139                	addi	sp,sp,-64
+    80208a30:	fc06                	sd	ra,56(sp)
+    80208a32:	f822                	sd	s0,48(sp)
+    80208a34:	0080                	addi	s0,sp,64
+    80208a36:	fca43c23          	sd	a0,-40(s0)
+    80208a3a:	87ae                	mv	a5,a1
+    80208a3c:	fcc43423          	sd	a2,-56(s0)
+    80208a40:	fcf42a23          	sw	a5,-44(s0)
+    80208a44:	87b6                	mv	a5,a3
+    80208a46:	fcf42823          	sw	a5,-48(s0)
+    80208a4a:	87ba                	mv	a5,a4
+    80208a4c:	fcf42223          	sw	a5,-60(s0)
+    if (off > entry->file_size || off + n < off || (entry->attribute & ATTR_DIRECTORY)) {
+    80208a50:	fd843783          	ld	a5,-40(s0)
+    80208a54:	1087a703          	lw	a4,264(a5)
+    80208a58:	fd042783          	lw	a5,-48(s0)
+    80208a5c:	2781                	sext.w	a5,a5
+    80208a5e:	02f76663          	bltu	a4,a5,80208a8a <eread+0x5c>
+    80208a62:	fd042703          	lw	a4,-48(s0)
+    80208a66:	fc442783          	lw	a5,-60(s0)
+    80208a6a:	9fb9                	addw	a5,a5,a4
+    80208a6c:	0007871b          	sext.w	a4,a5
+    80208a70:	fd042783          	lw	a5,-48(s0)
+    80208a74:	2781                	sext.w	a5,a5
+    80208a76:	00f76a63          	bltu	a4,a5,80208a8a <eread+0x5c>
+    80208a7a:	fd843783          	ld	a5,-40(s0)
+    80208a7e:	1007c783          	lbu	a5,256(a5)
+    80208a82:	2781                	sext.w	a5,a5
+    80208a84:	8bc1                	andi	a5,a5,16
+    80208a86:	2781                	sext.w	a5,a5
+    80208a88:	c399                	beqz	a5,80208a8e <eread+0x60>
+        return 0;
+    80208a8a:	4781                	li	a5,0
+    80208a8c:	aa15                	j	80208bc0 <eread+0x192>
+    }
+    if (off + n > entry->file_size) {
+    80208a8e:	fd042703          	lw	a4,-48(s0)
+    80208a92:	fc442783          	lw	a5,-60(s0)
+    80208a96:	9fb9                	addw	a5,a5,a4
+    80208a98:	0007871b          	sext.w	a4,a5
+    80208a9c:	fd843783          	ld	a5,-40(s0)
+    80208aa0:	1087a783          	lw	a5,264(a5)
+    80208aa4:	00e7fc63          	bgeu	a5,a4,80208abc <eread+0x8e>
+        n = entry->file_size - off;
+    80208aa8:	fd843783          	ld	a5,-40(s0)
+    80208aac:	1087a703          	lw	a4,264(a5)
+    80208ab0:	fd042783          	lw	a5,-48(s0)
+    80208ab4:	40f707bb          	subw	a5,a4,a5
+    80208ab8:	fcf42223          	sw	a5,-60(s0)
+    }
+
+    uint tot, m;
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80208abc:	fe042623          	sw	zero,-20(s0)
+    80208ac0:	a8d1                	j	80208b94 <eread+0x166>
+        reloc_clus(entry, off, 0);
+    80208ac2:	fd042783          	lw	a5,-48(s0)
+    80208ac6:	4601                	li	a2,0
+    80208ac8:	85be                	mv	a1,a5
+    80208aca:	fd843503          	ld	a0,-40(s0)
+    80208ace:	00000097          	auipc	ra,0x0
+    80208ad2:	dc2080e7          	jalr	-574(ra) # 80208890 <reloc_clus>
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80208ad6:	0001b797          	auipc	a5,0x1b
+    80208ada:	05a78793          	addi	a5,a5,90 # 80223b30 <fat>
+    80208ade:	47d8                	lw	a4,12(a5)
+    80208ae0:	0001b797          	auipc	a5,0x1b
+    80208ae4:	05078793          	addi	a5,a5,80 # 80223b30 <fat>
+    80208ae8:	47dc                	lw	a5,12(a5)
+    80208aea:	fd042683          	lw	a3,-48(s0)
+    80208aee:	02f6f7bb          	remuw	a5,a3,a5
+    80208af2:	2781                	sext.w	a5,a5
+    80208af4:	40f707bb          	subw	a5,a4,a5
+    80208af8:	fef42423          	sw	a5,-24(s0)
+        if (n - tot < m) {
+    80208afc:	fc442703          	lw	a4,-60(s0)
+    80208b00:	fec42783          	lw	a5,-20(s0)
+    80208b04:	40f707bb          	subw	a5,a4,a5
+    80208b08:	0007871b          	sext.w	a4,a5
+    80208b0c:	fe842783          	lw	a5,-24(s0)
+    80208b10:	2781                	sext.w	a5,a5
+    80208b12:	00f77a63          	bgeu	a4,a5,80208b26 <eread+0xf8>
+            m = n - tot;
+    80208b16:	fc442703          	lw	a4,-60(s0)
+    80208b1a:	fec42783          	lw	a5,-20(s0)
+    80208b1e:	40f707bb          	subw	a5,a4,a5
+    80208b22:	fef42423          	sw	a5,-24(s0)
+        }
+        if (rw_clus(entry->cur_clus, 0, user_dst, dst, off % fat.byts_per_clus, m) != m) {
+    80208b26:	fd843783          	ld	a5,-40(s0)
+    80208b2a:	10c7a503          	lw	a0,268(a5)
+    80208b2e:	0001b797          	auipc	a5,0x1b
+    80208b32:	00278793          	addi	a5,a5,2 # 80223b30 <fat>
+    80208b36:	47dc                	lw	a5,12(a5)
+    80208b38:	fd042703          	lw	a4,-48(s0)
+    80208b3c:	02f777bb          	remuw	a5,a4,a5
+    80208b40:	0007871b          	sext.w	a4,a5
+    80208b44:	fe842783          	lw	a5,-24(s0)
+    80208b48:	fd442603          	lw	a2,-44(s0)
+    80208b4c:	fc843683          	ld	a3,-56(s0)
+    80208b50:	4581                	li	a1,0
+    80208b52:	00000097          	auipc	ra,0x0
+    80208b56:	b46080e7          	jalr	-1210(ra) # 80208698 <rw_clus>
+    80208b5a:	87aa                	mv	a5,a0
+    80208b5c:	0007871b          	sext.w	a4,a5
+    80208b60:	fe842783          	lw	a5,-24(s0)
+    80208b64:	2781                	sext.w	a5,a5
+    80208b66:	04e79a63          	bne	a5,a4,80208bba <eread+0x18c>
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80208b6a:	fec42703          	lw	a4,-20(s0)
+    80208b6e:	fe842783          	lw	a5,-24(s0)
+    80208b72:	9fb9                	addw	a5,a5,a4
+    80208b74:	fef42623          	sw	a5,-20(s0)
+    80208b78:	fd042703          	lw	a4,-48(s0)
+    80208b7c:	fe842783          	lw	a5,-24(s0)
+    80208b80:	9fb9                	addw	a5,a5,a4
+    80208b82:	fcf42823          	sw	a5,-48(s0)
+    80208b86:	fe846783          	lwu	a5,-24(s0)
+    80208b8a:	fc843703          	ld	a4,-56(s0)
+    80208b8e:	97ba                	add	a5,a5,a4
+    80208b90:	fcf43423          	sd	a5,-56(s0)
+    80208b94:	fd843783          	ld	a5,-40(s0)
+    80208b98:	10c7a783          	lw	a5,268(a5)
+    80208b9c:	873e                	mv	a4,a5
+    80208b9e:	100007b7          	lui	a5,0x10000
+    80208ba2:	17dd                	addi	a5,a5,-9
+    80208ba4:	00e7ec63          	bltu	a5,a4,80208bbc <eread+0x18e>
+    80208ba8:	fec42703          	lw	a4,-20(s0)
+    80208bac:	fc442783          	lw	a5,-60(s0)
+    80208bb0:	2701                	sext.w	a4,a4
+    80208bb2:	2781                	sext.w	a5,a5
+    80208bb4:	f0f767e3          	bltu	a4,a5,80208ac2 <eread+0x94>
+    80208bb8:	a011                	j	80208bbc <eread+0x18e>
+            break;
+    80208bba:	0001                	nop
+        }
+    }
+    return tot;
+    80208bbc:	fec42783          	lw	a5,-20(s0)
+}
+    80208bc0:	853e                	mv	a0,a5
+    80208bc2:	70e2                	ld	ra,56(sp)
+    80208bc4:	7442                	ld	s0,48(sp)
+    80208bc6:	6121                	addi	sp,sp,64
+    80208bc8:	8082                	ret
+
+0000000080208bca <ewrite>:
+
+// Caller must hold entry->lock.
+int ewrite(struct dirent *entry, int user_src, uint64 src, uint off, uint n)
+{
+    80208bca:	7139                	addi	sp,sp,-64
+    80208bcc:	fc06                	sd	ra,56(sp)
+    80208bce:	f822                	sd	s0,48(sp)
+    80208bd0:	0080                	addi	s0,sp,64
+    80208bd2:	fca43c23          	sd	a0,-40(s0)
+    80208bd6:	87ae                	mv	a5,a1
+    80208bd8:	fcc43423          	sd	a2,-56(s0)
+    80208bdc:	fcf42a23          	sw	a5,-44(s0)
+    80208be0:	87b6                	mv	a5,a3
+    80208be2:	fcf42823          	sw	a5,-48(s0)
+    80208be6:	87ba                	mv	a5,a4
+    80208be8:	fcf42223          	sw	a5,-60(s0)
+    if (off > entry->file_size || off + n < off || (uint64)off + n > 0xffffffff
+    80208bec:	fd843783          	ld	a5,-40(s0)
+    80208bf0:	1087a703          	lw	a4,264(a5) # 10000108 <_entry-0x701ffef8>
+    80208bf4:	fd042783          	lw	a5,-48(s0)
+    80208bf8:	2781                	sext.w	a5,a5
+    80208bfa:	02f76f63          	bltu	a4,a5,80208c38 <ewrite+0x6e>
+    80208bfe:	fd042703          	lw	a4,-48(s0)
+    80208c02:	fc442783          	lw	a5,-60(s0)
+    80208c06:	9fb9                	addw	a5,a5,a4
+    80208c08:	0007871b          	sext.w	a4,a5
+    80208c0c:	fd042783          	lw	a5,-48(s0)
+    80208c10:	2781                	sext.w	a5,a5
+    80208c12:	02f76363          	bltu	a4,a5,80208c38 <ewrite+0x6e>
+    80208c16:	fd046703          	lwu	a4,-48(s0)
+    80208c1a:	fc446783          	lwu	a5,-60(s0)
+    80208c1e:	973e                	add	a4,a4,a5
+    80208c20:	57fd                	li	a5,-1
+    80208c22:	9381                	srli	a5,a5,0x20
+    80208c24:	00e7ea63          	bltu	a5,a4,80208c38 <ewrite+0x6e>
+        || (entry->attribute & ATTR_READ_ONLY)) {
+    80208c28:	fd843783          	ld	a5,-40(s0)
+    80208c2c:	1007c783          	lbu	a5,256(a5)
+    80208c30:	2781                	sext.w	a5,a5
+    80208c32:	8b85                	andi	a5,a5,1
+    80208c34:	2781                	sext.w	a5,a5
+    80208c36:	c399                	beqz	a5,80208c3c <ewrite+0x72>
+        return -1;
+    80208c38:	57fd                	li	a5,-1
+    80208c3a:	a2bd                	j	80208da8 <ewrite+0x1de>
+    }
+    if (entry->first_clus == 0) {   // so file_size if 0 too, which requests off == 0
+    80208c3c:	fd843783          	ld	a5,-40(s0)
+    80208c40:	1047a783          	lw	a5,260(a5)
+    80208c44:	e3b1                	bnez	a5,80208c88 <ewrite+0xbe>
+        entry->cur_clus = entry->first_clus = alloc_clus(entry->dev);
+    80208c46:	fd843783          	ld	a5,-40(s0)
+    80208c4a:	1147c783          	lbu	a5,276(a5)
+    80208c4e:	853e                	mv	a0,a5
+    80208c50:	00000097          	auipc	ra,0x0
+    80208c54:	8ec080e7          	jalr	-1812(ra) # 8020853c <alloc_clus>
+    80208c58:	87aa                	mv	a5,a0
+    80208c5a:	0007871b          	sext.w	a4,a5
+    80208c5e:	fd843783          	ld	a5,-40(s0)
+    80208c62:	10e7a223          	sw	a4,260(a5)
+    80208c66:	fd843783          	ld	a5,-40(s0)
+    80208c6a:	1047a703          	lw	a4,260(a5)
+    80208c6e:	fd843783          	ld	a5,-40(s0)
+    80208c72:	10e7a623          	sw	a4,268(a5)
+        entry->clus_cnt = 0;
+    80208c76:	fd843783          	ld	a5,-40(s0)
+    80208c7a:	1007a823          	sw	zero,272(a5)
+        entry->dirty = 1;
+    80208c7e:	fd843783          	ld	a5,-40(s0)
+    80208c82:	4705                	li	a4,1
+    80208c84:	10e78aa3          	sb	a4,277(a5)
+    }
+    uint tot, m;
+    for (tot = 0; tot < n; tot += m, off += m, src += m) {
+    80208c88:	fe042623          	sw	zero,-20(s0)
+    80208c8c:	a8d1                	j	80208d60 <ewrite+0x196>
+        reloc_clus(entry, off, 1);
+    80208c8e:	fd042783          	lw	a5,-48(s0)
+    80208c92:	4605                	li	a2,1
+    80208c94:	85be                	mv	a1,a5
+    80208c96:	fd843503          	ld	a0,-40(s0)
+    80208c9a:	00000097          	auipc	ra,0x0
+    80208c9e:	bf6080e7          	jalr	-1034(ra) # 80208890 <reloc_clus>
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80208ca2:	0001b797          	auipc	a5,0x1b
+    80208ca6:	e8e78793          	addi	a5,a5,-370 # 80223b30 <fat>
+    80208caa:	47d8                	lw	a4,12(a5)
+    80208cac:	0001b797          	auipc	a5,0x1b
+    80208cb0:	e8478793          	addi	a5,a5,-380 # 80223b30 <fat>
+    80208cb4:	47dc                	lw	a5,12(a5)
+    80208cb6:	fd042683          	lw	a3,-48(s0)
+    80208cba:	02f6f7bb          	remuw	a5,a3,a5
+    80208cbe:	2781                	sext.w	a5,a5
+    80208cc0:	40f707bb          	subw	a5,a4,a5
+    80208cc4:	fef42423          	sw	a5,-24(s0)
+        if (n - tot < m) {
+    80208cc8:	fc442703          	lw	a4,-60(s0)
+    80208ccc:	fec42783          	lw	a5,-20(s0)
+    80208cd0:	40f707bb          	subw	a5,a4,a5
+    80208cd4:	0007871b          	sext.w	a4,a5
+    80208cd8:	fe842783          	lw	a5,-24(s0)
+    80208cdc:	2781                	sext.w	a5,a5
+    80208cde:	00f77a63          	bgeu	a4,a5,80208cf2 <ewrite+0x128>
+            m = n - tot;
+    80208ce2:	fc442703          	lw	a4,-60(s0)
+    80208ce6:	fec42783          	lw	a5,-20(s0)
+    80208cea:	40f707bb          	subw	a5,a4,a5
+    80208cee:	fef42423          	sw	a5,-24(s0)
+        }
+        if (rw_clus(entry->cur_clus, 1, user_src, src, off % fat.byts_per_clus, m) != m) {
+    80208cf2:	fd843783          	ld	a5,-40(s0)
+    80208cf6:	10c7a503          	lw	a0,268(a5)
+    80208cfa:	0001b797          	auipc	a5,0x1b
+    80208cfe:	e3678793          	addi	a5,a5,-458 # 80223b30 <fat>
+    80208d02:	47dc                	lw	a5,12(a5)
+    80208d04:	fd042703          	lw	a4,-48(s0)
+    80208d08:	02f777bb          	remuw	a5,a4,a5
+    80208d0c:	0007871b          	sext.w	a4,a5
+    80208d10:	fe842783          	lw	a5,-24(s0)
+    80208d14:	fd442603          	lw	a2,-44(s0)
+    80208d18:	fc843683          	ld	a3,-56(s0)
+    80208d1c:	4585                	li	a1,1
+    80208d1e:	00000097          	auipc	ra,0x0
+    80208d22:	97a080e7          	jalr	-1670(ra) # 80208698 <rw_clus>
+    80208d26:	87aa                	mv	a5,a0
+    80208d28:	0007871b          	sext.w	a4,a5
+    80208d2c:	fe842783          	lw	a5,-24(s0)
+    80208d30:	2781                	sext.w	a5,a5
+    80208d32:	04e79063          	bne	a5,a4,80208d72 <ewrite+0x1a8>
+    for (tot = 0; tot < n; tot += m, off += m, src += m) {
+    80208d36:	fec42703          	lw	a4,-20(s0)
+    80208d3a:	fe842783          	lw	a5,-24(s0)
+    80208d3e:	9fb9                	addw	a5,a5,a4
+    80208d40:	fef42623          	sw	a5,-20(s0)
+    80208d44:	fd042703          	lw	a4,-48(s0)
+    80208d48:	fe842783          	lw	a5,-24(s0)
+    80208d4c:	9fb9                	addw	a5,a5,a4
+    80208d4e:	fcf42823          	sw	a5,-48(s0)
+    80208d52:	fe846783          	lwu	a5,-24(s0)
+    80208d56:	fc843703          	ld	a4,-56(s0)
+    80208d5a:	97ba                	add	a5,a5,a4
+    80208d5c:	fcf43423          	sd	a5,-56(s0)
+    80208d60:	fec42703          	lw	a4,-20(s0)
+    80208d64:	fc442783          	lw	a5,-60(s0)
+    80208d68:	2701                	sext.w	a4,a4
+    80208d6a:	2781                	sext.w	a5,a5
+    80208d6c:	f2f761e3          	bltu	a4,a5,80208c8e <ewrite+0xc4>
+    80208d70:	a011                	j	80208d74 <ewrite+0x1aa>
+            break;
+    80208d72:	0001                	nop
+        }
+    }
+    if(n > 0) {
+    80208d74:	fc442783          	lw	a5,-60(s0)
+    80208d78:	2781                	sext.w	a5,a5
+    80208d7a:	c78d                	beqz	a5,80208da4 <ewrite+0x1da>
+        if(off > entry->file_size) {
+    80208d7c:	fd843783          	ld	a5,-40(s0)
+    80208d80:	1087a703          	lw	a4,264(a5)
+    80208d84:	fd042783          	lw	a5,-48(s0)
+    80208d88:	2781                	sext.w	a5,a5
+    80208d8a:	00f77d63          	bgeu	a4,a5,80208da4 <ewrite+0x1da>
+            entry->file_size = off;
+    80208d8e:	fd843783          	ld	a5,-40(s0)
+    80208d92:	fd042703          	lw	a4,-48(s0)
+    80208d96:	10e7a423          	sw	a4,264(a5)
+            entry->dirty = 1;
+    80208d9a:	fd843783          	ld	a5,-40(s0)
+    80208d9e:	4705                	li	a4,1
+    80208da0:	10e78aa3          	sb	a4,277(a5)
+        }
+    }
+    return tot;
+    80208da4:	fec42783          	lw	a5,-20(s0)
+}
+    80208da8:	853e                	mv	a0,a5
+    80208daa:	70e2                	ld	ra,56(sp)
+    80208dac:	7442                	ld	s0,48(sp)
+    80208dae:	6121                	addi	sp,sp,64
+    80208db0:	8082                	ret
+
+0000000080208db2 <eget>:
+// by their whole path. But when parsing a path, we open all the directories through it, 
+// which forms a linked list from the final file to the root. Thus, we use the "parent" pointer 
+// to recognize whether an entry with the "name" as given is really the file we want in the right path.
+// Should never get root by eget, it's easy to understand.
+static struct dirent *eget(struct dirent *parent, char *name)
+{
+    80208db2:	7179                	addi	sp,sp,-48
+    80208db4:	f406                	sd	ra,40(sp)
+    80208db6:	f022                	sd	s0,32(sp)
+    80208db8:	1800                	addi	s0,sp,48
+    80208dba:	fca43c23          	sd	a0,-40(s0)
+    80208dbe:	fcb43823          	sd	a1,-48(s0)
+    struct dirent *ep;
+    acquire(&ecache.lock);
+    80208dc2:	0001b517          	auipc	a0,0x1b
+    80208dc6:	d9650513          	addi	a0,a0,-618 # 80223b58 <ecache>
+    80208dca:	ffff8097          	auipc	ra,0xffff8
+    80208dce:	c1e080e7          	jalr	-994(ra) # 802009e8 <acquire>
+    if (name) {
+    80208dd2:	fd043783          	ld	a5,-48(s0)
+    80208dd6:	cbc5                	beqz	a5,80208e86 <eget+0xd4>
+        for (ep = root.next; ep != &root; ep = ep->next) {          // LRU algo
+    80208dd8:	0001f797          	auipc	a5,0x1f
+    80208ddc:	3e878793          	addi	a5,a5,1000 # 802281c0 <root>
+    80208de0:	1287b783          	ld	a5,296(a5)
+    80208de4:	fef43423          	sd	a5,-24(s0)
+    80208de8:	a079                	j	80208e76 <eget+0xc4>
+            if (ep->valid == 1 && ep->parent == parent
+    80208dea:	fe843783          	ld	a5,-24(s0)
+    80208dee:	11679783          	lh	a5,278(a5)
+    80208df2:	0007871b          	sext.w	a4,a5
+    80208df6:	4785                	li	a5,1
+    80208df8:	06f71963          	bne	a4,a5,80208e6a <eget+0xb8>
+    80208dfc:	fe843783          	ld	a5,-24(s0)
+    80208e00:	1207b783          	ld	a5,288(a5)
+    80208e04:	fd843703          	ld	a4,-40(s0)
+    80208e08:	06f71163          	bne	a4,a5,80208e6a <eget+0xb8>
+                && strncmp(ep->filename, name, FAT32_MAX_FILENAME) == 0) {
+    80208e0c:	fe843783          	ld	a5,-24(s0)
+    80208e10:	0ff00613          	li	a2,255
+    80208e14:	fd043583          	ld	a1,-48(s0)
+    80208e18:	853e                	mv	a0,a5
+    80208e1a:	ffff8097          	auipc	ra,0xffff8
+    80208e1e:	eb6080e7          	jalr	-330(ra) # 80200cd0 <strncmp>
+    80208e22:	87aa                	mv	a5,a0
+    80208e24:	e3b9                	bnez	a5,80208e6a <eget+0xb8>
+                if (ep->ref++ == 0) {
+    80208e26:	fe843783          	ld	a5,-24(s0)
+    80208e2a:	1187a783          	lw	a5,280(a5)
+    80208e2e:	0017871b          	addiw	a4,a5,1
+    80208e32:	0007069b          	sext.w	a3,a4
+    80208e36:	fe843703          	ld	a4,-24(s0)
+    80208e3a:	10d72c23          	sw	a3,280(a4) # 10000118 <_entry-0x701ffee8>
+    80208e3e:	eb99                	bnez	a5,80208e54 <eget+0xa2>
+                    ep->parent->ref++;
+    80208e40:	fe843783          	ld	a5,-24(s0)
+    80208e44:	1207b783          	ld	a5,288(a5)
+    80208e48:	1187a703          	lw	a4,280(a5)
+    80208e4c:	2705                	addiw	a4,a4,1
+    80208e4e:	2701                	sext.w	a4,a4
+    80208e50:	10e7ac23          	sw	a4,280(a5)
+                }
+                release(&ecache.lock);
+    80208e54:	0001b517          	auipc	a0,0x1b
+    80208e58:	d0450513          	addi	a0,a0,-764 # 80223b58 <ecache>
+    80208e5c:	ffff8097          	auipc	ra,0xffff8
+    80208e60:	bf0080e7          	jalr	-1040(ra) # 80200a4c <release>
+                // edup(ep->parent);
+                return ep;
+    80208e64:	fe843783          	ld	a5,-24(s0)
+    80208e68:	a07d                	j	80208f16 <eget+0x164>
+        for (ep = root.next; ep != &root; ep = ep->next) {          // LRU algo
+    80208e6a:	fe843783          	ld	a5,-24(s0)
+    80208e6e:	1287b783          	ld	a5,296(a5)
+    80208e72:	fef43423          	sd	a5,-24(s0)
+    80208e76:	fe843703          	ld	a4,-24(s0)
+    80208e7a:	0001f797          	auipc	a5,0x1f
+    80208e7e:	34678793          	addi	a5,a5,838 # 802281c0 <root>
+    80208e82:	f6f714e3          	bne	a4,a5,80208dea <eget+0x38>
+            }
+        }
+    }
+    for (ep = root.prev; ep != &root; ep = ep->prev) {              // LRU algo
+    80208e86:	0001f797          	auipc	a5,0x1f
+    80208e8a:	33a78793          	addi	a5,a5,826 # 802281c0 <root>
+    80208e8e:	1307b783          	ld	a5,304(a5)
+    80208e92:	fef43423          	sd	a5,-24(s0)
+    80208e96:	a085                	j	80208ef6 <eget+0x144>
+        if (ep->ref == 0) {
+    80208e98:	fe843783          	ld	a5,-24(s0)
+    80208e9c:	1187a783          	lw	a5,280(a5)
+    80208ea0:	e7a9                	bnez	a5,80208eea <eget+0x138>
+            ep->ref = 1;
+    80208ea2:	fe843783          	ld	a5,-24(s0)
+    80208ea6:	4705                	li	a4,1
+    80208ea8:	10e7ac23          	sw	a4,280(a5)
+            ep->dev = parent->dev;
+    80208eac:	fd843783          	ld	a5,-40(s0)
+    80208eb0:	1147c703          	lbu	a4,276(a5)
+    80208eb4:	fe843783          	ld	a5,-24(s0)
+    80208eb8:	10e78a23          	sb	a4,276(a5)
+            ep->off = 0;
+    80208ebc:	fe843783          	ld	a5,-24(s0)
+    80208ec0:	1007ae23          	sw	zero,284(a5)
+            ep->valid = 0;
+    80208ec4:	fe843783          	ld	a5,-24(s0)
+    80208ec8:	10079b23          	sh	zero,278(a5)
+            ep->dirty = 0;
+    80208ecc:	fe843783          	ld	a5,-24(s0)
+    80208ed0:	10078aa3          	sb	zero,277(a5)
+            release(&ecache.lock);
+    80208ed4:	0001b517          	auipc	a0,0x1b
+    80208ed8:	c8450513          	addi	a0,a0,-892 # 80223b58 <ecache>
+    80208edc:	ffff8097          	auipc	ra,0xffff8
+    80208ee0:	b70080e7          	jalr	-1168(ra) # 80200a4c <release>
+            return ep;
+    80208ee4:	fe843783          	ld	a5,-24(s0)
+    80208ee8:	a03d                	j	80208f16 <eget+0x164>
+    for (ep = root.prev; ep != &root; ep = ep->prev) {              // LRU algo
+    80208eea:	fe843783          	ld	a5,-24(s0)
+    80208eee:	1307b783          	ld	a5,304(a5)
+    80208ef2:	fef43423          	sd	a5,-24(s0)
+    80208ef6:	fe843703          	ld	a4,-24(s0)
+    80208efa:	0001f797          	auipc	a5,0x1f
+    80208efe:	2c678793          	addi	a5,a5,710 # 802281c0 <root>
+    80208f02:	f8f71be3          	bne	a4,a5,80208e98 <eget+0xe6>
+        }
+    }
+    panic("eget: insufficient ecache");
+    80208f06:	00005517          	auipc	a0,0x5
+    80208f0a:	f6250513          	addi	a0,a0,-158 # 8020de68 <etext+0xe68>
+    80208f0e:	ffff7097          	auipc	ra,0xffff7
+    80208f12:	536080e7          	jalr	1334(ra) # 80200444 <panic>
+    return 0;
+}
+    80208f16:	853e                	mv	a0,a5
+    80208f18:	70a2                	ld	ra,40(sp)
+    80208f1a:	7402                	ld	s0,32(sp)
+    80208f1c:	6145                	addi	sp,sp,48
+    80208f1e:	8082                	ret
+
+0000000080208f20 <formatname>:
+
+// trim ' ' in the head and tail, '.' in head, and test legality
+char *formatname(char *name)
+{
+    80208f20:	7179                	addi	sp,sp,-48
+    80208f22:	f406                	sd	ra,40(sp)
+    80208f24:	f022                	sd	s0,32(sp)
+    80208f26:	1800                	addi	s0,sp,48
+    80208f28:	fca43c23          	sd	a0,-40(s0)
+    static char illegal[] = { '\"', '*', '/', ':', '<', '>', '?', '\\', '|', 0 };
+    char *p;
+    while (*name == ' ' || *name == '.') { name++; }
+    80208f2c:	a031                	j	80208f38 <formatname+0x18>
+    80208f2e:	fd843783          	ld	a5,-40(s0)
+    80208f32:	0785                	addi	a5,a5,1
+    80208f34:	fcf43c23          	sd	a5,-40(s0)
+    80208f38:	fd843783          	ld	a5,-40(s0)
+    80208f3c:	0007c783          	lbu	a5,0(a5)
+    80208f40:	873e                	mv	a4,a5
+    80208f42:	02000793          	li	a5,32
+    80208f46:	fef704e3          	beq	a4,a5,80208f2e <formatname+0xe>
+    80208f4a:	fd843783          	ld	a5,-40(s0)
+    80208f4e:	0007c783          	lbu	a5,0(a5)
+    80208f52:	873e                	mv	a4,a5
+    80208f54:	02e00793          	li	a5,46
+    80208f58:	fcf70be3          	beq	a4,a5,80208f2e <formatname+0xe>
+    for (p = name; *p; p++) {
+    80208f5c:	fd843783          	ld	a5,-40(s0)
+    80208f60:	fef43423          	sd	a5,-24(s0)
+    80208f64:	a091                	j	80208fa8 <formatname+0x88>
+        char c = *p;
+    80208f66:	fe843783          	ld	a5,-24(s0)
+    80208f6a:	0007c783          	lbu	a5,0(a5)
+    80208f6e:	fef403a3          	sb	a5,-25(s0)
+        if (c < 0x20 || strchr(illegal, c)) {
+    80208f72:	fe744783          	lbu	a5,-25(s0)
+    80208f76:	0ff7f713          	andi	a4,a5,255
+    80208f7a:	47fd                	li	a5,31
+    80208f7c:	00e7ff63          	bgeu	a5,a4,80208f9a <formatname+0x7a>
+    80208f80:	fe744783          	lbu	a5,-25(s0)
+    80208f84:	85be                	mv	a1,a5
+    80208f86:	00007517          	auipc	a0,0x7
+    80208f8a:	11250513          	addi	a0,a0,274 # 80210098 <illegal.1648>
+    80208f8e:	ffff8097          	auipc	ra,0xffff8
+    80208f92:	056080e7          	jalr	86(ra) # 80200fe4 <strchr>
+    80208f96:	87aa                	mv	a5,a0
+    80208f98:	c399                	beqz	a5,80208f9e <formatname+0x7e>
+            return 0;
+    80208f9a:	4781                	li	a5,0
+    80208f9c:	a0b9                	j	80208fea <formatname+0xca>
+    for (p = name; *p; p++) {
+    80208f9e:	fe843783          	ld	a5,-24(s0)
+    80208fa2:	0785                	addi	a5,a5,1
+    80208fa4:	fef43423          	sd	a5,-24(s0)
+    80208fa8:	fe843783          	ld	a5,-24(s0)
+    80208fac:	0007c783          	lbu	a5,0(a5)
+    80208fb0:	fbdd                	bnez	a5,80208f66 <formatname+0x46>
+        }
+    }
+    while (p-- > name) {
+    80208fb2:	a005                	j	80208fd2 <formatname+0xb2>
+        if (*p != ' ') {
+    80208fb4:	fe843783          	ld	a5,-24(s0)
+    80208fb8:	0007c783          	lbu	a5,0(a5)
+    80208fbc:	873e                	mv	a4,a5
+    80208fbe:	02000793          	li	a5,32
+    80208fc2:	00f70863          	beq	a4,a5,80208fd2 <formatname+0xb2>
+            p[1] = '\0';
+    80208fc6:	fe843783          	ld	a5,-24(s0)
+    80208fca:	0785                	addi	a5,a5,1
+    80208fcc:	00078023          	sb	zero,0(a5)
+            break;
+    80208fd0:	a819                	j	80208fe6 <formatname+0xc6>
+    while (p-- > name) {
+    80208fd2:	fe843783          	ld	a5,-24(s0)
+    80208fd6:	fff78713          	addi	a4,a5,-1
+    80208fda:	fee43423          	sd	a4,-24(s0)
+    80208fde:	fd843703          	ld	a4,-40(s0)
+    80208fe2:	fcf769e3          	bltu	a4,a5,80208fb4 <formatname+0x94>
+        }
+    }
+    return name;
+    80208fe6:	fd843783          	ld	a5,-40(s0)
+}
+    80208fea:	853e                	mv	a0,a5
+    80208fec:	70a2                	ld	ra,40(sp)
+    80208fee:	7402                	ld	s0,32(sp)
+    80208ff0:	6145                	addi	sp,sp,48
+    80208ff2:	8082                	ret
+
+0000000080208ff4 <generate_shortname>:
+
+static void generate_shortname(char *shortname, char *name)
+{
+    80208ff4:	7139                	addi	sp,sp,-64
+    80208ff6:	fc06                	sd	ra,56(sp)
+    80208ff8:	f822                	sd	s0,48(sp)
+    80208ffa:	0080                	addi	s0,sp,64
+    80208ffc:	fca43423          	sd	a0,-56(s0)
+    80209000:	fcb43023          	sd	a1,-64(s0)
+    static char illegal[] = { '+', ',', ';', '=', '[', ']', 0 };   // these are legal in l-n-e but not s-n-e
+    int i = 0;
+    80209004:	fe042623          	sw	zero,-20(s0)
+    char c, *p = name;
+    80209008:	fc043783          	ld	a5,-64(s0)
+    8020900c:	fef43023          	sd	a5,-32(s0)
+    for (int j = strlen(name) - 1; j >= 0; j--) {
+    80209010:	fc043503          	ld	a0,-64(s0)
+    80209014:	ffff8097          	auipc	ra,0xffff8
+    80209018:	e42080e7          	jalr	-446(ra) # 80200e56 <strlen>
+    8020901c:	87aa                	mv	a5,a0
+    8020901e:	37fd                	addiw	a5,a5,-1
+    80209020:	fcf42e23          	sw	a5,-36(s0)
+    80209024:	a815                	j	80209058 <generate_shortname+0x64>
+        if (name[j] == '.') {
+    80209026:	fdc42783          	lw	a5,-36(s0)
+    8020902a:	fc043703          	ld	a4,-64(s0)
+    8020902e:	97ba                	add	a5,a5,a4
+    80209030:	0007c783          	lbu	a5,0(a5)
+    80209034:	873e                	mv	a4,a5
+    80209036:	02e00793          	li	a5,46
+    8020903a:	00f71a63          	bne	a4,a5,8020904e <generate_shortname+0x5a>
+            p = name + j;
+    8020903e:	fdc42783          	lw	a5,-36(s0)
+    80209042:	fc043703          	ld	a4,-64(s0)
+    80209046:	97ba                	add	a5,a5,a4
+    80209048:	fef43023          	sd	a5,-32(s0)
+            break;
+    8020904c:	a819                	j	80209062 <generate_shortname+0x6e>
+    for (int j = strlen(name) - 1; j >= 0; j--) {
+    8020904e:	fdc42783          	lw	a5,-36(s0)
+    80209052:	37fd                	addiw	a5,a5,-1
+    80209054:	fcf42e23          	sw	a5,-36(s0)
+    80209058:	fdc42783          	lw	a5,-36(s0)
+    8020905c:	2781                	sext.w	a5,a5
+    8020905e:	fc07d4e3          	bgez	a5,80209026 <generate_shortname+0x32>
+        }
+    }
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    80209062:	a209                	j	80209164 <generate_shortname+0x170>
+        if (i == 8 && p) {
+    80209064:	fec42783          	lw	a5,-20(s0)
+    80209068:	0007871b          	sext.w	a4,a5
+    8020906c:	47a1                	li	a5,8
+    8020906e:	02f71463          	bne	a4,a5,80209096 <generate_shortname+0xa2>
+    80209072:	fe043783          	ld	a5,-32(s0)
+    80209076:	c385                	beqz	a5,80209096 <generate_shortname+0xa2>
+            if (p + 1 < name) { break; }            // no '.'
+    80209078:	fe043783          	ld	a5,-32(s0)
+    8020907c:	0785                	addi	a5,a5,1
+    8020907e:	fc043703          	ld	a4,-64(s0)
+    80209082:	10e7e963          	bltu	a5,a4,80209194 <generate_shortname+0x1a0>
+            else {
+                name = p + 1, p = 0;
+    80209086:	fe043783          	ld	a5,-32(s0)
+    8020908a:	0785                	addi	a5,a5,1
+    8020908c:	fcf43023          	sd	a5,-64(s0)
+    80209090:	fe043023          	sd	zero,-32(s0)
+                continue;
+    80209094:	a8c1                	j	80209164 <generate_shortname+0x170>
+            }
+        }
+        if (c == ' ') { continue; }
+    80209096:	feb44783          	lbu	a5,-21(s0)
+    8020909a:	0ff7f713          	andi	a4,a5,255
+    8020909e:	02000793          	li	a5,32
+    802090a2:	00f71363          	bne	a4,a5,802090a8 <generate_shortname+0xb4>
+    802090a6:	a87d                	j	80209164 <generate_shortname+0x170>
+        if (c == '.') {
+    802090a8:	feb44783          	lbu	a5,-21(s0)
+    802090ac:	0ff7f713          	andi	a4,a5,255
+    802090b0:	02e00793          	li	a5,46
+    802090b4:	04f71363          	bne	a4,a5,802090fa <generate_shortname+0x106>
+            if (name > p) {                    // last '.'
+    802090b8:	fc043703          	ld	a4,-64(s0)
+    802090bc:	fe043783          	ld	a5,-32(s0)
+    802090c0:	0ae7f263          	bgeu	a5,a4,80209164 <generate_shortname+0x170>
+                memset(shortname + i, ' ', 8 - i);
+    802090c4:	fec42783          	lw	a5,-20(s0)
+    802090c8:	fc843703          	ld	a4,-56(s0)
+    802090cc:	00f706b3          	add	a3,a4,a5
+    802090d0:	4721                	li	a4,8
+    802090d2:	fec42783          	lw	a5,-20(s0)
+    802090d6:	40f707bb          	subw	a5,a4,a5
+    802090da:	2781                	sext.w	a5,a5
+    802090dc:	2781                	sext.w	a5,a5
+    802090de:	863e                	mv	a2,a5
+    802090e0:	02000593          	li	a1,32
+    802090e4:	8536                	mv	a0,a3
+    802090e6:	ffff8097          	auipc	ra,0xffff8
+    802090ea:	a00080e7          	jalr	-1536(ra) # 80200ae6 <memset>
+                i = 8, p = 0;
+    802090ee:	47a1                	li	a5,8
+    802090f0:	fef42623          	sw	a5,-20(s0)
+    802090f4:	fe043023          	sd	zero,-32(s0)
+            }
+            continue;
+    802090f8:	a0b5                	j	80209164 <generate_shortname+0x170>
+        }
+        if (c >= 'a' && c <= 'z') {
+    802090fa:	feb44783          	lbu	a5,-21(s0)
+    802090fe:	0ff7f713          	andi	a4,a5,255
+    80209102:	06000793          	li	a5,96
+    80209106:	02e7f063          	bgeu	a5,a4,80209126 <generate_shortname+0x132>
+    8020910a:	feb44783          	lbu	a5,-21(s0)
+    8020910e:	0ff7f713          	andi	a4,a5,255
+    80209112:	07a00793          	li	a5,122
+    80209116:	00e7e863          	bltu	a5,a4,80209126 <generate_shortname+0x132>
+            c += 'A' - 'a';
+    8020911a:	feb44783          	lbu	a5,-21(s0)
+    8020911e:	3781                	addiw	a5,a5,-32
+    80209120:	fef405a3          	sb	a5,-21(s0)
+    80209124:	a015                	j	80209148 <generate_shortname+0x154>
+        } else {
+            if (strchr(illegal, c) != NULL) {
+    80209126:	feb44783          	lbu	a5,-21(s0)
+    8020912a:	85be                	mv	a1,a5
+    8020912c:	00007517          	auipc	a0,0x7
+    80209130:	f7c50513          	addi	a0,a0,-132 # 802100a8 <illegal.1664>
+    80209134:	ffff8097          	auipc	ra,0xffff8
+    80209138:	eb0080e7          	jalr	-336(ra) # 80200fe4 <strchr>
+    8020913c:	87aa                	mv	a5,a0
+    8020913e:	c789                	beqz	a5,80209148 <generate_shortname+0x154>
+                c = '_';
+    80209140:	05f00793          	li	a5,95
+    80209144:	fef405a3          	sb	a5,-21(s0)
+            }
+        }
+        shortname[i++] = c;
+    80209148:	fec42783          	lw	a5,-20(s0)
+    8020914c:	0017871b          	addiw	a4,a5,1
+    80209150:	fee42623          	sw	a4,-20(s0)
+    80209154:	873e                	mv	a4,a5
+    80209156:	fc843783          	ld	a5,-56(s0)
+    8020915a:	97ba                	add	a5,a5,a4
+    8020915c:	feb44703          	lbu	a4,-21(s0)
+    80209160:	00e78023          	sb	a4,0(a5)
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    80209164:	fec42783          	lw	a5,-20(s0)
+    80209168:	0007871b          	sext.w	a4,a5
+    8020916c:	47a9                	li	a5,10
+    8020916e:	04e7c363          	blt	a5,a4,802091b4 <generate_shortname+0x1c0>
+    80209172:	fc043783          	ld	a5,-64(s0)
+    80209176:	00178713          	addi	a4,a5,1
+    8020917a:	fce43023          	sd	a4,-64(s0)
+    8020917e:	0007c783          	lbu	a5,0(a5)
+    80209182:	fef405a3          	sb	a5,-21(s0)
+    80209186:	feb44783          	lbu	a5,-21(s0)
+    8020918a:	0ff7f793          	andi	a5,a5,255
+    8020918e:	ec079be3          	bnez	a5,80209064 <generate_shortname+0x70>
+    80209192:	a00d                	j	802091b4 <generate_shortname+0x1c0>
+            if (p + 1 < name) { break; }            // no '.'
+    80209194:	0001                	nop
+    }
+    while (i < CHAR_SHORT_NAME) {
+    80209196:	a839                	j	802091b4 <generate_shortname+0x1c0>
+        shortname[i++] = ' ';
+    80209198:	fec42783          	lw	a5,-20(s0)
+    8020919c:	0017871b          	addiw	a4,a5,1
+    802091a0:	fee42623          	sw	a4,-20(s0)
+    802091a4:	873e                	mv	a4,a5
+    802091a6:	fc843783          	ld	a5,-56(s0)
+    802091aa:	97ba                	add	a5,a5,a4
+    802091ac:	02000713          	li	a4,32
+    802091b0:	00e78023          	sb	a4,0(a5)
+    while (i < CHAR_SHORT_NAME) {
+    802091b4:	fec42783          	lw	a5,-20(s0)
+    802091b8:	0007871b          	sext.w	a4,a5
+    802091bc:	47a9                	li	a5,10
+    802091be:	fce7dde3          	bge	a5,a4,80209198 <generate_shortname+0x1a4>
+    }
+}
+    802091c2:	0001                	nop
+    802091c4:	0001                	nop
+    802091c6:	70e2                	ld	ra,56(sp)
+    802091c8:	7442                	ld	s0,48(sp)
+    802091ca:	6121                	addi	sp,sp,64
+    802091cc:	8082                	ret
+
+00000000802091ce <cal_checksum>:
+
+uint8 cal_checksum(uchar* shortname)
+{
+    802091ce:	7179                	addi	sp,sp,-48
+    802091d0:	f422                	sd	s0,40(sp)
+    802091d2:	1800                	addi	s0,sp,48
+    802091d4:	fca43c23          	sd	a0,-40(s0)
+    uint8 sum = 0;
+    802091d8:	fe0407a3          	sb	zero,-17(s0)
+    for (int i = CHAR_SHORT_NAME; i != 0; i--) {
+    802091dc:	47ad                	li	a5,11
+    802091de:	fef42423          	sw	a5,-24(s0)
+    802091e2:	a091                	j	80209226 <cal_checksum+0x58>
+        sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *shortname++;
+    802091e4:	fef44783          	lbu	a5,-17(s0)
+    802091e8:	2781                	sext.w	a5,a5
+    802091ea:	0077979b          	slliw	a5,a5,0x7
+    802091ee:	2781                	sext.w	a5,a5
+    802091f0:	0ff7f713          	andi	a4,a5,255
+    802091f4:	fef44783          	lbu	a5,-17(s0)
+    802091f8:	0017d79b          	srliw	a5,a5,0x1
+    802091fc:	0ff7f793          	andi	a5,a5,255
+    80209200:	9fb9                	addw	a5,a5,a4
+    80209202:	0ff7f713          	andi	a4,a5,255
+    80209206:	fd843783          	ld	a5,-40(s0)
+    8020920a:	00178693          	addi	a3,a5,1
+    8020920e:	fcd43c23          	sd	a3,-40(s0)
+    80209212:	0007c783          	lbu	a5,0(a5)
+    80209216:	9fb9                	addw	a5,a5,a4
+    80209218:	fef407a3          	sb	a5,-17(s0)
+    for (int i = CHAR_SHORT_NAME; i != 0; i--) {
+    8020921c:	fe842783          	lw	a5,-24(s0)
+    80209220:	37fd                	addiw	a5,a5,-1
+    80209222:	fef42423          	sw	a5,-24(s0)
+    80209226:	fe842783          	lw	a5,-24(s0)
+    8020922a:	2781                	sext.w	a5,a5
+    8020922c:	ffc5                	bnez	a5,802091e4 <cal_checksum+0x16>
+    }
+    return sum;
+    8020922e:	fef44783          	lbu	a5,-17(s0)
+}
+    80209232:	853e                	mv	a0,a5
+    80209234:	7422                	ld	s0,40(sp)
+    80209236:	6145                	addi	sp,sp,48
+    80209238:	8082                	ret
+
+000000008020923a <emake>:
+ * @param   dp          the directory
+ * @param   ep          entry to write on disk
+ * @param   off         offset int the dp, should be calculated via dirlookup before calling this
+ */
+void emake(struct dirent *dp, struct dirent *ep, uint off)
+{
+    8020923a:	7175                	addi	sp,sp,-144
+    8020923c:	e506                	sd	ra,136(sp)
+    8020923e:	e122                	sd	s0,128(sp)
+    80209240:	0900                	addi	s0,sp,144
+    80209242:	f8a43423          	sd	a0,-120(s0)
+    80209246:	f8b43023          	sd	a1,-128(s0)
+    8020924a:	87b2                	mv	a5,a2
+    8020924c:	f6f42e23          	sw	a5,-132(s0)
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    80209250:	f8843783          	ld	a5,-120(s0)
+    80209254:	1007c783          	lbu	a5,256(a5)
+    80209258:	2781                	sext.w	a5,a5
+    8020925a:	8bc1                	andi	a5,a5,16
+    8020925c:	2781                	sext.w	a5,a5
+    8020925e:	eb89                	bnez	a5,80209270 <emake+0x36>
+        panic("emake: not dir");
+    80209260:	00005517          	auipc	a0,0x5
+    80209264:	c2850513          	addi	a0,a0,-984 # 8020de88 <etext+0xe88>
+    80209268:	ffff7097          	auipc	ra,0xffff7
+    8020926c:	1dc080e7          	jalr	476(ra) # 80200444 <panic>
+    if (off % sizeof(union dentry))
+    80209270:	f7c42783          	lw	a5,-132(s0)
+    80209274:	8bfd                	andi	a5,a5,31
+    80209276:	2781                	sext.w	a5,a5
+    80209278:	cb89                	beqz	a5,8020928a <emake+0x50>
+        panic("emake: not aligned");
+    8020927a:	00005517          	auipc	a0,0x5
+    8020927e:	c1e50513          	addi	a0,a0,-994 # 8020de98 <etext+0xe98>
+    80209282:	ffff7097          	auipc	ra,0xffff7
+    80209286:	1c2080e7          	jalr	450(ra) # 80200444 <panic>
+    
+    union dentry de;
+    memset(&de, 0, sizeof(de));
+    8020928a:	fa840793          	addi	a5,s0,-88
+    8020928e:	02000613          	li	a2,32
+    80209292:	4581                	li	a1,0
+    80209294:	853e                	mv	a0,a5
+    80209296:	ffff8097          	auipc	ra,0xffff8
+    8020929a:	850080e7          	jalr	-1968(ra) # 80200ae6 <memset>
+    if (off <= 32) {
+    8020929e:	f7c42783          	lw	a5,-132(s0)
+    802092a2:	0007871b          	sext.w	a4,a5
+    802092a6:	02000793          	li	a5,32
+    802092aa:	0ae7e563          	bltu	a5,a4,80209354 <emake+0x11a>
+        if (off == 0) {
+    802092ae:	f7c42783          	lw	a5,-132(s0)
+    802092b2:	2781                	sext.w	a5,a5
+    802092b4:	ef91                	bnez	a5,802092d0 <emake+0x96>
+            strncpy(de.sne.name, ".          ", sizeof(de.sne.name));
+    802092b6:	fa840793          	addi	a5,s0,-88
+    802092ba:	462d                	li	a2,11
+    802092bc:	00005597          	auipc	a1,0x5
+    802092c0:	bf458593          	addi	a1,a1,-1036 # 8020deb0 <etext+0xeb0>
+    802092c4:	853e                	mv	a0,a5
+    802092c6:	ffff8097          	auipc	ra,0xffff8
+    802092ca:	a94080e7          	jalr	-1388(ra) # 80200d5a <strncpy>
+    802092ce:	a829                	j	802092e8 <emake+0xae>
+        } else {
+            strncpy(de.sne.name, "..         ", sizeof(de.sne.name));
+    802092d0:	fa840793          	addi	a5,s0,-88
+    802092d4:	462d                	li	a2,11
+    802092d6:	00005597          	auipc	a1,0x5
+    802092da:	bea58593          	addi	a1,a1,-1046 # 8020dec0 <etext+0xec0>
+    802092de:	853e                	mv	a0,a5
+    802092e0:	ffff8097          	auipc	ra,0xffff8
+    802092e4:	a7a080e7          	jalr	-1414(ra) # 80200d5a <strncpy>
+        }
+        de.sne.attr = ATTR_DIRECTORY;
+    802092e8:	47c1                	li	a5,16
+    802092ea:	faf409a3          	sb	a5,-77(s0)
+        de.sne.fst_clus_hi = (uint16)(ep->first_clus >> 16);        // first clus high 16 bits
+    802092ee:	f8043783          	ld	a5,-128(s0)
+    802092f2:	1047a783          	lw	a5,260(a5)
+    802092f6:	0107d79b          	srliw	a5,a5,0x10
+    802092fa:	2781                	sext.w	a5,a5
+    802092fc:	17c2                	slli	a5,a5,0x30
+    802092fe:	93c1                	srli	a5,a5,0x30
+    80209300:	faf41e23          	sh	a5,-68(s0)
+        de.sne.fst_clus_lo = (uint16)(ep->first_clus & 0xffff);       // low 16 bits
+    80209304:	f8043783          	ld	a5,-128(s0)
+    80209308:	1047a783          	lw	a5,260(a5)
+    8020930c:	17c2                	slli	a5,a5,0x30
+    8020930e:	93c1                	srli	a5,a5,0x30
+    80209310:	fcf41123          	sh	a5,-62(s0)
+        de.sne.file_size = 0;                                       // filesize is updated in eupdate()
+    80209314:	fc042223          	sw	zero,-60(s0)
+        off = reloc_clus(dp, off, 1);
+    80209318:	f7c42783          	lw	a5,-132(s0)
+    8020931c:	4605                	li	a2,1
+    8020931e:	85be                	mv	a1,a5
+    80209320:	f8843503          	ld	a0,-120(s0)
+    80209324:	fffff097          	auipc	ra,0xfffff
+    80209328:	56c080e7          	jalr	1388(ra) # 80208890 <reloc_clus>
+    8020932c:	87aa                	mv	a5,a0
+    8020932e:	f6f42e23          	sw	a5,-132(s0)
+        rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    80209332:	f8843783          	ld	a5,-120(s0)
+    80209336:	10c7a503          	lw	a0,268(a5)
+    8020933a:	fa840693          	addi	a3,s0,-88
+    8020933e:	f7c42703          	lw	a4,-132(s0)
+    80209342:	02000793          	li	a5,32
+    80209346:	4601                	li	a2,0
+    80209348:	4585                	li	a1,1
+    8020934a:	fffff097          	auipc	ra,0xfffff
+    8020934e:	34e080e7          	jalr	846(ra) # 80208698 <rw_clus>
+        de.sne.fst_clus_lo = (uint16)(ep->first_clus & 0xffff);     // low 16 bits
+        de.sne.file_size = ep->file_size;                         // filesize is updated in eupdate()
+        off = reloc_clus(dp, off, 1);
+        rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    }
+}
+    80209352:	a461                	j	802095da <emake+0x3a0>
+        int entcnt = (strlen(ep->filename) + CHAR_LONG_NAME - 1) / CHAR_LONG_NAME;   // count of l-n-entries, rounds up
+    80209354:	f8043783          	ld	a5,-128(s0)
+    80209358:	853e                	mv	a0,a5
+    8020935a:	ffff8097          	auipc	ra,0xffff8
+    8020935e:	afc080e7          	jalr	-1284(ra) # 80200e56 <strlen>
+    80209362:	87aa                	mv	a5,a0
+    80209364:	27b1                	addiw	a5,a5,12
+    80209366:	2781                	sext.w	a5,a5
+    80209368:	873e                	mv	a4,a5
+    8020936a:	47b5                	li	a5,13
+    8020936c:	02f747bb          	divw	a5,a4,a5
+    80209370:	fcf42623          	sw	a5,-52(s0)
+        memset(shortname, 0, sizeof(shortname));
+    80209374:	f9840793          	addi	a5,s0,-104
+    80209378:	4631                	li	a2,12
+    8020937a:	4581                	li	a1,0
+    8020937c:	853e                	mv	a0,a5
+    8020937e:	ffff7097          	auipc	ra,0xffff7
+    80209382:	768080e7          	jalr	1896(ra) # 80200ae6 <memset>
+        generate_shortname(shortname, ep->filename);
+    80209386:	f8043703          	ld	a4,-128(s0)
+    8020938a:	f9840793          	addi	a5,s0,-104
+    8020938e:	85ba                	mv	a1,a4
+    80209390:	853e                	mv	a0,a5
+    80209392:	00000097          	auipc	ra,0x0
+    80209396:	c62080e7          	jalr	-926(ra) # 80208ff4 <generate_shortname>
+        de.lne.checksum = cal_checksum((uchar *)shortname);
+    8020939a:	f9840793          	addi	a5,s0,-104
+    8020939e:	853e                	mv	a0,a5
+    802093a0:	00000097          	auipc	ra,0x0
+    802093a4:	e2e080e7          	jalr	-466(ra) # 802091ce <cal_checksum>
+    802093a8:	87aa                	mv	a5,a0
+    802093aa:	faf40aa3          	sb	a5,-75(s0)
+        de.lne.attr = ATTR_LONG_NAME;
+    802093ae:	47bd                	li	a5,15
+    802093b0:	faf409a3          	sb	a5,-77(s0)
+        for (int i = entcnt; i > 0; i--) {
+    802093b4:	fcc42783          	lw	a5,-52(s0)
+    802093b8:	fef42623          	sw	a5,-20(s0)
+    802093bc:	aa8d                	j	8020952e <emake+0x2f4>
+            if ((de.lne.order = i) == entcnt) {
+    802093be:	fec42783          	lw	a5,-20(s0)
+    802093c2:	0ff7f793          	andi	a5,a5,255
+    802093c6:	faf40423          	sb	a5,-88(s0)
+    802093ca:	fa844783          	lbu	a5,-88(s0)
+    802093ce:	0007871b          	sext.w	a4,a5
+    802093d2:	fcc42783          	lw	a5,-52(s0)
+    802093d6:	2781                	sext.w	a5,a5
+    802093d8:	00e79a63          	bne	a5,a4,802093ec <emake+0x1b2>
+                de.lne.order |= LAST_LONG_ENTRY;
+    802093dc:	fa844783          	lbu	a5,-88(s0)
+    802093e0:	0407e793          	ori	a5,a5,64
+    802093e4:	0ff7f793          	andi	a5,a5,255
+    802093e8:	faf40423          	sb	a5,-88(s0)
+            char *p = ep->filename + (i - 1) * CHAR_LONG_NAME;
+    802093ec:	f8043683          	ld	a3,-128(s0)
+    802093f0:	fec42783          	lw	a5,-20(s0)
+    802093f4:	37fd                	addiw	a5,a5,-1
+    802093f6:	2781                	sext.w	a5,a5
+    802093f8:	873e                	mv	a4,a5
+    802093fa:	87ba                	mv	a5,a4
+    802093fc:	0017979b          	slliw	a5,a5,0x1
+    80209400:	9fb9                	addw	a5,a5,a4
+    80209402:	0027979b          	slliw	a5,a5,0x2
+    80209406:	9fb9                	addw	a5,a5,a4
+    80209408:	2781                	sext.w	a5,a5
+    8020940a:	97b6                	add	a5,a5,a3
+    8020940c:	fef43023          	sd	a5,-32(s0)
+            uint8 *w = (uint8 *)de.lne.name1;
+    80209410:	fa840793          	addi	a5,s0,-88
+    80209414:	0785                	addi	a5,a5,1
+    80209416:	fcf43c23          	sd	a5,-40(s0)
+            int end = 0;
+    8020941a:	fc042a23          	sw	zero,-44(s0)
+            for (int j = 1; j <= CHAR_LONG_NAME; j++) {
+    8020941e:	4785                	li	a5,1
+    80209420:	fcf42823          	sw	a5,-48(s0)
+    80209424:	a075                	j	802094d0 <emake+0x296>
+                if (end) {
+    80209426:	fd442783          	lw	a5,-44(s0)
+    8020942a:	2781                	sext.w	a5,a5
+    8020942c:	c785                	beqz	a5,80209454 <emake+0x21a>
+                    *w++ = 0xff;            // on k210, unaligned reading is illegal
+    8020942e:	fd843783          	ld	a5,-40(s0)
+    80209432:	00178713          	addi	a4,a5,1
+    80209436:	fce43c23          	sd	a4,-40(s0)
+    8020943a:	577d                	li	a4,-1
+    8020943c:	00e78023          	sb	a4,0(a5)
+                    *w++ = 0xff;
+    80209440:	fd843783          	ld	a5,-40(s0)
+    80209444:	00178713          	addi	a4,a5,1
+    80209448:	fce43c23          	sd	a4,-40(s0)
+    8020944c:	577d                	li	a4,-1
+    8020944e:	00e78023          	sb	a4,0(a5)
+    80209452:	a83d                	j	80209490 <emake+0x256>
+                    if ((*w++ = *p++) == 0) {
+    80209454:	fe043703          	ld	a4,-32(s0)
+    80209458:	00170793          	addi	a5,a4,1
+    8020945c:	fef43023          	sd	a5,-32(s0)
+    80209460:	fd843783          	ld	a5,-40(s0)
+    80209464:	00178693          	addi	a3,a5,1
+    80209468:	fcd43c23          	sd	a3,-40(s0)
+    8020946c:	00074703          	lbu	a4,0(a4)
+    80209470:	00e78023          	sb	a4,0(a5)
+    80209474:	0007c783          	lbu	a5,0(a5)
+    80209478:	e781                	bnez	a5,80209480 <emake+0x246>
+                        end = 1;
+    8020947a:	4785                	li	a5,1
+    8020947c:	fcf42a23          	sw	a5,-44(s0)
+                    *w++ = 0;
+    80209480:	fd843783          	ld	a5,-40(s0)
+    80209484:	00178713          	addi	a4,a5,1
+    80209488:	fce43c23          	sd	a4,-40(s0)
+    8020948c:	00078023          	sb	zero,0(a5)
+                switch (j) {
+    80209490:	fd042783          	lw	a5,-48(s0)
+    80209494:	0007871b          	sext.w	a4,a5
+    80209498:	4795                	li	a5,5
+    8020949a:	00f70a63          	beq	a4,a5,802094ae <emake+0x274>
+    8020949e:	fd042783          	lw	a5,-48(s0)
+    802094a2:	0007871b          	sext.w	a4,a5
+    802094a6:	47ad                	li	a5,11
+    802094a8:	00f70963          	beq	a4,a5,802094ba <emake+0x280>
+    802094ac:	a829                	j	802094c6 <emake+0x28c>
+                    case 5:     w = (uint8 *)de.lne.name2; break;
+    802094ae:	fa840793          	addi	a5,s0,-88
+    802094b2:	07b9                	addi	a5,a5,14
+    802094b4:	fcf43c23          	sd	a5,-40(s0)
+    802094b8:	a039                	j	802094c6 <emake+0x28c>
+                    case 11:    w = (uint8 *)de.lne.name3; break;
+    802094ba:	fa840793          	addi	a5,s0,-88
+    802094be:	07f1                	addi	a5,a5,28
+    802094c0:	fcf43c23          	sd	a5,-40(s0)
+    802094c4:	0001                	nop
+            for (int j = 1; j <= CHAR_LONG_NAME; j++) {
+    802094c6:	fd042783          	lw	a5,-48(s0)
+    802094ca:	2785                	addiw	a5,a5,1
+    802094cc:	fcf42823          	sw	a5,-48(s0)
+    802094d0:	fd042783          	lw	a5,-48(s0)
+    802094d4:	0007871b          	sext.w	a4,a5
+    802094d8:	47b5                	li	a5,13
+    802094da:	f4e7d6e3          	bge	a5,a4,80209426 <emake+0x1ec>
+            uint off2 = reloc_clus(dp, off, 1);
+    802094de:	f7c42783          	lw	a5,-132(s0)
+    802094e2:	4605                	li	a2,1
+    802094e4:	85be                	mv	a1,a5
+    802094e6:	f8843503          	ld	a0,-120(s0)
+    802094ea:	fffff097          	auipc	ra,0xfffff
+    802094ee:	3a6080e7          	jalr	934(ra) # 80208890 <reloc_clus>
+    802094f2:	87aa                	mv	a5,a0
+    802094f4:	fcf42423          	sw	a5,-56(s0)
+            rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off2, sizeof(de));
+    802094f8:	f8843783          	ld	a5,-120(s0)
+    802094fc:	10c7a503          	lw	a0,268(a5)
+    80209500:	fa840693          	addi	a3,s0,-88
+    80209504:	fc842703          	lw	a4,-56(s0)
+    80209508:	02000793          	li	a5,32
+    8020950c:	4601                	li	a2,0
+    8020950e:	4585                	li	a1,1
+    80209510:	fffff097          	auipc	ra,0xfffff
+    80209514:	188080e7          	jalr	392(ra) # 80208698 <rw_clus>
+            off += sizeof(de);
+    80209518:	f7c42783          	lw	a5,-132(s0)
+    8020951c:	0207879b          	addiw	a5,a5,32
+    80209520:	f6f42e23          	sw	a5,-132(s0)
+        for (int i = entcnt; i > 0; i--) {
+    80209524:	fec42783          	lw	a5,-20(s0)
+    80209528:	37fd                	addiw	a5,a5,-1
+    8020952a:	fef42623          	sw	a5,-20(s0)
+    8020952e:	fec42783          	lw	a5,-20(s0)
+    80209532:	2781                	sext.w	a5,a5
+    80209534:	e8f045e3          	bgtz	a5,802093be <emake+0x184>
+        memset(&de, 0, sizeof(de));
+    80209538:	fa840793          	addi	a5,s0,-88
+    8020953c:	02000613          	li	a2,32
+    80209540:	4581                	li	a1,0
+    80209542:	853e                	mv	a0,a5
+    80209544:	ffff7097          	auipc	ra,0xffff7
+    80209548:	5a2080e7          	jalr	1442(ra) # 80200ae6 <memset>
+        strncpy(de.sne.name, shortname, sizeof(de.sne.name));
+    8020954c:	f9840713          	addi	a4,s0,-104
+    80209550:	fa840793          	addi	a5,s0,-88
+    80209554:	462d                	li	a2,11
+    80209556:	85ba                	mv	a1,a4
+    80209558:	853e                	mv	a0,a5
+    8020955a:	ffff8097          	auipc	ra,0xffff8
+    8020955e:	800080e7          	jalr	-2048(ra) # 80200d5a <strncpy>
+        de.sne.attr = ep->attribute;
+    80209562:	f8043783          	ld	a5,-128(s0)
+    80209566:	1007c783          	lbu	a5,256(a5)
+    8020956a:	faf409a3          	sb	a5,-77(s0)
+        de.sne.fst_clus_hi = (uint16)(ep->first_clus >> 16);      // first clus high 16 bits
+    8020956e:	f8043783          	ld	a5,-128(s0)
+    80209572:	1047a783          	lw	a5,260(a5)
+    80209576:	0107d79b          	srliw	a5,a5,0x10
+    8020957a:	2781                	sext.w	a5,a5
+    8020957c:	17c2                	slli	a5,a5,0x30
+    8020957e:	93c1                	srli	a5,a5,0x30
+    80209580:	faf41e23          	sh	a5,-68(s0)
+        de.sne.fst_clus_lo = (uint16)(ep->first_clus & 0xffff);     // low 16 bits
+    80209584:	f8043783          	ld	a5,-128(s0)
+    80209588:	1047a783          	lw	a5,260(a5)
+    8020958c:	17c2                	slli	a5,a5,0x30
+    8020958e:	93c1                	srli	a5,a5,0x30
+    80209590:	fcf41123          	sh	a5,-62(s0)
+        de.sne.file_size = ep->file_size;                         // filesize is updated in eupdate()
+    80209594:	f8043783          	ld	a5,-128(s0)
+    80209598:	1087a783          	lw	a5,264(a5)
+    8020959c:	fcf42223          	sw	a5,-60(s0)
+        off = reloc_clus(dp, off, 1);
+    802095a0:	f7c42783          	lw	a5,-132(s0)
+    802095a4:	4605                	li	a2,1
+    802095a6:	85be                	mv	a1,a5
+    802095a8:	f8843503          	ld	a0,-120(s0)
+    802095ac:	fffff097          	auipc	ra,0xfffff
+    802095b0:	2e4080e7          	jalr	740(ra) # 80208890 <reloc_clus>
+    802095b4:	87aa                	mv	a5,a0
+    802095b6:	f6f42e23          	sw	a5,-132(s0)
+        rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    802095ba:	f8843783          	ld	a5,-120(s0)
+    802095be:	10c7a503          	lw	a0,268(a5)
+    802095c2:	fa840693          	addi	a3,s0,-88
+    802095c6:	f7c42703          	lw	a4,-132(s0)
+    802095ca:	02000793          	li	a5,32
+    802095ce:	4601                	li	a2,0
+    802095d0:	4585                	li	a1,1
+    802095d2:	fffff097          	auipc	ra,0xfffff
+    802095d6:	0c6080e7          	jalr	198(ra) # 80208698 <rw_clus>
+}
+    802095da:	0001                	nop
+    802095dc:	60aa                	ld	ra,136(sp)
+    802095de:	640a                	ld	s0,128(sp)
+    802095e0:	6149                	addi	sp,sp,144
+    802095e2:	8082                	ret
+
+00000000802095e4 <ealloc>:
+
+/**
+ * Allocate an entry on disk. Caller must hold dp->lock.
+ */
+struct dirent *ealloc(struct dirent *dp, char *name, int attr)
+{
+    802095e4:	7139                	addi	sp,sp,-64
+    802095e6:	fc06                	sd	ra,56(sp)
+    802095e8:	f822                	sd	s0,48(sp)
+    802095ea:	0080                	addi	s0,sp,64
+    802095ec:	fca43c23          	sd	a0,-40(s0)
+    802095f0:	fcb43823          	sd	a1,-48(s0)
+    802095f4:	87b2                	mv	a5,a2
+    802095f6:	fcf42623          	sw	a5,-52(s0)
+    if (!(dp->attribute & ATTR_DIRECTORY)) {
+    802095fa:	fd843783          	ld	a5,-40(s0)
+    802095fe:	1007c783          	lbu	a5,256(a5)
+    80209602:	2781                	sext.w	a5,a5
+    80209604:	8bc1                	andi	a5,a5,16
+    80209606:	2781                	sext.w	a5,a5
+    80209608:	eb89                	bnez	a5,8020961a <ealloc+0x36>
+        panic("ealloc not dir");
+    8020960a:	00005517          	auipc	a0,0x5
+    8020960e:	8c650513          	addi	a0,a0,-1850 # 8020ded0 <etext+0xed0>
+    80209612:	ffff7097          	auipc	ra,0xffff7
+    80209616:	e32080e7          	jalr	-462(ra) # 80200444 <panic>
+    }
+    if (dp->valid != 1 || !(name = formatname(name))) {        // detect illegal character
+    8020961a:	fd843783          	ld	a5,-40(s0)
+    8020961e:	11679783          	lh	a5,278(a5)
+    80209622:	0007871b          	sext.w	a4,a5
+    80209626:	4785                	li	a5,1
+    80209628:	00f71d63          	bne	a4,a5,80209642 <ealloc+0x5e>
+    8020962c:	fd043503          	ld	a0,-48(s0)
+    80209630:	00000097          	auipc	ra,0x0
+    80209634:	8f0080e7          	jalr	-1808(ra) # 80208f20 <formatname>
+    80209638:	fca43823          	sd	a0,-48(s0)
+    8020963c:	fd043783          	ld	a5,-48(s0)
+    80209640:	e399                	bnez	a5,80209646 <ealloc+0x62>
+        return NULL;
+    80209642:	4781                	li	a5,0
+    80209644:	a269                	j	802097ce <ealloc+0x1ea>
+    }
+    struct dirent *ep;
+    uint off = 0;
+    80209646:	fe042223          	sw	zero,-28(s0)
+    if ((ep = dirlookup(dp, name, &off)) != 0) {      // entry exists
+    8020964a:	fe440793          	addi	a5,s0,-28
+    8020964e:	863e                	mv	a2,a5
+    80209650:	fd043583          	ld	a1,-48(s0)
+    80209654:	fd843503          	ld	a0,-40(s0)
+    80209658:	00001097          	auipc	ra,0x1
+    8020965c:	b7a080e7          	jalr	-1158(ra) # 8020a1d2 <dirlookup>
+    80209660:	fea43423          	sd	a0,-24(s0)
+    80209664:	fe843783          	ld	a5,-24(s0)
+    80209668:	c781                	beqz	a5,80209670 <ealloc+0x8c>
+        return ep;
+    8020966a:	fe843783          	ld	a5,-24(s0)
+    8020966e:	a285                	j	802097ce <ealloc+0x1ea>
+    }
+    ep = eget(dp, name);
+    80209670:	fd043583          	ld	a1,-48(s0)
+    80209674:	fd843503          	ld	a0,-40(s0)
+    80209678:	fffff097          	auipc	ra,0xfffff
+    8020967c:	73a080e7          	jalr	1850(ra) # 80208db2 <eget>
+    80209680:	fea43423          	sd	a0,-24(s0)
+    elock(ep);
+    80209684:	fe843503          	ld	a0,-24(s0)
+    80209688:	00000097          	auipc	ra,0x0
+    8020968c:	474080e7          	jalr	1140(ra) # 80209afc <elock>
+    ep->attribute = attr;
+    80209690:	fcc42783          	lw	a5,-52(s0)
+    80209694:	0ff7f713          	andi	a4,a5,255
+    80209698:	fe843783          	ld	a5,-24(s0)
+    8020969c:	10e78023          	sb	a4,256(a5)
+    ep->file_size = 0;
+    802096a0:	fe843783          	ld	a5,-24(s0)
+    802096a4:	1007a423          	sw	zero,264(a5)
+    ep->first_clus = 0;
+    802096a8:	fe843783          	ld	a5,-24(s0)
+    802096ac:	1007a223          	sw	zero,260(a5)
+    ep->parent = edup(dp);
+    802096b0:	fd843503          	ld	a0,-40(s0)
+    802096b4:	00000097          	auipc	ra,0x0
+    802096b8:	124080e7          	jalr	292(ra) # 802097d8 <edup>
+    802096bc:	872a                	mv	a4,a0
+    802096be:	fe843783          	ld	a5,-24(s0)
+    802096c2:	12e7b023          	sd	a4,288(a5)
+    ep->off = off;
+    802096c6:	fe442703          	lw	a4,-28(s0)
+    802096ca:	fe843783          	ld	a5,-24(s0)
+    802096ce:	10e7ae23          	sw	a4,284(a5)
+    ep->clus_cnt = 0;
+    802096d2:	fe843783          	ld	a5,-24(s0)
+    802096d6:	1007a823          	sw	zero,272(a5)
+    ep->cur_clus = 0;
+    802096da:	fe843783          	ld	a5,-24(s0)
+    802096de:	1007a623          	sw	zero,268(a5)
+    ep->dirty = 0;
+    802096e2:	fe843783          	ld	a5,-24(s0)
+    802096e6:	10078aa3          	sb	zero,277(a5)
+    strncpy(ep->filename, name, FAT32_MAX_FILENAME);
+    802096ea:	fe843783          	ld	a5,-24(s0)
+    802096ee:	0ff00613          	li	a2,255
+    802096f2:	fd043583          	ld	a1,-48(s0)
+    802096f6:	853e                	mv	a0,a5
+    802096f8:	ffff7097          	auipc	ra,0xffff7
+    802096fc:	662080e7          	jalr	1634(ra) # 80200d5a <strncpy>
+    ep->filename[FAT32_MAX_FILENAME] = '\0';
+    80209700:	fe843783          	ld	a5,-24(s0)
+    80209704:	0e078fa3          	sb	zero,255(a5)
+    if (attr == ATTR_DIRECTORY) {    // generate "." and ".." for ep
+    80209708:	fcc42783          	lw	a5,-52(s0)
+    8020970c:	0007871b          	sext.w	a4,a5
+    80209710:	47c1                	li	a5,16
+    80209712:	06f71a63          	bne	a4,a5,80209786 <ealloc+0x1a2>
+        ep->attribute |= ATTR_DIRECTORY;
+    80209716:	fe843783          	ld	a5,-24(s0)
+    8020971a:	1007c783          	lbu	a5,256(a5)
+    8020971e:	0107e793          	ori	a5,a5,16
+    80209722:	0ff7f713          	andi	a4,a5,255
+    80209726:	fe843783          	ld	a5,-24(s0)
+    8020972a:	10e78023          	sb	a4,256(a5)
+        ep->cur_clus = ep->first_clus = alloc_clus(dp->dev);
+    8020972e:	fd843783          	ld	a5,-40(s0)
+    80209732:	1147c783          	lbu	a5,276(a5)
+    80209736:	853e                	mv	a0,a5
+    80209738:	fffff097          	auipc	ra,0xfffff
+    8020973c:	e04080e7          	jalr	-508(ra) # 8020853c <alloc_clus>
+    80209740:	87aa                	mv	a5,a0
+    80209742:	0007871b          	sext.w	a4,a5
+    80209746:	fe843783          	ld	a5,-24(s0)
+    8020974a:	10e7a223          	sw	a4,260(a5)
+    8020974e:	fe843783          	ld	a5,-24(s0)
+    80209752:	1047a703          	lw	a4,260(a5)
+    80209756:	fe843783          	ld	a5,-24(s0)
+    8020975a:	10e7a623          	sw	a4,268(a5)
+        emake(ep, ep, 0);
+    8020975e:	4601                	li	a2,0
+    80209760:	fe843583          	ld	a1,-24(s0)
+    80209764:	fe843503          	ld	a0,-24(s0)
+    80209768:	00000097          	auipc	ra,0x0
+    8020976c:	ad2080e7          	jalr	-1326(ra) # 8020923a <emake>
+        emake(ep, dp, 32);
+    80209770:	02000613          	li	a2,32
+    80209774:	fd843583          	ld	a1,-40(s0)
+    80209778:	fe843503          	ld	a0,-24(s0)
+    8020977c:	00000097          	auipc	ra,0x0
+    80209780:	abe080e7          	jalr	-1346(ra) # 8020923a <emake>
+    80209784:	a829                	j	8020979e <ealloc+0x1ba>
+    } else {
+        ep->attribute |= ATTR_ARCHIVE;
+    80209786:	fe843783          	ld	a5,-24(s0)
+    8020978a:	1007c783          	lbu	a5,256(a5)
+    8020978e:	0207e793          	ori	a5,a5,32
+    80209792:	0ff7f713          	andi	a4,a5,255
+    80209796:	fe843783          	ld	a5,-24(s0)
+    8020979a:	10e78023          	sb	a4,256(a5)
+    }
+    emake(dp, ep, off);
+    8020979e:	fe442783          	lw	a5,-28(s0)
+    802097a2:	863e                	mv	a2,a5
+    802097a4:	fe843583          	ld	a1,-24(s0)
+    802097a8:	fd843503          	ld	a0,-40(s0)
+    802097ac:	00000097          	auipc	ra,0x0
+    802097b0:	a8e080e7          	jalr	-1394(ra) # 8020923a <emake>
+    ep->valid = 1;
+    802097b4:	fe843783          	ld	a5,-24(s0)
+    802097b8:	4705                	li	a4,1
+    802097ba:	10e79b23          	sh	a4,278(a5)
+    eunlock(ep);
+    802097be:	fe843503          	ld	a0,-24(s0)
+    802097c2:	00000097          	auipc	ra,0x0
+    802097c6:	384080e7          	jalr	900(ra) # 80209b46 <eunlock>
+    return ep;
+    802097ca:	fe843783          	ld	a5,-24(s0)
+}
+    802097ce:	853e                	mv	a0,a5
+    802097d0:	70e2                	ld	ra,56(sp)
+    802097d2:	7442                	ld	s0,48(sp)
+    802097d4:	6121                	addi	sp,sp,64
+    802097d6:	8082                	ret
+
+00000000802097d8 <edup>:
+
+struct dirent *edup(struct dirent *entry)
+{
+    802097d8:	1101                	addi	sp,sp,-32
+    802097da:	ec06                	sd	ra,24(sp)
+    802097dc:	e822                	sd	s0,16(sp)
+    802097de:	1000                	addi	s0,sp,32
+    802097e0:	fea43423          	sd	a0,-24(s0)
+    if (entry != 0) {
+    802097e4:	fe843783          	ld	a5,-24(s0)
+    802097e8:	cf85                	beqz	a5,80209820 <edup+0x48>
+        acquire(&ecache.lock);
+    802097ea:	0001a517          	auipc	a0,0x1a
+    802097ee:	36e50513          	addi	a0,a0,878 # 80223b58 <ecache>
+    802097f2:	ffff7097          	auipc	ra,0xffff7
+    802097f6:	1f6080e7          	jalr	502(ra) # 802009e8 <acquire>
+        entry->ref++;
+    802097fa:	fe843783          	ld	a5,-24(s0)
+    802097fe:	1187a783          	lw	a5,280(a5)
+    80209802:	2785                	addiw	a5,a5,1
+    80209804:	0007871b          	sext.w	a4,a5
+    80209808:	fe843783          	ld	a5,-24(s0)
+    8020980c:	10e7ac23          	sw	a4,280(a5)
+        release(&ecache.lock);
+    80209810:	0001a517          	auipc	a0,0x1a
+    80209814:	34850513          	addi	a0,a0,840 # 80223b58 <ecache>
+    80209818:	ffff7097          	auipc	ra,0xffff7
+    8020981c:	234080e7          	jalr	564(ra) # 80200a4c <release>
+    }
+    return entry;
+    80209820:	fe843783          	ld	a5,-24(s0)
+}
+    80209824:	853e                	mv	a0,a5
+    80209826:	60e2                	ld	ra,24(sp)
+    80209828:	6442                	ld	s0,16(sp)
+    8020982a:	6105                	addi	sp,sp,32
+    8020982c:	8082                	ret
+
+000000008020982e <eupdate>:
+
+// Only update filesize and first cluster in this case.
+// caller must hold entry->parent->lock
+void eupdate(struct dirent *entry)
+{
+    8020982e:	715d                	addi	sp,sp,-80
+    80209830:	e486                	sd	ra,72(sp)
+    80209832:	e0a2                	sd	s0,64(sp)
+    80209834:	0880                	addi	s0,sp,80
+    80209836:	faa43c23          	sd	a0,-72(s0)
+    if (!entry->dirty || entry->valid != 1) { return; }
+    8020983a:	fb843783          	ld	a5,-72(s0)
+    8020983e:	1157c783          	lbu	a5,277(a5)
+    80209842:	12078263          	beqz	a5,80209966 <eupdate+0x138>
+    80209846:	fb843783          	ld	a5,-72(s0)
+    8020984a:	11679783          	lh	a5,278(a5)
+    8020984e:	0007871b          	sext.w	a4,a5
+    80209852:	4785                	li	a5,1
+    80209854:	10f71963          	bne	a4,a5,80209966 <eupdate+0x138>
+    uint entcnt = 0;
+    80209858:	fe042423          	sw	zero,-24(s0)
+    uint32 off = reloc_clus(entry->parent, entry->off, 0);
+    8020985c:	fb843783          	ld	a5,-72(s0)
+    80209860:	1207b703          	ld	a4,288(a5)
+    80209864:	fb843783          	ld	a5,-72(s0)
+    80209868:	11c7a783          	lw	a5,284(a5)
+    8020986c:	4601                	li	a2,0
+    8020986e:	85be                	mv	a1,a5
+    80209870:	853a                	mv	a0,a4
+    80209872:	fffff097          	auipc	ra,0xfffff
+    80209876:	01e080e7          	jalr	30(ra) # 80208890 <reloc_clus>
+    8020987a:	87aa                	mv	a5,a0
+    8020987c:	fef42623          	sw	a5,-20(s0)
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64) &entcnt, off, 1);
+    80209880:	fb843783          	ld	a5,-72(s0)
+    80209884:	1207b783          	ld	a5,288(a5)
+    80209888:	10c7a503          	lw	a0,268(a5)
+    8020988c:	fe840693          	addi	a3,s0,-24
+    80209890:	fec42703          	lw	a4,-20(s0)
+    80209894:	4785                	li	a5,1
+    80209896:	4601                	li	a2,0
+    80209898:	4581                	li	a1,0
+    8020989a:	fffff097          	auipc	ra,0xfffff
+    8020989e:	dfe080e7          	jalr	-514(ra) # 80208698 <rw_clus>
+    entcnt &= ~LAST_LONG_ENTRY;
+    802098a2:	fe842783          	lw	a5,-24(s0)
+    802098a6:	fbf7f793          	andi	a5,a5,-65
+    802098aa:	2781                	sext.w	a5,a5
+    802098ac:	fef42423          	sw	a5,-24(s0)
+    off = reloc_clus(entry->parent, entry->off + (entcnt << 5), 0);
+    802098b0:	fb843783          	ld	a5,-72(s0)
+    802098b4:	1207b683          	ld	a3,288(a5)
+    802098b8:	fb843783          	ld	a5,-72(s0)
+    802098bc:	11c7a703          	lw	a4,284(a5)
+    802098c0:	fe842783          	lw	a5,-24(s0)
+    802098c4:	0057979b          	slliw	a5,a5,0x5
+    802098c8:	2781                	sext.w	a5,a5
+    802098ca:	9fb9                	addw	a5,a5,a4
+    802098cc:	2781                	sext.w	a5,a5
+    802098ce:	4601                	li	a2,0
+    802098d0:	85be                	mv	a1,a5
+    802098d2:	8536                	mv	a0,a3
+    802098d4:	fffff097          	auipc	ra,0xfffff
+    802098d8:	fbc080e7          	jalr	-68(ra) # 80208890 <reloc_clus>
+    802098dc:	87aa                	mv	a5,a0
+    802098de:	fef42623          	sw	a5,-20(s0)
+    union dentry de;
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64)&de, off, sizeof(de));
+    802098e2:	fb843783          	ld	a5,-72(s0)
+    802098e6:	1207b783          	ld	a5,288(a5)
+    802098ea:	10c7a503          	lw	a0,268(a5)
+    802098ee:	fc840693          	addi	a3,s0,-56
+    802098f2:	fec42703          	lw	a4,-20(s0)
+    802098f6:	02000793          	li	a5,32
+    802098fa:	4601                	li	a2,0
+    802098fc:	4581                	li	a1,0
+    802098fe:	fffff097          	auipc	ra,0xfffff
+    80209902:	d9a080e7          	jalr	-614(ra) # 80208698 <rw_clus>
+    de.sne.fst_clus_hi = (uint16)(entry->first_clus >> 16);
+    80209906:	fb843783          	ld	a5,-72(s0)
+    8020990a:	1047a783          	lw	a5,260(a5)
+    8020990e:	0107d79b          	srliw	a5,a5,0x10
+    80209912:	2781                	sext.w	a5,a5
+    80209914:	17c2                	slli	a5,a5,0x30
+    80209916:	93c1                	srli	a5,a5,0x30
+    80209918:	fcf41e23          	sh	a5,-36(s0)
+    de.sne.fst_clus_lo = (uint16)(entry->first_clus & 0xffff);
+    8020991c:	fb843783          	ld	a5,-72(s0)
+    80209920:	1047a783          	lw	a5,260(a5)
+    80209924:	17c2                	slli	a5,a5,0x30
+    80209926:	93c1                	srli	a5,a5,0x30
+    80209928:	fef41123          	sh	a5,-30(s0)
+    de.sne.file_size = entry->file_size;
+    8020992c:	fb843783          	ld	a5,-72(s0)
+    80209930:	1087a783          	lw	a5,264(a5)
+    80209934:	fef42223          	sw	a5,-28(s0)
+    rw_clus(entry->parent->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    80209938:	fb843783          	ld	a5,-72(s0)
+    8020993c:	1207b783          	ld	a5,288(a5)
+    80209940:	10c7a503          	lw	a0,268(a5)
+    80209944:	fc840693          	addi	a3,s0,-56
+    80209948:	fec42703          	lw	a4,-20(s0)
+    8020994c:	02000793          	li	a5,32
+    80209950:	4601                	li	a2,0
+    80209952:	4585                	li	a1,1
+    80209954:	fffff097          	auipc	ra,0xfffff
+    80209958:	d44080e7          	jalr	-700(ra) # 80208698 <rw_clus>
+    entry->dirty = 0;
+    8020995c:	fb843783          	ld	a5,-72(s0)
+    80209960:	10078aa3          	sb	zero,277(a5)
+    80209964:	a011                	j	80209968 <eupdate+0x13a>
+    if (!entry->dirty || entry->valid != 1) { return; }
+    80209966:	0001                	nop
+}
+    80209968:	60a6                	ld	ra,72(sp)
+    8020996a:	6406                	ld	s0,64(sp)
+    8020996c:	6161                	addi	sp,sp,80
+    8020996e:	8082                	ret
+
+0000000080209970 <eremove>:
+
+// caller must hold entry->lock
+// caller must hold entry->parent->lock
+// remove the entry in its parent directory
+void eremove(struct dirent *entry)
+{
+    80209970:	7139                	addi	sp,sp,-64
+    80209972:	fc06                	sd	ra,56(sp)
+    80209974:	f822                	sd	s0,48(sp)
+    80209976:	0080                	addi	s0,sp,64
+    80209978:	fca43423          	sd	a0,-56(s0)
+    if (entry->valid != 1) { return; }
+    8020997c:	fc843783          	ld	a5,-56(s0)
+    80209980:	11679783          	lh	a5,278(a5)
+    80209984:	0007871b          	sext.w	a4,a5
+    80209988:	4785                	li	a5,1
+    8020998a:	0ef71063          	bne	a4,a5,80209a6a <eremove+0xfa>
+    uint entcnt = 0;
+    8020998e:	fe042023          	sw	zero,-32(s0)
+    uint32 off = entry->off;
+    80209992:	fc843783          	ld	a5,-56(s0)
+    80209996:	11c7a783          	lw	a5,284(a5)
+    8020999a:	fef42623          	sw	a5,-20(s0)
+    uint32 off2 = reloc_clus(entry->parent, off, 0);
+    8020999e:	fc843783          	ld	a5,-56(s0)
+    802099a2:	1207b783          	ld	a5,288(a5)
+    802099a6:	fec42703          	lw	a4,-20(s0)
+    802099aa:	4601                	li	a2,0
+    802099ac:	85ba                	mv	a1,a4
+    802099ae:	853e                	mv	a0,a5
+    802099b0:	fffff097          	auipc	ra,0xfffff
+    802099b4:	ee0080e7          	jalr	-288(ra) # 80208890 <reloc_clus>
+    802099b8:	87aa                	mv	a5,a0
+    802099ba:	fef42423          	sw	a5,-24(s0)
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64) &entcnt, off2, 1);
+    802099be:	fc843783          	ld	a5,-56(s0)
+    802099c2:	1207b783          	ld	a5,288(a5)
+    802099c6:	10c7a503          	lw	a0,268(a5)
+    802099ca:	fe040693          	addi	a3,s0,-32
+    802099ce:	fe842703          	lw	a4,-24(s0)
+    802099d2:	4785                	li	a5,1
+    802099d4:	4601                	li	a2,0
+    802099d6:	4581                	li	a1,0
+    802099d8:	fffff097          	auipc	ra,0xfffff
+    802099dc:	cc0080e7          	jalr	-832(ra) # 80208698 <rw_clus>
+    entcnt &= ~LAST_LONG_ENTRY;
+    802099e0:	fe042783          	lw	a5,-32(s0)
+    802099e4:	fbf7f793          	andi	a5,a5,-65
+    802099e8:	2781                	sext.w	a5,a5
+    802099ea:	fef42023          	sw	a5,-32(s0)
+    uint8 flag = EMPTY_ENTRY;
+    802099ee:	5795                	li	a5,-27
+    802099f0:	fcf40fa3          	sb	a5,-33(s0)
+    for (int i = 0; i <= entcnt; i++) {
+    802099f4:	fe042223          	sw	zero,-28(s0)
+    802099f8:	a8a9                	j	80209a52 <eremove+0xe2>
+        rw_clus(entry->parent->cur_clus, 1, 0, (uint64) &flag, off2, 1);
+    802099fa:	fc843783          	ld	a5,-56(s0)
+    802099fe:	1207b783          	ld	a5,288(a5)
+    80209a02:	10c7a503          	lw	a0,268(a5)
+    80209a06:	fdf40693          	addi	a3,s0,-33
+    80209a0a:	fe842703          	lw	a4,-24(s0)
+    80209a0e:	4785                	li	a5,1
+    80209a10:	4601                	li	a2,0
+    80209a12:	4585                	li	a1,1
+    80209a14:	fffff097          	auipc	ra,0xfffff
+    80209a18:	c84080e7          	jalr	-892(ra) # 80208698 <rw_clus>
+        off += 32;
+    80209a1c:	fec42783          	lw	a5,-20(s0)
+    80209a20:	0207879b          	addiw	a5,a5,32
+    80209a24:	fef42623          	sw	a5,-20(s0)
+        off2 = reloc_clus(entry->parent, off, 0);
+    80209a28:	fc843783          	ld	a5,-56(s0)
+    80209a2c:	1207b783          	ld	a5,288(a5)
+    80209a30:	fec42703          	lw	a4,-20(s0)
+    80209a34:	4601                	li	a2,0
+    80209a36:	85ba                	mv	a1,a4
+    80209a38:	853e                	mv	a0,a5
+    80209a3a:	fffff097          	auipc	ra,0xfffff
+    80209a3e:	e56080e7          	jalr	-426(ra) # 80208890 <reloc_clus>
+    80209a42:	87aa                	mv	a5,a0
+    80209a44:	fef42423          	sw	a5,-24(s0)
+    for (int i = 0; i <= entcnt; i++) {
+    80209a48:	fe442783          	lw	a5,-28(s0)
+    80209a4c:	2785                	addiw	a5,a5,1
+    80209a4e:	fef42223          	sw	a5,-28(s0)
+    80209a52:	fe442703          	lw	a4,-28(s0)
+    80209a56:	fe042783          	lw	a5,-32(s0)
+    80209a5a:	fae7f0e3          	bgeu	a5,a4,802099fa <eremove+0x8a>
+    }
+    entry->valid = -1;
+    80209a5e:	fc843783          	ld	a5,-56(s0)
+    80209a62:	577d                	li	a4,-1
+    80209a64:	10e79b23          	sh	a4,278(a5)
+    80209a68:	a011                	j	80209a6c <eremove+0xfc>
+    if (entry->valid != 1) { return; }
+    80209a6a:	0001                	nop
+}
+    80209a6c:	70e2                	ld	ra,56(sp)
+    80209a6e:	7442                	ld	s0,48(sp)
+    80209a70:	6121                	addi	sp,sp,64
+    80209a72:	8082                	ret
+
+0000000080209a74 <etrunc>:
+
+// truncate a file
+// caller must hold entry->lock
+void etrunc(struct dirent *entry)
+{
+    80209a74:	7179                	addi	sp,sp,-48
+    80209a76:	f406                	sd	ra,40(sp)
+    80209a78:	f022                	sd	s0,32(sp)
+    80209a7a:	1800                	addi	s0,sp,48
+    80209a7c:	fca43c23          	sd	a0,-40(s0)
+    for (uint32 clus = entry->first_clus; clus >= 2 && clus < FAT32_EOC; ) {
+    80209a80:	fd843783          	ld	a5,-40(s0)
+    80209a84:	1047a783          	lw	a5,260(a5)
+    80209a88:	fef42623          	sw	a5,-20(s0)
+    80209a8c:	a035                	j	80209ab8 <etrunc+0x44>
+        uint32 next = read_fat(clus);
+    80209a8e:	fec42783          	lw	a5,-20(s0)
+    80209a92:	853e                	mv	a0,a5
+    80209a94:	fffff097          	auipc	ra,0xfffff
+    80209a98:	8a8080e7          	jalr	-1880(ra) # 8020833c <read_fat>
+    80209a9c:	87aa                	mv	a5,a0
+    80209a9e:	fef42423          	sw	a5,-24(s0)
+        free_clus(clus);
+    80209aa2:	fec42783          	lw	a5,-20(s0)
+    80209aa6:	853e                	mv	a0,a5
+    80209aa8:	fffff097          	auipc	ra,0xfffff
+    80209aac:	bc8080e7          	jalr	-1080(ra) # 80208670 <free_clus>
+        clus = next;
+    80209ab0:	fe842783          	lw	a5,-24(s0)
+    80209ab4:	fef42623          	sw	a5,-20(s0)
+    for (uint32 clus = entry->first_clus; clus >= 2 && clus < FAT32_EOC; ) {
+    80209ab8:	fec42783          	lw	a5,-20(s0)
+    80209abc:	0007871b          	sext.w	a4,a5
+    80209ac0:	4785                	li	a5,1
+    80209ac2:	00e7fb63          	bgeu	a5,a4,80209ad8 <etrunc+0x64>
+    80209ac6:	fec42783          	lw	a5,-20(s0)
+    80209aca:	0007871b          	sext.w	a4,a5
+    80209ace:	100007b7          	lui	a5,0x10000
+    80209ad2:	17dd                	addi	a5,a5,-9
+    80209ad4:	fae7fde3          	bgeu	a5,a4,80209a8e <etrunc+0x1a>
+    }
+    entry->file_size = 0;
+    80209ad8:	fd843783          	ld	a5,-40(s0)
+    80209adc:	1007a423          	sw	zero,264(a5) # 10000108 <_entry-0x701ffef8>
+    entry->first_clus = 0;
+    80209ae0:	fd843783          	ld	a5,-40(s0)
+    80209ae4:	1007a223          	sw	zero,260(a5)
+    entry->dirty = 1;
+    80209ae8:	fd843783          	ld	a5,-40(s0)
+    80209aec:	4705                	li	a4,1
+    80209aee:	10e78aa3          	sb	a4,277(a5)
+}
+    80209af2:	0001                	nop
+    80209af4:	70a2                	ld	ra,40(sp)
+    80209af6:	7402                	ld	s0,32(sp)
+    80209af8:	6145                	addi	sp,sp,48
+    80209afa:	8082                	ret
+
+0000000080209afc <elock>:
+
+void elock(struct dirent *entry)
+{
+    80209afc:	1101                	addi	sp,sp,-32
+    80209afe:	ec06                	sd	ra,24(sp)
+    80209b00:	e822                	sd	s0,16(sp)
+    80209b02:	1000                	addi	s0,sp,32
+    80209b04:	fea43423          	sd	a0,-24(s0)
+    if (entry == 0 || entry->ref < 1)
+    80209b08:	fe843783          	ld	a5,-24(s0)
+    80209b0c:	c799                	beqz	a5,80209b1a <elock+0x1e>
+    80209b0e:	fe843783          	ld	a5,-24(s0)
+    80209b12:	1187a783          	lw	a5,280(a5)
+    80209b16:	00f04a63          	bgtz	a5,80209b2a <elock+0x2e>
+        panic("elock");
+    80209b1a:	00004517          	auipc	a0,0x4
+    80209b1e:	3c650513          	addi	a0,a0,966 # 8020dee0 <etext+0xee0>
+    80209b22:	ffff7097          	auipc	ra,0xffff7
+    80209b26:	922080e7          	jalr	-1758(ra) # 80200444 <panic>
+    acquiresleep(&entry->lock);
+    80209b2a:	fe843783          	ld	a5,-24(s0)
+    80209b2e:	13878793          	addi	a5,a5,312
+    80209b32:	853e                	mv	a0,a5
+    80209b34:	ffffc097          	auipc	ra,0xffffc
+    80209b38:	a02080e7          	jalr	-1534(ra) # 80205536 <acquiresleep>
+}
+    80209b3c:	0001                	nop
+    80209b3e:	60e2                	ld	ra,24(sp)
+    80209b40:	6442                	ld	s0,16(sp)
+    80209b42:	6105                	addi	sp,sp,32
+    80209b44:	8082                	ret
+
+0000000080209b46 <eunlock>:
+
+void eunlock(struct dirent *entry)
+{
+    80209b46:	1101                	addi	sp,sp,-32
+    80209b48:	ec06                	sd	ra,24(sp)
+    80209b4a:	e822                	sd	s0,16(sp)
+    80209b4c:	1000                	addi	s0,sp,32
+    80209b4e:	fea43423          	sd	a0,-24(s0)
+    if (entry == 0 || !holdingsleep(&entry->lock) || entry->ref < 1)
+    80209b52:	fe843783          	ld	a5,-24(s0)
+    80209b56:	c395                	beqz	a5,80209b7a <eunlock+0x34>
+    80209b58:	fe843783          	ld	a5,-24(s0)
+    80209b5c:	13878793          	addi	a5,a5,312
+    80209b60:	853e                	mv	a0,a5
+    80209b62:	ffffc097          	auipc	ra,0xffffc
+    80209b66:	a94080e7          	jalr	-1388(ra) # 802055f6 <holdingsleep>
+    80209b6a:	87aa                	mv	a5,a0
+    80209b6c:	c799                	beqz	a5,80209b7a <eunlock+0x34>
+    80209b6e:	fe843783          	ld	a5,-24(s0)
+    80209b72:	1187a783          	lw	a5,280(a5)
+    80209b76:	00f04a63          	bgtz	a5,80209b8a <eunlock+0x44>
+        panic("eunlock");
+    80209b7a:	00004517          	auipc	a0,0x4
+    80209b7e:	36e50513          	addi	a0,a0,878 # 8020dee8 <etext+0xee8>
+    80209b82:	ffff7097          	auipc	ra,0xffff7
+    80209b86:	8c2080e7          	jalr	-1854(ra) # 80200444 <panic>
+    releasesleep(&entry->lock);
+    80209b8a:	fe843783          	ld	a5,-24(s0)
+    80209b8e:	13878793          	addi	a5,a5,312
+    80209b92:	853e                	mv	a0,a5
+    80209b94:	ffffc097          	auipc	ra,0xffffc
+    80209b98:	a10080e7          	jalr	-1520(ra) # 802055a4 <releasesleep>
+}
+    80209b9c:	0001                	nop
+    80209b9e:	60e2                	ld	ra,24(sp)
+    80209ba0:	6442                	ld	s0,16(sp)
+    80209ba2:	6105                	addi	sp,sp,32
+    80209ba4:	8082                	ret
+
+0000000080209ba6 <eput>:
+
+void eput(struct dirent *entry)
+{
+    80209ba6:	7179                	addi	sp,sp,-48
+    80209ba8:	f406                	sd	ra,40(sp)
+    80209baa:	f022                	sd	s0,32(sp)
+    80209bac:	1800                	addi	s0,sp,48
+    80209bae:	fca43c23          	sd	a0,-40(s0)
+    acquire(&ecache.lock);
+    80209bb2:	0001a517          	auipc	a0,0x1a
+    80209bb6:	fa650513          	addi	a0,a0,-90 # 80223b58 <ecache>
+    80209bba:	ffff7097          	auipc	ra,0xffff7
+    80209bbe:	e2e080e7          	jalr	-466(ra) # 802009e8 <acquire>
+    if (entry != &root && entry->valid != 0 && entry->ref == 1) {
+    80209bc2:	fd843703          	ld	a4,-40(s0)
+    80209bc6:	0001e797          	auipc	a5,0x1e
+    80209bca:	5fa78793          	addi	a5,a5,1530 # 802281c0 <root>
+    80209bce:	16f70763          	beq	a4,a5,80209d3c <eput+0x196>
+    80209bd2:	fd843783          	ld	a5,-40(s0)
+    80209bd6:	11679783          	lh	a5,278(a5)
+    80209bda:	16078163          	beqz	a5,80209d3c <eput+0x196>
+    80209bde:	fd843783          	ld	a5,-40(s0)
+    80209be2:	1187a783          	lw	a5,280(a5)
+    80209be6:	873e                	mv	a4,a5
+    80209be8:	4785                	li	a5,1
+    80209bea:	14f71963          	bne	a4,a5,80209d3c <eput+0x196>
+        // ref == 1 means no other process can have entry locked,
+        // so this acquiresleep() won't block (or deadlock).
+        acquiresleep(&entry->lock);
+    80209bee:	fd843783          	ld	a5,-40(s0)
+    80209bf2:	13878793          	addi	a5,a5,312
+    80209bf6:	853e                	mv	a0,a5
+    80209bf8:	ffffc097          	auipc	ra,0xffffc
+    80209bfc:	93e080e7          	jalr	-1730(ra) # 80205536 <acquiresleep>
+        entry->next->prev = entry->prev;
+    80209c00:	fd843783          	ld	a5,-40(s0)
+    80209c04:	1287b783          	ld	a5,296(a5)
+    80209c08:	fd843703          	ld	a4,-40(s0)
+    80209c0c:	13073703          	ld	a4,304(a4)
+    80209c10:	12e7b823          	sd	a4,304(a5)
+        entry->prev->next = entry->next;
+    80209c14:	fd843783          	ld	a5,-40(s0)
+    80209c18:	1307b783          	ld	a5,304(a5)
+    80209c1c:	fd843703          	ld	a4,-40(s0)
+    80209c20:	12873703          	ld	a4,296(a4)
+    80209c24:	12e7b423          	sd	a4,296(a5)
+        entry->next = root.next;
+    80209c28:	0001e797          	auipc	a5,0x1e
+    80209c2c:	59878793          	addi	a5,a5,1432 # 802281c0 <root>
+    80209c30:	1287b703          	ld	a4,296(a5)
+    80209c34:	fd843783          	ld	a5,-40(s0)
+    80209c38:	12e7b423          	sd	a4,296(a5)
+        entry->prev = &root;
+    80209c3c:	fd843783          	ld	a5,-40(s0)
+    80209c40:	0001e717          	auipc	a4,0x1e
+    80209c44:	58070713          	addi	a4,a4,1408 # 802281c0 <root>
+    80209c48:	12e7b823          	sd	a4,304(a5)
+        root.next->prev = entry;
+    80209c4c:	0001e797          	auipc	a5,0x1e
+    80209c50:	57478793          	addi	a5,a5,1396 # 802281c0 <root>
+    80209c54:	1287b783          	ld	a5,296(a5)
+    80209c58:	fd843703          	ld	a4,-40(s0)
+    80209c5c:	12e7b823          	sd	a4,304(a5)
+        root.next = entry;
+    80209c60:	0001e797          	auipc	a5,0x1e
+    80209c64:	56078793          	addi	a5,a5,1376 # 802281c0 <root>
+    80209c68:	fd843703          	ld	a4,-40(s0)
+    80209c6c:	12e7b423          	sd	a4,296(a5)
+        release(&ecache.lock);
+    80209c70:	0001a517          	auipc	a0,0x1a
+    80209c74:	ee850513          	addi	a0,a0,-280 # 80223b58 <ecache>
+    80209c78:	ffff7097          	auipc	ra,0xffff7
+    80209c7c:	dd4080e7          	jalr	-556(ra) # 80200a4c <release>
+        if (entry->valid == -1) {       // this means some one has called eremove()
+    80209c80:	fd843783          	ld	a5,-40(s0)
+    80209c84:	11679783          	lh	a5,278(a5)
+    80209c88:	0007871b          	sext.w	a4,a5
+    80209c8c:	57fd                	li	a5,-1
+    80209c8e:	00f71963          	bne	a4,a5,80209ca0 <eput+0xfa>
+            etrunc(entry);
+    80209c92:	fd843503          	ld	a0,-40(s0)
+    80209c96:	00000097          	auipc	ra,0x0
+    80209c9a:	dde080e7          	jalr	-546(ra) # 80209a74 <etrunc>
+    80209c9e:	a80d                	j	80209cd0 <eput+0x12a>
+        } else {
+            elock(entry->parent);
+    80209ca0:	fd843783          	ld	a5,-40(s0)
+    80209ca4:	1207b783          	ld	a5,288(a5)
+    80209ca8:	853e                	mv	a0,a5
+    80209caa:	00000097          	auipc	ra,0x0
+    80209cae:	e52080e7          	jalr	-430(ra) # 80209afc <elock>
+            eupdate(entry);
+    80209cb2:	fd843503          	ld	a0,-40(s0)
+    80209cb6:	00000097          	auipc	ra,0x0
+    80209cba:	b78080e7          	jalr	-1160(ra) # 8020982e <eupdate>
+            eunlock(entry->parent);
+    80209cbe:	fd843783          	ld	a5,-40(s0)
+    80209cc2:	1207b783          	ld	a5,288(a5)
+    80209cc6:	853e                	mv	a0,a5
+    80209cc8:	00000097          	auipc	ra,0x0
+    80209ccc:	e7e080e7          	jalr	-386(ra) # 80209b46 <eunlock>
+        }
+        releasesleep(&entry->lock);
+    80209cd0:	fd843783          	ld	a5,-40(s0)
+    80209cd4:	13878793          	addi	a5,a5,312
+    80209cd8:	853e                	mv	a0,a5
+    80209cda:	ffffc097          	auipc	ra,0xffffc
+    80209cde:	8ca080e7          	jalr	-1846(ra) # 802055a4 <releasesleep>
+
+        // Once entry->ref decreases down to 0, we can't guarantee the entry->parent field remains unchanged.
+        // Because eget() may take the entry away and write it.
+        struct dirent *eparent = entry->parent;
+    80209ce2:	fd843783          	ld	a5,-40(s0)
+    80209ce6:	1207b783          	ld	a5,288(a5)
+    80209cea:	fef43423          	sd	a5,-24(s0)
+        acquire(&ecache.lock);
+    80209cee:	0001a517          	auipc	a0,0x1a
+    80209cf2:	e6a50513          	addi	a0,a0,-406 # 80223b58 <ecache>
+    80209cf6:	ffff7097          	auipc	ra,0xffff7
+    80209cfa:	cf2080e7          	jalr	-782(ra) # 802009e8 <acquire>
+        entry->ref--;
+    80209cfe:	fd843783          	ld	a5,-40(s0)
+    80209d02:	1187a783          	lw	a5,280(a5)
+    80209d06:	37fd                	addiw	a5,a5,-1
+    80209d08:	0007871b          	sext.w	a4,a5
+    80209d0c:	fd843783          	ld	a5,-40(s0)
+    80209d10:	10e7ac23          	sw	a4,280(a5)
+        release(&ecache.lock);
+    80209d14:	0001a517          	auipc	a0,0x1a
+    80209d18:	e4450513          	addi	a0,a0,-444 # 80223b58 <ecache>
+    80209d1c:	ffff7097          	auipc	ra,0xffff7
+    80209d20:	d30080e7          	jalr	-720(ra) # 80200a4c <release>
+        if (entry->ref == 0) {
+    80209d24:	fd843783          	ld	a5,-40(s0)
+    80209d28:	1187a783          	lw	a5,280(a5)
+    80209d2c:	ef85                	bnez	a5,80209d64 <eput+0x1be>
+            eput(eparent);
+    80209d2e:	fe843503          	ld	a0,-24(s0)
+    80209d32:	00000097          	auipc	ra,0x0
+    80209d36:	e74080e7          	jalr	-396(ra) # 80209ba6 <eput>
+        }
+        return;
+    80209d3a:	a02d                	j	80209d64 <eput+0x1be>
+    }
+    entry->ref--;
+    80209d3c:	fd843783          	ld	a5,-40(s0)
+    80209d40:	1187a783          	lw	a5,280(a5)
+    80209d44:	37fd                	addiw	a5,a5,-1
+    80209d46:	0007871b          	sext.w	a4,a5
+    80209d4a:	fd843783          	ld	a5,-40(s0)
+    80209d4e:	10e7ac23          	sw	a4,280(a5)
+    release(&ecache.lock);
+    80209d52:	0001a517          	auipc	a0,0x1a
+    80209d56:	e0650513          	addi	a0,a0,-506 # 80223b58 <ecache>
+    80209d5a:	ffff7097          	auipc	ra,0xffff7
+    80209d5e:	cf2080e7          	jalr	-782(ra) # 80200a4c <release>
+    80209d62:	a011                	j	80209d66 <eput+0x1c0>
+        return;
+    80209d64:	0001                	nop
+}
+    80209d66:	70a2                	ld	ra,40(sp)
+    80209d68:	7402                	ld	s0,32(sp)
+    80209d6a:	6145                	addi	sp,sp,48
+    80209d6c:	8082                	ret
+
+0000000080209d6e <estat>:
+
+void estat(struct dirent *de, struct stat *st)
+{
+    80209d6e:	1101                	addi	sp,sp,-32
+    80209d70:	ec06                	sd	ra,24(sp)
+    80209d72:	e822                	sd	s0,16(sp)
+    80209d74:	1000                	addi	s0,sp,32
+    80209d76:	fea43423          	sd	a0,-24(s0)
+    80209d7a:	feb43023          	sd	a1,-32(s0)
+    strncpy(st->name, de->filename, STAT_MAX_NAME);
+    80209d7e:	fe043783          	ld	a5,-32(s0)
+    80209d82:	fe843703          	ld	a4,-24(s0)
+    80209d86:	02000613          	li	a2,32
+    80209d8a:	85ba                	mv	a1,a4
+    80209d8c:	853e                	mv	a0,a5
+    80209d8e:	ffff7097          	auipc	ra,0xffff7
+    80209d92:	fcc080e7          	jalr	-52(ra) # 80200d5a <strncpy>
+    st->type = (de->attribute & ATTR_DIRECTORY) ? T_DIR : T_FILE;
+    80209d96:	fe843783          	ld	a5,-24(s0)
+    80209d9a:	1007c783          	lbu	a5,256(a5)
+    80209d9e:	2781                	sext.w	a5,a5
+    80209da0:	8bc1                	andi	a5,a5,16
+    80209da2:	2781                	sext.w	a5,a5
+    80209da4:	c399                	beqz	a5,80209daa <estat+0x3c>
+    80209da6:	4785                	li	a5,1
+    80209da8:	a011                	j	80209dac <estat+0x3e>
+    80209daa:	4789                	li	a5,2
+    80209dac:	fe043703          	ld	a4,-32(s0)
+    80209db0:	02f71423          	sh	a5,40(a4)
+    st->dev = de->dev;
+    80209db4:	fe843783          	ld	a5,-24(s0)
+    80209db8:	1147c783          	lbu	a5,276(a5)
+    80209dbc:	0007871b          	sext.w	a4,a5
+    80209dc0:	fe043783          	ld	a5,-32(s0)
+    80209dc4:	d3d8                	sw	a4,36(a5)
+    st->size = de->file_size;
+    80209dc6:	fe843783          	ld	a5,-24(s0)
+    80209dca:	1087a783          	lw	a5,264(a5)
+    80209dce:	02079713          	slli	a4,a5,0x20
+    80209dd2:	9301                	srli	a4,a4,0x20
+    80209dd4:	fe043783          	ld	a5,-32(s0)
+    80209dd8:	fb98                	sd	a4,48(a5)
+}
+    80209dda:	0001                	nop
+    80209ddc:	60e2                	ld	ra,24(sp)
+    80209dde:	6442                	ld	s0,16(sp)
+    80209de0:	6105                	addi	sp,sp,32
+    80209de2:	8082                	ret
+
+0000000080209de4 <read_entry_name>:
+ * @param   buffer      pointer to the array that stores the name
+ * @param   raw_entry   pointer to the entry in a sector buffer
+ * @param   islong      if non-zero, read as l-n-e, otherwise s-n-e.
+ */
+static void read_entry_name(char *buffer, union dentry *d)
+{
+    80209de4:	7139                	addi	sp,sp,-64
+    80209de6:	fc06                	sd	ra,56(sp)
+    80209de8:	f822                	sd	s0,48(sp)
+    80209dea:	0080                	addi	s0,sp,64
+    80209dec:	fca43423          	sd	a0,-56(s0)
+    80209df0:	fcb43023          	sd	a1,-64(s0)
+    if (d->lne.attr == ATTR_LONG_NAME) {                       // long entry branch
+    80209df4:	fc043783          	ld	a5,-64(s0)
+    80209df8:	00b7c783          	lbu	a5,11(a5)
+    80209dfc:	873e                	mv	a4,a5
+    80209dfe:	47bd                	li	a5,15
+    80209e00:	06f71a63          	bne	a4,a5,80209e74 <read_entry_name+0x90>
+        wchar temp[NELEM(d->lne.name1)];
+        memmove(temp, d->lne.name1, sizeof(temp));
+    80209e04:	fc043783          	ld	a5,-64(s0)
+    80209e08:	00178713          	addi	a4,a5,1
+    80209e0c:	fd840793          	addi	a5,s0,-40
+    80209e10:	4629                	li	a2,10
+    80209e12:	85ba                	mv	a1,a4
+    80209e14:	853e                	mv	a0,a5
+    80209e16:	ffff7097          	auipc	ra,0xffff7
+    80209e1a:	db4080e7          	jalr	-588(ra) # 80200bca <memmove>
+        snstr(buffer, temp, NELEM(d->lne.name1));
+    80209e1e:	fd840793          	addi	a5,s0,-40
+    80209e22:	4615                	li	a2,5
+    80209e24:	85be                	mv	a1,a5
+    80209e26:	fc843503          	ld	a0,-56(s0)
+    80209e2a:	ffff7097          	auipc	ra,0xffff7
+    80209e2e:	0c2080e7          	jalr	194(ra) # 80200eec <snstr>
+        buffer += NELEM(d->lne.name1);
+    80209e32:	fc843783          	ld	a5,-56(s0)
+    80209e36:	0795                	addi	a5,a5,5
+    80209e38:	fcf43423          	sd	a5,-56(s0)
+        snstr(buffer, d->lne.name2, NELEM(d->lne.name2));
+    80209e3c:	fc043783          	ld	a5,-64(s0)
+    80209e40:	07b9                	addi	a5,a5,14
+    80209e42:	4619                	li	a2,6
+    80209e44:	85be                	mv	a1,a5
+    80209e46:	fc843503          	ld	a0,-56(s0)
+    80209e4a:	ffff7097          	auipc	ra,0xffff7
+    80209e4e:	0a2080e7          	jalr	162(ra) # 80200eec <snstr>
+        buffer += NELEM(d->lne.name2);
+    80209e52:	fc843783          	ld	a5,-56(s0)
+    80209e56:	0799                	addi	a5,a5,6
+    80209e58:	fcf43423          	sd	a5,-56(s0)
+        snstr(buffer, d->lne.name3, NELEM(d->lne.name3));
+    80209e5c:	fc043783          	ld	a5,-64(s0)
+    80209e60:	07f1                	addi	a5,a5,28
+    80209e62:	4609                	li	a2,2
+    80209e64:	85be                	mv	a1,a5
+    80209e66:	fc843503          	ld	a0,-56(s0)
+    80209e6a:	ffff7097          	auipc	ra,0xffff7
+    80209e6e:	082080e7          	jalr	130(ra) # 80200eec <snstr>
+        for (int j = 8; j < CHAR_SHORT_NAME; j++, i++) {
+            if (d->sne.name[j] == ' ') { break; }
+            buffer[i] = d->sne.name[j];
+        }
+    }
+}
+    80209e72:	a8d5                	j	80209f66 <read_entry_name+0x182>
+        memset(buffer, 0, CHAR_SHORT_NAME + 2); // plus '.' and '\0'
+    80209e74:	4635                	li	a2,13
+    80209e76:	4581                	li	a1,0
+    80209e78:	fc843503          	ld	a0,-56(s0)
+    80209e7c:	ffff7097          	auipc	ra,0xffff7
+    80209e80:	c6a080e7          	jalr	-918(ra) # 80200ae6 <memset>
+        for (i = 0; d->sne.name[i] != ' ' && i < 8; i++) {
+    80209e84:	fe042623          	sw	zero,-20(s0)
+    80209e88:	a025                	j	80209eb0 <read_entry_name+0xcc>
+            buffer[i] = d->sne.name[i];
+    80209e8a:	fec42783          	lw	a5,-20(s0)
+    80209e8e:	fc843703          	ld	a4,-56(s0)
+    80209e92:	97ba                	add	a5,a5,a4
+    80209e94:	fc043683          	ld	a3,-64(s0)
+    80209e98:	fec42703          	lw	a4,-20(s0)
+    80209e9c:	9736                	add	a4,a4,a3
+    80209e9e:	00074703          	lbu	a4,0(a4)
+    80209ea2:	00e78023          	sb	a4,0(a5)
+        for (i = 0; d->sne.name[i] != ' ' && i < 8; i++) {
+    80209ea6:	fec42783          	lw	a5,-20(s0)
+    80209eaa:	2785                	addiw	a5,a5,1
+    80209eac:	fef42623          	sw	a5,-20(s0)
+    80209eb0:	fc043703          	ld	a4,-64(s0)
+    80209eb4:	fec42783          	lw	a5,-20(s0)
+    80209eb8:	97ba                	add	a5,a5,a4
+    80209eba:	0007c783          	lbu	a5,0(a5)
+    80209ebe:	873e                	mv	a4,a5
+    80209ec0:	02000793          	li	a5,32
+    80209ec4:	00f70963          	beq	a4,a5,80209ed6 <read_entry_name+0xf2>
+    80209ec8:	fec42783          	lw	a5,-20(s0)
+    80209ecc:	0007871b          	sext.w	a4,a5
+    80209ed0:	479d                	li	a5,7
+    80209ed2:	fae7dce3          	bge	a5,a4,80209e8a <read_entry_name+0xa6>
+        if (d->sne.name[8] != ' ') {
+    80209ed6:	fc043783          	ld	a5,-64(s0)
+    80209eda:	0087c783          	lbu	a5,8(a5)
+    80209ede:	873e                	mv	a4,a5
+    80209ee0:	02000793          	li	a5,32
+    80209ee4:	02f70063          	beq	a4,a5,80209f04 <read_entry_name+0x120>
+            buffer[i++] = '.';
+    80209ee8:	fec42783          	lw	a5,-20(s0)
+    80209eec:	0017871b          	addiw	a4,a5,1
+    80209ef0:	fee42623          	sw	a4,-20(s0)
+    80209ef4:	873e                	mv	a4,a5
+    80209ef6:	fc843783          	ld	a5,-56(s0)
+    80209efa:	97ba                	add	a5,a5,a4
+    80209efc:	02e00713          	li	a4,46
+    80209f00:	00e78023          	sb	a4,0(a5)
+        for (int j = 8; j < CHAR_SHORT_NAME; j++, i++) {
+    80209f04:	47a1                	li	a5,8
+    80209f06:	fef42423          	sw	a5,-24(s0)
+    80209f0a:	a0a9                	j	80209f54 <read_entry_name+0x170>
+            if (d->sne.name[j] == ' ') { break; }
+    80209f0c:	fc043703          	ld	a4,-64(s0)
+    80209f10:	fe842783          	lw	a5,-24(s0)
+    80209f14:	97ba                	add	a5,a5,a4
+    80209f16:	0007c783          	lbu	a5,0(a5)
+    80209f1a:	873e                	mv	a4,a5
+    80209f1c:	02000793          	li	a5,32
+    80209f20:	04f70263          	beq	a4,a5,80209f64 <read_entry_name+0x180>
+            buffer[i] = d->sne.name[j];
+    80209f24:	fec42783          	lw	a5,-20(s0)
+    80209f28:	fc843703          	ld	a4,-56(s0)
+    80209f2c:	97ba                	add	a5,a5,a4
+    80209f2e:	fc043683          	ld	a3,-64(s0)
+    80209f32:	fe842703          	lw	a4,-24(s0)
+    80209f36:	9736                	add	a4,a4,a3
+    80209f38:	00074703          	lbu	a4,0(a4)
+    80209f3c:	00e78023          	sb	a4,0(a5)
+        for (int j = 8; j < CHAR_SHORT_NAME; j++, i++) {
+    80209f40:	fe842783          	lw	a5,-24(s0)
+    80209f44:	2785                	addiw	a5,a5,1
+    80209f46:	fef42423          	sw	a5,-24(s0)
+    80209f4a:	fec42783          	lw	a5,-20(s0)
+    80209f4e:	2785                	addiw	a5,a5,1
+    80209f50:	fef42623          	sw	a5,-20(s0)
+    80209f54:	fe842783          	lw	a5,-24(s0)
+    80209f58:	0007871b          	sext.w	a4,a5
+    80209f5c:	47a9                	li	a5,10
+    80209f5e:	fae7d7e3          	bge	a5,a4,80209f0c <read_entry_name+0x128>
+}
+    80209f62:	a011                	j	80209f66 <read_entry_name+0x182>
+            if (d->sne.name[j] == ' ') { break; }
+    80209f64:	0001                	nop
+}
+    80209f66:	0001                	nop
+    80209f68:	70e2                	ld	ra,56(sp)
+    80209f6a:	7442                	ld	s0,48(sp)
+    80209f6c:	6121                	addi	sp,sp,64
+    80209f6e:	8082                	ret
+
+0000000080209f70 <read_entry_info>:
+ * Read entry_info from directory entry.
+ * @param   entry       pointer to the structure that stores the entry info
+ * @param   raw_entry   pointer to the entry in a sector buffer
+ */
+static void read_entry_info(struct dirent *entry, union dentry *d)
+{
+    80209f70:	1101                	addi	sp,sp,-32
+    80209f72:	ec22                	sd	s0,24(sp)
+    80209f74:	1000                	addi	s0,sp,32
+    80209f76:	fea43423          	sd	a0,-24(s0)
+    80209f7a:	feb43023          	sd	a1,-32(s0)
+    entry->attribute = d->sne.attr;
+    80209f7e:	fe043783          	ld	a5,-32(s0)
+    80209f82:	00b7c703          	lbu	a4,11(a5)
+    80209f86:	fe843783          	ld	a5,-24(s0)
+    80209f8a:	10e78023          	sb	a4,256(a5)
+    entry->first_clus = ((uint32)d->sne.fst_clus_hi << 16) | d->sne.fst_clus_lo;
+    80209f8e:	fe043783          	ld	a5,-32(s0)
+    80209f92:	0147d783          	lhu	a5,20(a5)
+    80209f96:	2781                	sext.w	a5,a5
+    80209f98:	0107979b          	slliw	a5,a5,0x10
+    80209f9c:	0007871b          	sext.w	a4,a5
+    80209fa0:	fe043783          	ld	a5,-32(s0)
+    80209fa4:	01a7d783          	lhu	a5,26(a5)
+    80209fa8:	2781                	sext.w	a5,a5
+    80209faa:	8fd9                	or	a5,a5,a4
+    80209fac:	0007871b          	sext.w	a4,a5
+    80209fb0:	fe843783          	ld	a5,-24(s0)
+    80209fb4:	10e7a223          	sw	a4,260(a5)
+    entry->file_size = d->sne.file_size;
+    80209fb8:	fe043783          	ld	a5,-32(s0)
+    80209fbc:	4fd8                	lw	a4,28(a5)
+    80209fbe:	fe843783          	ld	a5,-24(s0)
+    80209fc2:	10e7a423          	sw	a4,264(a5)
+    entry->cur_clus = entry->first_clus;
+    80209fc6:	fe843783          	ld	a5,-24(s0)
+    80209fca:	1047a703          	lw	a4,260(a5)
+    80209fce:	fe843783          	ld	a5,-24(s0)
+    80209fd2:	10e7a623          	sw	a4,268(a5)
+    entry->clus_cnt = 0;
+    80209fd6:	fe843783          	ld	a5,-24(s0)
+    80209fda:	1007a823          	sw	zero,272(a5)
+}
+    80209fde:	0001                	nop
+    80209fe0:	6462                	ld	s0,24(sp)
+    80209fe2:	6105                	addi	sp,sp,32
+    80209fe4:	8082                	ret
+
+0000000080209fe6 <enext>:
+ * @return  -1      meet the end of dir
+ *          0       find empty slots
+ *          1       find a file with all its entries
+ */
+int enext(struct dirent *dp, struct dirent *ep, uint off, int *count)
+{
+    80209fe6:	711d                	addi	sp,sp,-96
+    80209fe8:	ec86                	sd	ra,88(sp)
+    80209fea:	e8a2                	sd	s0,80(sp)
+    80209fec:	1080                	addi	s0,sp,96
+    80209fee:	faa43c23          	sd	a0,-72(s0)
+    80209ff2:	fab43823          	sd	a1,-80(s0)
+    80209ff6:	87b2                	mv	a5,a2
+    80209ff8:	fad43023          	sd	a3,-96(s0)
+    80209ffc:	faf42623          	sw	a5,-84(s0)
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    8020a000:	fb843783          	ld	a5,-72(s0)
+    8020a004:	1007c783          	lbu	a5,256(a5)
+    8020a008:	2781                	sext.w	a5,a5
+    8020a00a:	8bc1                	andi	a5,a5,16
+    8020a00c:	2781                	sext.w	a5,a5
+    8020a00e:	eb89                	bnez	a5,8020a020 <enext+0x3a>
+        panic("enext not dir");
+    8020a010:	00004517          	auipc	a0,0x4
+    8020a014:	ee050513          	addi	a0,a0,-288 # 8020def0 <etext+0xef0>
+    8020a018:	ffff6097          	auipc	ra,0xffff6
+    8020a01c:	42c080e7          	jalr	1068(ra) # 80200444 <panic>
+    if (ep->valid)
+    8020a020:	fb043783          	ld	a5,-80(s0)
+    8020a024:	11679783          	lh	a5,278(a5)
+    8020a028:	cb89                	beqz	a5,8020a03a <enext+0x54>
+        panic("enext ep valid");
+    8020a02a:	00004517          	auipc	a0,0x4
+    8020a02e:	ed650513          	addi	a0,a0,-298 # 8020df00 <etext+0xf00>
+    8020a032:	ffff6097          	auipc	ra,0xffff6
+    8020a036:	412080e7          	jalr	1042(ra) # 80200444 <panic>
+    if (off % 32)
+    8020a03a:	fac42783          	lw	a5,-84(s0)
+    8020a03e:	8bfd                	andi	a5,a5,31
+    8020a040:	2781                	sext.w	a5,a5
+    8020a042:	cb89                	beqz	a5,8020a054 <enext+0x6e>
+        panic("enext not align");
+    8020a044:	00004517          	auipc	a0,0x4
+    8020a048:	ecc50513          	addi	a0,a0,-308 # 8020df10 <etext+0xf10>
+    8020a04c:	ffff6097          	auipc	ra,0xffff6
+    8020a050:	3f8080e7          	jalr	1016(ra) # 80200444 <panic>
+    if (dp->valid != 1) { return -1; }
+    8020a054:	fb843783          	ld	a5,-72(s0)
+    8020a058:	11679783          	lh	a5,278(a5)
+    8020a05c:	0007871b          	sext.w	a4,a5
+    8020a060:	4785                	li	a5,1
+    8020a062:	00f70463          	beq	a4,a5,8020a06a <enext+0x84>
+    8020a066:	57fd                	li	a5,-1
+    8020a068:	a285                	j	8020a1c8 <enext+0x1e2>
+
+    union dentry de;
+    int cnt = 0;
+    8020a06a:	fe042623          	sw	zero,-20(s0)
+    memset(ep->filename, 0, FAT32_MAX_FILENAME + 1);
+    8020a06e:	fb043783          	ld	a5,-80(s0)
+    8020a072:	10000613          	li	a2,256
+    8020a076:	4581                	li	a1,0
+    8020a078:	853e                	mv	a0,a5
+    8020a07a:	ffff7097          	auipc	ra,0xffff7
+    8020a07e:	a6c080e7          	jalr	-1428(ra) # 80200ae6 <memset>
+    for (int off2; (off2 = reloc_clus(dp, off, 0)) != -1; off += 32) {
+    8020a082:	aa31                	j	8020a19e <enext+0x1b8>
+        if (rw_clus(dp->cur_clus, 0, 0, (uint64)&de, off2, 32) != 32 || de.lne.order == END_OF_ENTRY) {
+    8020a084:	fb843783          	ld	a5,-72(s0)
+    8020a088:	10c7a503          	lw	a0,268(a5)
+    8020a08c:	fc040693          	addi	a3,s0,-64
+    8020a090:	fe842703          	lw	a4,-24(s0)
+    8020a094:	02000793          	li	a5,32
+    8020a098:	4601                	li	a2,0
+    8020a09a:	4581                	li	a1,0
+    8020a09c:	ffffe097          	auipc	ra,0xffffe
+    8020a0a0:	5fc080e7          	jalr	1532(ra) # 80208698 <rw_clus>
+    8020a0a4:	87aa                	mv	a5,a0
+    8020a0a6:	2781                	sext.w	a5,a5
+    8020a0a8:	873e                	mv	a4,a5
+    8020a0aa:	02000793          	li	a5,32
+    8020a0ae:	00f71563          	bne	a4,a5,8020a0b8 <enext+0xd2>
+    8020a0b2:	fc044783          	lbu	a5,-64(s0)
+    8020a0b6:	e399                	bnez	a5,8020a0bc <enext+0xd6>
+            return -1;
+    8020a0b8:	57fd                	li	a5,-1
+    8020a0ba:	a239                	j	8020a1c8 <enext+0x1e2>
+        }
+        if (de.lne.order == EMPTY_ENTRY) {
+    8020a0bc:	fc044783          	lbu	a5,-64(s0)
+    8020a0c0:	873e                	mv	a4,a5
+    8020a0c2:	0e500793          	li	a5,229
+    8020a0c6:	00f71863          	bne	a4,a5,8020a0d6 <enext+0xf0>
+            cnt++;
+    8020a0ca:	fec42783          	lw	a5,-20(s0)
+    8020a0ce:	2785                	addiw	a5,a5,1
+    8020a0d0:	fef42623          	sw	a5,-20(s0)
+            continue;
+    8020a0d4:	a87d                	j	8020a192 <enext+0x1ac>
+        } else if (cnt) {
+    8020a0d6:	fec42783          	lw	a5,-20(s0)
+    8020a0da:	2781                	sext.w	a5,a5
+    8020a0dc:	cb81                	beqz	a5,8020a0ec <enext+0x106>
+            *count = cnt;
+    8020a0de:	fa043783          	ld	a5,-96(s0)
+    8020a0e2:	fec42703          	lw	a4,-20(s0)
+    8020a0e6:	c398                	sw	a4,0(a5)
+            return 0;
+    8020a0e8:	4781                	li	a5,0
+    8020a0ea:	a8f9                	j	8020a1c8 <enext+0x1e2>
+        }
+        if (de.lne.attr == ATTR_LONG_NAME) {
+    8020a0ec:	fcb44783          	lbu	a5,-53(s0)
+    8020a0f0:	873e                	mv	a4,a5
+    8020a0f2:	47bd                	li	a5,15
+    8020a0f4:	06f71363          	bne	a4,a5,8020a15a <enext+0x174>
+            int lcnt = de.lne.order & ~LAST_LONG_ENTRY;
+    8020a0f8:	fc044783          	lbu	a5,-64(s0)
+    8020a0fc:	2781                	sext.w	a5,a5
+    8020a0fe:	fbf7f793          	andi	a5,a5,-65
+    8020a102:	fef42223          	sw	a5,-28(s0)
+            if (de.lne.order & LAST_LONG_ENTRY) {
+    8020a106:	fc044783          	lbu	a5,-64(s0)
+    8020a10a:	2781                	sext.w	a5,a5
+    8020a10c:	0407f793          	andi	a5,a5,64
+    8020a110:	2781                	sext.w	a5,a5
+    8020a112:	cb99                	beqz	a5,8020a128 <enext+0x142>
+                *count = lcnt + 1;                              // plus the s-n-e;
+    8020a114:	fe442783          	lw	a5,-28(s0)
+    8020a118:	2785                	addiw	a5,a5,1
+    8020a11a:	0007871b          	sext.w	a4,a5
+    8020a11e:	fa043783          	ld	a5,-96(s0)
+    8020a122:	c398                	sw	a4,0(a5)
+                count = 0;
+    8020a124:	fa043023          	sd	zero,-96(s0)
+            }
+            read_entry_name(ep->filename + (lcnt - 1) * CHAR_LONG_NAME, &de);
+    8020a128:	fb043683          	ld	a3,-80(s0)
+    8020a12c:	fe442783          	lw	a5,-28(s0)
+    8020a130:	37fd                	addiw	a5,a5,-1
+    8020a132:	2781                	sext.w	a5,a5
+    8020a134:	873e                	mv	a4,a5
+    8020a136:	87ba                	mv	a5,a4
+    8020a138:	0017979b          	slliw	a5,a5,0x1
+    8020a13c:	9fb9                	addw	a5,a5,a4
+    8020a13e:	0027979b          	slliw	a5,a5,0x2
+    8020a142:	9fb9                	addw	a5,a5,a4
+    8020a144:	2781                	sext.w	a5,a5
+    8020a146:	97b6                	add	a5,a5,a3
+    8020a148:	fc040713          	addi	a4,s0,-64
+    8020a14c:	85ba                	mv	a1,a4
+    8020a14e:	853e                	mv	a0,a5
+    8020a150:	00000097          	auipc	ra,0x0
+    8020a154:	c94080e7          	jalr	-876(ra) # 80209de4 <read_entry_name>
+    8020a158:	a82d                	j	8020a192 <enext+0x1ac>
+        } else {
+            if (count) {
+    8020a15a:	fa043783          	ld	a5,-96(s0)
+    8020a15e:	cf99                	beqz	a5,8020a17c <enext+0x196>
+                *count = 1;
+    8020a160:	fa043783          	ld	a5,-96(s0)
+    8020a164:	4705                	li	a4,1
+    8020a166:	c398                	sw	a4,0(a5)
+                read_entry_name(ep->filename, &de);
+    8020a168:	fb043783          	ld	a5,-80(s0)
+    8020a16c:	fc040713          	addi	a4,s0,-64
+    8020a170:	85ba                	mv	a1,a4
+    8020a172:	853e                	mv	a0,a5
+    8020a174:	00000097          	auipc	ra,0x0
+    8020a178:	c70080e7          	jalr	-912(ra) # 80209de4 <read_entry_name>
+            }
+            read_entry_info(ep, &de);
+    8020a17c:	fc040793          	addi	a5,s0,-64
+    8020a180:	85be                	mv	a1,a5
+    8020a182:	fb043503          	ld	a0,-80(s0)
+    8020a186:	00000097          	auipc	ra,0x0
+    8020a18a:	dea080e7          	jalr	-534(ra) # 80209f70 <read_entry_info>
+            return 1;
+    8020a18e:	4785                	li	a5,1
+    8020a190:	a825                	j	8020a1c8 <enext+0x1e2>
+    for (int off2; (off2 = reloc_clus(dp, off, 0)) != -1; off += 32) {
+    8020a192:	fac42783          	lw	a5,-84(s0)
+    8020a196:	0207879b          	addiw	a5,a5,32
+    8020a19a:	faf42623          	sw	a5,-84(s0)
+    8020a19e:	fac42783          	lw	a5,-84(s0)
+    8020a1a2:	4601                	li	a2,0
+    8020a1a4:	85be                	mv	a1,a5
+    8020a1a6:	fb843503          	ld	a0,-72(s0)
+    8020a1aa:	ffffe097          	auipc	ra,0xffffe
+    8020a1ae:	6e6080e7          	jalr	1766(ra) # 80208890 <reloc_clus>
+    8020a1b2:	87aa                	mv	a5,a0
+    8020a1b4:	fef42423          	sw	a5,-24(s0)
+    8020a1b8:	fe842783          	lw	a5,-24(s0)
+    8020a1bc:	0007871b          	sext.w	a4,a5
+    8020a1c0:	57fd                	li	a5,-1
+    8020a1c2:	ecf711e3          	bne	a4,a5,8020a084 <enext+0x9e>
+        }
+    }
+    return -1;
+    8020a1c6:	57fd                	li	a5,-1
+}
+    8020a1c8:	853e                	mv	a0,a5
+    8020a1ca:	60e6                	ld	ra,88(sp)
+    8020a1cc:	6446                	ld	s0,80(sp)
+    8020a1ce:	6125                	addi	sp,sp,96
+    8020a1d0:	8082                	ret
+
+000000008020a1d2 <dirlookup>:
+ * @param   dp          entry of a directory file
+ * @param   filename    target filename
+ * @param   poff        offset of proper empty entry slots from the beginning of the dir
+ */
+struct dirent *dirlookup(struct dirent *dp, char *filename, uint *poff)
+{
+    8020a1d2:	715d                	addi	sp,sp,-80
+    8020a1d4:	e486                	sd	ra,72(sp)
+    8020a1d6:	e0a2                	sd	s0,64(sp)
+    8020a1d8:	0880                	addi	s0,sp,80
+    8020a1da:	fca43423          	sd	a0,-56(s0)
+    8020a1de:	fcb43023          	sd	a1,-64(s0)
+    8020a1e2:	fac43c23          	sd	a2,-72(s0)
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    8020a1e6:	fc843783          	ld	a5,-56(s0)
+    8020a1ea:	1007c783          	lbu	a5,256(a5)
+    8020a1ee:	2781                	sext.w	a5,a5
+    8020a1f0:	8bc1                	andi	a5,a5,16
+    8020a1f2:	2781                	sext.w	a5,a5
+    8020a1f4:	eb89                	bnez	a5,8020a206 <dirlookup+0x34>
+        panic("dirlookup not DIR");
+    8020a1f6:	00004517          	auipc	a0,0x4
+    8020a1fa:	d2a50513          	addi	a0,a0,-726 # 8020df20 <etext+0xf20>
+    8020a1fe:	ffff6097          	auipc	ra,0xffff6
+    8020a202:	246080e7          	jalr	582(ra) # 80200444 <panic>
+    if (strncmp(filename, ".", FAT32_MAX_FILENAME) == 0) {
+    8020a206:	0ff00613          	li	a2,255
+    8020a20a:	00004597          	auipc	a1,0x4
+    8020a20e:	d2e58593          	addi	a1,a1,-722 # 8020df38 <etext+0xf38>
+    8020a212:	fc043503          	ld	a0,-64(s0)
+    8020a216:	ffff7097          	auipc	ra,0xffff7
+    8020a21a:	aba080e7          	jalr	-1350(ra) # 80200cd0 <strncmp>
+    8020a21e:	87aa                	mv	a5,a0
+    8020a220:	eb89                	bnez	a5,8020a232 <dirlookup+0x60>
+        return edup(dp);
+    8020a222:	fc843503          	ld	a0,-56(s0)
+    8020a226:	fffff097          	auipc	ra,0xfffff
+    8020a22a:	5b2080e7          	jalr	1458(ra) # 802097d8 <edup>
+    8020a22e:	87aa                	mv	a5,a0
+    8020a230:	a2d1                	j	8020a3f4 <dirlookup+0x222>
+    } else if (strncmp(filename, "..", FAT32_MAX_FILENAME) == 0) {
+    8020a232:	0ff00613          	li	a2,255
+    8020a236:	00004597          	auipc	a1,0x4
+    8020a23a:	d0a58593          	addi	a1,a1,-758 # 8020df40 <etext+0xf40>
+    8020a23e:	fc043503          	ld	a0,-64(s0)
+    8020a242:	ffff7097          	auipc	ra,0xffff7
+    8020a246:	a8e080e7          	jalr	-1394(ra) # 80200cd0 <strncmp>
+    8020a24a:	87aa                	mv	a5,a0
+    8020a24c:	ef95                	bnez	a5,8020a288 <dirlookup+0xb6>
+        if (dp == &root) {
+    8020a24e:	fc843703          	ld	a4,-56(s0)
+    8020a252:	0001e797          	auipc	a5,0x1e
+    8020a256:	f6e78793          	addi	a5,a5,-146 # 802281c0 <root>
+    8020a25a:	00f71c63          	bne	a4,a5,8020a272 <dirlookup+0xa0>
+            return edup(&root);
+    8020a25e:	0001e517          	auipc	a0,0x1e
+    8020a262:	f6250513          	addi	a0,a0,-158 # 802281c0 <root>
+    8020a266:	fffff097          	auipc	ra,0xfffff
+    8020a26a:	572080e7          	jalr	1394(ra) # 802097d8 <edup>
+    8020a26e:	87aa                	mv	a5,a0
+    8020a270:	a251                	j	8020a3f4 <dirlookup+0x222>
+        }
+        return edup(dp->parent);
+    8020a272:	fc843783          	ld	a5,-56(s0)
+    8020a276:	1207b783          	ld	a5,288(a5)
+    8020a27a:	853e                	mv	a0,a5
+    8020a27c:	fffff097          	auipc	ra,0xfffff
+    8020a280:	55c080e7          	jalr	1372(ra) # 802097d8 <edup>
+    8020a284:	87aa                	mv	a5,a0
+    8020a286:	a2bd                	j	8020a3f4 <dirlookup+0x222>
+    }
+    if (dp->valid != 1) {
+    8020a288:	fc843783          	ld	a5,-56(s0)
+    8020a28c:	11679783          	lh	a5,278(a5)
+    8020a290:	0007871b          	sext.w	a4,a5
+    8020a294:	4785                	li	a5,1
+    8020a296:	00f70463          	beq	a4,a5,8020a29e <dirlookup+0xcc>
+        return NULL;
+    8020a29a:	4781                	li	a5,0
+    8020a29c:	aaa1                	j	8020a3f4 <dirlookup+0x222>
+    }
+    struct dirent *ep = eget(dp, filename);
+    8020a29e:	fc043583          	ld	a1,-64(s0)
+    8020a2a2:	fc843503          	ld	a0,-56(s0)
+    8020a2a6:	fffff097          	auipc	ra,0xfffff
+    8020a2aa:	b0c080e7          	jalr	-1268(ra) # 80208db2 <eget>
+    8020a2ae:	fea43023          	sd	a0,-32(s0)
+    if (ep->valid == 1) { return ep; }                               // ecache hits
+    8020a2b2:	fe043783          	ld	a5,-32(s0)
+    8020a2b6:	11679783          	lh	a5,278(a5)
+    8020a2ba:	0007871b          	sext.w	a4,a5
+    8020a2be:	4785                	li	a5,1
+    8020a2c0:	00f71563          	bne	a4,a5,8020a2ca <dirlookup+0xf8>
+    8020a2c4:	fe043783          	ld	a5,-32(s0)
+    8020a2c8:	a235                	j	8020a3f4 <dirlookup+0x222>
+
+    int len = strlen(filename);
+    8020a2ca:	fc043503          	ld	a0,-64(s0)
+    8020a2ce:	ffff7097          	auipc	ra,0xffff7
+    8020a2d2:	b88080e7          	jalr	-1144(ra) # 80200e56 <strlen>
+    8020a2d6:	87aa                	mv	a5,a0
+    8020a2d8:	fcf42e23          	sw	a5,-36(s0)
+    int entcnt = (len + CHAR_LONG_NAME - 1) / CHAR_LONG_NAME + 1;   // count of l-n-entries, rounds up. plus s-n-e
+    8020a2dc:	fdc42783          	lw	a5,-36(s0)
+    8020a2e0:	27b1                	addiw	a5,a5,12
+    8020a2e2:	2781                	sext.w	a5,a5
+    8020a2e4:	873e                	mv	a4,a5
+    8020a2e6:	47b5                	li	a5,13
+    8020a2e8:	02f747bb          	divw	a5,a4,a5
+    8020a2ec:	2781                	sext.w	a5,a5
+    8020a2ee:	2785                	addiw	a5,a5,1
+    8020a2f0:	fcf42c23          	sw	a5,-40(s0)
+    int count = 0;
+    8020a2f4:	fc042823          	sw	zero,-48(s0)
+    int type;
+    uint off = 0;
+    8020a2f8:	fe042623          	sw	zero,-20(s0)
+    reloc_clus(dp, 0, 0);
+    8020a2fc:	4601                	li	a2,0
+    8020a2fe:	4581                	li	a1,0
+    8020a300:	fc843503          	ld	a0,-56(s0)
+    8020a304:	ffffe097          	auipc	ra,0xffffe
+    8020a308:	58c080e7          	jalr	1420(ra) # 80208890 <reloc_clus>
+    while ((type = enext(dp, ep, off, &count) != -1)) {
+    8020a30c:	a841                	j	8020a39c <dirlookup+0x1ca>
+        if (type == 0) {
+    8020a30e:	fd442783          	lw	a5,-44(s0)
+    8020a312:	2781                	sext.w	a5,a5
+    8020a314:	e39d                	bnez	a5,8020a33a <dirlookup+0x168>
+            if (poff && count >= entcnt) {
+    8020a316:	fb843783          	ld	a5,-72(s0)
+    8020a31a:	c7b5                	beqz	a5,8020a386 <dirlookup+0x1b4>
+    8020a31c:	fd042703          	lw	a4,-48(s0)
+    8020a320:	fd842783          	lw	a5,-40(s0)
+    8020a324:	2781                	sext.w	a5,a5
+    8020a326:	06f74063          	blt	a4,a5,8020a386 <dirlookup+0x1b4>
+                *poff = off;
+    8020a32a:	fb843783          	ld	a5,-72(s0)
+    8020a32e:	fec42703          	lw	a4,-20(s0)
+    8020a332:	c398                	sw	a4,0(a5)
+                poff = 0;
+    8020a334:	fa043c23          	sd	zero,-72(s0)
+    8020a338:	a0b9                	j	8020a386 <dirlookup+0x1b4>
+            }
+        } else if (strncmp(filename, ep->filename, FAT32_MAX_FILENAME) == 0) {
+    8020a33a:	fe043783          	ld	a5,-32(s0)
+    8020a33e:	0ff00613          	li	a2,255
+    8020a342:	85be                	mv	a1,a5
+    8020a344:	fc043503          	ld	a0,-64(s0)
+    8020a348:	ffff7097          	auipc	ra,0xffff7
+    8020a34c:	988080e7          	jalr	-1656(ra) # 80200cd0 <strncmp>
+    8020a350:	87aa                	mv	a5,a0
+    8020a352:	eb95                	bnez	a5,8020a386 <dirlookup+0x1b4>
+            ep->parent = edup(dp);
+    8020a354:	fc843503          	ld	a0,-56(s0)
+    8020a358:	fffff097          	auipc	ra,0xfffff
+    8020a35c:	480080e7          	jalr	1152(ra) # 802097d8 <edup>
+    8020a360:	872a                	mv	a4,a0
+    8020a362:	fe043783          	ld	a5,-32(s0)
+    8020a366:	12e7b023          	sd	a4,288(a5)
+            ep->off = off;
+    8020a36a:	fe043783          	ld	a5,-32(s0)
+    8020a36e:	fec42703          	lw	a4,-20(s0)
+    8020a372:	10e7ae23          	sw	a4,284(a5)
+            ep->valid = 1;
+    8020a376:	fe043783          	ld	a5,-32(s0)
+    8020a37a:	4705                	li	a4,1
+    8020a37c:	10e79b23          	sh	a4,278(a5)
+            return ep;
+    8020a380:	fe043783          	ld	a5,-32(s0)
+    8020a384:	a885                	j	8020a3f4 <dirlookup+0x222>
+        }
+        off += count << 5;
+    8020a386:	fd042783          	lw	a5,-48(s0)
+    8020a38a:	0057979b          	slliw	a5,a5,0x5
+    8020a38e:	2781                	sext.w	a5,a5
+    8020a390:	2781                	sext.w	a5,a5
+    8020a392:	fec42703          	lw	a4,-20(s0)
+    8020a396:	9fb9                	addw	a5,a5,a4
+    8020a398:	fef42623          	sw	a5,-20(s0)
+    while ((type = enext(dp, ep, off, &count) != -1)) {
+    8020a39c:	fd040713          	addi	a4,s0,-48
+    8020a3a0:	fec42783          	lw	a5,-20(s0)
+    8020a3a4:	86ba                	mv	a3,a4
+    8020a3a6:	863e                	mv	a2,a5
+    8020a3a8:	fe043583          	ld	a1,-32(s0)
+    8020a3ac:	fc843503          	ld	a0,-56(s0)
+    8020a3b0:	00000097          	auipc	ra,0x0
+    8020a3b4:	c36080e7          	jalr	-970(ra) # 80209fe6 <enext>
+    8020a3b8:	87aa                	mv	a5,a0
+    8020a3ba:	873e                	mv	a4,a5
+    8020a3bc:	57fd                	li	a5,-1
+    8020a3be:	40f707b3          	sub	a5,a4,a5
+    8020a3c2:	00f037b3          	snez	a5,a5
+    8020a3c6:	0ff7f793          	andi	a5,a5,255
+    8020a3ca:	fcf42a23          	sw	a5,-44(s0)
+    8020a3ce:	fd442783          	lw	a5,-44(s0)
+    8020a3d2:	2781                	sext.w	a5,a5
+    8020a3d4:	ff8d                	bnez	a5,8020a30e <dirlookup+0x13c>
+    }
+    if (poff) {
+    8020a3d6:	fb843783          	ld	a5,-72(s0)
+    8020a3da:	c791                	beqz	a5,8020a3e6 <dirlookup+0x214>
+        *poff = off;
+    8020a3dc:	fb843783          	ld	a5,-72(s0)
+    8020a3e0:	fec42703          	lw	a4,-20(s0)
+    8020a3e4:	c398                	sw	a4,0(a5)
+    }
+    eput(ep);
+    8020a3e6:	fe043503          	ld	a0,-32(s0)
+    8020a3ea:	fffff097          	auipc	ra,0xfffff
+    8020a3ee:	7bc080e7          	jalr	1980(ra) # 80209ba6 <eput>
+    return NULL;
+    8020a3f2:	4781                	li	a5,0
+}
+    8020a3f4:	853e                	mv	a0,a5
+    8020a3f6:	60a6                	ld	ra,72(sp)
+    8020a3f8:	6406                	ld	s0,64(sp)
+    8020a3fa:	6161                	addi	sp,sp,80
+    8020a3fc:	8082                	ret
+
+000000008020a3fe <skipelem>:
+
+static char *skipelem(char *path, char *name)
+{
+    8020a3fe:	7179                	addi	sp,sp,-48
+    8020a400:	f406                	sd	ra,40(sp)
+    8020a402:	f022                	sd	s0,32(sp)
+    8020a404:	1800                	addi	s0,sp,48
+    8020a406:	fca43c23          	sd	a0,-40(s0)
+    8020a40a:	fcb43823          	sd	a1,-48(s0)
+    while (*path == '/') {
+    8020a40e:	a031                	j	8020a41a <skipelem+0x1c>
+        path++;
+    8020a410:	fd843783          	ld	a5,-40(s0)
+    8020a414:	0785                	addi	a5,a5,1
+    8020a416:	fcf43c23          	sd	a5,-40(s0)
+    while (*path == '/') {
+    8020a41a:	fd843783          	ld	a5,-40(s0)
+    8020a41e:	0007c783          	lbu	a5,0(a5)
+    8020a422:	873e                	mv	a4,a5
+    8020a424:	02f00793          	li	a5,47
+    8020a428:	fef704e3          	beq	a4,a5,8020a410 <skipelem+0x12>
+    }
+    if (*path == 0) { return NULL; }
+    8020a42c:	fd843783          	ld	a5,-40(s0)
+    8020a430:	0007c783          	lbu	a5,0(a5)
+    8020a434:	e399                	bnez	a5,8020a43a <skipelem+0x3c>
+    8020a436:	4781                	li	a5,0
+    8020a438:	a045                	j	8020a4d8 <skipelem+0xda>
+    char *s = path;
+    8020a43a:	fd843783          	ld	a5,-40(s0)
+    8020a43e:	fef43023          	sd	a5,-32(s0)
+    while (*path != '/' && *path != 0) {
+    8020a442:	a031                	j	8020a44e <skipelem+0x50>
+        path++;
+    8020a444:	fd843783          	ld	a5,-40(s0)
+    8020a448:	0785                	addi	a5,a5,1
+    8020a44a:	fcf43c23          	sd	a5,-40(s0)
+    while (*path != '/' && *path != 0) {
+    8020a44e:	fd843783          	ld	a5,-40(s0)
+    8020a452:	0007c783          	lbu	a5,0(a5)
+    8020a456:	873e                	mv	a4,a5
+    8020a458:	02f00793          	li	a5,47
+    8020a45c:	00f70763          	beq	a4,a5,8020a46a <skipelem+0x6c>
+    8020a460:	fd843783          	ld	a5,-40(s0)
+    8020a464:	0007c783          	lbu	a5,0(a5)
+    8020a468:	fff1                	bnez	a5,8020a444 <skipelem+0x46>
+    }
+    int len = path - s;
+    8020a46a:	fd843703          	ld	a4,-40(s0)
+    8020a46e:	fe043783          	ld	a5,-32(s0)
+    8020a472:	40f707b3          	sub	a5,a4,a5
+    8020a476:	fef42623          	sw	a5,-20(s0)
+    if (len > FAT32_MAX_FILENAME) {
+    8020a47a:	fec42783          	lw	a5,-20(s0)
+    8020a47e:	0007871b          	sext.w	a4,a5
+    8020a482:	0ff00793          	li	a5,255
+    8020a486:	00e7d663          	bge	a5,a4,8020a492 <skipelem+0x94>
+        len = FAT32_MAX_FILENAME;
+    8020a48a:	0ff00793          	li	a5,255
+    8020a48e:	fef42623          	sw	a5,-20(s0)
+    }
+    name[len] = 0;
+    8020a492:	fec42783          	lw	a5,-20(s0)
+    8020a496:	fd043703          	ld	a4,-48(s0)
+    8020a49a:	97ba                	add	a5,a5,a4
+    8020a49c:	00078023          	sb	zero,0(a5)
+    memmove(name, s, len);
+    8020a4a0:	fec42783          	lw	a5,-20(s0)
+    8020a4a4:	863e                	mv	a2,a5
+    8020a4a6:	fe043583          	ld	a1,-32(s0)
+    8020a4aa:	fd043503          	ld	a0,-48(s0)
+    8020a4ae:	ffff6097          	auipc	ra,0xffff6
+    8020a4b2:	71c080e7          	jalr	1820(ra) # 80200bca <memmove>
+    while (*path == '/') {
+    8020a4b6:	a031                	j	8020a4c2 <skipelem+0xc4>
+        path++;
+    8020a4b8:	fd843783          	ld	a5,-40(s0)
+    8020a4bc:	0785                	addi	a5,a5,1
+    8020a4be:	fcf43c23          	sd	a5,-40(s0)
+    while (*path == '/') {
+    8020a4c2:	fd843783          	ld	a5,-40(s0)
+    8020a4c6:	0007c783          	lbu	a5,0(a5)
+    8020a4ca:	873e                	mv	a4,a5
+    8020a4cc:	02f00793          	li	a5,47
+    8020a4d0:	fef704e3          	beq	a4,a5,8020a4b8 <skipelem+0xba>
+    }
+    return path;
+    8020a4d4:	fd843783          	ld	a5,-40(s0)
+}
+    8020a4d8:	853e                	mv	a0,a5
+    8020a4da:	70a2                	ld	ra,40(sp)
+    8020a4dc:	7402                	ld	s0,32(sp)
+    8020a4de:	6145                	addi	sp,sp,48
+    8020a4e0:	8082                	ret
+
+000000008020a4e2 <lookup_path>:
+
+// FAT32 version of namex in xv6's original file system.
+static struct dirent *lookup_path(char *path, int parent, char *name)
+{
+    8020a4e2:	7139                	addi	sp,sp,-64
+    8020a4e4:	fc06                	sd	ra,56(sp)
+    8020a4e6:	f822                	sd	s0,48(sp)
+    8020a4e8:	0080                	addi	s0,sp,64
+    8020a4ea:	fca43c23          	sd	a0,-40(s0)
+    8020a4ee:	87ae                	mv	a5,a1
+    8020a4f0:	fcc43423          	sd	a2,-56(s0)
+    8020a4f4:	fcf42a23          	sw	a5,-44(s0)
+    struct dirent *entry, *next;
+    if (*path == '/') {
+    8020a4f8:	fd843783          	ld	a5,-40(s0)
+    8020a4fc:	0007c783          	lbu	a5,0(a5)
+    8020a500:	873e                	mv	a4,a5
+    8020a502:	02f00793          	li	a5,47
+    8020a506:	00f71d63          	bne	a4,a5,8020a520 <lookup_path+0x3e>
+        entry = edup(&root);
+    8020a50a:	0001e517          	auipc	a0,0x1e
+    8020a50e:	cb650513          	addi	a0,a0,-842 # 802281c0 <root>
+    8020a512:	fffff097          	auipc	ra,0xfffff
+    8020a516:	2c6080e7          	jalr	710(ra) # 802097d8 <edup>
+    8020a51a:	fea43423          	sd	a0,-24(s0)
+    8020a51e:	a0cd                	j	8020a600 <lookup_path+0x11e>
+    } else if (*path != '\0') {
+    8020a520:	fd843783          	ld	a5,-40(s0)
+    8020a524:	0007c783          	lbu	a5,0(a5)
+    8020a528:	c385                	beqz	a5,8020a548 <lookup_path+0x66>
+        entry = edup(myproc()->cwd);
+    8020a52a:	ffff8097          	auipc	ra,0xffff8
+    8020a52e:	438080e7          	jalr	1080(ra) # 80202962 <myproc>
+    8020a532:	87aa                	mv	a5,a0
+    8020a534:	1587b783          	ld	a5,344(a5)
+    8020a538:	853e                	mv	a0,a5
+    8020a53a:	fffff097          	auipc	ra,0xfffff
+    8020a53e:	29e080e7          	jalr	670(ra) # 802097d8 <edup>
+    8020a542:	fea43423          	sd	a0,-24(s0)
+    8020a546:	a86d                	j	8020a600 <lookup_path+0x11e>
+    } else {
+        return NULL;
+    8020a548:	4781                	li	a5,0
+    8020a54a:	a0f5                	j	8020a636 <lookup_path+0x154>
+    }
+    while ((path = skipelem(path, name)) != 0) {
+        elock(entry);
+    8020a54c:	fe843503          	ld	a0,-24(s0)
+    8020a550:	fffff097          	auipc	ra,0xfffff
+    8020a554:	5ac080e7          	jalr	1452(ra) # 80209afc <elock>
+        if (!(entry->attribute & ATTR_DIRECTORY)) {
+    8020a558:	fe843783          	ld	a5,-24(s0)
+    8020a55c:	1007c783          	lbu	a5,256(a5)
+    8020a560:	2781                	sext.w	a5,a5
+    8020a562:	8bc1                	andi	a5,a5,16
+    8020a564:	2781                	sext.w	a5,a5
+    8020a566:	ef99                	bnez	a5,8020a584 <lookup_path+0xa2>
+            eunlock(entry);
+    8020a568:	fe843503          	ld	a0,-24(s0)
+    8020a56c:	fffff097          	auipc	ra,0xfffff
+    8020a570:	5da080e7          	jalr	1498(ra) # 80209b46 <eunlock>
+            eput(entry);
+    8020a574:	fe843503          	ld	a0,-24(s0)
+    8020a578:	fffff097          	auipc	ra,0xfffff
+    8020a57c:	62e080e7          	jalr	1582(ra) # 80209ba6 <eput>
+            return NULL;
+    8020a580:	4781                	li	a5,0
+    8020a582:	a855                	j	8020a636 <lookup_path+0x154>
+        }
+        if (parent && *path == '\0') {
+    8020a584:	fd442783          	lw	a5,-44(s0)
+    8020a588:	2781                	sext.w	a5,a5
+    8020a58a:	cf99                	beqz	a5,8020a5a8 <lookup_path+0xc6>
+    8020a58c:	fd843783          	ld	a5,-40(s0)
+    8020a590:	0007c783          	lbu	a5,0(a5)
+    8020a594:	eb91                	bnez	a5,8020a5a8 <lookup_path+0xc6>
+            eunlock(entry);
+    8020a596:	fe843503          	ld	a0,-24(s0)
+    8020a59a:	fffff097          	auipc	ra,0xfffff
+    8020a59e:	5ac080e7          	jalr	1452(ra) # 80209b46 <eunlock>
+            return entry;
+    8020a5a2:	fe843783          	ld	a5,-24(s0)
+    8020a5a6:	a841                	j	8020a636 <lookup_path+0x154>
+        }
+        if ((next = dirlookup(entry, name, 0)) == 0) {
+    8020a5a8:	4601                	li	a2,0
+    8020a5aa:	fc843583          	ld	a1,-56(s0)
+    8020a5ae:	fe843503          	ld	a0,-24(s0)
+    8020a5b2:	00000097          	auipc	ra,0x0
+    8020a5b6:	c20080e7          	jalr	-992(ra) # 8020a1d2 <dirlookup>
+    8020a5ba:	fea43023          	sd	a0,-32(s0)
+    8020a5be:	fe043783          	ld	a5,-32(s0)
+    8020a5c2:	ef99                	bnez	a5,8020a5e0 <lookup_path+0xfe>
+            eunlock(entry);
+    8020a5c4:	fe843503          	ld	a0,-24(s0)
+    8020a5c8:	fffff097          	auipc	ra,0xfffff
+    8020a5cc:	57e080e7          	jalr	1406(ra) # 80209b46 <eunlock>
+            eput(entry);
+    8020a5d0:	fe843503          	ld	a0,-24(s0)
+    8020a5d4:	fffff097          	auipc	ra,0xfffff
+    8020a5d8:	5d2080e7          	jalr	1490(ra) # 80209ba6 <eput>
+            return NULL;
+    8020a5dc:	4781                	li	a5,0
+    8020a5de:	a8a1                	j	8020a636 <lookup_path+0x154>
+        }
+        eunlock(entry);
+    8020a5e0:	fe843503          	ld	a0,-24(s0)
+    8020a5e4:	fffff097          	auipc	ra,0xfffff
+    8020a5e8:	562080e7          	jalr	1378(ra) # 80209b46 <eunlock>
+        eput(entry);
+    8020a5ec:	fe843503          	ld	a0,-24(s0)
+    8020a5f0:	fffff097          	auipc	ra,0xfffff
+    8020a5f4:	5b6080e7          	jalr	1462(ra) # 80209ba6 <eput>
+        entry = next;
+    8020a5f8:	fe043783          	ld	a5,-32(s0)
+    8020a5fc:	fef43423          	sd	a5,-24(s0)
+    while ((path = skipelem(path, name)) != 0) {
+    8020a600:	fc843583          	ld	a1,-56(s0)
+    8020a604:	fd843503          	ld	a0,-40(s0)
+    8020a608:	00000097          	auipc	ra,0x0
+    8020a60c:	df6080e7          	jalr	-522(ra) # 8020a3fe <skipelem>
+    8020a610:	fca43c23          	sd	a0,-40(s0)
+    8020a614:	fd843783          	ld	a5,-40(s0)
+    8020a618:	fb95                	bnez	a5,8020a54c <lookup_path+0x6a>
+    }
+    if (parent) {
+    8020a61a:	fd442783          	lw	a5,-44(s0)
+    8020a61e:	2781                	sext.w	a5,a5
+    8020a620:	cb89                	beqz	a5,8020a632 <lookup_path+0x150>
+        eput(entry);
+    8020a622:	fe843503          	ld	a0,-24(s0)
+    8020a626:	fffff097          	auipc	ra,0xfffff
+    8020a62a:	580080e7          	jalr	1408(ra) # 80209ba6 <eput>
+        return NULL;
+    8020a62e:	4781                	li	a5,0
+    8020a630:	a019                	j	8020a636 <lookup_path+0x154>
+    }
+    return entry;
+    8020a632:	fe843783          	ld	a5,-24(s0)
+}
+    8020a636:	853e                	mv	a0,a5
+    8020a638:	70e2                	ld	ra,56(sp)
+    8020a63a:	7442                	ld	s0,48(sp)
+    8020a63c:	6121                	addi	sp,sp,64
+    8020a63e:	8082                	ret
+
+000000008020a640 <ename>:
+
+struct dirent *ename(char *path)
+{
+    8020a640:	712d                	addi	sp,sp,-288
+    8020a642:	ee06                	sd	ra,280(sp)
+    8020a644:	ea22                	sd	s0,272(sp)
+    8020a646:	1200                	addi	s0,sp,288
+    8020a648:	eea43423          	sd	a0,-280(s0)
+    char name[FAT32_MAX_FILENAME + 1];
+    return lookup_path(path, 0, name);
+    8020a64c:	ef040793          	addi	a5,s0,-272
+    8020a650:	863e                	mv	a2,a5
+    8020a652:	4581                	li	a1,0
+    8020a654:	ee843503          	ld	a0,-280(s0)
+    8020a658:	00000097          	auipc	ra,0x0
+    8020a65c:	e8a080e7          	jalr	-374(ra) # 8020a4e2 <lookup_path>
+    8020a660:	87aa                	mv	a5,a0
+}
+    8020a662:	853e                	mv	a0,a5
+    8020a664:	60f2                	ld	ra,280(sp)
+    8020a666:	6452                	ld	s0,272(sp)
+    8020a668:	6115                	addi	sp,sp,288
+    8020a66a:	8082                	ret
+
+000000008020a66c <enameparent>:
+
+struct dirent *enameparent(char *path, char *name)
+{
+    8020a66c:	1101                	addi	sp,sp,-32
+    8020a66e:	ec06                	sd	ra,24(sp)
+    8020a670:	e822                	sd	s0,16(sp)
+    8020a672:	1000                	addi	s0,sp,32
+    8020a674:	fea43423          	sd	a0,-24(s0)
+    8020a678:	feb43023          	sd	a1,-32(s0)
+    return lookup_path(path, 1, name);
+    8020a67c:	fe043603          	ld	a2,-32(s0)
+    8020a680:	4585                	li	a1,1
+    8020a682:	fe843503          	ld	a0,-24(s0)
+    8020a686:	00000097          	auipc	ra,0x0
+    8020a68a:	e5c080e7          	jalr	-420(ra) # 8020a4e2 <lookup_path>
+    8020a68e:	87aa                	mv	a5,a0
+}
+    8020a690:	853e                	mv	a0,a5
+    8020a692:	60e2                	ld	ra,24(sp)
+    8020a694:	6442                	ld	s0,16(sp)
+    8020a696:	6105                	addi	sp,sp,32
+    8020a698:	8082                	ret
+
+000000008020a69a <plicinit>:
+
+//
+// the riscv Platform Level Interrupt Controller (PLIC).
+//
+
+void plicinit(void) {
+    8020a69a:	1141                	addi	sp,sp,-16
+    8020a69c:	e406                	sd	ra,8(sp)
+    8020a69e:	e022                	sd	s0,0(sp)
+    8020a6a0:	0800                	addi	s0,sp,16
+	writed(1, PLIC_V + DISK_IRQ * sizeof(uint32));
+    8020a6a2:	00fc37b7          	lui	a5,0xfc3
+    8020a6a6:	07ba                	slli	a5,a5,0xe
+    8020a6a8:	0791                	addi	a5,a5,4
+    8020a6aa:	4705                	li	a4,1
+    8020a6ac:	c398                	sw	a4,0(a5)
+	writed(1, PLIC_V + UART_IRQ * sizeof(uint32));
+    8020a6ae:	00fc37b7          	lui	a5,0xfc3
+    8020a6b2:	07ba                	slli	a5,a5,0xe
+    8020a6b4:	02878793          	addi	a5,a5,40 # fc3028 <_entry-0x7f23cfd8>
+    8020a6b8:	4705                	li	a4,1
+    8020a6ba:	c398                	sw	a4,0(a5)
+
+	#ifdef DEBUG 
+	printf("plicinit\n");
+    8020a6bc:	00004517          	auipc	a0,0x4
+    8020a6c0:	88c50513          	addi	a0,a0,-1908 # 8020df48 <etext+0xf48>
+    8020a6c4:	ffff6097          	auipc	ra,0xffff6
+    8020a6c8:	b2a080e7          	jalr	-1238(ra) # 802001ee <printf>
+	#endif 
+}
+    8020a6cc:	0001                	nop
+    8020a6ce:	60a2                	ld	ra,8(sp)
+    8020a6d0:	6402                	ld	s0,0(sp)
+    8020a6d2:	0141                	addi	sp,sp,16
+    8020a6d4:	8082                	ret
+
+000000008020a6d6 <plicinithart>:
+
+void
+plicinithart(void)
+{
+    8020a6d6:	1101                	addi	sp,sp,-32
+    8020a6d8:	ec06                	sd	ra,24(sp)
+    8020a6da:	e822                	sd	s0,16(sp)
+    8020a6dc:	1000                	addi	s0,sp,32
+  int hart = cpuid();
+    8020a6de:	ffff8097          	auipc	ra,0xffff8
+    8020a6e2:	226080e7          	jalr	550(ra) # 80202904 <cpuid>
+    8020a6e6:	87aa                	mv	a5,a0
+    8020a6e8:	fef42623          	sw	a5,-20(s0)
+  #ifdef QEMU
+  // set uart's enable bit for this hart's S-mode. 
+  *(uint32*)PLIC_SENABLE(hart)= (1 << UART_IRQ) | (1 << DISK_IRQ);
+    8020a6ec:	fec42783          	lw	a5,-20(s0)
+    8020a6f0:	0087979b          	slliw	a5,a5,0x8
+    8020a6f4:	2781                	sext.w	a5,a5
+    8020a6f6:	873e                	mv	a4,a5
+    8020a6f8:	7e1807b7          	lui	a5,0x7e180
+    8020a6fc:	04178793          	addi	a5,a5,65 # 7e180041 <_entry-0x207ffbf>
+    8020a700:	079e                	slli	a5,a5,0x7
+    8020a702:	97ba                	add	a5,a5,a4
+    8020a704:	873e                	mv	a4,a5
+    8020a706:	40200793          	li	a5,1026
+    8020a70a:	c31c                	sw	a5,0(a4)
+  // set this hart's S-mode priority threshold to 0.
+  *(uint32*)PLIC_SPRIORITY(hart) = 0;
+    8020a70c:	fec42783          	lw	a5,-20(s0)
+    8020a710:	00d7979b          	slliw	a5,a5,0xd
+    8020a714:	2781                	sext.w	a5,a5
+    8020a716:	873e                	mv	a4,a5
+    8020a718:	03f0c7b7          	lui	a5,0x3f0c
+    8020a71c:	20178793          	addi	a5,a5,513 # 3f0c201 <_entry-0x7c2f3dff>
+    8020a720:	07b2                	slli	a5,a5,0xc
+    8020a722:	97ba                	add	a5,a5,a4
+    8020a724:	0007a023          	sw	zero,0(a5)
+  *(uint32*)PLIC_PRIORITY(UART_IRQ) = 1;
+    8020a728:	00fc37b7          	lui	a5,0xfc3
+    8020a72c:	07ba                	slli	a5,a5,0xe
+    8020a72e:	02878793          	addi	a5,a5,40 # fc3028 <_entry-0x7f23cfd8>
+    8020a732:	4705                	li	a4,1
+    8020a734:	c398                	sw	a4,0(a5)
+  *(hart_m_enable) = readd(hart_m_enable) | (1 << DISK_IRQ);
+  uint32 *hart0_m_int_enable_hi = hart_m_enable + 1;
+  *(hart0_m_int_enable_hi) = readd(hart0_m_int_enable_hi) | (1 << (UART_IRQ % 32));
+  #endif
+  #ifdef DEBUG
+  printf("plicinithart\n");
+    8020a736:	00004517          	auipc	a0,0x4
+    8020a73a:	82250513          	addi	a0,a0,-2014 # 8020df58 <etext+0xf58>
+    8020a73e:	ffff6097          	auipc	ra,0xffff6
+    8020a742:	ab0080e7          	jalr	-1360(ra) # 802001ee <printf>
+  #endif
+}
+    8020a746:	0001                	nop
+    8020a748:	60e2                	ld	ra,24(sp)
+    8020a74a:	6442                	ld	s0,16(sp)
+    8020a74c:	6105                	addi	sp,sp,32
+    8020a74e:	8082                	ret
+
+000000008020a750 <plic_claim>:
+
+// ask the PLIC what interrupt we should serve.
+int
+plic_claim(void)
+{
+    8020a750:	1101                	addi	sp,sp,-32
+    8020a752:	ec06                	sd	ra,24(sp)
+    8020a754:	e822                	sd	s0,16(sp)
+    8020a756:	1000                	addi	s0,sp,32
+  int hart = cpuid();
+    8020a758:	ffff8097          	auipc	ra,0xffff8
+    8020a75c:	1ac080e7          	jalr	428(ra) # 80202904 <cpuid>
+    8020a760:	87aa                	mv	a5,a0
+    8020a762:	fef42623          	sw	a5,-20(s0)
+  int irq;
+  #ifndef QEMU
+  irq = *(uint32*)PLIC_MCLAIM(hart);
+  #else
+  irq = *(uint32*)PLIC_SCLAIM(hart);
+    8020a766:	fec42783          	lw	a5,-20(s0)
+    8020a76a:	00d7979b          	slliw	a5,a5,0xd
+    8020a76e:	2781                	sext.w	a5,a5
+    8020a770:	873e                	mv	a4,a5
+    8020a772:	00003797          	auipc	a5,0x3
+    8020a776:	7f678793          	addi	a5,a5,2038 # 8020df68 <etext+0xf68>
+    8020a77a:	639c                	ld	a5,0(a5)
+    8020a77c:	97ba                	add	a5,a5,a4
+    8020a77e:	439c                	lw	a5,0(a5)
+    8020a780:	fef42423          	sw	a5,-24(s0)
+  #endif
+  return irq;
+    8020a784:	fe842783          	lw	a5,-24(s0)
+}
+    8020a788:	853e                	mv	a0,a5
+    8020a78a:	60e2                	ld	ra,24(sp)
+    8020a78c:	6442                	ld	s0,16(sp)
+    8020a78e:	6105                	addi	sp,sp,32
+    8020a790:	8082                	ret
+
+000000008020a792 <plic_complete>:
+
+// tell the PLIC we've served this IRQ.
+void
+plic_complete(int irq)
+{
+    8020a792:	7179                	addi	sp,sp,-48
+    8020a794:	f406                	sd	ra,40(sp)
+    8020a796:	f022                	sd	s0,32(sp)
+    8020a798:	1800                	addi	s0,sp,48
+    8020a79a:	87aa                	mv	a5,a0
+    8020a79c:	fcf42e23          	sw	a5,-36(s0)
+  int hart = cpuid();
+    8020a7a0:	ffff8097          	auipc	ra,0xffff8
+    8020a7a4:	164080e7          	jalr	356(ra) # 80202904 <cpuid>
+    8020a7a8:	87aa                	mv	a5,a0
+    8020a7aa:	fef42623          	sw	a5,-20(s0)
+  #ifndef QEMU
+  *(uint32*)PLIC_MCLAIM(hart) = irq;
+  #else
+  *(uint32*)PLIC_SCLAIM(hart) = irq;
+    8020a7ae:	fec42783          	lw	a5,-20(s0)
+    8020a7b2:	00d7979b          	slliw	a5,a5,0xd
+    8020a7b6:	2781                	sext.w	a5,a5
+    8020a7b8:	873e                	mv	a4,a5
+    8020a7ba:	00003797          	auipc	a5,0x3
+    8020a7be:	7ae78793          	addi	a5,a5,1966 # 8020df68 <etext+0xf68>
+    8020a7c2:	639c                	ld	a5,0(a5)
+    8020a7c4:	97ba                	add	a5,a5,a4
+    8020a7c6:	873e                	mv	a4,a5
+    8020a7c8:	fdc42783          	lw	a5,-36(s0)
+    8020a7cc:	c31c                	sw	a5,0(a4)
+  #endif
+}
+    8020a7ce:	0001                	nop
+    8020a7d0:	70a2                	ld	ra,40(sp)
+    8020a7d2:	7402                	ld	s0,32(sp)
+    8020a7d4:	6145                	addi	sp,sp,48
+    8020a7d6:	8082                	ret
+
+000000008020a7d8 <sbi_console_putchar>:
+{
+    8020a7d8:	1101                	addi	sp,sp,-32
+    8020a7da:	ec22                	sd	s0,24(sp)
+    8020a7dc:	1000                	addi	s0,sp,32
+    8020a7de:	87aa                	mv	a5,a0
+    8020a7e0:	fef42623          	sw	a5,-20(s0)
+	SBI_CALL_1(SBI_CONSOLE_PUTCHAR, 0, ch);
+    8020a7e4:	fec42783          	lw	a5,-20(s0)
+    8020a7e8:	853e                	mv	a0,a5
+    8020a7ea:	4581                	li	a1,0
+    8020a7ec:	4601                	li	a2,0
+    8020a7ee:	4681                	li	a3,0
+    8020a7f0:	4885                	li	a7,1
+    8020a7f2:	4801                	li	a6,0
+    8020a7f4:	00000073          	ecall
+}
+    8020a7f8:	0001                	nop
+    8020a7fa:	6462                	ld	s0,24(sp)
+    8020a7fc:	6105                	addi	sp,sp,32
+    8020a7fe:	8082                	ret
+
+000000008020a800 <consputc>:
+#define BACKSPACE 0x100
+#define C(x)  ((x)-'@')  // Control-x
+
+
+
+void consputc(int c) {
+    8020a800:	1101                	addi	sp,sp,-32
+    8020a802:	ec06                	sd	ra,24(sp)
+    8020a804:	e822                	sd	s0,16(sp)
+    8020a806:	1000                	addi	s0,sp,32
+    8020a808:	87aa                	mv	a5,a0
+    8020a80a:	fef42623          	sw	a5,-20(s0)
+  if(c == BACKSPACE){
+    8020a80e:	fec42783          	lw	a5,-20(s0)
+    8020a812:	0007871b          	sext.w	a4,a5
+    8020a816:	10000793          	li	a5,256
+    8020a81a:	02f71363          	bne	a4,a5,8020a840 <consputc+0x40>
+    // if the user typed backspace, overwrite with a space.
+    sbi_console_putchar('\b');
+    8020a81e:	4521                	li	a0,8
+    8020a820:	00000097          	auipc	ra,0x0
+    8020a824:	fb8080e7          	jalr	-72(ra) # 8020a7d8 <sbi_console_putchar>
+    sbi_console_putchar(' ');
+    8020a828:	02000513          	li	a0,32
+    8020a82c:	00000097          	auipc	ra,0x0
+    8020a830:	fac080e7          	jalr	-84(ra) # 8020a7d8 <sbi_console_putchar>
+    sbi_console_putchar('\b');
+    8020a834:	4521                	li	a0,8
+    8020a836:	00000097          	auipc	ra,0x0
+    8020a83a:	fa2080e7          	jalr	-94(ra) # 8020a7d8 <sbi_console_putchar>
+  } else {
+    sbi_console_putchar(c);
+  }
+}
+    8020a83e:	a801                	j	8020a84e <consputc+0x4e>
+    sbi_console_putchar(c);
+    8020a840:	fec42783          	lw	a5,-20(s0)
+    8020a844:	853e                	mv	a0,a5
+    8020a846:	00000097          	auipc	ra,0x0
+    8020a84a:	f92080e7          	jalr	-110(ra) # 8020a7d8 <sbi_console_putchar>
+}
+    8020a84e:	0001                	nop
+    8020a850:	60e2                	ld	ra,24(sp)
+    8020a852:	6442                	ld	s0,16(sp)
+    8020a854:	6105                	addi	sp,sp,32
+    8020a856:	8082                	ret
+
+000000008020a858 <consolewrite>:
+//
+// user write()s to the console go here.
+//
+int
+consolewrite(int user_src, uint64 src, int n)
+{
+    8020a858:	7179                	addi	sp,sp,-48
+    8020a85a:	f406                	sd	ra,40(sp)
+    8020a85c:	f022                	sd	s0,32(sp)
+    8020a85e:	1800                	addi	s0,sp,48
+    8020a860:	87aa                	mv	a5,a0
+    8020a862:	fcb43823          	sd	a1,-48(s0)
+    8020a866:	8732                	mv	a4,a2
+    8020a868:	fcf42e23          	sw	a5,-36(s0)
+    8020a86c:	87ba                	mv	a5,a4
+    8020a86e:	fcf42c23          	sw	a5,-40(s0)
+  int i;
+
+  acquire(&cons.lock);
+    8020a872:	0001e517          	auipc	a0,0x1e
+    8020a876:	ab650513          	addi	a0,a0,-1354 # 80228328 <cons>
+    8020a87a:	ffff6097          	auipc	ra,0xffff6
+    8020a87e:	16e080e7          	jalr	366(ra) # 802009e8 <acquire>
+  for(i = 0; i < n; i++){
+    8020a882:	fe042623          	sw	zero,-20(s0)
+    8020a886:	a0a1                	j	8020a8ce <consolewrite+0x76>
+    char c;
+    if(either_copyin(&c, user_src, src+i, 1) == -1)
+    8020a888:	fec42703          	lw	a4,-20(s0)
+    8020a88c:	fd043783          	ld	a5,-48(s0)
+    8020a890:	00f70633          	add	a2,a4,a5
+    8020a894:	fdc42703          	lw	a4,-36(s0)
+    8020a898:	feb40793          	addi	a5,s0,-21
+    8020a89c:	4685                	li	a3,1
+    8020a89e:	85ba                	mv	a1,a4
+    8020a8a0:	853e                	mv	a0,a5
+    8020a8a2:	ffff9097          	auipc	ra,0xffff9
+    8020a8a6:	18c080e7          	jalr	396(ra) # 80203a2e <either_copyin>
+    8020a8aa:	87aa                	mv	a5,a0
+    8020a8ac:	873e                	mv	a4,a5
+    8020a8ae:	57fd                	li	a5,-1
+    8020a8b0:	02f70863          	beq	a4,a5,8020a8e0 <consolewrite+0x88>
+      break;
+    sbi_console_putchar(c);
+    8020a8b4:	feb44783          	lbu	a5,-21(s0)
+    8020a8b8:	2781                	sext.w	a5,a5
+    8020a8ba:	853e                	mv	a0,a5
+    8020a8bc:	00000097          	auipc	ra,0x0
+    8020a8c0:	f1c080e7          	jalr	-228(ra) # 8020a7d8 <sbi_console_putchar>
+  for(i = 0; i < n; i++){
+    8020a8c4:	fec42783          	lw	a5,-20(s0)
+    8020a8c8:	2785                	addiw	a5,a5,1
+    8020a8ca:	fef42623          	sw	a5,-20(s0)
+    8020a8ce:	fec42703          	lw	a4,-20(s0)
+    8020a8d2:	fd842783          	lw	a5,-40(s0)
+    8020a8d6:	2701                	sext.w	a4,a4
+    8020a8d8:	2781                	sext.w	a5,a5
+    8020a8da:	faf747e3          	blt	a4,a5,8020a888 <consolewrite+0x30>
+    8020a8de:	a011                	j	8020a8e2 <consolewrite+0x8a>
+      break;
+    8020a8e0:	0001                	nop
+  }
+  release(&cons.lock);
+    8020a8e2:	0001e517          	auipc	a0,0x1e
+    8020a8e6:	a4650513          	addi	a0,a0,-1466 # 80228328 <cons>
+    8020a8ea:	ffff6097          	auipc	ra,0xffff6
+    8020a8ee:	162080e7          	jalr	354(ra) # 80200a4c <release>
+
+  return i;
+    8020a8f2:	fec42783          	lw	a5,-20(s0)
+}
+    8020a8f6:	853e                	mv	a0,a5
+    8020a8f8:	70a2                	ld	ra,40(sp)
+    8020a8fa:	7402                	ld	s0,32(sp)
+    8020a8fc:	6145                	addi	sp,sp,48
+    8020a8fe:	8082                	ret
+
+000000008020a900 <consoleread>:
+// user_dist indicates whether dst is a user
+// or kernel address.
+//
+int
+consoleread(int user_dst, uint64 dst, int n)
+{
+    8020a900:	7179                	addi	sp,sp,-48
+    8020a902:	f406                	sd	ra,40(sp)
+    8020a904:	f022                	sd	s0,32(sp)
+    8020a906:	1800                	addi	s0,sp,48
+    8020a908:	87aa                	mv	a5,a0
+    8020a90a:	fcb43823          	sd	a1,-48(s0)
+    8020a90e:	8732                	mv	a4,a2
+    8020a910:	fcf42e23          	sw	a5,-36(s0)
+    8020a914:	87ba                	mv	a5,a4
+    8020a916:	fcf42c23          	sw	a5,-40(s0)
+  uint target;
+  int c;
+  char cbuf;
+
+  target = n;
+    8020a91a:	fd842783          	lw	a5,-40(s0)
+    8020a91e:	fef42623          	sw	a5,-20(s0)
+  acquire(&cons.lock);
+    8020a922:	0001e517          	auipc	a0,0x1e
+    8020a926:	a0650513          	addi	a0,a0,-1530 # 80228328 <cons>
+    8020a92a:	ffff6097          	auipc	ra,0xffff6
+    8020a92e:	0be080e7          	jalr	190(ra) # 802009e8 <acquire>
+  while(n > 0){
+    8020a932:	a215                	j	8020aa56 <consoleread+0x156>
+    // wait until interrupt handler has put some
+    // input into cons.buffer.
+    while(cons.r == cons.w){
+      if(myproc()->killed){
+    8020a934:	ffff8097          	auipc	ra,0xffff8
+    8020a938:	02e080e7          	jalr	46(ra) # 80202962 <myproc>
+    8020a93c:	87aa                	mv	a5,a0
+    8020a93e:	5b9c                	lw	a5,48(a5)
+    8020a940:	cb99                	beqz	a5,8020a956 <consoleread+0x56>
+        release(&cons.lock);
+    8020a942:	0001e517          	auipc	a0,0x1e
+    8020a946:	9e650513          	addi	a0,a0,-1562 # 80228328 <cons>
+    8020a94a:	ffff6097          	auipc	ra,0xffff6
+    8020a94e:	102080e7          	jalr	258(ra) # 80200a4c <release>
+        return -1;
+    8020a952:	57fd                	li	a5,-1
+    8020a954:	aa25                	j	8020aa8c <consoleread+0x18c>
+      }
+      sleep(&cons.r, &cons.lock);
+    8020a956:	0001e597          	auipc	a1,0x1e
+    8020a95a:	9d258593          	addi	a1,a1,-1582 # 80228328 <cons>
+    8020a95e:	0001e517          	auipc	a0,0x1e
+    8020a962:	a6250513          	addi	a0,a0,-1438 # 802283c0 <cons+0x98>
+    8020a966:	ffff9097          	auipc	ra,0xffff9
+    8020a96a:	e56080e7          	jalr	-426(ra) # 802037bc <sleep>
+    while(cons.r == cons.w){
+    8020a96e:	0001e797          	auipc	a5,0x1e
+    8020a972:	9ba78793          	addi	a5,a5,-1606 # 80228328 <cons>
+    8020a976:	0987a703          	lw	a4,152(a5)
+    8020a97a:	0001e797          	auipc	a5,0x1e
+    8020a97e:	9ae78793          	addi	a5,a5,-1618 # 80228328 <cons>
+    8020a982:	09c7a783          	lw	a5,156(a5)
+    8020a986:	faf707e3          	beq	a4,a5,8020a934 <consoleread+0x34>
+    }
+
+    c = cons.buf[cons.r++ % INPUT_BUF];
+    8020a98a:	0001e797          	auipc	a5,0x1e
+    8020a98e:	99e78793          	addi	a5,a5,-1634 # 80228328 <cons>
+    8020a992:	0987a783          	lw	a5,152(a5)
+    8020a996:	2781                	sext.w	a5,a5
+    8020a998:	0017871b          	addiw	a4,a5,1
+    8020a99c:	0007069b          	sext.w	a3,a4
+    8020a9a0:	0001e717          	auipc	a4,0x1e
+    8020a9a4:	98870713          	addi	a4,a4,-1656 # 80228328 <cons>
+    8020a9a8:	08d72c23          	sw	a3,152(a4)
+    8020a9ac:	07f7f793          	andi	a5,a5,127
+    8020a9b0:	2781                	sext.w	a5,a5
+    8020a9b2:	0001e717          	auipc	a4,0x1e
+    8020a9b6:	97670713          	addi	a4,a4,-1674 # 80228328 <cons>
+    8020a9ba:	1782                	slli	a5,a5,0x20
+    8020a9bc:	9381                	srli	a5,a5,0x20
+    8020a9be:	97ba                	add	a5,a5,a4
+    8020a9c0:	0187c783          	lbu	a5,24(a5)
+    8020a9c4:	fef42423          	sw	a5,-24(s0)
+
+    if(c == C('D')){  // end-of-file
+    8020a9c8:	fe842783          	lw	a5,-24(s0)
+    8020a9cc:	0007871b          	sext.w	a4,a5
+    8020a9d0:	4791                	li	a5,4
+    8020a9d2:	02f71963          	bne	a4,a5,8020aa04 <consoleread+0x104>
+      if(n < target){
+    8020a9d6:	fd842703          	lw	a4,-40(s0)
+    8020a9da:	fec42783          	lw	a5,-20(s0)
+    8020a9de:	2781                	sext.w	a5,a5
+    8020a9e0:	08f77163          	bgeu	a4,a5,8020aa62 <consoleread+0x162>
+        // Save ^D for next time, to make sure
+        // caller gets a 0-byte result.
+        cons.r--;
+    8020a9e4:	0001e797          	auipc	a5,0x1e
+    8020a9e8:	94478793          	addi	a5,a5,-1724 # 80228328 <cons>
+    8020a9ec:	0987a783          	lw	a5,152(a5)
+    8020a9f0:	37fd                	addiw	a5,a5,-1
+    8020a9f2:	0007871b          	sext.w	a4,a5
+    8020a9f6:	0001e797          	auipc	a5,0x1e
+    8020a9fa:	93278793          	addi	a5,a5,-1742 # 80228328 <cons>
+    8020a9fe:	08e7ac23          	sw	a4,152(a5)
+      }
+      break;
+    8020aa02:	a085                	j	8020aa62 <consoleread+0x162>
+    }
+
+    // copy the input byte to the user-space buffer.
+    cbuf = c;
+    8020aa04:	fe842783          	lw	a5,-24(s0)
+    8020aa08:	0ff7f793          	andi	a5,a5,255
+    8020aa0c:	fef403a3          	sb	a5,-25(s0)
+    if(either_copyout(user_dst, dst, &cbuf, 1) == -1)
+    8020aa10:	fe740713          	addi	a4,s0,-25
+    8020aa14:	fdc42783          	lw	a5,-36(s0)
+    8020aa18:	4685                	li	a3,1
+    8020aa1a:	863a                	mv	a2,a4
+    8020aa1c:	fd043583          	ld	a1,-48(s0)
+    8020aa20:	853e                	mv	a0,a5
+    8020aa22:	ffff9097          	auipc	ra,0xffff9
+    8020aa26:	fac080e7          	jalr	-84(ra) # 802039ce <either_copyout>
+    8020aa2a:	87aa                	mv	a5,a0
+    8020aa2c:	873e                	mv	a4,a5
+    8020aa2e:	57fd                	li	a5,-1
+    8020aa30:	02f70b63          	beq	a4,a5,8020aa66 <consoleread+0x166>
+      break;
+
+    dst++;
+    8020aa34:	fd043783          	ld	a5,-48(s0)
+    8020aa38:	0785                	addi	a5,a5,1
+    8020aa3a:	fcf43823          	sd	a5,-48(s0)
+    --n;
+    8020aa3e:	fd842783          	lw	a5,-40(s0)
+    8020aa42:	37fd                	addiw	a5,a5,-1
+    8020aa44:	fcf42c23          	sw	a5,-40(s0)
+
+    if(c == '\n'){
+    8020aa48:	fe842783          	lw	a5,-24(s0)
+    8020aa4c:	0007871b          	sext.w	a4,a5
+    8020aa50:	47a9                	li	a5,10
+    8020aa52:	00f70c63          	beq	a4,a5,8020aa6a <consoleread+0x16a>
+  while(n > 0){
+    8020aa56:	fd842783          	lw	a5,-40(s0)
+    8020aa5a:	2781                	sext.w	a5,a5
+    8020aa5c:	f0f049e3          	bgtz	a5,8020a96e <consoleread+0x6e>
+    8020aa60:	a031                	j	8020aa6c <consoleread+0x16c>
+      break;
+    8020aa62:	0001                	nop
+    8020aa64:	a021                	j	8020aa6c <consoleread+0x16c>
+      break;
+    8020aa66:	0001                	nop
+    8020aa68:	a011                	j	8020aa6c <consoleread+0x16c>
+      // a whole line has arrived, return to
+      // the user-level read().
+      break;
+    8020aa6a:	0001                	nop
+    }
+  }
+  release(&cons.lock);
+    8020aa6c:	0001e517          	auipc	a0,0x1e
+    8020aa70:	8bc50513          	addi	a0,a0,-1860 # 80228328 <cons>
+    8020aa74:	ffff6097          	auipc	ra,0xffff6
+    8020aa78:	fd8080e7          	jalr	-40(ra) # 80200a4c <release>
+
+  return target - n;
+    8020aa7c:	fd842783          	lw	a5,-40(s0)
+    8020aa80:	fec42703          	lw	a4,-20(s0)
+    8020aa84:	40f707bb          	subw	a5,a4,a5
+    8020aa88:	2781                	sext.w	a5,a5
+    8020aa8a:	2781                	sext.w	a5,a5
+}
+    8020aa8c:	853e                	mv	a0,a5
+    8020aa8e:	70a2                	ld	ra,40(sp)
+    8020aa90:	7402                	ld	s0,32(sp)
+    8020aa92:	6145                	addi	sp,sp,48
+    8020aa94:	8082                	ret
+
+000000008020aa96 <consoleintr>:
+// do erase/kill processing, append to cons.buf,
+// wake up consoleread() if a whole line has arrived.
+//
+void
+consoleintr(int c)
+{
+    8020aa96:	1101                	addi	sp,sp,-32
+    8020aa98:	ec06                	sd	ra,24(sp)
+    8020aa9a:	e822                	sd	s0,16(sp)
+    8020aa9c:	1000                	addi	s0,sp,32
+    8020aa9e:	87aa                	mv	a5,a0
+    8020aaa0:	fef42623          	sw	a5,-20(s0)
+  acquire(&cons.lock);
+    8020aaa4:	0001e517          	auipc	a0,0x1e
+    8020aaa8:	88450513          	addi	a0,a0,-1916 # 80228328 <cons>
+    8020aaac:	ffff6097          	auipc	ra,0xffff6
+    8020aab0:	f3c080e7          	jalr	-196(ra) # 802009e8 <acquire>
+
+  switch(c){
+    8020aab4:	fec42783          	lw	a5,-20(s0)
+    8020aab8:	0007871b          	sext.w	a4,a5
+    8020aabc:	07f00793          	li	a5,127
+    8020aac0:	0cf70763          	beq	a4,a5,8020ab8e <consoleintr+0xf8>
+    8020aac4:	fec42783          	lw	a5,-20(s0)
+    8020aac8:	0007871b          	sext.w	a4,a5
+    8020aacc:	07f00793          	li	a5,127
+    8020aad0:	10e7c363          	blt	a5,a4,8020abd6 <consoleintr+0x140>
+    8020aad4:	fec42783          	lw	a5,-20(s0)
+    8020aad8:	0007871b          	sext.w	a4,a5
+    8020aadc:	47d5                	li	a5,21
+    8020aade:	06f70163          	beq	a4,a5,8020ab40 <consoleintr+0xaa>
+    8020aae2:	fec42783          	lw	a5,-20(s0)
+    8020aae6:	0007871b          	sext.w	a4,a5
+    8020aaea:	47d5                	li	a5,21
+    8020aaec:	0ee7c563          	blt	a5,a4,8020abd6 <consoleintr+0x140>
+    8020aaf0:	fec42783          	lw	a5,-20(s0)
+    8020aaf4:	0007871b          	sext.w	a4,a5
+    8020aaf8:	47a1                	li	a5,8
+    8020aafa:	08f70a63          	beq	a4,a5,8020ab8e <consoleintr+0xf8>
+    8020aafe:	fec42783          	lw	a5,-20(s0)
+    8020ab02:	0007871b          	sext.w	a4,a5
+    8020ab06:	47c1                	li	a5,16
+    8020ab08:	0cf71763          	bne	a4,a5,8020abd6 <consoleintr+0x140>
+  case C('P'):  // Print process list.
+    procdump();
+    8020ab0c:	ffff9097          	auipc	ra,0xffff9
+    8020ab10:	f82080e7          	jalr	-126(ra) # 80203a8e <procdump>
+    break;
+    8020ab14:	aac1                	j	8020ace4 <consoleintr+0x24e>
+  case C('U'):  // Kill line.
+    while(cons.e != cons.w &&
+          cons.buf[(cons.e-1) % INPUT_BUF] != '\n'){
+      cons.e--;
+    8020ab16:	0001e797          	auipc	a5,0x1e
+    8020ab1a:	81278793          	addi	a5,a5,-2030 # 80228328 <cons>
+    8020ab1e:	0a07a783          	lw	a5,160(a5)
+    8020ab22:	37fd                	addiw	a5,a5,-1
+    8020ab24:	0007871b          	sext.w	a4,a5
+    8020ab28:	0001e797          	auipc	a5,0x1e
+    8020ab2c:	80078793          	addi	a5,a5,-2048 # 80228328 <cons>
+    8020ab30:	0ae7a023          	sw	a4,160(a5)
+      consputc(BACKSPACE);
+    8020ab34:	10000513          	li	a0,256
+    8020ab38:	00000097          	auipc	ra,0x0
+    8020ab3c:	cc8080e7          	jalr	-824(ra) # 8020a800 <consputc>
+    while(cons.e != cons.w &&
+    8020ab40:	0001d797          	auipc	a5,0x1d
+    8020ab44:	7e878793          	addi	a5,a5,2024 # 80228328 <cons>
+    8020ab48:	0a07a703          	lw	a4,160(a5)
+    8020ab4c:	0001d797          	auipc	a5,0x1d
+    8020ab50:	7dc78793          	addi	a5,a5,2012 # 80228328 <cons>
+    8020ab54:	09c7a783          	lw	a5,156(a5)
+    8020ab58:	18f70163          	beq	a4,a5,8020acda <consoleintr+0x244>
+          cons.buf[(cons.e-1) % INPUT_BUF] != '\n'){
+    8020ab5c:	0001d797          	auipc	a5,0x1d
+    8020ab60:	7cc78793          	addi	a5,a5,1996 # 80228328 <cons>
+    8020ab64:	0a07a783          	lw	a5,160(a5)
+    8020ab68:	37fd                	addiw	a5,a5,-1
+    8020ab6a:	2781                	sext.w	a5,a5
+    8020ab6c:	07f7f793          	andi	a5,a5,127
+    8020ab70:	2781                	sext.w	a5,a5
+    8020ab72:	0001d717          	auipc	a4,0x1d
+    8020ab76:	7b670713          	addi	a4,a4,1974 # 80228328 <cons>
+    8020ab7a:	1782                	slli	a5,a5,0x20
+    8020ab7c:	9381                	srli	a5,a5,0x20
+    8020ab7e:	97ba                	add	a5,a5,a4
+    8020ab80:	0187c783          	lbu	a5,24(a5)
+    while(cons.e != cons.w &&
+    8020ab84:	873e                	mv	a4,a5
+    8020ab86:	47a9                	li	a5,10
+    8020ab88:	f8f717e3          	bne	a4,a5,8020ab16 <consoleintr+0x80>
+    }
+    break;
+    8020ab8c:	a2b9                	j	8020acda <consoleintr+0x244>
+  case C('H'): // Backspace
+  case '\x7f':
+    if(cons.e != cons.w){
+    8020ab8e:	0001d797          	auipc	a5,0x1d
+    8020ab92:	79a78793          	addi	a5,a5,1946 # 80228328 <cons>
+    8020ab96:	0a07a703          	lw	a4,160(a5)
+    8020ab9a:	0001d797          	auipc	a5,0x1d
+    8020ab9e:	78e78793          	addi	a5,a5,1934 # 80228328 <cons>
+    8020aba2:	09c7a783          	lw	a5,156(a5)
+    8020aba6:	12f70c63          	beq	a4,a5,8020acde <consoleintr+0x248>
+      cons.e--;
+    8020abaa:	0001d797          	auipc	a5,0x1d
+    8020abae:	77e78793          	addi	a5,a5,1918 # 80228328 <cons>
+    8020abb2:	0a07a783          	lw	a5,160(a5)
+    8020abb6:	37fd                	addiw	a5,a5,-1
+    8020abb8:	0007871b          	sext.w	a4,a5
+    8020abbc:	0001d797          	auipc	a5,0x1d
+    8020abc0:	76c78793          	addi	a5,a5,1900 # 80228328 <cons>
+    8020abc4:	0ae7a023          	sw	a4,160(a5)
+      consputc(BACKSPACE);
+    8020abc8:	10000513          	li	a0,256
+    8020abcc:	00000097          	auipc	ra,0x0
+    8020abd0:	c34080e7          	jalr	-972(ra) # 8020a800 <consputc>
+    }
+    break;
+    8020abd4:	a229                	j	8020acde <consoleintr+0x248>
+  default:
+    if(c != 0 && cons.e-cons.r < INPUT_BUF){
+    8020abd6:	fec42783          	lw	a5,-20(s0)
+    8020abda:	2781                	sext.w	a5,a5
+    8020abdc:	10078363          	beqz	a5,8020ace2 <consoleintr+0x24c>
+    8020abe0:	0001d797          	auipc	a5,0x1d
+    8020abe4:	74878793          	addi	a5,a5,1864 # 80228328 <cons>
+    8020abe8:	0a07a703          	lw	a4,160(a5)
+    8020abec:	0001d797          	auipc	a5,0x1d
+    8020abf0:	73c78793          	addi	a5,a5,1852 # 80228328 <cons>
+    8020abf4:	0987a783          	lw	a5,152(a5)
+    8020abf8:	40f707bb          	subw	a5,a4,a5
+    8020abfc:	2781                	sext.w	a5,a5
+    8020abfe:	873e                	mv	a4,a5
+    8020ac00:	07f00793          	li	a5,127
+    8020ac04:	0ce7ef63          	bltu	a5,a4,8020ace2 <consoleintr+0x24c>
+      #ifndef QEMU
+      if (c == '\r') break;     // on k210, "enter" will input \n and \r
+      #else
+      c = (c == '\r') ? '\n' : c;
+    8020ac08:	fec42783          	lw	a5,-20(s0)
+    8020ac0c:	0007871b          	sext.w	a4,a5
+    8020ac10:	47b5                	li	a5,13
+    8020ac12:	00f70563          	beq	a4,a5,8020ac1c <consoleintr+0x186>
+    8020ac16:	fec42783          	lw	a5,-20(s0)
+    8020ac1a:	a011                	j	8020ac1e <consoleintr+0x188>
+    8020ac1c:	47a9                	li	a5,10
+    8020ac1e:	fef42623          	sw	a5,-20(s0)
+      #endif
+      // echo back to the user.
+      consputc(c);
+    8020ac22:	fec42783          	lw	a5,-20(s0)
+    8020ac26:	853e                	mv	a0,a5
+    8020ac28:	00000097          	auipc	ra,0x0
+    8020ac2c:	bd8080e7          	jalr	-1064(ra) # 8020a800 <consputc>
+
+      // store for consumption by consoleread().
+      cons.buf[cons.e++ % INPUT_BUF] = c;
+    8020ac30:	0001d797          	auipc	a5,0x1d
+    8020ac34:	6f878793          	addi	a5,a5,1784 # 80228328 <cons>
+    8020ac38:	0a07a783          	lw	a5,160(a5)
+    8020ac3c:	2781                	sext.w	a5,a5
+    8020ac3e:	0017871b          	addiw	a4,a5,1
+    8020ac42:	0007069b          	sext.w	a3,a4
+    8020ac46:	0001d717          	auipc	a4,0x1d
+    8020ac4a:	6e270713          	addi	a4,a4,1762 # 80228328 <cons>
+    8020ac4e:	0ad72023          	sw	a3,160(a4)
+    8020ac52:	07f7f793          	andi	a5,a5,127
+    8020ac56:	2781                	sext.w	a5,a5
+    8020ac58:	fec42703          	lw	a4,-20(s0)
+    8020ac5c:	0ff77713          	andi	a4,a4,255
+    8020ac60:	0001d697          	auipc	a3,0x1d
+    8020ac64:	6c868693          	addi	a3,a3,1736 # 80228328 <cons>
+    8020ac68:	1782                	slli	a5,a5,0x20
+    8020ac6a:	9381                	srli	a5,a5,0x20
+    8020ac6c:	97b6                	add	a5,a5,a3
+    8020ac6e:	00e78c23          	sb	a4,24(a5)
+
+      if(c == '\n' || c == C('D') || cons.e == cons.r+INPUT_BUF){
+    8020ac72:	fec42783          	lw	a5,-20(s0)
+    8020ac76:	0007871b          	sext.w	a4,a5
+    8020ac7a:	47a9                	li	a5,10
+    8020ac7c:	02f70a63          	beq	a4,a5,8020acb0 <consoleintr+0x21a>
+    8020ac80:	fec42783          	lw	a5,-20(s0)
+    8020ac84:	0007871b          	sext.w	a4,a5
+    8020ac88:	4791                	li	a5,4
+    8020ac8a:	02f70363          	beq	a4,a5,8020acb0 <consoleintr+0x21a>
+    8020ac8e:	0001d797          	auipc	a5,0x1d
+    8020ac92:	69a78793          	addi	a5,a5,1690 # 80228328 <cons>
+    8020ac96:	0a07a703          	lw	a4,160(a5)
+    8020ac9a:	0001d797          	auipc	a5,0x1d
+    8020ac9e:	68e78793          	addi	a5,a5,1678 # 80228328 <cons>
+    8020aca2:	0987a783          	lw	a5,152(a5)
+    8020aca6:	0807879b          	addiw	a5,a5,128
+    8020acaa:	2781                	sext.w	a5,a5
+    8020acac:	02f71b63          	bne	a4,a5,8020ace2 <consoleintr+0x24c>
+        // wake up consoleread() if a whole line (or end-of-file)
+        // has arrived.
+        cons.w = cons.e;
+    8020acb0:	0001d797          	auipc	a5,0x1d
+    8020acb4:	67878793          	addi	a5,a5,1656 # 80228328 <cons>
+    8020acb8:	0a07a703          	lw	a4,160(a5)
+    8020acbc:	0001d797          	auipc	a5,0x1d
+    8020acc0:	66c78793          	addi	a5,a5,1644 # 80228328 <cons>
+    8020acc4:	08e7ae23          	sw	a4,156(a5)
+        wakeup(&cons.r);
+    8020acc8:	0001d517          	auipc	a0,0x1d
+    8020accc:	6f850513          	addi	a0,a0,1784 # 802283c0 <cons+0x98>
+    8020acd0:	ffff9097          	auipc	ra,0xffff9
+    8020acd4:	b80080e7          	jalr	-1152(ra) # 80203850 <wakeup>
+      }
+    }
+    break;
+    8020acd8:	a029                	j	8020ace2 <consoleintr+0x24c>
+    break;
+    8020acda:	0001                	nop
+    8020acdc:	a021                	j	8020ace4 <consoleintr+0x24e>
+    break;
+    8020acde:	0001                	nop
+    8020ace0:	a011                	j	8020ace4 <consoleintr+0x24e>
+    break;
+    8020ace2:	0001                	nop
+  }
+  
+  release(&cons.lock);
+    8020ace4:	0001d517          	auipc	a0,0x1d
+    8020ace8:	64450513          	addi	a0,a0,1604 # 80228328 <cons>
+    8020acec:	ffff6097          	auipc	ra,0xffff6
+    8020acf0:	d60080e7          	jalr	-672(ra) # 80200a4c <release>
+}
+    8020acf4:	0001                	nop
+    8020acf6:	60e2                	ld	ra,24(sp)
+    8020acf8:	6442                	ld	s0,16(sp)
+    8020acfa:	6105                	addi	sp,sp,32
+    8020acfc:	8082                	ret
+
+000000008020acfe <consoleinit>:
+
+void
+consoleinit(void)
+{
+    8020acfe:	1141                	addi	sp,sp,-16
+    8020ad00:	e406                	sd	ra,8(sp)
+    8020ad02:	e022                	sd	s0,0(sp)
+    8020ad04:	0800                	addi	s0,sp,16
+  initlock(&cons.lock, "cons");
+    8020ad06:	00003597          	auipc	a1,0x3
+    8020ad0a:	26a58593          	addi	a1,a1,618 # 8020df70 <etext+0xf70>
+    8020ad0e:	0001d517          	auipc	a0,0x1d
+    8020ad12:	61a50513          	addi	a0,a0,1562 # 80228328 <cons>
+    8020ad16:	ffff6097          	auipc	ra,0xffff6
+    8020ad1a:	ca2080e7          	jalr	-862(ra) # 802009b8 <initlock>
+  uartinit();
+    8020ad1e:	00001097          	auipc	ra,0x1
+    8020ad22:	ab4080e7          	jalr	-1356(ra) # 8020b7d2 <uartinit>
+  cons.e = cons.w = cons.r = 0;
+    8020ad26:	0001d797          	auipc	a5,0x1d
+    8020ad2a:	60278793          	addi	a5,a5,1538 # 80228328 <cons>
+    8020ad2e:	0807ac23          	sw	zero,152(a5)
+    8020ad32:	0001d797          	auipc	a5,0x1d
+    8020ad36:	5f678793          	addi	a5,a5,1526 # 80228328 <cons>
+    8020ad3a:	0987a703          	lw	a4,152(a5)
+    8020ad3e:	0001d797          	auipc	a5,0x1d
+    8020ad42:	5ea78793          	addi	a5,a5,1514 # 80228328 <cons>
+    8020ad46:	08e7ae23          	sw	a4,156(a5)
+    8020ad4a:	0001d797          	auipc	a5,0x1d
+    8020ad4e:	5de78793          	addi	a5,a5,1502 # 80228328 <cons>
+    8020ad52:	09c7a703          	lw	a4,156(a5)
+    8020ad56:	0001d797          	auipc	a5,0x1d
+    8020ad5a:	5d278793          	addi	a5,a5,1490 # 80228328 <cons>
+    8020ad5e:	0ae7a023          	sw	a4,160(a5)
+  // connect read and write system calls
+  // to consoleread and consolewrite.
+  devsw[CONSOLE].read = consoleread;
+    8020ad62:	00005797          	auipc	a5,0x5
+    8020ad66:	79e7b783          	ld	a5,1950(a5) # 80210500 <_GLOBAL_OFFSET_TABLE_+0x78>
+    8020ad6a:	00000717          	auipc	a4,0x0
+    8020ad6e:	b9670713          	addi	a4,a4,-1130 # 8020a900 <consoleread>
+    8020ad72:	eb98                	sd	a4,16(a5)
+  devsw[CONSOLE].write = consolewrite;
+    8020ad74:	00005797          	auipc	a5,0x5
+    8020ad78:	78c7b783          	ld	a5,1932(a5) # 80210500 <_GLOBAL_OFFSET_TABLE_+0x78>
+    8020ad7c:	00000717          	auipc	a4,0x0
+    8020ad80:	adc70713          	addi	a4,a4,-1316 # 8020a858 <consolewrite>
+    8020ad84:	ef98                	sd	a4,24(a5)
+}
+    8020ad86:	0001                	nop
+    8020ad88:	60a2                	ld	ra,8(sp)
+    8020ad8a:	6402                	ld	s0,0(sp)
+    8020ad8c:	0141                	addi	sp,sp,16
+    8020ad8e:	8082                	ret
+
+000000008020ad90 <sfence_vma>:
+{
+    8020ad90:	1141                	addi	sp,sp,-16
+    8020ad92:	e422                	sd	s0,8(sp)
+    8020ad94:	0800                	addi	s0,sp,16
+  asm volatile("sfence.vma");
+    8020ad96:	12000073          	sfence.vma
+}
+    8020ad9a:	0001                	nop
+    8020ad9c:	6422                	ld	s0,8(sp)
+    8020ad9e:	0141                	addi	sp,sp,16
+    8020ada0:	8082                	ret
+
+000000008020ada2 <do_uname>:
+#include "include/printf.h"
+#include "include/fat32.h"
+#include "include/vm.h"
+
+
+int do_uname(uint64 addr){
+    8020ada2:	7179                	addi	sp,sp,-48
+    8020ada4:	f406                	sd	ra,40(sp)
+    8020ada6:	f022                	sd	s0,32(sp)
+    8020ada8:	1800                	addi	s0,sp,48
+    8020adaa:	fca43c23          	sd	a0,-40(s0)
+    static struct utsname thisname = {                //给utsname结构体赋值
+		"sysname=WheelOS","nodename=九转车轮","release=未发布","version=0.1","machine=riscv64"
+	};
+    char *name = (char *)addr;   //通过强制类型转换获取测试用例中的结构体
+    8020adae:	fd843783          	ld	a5,-40(s0)
+    8020adb2:	fef43023          	sd	a5,-32(s0)
+    if(name==0){
+    8020adb6:	fe043783          	ld	a5,-32(s0)
+    8020adba:	e399                	bnez	a5,8020adc0 <do_uname+0x1e>
+        return -1;
+    8020adbc:	57fd                	li	a5,-1
+    8020adbe:	a0a9                	j	8020ae08 <do_uname+0x66>
+    }
+    for(int i=0;i<sizeof(struct utsname);++i){
+    8020adc0:	fe042623          	sw	zero,-20(s0)
+    8020adc4:	a035                	j	8020adf0 <do_uname+0x4e>
+       name[i]=((char *)&thisname)[i];  //把值传递给测算用例中的结构体。
+    8020adc6:	fec42703          	lw	a4,-20(s0)
+    8020adca:	00005797          	auipc	a5,0x5
+    8020adce:	2e678793          	addi	a5,a5,742 # 802100b0 <thisname.1321>
+    8020add2:	973e                	add	a4,a4,a5
+    8020add4:	fec42783          	lw	a5,-20(s0)
+    8020add8:	fe043683          	ld	a3,-32(s0)
+    8020addc:	97b6                	add	a5,a5,a3
+    8020adde:	00074703          	lbu	a4,0(a4)
+    8020ade2:	00e78023          	sb	a4,0(a5)
+    for(int i=0;i<sizeof(struct utsname);++i){
+    8020ade6:	fec42783          	lw	a5,-20(s0)
+    8020adea:	2785                	addiw	a5,a5,1
+    8020adec:	fef42623          	sw	a5,-20(s0)
+    8020adf0:	fec42783          	lw	a5,-20(s0)
+    8020adf4:	873e                	mv	a4,a5
+    8020adf6:	18500793          	li	a5,389
+    8020adfa:	fce7f6e3          	bgeu	a5,a4,8020adc6 <do_uname+0x24>
+   }
+   sfence_vma();
+    8020adfe:	00000097          	auipc	ra,0x0
+    8020ae02:	f92080e7          	jalr	-110(ra) # 8020ad90 <sfence_vma>
+   return 0;
+    8020ae06:	4781                	li	a5,0
+}
+    8020ae08:	853e                	mv	a0,a5
+    8020ae0a:	70a2                	ld	ra,40(sp)
+    8020ae0c:	7402                	ld	s0,32(sp)
+    8020ae0e:	6145                	addi	sp,sp,48
+    8020ae10:	8082                	ret
+
+000000008020ae12 <virtio_disk_init>:
+  
+} __attribute__ ((aligned (PGSIZE))) disk;
+
+void
+virtio_disk_init(void)
+{
+    8020ae12:	7179                	addi	sp,sp,-48
+    8020ae14:	f406                	sd	ra,40(sp)
+    8020ae16:	f022                	sd	s0,32(sp)
+    8020ae18:	1800                	addi	s0,sp,48
+  uint32 status = 0;
+    8020ae1a:	fe042423          	sw	zero,-24(s0)
+
+  initlock(&disk.vdisk_lock, "virtio_disk");
+    8020ae1e:	00003597          	auipc	a1,0x3
+    8020ae22:	15a58593          	addi	a1,a1,346 # 8020df78 <etext+0xf78>
+    8020ae26:	00020517          	auipc	a0,0x20
+    8020ae2a:	28250513          	addi	a0,a0,642 # 8022b0a8 <disk+0x20a8>
+    8020ae2e:	ffff6097          	auipc	ra,0xffff6
+    8020ae32:	b8a080e7          	jalr	-1142(ra) # 802009b8 <initlock>
+
+  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
+    8020ae36:	03f107b7          	lui	a5,0x3f10
+    8020ae3a:	0785                	addi	a5,a5,1
+    8020ae3c:	07b2                	slli	a5,a5,0xc
+    8020ae3e:	439c                	lw	a5,0(a5)
+    8020ae40:	2781                	sext.w	a5,a5
+    8020ae42:	873e                	mv	a4,a5
+    8020ae44:	747277b7          	lui	a5,0x74727
+    8020ae48:	97678793          	addi	a5,a5,-1674 # 74726976 <_entry-0xbad968a>
+    8020ae4c:	04f71663          	bne	a4,a5,8020ae98 <virtio_disk_init+0x86>
+     *R(VIRTIO_MMIO_VERSION) != 1 ||
+    8020ae50:	00003797          	auipc	a5,0x3
+    8020ae54:	1f878793          	addi	a5,a5,504 # 8020e048 <etext+0x1048>
+    8020ae58:	639c                	ld	a5,0(a5)
+    8020ae5a:	439c                	lw	a5,0(a5)
+    8020ae5c:	2781                	sext.w	a5,a5
+  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
+    8020ae5e:	873e                	mv	a4,a5
+    8020ae60:	4785                	li	a5,1
+    8020ae62:	02f71b63          	bne	a4,a5,8020ae98 <virtio_disk_init+0x86>
+     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
+    8020ae66:	00003797          	auipc	a5,0x3
+    8020ae6a:	1ea78793          	addi	a5,a5,490 # 8020e050 <etext+0x1050>
+    8020ae6e:	639c                	ld	a5,0(a5)
+    8020ae70:	439c                	lw	a5,0(a5)
+    8020ae72:	2781                	sext.w	a5,a5
+     *R(VIRTIO_MMIO_VERSION) != 1 ||
+    8020ae74:	873e                	mv	a4,a5
+    8020ae76:	4789                	li	a5,2
+    8020ae78:	02f71063          	bne	a4,a5,8020ae98 <virtio_disk_init+0x86>
+     *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){
+    8020ae7c:	00003797          	auipc	a5,0x3
+    8020ae80:	1dc78793          	addi	a5,a5,476 # 8020e058 <etext+0x1058>
+    8020ae84:	639c                	ld	a5,0(a5)
+    8020ae86:	439c                	lw	a5,0(a5)
+    8020ae88:	2781                	sext.w	a5,a5
+     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
+    8020ae8a:	873e                	mv	a4,a5
+    8020ae8c:	554d47b7          	lui	a5,0x554d4
+    8020ae90:	55178793          	addi	a5,a5,1361 # 554d4551 <_entry-0x2ad2baaf>
+    8020ae94:	00f70a63          	beq	a4,a5,8020aea8 <virtio_disk_init+0x96>
+    panic("could not find virtio disk");
+    8020ae98:	00003517          	auipc	a0,0x3
+    8020ae9c:	0f050513          	addi	a0,a0,240 # 8020df88 <etext+0xf88>
+    8020aea0:	ffff5097          	auipc	ra,0xffff5
+    8020aea4:	5a4080e7          	jalr	1444(ra) # 80200444 <panic>
+  }
+  
+  status |= VIRTIO_CONFIG_S_ACKNOWLEDGE;
+    8020aea8:	fe842783          	lw	a5,-24(s0)
+    8020aeac:	0017e793          	ori	a5,a5,1
+    8020aeb0:	fef42423          	sw	a5,-24(s0)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    8020aeb4:	00003797          	auipc	a5,0x3
+    8020aeb8:	1ac78793          	addi	a5,a5,428 # 8020e060 <etext+0x1060>
+    8020aebc:	639c                	ld	a5,0(a5)
+    8020aebe:	fe842703          	lw	a4,-24(s0)
+    8020aec2:	c398                	sw	a4,0(a5)
+
+  status |= VIRTIO_CONFIG_S_DRIVER;
+    8020aec4:	fe842783          	lw	a5,-24(s0)
+    8020aec8:	0027e793          	ori	a5,a5,2
+    8020aecc:	fef42423          	sw	a5,-24(s0)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    8020aed0:	00003797          	auipc	a5,0x3
+    8020aed4:	19078793          	addi	a5,a5,400 # 8020e060 <etext+0x1060>
+    8020aed8:	639c                	ld	a5,0(a5)
+    8020aeda:	fe842703          	lw	a4,-24(s0)
+    8020aede:	c398                	sw	a4,0(a5)
+
+  // negotiate features
+  uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES);
+    8020aee0:	00003797          	auipc	a5,0x3
+    8020aee4:	18878793          	addi	a5,a5,392 # 8020e068 <etext+0x1068>
+    8020aee8:	639c                	ld	a5,0(a5)
+    8020aeea:	439c                	lw	a5,0(a5)
+    8020aeec:	2781                	sext.w	a5,a5
+    8020aeee:	1782                	slli	a5,a5,0x20
+    8020aef0:	9381                	srli	a5,a5,0x20
+    8020aef2:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_BLK_F_RO);
+    8020aef6:	fe043783          	ld	a5,-32(s0)
+    8020aefa:	fdf7f793          	andi	a5,a5,-33
+    8020aefe:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_BLK_F_SCSI);
+    8020af02:	fe043783          	ld	a5,-32(s0)
+    8020af06:	f7f7f793          	andi	a5,a5,-129
+    8020af0a:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_BLK_F_CONFIG_WCE);
+    8020af0e:	fe043703          	ld	a4,-32(s0)
+    8020af12:	77fd                	lui	a5,0xfffff
+    8020af14:	7ff78793          	addi	a5,a5,2047 # fffffffffffff7ff <kernel_end+0xffffffff7fdd27ff>
+    8020af18:	8ff9                	and	a5,a5,a4
+    8020af1a:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_BLK_F_MQ);
+    8020af1e:	fe043703          	ld	a4,-32(s0)
+    8020af22:	77fd                	lui	a5,0xfffff
+    8020af24:	17fd                	addi	a5,a5,-1
+    8020af26:	8ff9                	and	a5,a5,a4
+    8020af28:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_F_ANY_LAYOUT);
+    8020af2c:	fe043703          	ld	a4,-32(s0)
+    8020af30:	f80007b7          	lui	a5,0xf8000
+    8020af34:	17fd                	addi	a5,a5,-1
+    8020af36:	8ff9                	and	a5,a5,a4
+    8020af38:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_RING_F_EVENT_IDX);
+    8020af3c:	fe043703          	ld	a4,-32(s0)
+    8020af40:	e00007b7          	lui	a5,0xe0000
+    8020af44:	17fd                	addi	a5,a5,-1
+    8020af46:	8ff9                	and	a5,a5,a4
+    8020af48:	fef43023          	sd	a5,-32(s0)
+  features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC);
+    8020af4c:	fe043703          	ld	a4,-32(s0)
+    8020af50:	f00007b7          	lui	a5,0xf0000
+    8020af54:	17fd                	addi	a5,a5,-1
+    8020af56:	8ff9                	and	a5,a5,a4
+    8020af58:	fef43023          	sd	a5,-32(s0)
+  *R(VIRTIO_MMIO_DRIVER_FEATURES) = features;
+    8020af5c:	00003797          	auipc	a5,0x3
+    8020af60:	11478793          	addi	a5,a5,276 # 8020e070 <etext+0x1070>
+    8020af64:	639c                	ld	a5,0(a5)
+    8020af66:	fe043703          	ld	a4,-32(s0)
+    8020af6a:	2701                	sext.w	a4,a4
+    8020af6c:	c398                	sw	a4,0(a5)
+
+  // tell device that feature negotiation is complete.
+  status |= VIRTIO_CONFIG_S_FEATURES_OK;
+    8020af6e:	fe842783          	lw	a5,-24(s0)
+    8020af72:	0087e793          	ori	a5,a5,8
+    8020af76:	fef42423          	sw	a5,-24(s0)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    8020af7a:	00003797          	auipc	a5,0x3
+    8020af7e:	0e678793          	addi	a5,a5,230 # 8020e060 <etext+0x1060>
+    8020af82:	639c                	ld	a5,0(a5)
+    8020af84:	fe842703          	lw	a4,-24(s0)
+    8020af88:	c398                	sw	a4,0(a5)
+
+  // tell device we're completely ready.
+  status |= VIRTIO_CONFIG_S_DRIVER_OK;
+    8020af8a:	fe842783          	lw	a5,-24(s0)
+    8020af8e:	0047e793          	ori	a5,a5,4
+    8020af92:	fef42423          	sw	a5,-24(s0)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    8020af96:	00003797          	auipc	a5,0x3
+    8020af9a:	0ca78793          	addi	a5,a5,202 # 8020e060 <etext+0x1060>
+    8020af9e:	639c                	ld	a5,0(a5)
+    8020afa0:	fe842703          	lw	a4,-24(s0)
+    8020afa4:	c398                	sw	a4,0(a5)
+
+  *R(VIRTIO_MMIO_GUEST_PAGE_SIZE) = PGSIZE;
+    8020afa6:	00003797          	auipc	a5,0x3
+    8020afaa:	0d278793          	addi	a5,a5,210 # 8020e078 <etext+0x1078>
+    8020afae:	639c                	ld	a5,0(a5)
+    8020afb0:	6705                	lui	a4,0x1
+    8020afb2:	c398                	sw	a4,0(a5)
+
+  // initialize queue 0.
+  *R(VIRTIO_MMIO_QUEUE_SEL) = 0;
+    8020afb4:	00003797          	auipc	a5,0x3
+    8020afb8:	0cc78793          	addi	a5,a5,204 # 8020e080 <etext+0x1080>
+    8020afbc:	639c                	ld	a5,0(a5)
+    8020afbe:	0007a023          	sw	zero,0(a5)
+  uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX);
+    8020afc2:	00003797          	auipc	a5,0x3
+    8020afc6:	0c678793          	addi	a5,a5,198 # 8020e088 <etext+0x1088>
+    8020afca:	639c                	ld	a5,0(a5)
+    8020afcc:	439c                	lw	a5,0(a5)
+    8020afce:	fcf42e23          	sw	a5,-36(s0)
+  if(max == 0)
+    8020afd2:	fdc42783          	lw	a5,-36(s0)
+    8020afd6:	2781                	sext.w	a5,a5
+    8020afd8:	eb89                	bnez	a5,8020afea <virtio_disk_init+0x1d8>
+    panic("virtio disk has no queue 0");
+    8020afda:	00003517          	auipc	a0,0x3
+    8020afde:	fce50513          	addi	a0,a0,-50 # 8020dfa8 <etext+0xfa8>
+    8020afe2:	ffff5097          	auipc	ra,0xffff5
+    8020afe6:	462080e7          	jalr	1122(ra) # 80200444 <panic>
+  if(max < NUM)
+    8020afea:	fdc42783          	lw	a5,-36(s0)
+    8020afee:	0007871b          	sext.w	a4,a5
+    8020aff2:	479d                	li	a5,7
+    8020aff4:	00e7ea63          	bltu	a5,a4,8020b008 <virtio_disk_init+0x1f6>
+    panic("virtio disk max queue too short");
+    8020aff8:	00003517          	auipc	a0,0x3
+    8020affc:	fd050513          	addi	a0,a0,-48 # 8020dfc8 <etext+0xfc8>
+    8020b000:	ffff5097          	auipc	ra,0xffff5
+    8020b004:	444080e7          	jalr	1092(ra) # 80200444 <panic>
+  *R(VIRTIO_MMIO_QUEUE_NUM) = NUM;
+    8020b008:	00003797          	auipc	a5,0x3
+    8020b00c:	08878793          	addi	a5,a5,136 # 8020e090 <etext+0x1090>
+    8020b010:	639c                	ld	a5,0(a5)
+    8020b012:	4721                	li	a4,8
+    8020b014:	c398                	sw	a4,0(a5)
+  memset(disk.pages, 0, sizeof(disk.pages));
+    8020b016:	6609                	lui	a2,0x2
+    8020b018:	4581                	li	a1,0
+    8020b01a:	0001e517          	auipc	a0,0x1e
+    8020b01e:	fe650513          	addi	a0,a0,-26 # 80229000 <disk>
+    8020b022:	ffff6097          	auipc	ra,0xffff6
+    8020b026:	ac4080e7          	jalr	-1340(ra) # 80200ae6 <memset>
+  *R(VIRTIO_MMIO_QUEUE_PFN) = ((uint64)disk.pages) >> PGSHIFT;
+    8020b02a:	0001e797          	auipc	a5,0x1e
+    8020b02e:	fd678793          	addi	a5,a5,-42 # 80229000 <disk>
+    8020b032:	00c7d713          	srli	a4,a5,0xc
+    8020b036:	00003797          	auipc	a5,0x3
+    8020b03a:	06278793          	addi	a5,a5,98 # 8020e098 <etext+0x1098>
+    8020b03e:	639c                	ld	a5,0(a5)
+    8020b040:	2701                	sext.w	a4,a4
+    8020b042:	c398                	sw	a4,0(a5)
+
+  // desc = pages -- num * VRingDesc
+  // avail = pages + 0x40 -- 2 * uint16, then num * uint16
+  // used = pages + 4096 -- 2 * uint16, then num * vRingUsedElem
+
+  disk.desc = (struct VRingDesc *) disk.pages;
+    8020b044:	0001e717          	auipc	a4,0x1e
+    8020b048:	fbc70713          	addi	a4,a4,-68 # 80229000 <disk>
+    8020b04c:	6789                	lui	a5,0x2
+    8020b04e:	97ba                	add	a5,a5,a4
+    8020b050:	0001e717          	auipc	a4,0x1e
+    8020b054:	fb070713          	addi	a4,a4,-80 # 80229000 <disk>
+    8020b058:	e398                	sd	a4,0(a5)
+  disk.avail = (uint16*)(((char*)disk.desc) + NUM*sizeof(struct VRingDesc));
+    8020b05a:	0001e717          	auipc	a4,0x1e
+    8020b05e:	fa670713          	addi	a4,a4,-90 # 80229000 <disk>
+    8020b062:	6789                	lui	a5,0x2
+    8020b064:	97ba                	add	a5,a5,a4
+    8020b066:	639c                	ld	a5,0(a5)
+    8020b068:	08078713          	addi	a4,a5,128 # 2080 <_entry-0x801fdf80>
+    8020b06c:	0001e697          	auipc	a3,0x1e
+    8020b070:	f9468693          	addi	a3,a3,-108 # 80229000 <disk>
+    8020b074:	6789                	lui	a5,0x2
+    8020b076:	97b6                	add	a5,a5,a3
+    8020b078:	e798                	sd	a4,8(a5)
+  disk.used = (struct UsedArea *) (disk.pages + PGSIZE);
+    8020b07a:	0001f717          	auipc	a4,0x1f
+    8020b07e:	f8670713          	addi	a4,a4,-122 # 8022a000 <disk+0x1000>
+    8020b082:	0001e697          	auipc	a3,0x1e
+    8020b086:	f7e68693          	addi	a3,a3,-130 # 80229000 <disk>
+    8020b08a:	6789                	lui	a5,0x2
+    8020b08c:	97b6                	add	a5,a5,a3
+    8020b08e:	eb98                	sd	a4,16(a5)
+
+  for(int i = 0; i < NUM; i++)
+    8020b090:	fe042623          	sw	zero,-20(s0)
+    8020b094:	a015                	j	8020b0b8 <virtio_disk_init+0x2a6>
+    disk.free[i] = 1;
+    8020b096:	0001e717          	auipc	a4,0x1e
+    8020b09a:	f6a70713          	addi	a4,a4,-150 # 80229000 <disk>
+    8020b09e:	fec42783          	lw	a5,-20(s0)
+    8020b0a2:	97ba                	add	a5,a5,a4
+    8020b0a4:	6709                	lui	a4,0x2
+    8020b0a6:	97ba                	add	a5,a5,a4
+    8020b0a8:	4705                	li	a4,1
+    8020b0aa:	00e78c23          	sb	a4,24(a5) # 2018 <_entry-0x801fdfe8>
+  for(int i = 0; i < NUM; i++)
+    8020b0ae:	fec42783          	lw	a5,-20(s0)
+    8020b0b2:	2785                	addiw	a5,a5,1
+    8020b0b4:	fef42623          	sw	a5,-20(s0)
+    8020b0b8:	fec42783          	lw	a5,-20(s0)
+    8020b0bc:	0007871b          	sext.w	a4,a5
+    8020b0c0:	479d                	li	a5,7
+    8020b0c2:	fce7dae3          	bge	a5,a4,8020b096 <virtio_disk_init+0x284>
+
+  // plic.c and trap.c arrange for interrupts from VIRTIO0_IRQ.
+  #ifdef DEBUG
+  printf("virtio_disk_init\n");
+    8020b0c6:	00003517          	auipc	a0,0x3
+    8020b0ca:	f2250513          	addi	a0,a0,-222 # 8020dfe8 <etext+0xfe8>
+    8020b0ce:	ffff5097          	auipc	ra,0xffff5
+    8020b0d2:	120080e7          	jalr	288(ra) # 802001ee <printf>
+  #endif
+}
+    8020b0d6:	0001                	nop
+    8020b0d8:	70a2                	ld	ra,40(sp)
+    8020b0da:	7402                	ld	s0,32(sp)
+    8020b0dc:	6145                	addi	sp,sp,48
+    8020b0de:	8082                	ret
+
+000000008020b0e0 <alloc_desc>:
+
+// find a free descriptor, mark it non-free, return its index.
+static int
+alloc_desc()
+{
+    8020b0e0:	1101                	addi	sp,sp,-32
+    8020b0e2:	ec22                	sd	s0,24(sp)
+    8020b0e4:	1000                	addi	s0,sp,32
+  for(int i = 0; i < NUM; i++){
+    8020b0e6:	fe042623          	sw	zero,-20(s0)
+    8020b0ea:	a081                	j	8020b12a <alloc_desc+0x4a>
+    if(disk.free[i]){
+    8020b0ec:	0001e717          	auipc	a4,0x1e
+    8020b0f0:	f1470713          	addi	a4,a4,-236 # 80229000 <disk>
+    8020b0f4:	fec42783          	lw	a5,-20(s0)
+    8020b0f8:	97ba                	add	a5,a5,a4
+    8020b0fa:	6709                	lui	a4,0x2
+    8020b0fc:	97ba                	add	a5,a5,a4
+    8020b0fe:	0187c783          	lbu	a5,24(a5)
+    8020b102:	cf99                	beqz	a5,8020b120 <alloc_desc+0x40>
+      disk.free[i] = 0;
+    8020b104:	0001e717          	auipc	a4,0x1e
+    8020b108:	efc70713          	addi	a4,a4,-260 # 80229000 <disk>
+    8020b10c:	fec42783          	lw	a5,-20(s0)
+    8020b110:	97ba                	add	a5,a5,a4
+    8020b112:	6709                	lui	a4,0x2
+    8020b114:	97ba                	add	a5,a5,a4
+    8020b116:	00078c23          	sb	zero,24(a5)
+      return i;
+    8020b11a:	fec42783          	lw	a5,-20(s0)
+    8020b11e:	a831                	j	8020b13a <alloc_desc+0x5a>
+  for(int i = 0; i < NUM; i++){
+    8020b120:	fec42783          	lw	a5,-20(s0)
+    8020b124:	2785                	addiw	a5,a5,1
+    8020b126:	fef42623          	sw	a5,-20(s0)
+    8020b12a:	fec42783          	lw	a5,-20(s0)
+    8020b12e:	0007871b          	sext.w	a4,a5
+    8020b132:	479d                	li	a5,7
+    8020b134:	fae7dce3          	bge	a5,a4,8020b0ec <alloc_desc+0xc>
+    }
+  }
+  return -1;
+    8020b138:	57fd                	li	a5,-1
+}
+    8020b13a:	853e                	mv	a0,a5
+    8020b13c:	6462                	ld	s0,24(sp)
+    8020b13e:	6105                	addi	sp,sp,32
+    8020b140:	8082                	ret
+
+000000008020b142 <free_desc>:
+
+// mark a descriptor as free.
+static void
+free_desc(int i)
+{
+    8020b142:	1101                	addi	sp,sp,-32
+    8020b144:	ec06                	sd	ra,24(sp)
+    8020b146:	e822                	sd	s0,16(sp)
+    8020b148:	1000                	addi	s0,sp,32
+    8020b14a:	87aa                	mv	a5,a0
+    8020b14c:	fef42623          	sw	a5,-20(s0)
+  if(i >= NUM)
+    8020b150:	fec42783          	lw	a5,-20(s0)
+    8020b154:	0007871b          	sext.w	a4,a5
+    8020b158:	479d                	li	a5,7
+    8020b15a:	00e7da63          	bge	a5,a4,8020b16e <free_desc+0x2c>
+    panic("virtio_disk_intr 1");
+    8020b15e:	00003517          	auipc	a0,0x3
+    8020b162:	ea250513          	addi	a0,a0,-350 # 8020e000 <etext+0x1000>
+    8020b166:	ffff5097          	auipc	ra,0xffff5
+    8020b16a:	2de080e7          	jalr	734(ra) # 80200444 <panic>
+  if(disk.free[i])
+    8020b16e:	0001e717          	auipc	a4,0x1e
+    8020b172:	e9270713          	addi	a4,a4,-366 # 80229000 <disk>
+    8020b176:	fec42783          	lw	a5,-20(s0)
+    8020b17a:	97ba                	add	a5,a5,a4
+    8020b17c:	6709                	lui	a4,0x2
+    8020b17e:	97ba                	add	a5,a5,a4
+    8020b180:	0187c783          	lbu	a5,24(a5)
+    8020b184:	cb89                	beqz	a5,8020b196 <free_desc+0x54>
+    panic("virtio_disk_intr 2");
+    8020b186:	00003517          	auipc	a0,0x3
+    8020b18a:	e9250513          	addi	a0,a0,-366 # 8020e018 <etext+0x1018>
+    8020b18e:	ffff5097          	auipc	ra,0xffff5
+    8020b192:	2b6080e7          	jalr	694(ra) # 80200444 <panic>
+  disk.desc[i].addr = 0;
+    8020b196:	0001e717          	auipc	a4,0x1e
+    8020b19a:	e6a70713          	addi	a4,a4,-406 # 80229000 <disk>
+    8020b19e:	6789                	lui	a5,0x2
+    8020b1a0:	97ba                	add	a5,a5,a4
+    8020b1a2:	6398                	ld	a4,0(a5)
+    8020b1a4:	fec42783          	lw	a5,-20(s0)
+    8020b1a8:	0792                	slli	a5,a5,0x4
+    8020b1aa:	97ba                	add	a5,a5,a4
+    8020b1ac:	0007b023          	sd	zero,0(a5) # 2000 <_entry-0x801fe000>
+  disk.free[i] = 1;
+    8020b1b0:	0001e717          	auipc	a4,0x1e
+    8020b1b4:	e5070713          	addi	a4,a4,-432 # 80229000 <disk>
+    8020b1b8:	fec42783          	lw	a5,-20(s0)
+    8020b1bc:	97ba                	add	a5,a5,a4
+    8020b1be:	6709                	lui	a4,0x2
+    8020b1c0:	97ba                	add	a5,a5,a4
+    8020b1c2:	4705                	li	a4,1
+    8020b1c4:	00e78c23          	sb	a4,24(a5)
+  wakeup(&disk.free[0]);
+    8020b1c8:	00020517          	auipc	a0,0x20
+    8020b1cc:	e5050513          	addi	a0,a0,-432 # 8022b018 <disk+0x2018>
+    8020b1d0:	ffff8097          	auipc	ra,0xffff8
+    8020b1d4:	680080e7          	jalr	1664(ra) # 80203850 <wakeup>
+}
+    8020b1d8:	0001                	nop
+    8020b1da:	60e2                	ld	ra,24(sp)
+    8020b1dc:	6442                	ld	s0,16(sp)
+    8020b1de:	6105                	addi	sp,sp,32
+    8020b1e0:	8082                	ret
+
+000000008020b1e2 <free_chain>:
+
+// free a chain of descriptors.
+static void
+free_chain(int i)
+{
+    8020b1e2:	1101                	addi	sp,sp,-32
+    8020b1e4:	ec06                	sd	ra,24(sp)
+    8020b1e6:	e822                	sd	s0,16(sp)
+    8020b1e8:	1000                	addi	s0,sp,32
+    8020b1ea:	87aa                	mv	a5,a0
+    8020b1ec:	fef42623          	sw	a5,-20(s0)
+  while(1){
+    free_desc(i);
+    8020b1f0:	fec42783          	lw	a5,-20(s0)
+    8020b1f4:	853e                	mv	a0,a5
+    8020b1f6:	00000097          	auipc	ra,0x0
+    8020b1fa:	f4c080e7          	jalr	-180(ra) # 8020b142 <free_desc>
+    if(disk.desc[i].flags & VRING_DESC_F_NEXT)
+    8020b1fe:	0001e717          	auipc	a4,0x1e
+    8020b202:	e0270713          	addi	a4,a4,-510 # 80229000 <disk>
+    8020b206:	6789                	lui	a5,0x2
+    8020b208:	97ba                	add	a5,a5,a4
+    8020b20a:	6398                	ld	a4,0(a5)
+    8020b20c:	fec42783          	lw	a5,-20(s0)
+    8020b210:	0792                	slli	a5,a5,0x4
+    8020b212:	97ba                	add	a5,a5,a4
+    8020b214:	00c7d783          	lhu	a5,12(a5) # 200c <_entry-0x801fdff4>
+    8020b218:	2781                	sext.w	a5,a5
+    8020b21a:	8b85                	andi	a5,a5,1
+    8020b21c:	2781                	sext.w	a5,a5
+    8020b21e:	c38d                	beqz	a5,8020b240 <free_chain+0x5e>
+      i = disk.desc[i].next;
+    8020b220:	0001e717          	auipc	a4,0x1e
+    8020b224:	de070713          	addi	a4,a4,-544 # 80229000 <disk>
+    8020b228:	6789                	lui	a5,0x2
+    8020b22a:	97ba                	add	a5,a5,a4
+    8020b22c:	6398                	ld	a4,0(a5)
+    8020b22e:	fec42783          	lw	a5,-20(s0)
+    8020b232:	0792                	slli	a5,a5,0x4
+    8020b234:	97ba                	add	a5,a5,a4
+    8020b236:	00e7d783          	lhu	a5,14(a5) # 200e <_entry-0x801fdff2>
+    8020b23a:	fef42623          	sw	a5,-20(s0)
+    free_desc(i);
+    8020b23e:	bf4d                	j	8020b1f0 <free_chain+0xe>
+    else
+      break;
+    8020b240:	0001                	nop
+  }
+}
+    8020b242:	0001                	nop
+    8020b244:	60e2                	ld	ra,24(sp)
+    8020b246:	6442                	ld	s0,16(sp)
+    8020b248:	6105                	addi	sp,sp,32
+    8020b24a:	8082                	ret
+
+000000008020b24c <alloc3_desc>:
+
+static int
+alloc3_desc(int *idx)
+{
+    8020b24c:	7139                	addi	sp,sp,-64
+    8020b24e:	fc06                	sd	ra,56(sp)
+    8020b250:	f822                	sd	s0,48(sp)
+    8020b252:	f426                	sd	s1,40(sp)
+    8020b254:	0080                	addi	s0,sp,64
+    8020b256:	fca43423          	sd	a0,-56(s0)
+  for(int i = 0; i < 3; i++){
+    8020b25a:	fc042e23          	sw	zero,-36(s0)
+    8020b25e:	a895                	j	8020b2d2 <alloc3_desc+0x86>
+    idx[i] = alloc_desc();
+    8020b260:	fdc42783          	lw	a5,-36(s0)
+    8020b264:	078a                	slli	a5,a5,0x2
+    8020b266:	fc843703          	ld	a4,-56(s0)
+    8020b26a:	00f704b3          	add	s1,a4,a5
+    8020b26e:	00000097          	auipc	ra,0x0
+    8020b272:	e72080e7          	jalr	-398(ra) # 8020b0e0 <alloc_desc>
+    8020b276:	87aa                	mv	a5,a0
+    8020b278:	c09c                	sw	a5,0(s1)
+    if(idx[i] < 0){
+    8020b27a:	fdc42783          	lw	a5,-36(s0)
+    8020b27e:	078a                	slli	a5,a5,0x2
+    8020b280:	fc843703          	ld	a4,-56(s0)
+    8020b284:	97ba                	add	a5,a5,a4
+    8020b286:	439c                	lw	a5,0(a5)
+    8020b288:	0407d063          	bgez	a5,8020b2c8 <alloc3_desc+0x7c>
+      for(int j = 0; j < i; j++)
+    8020b28c:	fc042c23          	sw	zero,-40(s0)
+    8020b290:	a015                	j	8020b2b4 <alloc3_desc+0x68>
+        free_desc(idx[j]);
+    8020b292:	fd842783          	lw	a5,-40(s0)
+    8020b296:	078a                	slli	a5,a5,0x2
+    8020b298:	fc843703          	ld	a4,-56(s0)
+    8020b29c:	97ba                	add	a5,a5,a4
+    8020b29e:	439c                	lw	a5,0(a5)
+    8020b2a0:	853e                	mv	a0,a5
+    8020b2a2:	00000097          	auipc	ra,0x0
+    8020b2a6:	ea0080e7          	jalr	-352(ra) # 8020b142 <free_desc>
+      for(int j = 0; j < i; j++)
+    8020b2aa:	fd842783          	lw	a5,-40(s0)
+    8020b2ae:	2785                	addiw	a5,a5,1
+    8020b2b0:	fcf42c23          	sw	a5,-40(s0)
+    8020b2b4:	fd842703          	lw	a4,-40(s0)
+    8020b2b8:	fdc42783          	lw	a5,-36(s0)
+    8020b2bc:	2701                	sext.w	a4,a4
+    8020b2be:	2781                	sext.w	a5,a5
+    8020b2c0:	fcf749e3          	blt	a4,a5,8020b292 <alloc3_desc+0x46>
+      return -1;
+    8020b2c4:	57fd                	li	a5,-1
+    8020b2c6:	a831                	j	8020b2e2 <alloc3_desc+0x96>
+  for(int i = 0; i < 3; i++){
+    8020b2c8:	fdc42783          	lw	a5,-36(s0)
+    8020b2cc:	2785                	addiw	a5,a5,1
+    8020b2ce:	fcf42e23          	sw	a5,-36(s0)
+    8020b2d2:	fdc42783          	lw	a5,-36(s0)
+    8020b2d6:	0007871b          	sext.w	a4,a5
+    8020b2da:	4789                	li	a5,2
+    8020b2dc:	f8e7d2e3          	bge	a5,a4,8020b260 <alloc3_desc+0x14>
+    }
+  }
+  return 0;
+    8020b2e0:	4781                	li	a5,0
+}
+    8020b2e2:	853e                	mv	a0,a5
+    8020b2e4:	70e2                	ld	ra,56(sp)
+    8020b2e6:	7442                	ld	s0,48(sp)
+    8020b2e8:	74a2                	ld	s1,40(sp)
+    8020b2ea:	6121                	addi	sp,sp,64
+    8020b2ec:	8082                	ret
+
+000000008020b2ee <virtio_disk_rw>:
+
+void
+virtio_disk_rw(struct buf *b, int write)
+{
+    8020b2ee:	711d                	addi	sp,sp,-96
+    8020b2f0:	ec86                	sd	ra,88(sp)
+    8020b2f2:	e8a2                	sd	s0,80(sp)
+    8020b2f4:	e4a6                	sd	s1,72(sp)
+    8020b2f6:	1080                	addi	s0,sp,96
+    8020b2f8:	faa43423          	sd	a0,-88(s0)
+    8020b2fc:	87ae                	mv	a5,a1
+    8020b2fe:	faf42223          	sw	a5,-92(s0)
+  uint64 sector = b->sectorno;
+    8020b302:	fa843783          	ld	a5,-88(s0)
+    8020b306:	47dc                	lw	a5,12(a5)
+    8020b308:	1782                	slli	a5,a5,0x20
+    8020b30a:	9381                	srli	a5,a5,0x20
+    8020b30c:	fcf43c23          	sd	a5,-40(s0)
+
+  acquire(&disk.vdisk_lock);
+    8020b310:	00020517          	auipc	a0,0x20
+    8020b314:	d9850513          	addi	a0,a0,-616 # 8022b0a8 <disk+0x20a8>
+    8020b318:	ffff5097          	auipc	ra,0xffff5
+    8020b31c:	6d0080e7          	jalr	1744(ra) # 802009e8 <acquire>
+  // the data, one for a 1-byte status result.
+
+  // allocate the three descriptors.
+  int idx[3];
+  while(1){
+    if(alloc3_desc(idx) == 0) {
+    8020b320:	fc840793          	addi	a5,s0,-56
+    8020b324:	853e                	mv	a0,a5
+    8020b326:	00000097          	auipc	ra,0x0
+    8020b32a:	f26080e7          	jalr	-218(ra) # 8020b24c <alloc3_desc>
+    8020b32e:	87aa                	mv	a5,a0
+    8020b330:	cf91                	beqz	a5,8020b34c <virtio_disk_rw+0x5e>
+      break;
+    }
+    sleep(&disk.free[0], &disk.vdisk_lock);
+    8020b332:	00020597          	auipc	a1,0x20
+    8020b336:	d7658593          	addi	a1,a1,-650 # 8022b0a8 <disk+0x20a8>
+    8020b33a:	00020517          	auipc	a0,0x20
+    8020b33e:	cde50513          	addi	a0,a0,-802 # 8022b018 <disk+0x2018>
+    8020b342:	ffff8097          	auipc	ra,0xffff8
+    8020b346:	47a080e7          	jalr	1146(ra) # 802037bc <sleep>
+    if(alloc3_desc(idx) == 0) {
+    8020b34a:	bfd9                	j	8020b320 <virtio_disk_rw+0x32>
+      break;
+    8020b34c:	0001                	nop
+    uint32 type;
+    uint32 reserved;
+    uint64 sector;
+  } buf0;
+
+  if(write)
+    8020b34e:	fa442783          	lw	a5,-92(s0)
+    8020b352:	2781                	sext.w	a5,a5
+    8020b354:	c789                	beqz	a5,8020b35e <virtio_disk_rw+0x70>
+    buf0.type = VIRTIO_BLK_T_OUT; // write the disk
+    8020b356:	4785                	li	a5,1
+    8020b358:	faf42c23          	sw	a5,-72(s0)
+    8020b35c:	a019                	j	8020b362 <virtio_disk_rw+0x74>
+  else
+    buf0.type = VIRTIO_BLK_T_IN; // read the disk
+    8020b35e:	fa042c23          	sw	zero,-72(s0)
+  buf0.reserved = 0;
+    8020b362:	fa042e23          	sw	zero,-68(s0)
+  buf0.sector = sector;
+    8020b366:	fd843783          	ld	a5,-40(s0)
+    8020b36a:	fcf43023          	sd	a5,-64(s0)
+
+  // buf0 is on a kernel stack, which is not direct mapped,
+  // thus the call to kvmpa().
+  disk.desc[idx[0]].addr = (uint64) kwalkaddr(myproc()->kpagetable, (uint64) &buf0);
+    8020b36e:	ffff7097          	auipc	ra,0xffff7
+    8020b372:	5f4080e7          	jalr	1524(ra) # 80202962 <myproc>
+    8020b376:	87aa                	mv	a5,a0
+    8020b378:	6fb4                	ld	a3,88(a5)
+    8020b37a:	fb840613          	addi	a2,s0,-72
+    8020b37e:	0001e717          	auipc	a4,0x1e
+    8020b382:	c8270713          	addi	a4,a4,-894 # 80229000 <disk>
+    8020b386:	6789                	lui	a5,0x2
+    8020b388:	97ba                	add	a5,a5,a4
+    8020b38a:	6398                	ld	a4,0(a5)
+    8020b38c:	fc842783          	lw	a5,-56(s0)
+    8020b390:	0792                	slli	a5,a5,0x4
+    8020b392:	00f704b3          	add	s1,a4,a5
+    8020b396:	85b2                	mv	a1,a2
+    8020b398:	8536                	mv	a0,a3
+    8020b39a:	ffff6097          	auipc	ra,0xffff6
+    8020b39e:	206080e7          	jalr	518(ra) # 802015a0 <kwalkaddr>
+    8020b3a2:	87aa                	mv	a5,a0
+    8020b3a4:	e09c                	sd	a5,0(s1)
+  disk.desc[idx[0]].len = sizeof(buf0);
+    8020b3a6:	0001e717          	auipc	a4,0x1e
+    8020b3aa:	c5a70713          	addi	a4,a4,-934 # 80229000 <disk>
+    8020b3ae:	6789                	lui	a5,0x2
+    8020b3b0:	97ba                	add	a5,a5,a4
+    8020b3b2:	6398                	ld	a4,0(a5)
+    8020b3b4:	fc842783          	lw	a5,-56(s0)
+    8020b3b8:	0792                	slli	a5,a5,0x4
+    8020b3ba:	97ba                	add	a5,a5,a4
+    8020b3bc:	4741                	li	a4,16
+    8020b3be:	c798                	sw	a4,8(a5)
+  disk.desc[idx[0]].flags = VRING_DESC_F_NEXT;
+    8020b3c0:	0001e717          	auipc	a4,0x1e
+    8020b3c4:	c4070713          	addi	a4,a4,-960 # 80229000 <disk>
+    8020b3c8:	6789                	lui	a5,0x2
+    8020b3ca:	97ba                	add	a5,a5,a4
+    8020b3cc:	6398                	ld	a4,0(a5)
+    8020b3ce:	fc842783          	lw	a5,-56(s0)
+    8020b3d2:	0792                	slli	a5,a5,0x4
+    8020b3d4:	97ba                	add	a5,a5,a4
+    8020b3d6:	4705                	li	a4,1
+    8020b3d8:	00e79623          	sh	a4,12(a5) # 200c <_entry-0x801fdff4>
+  disk.desc[idx[0]].next = idx[1];
+    8020b3dc:	fcc42683          	lw	a3,-52(s0)
+    8020b3e0:	0001e717          	auipc	a4,0x1e
+    8020b3e4:	c2070713          	addi	a4,a4,-992 # 80229000 <disk>
+    8020b3e8:	6789                	lui	a5,0x2
+    8020b3ea:	97ba                	add	a5,a5,a4
+    8020b3ec:	6398                	ld	a4,0(a5)
+    8020b3ee:	fc842783          	lw	a5,-56(s0)
+    8020b3f2:	0792                	slli	a5,a5,0x4
+    8020b3f4:	97ba                	add	a5,a5,a4
+    8020b3f6:	03069713          	slli	a4,a3,0x30
+    8020b3fa:	9341                	srli	a4,a4,0x30
+    8020b3fc:	00e79723          	sh	a4,14(a5) # 200e <_entry-0x801fdff2>
+
+  disk.desc[idx[1]].addr = (uint64) b->data;
+    8020b400:	fa843783          	ld	a5,-88(s0)
+    8020b404:	05878693          	addi	a3,a5,88
+    8020b408:	0001e717          	auipc	a4,0x1e
+    8020b40c:	bf870713          	addi	a4,a4,-1032 # 80229000 <disk>
+    8020b410:	6789                	lui	a5,0x2
+    8020b412:	97ba                	add	a5,a5,a4
+    8020b414:	6398                	ld	a4,0(a5)
+    8020b416:	fcc42783          	lw	a5,-52(s0)
+    8020b41a:	0792                	slli	a5,a5,0x4
+    8020b41c:	97ba                	add	a5,a5,a4
+    8020b41e:	8736                	mv	a4,a3
+    8020b420:	e398                	sd	a4,0(a5)
+  disk.desc[idx[1]].len = BSIZE;
+    8020b422:	0001e717          	auipc	a4,0x1e
+    8020b426:	bde70713          	addi	a4,a4,-1058 # 80229000 <disk>
+    8020b42a:	6789                	lui	a5,0x2
+    8020b42c:	97ba                	add	a5,a5,a4
+    8020b42e:	6398                	ld	a4,0(a5)
+    8020b430:	fcc42783          	lw	a5,-52(s0)
+    8020b434:	0792                	slli	a5,a5,0x4
+    8020b436:	97ba                	add	a5,a5,a4
+    8020b438:	20000713          	li	a4,512
+    8020b43c:	c798                	sw	a4,8(a5)
+  if(write)
+    8020b43e:	fa442783          	lw	a5,-92(s0)
+    8020b442:	2781                	sext.w	a5,a5
+    8020b444:	cf99                	beqz	a5,8020b462 <virtio_disk_rw+0x174>
+    disk.desc[idx[1]].flags = 0; // device reads b->data
+    8020b446:	0001e717          	auipc	a4,0x1e
+    8020b44a:	bba70713          	addi	a4,a4,-1094 # 80229000 <disk>
+    8020b44e:	6789                	lui	a5,0x2
+    8020b450:	97ba                	add	a5,a5,a4
+    8020b452:	6398                	ld	a4,0(a5)
+    8020b454:	fcc42783          	lw	a5,-52(s0)
+    8020b458:	0792                	slli	a5,a5,0x4
+    8020b45a:	97ba                	add	a5,a5,a4
+    8020b45c:	00079623          	sh	zero,12(a5) # 200c <_entry-0x801fdff4>
+    8020b460:	a839                	j	8020b47e <virtio_disk_rw+0x190>
+  else
+    disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data
+    8020b462:	0001e717          	auipc	a4,0x1e
+    8020b466:	b9e70713          	addi	a4,a4,-1122 # 80229000 <disk>
+    8020b46a:	6789                	lui	a5,0x2
+    8020b46c:	97ba                	add	a5,a5,a4
+    8020b46e:	6398                	ld	a4,0(a5)
+    8020b470:	fcc42783          	lw	a5,-52(s0)
+    8020b474:	0792                	slli	a5,a5,0x4
+    8020b476:	97ba                	add	a5,a5,a4
+    8020b478:	4709                	li	a4,2
+    8020b47a:	00e79623          	sh	a4,12(a5) # 200c <_entry-0x801fdff4>
+  disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT;
+    8020b47e:	0001e717          	auipc	a4,0x1e
+    8020b482:	b8270713          	addi	a4,a4,-1150 # 80229000 <disk>
+    8020b486:	6789                	lui	a5,0x2
+    8020b488:	97ba                	add	a5,a5,a4
+    8020b48a:	6398                	ld	a4,0(a5)
+    8020b48c:	fcc42783          	lw	a5,-52(s0)
+    8020b490:	0792                	slli	a5,a5,0x4
+    8020b492:	97ba                	add	a5,a5,a4
+    8020b494:	00c7d703          	lhu	a4,12(a5) # 200c <_entry-0x801fdff4>
+    8020b498:	0001e697          	auipc	a3,0x1e
+    8020b49c:	b6868693          	addi	a3,a3,-1176 # 80229000 <disk>
+    8020b4a0:	6789                	lui	a5,0x2
+    8020b4a2:	97b6                	add	a5,a5,a3
+    8020b4a4:	6394                	ld	a3,0(a5)
+    8020b4a6:	fcc42783          	lw	a5,-52(s0)
+    8020b4aa:	0792                	slli	a5,a5,0x4
+    8020b4ac:	97b6                	add	a5,a5,a3
+    8020b4ae:	00176713          	ori	a4,a4,1
+    8020b4b2:	1742                	slli	a4,a4,0x30
+    8020b4b4:	9341                	srli	a4,a4,0x30
+    8020b4b6:	00e79623          	sh	a4,12(a5) # 200c <_entry-0x801fdff4>
+  disk.desc[idx[1]].next = idx[2];
+    8020b4ba:	fd042683          	lw	a3,-48(s0)
+    8020b4be:	0001e717          	auipc	a4,0x1e
+    8020b4c2:	b4270713          	addi	a4,a4,-1214 # 80229000 <disk>
+    8020b4c6:	6789                	lui	a5,0x2
+    8020b4c8:	97ba                	add	a5,a5,a4
+    8020b4ca:	6398                	ld	a4,0(a5)
+    8020b4cc:	fcc42783          	lw	a5,-52(s0)
+    8020b4d0:	0792                	slli	a5,a5,0x4
+    8020b4d2:	97ba                	add	a5,a5,a4
+    8020b4d4:	03069713          	slli	a4,a3,0x30
+    8020b4d8:	9341                	srli	a4,a4,0x30
+    8020b4da:	00e79723          	sh	a4,14(a5) # 200e <_entry-0x801fdff2>
+
+  disk.info[idx[0]].status = 0;
+    8020b4de:	fc842783          	lw	a5,-56(s0)
+    8020b4e2:	0001e717          	auipc	a4,0x1e
+    8020b4e6:	b1e70713          	addi	a4,a4,-1250 # 80229000 <disk>
+    8020b4ea:	20078793          	addi	a5,a5,512
+    8020b4ee:	0792                	slli	a5,a5,0x4
+    8020b4f0:	97ba                	add	a5,a5,a4
+    8020b4f2:	02078823          	sb	zero,48(a5)
+  disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status;
+    8020b4f6:	fc842783          	lw	a5,-56(s0)
+    8020b4fa:	20078793          	addi	a5,a5,512
+    8020b4fe:	00479713          	slli	a4,a5,0x4
+    8020b502:	0001e797          	auipc	a5,0x1e
+    8020b506:	afe78793          	addi	a5,a5,-1282 # 80229000 <disk>
+    8020b50a:	97ba                	add	a5,a5,a4
+    8020b50c:	03078693          	addi	a3,a5,48
+    8020b510:	0001e717          	auipc	a4,0x1e
+    8020b514:	af070713          	addi	a4,a4,-1296 # 80229000 <disk>
+    8020b518:	6789                	lui	a5,0x2
+    8020b51a:	97ba                	add	a5,a5,a4
+    8020b51c:	6398                	ld	a4,0(a5)
+    8020b51e:	fd042783          	lw	a5,-48(s0)
+    8020b522:	0792                	slli	a5,a5,0x4
+    8020b524:	97ba                	add	a5,a5,a4
+    8020b526:	8736                	mv	a4,a3
+    8020b528:	e398                	sd	a4,0(a5)
+  disk.desc[idx[2]].len = 1;
+    8020b52a:	0001e717          	auipc	a4,0x1e
+    8020b52e:	ad670713          	addi	a4,a4,-1322 # 80229000 <disk>
+    8020b532:	6789                	lui	a5,0x2
+    8020b534:	97ba                	add	a5,a5,a4
+    8020b536:	6398                	ld	a4,0(a5)
+    8020b538:	fd042783          	lw	a5,-48(s0)
+    8020b53c:	0792                	slli	a5,a5,0x4
+    8020b53e:	97ba                	add	a5,a5,a4
+    8020b540:	4705                	li	a4,1
+    8020b542:	c798                	sw	a4,8(a5)
+  disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status
+    8020b544:	0001e717          	auipc	a4,0x1e
+    8020b548:	abc70713          	addi	a4,a4,-1348 # 80229000 <disk>
+    8020b54c:	6789                	lui	a5,0x2
+    8020b54e:	97ba                	add	a5,a5,a4
+    8020b550:	6398                	ld	a4,0(a5)
+    8020b552:	fd042783          	lw	a5,-48(s0)
+    8020b556:	0792                	slli	a5,a5,0x4
+    8020b558:	97ba                	add	a5,a5,a4
+    8020b55a:	4709                	li	a4,2
+    8020b55c:	00e79623          	sh	a4,12(a5) # 200c <_entry-0x801fdff4>
+  disk.desc[idx[2]].next = 0;
+    8020b560:	0001e717          	auipc	a4,0x1e
+    8020b564:	aa070713          	addi	a4,a4,-1376 # 80229000 <disk>
+    8020b568:	6789                	lui	a5,0x2
+    8020b56a:	97ba                	add	a5,a5,a4
+    8020b56c:	6398                	ld	a4,0(a5)
+    8020b56e:	fd042783          	lw	a5,-48(s0)
+    8020b572:	0792                	slli	a5,a5,0x4
+    8020b574:	97ba                	add	a5,a5,a4
+    8020b576:	00079723          	sh	zero,14(a5) # 200e <_entry-0x801fdff2>
+
+  // record struct buf for virtio_disk_intr().
+  b->disk = 1;
+    8020b57a:	fa843783          	ld	a5,-88(s0)
+    8020b57e:	4705                	li	a4,1
+    8020b580:	c3d8                	sw	a4,4(a5)
+  disk.info[idx[0]].b = b;
+    8020b582:	fc842783          	lw	a5,-56(s0)
+    8020b586:	0001e717          	auipc	a4,0x1e
+    8020b58a:	a7a70713          	addi	a4,a4,-1414 # 80229000 <disk>
+    8020b58e:	20078793          	addi	a5,a5,512
+    8020b592:	0792                	slli	a5,a5,0x4
+    8020b594:	97ba                	add	a5,a5,a4
+    8020b596:	fa843703          	ld	a4,-88(s0)
+    8020b59a:	f798                	sd	a4,40(a5)
+
+  // avail[0] is flags
+  // avail[1] tells the device how far to look in avail[2...].
+  // avail[2...] are desc[] indices the device should process.
+  // we only tell device the first index in our chain of descriptors.
+  disk.avail[2 + (disk.avail[1] % NUM)] = idx[0];
+    8020b59c:	fc842603          	lw	a2,-56(s0)
+    8020b5a0:	0001e717          	auipc	a4,0x1e
+    8020b5a4:	a6070713          	addi	a4,a4,-1440 # 80229000 <disk>
+    8020b5a8:	6789                	lui	a5,0x2
+    8020b5aa:	97ba                	add	a5,a5,a4
+    8020b5ac:	6798                	ld	a4,8(a5)
+    8020b5ae:	0001e697          	auipc	a3,0x1e
+    8020b5b2:	a5268693          	addi	a3,a3,-1454 # 80229000 <disk>
+    8020b5b6:	6789                	lui	a5,0x2
+    8020b5b8:	97b6                	add	a5,a5,a3
+    8020b5ba:	679c                	ld	a5,8(a5)
+    8020b5bc:	0789                	addi	a5,a5,2
+    8020b5be:	0007d783          	lhu	a5,0(a5) # 2000 <_entry-0x801fe000>
+    8020b5c2:	2781                	sext.w	a5,a5
+    8020b5c4:	8b9d                	andi	a5,a5,7
+    8020b5c6:	2781                	sext.w	a5,a5
+    8020b5c8:	2789                	addiw	a5,a5,2
+    8020b5ca:	2781                	sext.w	a5,a5
+    8020b5cc:	0786                	slli	a5,a5,0x1
+    8020b5ce:	97ba                	add	a5,a5,a4
+    8020b5d0:	03061713          	slli	a4,a2,0x30
+    8020b5d4:	9341                	srli	a4,a4,0x30
+    8020b5d6:	00e79023          	sh	a4,0(a5)
+  __sync_synchronize();
+    8020b5da:	0ff0000f          	fence
+  disk.avail[1] = disk.avail[1] + 1;
+    8020b5de:	0001e717          	auipc	a4,0x1e
+    8020b5e2:	a2270713          	addi	a4,a4,-1502 # 80229000 <disk>
+    8020b5e6:	6789                	lui	a5,0x2
+    8020b5e8:	97ba                	add	a5,a5,a4
+    8020b5ea:	679c                	ld	a5,8(a5)
+    8020b5ec:	0789                	addi	a5,a5,2
+    8020b5ee:	0007d703          	lhu	a4,0(a5) # 2000 <_entry-0x801fe000>
+    8020b5f2:	0001e697          	auipc	a3,0x1e
+    8020b5f6:	a0e68693          	addi	a3,a3,-1522 # 80229000 <disk>
+    8020b5fa:	6789                	lui	a5,0x2
+    8020b5fc:	97b6                	add	a5,a5,a3
+    8020b5fe:	679c                	ld	a5,8(a5)
+    8020b600:	0789                	addi	a5,a5,2
+    8020b602:	2705                	addiw	a4,a4,1
+    8020b604:	1742                	slli	a4,a4,0x30
+    8020b606:	9341                	srli	a4,a4,0x30
+    8020b608:	00e79023          	sh	a4,0(a5) # 2000 <_entry-0x801fe000>
+
+  *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number
+    8020b60c:	00003797          	auipc	a5,0x3
+    8020b610:	a9478793          	addi	a5,a5,-1388 # 8020e0a0 <etext+0x10a0>
+    8020b614:	639c                	ld	a5,0(a5)
+    8020b616:	0007a023          	sw	zero,0(a5)
+
+  // Wait for virtio_disk_intr() to say request has finished.
+  while(b->disk == 1) {
+    8020b61a:	a819                	j	8020b630 <virtio_disk_rw+0x342>
+    sleep(b, &disk.vdisk_lock);
+    8020b61c:	00020597          	auipc	a1,0x20
+    8020b620:	a8c58593          	addi	a1,a1,-1396 # 8022b0a8 <disk+0x20a8>
+    8020b624:	fa843503          	ld	a0,-88(s0)
+    8020b628:	ffff8097          	auipc	ra,0xffff8
+    8020b62c:	194080e7          	jalr	404(ra) # 802037bc <sleep>
+  while(b->disk == 1) {
+    8020b630:	fa843783          	ld	a5,-88(s0)
+    8020b634:	43dc                	lw	a5,4(a5)
+    8020b636:	873e                	mv	a4,a5
+    8020b638:	4785                	li	a5,1
+    8020b63a:	fef701e3          	beq	a4,a5,8020b61c <virtio_disk_rw+0x32e>
+  }
+
+  disk.info[idx[0]].b = 0;
+    8020b63e:	fc842783          	lw	a5,-56(s0)
+    8020b642:	0001e717          	auipc	a4,0x1e
+    8020b646:	9be70713          	addi	a4,a4,-1602 # 80229000 <disk>
+    8020b64a:	20078793          	addi	a5,a5,512
+    8020b64e:	0792                	slli	a5,a5,0x4
+    8020b650:	97ba                	add	a5,a5,a4
+    8020b652:	0207b423          	sd	zero,40(a5)
+  free_chain(idx[0]);
+    8020b656:	fc842783          	lw	a5,-56(s0)
+    8020b65a:	853e                	mv	a0,a5
+    8020b65c:	00000097          	auipc	ra,0x0
+    8020b660:	b86080e7          	jalr	-1146(ra) # 8020b1e2 <free_chain>
+
+  release(&disk.vdisk_lock);
+    8020b664:	00020517          	auipc	a0,0x20
+    8020b668:	a4450513          	addi	a0,a0,-1468 # 8022b0a8 <disk+0x20a8>
+    8020b66c:	ffff5097          	auipc	ra,0xffff5
+    8020b670:	3e0080e7          	jalr	992(ra) # 80200a4c <release>
+}
+    8020b674:	0001                	nop
+    8020b676:	60e6                	ld	ra,88(sp)
+    8020b678:	6446                	ld	s0,80(sp)
+    8020b67a:	64a6                	ld	s1,72(sp)
+    8020b67c:	6125                	addi	sp,sp,96
+    8020b67e:	8082                	ret
+
+000000008020b680 <virtio_disk_intr>:
+
+void
+virtio_disk_intr()
+{
+    8020b680:	1101                	addi	sp,sp,-32
+    8020b682:	ec06                	sd	ra,24(sp)
+    8020b684:	e822                	sd	s0,16(sp)
+    8020b686:	1000                	addi	s0,sp,32
+  acquire(&disk.vdisk_lock);
+    8020b688:	00020517          	auipc	a0,0x20
+    8020b68c:	a2050513          	addi	a0,a0,-1504 # 8022b0a8 <disk+0x20a8>
+    8020b690:	ffff5097          	auipc	ra,0xffff5
+    8020b694:	358080e7          	jalr	856(ra) # 802009e8 <acquire>
+
+  while((disk.used_idx % NUM) != (disk.used->id % NUM)){
+    8020b698:	a8c1                	j	8020b768 <virtio_disk_intr+0xe8>
+    int id = disk.used->elems[disk.used_idx].id;
+    8020b69a:	0001e717          	auipc	a4,0x1e
+    8020b69e:	96670713          	addi	a4,a4,-1690 # 80229000 <disk>
+    8020b6a2:	6789                	lui	a5,0x2
+    8020b6a4:	97ba                	add	a5,a5,a4
+    8020b6a6:	6b98                	ld	a4,16(a5)
+    8020b6a8:	0001e697          	auipc	a3,0x1e
+    8020b6ac:	95868693          	addi	a3,a3,-1704 # 80229000 <disk>
+    8020b6b0:	6789                	lui	a5,0x2
+    8020b6b2:	97b6                	add	a5,a5,a3
+    8020b6b4:	0207d783          	lhu	a5,32(a5) # 2020 <_entry-0x801fdfe0>
+    8020b6b8:	2781                	sext.w	a5,a5
+    8020b6ba:	078e                	slli	a5,a5,0x3
+    8020b6bc:	97ba                	add	a5,a5,a4
+    8020b6be:	43dc                	lw	a5,4(a5)
+    8020b6c0:	fef42623          	sw	a5,-20(s0)
+
+    if(disk.info[id].status != 0)
+    8020b6c4:	0001e717          	auipc	a4,0x1e
+    8020b6c8:	93c70713          	addi	a4,a4,-1732 # 80229000 <disk>
+    8020b6cc:	fec42783          	lw	a5,-20(s0)
+    8020b6d0:	20078793          	addi	a5,a5,512
+    8020b6d4:	0792                	slli	a5,a5,0x4
+    8020b6d6:	97ba                	add	a5,a5,a4
+    8020b6d8:	0307c783          	lbu	a5,48(a5)
+    8020b6dc:	cb89                	beqz	a5,8020b6ee <virtio_disk_intr+0x6e>
+      panic("virtio_disk_intr status");
+    8020b6de:	00003517          	auipc	a0,0x3
+    8020b6e2:	95250513          	addi	a0,a0,-1710 # 8020e030 <etext+0x1030>
+    8020b6e6:	ffff5097          	auipc	ra,0xffff5
+    8020b6ea:	d5e080e7          	jalr	-674(ra) # 80200444 <panic>
+    
+    disk.info[id].b->disk = 0;   // disk is done with buf
+    8020b6ee:	0001e717          	auipc	a4,0x1e
+    8020b6f2:	91270713          	addi	a4,a4,-1774 # 80229000 <disk>
+    8020b6f6:	fec42783          	lw	a5,-20(s0)
+    8020b6fa:	20078793          	addi	a5,a5,512
+    8020b6fe:	0792                	slli	a5,a5,0x4
+    8020b700:	97ba                	add	a5,a5,a4
+    8020b702:	779c                	ld	a5,40(a5)
+    8020b704:	0007a223          	sw	zero,4(a5)
+    wakeup(disk.info[id].b);
+    8020b708:	0001e717          	auipc	a4,0x1e
+    8020b70c:	8f870713          	addi	a4,a4,-1800 # 80229000 <disk>
+    8020b710:	fec42783          	lw	a5,-20(s0)
+    8020b714:	20078793          	addi	a5,a5,512
+    8020b718:	0792                	slli	a5,a5,0x4
+    8020b71a:	97ba                	add	a5,a5,a4
+    8020b71c:	779c                	ld	a5,40(a5)
+    8020b71e:	853e                	mv	a0,a5
+    8020b720:	ffff8097          	auipc	ra,0xffff8
+    8020b724:	130080e7          	jalr	304(ra) # 80203850 <wakeup>
+
+    disk.used_idx = (disk.used_idx + 1) % NUM;
+    8020b728:	0001e717          	auipc	a4,0x1e
+    8020b72c:	8d870713          	addi	a4,a4,-1832 # 80229000 <disk>
+    8020b730:	6789                	lui	a5,0x2
+    8020b732:	97ba                	add	a5,a5,a4
+    8020b734:	0207d783          	lhu	a5,32(a5) # 2020 <_entry-0x801fdfe0>
+    8020b738:	2781                	sext.w	a5,a5
+    8020b73a:	2785                	addiw	a5,a5,1
+    8020b73c:	2781                	sext.w	a5,a5
+    8020b73e:	873e                	mv	a4,a5
+    8020b740:	41f7579b          	sraiw	a5,a4,0x1f
+    8020b744:	01d7d79b          	srliw	a5,a5,0x1d
+    8020b748:	9f3d                	addw	a4,a4,a5
+    8020b74a:	8b1d                	andi	a4,a4,7
+    8020b74c:	40f707bb          	subw	a5,a4,a5
+    8020b750:	2781                	sext.w	a5,a5
+    8020b752:	03079713          	slli	a4,a5,0x30
+    8020b756:	9341                	srli	a4,a4,0x30
+    8020b758:	0001e697          	auipc	a3,0x1e
+    8020b75c:	8a868693          	addi	a3,a3,-1880 # 80229000 <disk>
+    8020b760:	6789                	lui	a5,0x2
+    8020b762:	97b6                	add	a5,a5,a3
+    8020b764:	02e79023          	sh	a4,32(a5) # 2020 <_entry-0x801fdfe0>
+  while((disk.used_idx % NUM) != (disk.used->id % NUM)){
+    8020b768:	0001e717          	auipc	a4,0x1e
+    8020b76c:	89870713          	addi	a4,a4,-1896 # 80229000 <disk>
+    8020b770:	6789                	lui	a5,0x2
+    8020b772:	97ba                	add	a5,a5,a4
+    8020b774:	0207d703          	lhu	a4,32(a5) # 2020 <_entry-0x801fdfe0>
+    8020b778:	0001e697          	auipc	a3,0x1e
+    8020b77c:	88868693          	addi	a3,a3,-1912 # 80229000 <disk>
+    8020b780:	6789                	lui	a5,0x2
+    8020b782:	97b6                	add	a5,a5,a3
+    8020b784:	6b9c                	ld	a5,16(a5)
+    8020b786:	0027d783          	lhu	a5,2(a5) # 2002 <_entry-0x801fdffe>
+    8020b78a:	8fb9                	xor	a5,a5,a4
+    8020b78c:	17c2                	slli	a5,a5,0x30
+    8020b78e:	93c1                	srli	a5,a5,0x30
+    8020b790:	8b9d                	andi	a5,a5,7
+    8020b792:	17c2                	slli	a5,a5,0x30
+    8020b794:	93c1                	srli	a5,a5,0x30
+    8020b796:	f391                	bnez	a5,8020b69a <virtio_disk_intr+0x1a>
+  }
+  *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3;
+    8020b798:	00003797          	auipc	a5,0x3
+    8020b79c:	91078793          	addi	a5,a5,-1776 # 8020e0a8 <etext+0x10a8>
+    8020b7a0:	639c                	ld	a5,0(a5)
+    8020b7a2:	439c                	lw	a5,0(a5)
+    8020b7a4:	0007871b          	sext.w	a4,a5
+    8020b7a8:	00003797          	auipc	a5,0x3
+    8020b7ac:	90878793          	addi	a5,a5,-1784 # 8020e0b0 <etext+0x10b0>
+    8020b7b0:	639c                	ld	a5,0(a5)
+    8020b7b2:	8b0d                	andi	a4,a4,3
+    8020b7b4:	2701                	sext.w	a4,a4
+    8020b7b6:	c398                	sw	a4,0(a5)
+
+  release(&disk.vdisk_lock);
+    8020b7b8:	00020517          	auipc	a0,0x20
+    8020b7bc:	8f050513          	addi	a0,a0,-1808 # 8022b0a8 <disk+0x20a8>
+    8020b7c0:	ffff5097          	auipc	ra,0xffff5
+    8020b7c4:	28c080e7          	jalr	652(ra) # 80200a4c <release>
+}
+    8020b7c8:	0001                	nop
+    8020b7ca:	60e2                	ld	ra,24(sp)
+    8020b7cc:	6442                	ld	s0,16(sp)
+    8020b7ce:	6105                	addi	sp,sp,32
+    8020b7d0:	8082                	ret
+
+000000008020b7d2 <uartinit>:
+
+void uartstart();
+
+void
+uartinit(void)
+{
+    8020b7d2:	1141                	addi	sp,sp,-16
+    8020b7d4:	e406                	sd	ra,8(sp)
+    8020b7d6:	e022                	sd	s0,0(sp)
+    8020b7d8:	0800                	addi	s0,sp,16
+  // disable interrupts.
+  WriteReg(IER, 0x00);
+    8020b7da:	100007b7          	lui	a5,0x10000
+    8020b7de:	0785                	addi	a5,a5,1
+    8020b7e0:	00078023          	sb	zero,0(a5) # 10000000 <_entry-0x70200000>
+
+  // special mode to set baud rate.
+  WriteReg(LCR, LCR_BAUD_LATCH);
+    8020b7e4:	100007b7          	lui	a5,0x10000
+    8020b7e8:	078d                	addi	a5,a5,3
+    8020b7ea:	f8000713          	li	a4,-128
+    8020b7ee:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+  // LSB for baud rate of 38.4K.
+  WriteReg(0, 0x03);
+    8020b7f2:	100007b7          	lui	a5,0x10000
+    8020b7f6:	470d                	li	a4,3
+    8020b7f8:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+  // MSB for baud rate of 38.4K.
+  WriteReg(1, 0x00);
+    8020b7fc:	100007b7          	lui	a5,0x10000
+    8020b800:	0785                	addi	a5,a5,1
+    8020b802:	00078023          	sb	zero,0(a5) # 10000000 <_entry-0x70200000>
+
+  // leave set-baud mode,
+  // and set word length to 8 bits, no parity.
+  WriteReg(LCR, LCR_EIGHT_BITS);
+    8020b806:	100007b7          	lui	a5,0x10000
+    8020b80a:	078d                	addi	a5,a5,3
+    8020b80c:	470d                	li	a4,3
+    8020b80e:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+  // reset and enable FIFOs.
+  WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR);
+    8020b812:	100007b7          	lui	a5,0x10000
+    8020b816:	0789                	addi	a5,a5,2
+    8020b818:	471d                	li	a4,7
+    8020b81a:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+  // enable transmit and receive interrupts.
+  WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE);
+    8020b81e:	100007b7          	lui	a5,0x10000
+    8020b822:	0785                	addi	a5,a5,1
+    8020b824:	470d                	li	a4,3
+    8020b826:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+    uart_tx_w = uart_tx_r = 0;
+    8020b82a:	00021797          	auipc	a5,0x21
+    8020b82e:	81278793          	addi	a5,a5,-2030 # 8022c03c <uart_tx_r>
+    8020b832:	0007a023          	sw	zero,0(a5)
+    8020b836:	00021797          	auipc	a5,0x21
+    8020b83a:	80678793          	addi	a5,a5,-2042 # 8022c03c <uart_tx_r>
+    8020b83e:	4398                	lw	a4,0(a5)
+    8020b840:	00020797          	auipc	a5,0x20
+    8020b844:	7f878793          	addi	a5,a5,2040 # 8022c038 <uart_tx_w>
+    8020b848:	c398                	sw	a4,0(a5)
+
+  initlock(&uart_tx_lock, "uart");
+    8020b84a:	00003597          	auipc	a1,0x3
+    8020b84e:	86e58593          	addi	a1,a1,-1938 # 8020e0b8 <etext+0x10b8>
+    8020b852:	00020517          	auipc	a0,0x20
+    8020b856:	7ae50513          	addi	a0,a0,1966 # 8022c000 <uart_tx_lock>
+    8020b85a:	ffff5097          	auipc	ra,0xffff5
+    8020b85e:	15e080e7          	jalr	350(ra) # 802009b8 <initlock>
+}
+    8020b862:	0001                	nop
+    8020b864:	60a2                	ld	ra,8(sp)
+    8020b866:	6402                	ld	s0,0(sp)
+    8020b868:	0141                	addi	sp,sp,16
+    8020b86a:	8082                	ret
+
+000000008020b86c <uartputc>:
+// because it may block, it can't be called
+// from interrupts; it's only suitable for use
+// by write().
+void
+uartputc(int c)
+{
+    8020b86c:	1101                	addi	sp,sp,-32
+    8020b86e:	ec06                	sd	ra,24(sp)
+    8020b870:	e822                	sd	s0,16(sp)
+    8020b872:	1000                	addi	s0,sp,32
+    8020b874:	87aa                	mv	a5,a0
+    8020b876:	fef42623          	sw	a5,-20(s0)
+  acquire(&uart_tx_lock);
+    8020b87a:	00020517          	auipc	a0,0x20
+    8020b87e:	78650513          	addi	a0,a0,1926 # 8022c000 <uart_tx_lock>
+    8020b882:	ffff5097          	auipc	ra,0xffff5
+    8020b886:	166080e7          	jalr	358(ra) # 802009e8 <acquire>
+
+  if(panicked){
+    8020b88a:	00005797          	auipc	a5,0x5
+    8020b88e:	c0e7b783          	ld	a5,-1010(a5) # 80210498 <_GLOBAL_OFFSET_TABLE_+0x10>
+    8020b892:	439c                	lw	a5,0(a5)
+    8020b894:	2781                	sext.w	a5,a5
+    8020b896:	c391                	beqz	a5,8020b89a <uartputc+0x2e>
+    for(;;)
+    8020b898:	a001                	j	8020b898 <uartputc+0x2c>
+      ;
+  }
+
+  while(1){
+    if(((uart_tx_w + 1) % UART_TX_BUF_SIZE) == uart_tx_r){
+    8020b89a:	00020797          	auipc	a5,0x20
+    8020b89e:	79e78793          	addi	a5,a5,1950 # 8022c038 <uart_tx_w>
+    8020b8a2:	439c                	lw	a5,0(a5)
+    8020b8a4:	2785                	addiw	a5,a5,1
+    8020b8a6:	2781                	sext.w	a5,a5
+    8020b8a8:	873e                	mv	a4,a5
+    8020b8aa:	41f7579b          	sraiw	a5,a4,0x1f
+    8020b8ae:	01b7d79b          	srliw	a5,a5,0x1b
+    8020b8b2:	9f3d                	addw	a4,a4,a5
+    8020b8b4:	8b7d                	andi	a4,a4,31
+    8020b8b6:	40f707bb          	subw	a5,a4,a5
+    8020b8ba:	0007871b          	sext.w	a4,a5
+    8020b8be:	00020797          	auipc	a5,0x20
+    8020b8c2:	77e78793          	addi	a5,a5,1918 # 8022c03c <uart_tx_r>
+    8020b8c6:	439c                	lw	a5,0(a5)
+    8020b8c8:	00f71f63          	bne	a4,a5,8020b8e6 <uartputc+0x7a>
+      // buffer is full.
+      // wait for uartstart() to open up space in the buffer.
+      sleep(&uart_tx_r, &uart_tx_lock);
+    8020b8cc:	00020597          	auipc	a1,0x20
+    8020b8d0:	73458593          	addi	a1,a1,1844 # 8022c000 <uart_tx_lock>
+    8020b8d4:	00020517          	auipc	a0,0x20
+    8020b8d8:	76850513          	addi	a0,a0,1896 # 8022c03c <uart_tx_r>
+    8020b8dc:	ffff8097          	auipc	ra,0xffff8
+    8020b8e0:	ee0080e7          	jalr	-288(ra) # 802037bc <sleep>
+    8020b8e4:	bf5d                	j	8020b89a <uartputc+0x2e>
+    } else {
+      uart_tx_buf[uart_tx_w] = c;
+    8020b8e6:	00020797          	auipc	a5,0x20
+    8020b8ea:	75278793          	addi	a5,a5,1874 # 8022c038 <uart_tx_w>
+    8020b8ee:	439c                	lw	a5,0(a5)
+    8020b8f0:	fec42703          	lw	a4,-20(s0)
+    8020b8f4:	0ff77713          	andi	a4,a4,255
+    8020b8f8:	00020697          	auipc	a3,0x20
+    8020b8fc:	72068693          	addi	a3,a3,1824 # 8022c018 <uart_tx_buf>
+    8020b900:	97b6                	add	a5,a5,a3
+    8020b902:	00e78023          	sb	a4,0(a5)
+      uart_tx_w = (uart_tx_w + 1) % UART_TX_BUF_SIZE;
+    8020b906:	00020797          	auipc	a5,0x20
+    8020b90a:	73278793          	addi	a5,a5,1842 # 8022c038 <uart_tx_w>
+    8020b90e:	439c                	lw	a5,0(a5)
+    8020b910:	2785                	addiw	a5,a5,1
+    8020b912:	2781                	sext.w	a5,a5
+    8020b914:	873e                	mv	a4,a5
+    8020b916:	41f7579b          	sraiw	a5,a4,0x1f
+    8020b91a:	01b7d79b          	srliw	a5,a5,0x1b
+    8020b91e:	9f3d                	addw	a4,a4,a5
+    8020b920:	8b7d                	andi	a4,a4,31
+    8020b922:	40f707bb          	subw	a5,a4,a5
+    8020b926:	0007871b          	sext.w	a4,a5
+    8020b92a:	00020797          	auipc	a5,0x20
+    8020b92e:	70e78793          	addi	a5,a5,1806 # 8022c038 <uart_tx_w>
+    8020b932:	c398                	sw	a4,0(a5)
+      uartstart();
+    8020b934:	00000097          	auipc	ra,0x0
+    8020b938:	084080e7          	jalr	132(ra) # 8020b9b8 <uartstart>
+      release(&uart_tx_lock);
+    8020b93c:	00020517          	auipc	a0,0x20
+    8020b940:	6c450513          	addi	a0,a0,1732 # 8022c000 <uart_tx_lock>
+    8020b944:	ffff5097          	auipc	ra,0xffff5
+    8020b948:	108080e7          	jalr	264(ra) # 80200a4c <release>
+      return;
+    8020b94c:	0001                	nop
+    }
+  }
+}
+    8020b94e:	60e2                	ld	ra,24(sp)
+    8020b950:	6442                	ld	s0,16(sp)
+    8020b952:	6105                	addi	sp,sp,32
+    8020b954:	8082                	ret
+
+000000008020b956 <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)
+{
+    8020b956:	1101                	addi	sp,sp,-32
+    8020b958:	ec06                	sd	ra,24(sp)
+    8020b95a:	e822                	sd	s0,16(sp)
+    8020b95c:	1000                	addi	s0,sp,32
+    8020b95e:	87aa                	mv	a5,a0
+    8020b960:	fef42623          	sw	a5,-20(s0)
+  push_off();
+    8020b964:	ffff5097          	auipc	ra,0xffff5
+    8020b968:	f7e080e7          	jalr	-130(ra) # 802008e2 <push_off>
+
+  if(panicked){
+    8020b96c:	00005797          	auipc	a5,0x5
+    8020b970:	b2c7b783          	ld	a5,-1236(a5) # 80210498 <_GLOBAL_OFFSET_TABLE_+0x10>
+    8020b974:	439c                	lw	a5,0(a5)
+    8020b976:	2781                	sext.w	a5,a5
+    8020b978:	c391                	beqz	a5,8020b97c <uartputc_sync+0x26>
+    for(;;)
+    8020b97a:	a001                	j	8020b97a <uartputc_sync+0x24>
+      ;
+  }
+
+  // wait for Transmit Holding Empty to be set in LSR.
+  while((ReadReg(LSR) & LSR_TX_IDLE) == 0)
+    8020b97c:	0001                	nop
+    8020b97e:	100007b7          	lui	a5,0x10000
+    8020b982:	0795                	addi	a5,a5,5
+    8020b984:	0007c783          	lbu	a5,0(a5) # 10000000 <_entry-0x70200000>
+    8020b988:	0ff7f793          	andi	a5,a5,255
+    8020b98c:	2781                	sext.w	a5,a5
+    8020b98e:	0207f793          	andi	a5,a5,32
+    8020b992:	2781                	sext.w	a5,a5
+    8020b994:	d7ed                	beqz	a5,8020b97e <uartputc_sync+0x28>
+    ;
+  WriteReg(THR, c);
+    8020b996:	100007b7          	lui	a5,0x10000
+    8020b99a:	fec42703          	lw	a4,-20(s0)
+    8020b99e:	0ff77713          	andi	a4,a4,255
+    8020b9a2:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+
+  pop_off();
+    8020b9a6:	ffff5097          	auipc	ra,0xffff5
+    8020b9aa:	f94080e7          	jalr	-108(ra) # 8020093a <pop_off>
+}
+    8020b9ae:	0001                	nop
+    8020b9b0:	60e2                	ld	ra,24(sp)
+    8020b9b2:	6442                	ld	s0,16(sp)
+    8020b9b4:	6105                	addi	sp,sp,32
+    8020b9b6:	8082                	ret
+
+000000008020b9b8 <uartstart>:
+// in the transmit buffer, send it.
+// caller must hold uart_tx_lock.
+// called from both the top- and bottom-half.
+void
+uartstart()
+{
+    8020b9b8:	1101                	addi	sp,sp,-32
+    8020b9ba:	ec06                	sd	ra,24(sp)
+    8020b9bc:	e822                	sd	s0,16(sp)
+    8020b9be:	1000                	addi	s0,sp,32
+  while(1){
+    if(uart_tx_w == uart_tx_r){
+    8020b9c0:	00020797          	auipc	a5,0x20
+    8020b9c4:	67878793          	addi	a5,a5,1656 # 8022c038 <uart_tx_w>
+    8020b9c8:	4398                	lw	a4,0(a5)
+    8020b9ca:	00020797          	auipc	a5,0x20
+    8020b9ce:	67278793          	addi	a5,a5,1650 # 8022c03c <uart_tx_r>
+    8020b9d2:	439c                	lw	a5,0(a5)
+    8020b9d4:	08f70463          	beq	a4,a5,8020ba5c <uartstart+0xa4>
+      // transmit buffer is empty.
+      return;
+    }
+    
+    if((ReadReg(LSR) & LSR_TX_IDLE) == 0){
+    8020b9d8:	100007b7          	lui	a5,0x10000
+    8020b9dc:	0795                	addi	a5,a5,5
+    8020b9de:	0007c783          	lbu	a5,0(a5) # 10000000 <_entry-0x70200000>
+    8020b9e2:	0ff7f793          	andi	a5,a5,255
+    8020b9e6:	2781                	sext.w	a5,a5
+    8020b9e8:	0207f793          	andi	a5,a5,32
+    8020b9ec:	2781                	sext.w	a5,a5
+    8020b9ee:	cbad                	beqz	a5,8020ba60 <uartstart+0xa8>
+      // 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];
+    8020b9f0:	00020797          	auipc	a5,0x20
+    8020b9f4:	64c78793          	addi	a5,a5,1612 # 8022c03c <uart_tx_r>
+    8020b9f8:	439c                	lw	a5,0(a5)
+    8020b9fa:	00020717          	auipc	a4,0x20
+    8020b9fe:	61e70713          	addi	a4,a4,1566 # 8022c018 <uart_tx_buf>
+    8020ba02:	97ba                	add	a5,a5,a4
+    8020ba04:	0007c783          	lbu	a5,0(a5)
+    8020ba08:	fef42623          	sw	a5,-20(s0)
+    uart_tx_r = (uart_tx_r + 1) % UART_TX_BUF_SIZE;
+    8020ba0c:	00020797          	auipc	a5,0x20
+    8020ba10:	63078793          	addi	a5,a5,1584 # 8022c03c <uart_tx_r>
+    8020ba14:	439c                	lw	a5,0(a5)
+    8020ba16:	2785                	addiw	a5,a5,1
+    8020ba18:	2781                	sext.w	a5,a5
+    8020ba1a:	873e                	mv	a4,a5
+    8020ba1c:	41f7579b          	sraiw	a5,a4,0x1f
+    8020ba20:	01b7d79b          	srliw	a5,a5,0x1b
+    8020ba24:	9f3d                	addw	a4,a4,a5
+    8020ba26:	8b7d                	andi	a4,a4,31
+    8020ba28:	40f707bb          	subw	a5,a4,a5
+    8020ba2c:	0007871b          	sext.w	a4,a5
+    8020ba30:	00020797          	auipc	a5,0x20
+    8020ba34:	60c78793          	addi	a5,a5,1548 # 8022c03c <uart_tx_r>
+    8020ba38:	c398                	sw	a4,0(a5)
+    
+    // maybe uartputc() is waiting for space in the buffer.
+    wakeup(&uart_tx_r);
+    8020ba3a:	00020517          	auipc	a0,0x20
+    8020ba3e:	60250513          	addi	a0,a0,1538 # 8022c03c <uart_tx_r>
+    8020ba42:	ffff8097          	auipc	ra,0xffff8
+    8020ba46:	e0e080e7          	jalr	-498(ra) # 80203850 <wakeup>
+    
+    WriteReg(THR, c);
+    8020ba4a:	100007b7          	lui	a5,0x10000
+    8020ba4e:	fec42703          	lw	a4,-20(s0)
+    8020ba52:	0ff77713          	andi	a4,a4,255
+    8020ba56:	00e78023          	sb	a4,0(a5) # 10000000 <_entry-0x70200000>
+  while(1){
+    8020ba5a:	b79d                	j	8020b9c0 <uartstart+0x8>
+      return;
+    8020ba5c:	0001                	nop
+    8020ba5e:	a011                	j	8020ba62 <uartstart+0xaa>
+      return;
+    8020ba60:	0001                	nop
+  }
+}
+    8020ba62:	60e2                	ld	ra,24(sp)
+    8020ba64:	6442                	ld	s0,16(sp)
+    8020ba66:	6105                	addi	sp,sp,32
+    8020ba68:	8082                	ret
+
+000000008020ba6a <uartgetc>:
+
+// read one input character from the UART.
+// return -1 if none is waiting.
+int
+uartgetc(void)
+{
+    8020ba6a:	1141                	addi	sp,sp,-16
+    8020ba6c:	e422                	sd	s0,8(sp)
+    8020ba6e:	0800                	addi	s0,sp,16
+  if(ReadReg(LSR) & 0x01){
+    8020ba70:	100007b7          	lui	a5,0x10000
+    8020ba74:	0795                	addi	a5,a5,5
+    8020ba76:	0007c783          	lbu	a5,0(a5) # 10000000 <_entry-0x70200000>
+    8020ba7a:	0ff7f793          	andi	a5,a5,255
+    8020ba7e:	2781                	sext.w	a5,a5
+    8020ba80:	8b85                	andi	a5,a5,1
+    8020ba82:	2781                	sext.w	a5,a5
+    8020ba84:	cb89                	beqz	a5,8020ba96 <uartgetc+0x2c>
+    // input data is ready.
+    return ReadReg(RHR);
+    8020ba86:	100007b7          	lui	a5,0x10000
+    8020ba8a:	0007c783          	lbu	a5,0(a5) # 10000000 <_entry-0x70200000>
+    8020ba8e:	0ff7f793          	andi	a5,a5,255
+    8020ba92:	2781                	sext.w	a5,a5
+    8020ba94:	a011                	j	8020ba98 <uartgetc+0x2e>
+  } else {
+    return -1;
+    8020ba96:	57fd                	li	a5,-1
+  }
+}
+    8020ba98:	853e                	mv	a0,a5
+    8020ba9a:	6422                	ld	s0,8(sp)
+    8020ba9c:	0141                	addi	sp,sp,16
+    8020ba9e:	8082                	ret
+
+000000008020baa0 <uartintr>:
+// handle a uart interrupt, raised because input has
+// arrived, or the uart is ready for more output, or
+// both. called from trap.c.
+void
+uartintr(void)
+{
+    8020baa0:	1101                	addi	sp,sp,-32
+    8020baa2:	ec06                	sd	ra,24(sp)
+    8020baa4:	e822                	sd	s0,16(sp)
+    8020baa6:	1000                	addi	s0,sp,32
+  // read and process incoming characters.
+  while(1){
+    int c = uartgetc();
+    8020baa8:	00000097          	auipc	ra,0x0
+    8020baac:	fc2080e7          	jalr	-62(ra) # 8020ba6a <uartgetc>
+    8020bab0:	87aa                	mv	a5,a0
+    8020bab2:	fef42623          	sw	a5,-20(s0)
+    if(c == -1)
+    8020bab6:	fec42783          	lw	a5,-20(s0)
+    8020baba:	0007871b          	sext.w	a4,a5
+    8020babe:	57fd                	li	a5,-1
+    8020bac0:	00f70a63          	beq	a4,a5,8020bad4 <uartintr+0x34>
+      break;
+    consoleintr(c);
+    8020bac4:	fec42783          	lw	a5,-20(s0)
+    8020bac8:	853e                	mv	a0,a5
+    8020baca:	fffff097          	auipc	ra,0xfffff
+    8020bace:	fcc080e7          	jalr	-52(ra) # 8020aa96 <consoleintr>
+  while(1){
+    8020bad2:	bfd9                	j	8020baa8 <uartintr+0x8>
+      break;
+    8020bad4:	0001                	nop
+  }
+
+  // send buffered characters.
+  acquire(&uart_tx_lock);
+    8020bad6:	00020517          	auipc	a0,0x20
+    8020bada:	52a50513          	addi	a0,a0,1322 # 8022c000 <uart_tx_lock>
+    8020bade:	ffff5097          	auipc	ra,0xffff5
+    8020bae2:	f0a080e7          	jalr	-246(ra) # 802009e8 <acquire>
+  uartstart();
+    8020bae6:	00000097          	auipc	ra,0x0
+    8020baea:	ed2080e7          	jalr	-302(ra) # 8020b9b8 <uartstart>
+  release(&uart_tx_lock);
+    8020baee:	00020517          	auipc	a0,0x20
+    8020baf2:	51250513          	addi	a0,a0,1298 # 8022c000 <uart_tx_lock>
+    8020baf6:	ffff5097          	auipc	ra,0xffff5
+    8020bafa:	f56080e7          	jalr	-170(ra) # 80200a4c <release>
+}
+    8020bafe:	0001                	nop
+    8020bb00:	60e2                	ld	ra,24(sp)
+    8020bb02:	6442                	ld	s0,16(sp)
+    8020bb04:	6105                	addi	sp,sp,32
+    8020bb06:	8082                	ret
+	...
+
+000000008020c000 <_trampoline>:
+    8020c000:	14051573          	csrrw	a0,sscratch,a0
+    8020c004:	02153423          	sd	ra,40(a0)
+    8020c008:	02253823          	sd	sp,48(a0)
+    8020c00c:	02353c23          	sd	gp,56(a0)
+    8020c010:	04453023          	sd	tp,64(a0)
+    8020c014:	04553423          	sd	t0,72(a0)
+    8020c018:	04653823          	sd	t1,80(a0)
+    8020c01c:	04753c23          	sd	t2,88(a0)
+    8020c020:	f120                	sd	s0,96(a0)
+    8020c022:	f524                	sd	s1,104(a0)
+    8020c024:	fd2c                	sd	a1,120(a0)
+    8020c026:	e150                	sd	a2,128(a0)
+    8020c028:	e554                	sd	a3,136(a0)
+    8020c02a:	e958                	sd	a4,144(a0)
+    8020c02c:	ed5c                	sd	a5,152(a0)
+    8020c02e:	0b053023          	sd	a6,160(a0)
+    8020c032:	0b153423          	sd	a7,168(a0)
+    8020c036:	0b253823          	sd	s2,176(a0)
+    8020c03a:	0b353c23          	sd	s3,184(a0)
+    8020c03e:	0d453023          	sd	s4,192(a0)
+    8020c042:	0d553423          	sd	s5,200(a0)
+    8020c046:	0d653823          	sd	s6,208(a0)
+    8020c04a:	0d753c23          	sd	s7,216(a0)
+    8020c04e:	0f853023          	sd	s8,224(a0)
+    8020c052:	0f953423          	sd	s9,232(a0)
+    8020c056:	0fa53823          	sd	s10,240(a0)
+    8020c05a:	0fb53c23          	sd	s11,248(a0)
+    8020c05e:	11c53023          	sd	t3,256(a0)
+    8020c062:	11d53423          	sd	t4,264(a0)
+    8020c066:	11e53823          	sd	t5,272(a0)
+    8020c06a:	11f53c23          	sd	t6,280(a0)
+    8020c06e:	140022f3          	csrr	t0,sscratch
+    8020c072:	06553823          	sd	t0,112(a0)
+    8020c076:	00853103          	ld	sp,8(a0)
+    8020c07a:	02053203          	ld	tp,32(a0)
+    8020c07e:	01053283          	ld	t0,16(a0)
+    8020c082:	00053303          	ld	t1,0(a0)
+    8020c086:	18031073          	csrw	satp,t1
+    8020c08a:	12000073          	sfence.vma
+    8020c08e:	8282                	jr	t0
+
+000000008020c090 <userret>:
+    8020c090:	18059073          	csrw	satp,a1
+    8020c094:	12000073          	sfence.vma
+    8020c098:	07053283          	ld	t0,112(a0)
+    8020c09c:	14029073          	csrw	sscratch,t0
+    8020c0a0:	02853083          	ld	ra,40(a0)
+    8020c0a4:	03053103          	ld	sp,48(a0)
+    8020c0a8:	03853183          	ld	gp,56(a0)
+    8020c0ac:	04053203          	ld	tp,64(a0)
+    8020c0b0:	04853283          	ld	t0,72(a0)
+    8020c0b4:	05053303          	ld	t1,80(a0)
+    8020c0b8:	05853383          	ld	t2,88(a0)
+    8020c0bc:	7120                	ld	s0,96(a0)
+    8020c0be:	7524                	ld	s1,104(a0)
+    8020c0c0:	7d2c                	ld	a1,120(a0)
+    8020c0c2:	6150                	ld	a2,128(a0)
+    8020c0c4:	6554                	ld	a3,136(a0)
+    8020c0c6:	6958                	ld	a4,144(a0)
+    8020c0c8:	6d5c                	ld	a5,152(a0)
+    8020c0ca:	0a053803          	ld	a6,160(a0)
+    8020c0ce:	0a853883          	ld	a7,168(a0)
+    8020c0d2:	0b053903          	ld	s2,176(a0)
+    8020c0d6:	0b853983          	ld	s3,184(a0)
+    8020c0da:	0c053a03          	ld	s4,192(a0)
+    8020c0de:	0c853a83          	ld	s5,200(a0)
+    8020c0e2:	0d053b03          	ld	s6,208(a0)
+    8020c0e6:	0d853b83          	ld	s7,216(a0)
+    8020c0ea:	0e053c03          	ld	s8,224(a0)
+    8020c0ee:	0e853c83          	ld	s9,232(a0)
+    8020c0f2:	0f053d03          	ld	s10,240(a0)
+    8020c0f6:	0f853d83          	ld	s11,248(a0)
+    8020c0fa:	10053e03          	ld	t3,256(a0)
+    8020c0fe:	10853e83          	ld	t4,264(a0)
+    8020c102:	11053f03          	ld	t5,272(a0)
+    8020c106:	11853f83          	ld	t6,280(a0)
+    8020c10a:	14051573          	csrrw	a0,sscratch,a0
+    8020c10e:	10200073          	sret
+	...
diff --git a/kernel-qemu.sym b/kernel-qemu.sym
new file mode 100644
index 0000000000000000000000000000000000000000..ef19e3bee71ecc136942875256386c51632da096
--- /dev/null
+++ b/kernel-qemu.sym
@@ -0,0 +1,384 @@
+0000000080200000 .text
+000000008020d000 .rodata
+000000008020f000 .data
+0000000080210488 .got
+0000000080210508 .got.plt
+0000000080211000 .bss
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_aranges
+0000000000000000 .debug_line
+0000000000000000 .debug_str
+0000000000000000 .comment
+0000000000000000 .debug_frame
+0000000000000000 .debug_ranges
+0000000000000000 kernel/entry_qemu.o
+0000000080200014 loop
+0000000000000000 printf.c
+0000000080200016 r_fp
+000000008020f000 digits
+0000000080219008 pr
+000000008020006e printint
+0000000080200178 printptr
+0000000000000000 kalloc.c
+0000000000000000 intr.c
+000000008020082e r_sstatus
+0000000080200848 w_sstatus
+0000000080200862 intr_on
+000000008020088c intr_off
+00000000802008b4 intr_get
+0000000000000000 spinlock.c
+0000000000000000 string.c
+0000000000000000 main.c
+000000008020102e sbi_hart_start
+0000000080201064 inithartid
+0000000080219050 started
+0000000000000000 vm.c
+00000000802011f6 w_satp
+0000000080201210 sfence_vma
+0000000000000000 proc.c
+0000000080202558 r_sstatus
+0000000080202572 w_sstatus
+000000008020258c r_sip
+00000000802025a6 r_sie
+00000000802025c0 r_sepc
+00000000802025da r_stvec
+00000000802025f4 w_satp
+000000008020260e r_satp
+0000000080202628 r_scause
+0000000080202642 r_stval
+000000008020265c intr_on
+0000000080202686 intr_get
+00000000802026b4 r_sp
+00000000802026cc r_tp
+00000000802026e4 r_ra
+00000000802026fc sfence_vma
+00000000802029fc allocproc
+0000000080202b56 freeproc
+00000000802038d2 wakeup1
+000000008020f018 first.1704
+000000008020f020 states.1742
+0000000000000000 trap.c
+0000000080203c30 r_sstatus
+0000000080203c4a w_sstatus
+0000000080203c64 r_sie
+0000000080203c7e w_sie
+0000000080203c98 w_sepc
+0000000080203cb2 r_sepc
+0000000080203ccc w_stvec
+0000000080203ce6 r_satp
+0000000080203d00 r_scause
+0000000080203d1a r_stval
+0000000080203d34 intr_on
+0000000080203d5e intr_off
+0000000080203d86 intr_get
+0000000080203db4 r_tp
+0000000080203dcc sbi_console_getchar
+0000000000000000 syscall.c
+000000008020464a r_tp
+0000000080204722 argraw
+000000008020f048 syscalls
+000000008020f870 sysnames
+0000000000000000 sysproc.c
+0000000000000000 bio.c
+0000000080205184 bget
+0000000000000000 sleeplock.c
+0000000000000000 file.c
+0000000000000000 pipe.c
+0000000000000000 exec.c
+000000008020619a w_satp
+00000000802061b4 sfence_vma
+00000000802061c6 loadseg
+0000000000000000 sysfile.c
+000000008020683a r_time
+0000000080206854 argfd
+00000000802068ec fdalloc
+0000000080206b5c create
+0000000080207384 isdirempty
+0000000000000000 timer.c
+0000000080207a1e r_time
+0000000080207a38 sbi_set_timer
+0000000000000000 disk.c
+0000000000000000 fat32.c
+0000000080223b30 fat
+0000000080223b58 ecache
+00000000802281c0 root
+0000000080208254 first_sec_of_clus
+0000000080208296 fat_sec_of_clus
+0000000080208308 fat_offset_of_clus
+000000008020833c read_fat
+00000000802083ee write_fat
+0000000080208498 zero_clus
+000000008020853c alloc_clus
+0000000080208670 free_clus
+0000000080208698 rw_clus
+0000000080208890 reloc_clus
+0000000080208db2 eget
+0000000080210098 illegal.1648
+0000000080208ff4 generate_shortname
+00000000802100a8 illegal.1664
+0000000080209de4 read_entry_name
+0000000080209f70 read_entry_info
+000000008020a3fe skipelem
+000000008020a4e2 lookup_path
+0000000000000000 plic.c
+0000000000000000 console.c
+000000008020a7d8 sbi_console_putchar
+0000000000000000 uname.c
+000000008020ad90 sfence_vma
+00000000802100b0 thisname.1321
+0000000000000000 virtio_disk.c
+0000000080229000 disk
+000000008020b0e0 alloc_desc
+000000008020b142 free_desc
+000000008020b1e2 free_chain
+000000008020b24c alloc3_desc
+0000000000000000 uart.c
+0000000000000000 testinit/initcode.o
+000000008021047e codeend
+0000000000000000 
+0000000080210488 _GLOBAL_OFFSET_TABLE_
+00000000802073d8 sys_remove
+00000000802097d8 edup
+0000000080201626 mappages
+0000000080202010 copyinstr
+000000008020a900 consoleread
+0000000080200ddc safestrcpy
+0000000080206aa8 sys_close
+0000000080203700 yield
+0000000080219028 kmem
+000000008020b7d2 uartinit
+00000000802039ce either_copyout
+0000000080207b4c timerinit
+0000000080219160 proc
+00000000802021c2 proc_kpagetable
+000000008020592e fileread
+00000000802001ee printf
+0000000080204dc0 sys_sbrk
+000000008020c000 trampoline
+0000000080219000 panicked
+000000008020923a emake
+000000008020a750 plic_claim
+00000000802070ce sys_dev
+000000008022c018 uart_tx_buf
+0000000080223a68 sleep_procs
+000000008020a69a plicinit
+000000008020a792 plic_complete
+000000008020361e sched
+0000000080200bca memmove
+000000008020488c syscall
+0000000080202904 cpuid
+0000000080204c92 sys_fork
+000000008021e130 bcache
+0000000080206e62 sys_mkdir
+0000000080209a74 etrunc
+000000008020a6d6 plicinithart
+0000000080202ecc do_fork
+0000000080203068 reparent
+0000000080207e18 fat32_init
+000000008020a66c enameparent
+0000000080204830 argstr
+0000000080201a26 uvmdealloc
+0000000080204cb0 sys_clone
+000000008020f000 sdata
+0000000080205758 filedup
+0000000080205072 binit
+0000000080201d46 uvmclear
+0000000080209970 eremove
+00000000802069bc sys_read
+00000000802033b8 do_wait
+0000000080200c98 memcpy
+0000000080201514 kvmmap
+000000008020b9b8 uartstart
+00000000802006ce kfree
+0000000080202928 mycpu
+0000000080204238 devintr
+0000000080208a2e eread
+000000008020f014 nextpid
+000000008020565e fileinit
+000000008020c090 userret
+00000000802009b8 initlock
+0000000080208f20 formatname
+0000000080201d9c copyout
+00000000802037bc sleep
+000000008020002e printstring
+0000000080207990 kernelvec
+0000000080210482 edata
+0000000080200f6c wcsncmp
+0000000080204ed0 sys_kill
+0000000080205e6c pipeclose
+0000000080206b02 sys_fstat
+000000008020a858 consolewrite
+000000008020d000 rodata_start
+000000008020a640 ename
+0000000080200676 freerange
+0000000080209afc elock
+0000000080201364 kvminithart
+00000000802018ce uvmalloc
+000000008020182a uvminit
+0000000080201bde uvmcopy
+000000008021e110 initproc
+0000000080202cf6 proc_freepagetable
+000000008020270e reg_info
+0000000080202c36 proc_pagetable
+0000000080204e18 sys_sleep
+0000000080202360 kvmfree
+0000000080207d9c disk_init
+0000000080205c06 dirnext
+00000000802056d4 filealloc
+0000000080203850 wakeup
+000000008020ae12 virtio_disk_init
+0000000080202962 myproc
+0000000080200000 BASE_ADDRESS
+000000008020720e sys_readdir
+000000008022c03c uart_tx_r
+00000000802013ac walk
+0000000080206c90 sys_open
+0000000080200492 backtrace
+000000008022c038 uart_tx_w
+000000008021047e initcodesize
+000000008020aa96 consoleintr
+000000008020a800 consputc
+000000008020392e kill
+000000008020299e allocpid
+000000008020baa0 uartintr
+0000000080201ed6 copyin
+0000000080207c12 wakeup_sleep
+0000000080200e8c wnstr
+0000000080201b94 uvmfree
+0000000080201e6a copyout2
+0000000080205a92 filewrite
+0000000080207a62 gain_sleep
+0000000080200eec snstr
+00000000802047c4 argint
+000000008020d000 srodata
+00000000802016ee vmunmap
+0000000080204fac sys_times
+0000000080204f90 sys_sched_yield
+0000000080204f50 sys_trace
+00000000802062c8 exec
+000000008020d000 etext
+0000000080206a32 sys_write
+0000000080200a4c release
+00000000802046c8 fetchstr
+000000008020326a wait
+0000000080209ba6 eput
+0000000080219000 boot_stack_top
+0000000080203fae usertrapret
+0000000080203508 scheduler
+00000000802091ce cal_checksum
+000000008020c000 _trampoline
+000000008022d000 kernel_end
+000000008020a1d2 dirlookup
+0000000080204d2e sys_wait4
+00000000802057be fileclose
+00000000802095e4 ealloc
+00000000802015a0 kwalkaddr
+0000000080200814 freemem_amount
+0000000080203e5a usertrap
+0000000080200cd0 strncmp
+0000000080223a48 tickslock
+0000000080205f14 pipewrite
+0000000080207dfe disk_intr
+0000000080200d5a strncpy
+0000000080222a90 ftable
+000000008020b680 virtio_disk_intr
+000000008020e0bd erodata
+000000008020695a sys_dup
+0000000080201fa4 copyin2
+0000000080200444 panic
+0000000080211000 bss_start
+000000008020374a forkret
+00000000802005ec kinit
+0000000080200b46 memcmp
+0000000080203a2e either_copyin
+0000000080219060 cpus
+00000000802055a4 releasesleep
+0000000080200000 _entry
+0000000080200aa2 holding
+00000000802009e8 acquire
+0000000080207840 sys_uname
+0000000080219000 sbss_clear
+00000000802078fc sys_nanosleep
+0000000080210236 initcode
+0000000080203dee trapinithart
+0000000080200ae6 memset
+0000000080204984 sys_test_proc
+000000008020107e main
+0000000080205536 acquiresleep
+000000008020c000 uservec
+0000000080201222 kvminit
+0000000080202254 kfreewalk
+00000000802054a2 bunpin
+00000000802047fc argaddr
+0000000080200000 text_start
+0000000080204f0c sys_uptime
+000000008020ba6a uartgetc
+000000008020ada2 do_uname
+000000008020f000 data_start
+0000000080207268 sys_getcwd
+0000000080200514 printfinit
+000000008022c000 uart_tx_lock
+00000000802023e2 vmprint
+00000000802017ee uvmcreate
+0000000080208bca ewrite
+0000000080202e12 growproc
+00000000802055f6 holdingsleep
+000000008020211e copyinstr2
+0000000080202d54 userinit
+00000000802052ce bread
+0000000080206056 piperead
+000000008020054a print_logo
+0000000080223a60 ticks
+000000008020acfe consoleinit
+000000008020149c walkaddr
+000000008020432c trapframedump
+0000000080203a8e procdump
+000000008020b86c uartputc
+000000008020536c brelse
+00000000802049dc sys_sysinfo
+0000000080207bd2 set_next_timeout
+0000000080204a46 sys_exec
+0000000080201570 kvmpa
+0000000080209d6e estat
+0000000080203bc6 swtch
+000000008022c040 ebss_clear
+00000000802008e2 push_off
+0000000080207544 sys_rename
+000000008020093a pop_off
+0000000080205326 bwrite
+0000000080207ce8 timer_tick
+000000008020b956 uartputc_sync
+0000000080207dda disk_write
+00000000802030e4 exit
+0000000080201aec freewalk
+0000000080204cf2 sys_wait
+0000000080204c18 sys_exit
+00000000802054ea initsleeplock
+0000000080209b46 eunlock
+000000008020787c sys_gettimeofday
+0000000080219058 kernel_pagetable
+000000008020b2ee virtio_disk_rw
+0000000080200e56 strlen
+0000000080207db6 disk_read
+0000000080206f80 sys_pipe
+0000000080211000 boot_stack
+0000000080203b74 procnum
+0000000080200fe4 strchr
+0000000080209fe6 enext
+00000000802022e8 kvmfreeusr
+0000000080228328 cons
+000000008020078c kalloc
+0000000080204662 fetchaddr
+00000000802229f0 devsw
+0000000080204c54 sys_getpid
+0000000080205d18 pipealloc
+0000000080204c72 sys_getppid
+0000000080200000 kernel_start
+0000000080206ec8 sys_chdir
+000000008020982e eupdate
+00000000802040ce kerneltrap
+000000008020545a bpin
+0000000080202874 procinit
+00000000802058aa filestat
+000000008021e118 pid_lock