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